v1.39.0: Configurable lockfile format & smarter store pruning
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
defaultLockfileFormatsetting ("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 theaube clean --lockfile→ reinstall workflow reliably regeneratepnpm-lock.yamlfor 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.yamledits are now gated behind a default-onworkspace-yaml-preservefeature. The standalone Aube CLI is unchanged, but embedders (e.g. mise) can disable the feature to drop theyamlpatch/yamlpath/tree-sitterdependency 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 prunepreviously only walked the content-addressable store, leaving hashed graph directories under<cacheDir>/virtual-storebehind 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 versionedvirtual-store/v1/namespace so older releases' entries are untouched, and registry failures fail closed withERR_AUBE_GVS_PRUNE_FAILED.--dry-runcovers the new phase. Addresses #1268. -
Enforce
devEnginesaube version errors (#1269 by @jdx) — An explicitdevEngines.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 foraube --version(which previously returned before self-version handling), andaube --version --workspace-rootworks outside a workspace.devEngines.packageManagerentries naming pnpm or other package managers keep their existing compatibility behavior. Fixes #1263.
Full Changelog: v1.38.1...v1.39.0
💚 Sponsor aube
aube is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools including mise. Work on aube is funded by sponsors.
If aube is saving your team install time or CI minutes, please consider sponsoring at jdx.dev. Individual and company sponsorships are what keep the project fast, free, and independent.