affaan-m/ECC · error · Error

No install profile, module IDs, or included component IDs we

Error message

No install profile, module IDs, or included component IDs were provided

What it means

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).

Source

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

  }

  const validatedProjectRoot = readOptionalStringOption(options, 'projectRoot');
  const validatedHomeDir = readOptionalStringOption(options, 'homeDir');
  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) {

View on GitHub (pinned to 01e15490f0)

Solutions

  1. Pass at least one of profileId, moduleIds, or includeComponentIds.
  2. For default behavior, pass only target (e.g. 'claude') so the target-default profile applies.
  3. Call listInstallProfiles() to see available profile ids for this checkout.
  4. Validate the selection object shape: if all three fields are empty, surface a usage error.

Example fix

// before
const plan = resolveInstallPlan({ target: 'opencode' }); // no default profile
// after
const plan = resolveInstallPlan({ target: 'opencode', profileId: 'baseline' });
Defensive patterns

Strategy: validation

Validate before calling

const hasSelection = options.profileId
  || (options.moduleIds && options.moduleIds.length > 0)
  || (options.includeComponentIds && options.includeComponentIds.length > 0);
if (!hasSelection && !options.target) {
  throw new Error('Pass target, profileId, moduleIds, or includeComponentIds');
}
resolveInstallPlan(options);

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


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