{"record":{"id":"fe7e087c875706b6","repo":"EveryInc/compound-engineering-plugin","slug":"skipping-unknown-target-extra","errorCode":null,"errorMessage":"Skipping unknown target: ${extra}","messagePattern":"Skipping unknown target: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/commands/convert.ts","lineNumber":180,"sourceCode":"      hasExplicitOutput,\n      scope: resolvedScope,\n    })\n    const bundle = target.convert(plugin, options)\n    if (!bundle) {\n      throw new Error(`Target ${targetName} did not return a bundle.`)\n    }\n\n    const effectiveScope =\n      targetName === \"opencode\" ? resolveOpenCodeWriteScope(hasExplicitOutput, resolvedScope) : resolvedScope\n    await target.write(primaryOutputRoot, bundle, effectiveScope)\n    console.log(`Converted ${plugin.manifest.name} to ${targetName} at ${primaryOutputRoot}`)\n\n    const extraTargets = parseExtraTargets(args.also)\n    const allTargets = [targetName, ...extraTargets]\n    for (const extra of extraTargets) {\n      const handler = targets[extra]\n      if (!handler) {\n        console.warn(`Skipping unknown target: ${extra}`)\n        continue\n      }\n      if (!handler.implemented) {\n        console.warn(`Skipping ${extra}: not implemented yet.`)\n        continue\n      }\n      const extraBundle = handler.convert(plugin, options)\n      if (!extraBundle) {\n        console.warn(`Skipping ${extra}: no output returned.`)\n        continue\n      }\n      const extraRoot = resolveTargetOutputRoot({\n        targetName: extra,\n        outputRoot,\n        codexHome,\n        piHome,\n        pluginName: plugin.manifest.name,\n        hasExplicitOutput,","sourceCodeStart":162,"sourceCodeEnd":198,"githubUrl":"https://github.com/EveryInc/compound-engineering-plugin/blob/c9c10f8c75412c7232cb2bd663e5fd1cea98d84e/src/commands/convert.ts#L162-L198","documentation":"When converting with extra targets (--also), each parsed extra name is looked up in the targets registry. A name with no registry entry is skipped with this warning; the run continues with valid targets. This guards against typos and renamed providers without failing the whole conversion.","triggerScenarios":"Passing an unknown provider name to the --also flag of the convert command, e.g. --also claude,codex where 'claude' is not a key in targets.","commonSituations":"Typo in the --also value; using a target name from an older CLI version that was renamed; guessing provider names from docs of a different tool.","solutions":["Check the detected-targets listing for valid names and correct the --also value.","Fix the typo in the --also argument.","Check README/docs for the supported --to values.","Upgrade the CLI if the target exists only in a newer version."],"exampleFix":"// before\nbun convert claude --also opencodee   // typo -> 'Skipping unknown target: opencodee'\n// after\nbun convert claude --also opencode\n","handlingStrategy":"validation","validationCode":"const KNOWN = [\"claude\",\"codex\",\"opencode\",\"cursor\",\"gemini\",\"pi\"]; // see src/targets/index.ts\nconst extras = parseExtraTargets(args.also).filter(t => KNOWN.includes(t));\nif (extras.length !== parseExtraTargets(args.also).length) {\n  console.error(\"Unknown --also target; check supported values\");\n}","typeGuard":"function isKnownTarget(name: string): name is TargetName {\n  return name in targets;\n}","tryCatchPattern":null,"preventionTips":["Validate --also values against documented target names.","Avoid hardcoding provider names from other tools' docs.","Shell-quote variables feeding --also to prevent surprise values.","Consult README for the supported --to/--also list."],"tags":["cli","convert","unknown-target"],"backgroundTag":"unknown-target-name","analyzedSha":"c9c10f8c75412c7232cb2bd663e5fd1cea98d84e","analyzedAt":"2026-08-31T15:18:07.959Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}