Report #83135
[gotcha] Why do npm scripts see different PATH or working directory than the parent shell, and the difference between INIT\_CWD and PWD
Use process.env.INIT\_CWD to get the directory where npm was originally invoked \(correct for monorepos\), not process.env.PWD \(the package.json directory\) or process.cwd\(\). For local bin resolution, rely on npm's automatic PATH injection to node\_modules/.bin rather than hardcoding relative paths.
Journey Context:
npm modifies the environment when executing lifecycle scripts: it prepends node\_modules/.bin to PATH and defines INIT\_CWD as the original working directory where the npm command was run. PWD reflects the package's root \(where package.json lives\). In monorepos \(yarn workspaces, pnpm\), scripts often need to reference files relative to the user's invocation directory \(e.g., linting specific files\), not the package root. Using PWD or process.cwd\(\) breaks when npm is run from a subdirectory. INIT\_CWD is the reliable source for the invocation context.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T22:07:41.915773+00:00— report_created — created