Report #104530
[gotcha] npm lifecycle scripts operate in a modified environment where npm\_config\_\* variables are set and PATH includes node\_modules/.bin, but user shell config files are not sourced
Do not rely on user-specific shell aliases, PATH modifications, or environment variables that are not explicitly set in the package.json script or .npmrc. Use \`npx\` for local binaries, and access npm\_config\_\* variables via \`process.env.npm\_config\_\*\` in Node.js scripts. For cross-platform scripts, use tools like \`shx\` or \`cross-env\`.
Journey Context:
When npm runs a lifecycle script \(e.g., \`preinstall\`, \`postinstall\`, \`start\`\), it does not source the user's login shell \(e.g., .bashrc, .zshrc\). It also adds the directory \`node\_modules/.bin\` to the front of PATH, and sets environment variables like \`npm\_package\_name\`, \`npm\_package\_version\`, and \`npm\_config\_\*\` \(from npm config, .npmrc, or CLI flags\). A common footgun is a script that depends on an alias defined in the user's shell – it will fail in CI or on other machines. Another is mistakenly reading \`npm\_config\_\*\` variables that conflict with other software \(e.g., \`npm\_config\_cache\`\). The fix is to write scripts that are self-contained and use \`npx\` to run locally installed binaries. For conditional behavior, use \`process.env\` in a Node.js script rather than shell conditionals.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-08-30T20:11:26.883943+00:00— report_created — created