v0.13.0
Added
runner doctor(andinfo --json) now classify PATH-probe hits that
are Volta shims and resolve them to the real provisioned binary via
volta which: thePATH probeline shows
npm=<shim> -> <real bin> (volta), or
(volta shim, not provisioned)when Volta fronts a tool it has no
version of. JSON gains an additivesignals.node.volta_shimsmap
(omitted on hosts without Volta; no schema bump). Display only —
execution still spawns the shim, which performs Volta's per-project
version selection.
Changed
runner installnow honors the--pm/RUNNER_PMoverride: when set,
only that package manager installs (previously the override was
ignored and every detected PM installed — e.g. a project with both
bun.lockanddeno.jsonalways randeno installtoo, writing an
unwanteddeno.lock). An override naming a PM that detection did not
find refuses the install with exit code 2. runner.toml
[pm].node/[pm].pythoncontinue to scope script dispatch only.- Invalid
--pm/RUNNER_PM/--runner/RUNNER_RUNNERvalues now produce
a readable error: the message names the source that carried the value,
escapes control characters (no more raw ANSI codes), truncates long
garbage, and — when the value contains line breaks — hints that it
looks like captured command output with the correctly quoted PowerShell
spelling. (An unquoted$env:RUNNER_PM=denoexecutes deno and assigns
its REPL banner to the variable.)
Fixed
runner doctorno longer dies when aRUNNER_*override variable
holds an unparseable value — the condition it exists to diagnose. The
invalid value is ignored for the report and surfaced as anenv:
warning (human output and thewarningsarray ofdoctor --json,
additively — no schema bump). Every other command, and an explicit bad
--pm/--runnerflag even on doctor, still fails fast.- Node version constraints are now evaluated with real range semantics
(via thesemvercrate) instead of a prefix match that treated
>=22.22.2as=22.22.2. Operators (>=,>,<=,<,=),
caret/tilde ranges, space-separated AND comparators,||unions,
hyphen ranges, andxwildcards all match per node-semver rules, so
engines.node: ">=22.22.2"no longer warns on Node 22.22.3 or 25.9.0.
Bare versions (.nvmrc20.11) keep the stricter
prefix-at-segment-boundary behavior; unevaluable inputs (lts/*) fall
back to the previous prefix match. - Task dispatch now prepends every existing
node_modules/.binbetween
the project directory and the filesystem root (nearest first) to the
child'sPATH, the waynpm run/pnpm run/bun rundo for
package.jsonscripts. Tools that runner spawns directly —turbo
forturbo.jsontasks, and the bare-binary exec fallback — used to
inherit the shell'sPATHunchanged, so a devDependency-onlyturbo
failed withError: No such file or directory (os error 2)unless it
was also installed globally. On Windows, bare program names are
additionally re-resolved against those bin dirs withPATHEXT, since
CreateProcessWwould never find the.cmdshims npm and pnpm
install there. Local bins now shadow global installs for the spawned
task and everything it launches, matching Node package-manager
semantics. - The no-argument project-info banner no longer leaks the Windows
.exe
suffix in its title line (e.g.run.exe 0.12.2). It now shows the same
run/runneridentity as--version,--help, and theUsage:
line. The banner had its own copy of the arg0-parsing helper that
skipped the.exestripping done everywhere else; it now reuses the
canonicalbin_name_from_arg0. runner mannow works on Windows under--features manbuilds. The
subcommand was gatednot(windows), so withexternal_subcommandin
play it silently degraded to task dispatch (bun man→ "Script not
found") instead of rendering. Rendering is pureclap_mangenwith no
OS-specific code, so the gate bought nothing and is gone.install.shruns under any POSIXsh. It carried a#!/usr/bin/env bashshebang, butcurl … | shignores the shebang, so the bash-only
set -o pipefailaborted on line 2 under dash/busybox — the default
/bin/shon the-musltargets. Rewritten POSIX-clean. It also picks
the install dir more intelligently now: reuse an already-installed
runner's directory (verified by its-Vbanner, so a systemrun/
runneris never clobbered), otherwise prefer~/binor
~/.local/binalready onPATH(then one that exists), falling back
to~/.local/bin.
What's Changed
- fix(info): strip Windows .exe suffix from project-info banner title by @kjanat in #44
- fix(run): put project-local node_modules/.bin dirs on the task's PATH by @kjanat in #47
- Version range semantics, PM-override install, self-diagnosing errors, doctor resilience, Volta shims by @kjanat in #45
Full Changelog: v0.12.2...v0.13.0