Skip to content

v2.1.0: Faster script runs and echoed commands

Choose a tag to compare

@jdx jdx released this 23 Aug 22:33
· 80 commits to main since this release
Immutable release. Only release title and notes can be modified.
b337f6a

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 run echoes the script command line (#1358 by @jdx) — Before running a script, aube now prints its expanded command line to stderr prefixed with $, matching npm/pnpm/bun. This makes CI logs self-documenting: a failed aube run build now records exactly what build expanded to. The echoed line is the post-injection command (so a forwarded --inspect shows up), pre/post scripts 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 --silent to opt out.

Fixed

  • aube ci honors global virtual store flags (#1355 by @jdx) — --disable-global-virtual-store / --enable-global-virtual-store (including via the clean-install alias) 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 through sh -c, eliminating a resident shell process. Anything with operators, expansion, quoting, globs, a custom scriptShell/shellEmulator, or --inspect still uses the shell path, and a resolution miss falls back to sh so exit-127 semantics are preserved.
  • Exec the final script shell on Unix (#1360 by @jdx) — For direct aubr runs 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 a post script still needs to run and for recursive/filtered/embedded runs.
  • Lightweight startup runtime for aubr scripts (#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.json read 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.