affaan-m/ECC · error · Error

Selection excludes every requested install module

Error message

Selection excludes every requested install module

What it means

Thrown by resolveInstallPlan() when requestedModuleIds is non-empty but effectiveRequestedIds — requested minus excluded — is zero. Every module the user asked for was eliminated by an exclude component or a target-default exclusion. This catches the contradiction before producing a useless plan that installs nothing while pretending to honor the request.

Source

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

  const targetPlanningInput = target
    ? {
      repoRoot: manifests.repoRoot,
      projectRoot: validatedProjectRoot || manifests.repoRoot,
      homeDir: validatedHomeDir || os.homedir(),
    }
    : null;
  const targetAdapter = target ? getInstallTargetAdapter(target) : null;

  const effectiveRequestedIds = dedupeStrings(
    requestedModuleIds.filter(moduleId => !excludedModuleOwners.has(moduleId))
  );

  if (requestedModuleIds.length === 0) {
    throw new Error('No install profile, module IDs, or included component IDs were provided');
  }

  if (effectiveRequestedIds.length === 0) {
    throw new Error('Selection excludes every requested install module');
  }

  const selectedIds = new Set();
  const skippedTargetIds = new Set();
  const excludedIds = new Set([
    ...excludedModuleIds,
    ...targetDefaultExclusions.map(exclusion => exclusion.moduleId),
  ]);
  const visitingIds = new Set();
  const resolvedIds = new Set();

  function resolveModule(moduleId, dependencyOf, rootRequesterId) {
    const module = manifests.modulesById.get(moduleId);
    if (!module) {
      throw new Error(`Unknown install module: ${moduleId}`);
    }

    if (excludedModuleOwners.has(moduleId)) {

View on GitHub (pinned to 01e15490f0)

Solutions

  1. Reduce the exclude list so at least one requested module survives.
  2. Review targetDefaultExclusions in the returned plan to understand target-driven opt-outs.
  3. If you genuinely want nothing, do not call resolveInstallPlan at all.
  4. Use module-level (not component-level) excludes if you want finer control.

Example fix

// before
resolveInstallPlan({ target: 'claude', profileId: 'baseline', excludeComponentIds: ['lang:rust'] });
// after (drop the over-broad exclude)
resolveInstallPlan({ target: 'claude', profileId: 'baseline' });
Defensive patterns

Strategy: validation

Validate before calling

const requested = new Set([
  ...(options.moduleIds || []),
  ...(options.includeComponentIds || []),
]);
const excluded = new Set(options.excludeComponentIds || []);
const contradiction = [...requested].filter(id => excluded.has(id));
if (contradiction.length > 0 && requested.size === contradiction.length) {
  throw new Error('Every requested component is also excluded');
}
resolveInstallPlan(options);

Prevention

When it happens

Trigger: Passing includeComponentIds: ['lang:rust'] and excludeComponentIds: ['lang:rust'] simultaneously; or excluding every module that a profile pulls in. Target-default exclusions (e.g. OpenCode's intentional opt-outs) can also remove all requested modules.

Common situations: A wrapper script computes excludes from the same source as includes; a user manually excludes a baseline component while keeping the baseline profile; the OpenCode default exclusion list intersects the entire requested set.

Related errors


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