can1357/oh-my-pi · error · Error

Marketplace "${name}" not found

Error message

Marketplace "${name}" not found

What it means

removeMarketplaceEntry() filters the registry's marketplaces by name; if nothing was removed (length unchanged), the name did not exist and it throws. This prevents silent no-op removals that would leave the caller believing a marketplace was unregistered.

Source

Thrown at packages/coding-agent/src/extensibility/plugins/marketplace/registry.ts:144

export async function writeInstalledPluginsRegistry(filePath: string, reg: InstalledPluginsRegistry): Promise<void> {
	await atomicWriteJson(filePath, reg);
}

// ── Marketplace CRUD ─────────────────────────────────────────────────
// Pure functions that transform registry state. Caller is responsible for
// reading, mutating, and writing back.

export function addMarketplaceEntry(reg: MarketplacesRegistry, entry: MarketplaceRegistryEntry): MarketplacesRegistry {
	if (reg.marketplaces.some(m => m.name === entry.name)) {
		throw new Error(`Marketplace "${entry.name}" already exists`);
	}
	return { ...reg, marketplaces: [...reg.marketplaces, entry] };
}

export function removeMarketplaceEntry(reg: MarketplacesRegistry, name: string): MarketplacesRegistry {
	const filtered = reg.marketplaces.filter(m => m.name !== name);
	if (filtered.length === reg.marketplaces.length) {
		throw new Error(`Marketplace "${name}" not found`);
	}
	return { ...reg, marketplaces: filtered };
}

export function getMarketplaceEntry(reg: MarketplacesRegistry, name: string): MarketplaceRegistryEntry | undefined {
	return reg.marketplaces.find(m => m.name === name);
}

// ── Installed plugin CRUD ────────────────────────────────────────────

export function addInstalledPlugin(
	reg: InstalledPluginsRegistry,
	id: string,
	entry: InstalledPluginEntry,
): InstalledPluginsRegistry {
	const existing = reg.plugins[id] ?? [];
	return {
		...reg,

View on GitHub (pinned to 9690622007)

Solutions

  1. Verify the exact name via getMarketplaceEntry() or by listing the registry before removing
  2. Make removal idempotent: check existence first and skip when absent
  3. Fix the name spelling/case to match the registry entry

Example fix

// before
reg = removeMarketplaceEntry(reg, "comunity"); // throws
// after
if (getMarketplaceEntry(reg, "community")) {
  reg = removeMarketplaceEntry(reg, "community");
}
Defensive patterns

Strategy: validation

Validate before calling

import { getMarketplaceEntry, removeMarketplaceEntry } from './registry';
if (getMarketplaceEntry(reg, name)) {
  reg = removeMarketplaceEntry(reg, name);
} // silently skip otherwise — idempotent remove

Type guard

null

Try / catch

try {
  reg = removeMarketplaceEntry(reg, name);
} catch (err) {
  if (err.message === `Marketplace "${name}" not found`) {
    // already gone — treat as success in cleanup scripts
  } else throw err;
}

Prevention

When it happens

Trigger: Calling removeMarketplaceEntry(reg, name) where no marketplace with that exact name is registered — typo in the name, marketplace already removed, or registry loaded from a fresh/empty state.

Common situations: Running uninstall/cleanup scripts twice; case-sensitive name mismatch ("Community" vs "community"); attempting removal in a different scope/project where the marketplace was never registered.

Related errors


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