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

  1. Check the plugin has content relevant to the target before installing.
  2. Inspect the target writer's null-return path in src/targets/<provider>.ts.
  3. Skip that target in your install invocation.
  4. 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

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


AI-assisted analysis of EveryInc/compound-engineering-plugin@c9c10f8c75 (2026-08-31). Data as JSON: /api/errors/4e21a4391b976098. Report an issue: GitHub.