EveryInc/compound-engineering-plugin · warning
Skipping ${tool.name}: no output returned.
Error message
Skipping ${tool.name}: no output returned. What it means
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.
Source
Thrown at src/commands/install.ts:133
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(`Installed ${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
- 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.
Example fix
// before plugin with zero commands -> command-only target returns null -> 'Skipping X: no output returned.' // after add commands/ so the handler emits a bundle
Defensive patterns
Strategy: validation
Validate before calling
// check the plugin has content before installing
const entries = await readdir(pluginRoot).catch(() => [] as string[]);
if (entries.length === 0) throw new Error("nothing to install"); Prevention
- 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.
When it happens
Trigger: Running install where handler.convert(plugin, options) returns falsy for an implemented target because the plugin has no content that target consumes.
Common situations: 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.
Related errors
- Skipping ${tool.name}: no output returned.
- Skipping ${extra}: no output returned.
- Skipping ${tool.name}: not implemented.
- Skipping unknown target: ${extra}
- Cleanup currently supports only the compound-engineering plu
AI-assisted analysis of EveryInc/compound-engineering-plugin@c9c10f8c75 (2026-08-31).
Data as JSON: /api/errors/4e21a4391b976098.
Report an issue: GitHub.