{"record":{"id":"57b768771cde5131","repo":"affaan-m/ECC","slug":"unknown-install-component-normalizedcomponentid","errorCode":null,"errorMessage":"Unknown install component: ${normalizedComponentId}","messagePattern":"Unknown install component: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"scripts/lib/install-manifests.js","lineNumber":429,"sourceCode":"        moduleIds,\n        moduleCount: moduleIds.length,\n        targets,\n      };\n    })\n    .filter(component => !target || component.targets.includes(target));\n}\n\nfunction getInstallComponent(componentId, options = {}) {\n  const manifests = loadInstallManifests(options);\n  const normalizedComponentId = String(componentId || '').trim();\n\n  if (!normalizedComponentId) {\n    throw new Error('An install component ID is required');\n  }\n\n  const component = manifests.componentsById.get(normalizedComponentId);\n  if (!component) {\n    throw new Error(`Unknown install component: ${normalizedComponentId}`);\n  }\n\n  const moduleIds = dedupeStrings(component.modules);\n  const modules = moduleIds\n    .map(moduleId => manifests.modulesById.get(moduleId))\n    .filter(Boolean)\n    .map(module => ({\n      id: module.id,\n      kind: module.kind,\n      description: module.description,\n      targets: module.targets,\n      defaultInstall: module.defaultInstall,\n      cost: module.cost,\n      stability: module.stability,\n      dependencies: dedupeStrings(module.dependencies),\n    }));\n\n  return {","sourceCodeStart":411,"sourceCodeEnd":447,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/scripts/lib/install-manifests.js#L411-L447","documentation":"getInstallComponent() looks up the normalized component ID in manifests.componentsById. If no component with that ID exists in the loaded install manifests, it throws this error naming the unknown ID.","triggerScenarios":"Calling getInstallComponent('skills/my-skill') where the ID is not registered in manifests/install-components.json — typos, wrong path-style IDs, components removed/renamed in a newer version, or a custom component not added to the manifest.","commonSituations":"Referencing a component that exists on disk but was never registered in the manifest, IDs changed by a manifest refactor, or hardcoding an ID from another user's custom setup.","solutions":["Run listInstallComponents() (optionally with family/target filters) to see valid IDs and copy the exact one","Fix the typo or use the correct ID format (match the 'id' field in manifests/install-components.json)","If the component is new, register it in manifests/install-components.json and run npm run catalog:sync","Update hardcoded IDs after upgrading ECC, since manifests can rename components"],"exampleFix":"// before\ngetInstallComponent('security-review-skill');\n// after\ngetInstallComponent('security-review');","handlingStrategy":"try-catch","validationCode":"const known = listInstallComponents().map(c => c.id);\nif (!known.includes(componentId)) {\n  throw new Error(`'${componentId}' is not a registered component. Known: ${known.join(', ')}`);\n}","typeGuard":"const isKnownComponent = (id, comps) => comps.some(c => c.id === id);","tryCatchPattern":"try {\n  const comp = getInstallComponent(componentId);\n} catch (err) {\n  if (err.message.startsWith('Unknown install component')) {\n    const known = listInstallComponents().map(c => c.id);\n    console.error(`${err.message}\\nKnown components: ${known.join(', ')}`);\n  } else throw err;\n}","preventionTips":["Never hardcode component IDs; look them up via listInstallComponents()","Register new components in manifests/install-components.json before referencing them","Re-verify IDs after pulling ECC updates (manifests can rename components)","Compare IDs against the manifest 'id' field, not file paths or skill names"],"tags":["not-found","install-manifests","lookup"],"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"}