Populars: Dades actualitzades el 26 d’octubre del 2026

Categories

Internet1.355
Comunicació321
Àudio i vídeo898
Gràfics i disseny539
Ofimàtica i productivitat1.120
Eines per a desenvolupadors3.132
Eines d’IA527
Seguretat i privadesa385
Eines del sistema3.113
Jocs523
Educació i ciència239
Xarxa i TI284

aube: baixar versions anteriors

A fast Node.js package manager

Aquí hi ha 49 versions d’aube, des de 17 de maig del 2026 fins a l’actual, 2.8.3. Cadascuna enllaça amb els instal·ladors del mateix desenvolupador.

2026: 49 49 26
VersióDataMidaFitxers
2.8.3Darrera versió 25 d’octubre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
Fixed
- NPM_CONFIG_GLOBALCONFIG is now read (#1818, @jdx): before this fix, if the internal registry was set only through NPM_CONFIG_GLOBALCONFIG, with no ~/.npmrc or NPM_CONFIG_USERCONFIG, aube ignored it and fetched packages from registry.npmjs.org. aube now reads the file that NPM_CONFIG_GLOBALCONFIG or npm_config_globalconfig points to, including registry, scoped registry and auth token settings.
- As in npm, the global file has the lowest precedence. Project .npmrc overrides user config, and user config overrides the global file. npm_config_* environment variables override all of them.
- If both casings are set, the upper-case variable wins. A leading ~ in the path is expanded.
- aube reads the global file only when one of these variables is set. It does not look in npm's default $PREFIX/etc/npmrc location.
# file pointed to by $NPM_CONFIG_GLOBALCONFIG
registry=<your internal registry URL>
//<your registry host>/:_authToken=...
2.8.2 23 d’octubre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
v2.8.2 brings aube's rewrites of Yarn Classic, npm and pnpm lockfiles closer to each tool's own output. It also stops large tarball downloads from failing after 5 minutes while data is still arriving, and fixes several install and resolution differences from pnpm.
Fixed

Lockfiles
- Yarn Classic yarn.lock (#1802): re-resolving no longer rewrites every entry. aube now keeps resolved URLs, including the #sha1 fragment, and quotes keys only where Yarn does. Block headers list only the ranges that consumers declare, and blocks are sorted the way Yarn sorts them. As a result, bumping one dependency changes only that package's entries:
-"accepts@1.3.8", "accepts@~1.3.8":
+accepts@~1.3.8:
version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
- npm package-lock.json (#1814): aube add and other rewrites leave unchanged entries byte-identical to npm's output.
- Keys are now sorted the way npm sorts them, so "dev": true no longer moves.
- funding values are kept exactly as written, including type and arrays with more than one URL.
- New entries still record funding only as {"url": …}.
- pnpm 11 peer suffixes (#1805): when a dependency needs a peer resolved from higher in the tree, the parent package's snapshot key now includes that peer even if the parent declares its own peers, as pnpm 11 does. For example, aube now writes @ai-sdk/react@4.0.138(react@19.3.1)(zod@4.6.7). The peer is also listed under transitivePeerDependencies:. Snapshot keys for affected packages change once on the next resolve; frozen installs read existing lockfiles unchanged.
- catalog: dependencies with ranged overrides (#1816): an override with a version range, such as "is-odd@^3": "catalog:", no longer applies to a dependency declared as catalog:. This matches pnpm. The importer keeps specifier: 'catalog:', so pnpm install --frozen-lockfile no longer fails with ERR_PNPM_OUTDATED_LOCKFILE. Catalog entries that are referenced only by an override value are no longer written to catalogs:. Lockfiles that older aube versions wrote for this setup are reported as outdated until the next aube install rewrites them.

Install and resolution
- Slow tarball downloads (#1804): a large tarball on a slow connection no longer fails with operation timed out after fetchTimeout (default 5 minutes) while data is still arriving. For tarballs, fetchTimeout is now the longest time a download can go without receiving data; a stalled download still fails and is retried. Registry metadata requests still use fetchTimeout as a limit on the whole response.
- Colliding npm aliases in frozen installs (#1812, @chrismatix): aube install --frozen-lockfile could install the wrong package when an npm alias shared a name and version with an ordinary package or another alias. For example, compiler: npm:@test/compiler@1.0.0 in one workspace member and compiler: 1.0.0 in another. Each member now gets the correct package and its binaries.
- Hidden hoisting (#1815): when a package has several versions in the graph, node_modules/.aube/node_modules now gets the version closest to an importer, as with pnpm. Ties are broken by dependency path. In the default layout, the root project's direct dependencies are no longer hidden-hoisted because Node already finds them in the root node_modules/. Previously, an undeclared import from a package could resolve to a different version than under pnpm. In one reported case, Vite+ bundled the wrong rolldown version.
- supportedArchitectures platform lists (#1813): pnpm-workspace.yaml can now use pnpm 12.5's list form, which previously failed with invalid type: sequence:
supportedArchitectures:
- darwin-arm64
- linux-x64-manylinux_2_28
Entries can be <os>-<cpu>[-<libc>], Rust target triples or current. aube merges the OS, CPU and libc values from all entries, so it can allow a few more combinations than pnpm. For example, darwin-arm64 plus linux-x64 also allows darwin-x64.
- aube outdated / aube update
2.8.1 20 d’octubre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
v2.8.1 brings aube-written pnpm-lock.yaml files closer to pnpm 11's output and fixes lockfile round-trips for npm and Yarn Berry. It also fixes minimumReleaseAge in update/dedupe, install --force, workspace detection for nested projects, and handling of an empty CI variable.
Fixed

Lockfiles
- pnpm 11 parity (#1792, #1793, #1788): when a tool such as Dependabot regenerates the lockfile with pnpm, it should rewrite fewer lines that did not change.
- Peer suffixes are now sorted by the full name@version string, e.g. (react-dom@18.2.0(react@18.2.0))(react@18.2.0).
- With dedupePeerDependents on (the default), aube resolves an optional peer from any matching version in the graph and lists it under optionalDependencies:. Compatible variants of a package are merged across importers.
- catalogs: no longer lists entries that an override replaces.
- npm package-lock.json:
- aube add now keeps "optional": true (for example on @esbuild/* platform packages) and "hasInstallScript": true. Previously, dropping these made npm fail with Unsupported platform (#1775).
- Root file: directory dependencies now keep their link and target entries, so npm ci no longer reports Missing: … from lock file (#1799).
- file: peers on re-resolve (#1775): aube add no longer fails with ERR_AUBE_BLOCKED_EXOTIC_SUBDEP when a direct file: dependency satisfies another package's peer.
- Yarn Berry yarn.lock (#1798):
- Changes to package.json are now detected even when some dependencies are unchanged. Previously aube could print "Lockfile is up to date" and leave yarn.lock stale. This also applies to Yarn Classic.
- Rewritten lockfiles now keep the __metadata version and cacheKey, the root workspace entry, bin: maps and builtin<compat/…> patch blocks, and use Yarn's formatting. As a result, yarn install --immutable accepts them.
- Not yet round-tripped: conditions:, dependenciesMeta: and non-root workspace blocks.

Install and resolution
- minimumReleaseAge on npmjs.org (#1791): aube update and aube dedupe could install versions that minimumReleaseAge should have blocked, including with minimumReleaseAgeStrict: true. Both commands now fetch the publish times they need to apply the cutoff.
- npm's --min-release-age (#1770): when aube receives npm-style install arguments, it now converts --min-release-age <days> and --min-release-age=<days> to aube's minimumReleaseAge, which is set in minutes. Arguments after -- are left as they are.
- aube install --force (#1789): now rebuilds every linked package. Files deleted from node_modules are restored instead of the command printing "Already up to date". With the global virtual store, each shared entry is rebuilt in a staging directory and swapped into place.
- Nested non-member projects (#1787): running aube install in a subdirectory that is not a workspace member now installs that subdirectory alone. This applies, for example, below an aube-workspace.yaml or pnpm-workspace.yaml that contains only settings. Previously aube installed the ancestor root. --ignore-workspace now works too and is listed in the CLI help.
- Empty CI variable (#1786): CI= no longer turns on CI mode (frozen lockfile by default, global virtual store disabled). CI=0 and CI=false still count as CI.
- TLS root certificates (#1797): updated rustls-webpki and webpki-root-certs to versions that drop the compromised eMudhra intermediate CA certificates.

Changed
- Homebrew tap (#1771, #1772): releases now go to the Aube-maintained tap, installed with brew install aubepkg/tap/aube. brew install aube installs the Homebrew core formula. The legacy jdx/tap/aube formula remains available during the transition.

Lockfile changes on upgrade
After upgrading, the next resolve rewrites some lines in existing aube-written pnpm-lock.yaml files: peer suffixes are reordered and newly resolved optional peers are added. Lockfiles are read as they are, so --frozen-lockfile installs of older lockfiles keep working.

💚 Sponsor aube
aube is built and maintained by @jdx, an open 
2.8.0 19 d’octubre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This release has no user-facing changes in its commit range.
💚 Sponsor aube
aube is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If aube saves your team install time or CI minutes, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep aube fast, free, and independent.
2.7.2 17 d’octubre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This release has no user-facing changes in its commit range.
💚 Sponsor aube
aube is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If aube saves your team install time or CI minutes, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep aube fast, free, and independent.
2.7.0 7 d’octubre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This release has no user-facing changes in its commit range.
💚 Sponsor aube
aube is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If aube saves your team install time or CI minutes, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep aube fast, free, and independent.
2.6.1 29 de setembre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
The commit range for this release has no user-facing changes.
💚 Sponsor aube
aube is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If aube saves your team install time or CI minutes, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep aube fast, free, and independent.
2.6.0 28 de setembre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
There are no user-facing changes in the commit range for this release.
💚 Sponsor aube
aube is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If aube saves your team install time or CI minutes, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep aube fast, free, and independent.
2.5.1 27 de setembre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
Repeated fresh installs skip redundant OSV lookups, and the Linux release binaries start a little faster.
Changed
- Faster repeated fresh installs (#1631 by @jdx): When the OSV Bloom filter flags a package that turns out to have no malicious advisory, aube used to confirm it with a live OSV query on every install. That added about 220–250 ms each time. aube now caches a clean result for 30 seconds. A cached result is reused only when both the exact package/version pairs and the validated Bloom filter match. On a warmed Svelte fixture, installing with node_modules and aube-lock.yaml removed went from a 346 ms median to 107 ms.
- Failed OSV queries, failed Bloom filter refreshes and confirmed malicious hits are never cached.
- Explicit add/update/dlx checks, advisoryCheck = required and advisoryCheckEveryInstall = true still query OSV live every time.
- Tradeoff: if a malicious-package advisory is published for a version that was just cleared, a repeated ordinary install may take up to 30 seconds to catch it.
- About 0.6 ms faster startup on Linux (#1625 by @jdx): The Linux GNU release binaries (x86_64 and aarch64) for aube, aubr and aubx are now linked as non-PIE. The loader no longer has to patch about 56k pointers at each launch, so aube --version drops from about 2.2 ms to 1.6 ms.
- Tradeoff: ASLR no longer randomizes aube's own code and data. The heap, stack and shared libraries are still randomized.
- musl, macOS and Windows builds are unchanged, as are cargo install, source builds and the PPA/COPR packages.

💚 Sponsor aube
aube is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If aube saves your team install time or CI minutes, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep aube fast, free, and independent.
2.5.0 27 de setembre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
aube update --interactive now lets you pick, for each package, whether to keep the current version, move to the newest version its range allows, or jump to latest. Repeated frozen installs and fresh installs without a lockfile are also faster, and a reinstall that failed after you deleted the cache and lockfile now works.
Added
- Per-package version choice in aube update --interactive (#1612 by @jdx): The picker used to be one checkbox per dependency, with the target set by flags. It is now a table, like Yarn Berry's upgrade-interactive. Each row shows the current version, the newest version the range allows, and the registry's latest. Use ↑/↓ to move between rows and ←/→ to choose a version. Rows left on Current are skipped, and / filters by name. Closes #1611.
$ aube update -i
Choose which dependencies to update
Current Range Latest
> chalk [•] ^4.1.2 [ ] ^6.0.0
is-number [•] ^6.0.0 [ ] ^7.0.0
ms [ ] 2.0.0 [•] 2.1.3
semver [ ] 7.5.0 [•] 7.8.5
↑/↓/k/j up/down • ←/→/h/l choose • / filter • enter confirm
- Rows start on Range, or on Latest with --latest. Pressing Enter right away does the same thing as the non-interactive command.
- Updates keep the manifest's range operator. Exact pins are now listed: each one is offered the newest release its caret range would allow, and it stays an exact pin after the update. -E still forces exact pins.
- --no-save hides Latest and pin bumps, because both would rewrite package.json.
- Latest is offered only when it is newer than the installed version, so the picker never offers a downgrade.
- With update -r -i, the version you choose for a shared catalog entry is used for later workspace packages without asking again.
- Rows no longer show the dependency section (dependencies / devDependencies).

Changed
- Faster repeated frozen installs (#1615 by @jdx): Standalone projects can now reuse the installed state when nothing has changed. This applies to projects with registry dependencies and no declared patches, installed with an explicit --frozen-lockfile and lifecycle scripts disabled (for example aube install --frozen-lockfile --offline --ignore-scripts). On the benchmark fixture, a no-op install went from about 82 ms to about 7 ms. The freshness check hashes the lockfile and manifest contents, so a change is caught even when file size and modification time stay the same. A missing dependency link also counts as a change. Workspaces, patches, local sources, enabled scripts, custom lockfile locations and active per-install advisory policies still go through full validation.
- Faster advisory checks on fresh installs (#1616 by @jdx): A fresh install without a lockfile used to query OSV for every resolved public-npm package. Under the default advisoryCheck: on, graphs with more than 10 distinct package/version pairs are now screened with the advisory Bloom filter first, and only probable hits are checked against the live API. On the benchmark fixtures this cut fresh install time by 36–67%.
- Full live checks are still used for smaller graphs, for explicit aube add / aube update, for transient aube dlx installs, and with advisoryCheck: required or advisoryCheckEveryInstall: true.
- If the filter can't be refreshed or validated, every package is checked live.
- The filter cache refreshes every 15 minutes, so a newly published advisory may take up to that long to be caught.

Fixed
- "missing package index" after deleting the cache and lockfile (#1613 by @jdx): A reinstall could fail with this error if you had deleted aube's cache/store and the root lockfile but kept node_modules. Now an existing package directory is reused only when its dependency subtree matches the previous install and the directory still exists. Anything else is looked up in the store again, or downloaded again, before linking.

💚 Sponsor aube
aube is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If aube saves your team install time or CI minutes, please consider
2.4.0 25 de setembre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
aube install can now rebuild a deleted lockfile from a hidden copy kept in node_modules, so it doesn't re-resolve from the registry. This release also makes cold installs on Linux faster and lighter on memory, and fixes lifecycle scripts on Windows and a workspace aube update that could drop members from the lockfile.
Added
- Hidden lockfile in node_modules (#1594 by @jdx): Every install now writes a copy of the resolved graph to node_modules/.aube-lock.yaml. If the project has no lockfile of any supported kind, aube install starts from that copy, as pnpm does with its current lockfile. If the manifests haven't changed, the graph is reused with no resolve. If they have changed, only the specs that changed are resolved again, and the other packages keep their locked versions. aube-lock.yaml is then written again.
$ aube install # writes aube-lock.yaml + node_modules/.aube-lock.yaml
$ rm aube-lock.yaml
$ aube install # seeds from node_modules/.aube-lock.yaml, no registry resolve
- --frozen-lockfile and aube ci still fail when there is no lockfile.
- --no-frozen-lockfile ignores the hidden copy.
- In auto-CI mode (CI=true with no explicit flags), an install that seeds from the hidden copy is treated as prefer-frozen.
- If the hidden copy is broken, aube shows WARN_AUBE_HIDDEN_LOCKFILE_BROKEN and resolves normally.
- The hidden copy is not used with lockfile=false, which also deletes any existing copy, or with sharedWorkspaceLockfile=false. It is also skipped for reuse installs from npm, yarn or bun lockfiles.

Changed
- Faster, lighter cold installs on Linux (#1598, #1603, #1604, #1605 by @jdx):
- On Linux, the blocking thread pool now defaults to 8 threads instead of 128. On the benchmark fixture this cut peak memory from about 1.5 GB to about 400 MB and reduced kernel CPU time. AUBE_TOKIO_BLOCKING still overrides the default, and macOS and Windows keep 128.
- Small tarballs (up to 1 MiB) are downloaded in full before their store import begins, so an import no longer ties up a thread while it waits on the network. Memory for these buffered downloads is capped at 64 MiB in total.
- Installs with the global virtual store no longer read back dependency links they just wrote.

Fixed
- Windows lifecycle scripts failing with EISDIR: illegal operation on a directory, lstat 'C:' (#1591 by @jdx): This affected scripts that start node through a .bin shim (for example node-gyp-build) during aube add, remove, update, dedupe and ci, and during installs from embedding hosts such as mise's npm: backend. The install root and the Node-API embedding's project directory no longer carry the \\?\ verbatim prefix. Fixes #1590.
- aube update at a workspace root dropping workspace members from aube-lock.yaml (#1579 by @jdx): With a shared lockfile, running aube update or aube update -w at the root could delete every workspace member's entry in aube-lock.yaml. Member entries, their packages, patch hashes and catalog snapshots are now kept, and only the root's direct dependencies are updated. aube install also treats a workspace member that declares dependencies but has no entry in the lockfile as stale, so installing again repairs lockfiles already damaged by this bug.

💚 Sponsor aube
aube is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If aube saves your team install time or CI minutes, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep aube fast, free, and independent.
2.3.0 22 de setembre del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
Embedding hosts such as mise can now bind installed Node CLIs to a specific Node executable, and a batch of fixes covers hoisted-install bin linking, aube-lock.yaml patch hashes, ignoreScripts resolution, signal delivery in dlx --shell-mode, and terminal state after failed or interrupted installs.
Added
- Bind installed CLIs to a host-managed Node runtime (#1576 by @jdx) — Installed Node CLIs previously found their interpreter through the caller's PATH, so a tool manager could not give an application its own runtime without also changing which Node its project subprocesses see. EmbedderRuntime::bind_bins_to generates launchers that invoke the supplied absolute Node executable directly while leaving the inherited PATH unchanged; it works with both embedded install and add:
let mut options = aube::embed::InstallOptions::new("/tools/my-cli");
options.runtime = Some(
aube::embed::EmbedderRuntime::selector("/runtimes/node/25/bin")
.bind_bins_to("/runtimes/node/25/bin/node"),
);
aube::embed::install(options).await?;
The path is kept as written (symlinks are not canonicalized), so a moving major-version path like mise's installs/node/25/bin/node works; a missing runtime fails rather than falling back to ambient Node. Changing or removing the binding regenerates launchers on the next install, including frozen ones. Bound installs always materialize locally and disable the global virtual store so runtime-specific launchers stay out of shared trees. Simple Node shebang flags are preserved; quoted shebang arguments and environment assignments are rejected. Standalone aube's runtime selection is unchanged — this is the launcher support a host needs to implement its own policy (see jdx/mise#13477).

Fixed
- Hoisted installs link transitive dependency bins (#1548 by @jdx) — With --node-linker=hoisted, only importers' direct dependencies were linked into node_modules/.bin, so packages whose lifecycle scripts call a binary from their own dependencies failed with errors like sh: node-pre-gyp: command not found (bcrypt, prebuild-install, napi-postinstall; see discussion #1543). Hoisted installs now follow npm's rule: each package's bins are linked into the .bin/ of the node_modules/ it sits in, and a dependency's lifecycle script sees its own nested .bin first so a version conflict no longer silently runs the hoisted winner. An importer's own bin and its direct dependencies always take precedence over transitive packages on a name collision. Isolated installs are unaffected.
- aube rebuild relinks the full bin surface (#1550 by @jdx) — rebuild only relinked per-dependency shims, so a command added or retargeted in package.json#bin after install stayed missing or stale until the next aube install. rebuild now uses the same bin-linking entry point as install (importer bins, workspace member bins, then dependency bins). If a workspace member manifest is unreadable, it warns and reconciles the root importer instead of aborting. aube rebuild --filter <member> is not covered by this change.
- ignoreScripts is honored from env, .npmrc, and aube-workspace.yaml (#1552 by @jdx, fixes #1551) — Only the --ignore-scripts flag reached the installer; AUBE_IGNORE_SCRIPTS, npm_config_ignore_scripts, ignore-scripts=true in .npmrc, and ignoreScripts: true in the workspace yaml were parsed and then discarded, so aube config get ignore-scripts printed true while the next install ran scripts anyway. All sources now apply across install, ci, add, remove, update (including its pnpm:devPreinstall hook), dlx, deploy, and the auto-install aube run performs on a stale tree — which previously had no way to skip scripts at all. An explicit flag still wins over a lower-precedence false. pack, publish, and version keep their own --ignore-scripts flags.
- aube-lock.yaml keeps patch hashes on re-resolve (#1577 by @jdx) — In a project with patchedDependencies, running aube add dropped the (patch_hash=…) suffix from patched entries in aube-lock.yaml, producing a spurious lockfile
2.2.4 31 d’agost del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small but impactful release: aube now treats versions recorded in your lockfile as already-accepted trust decisions, eliminating a costly per-package metadata re-fetch on frozen and repeat installs. In benchmarking this cut a cold install with a frozen lockfile by roughly 62% (from ~7.1s to ~2.7s), with lockfile trust resolution dropping from ~5.7s to ~15ms.
Fixed
- Trust locked packages without revalidation (#1418 by @jdx) — With trustPolicy=no-downgrade (the default), aube previously re-fetched publishing trust evidence for every package name in the lockfile on each install, which dominated cold-install time. Now no-downgrade is enforced only when a version is newly resolved; versions already present in the active lockfile are trusted without re-fetching their evidence. Integrity checks and the rest of the install-time security pipeline are unchanged, and paranoid still forces the full pipeline.

Behavior Notes
- Trust downgrade detection for a locked version no longer re-runs on every reuse — it applies when the version is first resolved. A fresh resolve (e.g. a new or changed dependency) still enforces no-downgrade as before. See the updated security docs for details on the lockfile trust boundary.

💚 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.
2.2.0 25 d’agost del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small release that gives standalone aube a bundled package-extensions compatibility catalog and exposes its node-gyp bootstrap through the public embedding facade.
Added
- Embeddable node-gyp bootstrap (#1365 by @jdx) — aube's locked, in-process node-gyp bootstrap is now available through the stable embedding facade and returns the resolved executable path. This lets embedders (e.g. mise) service aube's lazy shim command without an ambient npm or a separately installed aube binary, while aube keeps ownership of the node-gyp version, cache layout, npmrc propagation, and cross-process locking. Standalone aube's hidden __node-gyp-bootstrap command now routes through the same API, and binary lookup uses is_file() across platform names so Windows .exe/.cmd caches resolve correctly.

Fixed
- Bundled curated package extensions (#1369 by @jdx) — Standalone aube now ships a bundled compatibility catalog (~161 curated rules from Yarn's @yarnpkg/extensions@2.0.7 plus pnpm's Rust CLI additions) that repairs missing or incompatible peer/optional dependencies across common ecosystems (Angular, Nuxt, React, Vue, Gatsby, GraphQL, Webpack, Parcel, and more). The phantom rules removed upstream by pnpm are excluded. These defaults are applied at the lowest precedence — user and project packageExtensions always win — and are kept out of packageExtensionsChecksum, so catalog updates never invalidate existing lockfiles or break --frozen-lockfile. Set ignoreCompatibilityDb=true to opt out of the bundled repairs; malformed bundled entries are skipped with a WARN_AUBE_INVALID_BUNDLED_PACKAGE_EXTENSION warning rather than failing the install.

💚 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.
2.1.0 23 d’agost del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
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.

💚 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.
2.0.1 23 d’agost del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This is the first release of the aube 2.x line. It moves global installs out of pnpm-owned directories and into aube's own data root, promotes lowest-direct to a first-class resolver mode, and slashes install-time memory usage for packages with large, multi-platform optional dependency graphs. Because of the global directory change, upgrading requires action for anyone who relies on aube add -g — see Breaking Changes.
Highlights
- Global installs now live under aube's own data root instead of pnpm's directories, with warnings to guide the one-time migration (#1231).
- Up to 77% less peak memory on installs with large optional platform graphs thanks to compact optional-package histories and streaming large tar entries into the store (#1315, #1318).
- lowest-direct becomes a first-class resolution mode on the public resolver API (#1345).

Added
- lowest-direct resolution mode (#1345 by @jdx) — pnpm's lowest-direct mode (resolve direct dependencies to the lowest compatible version) is now exposed directly through the public resolver API as ResolutionMode::LowestDirect, and CLI settings route through the enum. ResolutionMode is now #[non_exhaustive]. See Breaking Changes for the embedder-facing API change.
- Structured prune previews for aube store prune (#1321 by @jdx) — aube store prune --dry-run --json now emits a machine-readable schema-v1 plan: mutation roots, planned actions, per-subsystem (GVS/CAS) counts, reclaimable-byte upper bounds, and structured warnings. The same plan drives human previews, JSON previews, and real deletes, so what you preview is what gets pruned. Store writers are serialized against prune via a store-wide maintenance lock, and dry runs no longer migrate legacy indexes or initialize the project registry.
aube store prune --dry-run --json
- EngineContext runtime embedder seam (#1326 by @jdalton) — A process-global EngineContext complements the compile-time Embedder profile, letting embedders supply per-invocation runtime values. The first wired seam lets an embedder provide bundled ecosystem packageExtensions defaults, applied as the lowest-precedence layer at resolve time (user/project extensions always win). Bundled extensions are kept out of the packageExtensionsChecksum, so bumping the bundled list never drifts existing lockfiles or breaks --frozen-lockfile. Every field defaults to upstream-neutral behavior, so standalone aube is unaffected.

Fixed
- Compact exact optional package histories (#1315 by @jdx) — With time-aware resolution (minimumReleaseAge, trust no-downgrade), exact optional platform packages previously retained every historical version's full dependency and distribution metadata. Aube now decodes each exact optional dependency from a single packument response, keeping full metadata only for the selected version and just publish-time/trust evidence for the rest. Lockfile platform coverage and trust semantics are unchanged. For opencode-ai@1.18.18, retained platform version records dropped from 136,110 to 11,890, cutting median peak RSS by ~47% and wall time by ~20% versus the previous release. The bundled node-gyp toolchain is now also bootstrapped lazily (only when a lifecycle script actually invokes it) instead of before every approved lifecycle.
- Stream large tar entries into the store (#1318 by @jdx) — Large regular tar entries (≥8 MiB, when store compression is off) now stream into a content-addressed store tempfile while being hashed, then publish atomically, instead of being buffered fully into memory with read_to_end. Combined with the resolver change above, this brings the total peak-memory reduction on the opencode-ai benchmark to ~77% (and ~24% faster wall time) versus the previous release. store prune also cleans up orphaned streaming tempfiles left by crashes.
- Preserve applied builds after cache cleanup (#1339 by @jdx) — Clearing the reusable side-effects cache no longer forces dependency build scripts (e.g. native node-gyp rebuilds) to rerun for packages whose build 
1.41.0 16 d’agost del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This release adds a cache path command and pnpm-style catalog pruning, makes aube remove avoid unnecessary resolution and network requests, validates packageExtensions up front, and fixes several install/linker correctness issues around hoisted workspaces and global-virtual-store links.
Added
- aube cache path command (#1302 by @jdx) — Prints the resolved metadata/policy cache root so CI jobs have one stable path to cache packuments, runtime metadata, and lockfile policy-verification records. It honors cacheDir/cache-dir overrides and platform defaults, and resolves the cache relative to the workspace/project root (so nested workspace packages share one root). Mirrors the command added in pnpm 11.22.
aube cache path
- catalogPrune setting (#1308 by @jdx) — Adds pnpm 11.22's catalogPrune as the canonical setting for pruning unused workspace catalog entries after install. The previous cleanupUnusedCatalogs name is retained as a deprecated alias; when both are set, catalogPrune wins. Configurable via env, .npmrc, workspace YAML, and settings.toml.

Fixed
- Validate packageExtensions before resolution (#1304 by @jdx) — Malformed packageExtensions (non-object shapes, non-string dependency ranges like a null version, invalid peerDependenciesMeta) were previously dropped silently, quietly changing the effective policy. They now fail early with a stable ERR_AUBE_INVALID_PACKAGE_EXTENSION diagnostic that names the offending field path, applied consistently across install, update, remove, dedupe, and audit. aube remove validates before writing package.json so a bad policy can't leave the manifest and lockfile inconsistent.
- Repair stale nested global-virtual-store links (#1299 by @jdx) — Warm installs and GVS cache hits could leave nested node_modules links inside shared global-virtual-store packages pointing at an outdated dependency identity even after the lockfile graph moved on. The linker now reconciles nested links in cached GVS entries (fixing stale, missing, or wrongly-targeted links), and the warm fast path is invalidated when shared topology drifts. Fixes #1298.
- Keep hoisted workspace installs warm (#1295 by @jdx) — In hoisted workspaces where a member's direct dependency is satisfied from the root node_modules, install state previously always recorded a member-local path that is intentionally empty, so every freshness check treated a valid layout as stale and reinstalled the whole tree (and re-triggered "Auto-installing" on repeated aube run). Install state now records the actual ancestor-visible placement for hoisted direct dependencies. Fixes #1292.
- SBOM output reflects the current host (#1309 by @jdx) — Default aube sbom output now filters out platform-incompatible optional packages using effective supportedArchitectures and ignoredOptionalDependencies, and aligns optional-edge traversal with pnpm/Yarn Berry semantics. A new --lockfile-only flag retains the complete platform-independent lockfile graph in the CycloneDX/SPDX output.
- lowest-direct resolution is now distinct from time-based (#1307, #1311 by @jdx) — resolution-mode=lowest-direct now picks the oldest satisfying version for direct dependencies (with transitives still on the newest satisfying version) without computing a publish-time cutoff or writing a time: block into the lockfile, instead of being folded into time-based mode. The public aube_resolver::ResolutionMode enum stays stable for embedders — the behavior is driven through additive builder state rather than a new enum variant.
- Embedded install memory diagnostics (#1303 by @jdx) — Embedded hosts such as mise now honor the same AUBE_DIAG_* env surface as the CLI, initializing and flushing diagnostics at operation boundaries. Adds OOM-safe per-event flushing (AUBE_DIAG_FLUSH=1), periodic current/peak RSS samples (AUBE_DIAG_KERNEL=1), and richer resolver/extraction metrics to help distinguish resolver retention from extraction spikes. Install behavior is unchanged. Supports #1301.

Changed
- Faster 
1.40.0 13 d’agost del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small release whose only user-facing change lets embedding hosts capture lifecycle script output as tagged install events.
Added
- Report lifecycle script output as install events (#1284 by @jdx) — When an install runs in event output mode, lifecycle script stdout and stderr are now piped and forwarded line-by-line as tagged InstallEvent::Output events (code AUBE_LIFECYCLE_SCRIPT_OUTPUT) instead of being written directly to the shared terminal. This lets embedding hosts such as mise render lifecycle logs through their own progress UI without corrupting it. The standalone Aube CLI and non-event installs are unchanged and keep inheriting stdio.

💚 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.
1.39.0 12 d’agost del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This release adds a configurable default lockfile format, lets store prune reclaim stale global-virtual-store entries, tightens devEngines version enforcement, and lets embedders drop the comment-preserving workspace-YAML dependency chain.
Added
- Configurable default lockfile format (#1271 by @jdx) — New defaultLockfileFormat setting ("aube" or "pnpm", default "aube") chooses which lockfile to create when no supported lockfile is present on disk. Existing lockfiles remain authoritative, so the setting never converts a lockfile or writes a duplicate alongside one that already exists. This makes the aube clean --lockfile → reinstall workflow reliably regenerate pnpm-lock.yaml for projects that need pnpm compatibility. Configurable via workspace config, settings.toml, .npmrc, and env, and applied consistently across install and the add/remove/update/dedupe/audit write paths. Addresses #1264.
# settings.toml
defaultLockfileFormat = "pnpm"
- Optional workspace YAML preservation for embedders (#1278 by @jdx) — Comment- and format-preserving pnpm-workspace.yaml edits are now gated behind a default-on workspace-yaml-preserve feature. The standalone Aube CLI is unchanged, but embedders (e.g. mise) can disable the feature to drop the yamlpatch/yamlpath/tree-sitter dependency chain — which required Rust 1.97+ — falling back to a canonical full-document rewrite.

Fixed
- Prune unused global virtual store entries (#1273 by @jdx) — aube store prune previously only walked the content-addressable store, leaving hashed graph directories under <cacheDir>/virtual-store behind even after their projects were deleted. Installs that use the global virtual store now register the project (including warm/fast-path installs after upgrading), and prune uses that registry to keep entries still linked from live projects while removing unreachable ones before continuing with normal content-store cleanup. Installs and pruning coordinate via shared/exclusive locks, registry-managed entries live under a versioned virtual-store/v1/ namespace so older releases' entries are untouched, and registry failures fail closed with ERR_AUBE_GVS_PRUNE_FAILED. --dry-run covers the new phase. Addresses #1268.
- Enforce devEngines aube version errors (#1269 by @jdx) — An explicit devEngines.packageManager.onFail: "error" now correctly rejects the invoking aube when its version does not satisfy the declared aube version, instead of silently re-execing to an already-installed match. The same self-version policy is now enforced for aube --version (which previously returned before self-version handling), and aube --version --workspace-root works outside a workspace. devEngines.packageManager entries naming pnpm or other package managers keep their existing compatibility behavior. Fixes #1263.

💚 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.
1.38.1 10 d’agost del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small patch release with three targeted fixes to aube update --no-save, POSIX shim resolution, and cold-store filtered installs.
Fixed
- Keep --no-save resolutions inside the existing range (#1247 by @jdx) — aube update --latest --no-save no longer treats --latest as permission to bump the manifest or catalog specifier. It now refreshes the lockfile to the newest version allowed by the retained range (for both direct and shared catalog entries) instead of recording a latest that the specifier itself excludes — which could otherwise make a subsequent frozen install reject the lockfile.
- Resolve symlinks in POSIX shims (#1249 by @jdx) — Generated POSIX .bin shims now follow their invocation path through absolute and relative symlink chains (up to 40 hops, guarding against cycles) before computing basedir. Launching a tool via a symlink on PATH previously pointed basedir at the external symlink directory rather than the real node_modules/.bin, breaking the shim's relative target. The shim marker is bumped to aube-bin-shim v2 so older shims are still parsed correctly on uninstall.
- Filter cold per-project materialization (#1253 by @jdx) — Filtered installs (--production, --filter, workspace scoping) now apply dependency-section and workspace selection before pipelined materialization. Previously a cold store streamed the full lockfile graph into node_modules/.aube, leaving unrelated package cells on disk even though the importer symlinks were correct (warm installs looked fine because cached packages aren't re-streamed). The on-disk lockfile and full-graph validation still use the unfiltered graph. Fixes #1250.

💚 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.
1.38.0 7 d’agost del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
Added
- (embed) add per-install storage overrides (#1239)
- (store) add --dry-run to store prune (#1228)
- (sbom) include package license metadata (#1208)

Fixed
- (linker) share hoisted deps across workspace importers (#1243)
- (install) canonicalize isolated dependency build paths (#1238)
- (store) fail closed on incomplete index scans (#1237)
- (install) route deprecation warnings through embedder output (#1236)
- (unlink) keep GVS-backed deps out of bare unlink (#1230)
- (global) unlink global bins when the shared virtual store is on (#1232)
- (deps) update rust crate clap_usage to v5 (#1229)
- (deploy) preserve workspace dependency patches (#1213)
- (runtime) preserve workspace bins through nested shims (#1207)

Other
- refresh benchmarks for v1.37.0 (#1211)
- (link) global link registry lives in the cache dir, not $AUBE_HOME (#1205)
- refresh benchmarks for v1.37.0 (#1206)
1.37.0 31 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This release makes minimumReleaseAge visible in outdated/update reports instead of silently hiding upgrades, gives embedding hosts precise control over how runtime binaries sit on PATH, and fixes several rough edges in add, patch, licenses, and shim resolution.
Added
- Built-in pnpm trusted-dependency list for lifecycle scripts (#1199 by @jdx) — Built-in lifecycle-script approvals now come from a pinned, validated snapshot of pnpm's maintained trusted-dependencies list (e.g. esbuild, sharp), embedded at build time so installs stay offline and reproducible. Project and workspace allowBuilds settings are merged, and explicit denials always win over built-in or configured approvals.
- Leave PATH unchanged for embedder runtimes (#1189 by @jdx) — A new EmbedderRuntime::without_path() builder lets embedding hosts supply the Node program and npm exec path (NODE, npm_node_execpath) without deriving or prepending a PATH entry, so bare node commands resolve as inherited. path_dir(...) and without_path() follow last-call-wins builder semantics.

Fixed
- Surface upgrades hidden by minimumReleaseAge (#1193, #1192 by @jdx) — aube outdated, aube update, and the interactive picker now apply the same release-age policy as install resolution, so they no longer offer versions that selecting wouldn't install. When newer releases are still quarantined, a single aggregated WARN_AUBE_MINIMUM_RELEASE_AGE_BLOCKED_UPDATE explains what's hidden and why (e.g. updates hidden by minimumReleaseAge: is-odd@3.0.1). aube up --latest now selects the newest mature version instead of admitting a quarantined dist-tag, aliased dependencies are handled correctly, and full timestamped packuments are fetched when abbreviated metadata lacks publish times. Fixes the behavior reported in #1191.
- Trust exact popular package names in aube add (#1198 by @jdx) — The similar-name supply-chain gate now stops once a requested name exactly matches the top-100k popularity corpus, so aube add esbuild and aube add @types/node no longer require --allow-low-downloads just because lower-ranked lookalikes (msbuild, @types/code) exist. Typo detection for names not in the corpus is unchanged.
- Preserve existing patches and refresh their hashes (#1196 by @jdx) — patch-commit now reuses a dependency's existing patchedDependencies path and appends new hunks so the result still applies to pristine package contents, instead of orphaning the original patch behind a freshly generated file. Lockfile freshness checks now SHA-256 declared patch files against the hashes recorded in pnpm-lock.yaml, re-resolving on normal installs and failing frozen installs with ERR_AUBE_LOCKFILE_CONFIG_MISMATCH. Addresses discussions #1195 and #1197.
- Resolve licenses from hoisted installs (#1183 by @jdx) — aube licenses no longer assumes an isolated virtual store. It now prefers the recorded install layout, reconstructs hoisted placements from the lockfile graph, and reads each package.json from its on-disk hoisted path, fixing hoisted installs (including --node-linker=hoisted) where every dependency reported UNKNOWN. Fixes #1182.
- Keep wrapper node first on PATH (#1188 by @jdx) — Wrapper embedder runtimes were being silently bypassed when a dependency or project exposed a node_modules/.bin/node, defeating host-supplied instrumentation, transpilation, or sandboxing. Wrapper shims are now prepended ahead of project-local bins, while selector runtimes keep the existing .bin-first precedence, with the same ordering applied across lifecycle scripts, run, and shell-mode exec/dlx. Addresses Discussion #1083.
- Keep activated shims available in scripts (#1187 by @jdx) — After aube activate, package scripts run via aube run can again resolve pnpm, npm, and yarn through the activated shim directory, which was previously stripped by aube's own startup PATH sanitization. aube's process PATH stays sanitized so internal runtime probes don't recurse through shims. Fixes discussion #1186.

💚 Sponsor aube
aube is maintained 
1.36.0 29 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This release brings aube in line with several pnpm 11.18 features — publishConfig.name and the pnpm:devPreinstall hook — while stabilizing recursive workspace updates, tightening outdated reporting, and hardening terminal output against Unicode spoofing.
Added
- publishConfig.name support (#1176 by @jdx) — Matching pnpm 11.18, a workspace package can now publish under a different registry name via publishConfig.name without renaming the project. The published name drives registry existence checks, the PUT URL, tarball filename, and embedded manifest, while the on-disk name stays the workspace/lockfile identity. Single-package publishes now run pre-publish hooks first, then re-resolve the target so hooks that change the name or version are honored.
{
"name": "my-workspace-pkg",
"publishConfig": { "name": "@scope/published-name" }
}
- pnpm:devPreinstall hook (#1177 by @jdx) — The root package's pnpm:devPreinstall script now runs once from the workspace/lockfile root before ordinary preinstall, letting a workspace prepare files that resolution or linking expects. It also runs on chained add/update installs, and is skipped on warm no-op installs, --ignore-scripts, --lockfile-only, and dry runs.
- Preserve existing package.json indentation (#1171 by @howmanysmall) — When aube rewrites manifests, tabs and nonstandard space widths now survive workspace edits, deploy rewrites, patch removal, and shared manifest writes. Read failures other than a missing file now abort the write, so an invalid UTF-8 package.json is never clobbered while aube detects its indentation.

Fixed
- Stabilize recursive workspace updates (#1180 by @jdx) — Recursive update no longer runs a full per-importer install that could wipe unrelated catalog entries from a shared lockfile. Catalog maps are now merged entry-by-entry, the chained install runs once at the workspace root after every importer is updated, interactive catalog decisions are remembered across importers so shared deps are prompted only once, and cancellation now stops the sweep instead of continuing. Closes #1174.
- Exclude auto-installed peers from outdated (#1178 by @jdx) — outdated now only checks dependencies declared directly in each importer's package.json, so auto-installed peers (e.g. esbuild pulled in for vite) no longer show up as outdated. Applies to both single-project and recursive reports. Closes #1173.

Security
- Strip Unicode formatting from terminal output (#1181 by @jdx) — Bidi overrides, isolates, and other Unicode formatting characters (the Cf set) plus control bytes are now stripped from registry- and manifest-derived text at display boundaries in list, outdated, interactive update, human-readable view, and install progress/warnings. This prevents untrusted metadata from visually reordering terminal output. Raw identifiers are preserved internally, and JSON/machine-readable output is unchanged.

New Contributors
- @howmanysmall made their first contribution in #1171

💚 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.
1.35.0 29 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
Added
- (embed) add configurable workspace discovery (#1169)
- (embed) expose package manifest types (#1168)
- (add) block new and lookalike package names (#1157)
- (add) route embedded confirmations through host handlers (#1154)
- (settings) let cacheDir relocate the global virtual store (#1146)
- (trust) add package publishing checks (#1144)

Fixed
- (update) update catalog entries selected for upgrade (#1166)
- (list) accept --lockfile-only (#1161)
- (clean) preserve third-party caches (#1163)
- (config) ignore unsupported allowBuilds npmrc values (#1159)
- (install) preserve platform optionals with supported architectures (#1156)
- (add) trust locked packages without embedded prompts (#1143)
- launch native package bins directly (#1141)

Other
- refresh benchmarks for v1.34.0 (#1124)
1.34.0 27 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This release rounds out shell completion — aubx now completes, and TAB now offers registry packages, project bins, workspace packages, settings, and more — teaches the resolver to never mistake a deprecated republish for an upgrade, and makes activated shims survive aube upgrades.
Added
- Rich, mise-style completions plus aubx support (#1130 by @jdx) — Completions are now generated for the aubx multicall surface alongside aube and aubr, and a set of dynamic completers fills in real values as you type: registry packages (queried against your configured npm registry with scoped-registry auth, a ~1.2s timeout, and a 2 MiB response cap), local dependencies, workspace packages, project bins from node_modules/.bin, settings/aliases, patch keys, and filesystem paths. Typed text is safely quoted before evaluation, and the aubx spec stops at the fetched command so downstream arguments aren't parsed as aube flags.
- effect= metadata for every command (#1122 by @jdx) — All 114 aube commands now declare whether they only inspect state (read), change it (write), or destroy something (destructive), via usage 4's effect=. Registry commands like publish, deprecate, dist-tag, and access are never read and carry blast-radius comments (they affect every consumer of a package), while code-running commands (run, exec, dlx, node, create, …) are deliberately left unclassified since their effect is whatever the executed code does. This lets tooling reason about what a command will do before running it. Requires a usage CLI of 4.0 or newer to consume the generated spec.

Fixed
- Never prefer a deprecated version inside a range (#1136 by @jdx) — A deprecated, mis-tagged republish that sorts above genuine releases (e.g. codemirror@6.65.7, an accidental republish of 5.65.7) could make aube outdated offer a downgrade-in-disguise as an upgrade and cause installs to land on the withdrawn version. Version selection now mirrors pnpm: dist-tags.latest wins when it's in range, otherwise the highest satisfying non-deprecated version, otherwise (as a tiebreak, not a filter) the highest satisfying version so ranges that only reach deprecated versions still resolve. The rule is shared across install/add/update, the vulnerable-version re-pick, and the Wanted column of outdated/update, keeping them in agreement.
- Keep activated shims stable across upgrades (#1129 by @jdx) — On Unix, aube activate previously symlinked each tool shim to the exact executable that created it, so removing a version-managed aube left every activated shim dangling. Activation now writes small dispatcher scripts that resolve the current aube from PATH and route through an internal marker, matching mise's stable-indirection model. Windows behavior is unchanged.
- Replace activated shims atomically (#1131 by @jdx) — Follow-up to #1129: shim updates on Unix now build the replacement in a sibling temp file, apply 0755, and rename it over the live path, closing the window where a concurrent command could see a missing or half-written shim.
- Clear the progress row for no-op installs (#1132 by @jdx) — On a no-op install, the transient TTY progress bar left a durable row alongside Already up to date, producing two completion lines for one result. The progress row is now cleared for no-op installs, while real installs and --lockfile-only runs still keep the finished bar (or CI summary) visible.
- Complete package scripts through aubr (#1128 by @jdx) — aube completion now registers a dedicated aubr surface, so both aube run <TAB> and aubr <TAB> complete the scripts declared in the nearest package.json (with their commands as descriptions). Previously aubr <TAB> was treated as an unknown top-level invocation and offered nothing.

Changed
- Prioritize opencode-ai in the native-build critical path (#1127 by @jdx) — opencode-ai is added to the curated build-heavy allowlist so its tarball is fetched earlier and its build step can overlap with remaining package downloads.

💚 Sponsor aube
aube is maintain
1.33.1 25 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small patch release with two install-path fixes: interactive terminals get their animated progress bar back, and embedders can build native packages again.
Fixed
- Restore the animated progress bar in interactive terminals (#1117 by @jdx) — An AUBE_TTY_PROGRESS gate introduced back in v1.10.0 had quietly routed every interactive terminal to the CI-oriented append-only heartbeat, so installs appeared to jump in ~2s chunks (0% → 83% → 100%) instead of animating. That gate is removed: stderr TTYs now get the smooth in-place bar again, while pipes and CI runners still use the line-oriented heartbeat. --reporter=append-only remains available to force line output on demand.
- Bootstrap node-gyp in-process instead of re-execing aube (#1114 by @jdx) — When aube is embedded as a library (e.g. mise's npm backend), the node-gyp bootstrap shelled out to current_exe, which named the host binary and failed with error: unexpected argument '--ignore-scripts' found. This broke installs of any npm package whose build scripts reach node-gyp (gemini-cli, vercel, wrangler, orval, and others) on a cold cache. The bootstrap now runs in-process under the existing project lock, so native builds work for embedders. Standalone aube behavior is unchanged.

💚 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.
1.33.0 25 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
Added
- (run) complete package.json scripts in shell completions (#1108)
- (embed) let hosts wrap the Node runtime, not just select one (#1086)
- (settings) adopt canonical update and audit sections (#1104)
- (release) support version from-git (#1102)
- (runtime) detect FreeBSD as a supported host platform (#1084)

Fixed
- (run) start script picker in search mode and prevent wrapping (#1109)
- (linker) expose global virtual store to Vite (#1106)
- (linker) apply registry-name patches to npm-aliased installs (#1085)

Other
- refresh benchmarks for v1.32.0 (#1080)

Security
- (login) cap web token responses (#1103)
1.32.0 22 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small release that continues the library-embedding work from v1.30.0/v1.31.0, letting hosts embedding aube::embed::add tell aube which node to run dependency lifecycle scripts on. Standalone aube behavior is unchanged.
Added
- Embedders can supply the node runtime for lifecycle scripts (#1079 by @jdx) — Hosts like mise that manage node as a dependency rather than on the process PATH can now point aube at the right binary. embed::InstallOptions and AddToProjectOptions gain a node_bin_dir: Option<PathBuf>; when set, aube seeds its per-install runtime slot with the host's node (prepending that dir to the script PATH and probing --version so engine checks match) instead of resolving its own runtime or falling back to an ambient node PATH lookup. This restores the behavior the old aube add --global subprocess path had for in-process embedders such as mise's npm: tool support. The runtime slot is a per-install tokio::task_local, so concurrent installs are safe, and leaving node_bin_dir unset (the default for all CLI, CI, deploy, and FFI paths) preserves normal runtime switching.

💚 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.
1.31.0 21 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small release that continues the library-embedding work from v1.30.0, letting install-only hosts like mise depend on the aube crate without pulling in the sigstore publishing stack or a forced DNS resolver. Standalone aube behavior is unchanged.
Added
- The aube crate is now embeddable without the publish/DNS stack (#1069 by @jdx) — Follow-up to #1068, unblocking mise's use of the install path (aube::embed::add) as a library instead of shelling out to the aube binary. Two dependencies an install-only embedder never needs are now opt-out:
- A new publish feature (on by default) gates the sigstore provenance/signing supply chain (sigstore-*, ambient-id, x509-cert, etc.), which is only used by aube publish. The Publish CLI variant and its command modules are compiled out when the feature is off.
- hickory-dns is dropped from aube-registry's defaults (now default = ["rustls"]), so embedders pulling it in transitively no longer have reqwest's DNS resolver silently flipped for the whole binary via feature unification. The aube binary re-enables it through the aube crate's defaults, so standalone builds are unchanged.
- The aube crate gains rustls and hickory-dns features that forward to reqwest / aube-registry / aube-util, so it can be depended on with default-features = false, features = ["rustls"] — producing a build tree with zero sigstore, hickory, ratatui, or mimalloc nodes.

💚 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.
1.30.0 21 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This release fixes a long-standing issue where aube dlx and aube exec could leave the tool they launched running after aube itself was terminated, and lays the groundwork for embedding aube's library crates in other tools like mise.
Fixed
- aube dlx no longer orphans the tool it launches (#1065 by @jdx) — Previously, terminating aube left the spawned tool running, reparented to init (ppid=1), surviving even a catchable SIGTERM — leaking long-running stdio servers and memory on every host teardown (discussion #1059). dlx and exec spawns now route through a process guard that ties the child's lifetime to aube: on any Unix, catchable signals (SIGTERM/SIGINT/SIGHUP/SIGQUIT) are forwarded to the child (so pkill -x aube stops the tool), and on Linux PR_SET_PDEATHSIG additionally reaps the child even on an uncatchable SIGKILL. This matches the teardown behavior of npx, pnpm dlx, and bunx. (macOS SIGKILL-of-aube remains a documented gap.)

Changed
- Standalone aube exec <bin> and aube dlx <local-bin> now replace aube's process image (#1067 by @jdx) — On the standalone Unix binary, these single-tool paths now execvp into the tool instead of spawning it as a supervised child. The tool inherits aube's pid, so any signal — including an uncatchable SIGKILL — reaches it directly with no supervisor process to outlive, closing the macOS SIGKILL gap for these paths. This matches how aube node and mise x already behave. Embedded hosts (aube-ffi/aube-node), Windows, the dlx install path, and recursive aube exec -r continue to use the supervised spawn.
Worth noting: on the standalone binary, aube exec <bin> / aube dlx <local-bin> no longer appears as a parent process — the tool takes over aube's pid.

Added
- Library crates are now embeddable at MSRV 1.91 with backend-agnostic features (#1068 by @jdx) — Groundwork for embedding aube's library crates (starting with aube-registry) into other tools like mise. The workspace MSRV is lowered from 1.93 to 1.91, and TLS/DNS/zlib backend selection (rustls, hickory-dns, zlib-ng) moves from the workspace to leaf crates so embedders no longer inherit those global build side effects. Standalone aube behavior is unchanged via defaults; embedders opt in with default-features = false, features = ["rustls"].

💚 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.
1.29.1 17 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small but security-relevant patch release that closes a minimumReleaseAge bypass in aube add.
Fixed
- aube add now honors minimumReleaseAge when pinning manifest versions (#1056 by @jdx) — Previously the version written into package.json came straight from the packument with no release-age cutoff, so dist-tag adds (including the default aube add pkg) and --save-exact could pin a freshly published version that full resolution would have gated — exactly the version most likely to be a compromised latest in a supply-chain attack. The manifest step now routes through the resolver's pick_version, so gated latest tags are steered to the newest version clearing the cutoff, deliberate exact pins and non-latest tags are still honored (or refused under minimumReleaseAgeStrict=true with ERR_AUBE_NO_MATURE_MATCHING_VERSION), and minimumReleaseAgeExclude exemptions apply consistently. Offline adds skip the gate as before.
Note that this activates the default 24h gate for add picks, which was silently inert for dist-tag and exact adds until now:
$ aube add caniuse-lite # latest published 15h ago
+ caniuse-lite@1.0.30001805 # newest version ≥24h old; before: 1.0.30001806

💚 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.
1.29.0 16 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small maintenance release with no user-facing code changes. The only update refreshes the published benchmark numbers so the README's install-speed claims match the latest measurements.
Changed
- Refreshed benchmarks for v1.28.0 (#1050 by @jdx) — Re-ran the hermetic benchmark matrix against aube 1.28.0 (and deno 2.9.3) and regenerated benchmarks/results.json plus the README BENCH_RATIOS block. Warm-install claims now read ~5× faster than pnpm and ~2× faster than Bun, with the repeat install && test scenario at ~39× vs pnpm.

💚 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.
1.28.0 16 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This release makes aube embeddable in other applications, landing a stable in-process embedding API for both Rust and Node.js/Bun/Electron hosts, and fixes a warm-path bug where changed local file:/portal: directory dependencies weren't reinstalled.
Highlights
- Embed aube in your own apps — Three stacked pieces come together to let you drive installs programmatically: invocation-scoped install controls with structured events and cancellation (#1036), a stable aube::embed Rust facade (#1042), and a production @jdxcode/aube-node Node-API addon (#1025) — all by @jdx.

Added
- @jdxcode/aube-node Node-API addon (#1025 by @jdx) — Run aube installs in-process from Node.js, Bun, Electron, and compiled Bun executables. The addon exposes install/add, dev-dependency saves, structured progress/output events, cooperative cancellation via AbortSignal, offline mode, structured errors (AubeError with stable code and diagnostic), and result statistics. It creates package.json when absent, saves requested versions exactly, honors supported lockfile formats and project registry/auth config, skips lifecycle scripts, and uses aube's install-state fast path. Independent projects install concurrently; operations on the same workspace serialize through its project lock, and cancellation during add restores manifest and lockfile snapshots. Ships the root package plus eight optional platform packages (macOS, Windows, glibc and musl Linux), with signed macOS addons, attested tarballs, and npm trusted publishing.
import { install } from "@jdxcode/aube-node"
const result = await install(projectDirectory, {
add: [
{ name: "react", version: "19.1.0" },
{ name: "typescript", version: "5.9.3", dev: true },
],
offline: false,
signal,
onEvent(event) {
// event.kind: "phase" | "progress" | "output"
},
})
- Stable aube::embed Rust API (#1042 by @jdx) — Native Rust hosts get a supported public contract (initialize, install, add, error_code) without depending on internal aube-util, aube-settings, or CLI command structs. add_to_project holds the workspace project lock across manifest mutation and install, supports offline/network modes, and rolls back package.json and the lockfile on cancellation. Includes docs covering embedding, concurrency, lifecycle policy, and errors.
- Install control hooks (#1036 by @jdx) — New invocation-scoped InstallControl with human (CLI default), structured-event, and silent output modes. A non-blocking InstallReporter delivers phase, progress, and output events, and cooperative cancellation returns the stable ERR_AUBE_INSTALL_CANCELLED diagnostic at safe install boundaries. Concurrent installs stay isolated via Tokio task-local state; standalone aube install behavior is unchanged.

Fixed
- Refresh changed local directory dependencies (#1034 by @jdx) — Editing the contents of a file: directory or portal: dependency could previously hit the Already up to date fast path and leave stale installed output, even when the file size was unchanged. Install freshness now records per-source content and metadata fingerprints (BLAKE3), and the linker re-materializes mutable local entries during the ensuing full install.

💚 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.
1.27.0 14 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A feature release that adds an npm-style aube access command and Git-repository-scoped allowBuilds keys, tightens credential redaction on publish, fixes stale pnpm patch handling after re-resolve, and lays the groundwork for parallel embedded installs by making the explicit-install path fully reentrant.
Added
- aube access (#1012 by @jdx) — Manage registry package permissions from the CLI, modeled on npm and compatible with pnpm's forms. Subcommands cover get status, list packages / list collaborators, ls packages [entity] (pnpm-compatible), set status=public|private, set mfa=none|publish|automation, grant <permission> <team> <package>, and revoke <team> <package>. Requests use scoped-registry auth, honor --otp for MFA-protected mutations, cap response bodies, and produce distinct errors (ERR_AUBE_ACCESS_ENTITY_NOT_FOUND vs. plain 404). Supports --json for scripting alongside the human-readable default.
- Git-repository build approvals (#1010 by @jdx) — allowBuilds rules can now be keyed by a package plus a normalized Git repository URL (for example, native-addon@git+<https repo url>). The commit is intentionally omitted from the key so audited repositories can advance to new SHAs without re-approving each one. Exact per-source approvals and name-only registry approvals still work as before, and deny rules continue to win over allows. Repository rules are applied consistently across lifecycle execution, script jailing, ignored-build reporting, and install graph hashes.
- aube add --dangerously-allow-all-builds (#1016 by @risu729) — The broad build-approval flag was previously only accepted on install, so aube add --global <pkg> --dangerously-allow-all-builds (as used by mise) was rejected at parse time. The flag now works on add, is forwarded through local, filtered, and global add paths into the shared install pipeline, and conflicts explicitly with --deny-build=<pkg>. The override is invocation-scoped — it does not persist dangerouslyAllowAllBuilds=true to project config.

Fixed
- Redact inline registry credentials in publish output (#1009 by @jdx) — When a registry URL embeds credentials in the user:secret@host form, publish no longer echoes them raw. The "already published" error, the OIDC token-exchange failure wrapper, and the --dry-run "would PUT to …" line now pass URLs through aube_util::url::redact_url. Dry-run output is centralized in dry_run_outcome_line, with test coverage confirming scoped package targets redact inline auth while preserving the encoded path.
- Ignore stale pnpm patch entries after re-resolve (#1022 by @jdx, fixes #1019) — On a non-frozen install that had to re-resolve, overlay_metadata_from was copying patchedDependencies from the previous pnpm-lock.yaml, so removed or wrong-version patches were still being applied and written back. Fresh-resolve now replaces graph.patched_dependencies with the workspace's current read_patched_dependencies, and the pnpm 11 hash-only scalar form is no longer misread as a file path. Bats coverage was added for both the pnpm 10 object form and the pnpm 11 hash-only form.

Changed
- Reentrant explicit-directory installs (#1026 by @jdx) — Removes the process-wide project-lock reentrancy flag that could let an install for project B skip its filesystem lock just because project A was already installing in the same process. Commands that chain into install (add, remove, update, filtered add, ci, dedupe) now hold an explicit ProjectLock guard and call install::run_with_project_lock. Dependency-chain diagnostics move from a global mutex to Tokio task-local state and propagate into spawned fetch and lifecycle tasks, so parallel installs no longer clobber each other's transitive error chains. configure_script_settings also only mutates global script config when scripts aren't disabled.
- Per-install runtime and script-settings isolation (#1027 by @jdx) — Building on #1026, Node runtime selection and lifecycle-script settings are now scoped to each explicit install via nested
1.26.0 6 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A feature release that adds two pnpm-compatible commands (aube bugs and aube prefix), fills a workspace-flag gap in aube bin, propagates proxy configuration into lifecycle scripts, and fixes two install-time failure modes around old lockfiles and malformed JSR specs.
Added
- aube bugs (alias issues) (#992 by @jdx) — Resolves the package's bug tracker URL and opens it in the default browser, modeled on pnpm. With no arguments it reads the current project's package.json; with name or name@version it fetches the registry packument (honoring shared NetworkArgs / --registry). URLs come from bugs (string or bugs.url), falling back to repository with normalization for GitHub/GitLab/Bitbucket shorthands, git@ URLs, and an /issues suffix when needed. Only http(s) URLs are opened; set AUBE_NO_OPEN=1 to print without spawning a browser.
- aube prefix / aube prefix -g (#991 by @jdx) — Prints the nearest package root (or cwd), aligned with pnpm. -g prints the global prefix directory, resolved from AUBE_HOME / PNPM_HOME / platform defaults; this stays separate from globalBinDir, so a custom global bin path does not change what prefix -g reports. The command respects -C and is exempt from the package-manager guard like other path-only helpers.
- aube bin -w / --workspace-root (#993 by @jdx) — The long form already worked because the global --workspace-root flag chdirs before dispatch, but bin never registered the pnpm-style -w short. From a workspace sub-package, aube bin -w now walks up via find_workspace_root and prints the root node_modules/.bin. Conflicts with -g/--global at parse time; a no-op (falls through to plain bin) outside a workspace so it's safe in shell aliases.
- Proxy env for lifecycle scripts (#996 by @jdx, closes #983) — Scripts now inherit the same outbound proxy aube uses for registry traffic via standard HTTP_PROXY / HTTPS_PROXY / NO_PROXY, plus NODE_USE_ENV_PROXY=1 so Node 24+ honors the same proxy for built-in fetch/http (which ignore npm_config_proxy). httpProxy falls back to httpsProxy per npm/pnpm behavior. The block is set only when a proxy URL is actually configured — noProxy alone won't stamp env — so direct-connection users don't see Node's experimental proxy warnings.

Fixed
- Recover from lockfiles missing tarball integrity (#995 by @jdx) — Follows up #994: older lockfiles that still contain a resolution.tarball without an accompanying integrity field were failing during parse even though strictStoreIntegrity defaults to false. A new ParseOptions (strict_store_integrity) is threaded through the install path — pre-parse, frozen/dry-run selection, lockfile-only, metadata overlay, --lockfile-dir remapping, and ensure_for_cwd — so non-strict installs read those entries and re-resolve instead of aborting. Library callers and parse_for_import remain strict by default.
- Reject malformed jsr: specs (#990 by @jdx) — jsr_to_npm_name now validates each scope and name component with valid_jsr_name_part: empty parts, ., .., uppercase, spaces, encoded slashes, and anything outside [a-z0-9._-] are rejected before being translated to @jsr/…. aube add jsr:@std/../collections and similar now fail as invalid jsr: spec at parse time; legitimate scoped names like @std/collections are unchanged.

Changed
- Refreshed benchmarks for v1.25.2 (#975 by @jdx) — Regenerated on the hermetic Verdaccio registry (500 Mbit / 50 ms) against aube 1.25.2 and deno 2.9.1. Warm fresh install drops 437ms → 319ms; public README ratios update to ~5× Bun and ~8× pnpm on warm installs, and ~7× Bun / ~39× pnpm on the npm install && npm run test repeat case.
- Sponsor references (#978 by @jdx) — README, aube sponsors, generated CLI docs, and the release-workflow sponsor blurb now list entire.io as title sponsor and point at jdx.dev as the canonical sponsors hub. The docs-site sponsors feed switches to title / premier / partner tier naming.

💚 Sponsor aube
aube is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.de
1.25.2 1 de juliol del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
Other
- refresh benchmarks for v1.25.1 (#962)
- (install) overlap cold-install lockfile write with the link tail (#961)
1.25.1 26 de juny del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A maintenance release that only refreshes the published benchmark numbers against v1.25.0 — no behavior changes ship in the binary.
Changed
- Refreshed benchmarks for v1.25.0 (#947 by @jdx) — benchmarks/results.json and the README BENCH_RATIOS block were regenerated on the hermetic Verdaccio registry (500 Mbit / 50 ms) against aube 1.25.0 and pnpm 11.9.0. Public ratios: warm installs ~1.3× Bun and ~3× pnpm; the npm install && npm run test repeat case is now ~6× Bun and ~39× pnpm.

💚 Sponsor aube
aube is part of jdx.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely 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.
1.25.0 25 de juny del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A new opt-in shell activation flow lets node, npm, pnpm, yarn, and friends route through aube without a prefix, plus resolver and npm-lockfile fixes for parity with pnpm.
Added
- Shell-activated tool shims (#945 by @jdx) — aube activate <bash|zsh|fish> creates (or refreshes) a per-user shim directory, sets AUBE_SHIM_DIR, and prints a shell snippet that prepends it to PATH. The shims dispatch via multicall argv[0] rewrites, mapping node, npm, npx, pnpm, pnpx, yarn, and yarnpkg onto their matching aube subcommands (including npm install → install vs add, bare yarn → install, and PM --version/--help handling). A new aube node [ARGS]… runs the project-resolved Node binary directly. On startup, sanitize_process_path strips the shim directory from PATH so runtime probes and child spawns don't recurse through the shims, and a new ERR_AUBE_SHIM_* family covers shim creation and exec failures. runtime set -g's messaging now points at activation instead of claiming there are no shims.
- Globs and version unions in minimumReleaseAgeExclude (#941 by @todd-elvers) — The setting previously matched package names exactly, so there was no way to exempt a whole scope or a specific version from the age gate. It's now backed by the same TrustExcludeRules engine pnpm uses, accepting bare names (react), * globs (@myorg/*), and exact-version unions (nx@21.6.5, webpack@4.47.0 || 5.102.1). Semver ranges like ^1.0.0 remain rejected, matching pnpm. The exemption is threaded per-candidate-version through pick_version and prefer_non_vulnerable_pick, so an exempt safe version can no longer be discarded in favor of a vulnerable one. Malformed entries now warn with WARN_AUBE_INVALID_MINIMUM_RELEASE_AGE_EXCLUDE and are dropped individually instead of silently invalidating the rest of the list.

Fixed
- Preserve npm optional natives across platforms (#942 by @jdx) — When no explicit supportedArchitectures is set, configure_resolver now widens architectures with accept_all: true for LockfileKind::Npm and NpmShrinkwrap, matching pnpm/aube/bun behavior. Regenerated package-lock.json / npm-shrinkwrap.json files keep foreign optional natives (e.g. win32-only optionals on Linux CI), while host-scoped filter_graph and fetch gating still keep mismatched optionals out of node_modules. Closes the regression reported in discussion #938.

💚 Sponsor aube
aube is part of jdx.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely 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.
1.24.0 23 de juny del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A round of supply-chain hardening alongside two new CycloneDX scopes and a long-awaited aube install --dry-run.
Added
- Managed hardening config (#935 by @jdx) — Admins can drop a /etc/aube/managed.toml (and optional additive AUBE_MANAGED_CONFIG_PATH) that can only make settings stricter than the user/env/project resolution. Each setting now declares a managedPolicy (max, trueWins, falseWins, managedWins, ranked:…); when a weaker local value is overridden, aube emits WARN_AUBE_MANAGED_CONFIG_ENFORCED. dangerouslyAllowAllBuilds is resolved through this pipeline too, so a managed config can shut off --dangerously-allow-all-builds across a fleet. aube config get / list show the effective merged values.
- aube install --dry-run (#927 by @jdx) — Resolve and print what would happen without writing aube-lock.yaml, creating node_modules, running preinstall, or touching install state. Unlike --lockfile-only, an explicit --frozen-lockfile still fails when no lockfile exists, while CI-style dry-runs can resolve without one. The two flags are mutually exclusive.
- aube sbom --exclude-peers (#934 by @jdx) — CycloneDX-only flag that trims components reachable only via peer edges (and drops root direct deps that are peer-only unless they also appear in dependencies). The BOM records cdx:npm:package:excludePeers. As a bonus, CycloneDX output now adds externalReferences (issue-tracker) for the root and each component when bugs is an http(s) URL.
- CycloneDX dev-only scoping (#926 by @jdx) — Packages reachable only through devDependency edges (across all workspace importers) are emitted with scope: "excluded" and the cdx:npm:package:development property. Anything reachable as a runtime dep in any importer stays unscoped, including cycles and packages linked as dev in one workspace and prod in another. SPDX output is unchanged.
- aube view infers the package name (#925 by @jdx) — Running bare aube view reads name from the nearest package.json and shows registry metadata for it; a missing name now produces a clear error rather than a confusing positional failure.

Fixed
- Trust policy enforced on lockfile reuse (#929 by @jdx) — Previously, aube update could write a lockfile and subsequent installs could reuse it (or warm install state) without re-checking trust evidence. Installs that reuse aube-lock.yaml now walk reachable registry packages, fetch packuments, and run check_no_downgrade before fetch/link. The warm/fast path is skipped entirely when trust-policy=no-downgrade or paranoid=true is active (outside offline mode), and rm aube-lock.yaml now actually triggers a re-resolve instead of being silently restored from .aube-state.
- Persist computed tarball integrity (#933 by @jdx) — Registry packages fetched without a lockfile integrity field now have SHA-512 SRI derived from the tarball (streaming when possible) and threaded back into the in-memory graph via apply_computed_integrities, including peer-contextualized entries, before the lockfile is written.
- Exact pins skip name-only OSV gate (#923 by @jdx) — Pre-resolve supply-chain checks would block aube add nx@23.0.0 whenever OSV had a name-level MAL-* hit on nx, even when the pinned version was unaffected. Full semver pins (including via npm: aliases) now go through fetch_malicious_advisories_versioned; ranges, dist-tags, and bare names still use the name-only query, and download-count checks remain name-based. Add-time failures now also read "refusing to add" instead of "refusing to install".
- Recursive --no-bail (#928 by @jdx) — aube run -r --no-bail now matches pnpm: a failing script (or .bin fallback) no longer stops the sequential fanout, later matched packages still execute, and the process exits with the first failing code. Default behavior is unchanged.

💚 Sponsor aube
aube is part of jdx.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely by sponsors.
If aube is saving your team install time or CI minutes, please consider 
1.23.0 21 de juny del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small parity release: aube outdated learns how to check global installs, and aube audit --json finally emits the pnpm-shaped report its docs have always promised.
Added
- aube outdated -g / --global (#910 by @jdx) — outdated can now scan globally installed packages instead of a project's workspace, reusing the same table/JSON output and exit-code-1-on-drift behavior as project mode. An optional PATTERN argument filters by alias prefix (including multi-package global installs), and --global is mutually exclusive with --filter/--recursive. Global installs without a lockfile are skipped with a dedicated WARN_AUBE_GLOBAL_OUTDATED_NO_LOCKFILE warning and a checked: false JSON shape. render_json also now promotes duplicate package names to an array instead of overwriting. Closes the gap reported in discussion #906.

Fixed
- aube audit --json now matches pnpm's AuditReport shape (#900 by @colinhacks) — Previously --json printed the raw npm bulk-endpoint response ({ "<pkg>": [advisory, …] }), so the bundled help example aube audit --json | jq '.advisories | length' could never work. Output is now reshaped to:
{
"advisories": { "<id>": { /* advisory */ } },
"metadata": {
"vulnerabilities": { "info": 0, "low": 0, "moderate": 0, "high": 0, "critical": 0 },
"dependencies": 0, "devDependencies": 0, "optionalDependencies": 0, "totalDependencies": 0
}
}
Advisories are re-keyed by numeric npm id (collapsing a single advisory affecting multiple packages into one entry); vulnerabilities counts unique ids across the five always-present severity buckets before the audit-level filter, while the advisories map is additionally level-filtered, matching pnpm's ordering. Dependency counts reflect the active --prod/--dev/--no-optional gating. --audit-level, --ignore/auditConfig, --ignore-unfixable, the default table output, and the --ignore-registry-errors {status,reason} sentinel are all unchanged. The "no dependencies to audit" path now also returns a well-formed empty report.

💚 Sponsor aube
aube is part of jdx.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely 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.
1.22.0 17 de juny del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
Added
- (registry) Scope-specific auth tokens (//host/:@scope:_authToken) for multi-org registries like GitHub Packages, with aube login --scope writing scoped entries (#899)

Fixed
- (install) Verify lockfile tarball URLs against package packuments instead of per-version endpoints, fixing frozen-lockfile installs against registries with incomplete /{name}/{version} routes (#905)
- (install) Close a cluster of pnpm-lock.yaml parity and re-resolution gaps: stop peer suffixes at the supplier, record hosted-git deps as codeload tarballs, render git/tarball peer suffixes as resolved specs, stamp pnpm config checksums on update/remove/dedupe/audit, and re-resolve when .pnpmfile.{cjs,mjs} changes (#896)
- (install) Repair member installs under sharedWorkspaceLockfile=false: per-member warm-path freshness, warm-path relink of deleted member node_modules, and packageExtensions applied to git/tarball/directory deps (#891)
- (install) Restore nested pnpm-workspace.yaml as a hard workspace boundary, matching pnpm — a member's settings-only yaml configures a single-package workspace rather than being skipped (#889)
- (lockfile) Close pnpm-lock.yaml formatting and field parity gaps: record every declared optional-dep arch, flow-form cpu/os/libc, re-indent transitivePeerDependencies, reorder catalogs:, round-trip deprecated:, drop engines: {node: '*'}, mark optional: true snapshots, emit transitivePeerDependencies, and synthesize peerDependencies for meta-only peers (#893)
- (embedder) Honor the embedder profile in the install banner, cache directories, virtual-store leaf, Node-install root, install-shape digest, and doctor messages (#888)

Changed
- (commands) Return exit codes from command entrypoints instead of calling process::exit, so embedding aube as a library no longer tears down the host process (#897)

💚 Sponsor aube
aube is part of jdx.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely 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.
1.21.0 13 de juny del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A pnpm-parity polish release: lockfiles now carry the two top-level integrity checksums pnpm writes, root projects under sharedWorkspaceLockfile: false get their own lockfile back, and a handful of install correctness/UX bugs around peer-suffixed source deps and the progress bar are squared away.
Added
- packageExtensionsChecksum and pnpmfileChecksum in pnpm-lock.yaml (#883 by @rubnogueira) — aube now computes and emits the two top-level integrity keys pnpm uses to guard the effective packageExtensions map and the active .pnpmfile.cjs/.pnpmfile.mjs. The implementation is a faithful Rust port of the object-hash npm package with pnpm's exact options (respectType: false, sha256, base64, unordered arrays/objects/sets), placed immediately after overrides: and before importers: with the right blank-line separation. The result is byte-identical to pnpm on real workspaces, so round-tripping a lockfile between pnpm and aube no longer produces a gratuitous diff. aube-lock.yaml output is unchanged, and workspaces without packageExtensions or a pnpmfile omit the keys entirely. A new WARN_AUBE_PNPMFILE_CHECKSUM_FAILED covers the best-effort case where a pnpmfile can't be read for hashing.

Fixed
- Source deps with peer context no longer crash linking (#885 by @rubnogueira) — Fresh aube install --force runs that pulled a git or remote-tarball dependency which acquired a peer-context suffix (e.g. some-pkg@git+<sha>(react@18.2.0)) could fail with ERR_AUBE_MISSING_PACKAGE_INDEX. The streaming fetch keys those indices under the canonical source coordinate, but the resolver's peer-context post-pass rewrites the dep_path to include (peer@ver) or a hashed _<10hex> marker; remap_indices_to_contextualized never stripped the suffix back off, so the index was dropped. It now strips both suffix forms to recover the canonical key.
- Root workspace lockfile written under sharedWorkspaceLockfile: false (#882 by @rubnogueira) — The per-project lockfile writer explicitly skipped the . importer, so the root's own pnpm-lock.yaml (containing the root package's dependencies) silently disappeared after install. The root is now written like any other project, resolving to the workspace root directory, with existing-format preservation intact — no surprise aube-lock.yaml next to a pnpm-lock.yaml. Filtered installs additionally only rewrite lockfiles for the selected project(s). This brings the per-project path in line with pnpm's shared-workspace-lockfile=false behavior.
- Progress bar no longer overshoots on workspace:/link: deps (#884 by @rubnogueira) — A monorepo install (most visibly after aube clean) could finish with reused > resolved and emit WARN_AUBE_PROGRESS_OVERFLOW. Link deps were credited to reused once in the streaming pass and then a second time by the post-filter_graph catch-up fetch, which selected work purely by absence from indices — and link deps never populate indices. The catch-up is now scoped to non-local packages (where it belongs), and the CI summary clamps reused + downloaded <= resolved as a guard against future counter races.
- @endevco/aube npm scope restored (#887 by @jdx) — The npm publish identity was inadvertently renamed to @jdx/aube in the v1.18.2 path, but that package isn't published, breaking publish-npm. The root package, generated platform sub-packages (@endevco/aube-<os>-<arch>), the preinstall lookup, and install docs are all back on @endevco, matching what users actually install.

💚 Sponsor aube
aube is part of jdx.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely 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.
1.20.0 13 de juny del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A tighter pnpm-parity release: scripts now see the full npm_* environment pnpm exports, git/tarball deps materialize correctly under the global virtual store, and per-project lockfiles in workspaces keep their original format. Plus a new Embedder profile that lets downstream tools drive aube's command layer as their own package-manager engine.
Added
- Full pnpm npm_* env parity for lifecycle & aube run scripts (#879 by @rubnogueira) — Scripts now receive npm_execpath, npm_node_execpath, npm_package_json, npm_command, npm_config_node_gyp, npm_lifecycle_script, and the full deep-flattened npm_package_* set (including engines, config, and bin), envified with pnpm's exact allowlist and casing. PM-detection bridges and build tooling that branch on these vars now behave identically under aube.
- npm_command is stamped per command family (run-script, install, rebuild, pack) and re-asserted at the spawn site so a preceding auto-install can't clobber it.
- npm_config_node_gyp points at a lazy, dependency-free node-gyp stand-in in aube's cache that bootstraps the real node-gyp only when a tool actually invokes it.
- npm_node_execpath/NODE fall back to the ambient node on PATH when no runtime switch is active, so they're always populated.
- Manifest-derived vars are applied after the build jail's env_clear, so jailed dependency builds see them too. Diffed byte-for-byte against pnpm 11.5.
- Embeddable Embedder profile (#862 by @colinhacks) — A compile-time pluggability foundation that exposes aube's command layer as a library and lets downstream tools register a &'static Embedder profile controlling aube's name, version, lockfile filename, cache/data namespaces, env-var prefix, user-agent, and workspace-yaml name — plus host-owned behavior toggles and embedder-supplied setting defaults. Standalone aube is unchanged: the default const AUBE profile reproduces every prior constant verbatim. Direct-command embedders call set_embedder once at startup; cli_main handles registration automatically.

Fixed
- Preserve per-member lockfile format under sharedWorkspaceLockfile: false (#880 by @rubnogueira) — aube install previously wrote a redundant aube-lock.yaml next to a member's existing pnpm-lock.yaml because the per-project writer applied a single format detected at the workspace root to every member. Each member's existing lockfile format is now detected individually; only members with no lockfile fall back to the workspace default. This brings the per-project path in line with add/remove/update and with pnpm's shared-workspace-lockfile=false behavior.
- Resolve git & remote-tarball deps in the global virtual store (#857 by @rubnogueira) — With enableGlobalVirtualStore: true, a registry package depending on a git or remote-tarball dependency previously got a dangling sibling symlink, surfacing as runtime errors like TypeError: Cannot read properties of undefined (reading 'prototype') for the canonical request-promise → request-promise-core chain. Two defects were fixed:
- Shareable local sources (git, remote tarball) are now materialized into the shared store like registry packages, not just into the per-project .aube/.
- Sibling lookups now canonicalize git/tarball specs to the same dep_path the package itself is keyed under (promoting #committish → resolved, stripping pnpm's (peer@ver) suffix), so the symlink resolves.
Self-healing: the install clears stale per-project entries left by older aube versions. Non-GVS installs are unaffected.

💚 Sponsor aube
aube is part of jdx.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely 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.
1.19.0 11 de juny del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
The headline feature: aube now manages your project's Node.js version and aube's own version directly — no shims, no shell activation, no corepack dance. Pin Node via devEngines.runtime, .node-version, or .nvmrc and aube injects the right binary at every script and binary spawn. Pin aube via packageManager and aube re-execs itself under the requested version. Plus three install/scripts fixes around build approvals and override warnings.
Added
- Node runtime switching (#861 by @jdx) — Projects can pin Node through devEngines.runtime (pnpm 10.14+/11 compatible OpenJS spec), .node-version, or .nvmrc (searched upward, stopping at $HOME). Exact versions, ranges, lts, latest, and codenames like lts/jod all resolve. Resolution is zero-network on the hot path: PATH node → installed versions (mise installs at ~/.local/share/mise/installs/ reused read-only, plus aube's own ~/.local/share/aube/nodejs/) → download per the new runtimeInstaller setting (auto|mise|aube; auto delegates to mise install node@<exact> when mise is on PATH, falling back to a SHASUMS256-verified nodejs.org download honoring nodeDownloadMirrors.release). The switched Node is injected into aube run/aubr, aube exec (including node env shebangs), aubx/dlx (resolved from the original cwd), root + dep lifecycle scripts, and the build jail — and exported as npm_node_execpath/NODE. Projects with no pin behave exactly as before, with no node --version probe.
// package.json
{
"devEngines": {
"runtime": { "name": "node", "version": "22.11.0", "onFail": "error" }
}
}
Engines interplay: engines.node/engineStrict now validate against the switched node. The new runtimeOnFail setting (download|error|warn|ignore) is the air-gapped-CI override; version files default to download, bare devEngines to the spec's error. Lockfile pins use pnpm 10.14+'s exact node@runtime: shape with per-platform URLs and sha256- integrity — and parsing them doubles as a compat fix for pnpm-11 lockfiles aube previously misread as registry deps.
- aube runtime CLI (#861 by @jdx) — aube runtime set node <version> (pnpm 11 parity — writes devEngines, installs, records the pin; -g delegates to mise use -g) and aube runtime list. aube doctor gains node-source, node-requested, node-provenance, and node-bin rows.
aube runtime set node 22.11.0
aube runtime list
- aube self-version switching (#861 by @jdx) — managePackageManagerVersions (previously a documented no-op, default on, pnpm 10 parity) now re-execs aube under the version requested by devEngines.packageManager (ranges) or packageManager: "aube@<exact>". The switch happens before dispatch — so aube install and any chained auto-installs run under the pinned binary — and preserves the aube/aubr/aubx multicall name. A guard env degrades a broken install to a warning rather than an exec loop. Self-downloads are verified against GitHub's server-computed release asset digests (assets[].digest, tamper-evident under immutable releases), with release metadata served from mise-versions.jdx.dev (CDN-cached, no rate limits) and falling back to the GitHub API (honoring GITHUB_TOKEN/GH_TOKEN, scoped to api.github.com), .sha256 siblings for custom mirrors, then TLS-only. Setting managePackageManagerVersions=false restores the previous strict-validation behavior. Intel macOS has no published asset and errors with a pointer to mise.

Fixed
- (scripts) Require exact source keys for non-registry build approvals (#858 by @jdx) — Source-backed dependencies (file:, git:, raw tarballs) no longer inherit lifecycle build approval from bare package names or name@semver pins. They must be allowed via an exact source key — e.g. esbuild@file+abc123 — with separate allowed_sources/denied_sources sets in BuildPolicy. Workspace onlyBuiltDependencies by name now correctly skips file: postinstalls until the source key is approved. Graph hashing also folds local source specifiers into the package id, so different file/git bytes at the same manifest version get distinct virtual-store hashes 
1.18.2 9 de juny del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A maintenance release that completes aube's move from the endevco namespace to jdx. There are no behavior changes — but if you install aube from npm or Homebrew, the package coordinates have moved.
Changed
- Project migrated to the jdx namespace (#845 by @jdx) — Repository, docs, package metadata, and release pipelines now live under jdx. User-visible coordinates:
- npm: @jdx/aube (previously @endevco/aube)
- Homebrew tap: jdx/homebrew-tap
- Repository: github.com/jdx/aube
- Docs: aube.jdx.dev
Cargo.toml, README.md, SECURITY.md, LICENSE, generated CLI/settings/error-code references, Debian/PPA/COPR packaging, and the aube sponsors blurb all point at the new locations. No install, resolver, or lockfile behavior changed in this release.

Upgrading
If you install aube via npm or Homebrew, update the package name on your next install:
# npm
npm install -g @jdx/aube
# Homebrew
brew install jdx/tap/aube
Existing installs continue to work; only fresh installs need the new coordinates.

💚 Sponsor aube
aube is part of jdx.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely 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.
1.18.1 7 de juny del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small patch release focused on install robustness: lockfiles with Git merge conflict markers now recover gracefully, aube update --global works from anywhere, and lockfile tarball URLs are verified against the registry before download.
Fixed
- (install) Regenerate conflicted lockfiles (#843 by @jdx) — When aube-lock.yaml still contains Git conflict markers (<<<<<<<, =======, >>>>>>>), install now treats it as a recoverable prefer-frozen parse failure rather than aborting. It emits the new WARN_AUBE_LOCKFILE_CONFLICT_MARKERS warning and regenerates the lockfile from package.json, so a plain aube install after a messy merge just works.
- (update) Support global updates (#840 by @jdx) — aube update --global (and aube update -g <pkg>) now routes through the global install directory instead of requiring a project package.json, so it works from any directory — including outside a repo. Each global install runs the normal update pipeline with --latest and exact manifest pins, then bin shims are relinked and stale executables removed. Named packages resolve by alias; unknown names fail with not globally installed. When combined with a workspace --filter, --global takes precedence and leaves workspace manifests untouched. Fixes #839.
aube update -g # update every globally installed tool
aube update -g prettier # update a single global tool

Security
- (install) Verify lockfile tarball URLs (#842 by @jdx) — When the lockfile pins an explicit registry tarball URL (e.g. lockfile-include-tarball-url=true or npm-alias entries), install now fetches per-version registry metadata and compares dist.tarball to the lockfile URL before downloading. Mismatches abort with the new ERR_AUBE_TARBALL_URL_MISMATCH (exit 34). Exact matches pass, and lockfile URLs on registry.npmjs.org are still accepted on alternative hosts when the /-/…tgz path matches, so Verdaccio and other local mirrors continue to work — but tampered paths or arbitrary hosts impersonating npm are rejected.

Changed
- Refresh benchmarks for v1.18.0 (#841 by @mise-en-dev) — Warm-install ratios improved from 5× to 7× vs. Bun; vs. pnpm holds steady at 9×.

💚 Sponsor aube
aube is part of en.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely by sponsors.
If aube is saving your team install time or CI minutes, please consider sponsoring at en.dev. Individual and company sponsorships are what keep the project fast, free, and independent.
1.18.0 4 de juny del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A small feature + fix release: a new aube sponsors command and a publish-time fix that normalizes the repository manifest field for stricter registries.
Added
- aube sponsors command (#824 by @jdx) — A new top-level subcommand that acknowledges 37signals and links to the canonical en.dev sponsor pages. The root README also gains a "Sponsored by 37signals" line.
aube sponsors

Fixed
- (publish) Normalize string repository fields in the publish manifest (#826 by @jdx) — When package.json contains a string repository value, the PUT body now rewrites it to { "type": "git", "url": "<normalized>" }, matching npm/pnpm 11.5.1 behavior. Shorthand forms (owner/repo, github:…, gitlab:…, bitbucket:…) expand to full git-suffixed HTTPS URLs; explicit https, git@, and URL fragments are preserved, and existing object-shaped repository values are left untouched. This unblocks publishing to registries that reject bare-string repository fields.

Changed
- Refresh benchmarks for v1.17.1 (#820 by @mise-en-dev) — Warm-install ratios vs. Bun improved from 3× to 5×, and vs. pnpm from 5× to 9×.

💚 Sponsor aube
aube is part of en.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely by sponsors.
If aube is saving your team install time or CI minutes, please consider sponsoring at en.dev. Individual and company sponsorships are what keep the project fast, free, and independent.
1.17.1 31 de maig del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
A CI-only patch with no user-facing changes — published to revert the GitHub-hosted runner migration from v1.17.0 after it slowed builds.
Changed
- (ci) Switch back to Namespace runners (#819 by @jdx) — Reverts #814, restoring Namespace profiles for CI, bench, docs, COPR/Homebrew, and release-plz jobs, including the native ARM64 Linux PGO+BOLT release job on namespace-profile-endev-linux-arm64-large. Windows and BATS shards continue to run on GitHub-hosted runners.
No runtime or CLI behavior changed in this release; if you're already on v1.17.0 there's nothing new to pick up.

💚 Sponsor aube
aube is part of en.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely by sponsors.
If aube is saving your team install time or CI minutes, please consider sponsoring at en.dev. Individual and company sponsorships are what keep the project fast, free, and independent.
1.15.0 17 de maig del 2026 — 64 bits ZIPARM64 ZIP
Notes de la versió
This release closes three Yarn Berry compatibility gaps (portal:, exec:, and patch: protocols), adds an aube add --deny-build flag for strictDepBuilds=true workflows, and fixes two install-correctness bugs around workspace updates and Bun patched dependencies.
Added
- (yarn) Berry portal: and exec: protocols (#729 by @jdx) — Yarn Berry lockfile entries using portal: and exec: are now parsed instead of skipped, and round-trip cleanly when aube writes the lockfile back (portal: as linkType: soft, exec: as a generated hard-link package). portal: targets materialize as local packages whose dependencies are followed (matching Yarn's documented difference from link:); exec: generator scripts run into a temp build directory and the generated package is imported, with versions and dependencies locked at resolve time. exec: generators require Node.js on PATH, are blocked under --ignore-scripts, and are rejected if the generator path resolves outside the project root.
- (yarn) Berry patch: protocol (#728 by @jdx) — Berry patch: resolutions are now parsed into aube's patched-dependency map (builtin patches are skipped), preserved on lockfile write, and threaded through install/link so the referenced Yarn patch files are actually applied during materialization. Previously these entries were silently dropped, so Berry projects relying on patch: could install with unpatched package contents.
- (add) aube add --deny-build=<pkg> (#730, closes #726, by @jdx) — Repeatable flag that records a dependency's lifecycle scripts as reviewed-and-denied by writing allowBuilds.<pkg>=false before install. This lets strictDepBuilds=true workflows explicitly skip selected package builds without failing the install, and is forwarded through global installs (aube add -g --deny-build=<pkg>). Specifying the same package in both --allow-build and --deny-build is rejected with the new ERR_AUBE_CONFLICTING_BUILD_FLAGS.
# Mark esbuild's postinstall as reviewed-and-denied, then install
aube add --deny-build=esbuild esbuild

Fixed
- (update) Workspace-member aube update writes to the root lockfile (#732 by @jdx) — aube update run inside a workspace member previously started from the nearest project root and produced sub/aube-lock.yaml, disagreeing with aube install (which already targets the workspace root). Plain member updates now merge into the shared workspace-root aube-lock.yaml via the same helper used by filtered/recursive updates, carrying per-importer workspace_extra_fields alongside dependency and skipped-optional metadata.
- (bun) Bun top-level patchedDependencies are applied at install (#724 by @jdx) — aube preserved Bun's package.json#patchedDependencies in bun.lock, but install-time patch loading only read pnpm.patchedDependencies, aube.patchedDependencies, and workspace YAML entries — so Bun-only projects could install successfully while materializing unpatched package contents. Bun's top-level field is now merged into the patch sources used by install (including for BOM-prefixed package.json), and is correctly removed when the map becomes empty.

💚 Sponsor aube
aube is part of en.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely by sponsors.
If aube is saving your team install time or CI minutes, please consider sponsoring at en.dev. Individual and company sponsorships are what keep the project fast, free, and independent.

Comparteix