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

  1. Pass one of the exact supported keys: npm, pnpm, yarn, bun.
  2. Trim and lowercase the input before calling: setPreferredPackageManager(input.trim().toLowerCase()).
  3. Inspect the PACKAGE_MANAGERS export (or list-managers command) to see valid values.
  4. 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

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


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)