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
- 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.
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
- At the CLI boundary, require at least one selection flag or a target.
- For 'install with defaults', pass target only.
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
- Selection excludes every requested install module
- At least one guided harness must be selected
- ${harness.label} is an advanced harness and is not guided-re
- Target '${target}' is supported, but the bare-language insta
- Unknown install target: ${target}. Expected one of ${SUPPORT
AI-assisted analysis of affaan-m/ECC@01e15490f0 (2026-08-13).
Data as JSON: /api/errors/a1570b032c4934e4.
Report an issue: GitHub.