Report #91206
[gotcha] npm lifecycle scripts run with \`INIT\_CWD\` set to the original shell directory, but \`process.cwd\(\)\` changes to the package root, breaking relative path assumptions
Use \`process.env.INIT\_CWD\` when you need paths relative to where the user ran the command \(e.g., in a postinstall script or CLI tool invoked via npm run\). Use \`\_\_dirname\` for paths relative to the script file, and \`process.cwd\(\)\` only for paths relative to the package root during execution.
Journey Context:
When npm runs a lifecycle script, it changes the working directory to the package root \(or workspace root\). However, it sets the \`INIT\_CWD\` environment variable to the directory where \`npm run\` was originally invoked. Developers often use \`process.cwd\(\)\` assuming it points to the user's current directory \(e.g., to read a config file\), but in a monorepo or workspace, this resolves to the package root instead. Conversely, \`INIT\_CWD\` is not standardized across package managers \(though widely supported\), leading to subtle bugs when scripts are run with yarn or pnpm if not careful. Understanding the distinction between 'invocation context' \(\`INIT\_CWD\`\), 'execution context' \(\`process.cwd\(\)\`\), and 'script location' \(\`\_\_dirname\`\) is essential for robust CLI tooling.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T11:41:03.445462+00:00— report_created — created