{"record":{"id":"a1570b032c4934e4","repo":"affaan-m/ECC","slug":"no-install-profile-module-ids-or-included-compon","errorCode":null,"errorMessage":"No install profile, module IDs, or included component IDs were provided","messagePattern":"No install profile, module IDs, or included component IDs were provided","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/lib/install-manifests.js","lineNumber":593,"sourceCode":"  }\n\n  const validatedProjectRoot = readOptionalStringOption(options, 'projectRoot');\n  const validatedHomeDir = readOptionalStringOption(options, 'homeDir');\n  const targetPlanningInput = target\n    ? {\n      repoRoot: manifests.repoRoot,\n      projectRoot: validatedProjectRoot || manifests.repoRoot,\n      homeDir: validatedHomeDir || os.homedir(),\n    }\n    : null;\n  const targetAdapter = target ? getInstallTargetAdapter(target) : null;\n\n  const effectiveRequestedIds = dedupeStrings(\n    requestedModuleIds.filter(moduleId => !excludedModuleOwners.has(moduleId))\n  );\n\n  if (requestedModuleIds.length === 0) {\n    throw new Error('No install profile, module IDs, or included component IDs were provided');\n  }\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) {","sourceCodeStart":575,"sourceCodeEnd":611,"githubUrl":"https://github.com/affaan-m/ECC/blob/01e15490f04e29cfefe3896951f43db46994d8ee/scripts/lib/install-manifests.js#L575-L611","documentation":"Thrown by resolveInstallPlan() when requestedModuleIds is empty AFTER attempting to pull from profileId, options.moduleIds, and options.includeComponentIds. The library refuses to produce an empty plan because nothing would be installed. It also fires when no target-default profile applied (e.g. an unknown target with no explicit selections).","triggerScenarios":"Calling resolveInstallPlan({}) with no profileId, no moduleIds, no includeComponentIds, and a target that has no entry in TARGET_DEFAULT_PROFILE_IDS. Also when target is null AND no selections are passed.","commonSituations":"A wrapper script forwards an empty selection object on a 'dry run'; a user invokes the installer expecting defaults but the target's default profile was renamed; profileId resolved to undefined due to upstream logic.","solutions":["Pass at least one of profileId, moduleIds, or includeComponentIds.","For default behavior, pass only target (e.g. 'claude') so the target-default profile applies.","Call listInstallProfiles() to see available profile ids for this checkout.","Validate the selection object shape: if all three fields are empty, surface a usage error."],"exampleFix":"// before\nconst plan = resolveInstallPlan({ target: 'opencode' }); // no default profile\n// after\nconst plan = resolveInstallPlan({ target: 'opencode', profileId: 'baseline' });","handlingStrategy":"validation","validationCode":"const hasSelection = options.profileId\n  || (options.moduleIds && options.moduleIds.length > 0)\n  || (options.includeComponentIds && options.includeComponentIds.length > 0);\nif (!hasSelection && !options.target) {\n  throw new Error('Pass target, profileId, moduleIds, or includeComponentIds');\n}\nresolveInstallPlan(options);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["At the CLI boundary, require at least one selection flag or a target.","For 'install with defaults', pass target only."],"tags":["install","validation","selection","empty-state"],"backgroundTag":null,"analyzedSha":"01e15490f04e29cfefe3896951f43db46994d8ee","analyzedAt":"2026-08-13T00:31:08.655Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}