affaan-m/ECC · error
Unknown install component
Error message
Unknown install component: ${normalizedComponentId} What it means
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.
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
Example fix
// before
getInstallComponent('security-review-skill');
// after
getInstallComponent('security-review'); Defensive patterns
Strategy: try-catch
Validate before calling
const known = listInstallComponents().map(c => c.id);
if (!known.includes(componentId)) {
throw new Error(`'${componentId}' is not a registered component. Known: ${known.join(', ')}`);
} Type guard
const isKnownComponent = (id, comps) => comps.some(c => c.id === id);
Try / catch
try {
const comp = getInstallComponent(componentId);
} catch (err) {
if (err.message.startsWith('Unknown install component')) {
const known = listInstallComponents().map(c => c.id);
console.error(`${err.message}\nKnown components: ${known.join(', ')}`);
} else throw err;
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
- Memory was not found.
- Session not found
- Unknown install component
- Unknown install module
- Unknown install modules
AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16).
Data as JSON: /api/errors/57b768771cde5131.
Report an issue: GitHub.
Appendix: source
Thrown at scripts/lib/install-manifests.js:429
moduleIds,
moduleCount: moduleIds.length,
targets,
};
})
.filter(component => !target || component.targets.includes(target));
}
function getInstallComponent(componentId, options = {}) {
const manifests = loadInstallManifests(options);
const normalizedComponentId = String(componentId || '').trim();
if (!normalizedComponentId) {
throw new Error('An install component ID is required');
}
const component = manifests.componentsById.get(normalizedComponentId);
if (!component) {
throw new Error(`Unknown install component: ${normalizedComponentId}`);
}
const moduleIds = dedupeStrings(component.modules);
const modules = moduleIds
.map(moduleId => manifests.modulesById.get(moduleId))
.filter(Boolean)
.map(module => ({
id: module.id,
kind: module.kind,
description: module.description,
targets: module.targets,
defaultInstall: module.defaultInstall,
cost: module.cost,
stability: module.stability,
dependencies: dedupeStrings(module.dependencies),
}));
return {View on GitHub (pinned to 8321021c54)