EveryInc/compound-engineering-plugin · error · Error

Could not find plugin ${pluginName} in ${source}.

Error message

Could not find plugin ${pluginName} in ${source}.

What it means

When installing a plugin by name, the CLI clones the GitHub source into a temp directory and then searches it with `resolvePluginRoot` for a directory matching the plugin name (defined in the marketplace manifest). If no matching plugin root is found, it cleans up the temp clone and throws this error naming the plugin and source repo.

Source

Thrown at src/commands/install.ts:294

async function resolveBundledPluginPath(pluginName: string): Promise<string | null> {
  const repoRoot = fileURLToPath(new URL("../..", import.meta.url))
  return await resolvePluginRoot(repoRoot, pluginName)
}

async function resolveGitHubPluginPath(pluginName: string, branch?: string): Promise<ResolvedPluginPath> {
  const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), "compound-plugin-"))
  const source = resolveGitHubSource()
  try {
    await cloneGitHubRepo(source, tempRoot, branch)
  } catch (error) {
    await fs.rm(tempRoot, { recursive: true, force: true })
    throw error
  }

  const pluginPath = await resolvePluginRoot(tempRoot, pluginName)
  if (!pluginPath) {
    await fs.rm(tempRoot, { recursive: true, force: true })
    throw new Error(`Could not find plugin ${pluginName} in ${source}.`)
  }

  return {
    path: pluginPath,
    cleanup: async () => {
      await fs.rm(tempRoot, { recursive: true, force: true })
    },
  }
}

async function resolvePluginRoot(repoRoot: string, pluginName: string): Promise<string | null> {
  const rootManifest = path.join(repoRoot, ".claude-plugin", "plugin.json")
  if (await pathExists(rootManifest)) {
    try {
      const raw = await fs.readFile(rootManifest, "utf8")
      const manifest = JSON.parse(raw) as { name?: string }
      if (manifest.name === pluginName) return repoRoot
    } catch {

View on GitHub (pinned to c9c10f8c75)

Solutions

  1. Check the exact plugin name in the source repo's `.claude-plugin/marketplace.json`.
  2. List available plugins in the marketplace catalog and pick the correct name.
  3. If COMPOUND_PLUGIN_GITHUB_SOURCE is set, unset it or point it at the correct repository.
  4. Update the CLI — the plugin may have been renamed in a newer release.
  5. Alternatively install from a local path with `install ./path/to/plugin`.

Example fix

// before
bun run src/index.ts install compund-engineering
// after
bun run src/index.ts install compound-engineering
Defensive patterns

Strategy: validation

Validate before calling

// Verify the plugin name exists in the marketplace before installing
const res = await fetch("https://raw.githubusercontent.com/<owner>/<repo>/main/.claude-plugin/marketplace.json")
const catalog = await res.json()
const names = catalog.plugins.map((p: any) => p.name)
if (!names.includes(pluginName)) throw new Error(`${pluginName} not in marketplace; available: ${names.join(", ")}`)

Try / catch

try {
  await install(pluginName)
} catch (e) {
  if (e instanceof Error && e.message.startsWith("Could not find plugin")) {
    console.error(`Unknown plugin name. Check marketplace.json; source=${process.env.COMPOUND_PLUGIN_GITHUB_SOURCE ?? "default"}`)
  } else throw e
}

Prevention

When it happens

Trigger: Running `install <plugin-name>` where the name is not present in the source repo's marketplace catalog — misspelled plugin name, plugin removed/renamed upstream, or COMPOUND_PLUGIN_GITHUB_SOURCE pointing at a fork/repo that does not contain the plugin.

Common situations: Typo in the plugin name; following docs for a newer CLI whose plugin was renamed; COMPOUND_PLUGIN_GITHUB_SOURCE pointing at an outdated or unrelated repo; network succeeded but the clone is an old commit missing the plugin.

Related errors


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