{"record":{"id":"5ef18fc8f6125d29","repo":"EveryInc/compound-engineering-plugin","slug":"could-not-find-plugin-manifest-under-inputpat","errorCode":null,"errorMessage":"Could not find ${PLUGIN_MANIFEST} under ${inputPath}","messagePattern":"Could not find (.+?) under (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/parsers/claude.ts","lineNumber":54,"sourceCode":"  }\n}\n\nasync function resolveClaudeRoot(inputPath: string): Promise<string> {\n  const absolute = path.resolve(inputPath)\n  const manifestAtPath = path.join(absolute, PLUGIN_MANIFEST)\n  if (await pathExists(manifestAtPath)) {\n    return absolute\n  }\n\n  if (absolute.endsWith(PLUGIN_MANIFEST)) {\n    return path.dirname(path.dirname(absolute))\n  }\n\n  if (absolute.endsWith(\"plugin.json\")) {\n    return path.dirname(path.dirname(absolute))\n  }\n\n  throw new Error(`Could not find ${PLUGIN_MANIFEST} under ${inputPath}`)\n}\n\nasync function loadAgents(agentsDirs: string[]): Promise<ClaudeAgent[]> {\n  const files = await collectMarkdownFiles(agentsDirs)\n\n  const agents: ClaudeAgent[] = []\n  for (const file of files) {\n    const raw = await readText(file)\n    const { data, body } = parseFrontmatter(raw, file)\n    const name = (data.name as string) ?? deriveMarkdownStem(file)\n    agents.push({\n      name,\n      description: data.description as string | undefined,\n      capabilities: data.capabilities as string[] | undefined,\n      model: data.model as string | undefined,\n      body: body.trim(),\n      sourcePath: file,\n    })","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/EveryInc/compound-engineering-plugin/blob/c9c10f8c75412c7232cb2bd663e5fd1cea98d84e/src/parsers/claude.ts#L36-L72","documentation":"`resolveClaudeRoot()` locates the plugin root from an input path (the root itself, a `.claude-plugin` dir, or a `plugin.json` file). If none of the layouts match — i.e. no `.claude-plugin/plugin.json` manifest can be found under the given path — it throws this error, meaning the input is not a recognizable Claude plugin directory.","triggerScenarios":"Calling `loadClaudePlugin(inputPath)` (or the `root`/`resolveClaudeRoot` path) with a directory that does not exist, is not a plugin checkout, or lacks `.claude-plugin/plugin.json`; passing a file path other than `plugin.json`; passing the `.claude-plugin` directory of a plugin whose manifest was renamed or removed.","commonSituations":"Typo in the path or pointing at the repo's `skills/` subdirectory instead of the plugin root; running the converter against a plugin missing its manifest; git sparse/symlink checkout where `.claude-plugin` wasn't materialized.","solutions":["Point the input at the plugin root — the directory containing `.claude-plugin/plugin.json`","Verify the file exists: `ls <path>/.claude-plugin/plugin.json`","If you intended a plugin.json file path, pass the path to that file directly","Restore a missing manifest from git or create a valid one"],"exampleFix":"// before\nawait loadClaudePlugin(\"./skills/ce-plan\")\n// after: use the plugin root\nawait loadClaudePlugin(\"./\")","handlingStrategy":"validation","validationCode":"import { existsSync } from \"node:fs\"\nimport path from \"node:path\"\nif (!existsSync(path.join(inputPath, \".claude-plugin\", \"plugin.json\"))) {\n  throw new Error(`${inputPath} is not a Claude plugin root (no .claude-plugin/plugin.json)`)\n}\nawait loadClaudePlugin(inputPath)","typeGuard":"function hasClaudeManifest(p: string): boolean { return existsSync(path.join(p, \".claude-plugin\", \"plugin.json\")) }","tryCatchPattern":"try {\n  const plugin = await loadClaudePlugin(inputPath)\n} catch (error) {\n  if (String(error).includes(\"Could not find\")) {\n    console.error(`${inputPath} is not a Claude plugin root; point at the directory containing .claude-plugin/plugin.json`)\n  } else throw error\n}","preventionTips":["Pass the plugin root directory, not a subdirectory like skills/ or .claude-plugin's parent's child","Verify `.claude-plugin/plugin.json` exists before converting","Restore the manifest if a checkout/merge removed it"],"tags":["parser","plugin-manifest","bad-input"],"backgroundTag":"missing-plugin-manifest","analyzedSha":"c9c10f8c75412c7232cb2bd663e5fd1cea98d84e","analyzedAt":"2026-08-31T15:18:07.959Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}