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

  1. Run listInstallComponents() (optionally with family/target filters) to see valid IDs and copy the exact one
  2. Fix the typo or use the correct ID format (match the 'id' field in manifests/install-components.json)
  3. If the component is new, register it in manifests/install-components.json and run npm run catalog:sync
  4. 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

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


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)