EveryInc/compound-engineering-plugin · error · Error

Unknown bundled plugin: ${input}

Error message

Unknown bundled plugin: ${input}

What it means

When the `--plugin` argument is not a filesystem path, `resolveCleanupPluginPath` treats it as a bundled plugin name: it first tries the repo root manifest, then falls back to `plugins/<name>/.claude-plugin/plugin.json` in the repo. If neither exists it throws this error, meaning the name matches no plugin bundled with (or constituting) this package.

Source

Thrown at src/commands/cleanup.ts:680

  }

  const repoRoot = fileURLToPath(new URL("../..", import.meta.url))
  const rootManifestPath = path.join(repoRoot, ".claude-plugin", "plugin.json")
  if (await pathExists(rootManifestPath)) {
    try {
      const raw = await fs.readFile(rootManifestPath, "utf8")
      const manifest = JSON.parse(raw) as { name?: string }
      if (manifest.name === input) return repoRoot
    } catch {
      // Fall through to legacy multi-plugin layout.
    }
  }

  const legacyPluginPath = path.join(repoRoot, "plugins", input)
  const legacyManifestPath = path.join(legacyPluginPath, ".claude-plugin", "plugin.json")
  if (await pathExists(legacyManifestPath)) return legacyPluginPath

  throw new Error(`Unknown bundled plugin: ${input}`)
}

function resolveWorkspaceRoot(value: unknown): string {
  if (value && String(value).trim()) {
    return path.resolve(expandHome(String(value).trim()))
  }
  return process.cwd()
}

function resolveCopilotWorkspaceRoot(outputRoot: string): string {
  return path.basename(outputRoot) === ".github" ? outputRoot : path.join(outputRoot, ".github")
}

function resolveOpenCodeWorkspaceRoot(outputRoot: string): string {
  return path.basename(outputRoot) === ".opencode" ? outputRoot : path.join(outputRoot, ".opencode")
}

function hasExplicitValue(value: unknown): boolean {

View on GitHub (pinned to c9c10f8c75)

Solutions

  1. Use the default: run cleanup with no --plugin (defaults to "compound-engineering").
  2. Fix the spelling of the bundled plugin name, or check which plugins exist under plugins/ in your checkout.
  3. If you meant a local checkout, pass an explicit path starting with ./, / or ~ instead of a bare name.

Example fix

// before
bun run src/index.ts cleanup --plugin compund-engineering
// Error: Unknown bundled plugin: compund-engineering

// after
bun run src/index.ts cleanup --plugin compound-engineering
Defensive patterns

Strategy: validation

Validate before calling

const BUNDLED = ["compound-engineering"] // plugins bundled with this CLI
if (!pluginArg.startsWith(".") && !pluginArg.startsWith("/") && !pluginArg.startsWith("~")) {
  if (!BUNDLED.includes(pluginArg)) {
    throw new Error(`'${pluginArg}' is not a bundled plugin. Use "compound-engineering" or a filesystem path.`)
  }
}

Type guard

function isBundledPluginName(name: string): boolean {
  return name === "compound-engineering" // extend if more bundled plugins ship
}

Try / catch

try {
  await cleanup({ plugin: pluginArg })
} catch (e) {
  if (e instanceof Error && e.message.startsWith("Unknown bundled plugin:")) {
    console.error(`No bundled plugin named '${pluginArg}'. Omit --plugin for the default.`)
  } else throw e
}

Prevention

When it happens

Trigger: Running `cleanup --plugin some-plugin` where neither `<repoRoot>/.claude-plugin/plugin.json` path resolution accepts it nor `<repoRoot>/plugins/some-plugin/.claude-plugin/plugin.json` exists — a misspelled name, or running inside an installed/copy of the CLI where the bundled `plugins/` directory isn't present.

Common situations: Typo in the plugin name; using an npm-installed CLI where repo-relative lookup paths don't exist; expecting other plugins to be bundled when only compound-engineering is; version drift where a legacy bundled plugin was removed.

Related errors


AI-assisted analysis of EveryInc/compound-engineering-plugin@c9c10f8c75 (2026-08-31). Data as JSON: /api/errors/46dbe592cab155c6. Report an issue: GitHub.