EveryInc/compound-engineering-plugin · warning
Skipping ${tool.name}: no output returned.
Error message
Skipping ${tool.name}: no output returned. What it means
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.
Source
Thrown at src/commands/convert.ts:122
console.log(`Detected ${activeTargets.length} installable tool(s):`)
for (const tool of detected) {
if (tool.detected && !targets[tool.name]?.implemented) {
console.log(` - ${tool.name} — native plugin install; skipped`)
continue
}
console.log(` ${tool.detected ? "✓" : "✗"} ${tool.name} — ${tool.reason}`)
}
for (const tool of activeTargets) {
const handler = targets[tool.name]
if (!handler || !handler.implemented) {
console.warn(`Skipping ${tool.name}: not implemented.`)
continue
}
const bundle = handler.convert(plugin, options)
if (!bundle) {
console.warn(`Skipping ${tool.name}: no output returned.`)
continue
}
const root = resolveTargetOutputRoot({
targetName: tool.name,
outputRoot,
codexHome,
piHome,
pluginName: plugin.manifest.name,
hasExplicitOutput,
})
const writeScope =
tool.name === "opencode" ? resolveOpenCodeWriteScope(hasExplicitOutput, undefined) : undefined
await handler.write(root, bundle, writeScope)
console.log(`Converted ${plugin.manifest.name} to ${tool.name} at ${root}`)
}
if (activeTargets.some((t) => t.name === "codex")) {
await stripCodexAgentsToolMap(codexHome)View on GitHub (pinned to c9c10f8c75)
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.
Example fix
// before plugin with empty skills/ -> handler returns null -> 'Skipping opencode: no output returned.' // after add skills/<name>/SKILL.md to the plugin and re-run convert
Defensive patterns
Strategy: validation
Validate before calling
// ensure the plugin has content before converting
import { readdir } from "node:fs/promises";
const hasContent = (await readdir(pluginRoot, { withFileTypes: true }))
.some(e => e.isDirectory());
if (!hasContent) throw new Error("plugin has no convertible content"); Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Skipping ${extra}: no output returned.
- Skipping ${tool.name}: not implemented.
- Skipping unknown target: ${extra}
- Skipping ${extra}: not implemented yet.
- Skipping ${tool.name}: no output returned.
AI-assisted analysis of EveryInc/compound-engineering-plugin@c9c10f8c75 (2026-08-31).
Data as JSON: /api/errors/4f703d3b28bcba92.
Report an issue: GitHub.