{"record":{"id":"a59b8e6a88738303","repo":"affaan-m/ECC","slug":"unknown-install-target-adapter-targetoradapteri","errorCode":null,"errorMessage":"Unknown install target adapter: ${targetOrAdapterId}","messagePattern":"Unknown install target adapter: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"scripts/lib/install-targets/registry.js","lineNumber":44,"sourceCode":"  opencodeHome,\n  openclawHome,\n  codebuddyProject,\n  joycodeProject,\n  kimiProject,\n  qwenHome,\n  zedProject,\n  adalProject,\n]);\n\nfunction listInstallTargetAdapters() {\n  return ADAPTERS.slice();\n}\n\nfunction getInstallTargetAdapter(targetOrAdapterId) {\n  const adapter = ADAPTERS.find(candidate => candidate.supports(targetOrAdapterId));\n\n  if (!adapter) {\n    throw new Error(`Unknown install target adapter: ${targetOrAdapterId}`);\n  }\n\n  return adapter;\n}\n\nfunction planInstallTargetScaffold(options = {}) {\n  const adapter = getInstallTargetAdapter(options.target);\n  const modules = Array.isArray(options.modules) ? options.modules : [];\n  const exemptValidationCodes = new Set(Array.isArray(options.exemptValidationCodes) ? options.exemptValidationCodes : []);\n  const planningInput = {\n    repoRoot: options.repoRoot,\n    projectRoot: options.projectRoot || options.repoRoot,\n    homeDir: options.homeDir,\n    env: resolveInvocationEnvironment(options),\n  };\n  const validationIssues = adapter.validate(planningInput);\n  const blockingIssues = validationIssues.filter(issue => (\n    issue.severity === 'error' && !exemptValidationCodes.has(issue.code)","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/scripts/lib/install-targets/registry.js#L26-L62","documentation":"getInstallTargetAdapter looks up an adapter in the ADAPTERS registry by asking each candidate supports(targetOrAdapterId). If no adapter claims the id, the registry throws, because every subsequent step (validate, resolveRoot, planOperations) depends on an adapter. This guards against typos or unregistered install targets (e.g. a new harness without an adapter module registered).","triggerScenarios":"Calling getInstallTargetAdapter('claude-code') or planInstallTargetScaffold({ target: '...' }) with an id no adapter supports; passing an adapter object's wrong property; typo'd target name; calling before adapter modules are loaded/registered.","commonSituations":"Typo in a CLI --target flag value; adding a new install target but forgetting to register it in ADAPTERS; version change where a target id was renamed (e.g. 'codex' to 'openai-codex'); tests constructing ids dynamically from config files.","solutions":["Use a supported target id — log or list ADAPTERS ids and match the exact string.","Fix the typo or casing in the target/adapter identifier you pass.","If the target is new, register its adapter module in ADAPTERS with a supports() implementation.","Validate target ids at the CLI boundary before reaching the registry."],"exampleFix":"// before\nplanInstallTargetScaffold({ target: 'kimi-mcp' });\n// after\nplanInstallTargetScaffold({ target: 'kimi' });","handlingStrategy":"type-guard","validationCode":"const SUPPORTED = ['claude', 'codex', 'cursor', 'opencode', 'kimi', 'antigravity'];\nif (!SUPPORTED.includes(targetOrAdapterId)) throw new Error(`Unsupported target: ${targetOrAdapterId}`);","typeGuard":"const isKnownTarget = (id) => typeof id === 'string' && ADAPTERS.some(a => a.supports(id));","tryCatchPattern":"try {\n  const adapter = getInstallTargetAdapter(target);\n} catch (e) {\n  if (e.message.startsWith('Unknown install target adapter')) {\n    console.error(`Unknown target '${target}'. Supported: ${listTargetIds().join(', ')}`);\n  }\n  throw e;\n}","preventionTips":["Keep target ids centralized in a constant list and validate CLI flags against it.","Never construct target ids dynamically from unvalidated config strings.","When registering a new adapter, add its id to docs and the CLI help output."],"tags":["registry","installer","invalid-identifier"],"backgroundTag":"invalid-argument-value","analyzedSha":"8321021c54d670126ce3b2969d5deb880b4b0c2a","analyzedAt":"2026-09-16T10:08:13.343Z","contentChangedAt":"2026-09-16T10:08:13.343Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}