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

  1. Inspect the input plugin for content the target can consume (skills, agents, commands).
  2. Run with verbose/debug output if available to see why the handler produced no bundle.
  3. File a bug if the target should produce output for your plugin.
  4. 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

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


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