{"record":{"id":"69cef61866603d92","repo":"affaan-m/ECC","slug":"unknown-package-manager-pmname","errorCode":null,"errorMessage":"Unknown package manager: ${pmName}","messagePattern":"Unknown package manager: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"scripts/lib/package-manager.js","lineNumber":246,"sourceCode":"  // NOTE: Previously this called getAvailablePackageManagers() which spawns\n  // child processes (where.exe/which) for each PM. This caused plugin freezes\n  // on Windows (see #162) because session-start hooks run during Bun init,\n  // and the spawned processes exceed Bun's spawn limit.\n  // Steps 1-5 already cover all config-based and file-based detection.\n  // If none matched, npm is the safe default.\n  return {\n    name: 'npm',\n    config: PACKAGE_MANAGERS.npm,\n    source: 'default'\n  };\n}\n\n/**\n * Set user's preferred package manager (global)\n */\nfunction setPreferredPackageManager(pmName) {\n  if (!PACKAGE_MANAGERS[pmName]) {\n    throw new Error(`Unknown package manager: ${pmName}`);\n  }\n\n  const config = loadConfig() || {};\n  config.packageManager = pmName;\n  config.setAt = new Date().toISOString();\n\n  try {\n    saveConfig(config);\n  } catch (err) {\n    throw new Error(`Failed to save package manager preference: ${err.message}`);\n  }\n\n  return config;\n}\n\n/**\n * Set project's preferred package manager\n */","sourceCodeStart":228,"sourceCodeEnd":264,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/scripts/lib/package-manager.js#L228-L264","documentation":"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.","triggerScenarios":"Calling setPreferredPackageManager('npm ') (whitespace), 'NPm' (case), 'pnmp' (typo), or any name not defined in PACKAGE_MANAGERS.","commonSituations":"Typos in CLI arguments or scripts; dynamic values read from env vars or user config that were never validated; case-sensitivity mistakes.","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."],"exampleFix":"// before\nsetPreferredPackageManager(process.env.PM); // 'pnpm ' -> throws\n// after\nconst pm = String(process.env.PM || '').trim().toLowerCase();\nif (['npm','pnpm','yarn','bun'].includes(pm)) setPreferredPackageManager(pm);","handlingStrategy":"validation","validationCode":"const KNOWN = ['npm','pnpm','yarn','bun'];\nif (!KNOWN.includes(String(pmName).trim().toLowerCase())) {\n  throw new Error(`unsupported package manager: ${pmName}`);\n}","typeGuard":"function isKnownPackageManager(pm) {\n  return typeof pm === 'string' && ['npm','pnpm','yarn','bun'].includes(pm);\n}","tryCatchPattern":"try {\n  setPreferredPackageManager(pmName);\n} catch (e) {\n  if (e.message.startsWith('Unknown package manager')) {\n    console.error(`Valid values: npm, pnpm, yarn, bun (got: ${pmName})`);\n  } else throw e;\n}","preventionTips":["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"],"tags":["validation","package-manager","invalid-argument"],"backgroundTag":"invalid-enum-value","analyzedSha":"8321021c54d670126ce3b2969d5deb880b4b0c2a","analyzedAt":"2026-09-16T10:08:13.343Z","contentChangedAt":"2026-09-16T10:08:13.343Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}