{"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":null,"httpStatus":null,"severity":"error","filePath":"scripts/lib/install-manifests.js","lineNumber":618,"sourceCode":"\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      env: resolveInvocationEnvironment(options),\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":600,"sourceCodeEnd":636,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/scripts/lib/install-manifests.js#L600-L636","documentation":"resolveInstallPlan requires a non-empty source of modules to install: after collecting profile modules, explicit module IDs, and included component IDs, if nothing was requested it throws. An install plan must be based on at least one of these three inputs.","triggerScenarios":"Calling resolveInstallPlan() with no profileId, no includeModuleIds, and no includeComponentIds (all empty after dedupe/normalization).","commonSituations":"Invoking the plan CLI without any of --profile/--include/--module flags, a config file that lost its profile key, or programmatic callers passing all-empty options.","solutions":["Pass a valid profileId (e.g. 'standard')","Or supply explicit module IDs via the modules option","Or include at least one component ID via includeComponentIds","Add a default profile in your CLI wrapper when the user omits flags"],"exampleFix":"// before\nresolveInstallPlan({ target: 'claude-code' })\n// after\nresolveInstallPlan({ target: 'claude-code', profileId: 'standard' })","handlingStrategy":"validation","validationCode":"const hasSource = options.profileId\n  || (options.includeModuleIds?.length ?? 0) > 0\n  || (options.includeComponentIds?.length ?? 0) > 0;\nif (!hasSource) throw new Error('provide --profile, modules, or include components');","typeGuard":"function hasInstallSource(o) {\n  return Boolean(o.profileId)\n    || (Array.isArray(o.includeModuleIds) && o.includeModuleIds.length > 0)\n    || (Array.isArray(o.includeComponentIds) && o.includeComponentIds.length > 0);\n}","tryCatchPattern":"try {\n  const plan = resolveInstallPlan(options);\n} catch (err) {\n  if (err.message.startsWith('No install profile, module IDs,')) {\n    console.error('Specify a profile (--profile standard) or at least one module/component.'); process.exitCode = 2;\n  } else throw err;\n}","preventionTips":["Make your CLI require at least one of --profile/--include/--module","Default to a standard profile when no selection flags are given","Document the three selection sources in usage text"],"tags":["validation","cli","empty-input"],"backgroundTag":"missing-required-option","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"}