{"record":{"id":"edafaab59c334398","repo":"affaan-m/ECC","slug":"unknown-install-component-componentid","errorCode":null,"errorMessage":"Unknown install component: ${componentId}","messagePattern":"Unknown install component: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"scripts/lib/install-manifests.js","lineNumber":464,"sourceCode":"\n  return {\n    id: component.id,\n    family: component.family,\n    description: component.description,\n    moduleIds,\n    moduleCount: moduleIds.length,\n    targets: intersectTargets(modules),\n    modules,\n  };\n}\n\nfunction expandComponentIdsToModuleIds(componentIds, manifests) {\n  const expandedModuleIds = [];\n\n  for (const componentId of dedupeStrings(componentIds)) {\n    const component = manifests.componentsById.get(componentId);\n    if (!component) {\n      throw new Error(`Unknown install component: ${componentId}`);\n    }\n    expandedModuleIds.push(...component.modules);\n  }\n\n  return dedupeStrings(expandedModuleIds);\n}\n\nfunction getTargetDefaultProfileId(target, manifests) {\n  const profileId = target ? TARGET_DEFAULT_PROFILE_IDS[target] : null;\n  return profileId && manifests.profiles[profileId] ? profileId : null;\n}\n\nfunction getTargetDefaultExclusions(target, manifests) {\n  const exclusions = target ? TARGET_DEFAULT_EXCLUSIONS[target] : null;\n  if (!Array.isArray(exclusions)) {\n    return [];\n  }\n","sourceCodeStart":446,"sourceCodeEnd":482,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/scripts/lib/install-manifests.js#L446-L482","documentation":"expandComponentIdsToModuleIds() resolves each component ID to its module list via manifests.componentsById. Any ID that does not resolve to a registered component aborts the whole expansion with this error, since a partial install plan would be unsafe.","triggerScenarios":"Calling expandComponentIdsToModuleIds(['agents', 'typo-component'], manifests) — usually via resolveInstallPlan() or excludedModuleIds() with an invalid component ID in the install options/components list.","commonSituations":"An install config (e.g. install-modules.json component list or CLI --components flag) referencing a component that was renamed, deleted, or misspelled; or IDs copied from an older ECC version.","solutions":["Validate every ID against listInstallComponents() output before building the plan","Correct or remove the unknown ID from the components list/config","After upgrading, re-sync component IDs (npm run catalog:sync) and update stale references","Wrap resolveInstallPlan() in try/catch and surface the offending ID to the user"],"exampleFix":"// before\nresolveInstallPlan({ components: ['agents', 'hooks '] });\n// after\nresolveInstallPlan({ components: ['agents', 'hooks'] });","handlingStrategy":"validation","validationCode":"const knownIds = new Set(loadInstallManifests().componentsById.keys());\nconst bad = componentIds.filter(id => !knownIds.has(id));\nif (bad.length) {\n  throw new Error(`Unknown component IDs in plan: ${bad.join(', ')}`);\n}","typeGuard":"const allKnown = (ids, manifests) => ids.every(id => manifests.componentsById.has(id));","tryCatchPattern":"try {\n  const plan = resolveInstallPlan(options);\n} catch (err) {\n  if (err.message.startsWith('Unknown install component')) {\n    console.error(`Install plan references an invalid component: ${err.message}`);\n    process.exitCode = 1;\n  } else throw err;\n}","preventionTips":["Validate every ID in a components list against the manifest before building a plan","Keep install configs (install-modules.json, CLI flags) in sync via npm run catalog:sync","After ECC upgrades, diff your component lists against listInstallComponents() output","Reject the whole plan up front rather than allowing partial component resolution"],"tags":["not-found","install-manifests","install-plan"],"backgroundTag":"entity-not-found","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"}