v1.20.0: npm env parity & global virtual store fixes
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 runscripts (#879 by @rubnogueira) — Scripts now receivenpm_execpath,npm_node_execpath,npm_package_json,npm_command,npm_config_node_gyp,npm_lifecycle_script, and the full deep-flattenednpm_package_*set (includingengines,config, andbin), 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_commandis 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_gyppoints 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/NODEfall back to the ambientnodeonPATHwhen 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
Embedderprofile (#862 by @colinhacks) — A compile-time pluggability foundation that exposes aube's command layer as a library and lets downstream tools register a&'static Embedderprofile 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 defaultconst AUBEprofile reproduces every prior constant verbatim. Direct-command embedders callset_embedderonce at startup;cli_mainhandles registration automatically.
Fixed
-
Preserve per-member lockfile format under
sharedWorkspaceLockfile: false(#880 by @rubnogueira) —aube installpreviously wrote a redundantaube-lock.yamlnext to a member's existingpnpm-lock.yamlbecause 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 withadd/remove/updateand with pnpm'sshared-workspace-lockfile=falsebehavior. -
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 likeTypeError: Cannot read properties of undefined (reading 'prototype')for the canonicalrequest-promise→request-promise-corechain. 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_paththe 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.
- Shareable local sources (
Full Changelog: v1.19.0...v1.20.0
💚 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.