{"record":{"id":"588f7ec5e48b035a","repo":"affaan-m/ECC","slug":"unknown-install-modules-unknownmoduleids-join","errorCode":null,"errorMessage":"Unknown install modules: ${unknownModuleIds.join(', ')}","messagePattern":"Unknown install modules: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"scripts/lib/install-manifests.js","lineNumber":281,"sourceCode":"  if (unsupportedTargets.length > 0) {\n    throw new Error(\n      `Install module ${moduleId} has unsupported targets: ${unsupportedTargets.join(', ')}`\n    );\n  }\n\n  return normalizedTargets;\n}\n\nfunction assertKnownModuleIds(moduleIds, manifests) {\n  const unknownModuleIds = dedupeStrings(moduleIds)\n    .filter(moduleId => !manifests.modulesById.has(moduleId));\n\n  if (unknownModuleIds.length === 1) {\n    throw new Error(`Unknown install module: ${unknownModuleIds[0]}`);\n  }\n\n  if (unknownModuleIds.length > 1) {\n    throw new Error(`Unknown install modules: ${unknownModuleIds.join(', ')}`);\n  }\n}\n\nfunction intersectTargets(modules) {\n  if (!Array.isArray(modules) || modules.length === 0) {\n    return [];\n  }\n\n  return SUPPORTED_INSTALL_TARGETS.filter(target => (\n    modules.every(module => Array.isArray(module.targets) && module.targets.includes(target))\n  ));\n}\n\nfunction getManifestPaths(repoRoot = DEFAULT_REPO_ROOT) {\n  return {\n    modulesPath: path.join(repoRoot, 'manifests', 'install-modules.json'),\n    profilesPath: path.join(repoRoot, 'manifests', 'install-profiles.json'),\n    componentsPath: path.join(repoRoot, 'manifests', 'install-components.json'),","sourceCodeStart":263,"sourceCodeEnd":299,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/scripts/lib/install-manifests.js#L263-L299","documentation":"Thrown by assertKnownModuleIds when two or more requested module ids are missing from the loaded manifests. It is the plural variant of the singular 'Unknown install module' error, listing all unknown ids comma-separated in the message.","triggerScenarios":"validateInstallModuleIds() or resolveLegacyCompatibilitySelection() called with a list where at least two ids are absent from manifests.modulesById, e.g. validateInstallModuleIds(['foo', 'bar']) when neither exists in install-modules.json.","commonSituations":"Bulk-editing a profile and renaming several modules incorrectly; upgrading ECC where multiple modules were consolidated/renamed; script-generated id lists built from stale data; pasting an id list from another project.","solutions":["Read the comma-separated unknown ids from the error and fix each one against manifests/install-modules.json.","Regenerate or re-derive the id list from the current catalog (npm run catalog:sync output or the manifest itself).","Remove entries for modules that were deleted in the current ECC version.","If multiple ids share the same root cause (rename), apply the mapping for all of them at once.","Re-run the validation entry point to confirm."],"exampleFix":"// before\nvalidateInstallModuleIds(['tdd-workflo', 'security-reveiw'])\n\n// after\nvalidateInstallModuleIds(['tdd-workflow', 'security-review'])","handlingStrategy":"validation","validationCode":"const manifests = loadInstallManifests();\nconst unknown = ids.filter(id => !manifests.modulesById.has(id));\nif (unknown.length >= 2) {\n  throw new Error(`Multiple unknown module ids: ${unknown.join(', ')}`);\n}","typeGuard":"function allModuleIdsKnown(ids, manifests) {\n  return Array.isArray(ids) &&\n    ids.length > 0 &&\n    ids.every(id => typeof id === 'string' && manifests.modulesById.has(id));\n}","tryCatchPattern":"try {\n  validateInstallModuleIds(ids);\n} catch (err) {\n  if (err.message.startsWith('Unknown install modules: ')) {\n    const unknown = err.message.slice('Unknown install modules: '.length).split(', ');\n    console.error('Unknown ids:', unknown);\n    process.exitCode = 1;\n  } else throw err;\n}","preventionTips":["When bulk-editing profiles, re-derive all ids from the current catalog rather than editing strings.","Run npm run catalog:sync after any module rename to keep consumers aligned.","Validate the entire profile id list in CI before it reaches consumers.","Keep a rename mapping file for mass migrations."],"tags":["config","not-found","install-manifests","validation"],"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"}