v1.12.0: Tidier config, smarter installs from bun.lock
·
218 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
A round of fixes driven by user reports — bun.lock imports now keep peer-only packages, the store layout is reorganized so one cache mount covers everything, and aube config set stops scribbling unknown keys into .npmrc.
Added
- Smarter
aube config set/deleterouting (#634 by @jdx) — Writes only land in.npmrcfor the npm-shared surface (per-host auth/cert templates, scoped registries, and a curated allowlist of npm-standard scalars likeregistry,proxy,fetch-retries, …). Aube-only and pnpm-only keys (autoInstallPeers,dangerouslyAllowAllBuilds,pnpmfilePath, …) plus unknown free-form keys now go to~/.config/aube/config.toml. Dotted writes for aube map settings —aube config set --local allowBuilds.@mongodb-js/zstd true,aube config set --local overrides.lodash 4.17.21— edit a single entry ofpnpm-workspace.yaml(orpackage.json#<pnpm|aube>.<map>) in place.aube config deletesweeps both files so legacy writes from older versions are still cleaned up. New error codeERR_AUBE_CONFIG_NESTED_AUBE_KEYcovers invalid nested writes. - Polished install progress display (#616 by @jdx) — The bar is now cyan across every phase (no more "completing twice" as the phase flips green), reserves the final slice so it never reads 100% while the linker is still running, and paints a full 100% from a new
donephase onfinish()/stop()so the last frame matches the✓summary line. The displayed~XX MBtotal is now a dynamic blend of the staticunpackedSize × 0.20fallback and a linear extrapolation from observed bytes-per-package — converging to the real total instead of overshooting by ~48%.resolvingswitched yellow → cyan, thepkgscounter is bold/uncolored mid-install, andWARN_AUBE_SLOW_METADATAdrops redundant fields.
Fixed
- Peer-only packages from
bun.lockno longer silently dropped (#639 by @jdx) —filter_graph's GC walk ran beforehoist_auto_installed_peers, so peer-installed deps like@mui/materialthat weren't directly listed in workspacedependencies:got pruned as unreachable before the hoist could promote them. The pipeline now hoists first, then walks. On the linked repro,aube installgoes from 6 packages (with broken@mui/material/@emotion/*) to 44 with everything resolved. bun.lockimports now run the peer-context pass (#619 by @jdx) —LockfileKind::Bunwas missing from theapply_peer_contextsbranch, so peer-dependent packages landed at.aube/<pkg>@<ver>/without sibling peer links and walked up to whatever hoisted copy they found. Now they get peer-qualifieddep_paths(e.g.@cloudflare+vite-plugin@1.17.1_vite@8.0.10_…) with correct sibling symlinks, matching the npm-lockfile import behavior.- Stale cached indexes now self-heal at fetch time (#635 by @jdx) — Cached package indexes moved from
$XDG_CACHE_HOME/aube/index/into the store at<store>/v1/index/, next tov1/files/. The install fast path swappedload_indexforload_index_verified, so an index whose CAS shards have drifted out from under it is dropped at fetch classification and the tarball re-fetched cleanly — instead of the materializer dying mid-link withERR_AUBE_MISSING_STORE_FILE. Fixes a BuildKit cache-mount footgun where only one of the two cache dirs would be persisted. engines.pnpmno longer triggers spurious version warnings (#633 by @jdx) — A project pinningengines.pnpm: ">=10.11.1"producedwarn: wanted pnpm >=10.11.1, got 1.xon every install (or a hard failure underengine-strict). Aube and pnpm live in different version namespaces, so honoring this field was net-negative.engines.pnpmis now skipped entirely;engines.aubeis still honored for projects that want to gate on the running tool, andengines.nodeis unchanged.update -ino longer reports phantom upgrade rows for catalog deps (#636 by @jdx) — When acatalog:dep resolved to a newer version while the same name was pulled in transitively at an older one (e.g.jose@6.2.3direct +jose@5.10.0via@upstash/qstash),lookup_pkg's name-scan picked the transitive snapshot as "current" and offered a downgrade row the rewrite path then ignored. Lookup now goes through the importer'sDirectDep.dep_path. The companion fix extends the--latestprerelease guard to the locked version, so"^1.0.0-rc.1"isn't silently rewritten to whatever the registry'slatestdist-tag points at.update/add/dedupe/remove/auditpreserve cross-platform optionals andtime:entries (#637 by @jdx) — These commands now route through install'sconfigure_resolver, inheriting the full settings pipeline (supportedArchitectures,resolutionMode,minimumReleaseAge, overrides, …). They opt out of the full-packument disk cache so an immediately-following re-resolve picks up registrydist-tagchanges, and the resolver carries forward the prior lockfile'stime:entry when a fresh corgi packument lacks publish time for a resolved version — so direct deps don't lose theirtime:line on update.aube add --global --allow-build=<pkg>actually pre-approves builds (#620 by @jdx) — The synthetic innerAddArgswas being built withallow_build: Vec::new(), silently dropping the outer flag and erroring with "must be reviewed before install" understrictDepBuilds=true. The flag is now plumbed throughrun_global/run_global_innerand approvals are written to the throwaway install dir'spackage.json#aube.allowBuildsbefore lifecycle scripts run.
Changed
aube store pathnow returns thev1/directory (#635) — One level above the previousv1/files/output, so a single Docker BuildKit cache mount or backup captures both the CAS and the new co-located index dir. Scripts consumingaube store pathwill now mount one level higher (the intended behavior). A lazy in-place migration from the legacy$XDG_CACHE_HOME/aube/index/location runs on the first store open after upgrade (rename fast path, recursive-copy fallback for cross-FS).
💚 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.