{"record":{"id":"4f703d3b28bcba92","repo":"EveryInc/compound-engineering-plugin","slug":"skipping-tool-name-no-output-returned","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/convert.ts","lineNumber":122,"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(`Converted ${plugin.manifest.name} to ${tool.name} at ${root}`)\n      }\n\n      if (activeTargets.some((t) => t.name === \"codex\")) {\n        await stripCodexAgentsToolMap(codexHome)","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/EveryInc/compound-engineering-plugin/blob/c9c10f8c75412c7232cb2bd663e5fd1cea98d84e/src/commands/convert.ts#L104-L140","documentation":"After a target's convert() handler runs, if it returns null/undefined (no bundle) the CLI warns and continues rather than writing an empty or broken output tree. This distinguishes 'implemented but produced nothing' (e.g. nothing in the plugin maps to this target) from the not-implemented skip.","triggerScenarios":"Calling convert or install where handler.convert(plugin, options) returns falsy for an implemented handler — typically the plugin has no content convertible to that target, or the handler detected nothing to emit.","commonSituations":"Converting a plugin with no skills/agents matching the target format; a handler whose internal validation silently bails on an unusual plugin layout; empty plugin fixture used as input.","solutions":["Inspect the input plugin for content the target can consume (skills, agents, commands).","Run with verbose/debug output if available to see why the handler produced no bundle.","File a bug if the target should produce output for your plugin.","Check the handler's convert() return conditions in src/targets/<provider>.ts."],"exampleFix":"// before\nplugin with empty skills/ -> handler returns null -> 'Skipping opencode: no output returned.'\n// after\nadd skills/<name>/SKILL.md to the plugin and re-run convert\n","handlingStrategy":"validation","validationCode":"// ensure the plugin has content before converting\nimport { readdir } from \"node:fs/promises\";\nconst hasContent = (await readdir(pluginRoot, { withFileTypes: true }))\n  .some(e => e.isDirectory());\nif (!hasContent) throw new Error(\"plugin has no convertible content\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Verify the plugin contains skills/agents/commands before converting.","Know which content types each target consumes.","Treat a null bundle as 'nothing to emit', not an exception.","Test conversions with a populated plugin fixture."],"tags":["cli","convert","empty-output"],"backgroundTag":"empty-conversion-output","analyzedSha":"c9c10f8c75412c7232cb2bd663e5fd1cea98d84e","analyzedAt":"2026-08-31T15:18:07.959Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}