affaan-m/ECC · error · Error

Unknown install modules: ${unknownModuleIds.join(', ')}

Error message

Unknown install modules: ${unknownModuleIds.join(', ')}

What it means

Plural counterpart of 175: assertKnownModuleIds collects all unknown ids and throws this form when two or more are unknown. Same trigger but the request contained multiple bad ids at once.

Source

Thrown at scripts/lib/install-manifests.js:261

  if (unsupportedTargets.length > 0) {
    throw new Error(
      `Install module ${moduleId} has unsupported targets: ${unsupportedTargets.join(', ')}`
    );
  }

  return normalizedTargets;
}

function assertKnownModuleIds(moduleIds, manifests) {
  const unknownModuleIds = dedupeStrings(moduleIds)
    .filter(moduleId => !manifests.modulesById.has(moduleId));

  if (unknownModuleIds.length === 1) {
    throw new Error(`Unknown install module: ${unknownModuleIds[0]}`);
  }

  if (unknownModuleIds.length > 1) {
    throw new Error(`Unknown install modules: ${unknownModuleIds.join(', ')}`);
  }
}

function intersectTargets(modules) {
  if (!Array.isArray(modules) || modules.length === 0) {
    return [];
  }

  return SUPPORTED_INSTALL_TARGETS.filter(target => (
    modules.every(module => Array.isArray(module.targets) && module.targets.includes(target))
  ));
}

function getManifestPaths(repoRoot = DEFAULT_REPO_ROOT) {
  return {
    modulesPath: path.join(repoRoot, 'manifests', 'install-modules.json'),
    profilesPath: path.join(repoRoot, 'manifests', 'install-profiles.json'),
    componentsPath: path.join(repoRoot, 'manifests', 'install-components.json'),

View on GitHub (pinned to 01e15490f0)

Solutions

  1. Cross-check each id in the comma-separated list against `modules[].id` in install-modules.json.
  2. Fix typos / rename mappings for all listed ids.
  3. Drop any ids that no longer exist from the request.
  4. Add a preflight validation step in the caller that intersects requested ids with manifest ids.

Example fix

// before: ./install.sh --target claude --modules rules-coree,agents-coree
// after:  ./install.sh --target claude --modules rules-core,agents-core
Defensive patterns

Strategy: validation

Validate before calling

function filterUnknownModuleIds(ids, manifests) {
  const known = new Set(manifests.modules.map(m => m.id));
  return [...new Set(ids)].filter(id => !known.has(id));
}
// before resolveInstallModules: assert filterUnknownModuleIds(requested, manifests).length === 0

Type guard

function areAllKnownModuleIds(ids, manifests) {
  return ids.every(id => manifests.modulesById.has(id));
}

Try / catch

try {
  resolveInstallModules(moduleIds, options);
} catch (err) {
  if (err.message.startsWith('Unknown install modules: ')) {
    // parse comma list, drop or rename each, retry
  } else throw err;
}

Prevention

When it happens

Trigger: Caller passes several unknown module ids in one request (e.g. --modules foo,bar,baz where none exist). Also triggered by profiles or component definitions that list multiple missing module ids.

Common situations: Bulk CLI request with multiple typos; profile authored against a different manifest set; renamed bulk of modules; downstream consumer passing programmatic module lists without validating against the manifest first.

Related errors


AI-assisted analysis of affaan-m/ECC@01e15490f0 (2026-08-13). Data as JSON: /api/errors/588f7ec5e48b035a. Report an issue: GitHub.