Added
- Unified package-manager resolution chain.
runner runnow follows a
documented 8-step precedence — qualified syntax →--pm/--runner
→RUNNER_PM/RUNNER_RUNNER→runner.toml→package.json
(packageManagerthendevEngines.packageManager) → lockfile →
PATHprobe → terminal error — making toolchain selection
predictable across Corepack, antfu/ni, mise, and pnpm v11+
conventions. Newsrc/resolver/module owns the chain end-to-end. --pm/--runnerglobal flags withRUNNER_PM/RUNNER_RUNNER
env-var mirrors. Cross-ecosystem overrides like--pm cargoagainst
a Node project fall through to detection rather than hijacking
dispatch. CLI wins over env; empty env strings are treated as unset.runner.tomlproject config ([pm],[task_runner],
[resolution],[sources.*]). Per-ecosystem PM overrides apply
only when the named PM matches the requested ecosystem;
[resolution].fallbackcontrols the no-signal behavior.devEngines.packageManagerparsing frompackage.json(OpenJS
proposal, npm 10.9+). Single-object and array forms supported with
per-entryonFail(ignore/warn/error).downloadcollapses to
warnsince runner is not an installer. The legacypackageManager
field still wins when both are present; manifest declarations win
over lockfile signals (Corepack semantics) and emit apackage.json
warning when they disagree.- Semver enforcement on
devEngines.version. When the declared range
doesn't match the installed PM's--version,onFail=warnemits a
warning andonFail=errorbails. Unparseable ranges or missing
--versionoutput skip the check silently so a partially-broken
environment never blocks dispatch. --fallbackpolicy (probedefault |npmlegacy |error) with
RUNNER_FALLBACKenv mirror. The default replaces the silentnpm
fallback with a canonical-order PATH probe (bun > pnpm > yarn > npm); when nothing matches, the user sees an actionable error
listing every source that was checked.--explainflag (RUNNER_EXPLAINenv). Emits a one-line trace
describing which chain step produced the PM decision:· runner resolved: pnpm via package.json "packageManager".runner doctorsubcommand. Dumps every signal the resolver
considers: detected PMs/runners, override sources in effect (with
origin attribution), manifest declarations, lockfile presence,
PATH probe results for each Node PM, the final decision, and any
warnings.--jsonemits schema-versioned output for jq/scripts/bug
reports.runner why <task>subcommand. Walks the source-selection chain for
a single task: lists every candidate source with its(priority, depth, display_order, alias)tuple, names the winner, and renders
the PM resolution trace when apackage.jsonscript is picked.
--jsonavailable.- Passthrough-wrapper detection generalized to every supported task
runner. Apackage.jsonscript like"build": "just build"is now
recognized as a thin wrapper aroundjustand deduped from
completion candidates when the underlying runner exposes a same-
named task. Recognized runners: turbo, just, make, task (go-task),
nx, bacon, mise. Ecosystemenum (Node/Deno/Python/Rust/Go/Ruby/Php)
formalizing the PM-to-ecosystem mapping used by override scoping.
Changed
Task.passthrough_to_turbo: boolreplaced byTask.passthrough_to: Option<TaskRunner>so wrappers around any runner — not just turbo —
can be attributed at detection time and used by completion.cmd::run::runsignature now takes a&ResolutionOverridesso the
resolver-chosen PM also flows through the no-task fallback paths
(bun testspecial case,npx-style exec).--pm npmagainst a
Bun-detected project now correctly suppresses the bun-test fallback.- Task selection unified into a single sort key
(source_priority, source_depth, display_order, alias_last). Replaces the Deno-only
depth path with a generic tiebreak that applies to every source.
Every non-workspace-aware source now walks ancestors upward when
computingsource_depthso the tiebreak actually distinguishes
nested Makefile/Justfile/Taskfile/bacon.toml configs from
workspace-root ones. Resolver::resolve_node_pmreturnsResult<ResolvedPm>so manifest
onFail=errorand--fallback errorcan bubble up structured
errors instead of bailing inside the resolver.
Fixed
package.jsonpackageManager: "deno@…"projects no longer require
adeno.jsonalongside to be recognized as a Deno project.- Stale doc comment on
detect::push_package_json_tasksupdated to
reflect that passthrough detection covers every known runner, not
just turbo.
What's Changed
Full Changelog: v0.8.1...v0.9.0