{"record":{"id":"4e21a4391b976098","repo":"EveryInc/compound-engineering-plugin","slug":"skipping-tool-name-no-output-returned-4e21a4","errorCode":null,"errorMessage":"Skipping ${tool.name}: no output returned.","messagePattern":"Skipping (.+?): no output returned\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/commands/install.ts","lineNumber":133,"sourceCode":"\n        console.log(`Detected ${activeTargets.length} installable tool(s):`)\n        for (const tool of detected) {\n          if (tool.detected && !targets[tool.name]?.implemented) {\n            console.log(`  - ${tool.name} — native plugin install; skipped`)\n            continue\n          }\n          console.log(`  ${tool.detected ? \"✓\" : \"✗\"} ${tool.name} — ${tool.reason}`)\n        }\n\n        for (const tool of activeTargets) {\n          const handler = targets[tool.name]\n          if (!handler || !handler.implemented) {\n            console.warn(`Skipping ${tool.name}: not implemented.`)\n            continue\n          }\n          const bundle = handler.convert(plugin, options)\n          if (!bundle) {\n            console.warn(`Skipping ${tool.name}: no output returned.`)\n            continue\n          }\n          const root = resolveTargetOutputRoot({\n            targetName: tool.name,\n            outputRoot,\n            codexHome,\n            piHome,\n            pluginName: plugin.manifest.name,\n            hasExplicitOutput,\n          })\n          const writeScope =\n            tool.name === \"opencode\" ? resolveOpenCodeWriteScope(hasExplicitOutput, undefined) : undefined\n          await handler.write(root, bundle, writeScope)\n          console.log(`Installed ${plugin.manifest.name} to ${tool.name} at ${root}`)\n        }\n\n        if (activeTargets.some((t) => t.name === \"codex\")) {\n          await stripCodexAgentsToolMap(codexHome)","sourceCodeStart":115,"sourceCodeEnd":151,"githubUrl":"https://github.com/EveryInc/compound-engineering-plugin/blob/c9c10f8c75412c7232cb2bd663e5fd1cea98d84e/src/commands/install.ts#L115-L151","documentation":"During install, when an implemented handler's convert() returns no bundle the target is skipped with this warning — nothing is written or installed for it, and the install continues with remaining targets. It prevents creating empty/partial install trees for targets with nothing to install.","triggerScenarios":"Running install where handler.convert(plugin, options) returns falsy for an implemented target because the plugin has no content that target consumes.","commonSituations":"Installing a plugin with no agents into a target that only emits agents; handlers returning null after internal validation of an unusual plugin layout; test fixtures with missing sections.","solutions":["Check the plugin has content relevant to the target before installing.","Inspect the target writer's null-return path in src/targets/<provider>.ts.","Skip that target in your install invocation.","File an issue if output was expected."],"exampleFix":"// before\nplugin with zero commands -> command-only target returns null -> 'Skipping X: no output returned.'\n// after\nadd commands/ so the handler emits a bundle\n","handlingStrategy":"validation","validationCode":"// check the plugin has content before installing\nconst entries = await readdir(pluginRoot).catch(() => [] as string[]);\nif (entries.length === 0) throw new Error(\"nothing to install\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Verify plugin content types match the targets you install to.","Treat null bundles as 'nothing to install', not failures.","Test installs against a fully populated plugin.","Inspect target writers' null-return paths for edge cases."],"tags":["cli","install","empty-output"],"backgroundTag":"empty-conversion-output","analyzedSha":"c9c10f8c75412c7232cb2bd663e5fd1cea98d84e","analyzedAt":"2026-08-31T15:18:07.959Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}