v2.1.0: Faster script runs and echoed commands
This release centers on aube run: scripts now echo their expanded command line the way npm, pnpm, and bun do, and a series of startup and process-handoff optimizations trim overhead off every invocation. It also fixes global virtual store flags being dropped during aube ci.
Added
-
aube runechoes the script command line (#1358 by @jdx) — Before running a script,aubenow prints its expanded command line to stderr prefixed with$, matching npm/pnpm/bun. This makes CI logs self-documenting: a failedaube run buildnow records exactly whatbuildexpanded to. The echoed line is the post-injection command (so a forwarded--inspectshows up),pre/postscripts each get their own line, and parallel recursive runs carry the same<package>:prefix as the rest of their output. Suppress it with--silent/-s/--loglevel silent.$ aube run build $ tsc -p .
Note: this changes default stderr output for every script run — anything parsing aube's stderr will see the new line. Use
--silentto opt out.
Fixed
aube cihonors global virtual store flags (#1355 by @jdx) —--disable-global-virtual-store/--enable-global-virtual-store(including via theclean-installalias) were being dropped by the CI install path and now correctly control whether packages are materialized locally or linked from the global store. The CI hard-disable of dependency builds is unchanged.
Performance
The run hot path saw several improvements. Individual gains are modest but compound on warm invocations, and after them aube run edges out bun run on plain script bodies:
- Exec plain single-command scripts without a shell (#1363 by @jdx) — A script body that is one plain command (e.g.
tsc -p .,vitest run,node build.js) is now resolved and exec'd directly instead of going throughsh -c, eliminating a resident shell process. Anything with operators, expansion, quoting, globs, a customscriptShell/shellEmulator, or--inspectstill uses the shell path, and a resolution miss falls back toshso exit-127 semantics are preserved. - Exec the final script shell on Unix (#1360 by @jdx) — For direct
aubrruns on Unix, aube now replaces its own process with the final script shell (same PID) instead of supervising a child, removing a parent-process wait/exit handoff. Skipped when apostscript still needs to run and for recursive/filtered/embedded runs. - Lightweight startup runtime for
aubrscripts (#1357 by @jdx) — Warm script runs now start on a current-thread Tokio runtime instead of spinning up multi-thread workers; a full parallel install runtime is created lazily only when a stale tree actually needs installing. - Only rewrite node-gyp shims when they change (#1361 by @jdx) — The lazy node-gyp shims were rewritten (temp file + rename + chmod, twice per run) on every invocation. aube now compares content and mode first and leaves matching shims alone — worth ~6% of wall time on a trivial script — while still self-healing shipped shim fixes or a stripped exec bit.
- Reuse manifest and settings contexts (#1359 by @jdx) — Consolidates redundant settings-source loads and a duplicate
package.jsonread on the run path; the manifest used to select Node is now the same value used to select the script.
Full Changelog: v2.0.1...v2.1.0
💚 Sponsor aube
aube is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools including mise. Work on aube is funded by sponsors.
If aube is saving your team install time or CI minutes, please consider sponsoring at jdx.dev. Individual and company sponsorships are what keep the project fast, free, and independent.