{"record":{"id":"a97cf172d2f53eef","repo":"affaan-m/ECC","slug":"unknown-install-module-moduleid","errorCode":null,"errorMessage":"Unknown install module: ${moduleId}","messagePattern":"Unknown install module: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"scripts/lib/install-manifests.js","lineNumber":637,"sourceCode":"  }\n\n  if (effectiveRequestedIds.length === 0) {\n    throw new Error('Selection excludes every requested install module');\n  }\n\n  const selectedIds = new Set();\n  const skippedTargetIds = new Set();\n  const excludedIds = new Set([\n    ...excludedModuleIds,\n    ...targetDefaultExclusions.map(exclusion => exclusion.moduleId),\n  ]);\n  const visitingIds = new Set();\n  const resolvedIds = new Set();\n\n  function resolveModule(moduleId, dependencyOf, rootRequesterId) {\n    const module = manifests.modulesById.get(moduleId);\n    if (!module) {\n      throw new Error(`Unknown install module: ${moduleId}`);\n    }\n\n    if (excludedModuleOwners.has(moduleId)) {\n      if (dependencyOf) {\n        const owners = excludedModuleOwners.get(moduleId) || [];\n        throw new Error(\n          `Module ${dependencyOf} depends on excluded module ${moduleId}${owners.length > 0 ? ` (excluded by ${owners.join(', ')})` : ''}`\n        );\n      }\n      return;\n    }\n\n    const supportsTarget = !target\n      || (\n        readModuleTargetsOrThrow(module).includes(target)\n        && (!targetAdapter || targetAdapter.supportsModule(module, targetPlanningInput))\n      );\n","sourceCodeStart":619,"sourceCodeEnd":655,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/scripts/lib/install-manifests.js#L619-L655","documentation":"During recursive dependency resolution, each requested module ID is looked up in manifests.modulesById. If a module ID (from the profile, explicit includes, or a dependency edge) has no manifest entry, resolveModule throws naming the unknown ID. This catches both bad user input and broken dependency references inside the manifest.","triggerScenarios":"resolveInstallPlan({ includeModuleIds: ['skills/nonexistent'] }) or a manifest profile/component/dependency referencing a module ID that is missing from manifests/install-modules.json.","commonSituations":"Typo in a module ID passed on the CLI, a hand-edited manifest that added a dependency on a removed module, or a version mismatch where a component references modules no longer defined.","solutions":["Correct the module ID against the modules defined in manifests/install-modules.json","If the ID comes from a manifest dependency, fix the manifest entry (check for renamed modules)","Regenerate/sync the manifests (npm run catalog:sync) if they are stale","Remove the stale module reference from includes, profiles, or components"],"exampleFix":"// before\nresolveInstallPlan({ profileId: 'standard', includeModuleIds: ['skills/tdd'] })\n// after\nresolveInstallPlan({ profileId: 'standard', includeModuleIds: ['skills/tdd-workflow'] })","handlingStrategy":"validation","validationCode":"const manifests = loadInstallManifests();\nconst unknown = (options.includeModuleIds ?? []).filter(id => !manifests.modulesById.get(id));\nif (unknown.length) throw new Error(`unknown module(s): ${unknown.join(', ')}`);","typeGuard":"function isKnownModule(id, manifests) {\n  return typeof id === 'string' && manifests.modulesById.has(id);\n}","tryCatchPattern":"try {\n  const plan = resolveInstallPlan(options);\n} catch (err) {\n  if (err.message.startsWith('Unknown install module:')) {\n    console.error(`${err.message} — check manifests/install-modules.json`); process.exitCode = 2;\n  } else throw err;\n}","preventionTips":["Validate module IDs against manifests/install-modules.json before calls","Run npm run catalog:sync after adding/removing skills or agents","Watch for this error without user input — it can indicate a broken manifest dependency edge"],"tags":["validation","manifest","install"],"backgroundTag":"record-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"}