{"record":{"id":"800b4ab8c785a4d1","repo":"flarum/framework","slug":"cannot-read-the-installed-package-manifest-at-path-reason","errorCode":null,"errorMessage":"Cannot read the installed package manifest at $path: $reason. Flarum cannot determine which extensions are installed until this is resolved, which usually means completing or re-running `composer install`. (the file does not exist)","messagePattern":"Cannot read the installed package manifest at \\$path: \\$reason\\. Flarum cannot determine which extensions are installed until this is resolved, which usually means completing or re-running `composer install`\\. \\(the file does not exist\\)","errorType":"exception","errorClass":"UnreadableManifestException","httpStatus":null,"severity":"critical","filePath":"framework/core/src/Extension/ExtensionManager.php","lineNumber":59,"sourceCode":"        protected Paths $paths,\n        protected Container $container,\n        protected Migrator $migrator,\n        protected Dispatcher $dispatcher,\n        protected Filesystem $filesystem,\n        protected MaintenanceMode $maintenance,\n    ) {\n    }\n\n    /**\n     * @return Collection<string, Extension>\n     */\n    public function getExtensions(): Collection\n    {\n        if (is_null($this->extensions)) {\n            $manifest = $this->paths->vendor.'/composer/installed.json';\n\n            if (! $this->filesystem->exists($manifest)) {\n                throw UnreadableManifestException::missing($manifest);\n            }\n\n            /** @var Collection<string, Extension> $extensions */\n            $extensions = new Collection();\n\n            // Load all packages installed by composer.\n            $installed = json_decode($this->filesystem->get($manifest), true);\n\n            if (! is_array($installed)) {\n                throw UnreadableManifestException::unparsable($manifest);\n            }\n\n            // Composer 2.0 changes the structure of the installed.json manifest\n            $installed = $installed['packages'] ?? $installed;\n\n            if (! is_array($installed)) {\n                throw UnreadableManifestException::unparsable($manifest);\n            }","sourceCodeStart":41,"sourceCodeEnd":77,"githubUrl":"https://github.com/flarum/framework/blob/4b939f685389bfe8a380e9e28ddf305a1c66950c/framework/core/src/Extension/ExtensionManager.php#L41-L77","documentation":"ExtensionManager::getExtensions reads composer's installed.json manifest; if the file does not exist, it throws UnreadableManifestException via missing(), reporting that Flarum cannot determine installed extensions until `composer install` completes. It blocks extension loading at boot.","triggerScenarios":"Accessing getExtensions()/getEnabledExtensions()/getExtension() when {vendor}/composer/installed.json is absent — vendor directory missing, truncated, or never generated.","commonSituations":"Fresh clones where composer install was not run, failed/partial composer installs, deploys that exclude vendor or run composer with wrong paths.","solutions":["Run `composer install` in the Flarum root to (re)generate installed.json","Verify the configured vendor path points to the real composer vendor directory","Re-run a previously failed composer install and check for composer errors","Restore the vendor directory from a good deploy artifact"],"exampleFix":"// before\n# vendor/composer/installed.json missing\n// after\ncomposer install","handlingStrategy":"try-catch","validationCode":"$manifest = $paths->vendor.'/composer/installed.json';\nif (!file_exists($manifest)) { /* fail fast: run composer install */ }","typeGuard":"function manifestExists($vendorPath): bool {\n  return is_file($vendorPath.'/composer/installed.json');\n}","tryCatchPattern":"try {\n    $extensions = $manager->getExtensions();\n} catch (UnreadableManifestException $e) {\n    logger()->critical('Composer manifest unreadable: run composer install');\n    abort(500, 'Extensions unavailable');\n}","preventionTips":["Run composer install (not just composer update) in deploy pipelines","Never deploy without the full vendor directory","Health-check installed.json presence at container startup"],"tags":["composer","bootstrap","extensions","manifest"],"backgroundTag":"file-not-found","analyzedSha":"4b939f685389bfe8a380e9e28ddf305a1c66950c","analyzedAt":"2026-09-15T18:09:20.879Z","contentChangedAt":"2026-09-15T18:09:20.879Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}