can1357/oh-my-pi · error · Error

Marketplace "${name}" not found

Error message

Marketplace "${name}" not found

What it means

updateMarketplace looks up the named marketplace in the registry and throws this when no entry matches. The registry is keyed by marketplace name, so updating requires the exact registered name. Nothing is fetched; this is a pure registry lookup failure.

Source

Thrown at packages/coding-agent/src/extensibility/plugins/marketplace/manager.ts:155

	async removeMarketplace(name: string): Promise<void> {
		const reg = await readMarketplacesRegistry(this.#opts.marketplacesRegistryPath);
		// removeMarketplaceEntry throws if not found — propagate to caller.
		const updated = removeMarketplaceEntry(reg, name);
		await writeMarketplacesRegistry(this.#opts.marketplacesRegistryPath, updated);

		await fs.rm(path.join(this.#opts.marketplacesCacheDir, name), {
			recursive: true,
			force: true,
		});

		logger.debug("Marketplace removed", { name });
	}

	async updateMarketplace(name: string): Promise<MarketplaceRegistryEntry> {
		const reg = await readMarketplacesRegistry(this.#opts.marketplacesRegistryPath);
		const existing = getMarketplaceEntry(reg, name);
		if (!existing) {
			throw new Error(`Marketplace "${name}" not found`);
		}

		const { catalog, clonePath } = await fetchMarketplace(existing.sourceUri, this.#opts.marketplacesCacheDir);

		// Guard against upstream catalog silently renaming itself — the registry
		// entry is keyed by name, so a drift would corrupt the entry on next read.
		if (catalog.name !== name) {
			if (clonePath) {
				await fs.rm(clonePath, { recursive: true, force: true }).catch(() => {});
			}
			throw new Error(
				`Marketplace catalog name changed from "${name}" to "${catalog.name}". ` +
					`Remove and re-add the marketplace to update.`,
			);
		}

		// Promote the temp clone to its final cache location now that drift check passed.
		if (clonePath) {

View on GitHub (pinned to 9690622007)

Solutions

  1. List registered marketplaces (e.g. via the manager's registry/list API) and use the exact name.
  2. If it was never added, call addMarketplace(source) first.
  3. Re-add the marketplace if it was removed.

Example fix

// before
await manager.updateMarketplace("my-market"); // registered as "my-marketplace"
// after
const names = (await manager.listMarketplaces()).map(m => m.name);
await manager.updateMarketplace(names[0]);
Defensive patterns

Strategy: validation

Validate before calling

const reg = JSON.parse(await Bun.file(registryPath).text());
if (!reg.marketplaces.some(m => m.name === name)) {
  throw new Error(`"${name}" is not registered. Known: ${reg.marketplaces.map(m => m.name).join(", ")}`);
}

Try / catch

try {
  await manager.updateMarketplace(name);
} catch (err) {
  if ((err as Error).message.includes("not found")) {
    await manager.addMarketplace(source); // add before update
  } else throw err;
}

Prevention

When it happens

Trigger: MarketplaceManager.updateMarketplace(name) called with a name not present in the marketplaces registry — typo, wrong casing, marketplace was removed, or it was never added.

Common situations: Typing "MyMarket" when it is registered as "mymarket"; attempting to update a marketplace after removing it; a fresh environment where setup never added the marketplace; scripts hard-coding a name that was renamed.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/db11652a6ed0e52f. Report an issue: GitHub.