{"record":{"id":"95422d923440b55c","repo":"can1357/oh-my-pi","slug":"marketplace-catalog-not-found-at-catalogpath-t","errorCode":null,"errorMessage":"Marketplace catalog not found at ${catalogPath}. Try: /marketplace update ${entry.name}","messagePattern":"Marketplace catalog not found at (.+?)\\. Try: /marketplace update (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/coding-agent/src/extensibility/plugins/marketplace/manager.ts","lineNumber":904,"sourceCode":"\t\t\t\t? readInstalledPluginsRegistry(this.#opts.projectInstalledRegistryPath)\n\t\t\t\t: Promise.resolve({ version: 2 as const, plugins: {} as Record<string, InstalledPluginEntry[]> }),\n\t\t]);\n\t\treturn {\n\t\t\tuserEntries: getInstalledPlugin(userReg, pluginId),\n\t\t\tprojectEntries: getInstalledPlugin(projectReg, pluginId),\n\t\t\tuserReg,\n\t\t\tprojectReg,\n\t\t};\n\t}\n\n\tasync #readCatalog(entry: MarketplaceRegistryEntry): Promise<MarketplaceCatalog> {\n\t\tconst catalogPath = path.resolve(expandTilde(entry.catalogPath));\n\t\ttry {\n\t\t\tconst content = await Bun.file(catalogPath).text();\n\t\t\treturn parseMarketplaceCatalog(content, catalogPath);\n\t\t} catch (err) {\n\t\t\tif (isEnoent(err)) {\n\t\t\t\tthrow new Error(`Marketplace catalog not found at ${catalogPath}. Try: /marketplace update ${entry.name}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Compute the marketplace root directory for source resolution.\n\t *\n\t * For local sources: sourceUri IS the local path, so resolve it directly.\n\t * This gives the directory containing `.claude-plugin/marketplace.json`,\n\t * which is what resolvePluginSource expects as `marketplaceClonePath`.\n\t *\n\t * For remote sources (git/github/url): the catalog was cloned into\n\t * `<marketplacesCacheDir>/<name>/`, so the root is the parent of catalogPath.\n\t */\n\t#resolveMarketplaceRoot(entry: MarketplaceRegistryEntry): string {\n\t\tif (entry.sourceType === \"local\") {\n\t\t\treturn path.resolve(expandTilde(entry.sourceUri));","sourceCodeStart":886,"sourceCodeEnd":922,"githubUrl":"https://github.com/can1357/oh-my-pi/blob/969062200754ea02cfac922e5ebb8c608c079e15/packages/coding-agent/src/extensibility/plugins/marketplace/manager.ts#L886-L922","documentation":"When resolving a marketplace's catalog, the manager reads the catalog file recorded in the registry entry (entry.catalogPath). If the read fails with ENOENT — the file does not exist — it converts the raw filesystem error into this actionable message suggesting a /marketplace update for that marketplace. Other read/parse errors are re-thrown unchanged.","triggerScenarios":"The catalog file was deleted after registration; the marketplace was cloned/registered on another machine or path that no longer exists; the project was moved so the stored absolute path is stale; a fresh checkout never ran the marketplace update that materializes the catalog.","commonSituations":"Switching machines or restoring dotfiles without the marketplace clones; deleting the cache/clone directory to \"clean up\"; installing plugins from a marketplace whose catalog was registered under a temp path that got wiped.","solutions":["Run the marketplace update command for that marketplace (e.g. /marketplace update <name>) to re-fetch the catalog","Remove the marketplace (removeMarketplaceEntry / marketplace remove) and re-add it with the correct source","Check that entry.catalogPath points where you expect — fix a stale path in the registry if the file exists elsewhere"],"exampleFix":"// stale registry entry\n{\"name\": \"community\", \"catalogPath\": \"/tmp/clone123/.omp-marketplace.json\"}\n// after re-adding / updating\n{\"name\": \"community\", \"catalogPath\": \"~/.omp/marketplaces/community/.omp-marketplace.json\"}","handlingStrategy":"retry","validationCode":"const catalogPath = path.resolve(expandTilde(entry.catalogPath));\nconst catalogFile = Bun.file(catalogPath);\nif (!(await catalogFile.exists())) {\n  await updateMarketplace(entry.name); // re-fetch catalog before install\n}","typeGuard":"null","tryCatchPattern":"try {\n  await installFromMarketplace(entry);\n} catch (err) {\n  if (err.message.includes('Marketplace catalog not found')) {\n    const m = err.message.match(/update (\\S+)$/);\n    if (m) await runMarketplaceUpdate(m[1]);\n    // then retry once\n  } else throw err;\n}","preventionTips":["Run marketplace update after restoring dotfiles or switching machines","Don't delete marketplace clone/cache directories manually","Prefer tilde/relative catalog paths over temp directories that get wiped","Re-add marketplaces whose registered paths no longer exist"],"tags":["filesystem","enoent","stale-path"],"backgroundTag":"catalog-file-not-found","analyzedSha":"969062200754ea02cfac922e5ebb8c608c079e15","analyzedAt":"2026-08-31T10:29:35.737Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}