Runs package.json scripts more reliably, and without Node and npm overhead.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Runs package.json scripts without Node and npm overhead.

$ time npm run echo test

> @ echo pqr/test
> echo "test"


real    0m0.200s
user    0m0.186s
sys     0m0.017s

$ time pqr echo test

real    0m0.003s
user    0m0.003s
sys     0m0.000s


$ go get

Intended incompatibilities with npm run-script

  • pqr runs only the specified script; npm also runs scripts with pre and post prefixes if they exist. Use [pqr prescript && ]pqr script[ && pqr postscript] for compatibility.

  • pqr uses the nearest package.json it finds along the current path (./package.json, ../package.json, ../../package.json, …). npm uses a prefix consistent across all commands: the nearest directory containing either a package.json or a node_modules after first removing all node_modules components from the end of the current path.

  • pqr adds arguments to the end of script commands with "$@"; npm double-quotes each argument after escaping only double quotes. (For example, npm run-script script -- '\"; yes #' will execute yes.)

  • pqr runs the script with an unmodified environment; npm adds several of its own strings. (See npm run-script env.)

  • pqr requires sh; npm will use %ComSpec% or cmd on Windows.

  • pqr doesn’t include npm’s node-gyp-bin in PATH (because it doesn’t require npm to exist); find the directory with npm run env dirname '$(which node-gyp)' and run PATH=node-gyp-bin:$PATH pqr … for near-compatibility.


  • If package.json doesn’t contain a scripts key, pqr will read any key matching scripts case-insensitively (golang/go#14750).

Running nested scripts with pqr

Create an npm wrapper that delegates to pqr if its first argument is run-script or run, and the original npm otherwise; add it to your PATH before the original npm.