affaan-m/ECC · error
Unknown package manager
Error message
Unknown package manager: ${pmName} What it means
setPreferredPackageManager validates the given package manager name against the known PACKAGE_MANAGERS table and throws when the name is not recognized. It is the global-preference setter (invoked via setGlobal), so only valid manager keys (npm, pnpm, yarn, bun) are accepted.
Solutions
- Pass one of the exact supported keys: npm, pnpm, yarn, bun.
- Trim and lowercase the input before calling: setPreferredPackageManager(input.trim().toLowerCase()).
- Inspect the PACKAGE_MANAGERS export (or list-managers command) to see valid values.
- Add upstream validation (e.g. an allowlist enum) where the value originates.
Example fix
// before setPreferredPackageManager(process.env.PM); // 'pnpm ' -> throws // after const pm = String(process.env.PM || '').trim().toLowerCase(); if (['npm','pnpm','yarn','bun'].includes(pm)) setPreferredPackageManager(pm);
Defensive patterns
Strategy: validation
Validate before calling
const KNOWN = ['npm','pnpm','yarn','bun'];
if (!KNOWN.includes(String(pmName).trim().toLowerCase())) {
throw new Error(`unsupported package manager: ${pmName}`);
} Type guard
function isKnownPackageManager(pm) {
return typeof pm === 'string' && ['npm','pnpm','yarn','bun'].includes(pm);
} Try / catch
try {
setPreferredPackageManager(pmName);
} catch (e) {
if (e.message.startsWith('Unknown package manager')) {
console.error(`Valid values: npm, pnpm, yarn, bun (got: ${pmName})`);
} else throw e;
} Prevention
- Normalize (trim + lowercase) manager names from any external source
- Validate against an allowlist enum at input boundaries
- Consult PACKAGE_MANAGERS for the authoritative key list
- Never pass raw env/CLI strings straight into the setter
When it happens
Trigger: Calling setPreferredPackageManager('npm ') (whitespace), 'NPm' (case), 'pnmp' (typo), or any name not defined in PACKAGE_MANAGERS.
Common situations: Typos in CLI arguments or scripts; dynamic values read from env vars or user config that were never validated; case-sensitivity mistakes.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- Binary name contains unsafe characters
- Binary name must be a non-empty string
- INVALID_HOOK_MODE
- INVALID_SCOPE
- Script name contains unsafe characters
AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16).
Data as JSON: /api/errors/69cef61866603d92.
Report an issue: GitHub.
Appendix: source
Thrown at scripts/lib/package-manager.js:246
// NOTE: Previously this called getAvailablePackageManagers() which spawns
// child processes (where.exe/which) for each PM. This caused plugin freezes
// on Windows (see #162) because session-start hooks run during Bun init,
// and the spawned processes exceed Bun's spawn limit.
// Steps 1-5 already cover all config-based and file-based detection.
// If none matched, npm is the safe default.
return {
name: 'npm',
config: PACKAGE_MANAGERS.npm,
source: 'default'
};
}
/**
* Set user's preferred package manager (global)
*/
function setPreferredPackageManager(pmName) {
if (!PACKAGE_MANAGERS[pmName]) {
throw new Error(`Unknown package manager: ${pmName}`);
}
const config = loadConfig() || {};
config.packageManager = pmName;
config.setAt = new Date().toISOString();
try {
saveConfig(config);
} catch (err) {
throw new Error(`Failed to save package manager preference: ${err.message}`);
}
return config;
}
/**
* Set project's preferred package manager
*/View on GitHub (pinned to 8321021c54)