aube
Use aube as the Node.js package manager, installed and pinned through mise. aube
is jdx's fast, security-first package manager (https://aube.sh/); this skill
captures the how we use it here decisions, not the official reference.
Core conventions
- Install through mise —
mise use aube and pin in [tools] (e.g.
aube = "2.2.9"); never install aube standalone. See
mise.
- Single version source —
mise.toml drives both node and aube; after
migrating, remove the packageManager field from package.json so versions
do not fork.
- Keep a Dependabot-compatible lockfile — aube reads and writes an existing
pnpm-lock.yaml or package-lock.json in place, so keep that committed
rather than switching to aube-lock.yaml. Dependabot lacks an aube ecosystem
and cannot maintain aube-lock.yaml. For new projects, set
defaultLockfileFormat = "pnpm" in aube-workspace.yaml, .npmrc, or
settings.toml. In dependabot.yml, use the npm ecosystem for these
projects — no aube ecosystem exists. Adopt aube-lock.yaml only without
Dependabot. Locked versions are trusted on frozen installs (aube ci)
without per-install revalidation.
- Accept supply-chain defaults — aube denies lifecycle scripts by default,
holds new releases behind a 24h cooling window, checks typosquats, and
downgrades trust. Keep these; allow only the specific builds you need.
- Phased migration — pilot in one project or subcomponent before
committing; do not replace wholesale.
Commands
| Command |
Use |
aubr <script> (= aube run) |
Daily driver: aubr build, aubr test, aubr dev. Echoes $ <cmd> to stderr (--silent to mute). |
aube test |
Auto-installs on stale state, then runs test script. |
aube ci |
Frozen-lockfile install for CI; runs no scripts by default. |
aube install |
Local setup / Docker layers. |
aube add <pkg> |
Add a dependency (malware-checked by default). |
aubx <tool> (= aube dlx) |
Run a one-off tool without installing. |
aube exec [--] <cmd> |
Run binary from deps. Put -- before binary so flags pass through (see Gotchas). |
aube approve-builds |
Interactive review/approval of lifecycle build scripts. |
CI (GitHub Actions)
Prefer jdx/aube-action@v1 over jdx/mise-action@v4: aube's repo moved
jdx/aube -> aubepkg/aube, and mise's aqua backend still verifies GitHub
attestations against the old identity, breaking mise install aube for every
release since 2.2.8. jdx/aube-action@v1 downloads the release directly (no
attestation check) and installs Node.js too via node-version: auto (reads
mise.toml, .nvmrc, etc.) — drop actions/setup-node. Still need
mise-action for other tools in the same job? Set
MISE_AQUA_GITHUB_ATTESTATIONS: false on that step instead.
Cache both aube directories — the content store and registry metadata are
separate (see https://aube.sh/package-manager/ci.html#cache-choices) — via
aube store path / aube cache path, not hardcoded paths:
- uses: jdx/aube-action@v1
with:
node-version: auto
- id: aube-paths
run: |
echo "store=$(aube store path)" >> "$GITHUB_OUTPUT"
echo "cache=$(aube cache path)" >> "$GITHUB_OUTPUT"
- uses: actions/cache@v6
with:
path: ${{ steps.aube-paths.outputs.store }}
key: ${{ runner.os }}-aube-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- uses: actions/cache@v6
with:
path: ${{ steps.aube-paths.outputs.cache }}
key: ${{ runner.os }}-aube-cache-${{ hashFiles('**/pnpm-lock.yaml') }}
- run: aube ci
- run: aubr test
Lifecycle scripts
aube jails lifecycle scripts by default. Allow needed builds via
aube approve-builds or allowBuilds in aube-workspace.yaml /
pnpm.allowBuilds in package.json, e.g. esbuild, workerd. Verify
locally before relying on CI. Jailed builds can also be granted explicit
permissions (jailBuildPermissions).
Gotchas
- Third-party actions auto-detect the package manager — e.g.
wrangler-action picks missing pnpm on pnpm-lock.yaml. Call binary
directly: aube exec wrangler deploy with CLOUDFLARE_API_TOKEN in env.
aube exec swallows global flags — aube exec tsc --version prints aube's
version. Put -- before binary: aube exec -- tsc --version.
aubr echoes commands to stderr — prints expanded command prefixed with $
to stderr (matching npm/pnpm); pass --silent / -s if scripts parse stderr.
- Global installs use aube data root in 2.x —
aube add -g installs to
$XDG_DATA_HOME/aube/bin (~/.local/share/aube/bin), ignoring PNPM_HOME.
Add this directory to $PATH.
- bun -> aube is also a runtime migration — migrating runtime (
node:*)
and test runner (bun test -> Vitest) is separate from package-manager switch.
- starship
nodejs/package modules loop under aube — disable in
~/.config/starship.toml ([nodejs] and [package] disabled = true) to
prevent prompt loops.
mise install aube fails GitHub attestation verification — see CI
section for the jdx/aube-action fix.
Related
mise — installs and pins aube locally; provides the
single version source (mise.toml) that jdx/aube-action@v1 reads in CI.
1---2name: aube3description: Use when managing a Node.js project's dependencies or scripts with aube (https://aube.sh/), or migrating a project from pnpm, npm, or bun to aube — including its lockfile, CI, lifecycle-script jail, and Dependabot handling.4---56# aube78Use aube as the Node.js package manager, installed and pinned through mise. aube9is jdx's fast, security-first package manager (https://aube.sh/); this skill10captures the *how we use it here* decisions, not the official reference.1112## Core conventions13141. **Install through mise** — `mise use aube` and pin in `[tools]` (e.g.15 `aube = "2.2.9"`); never install aube standalone. See16 [`mise`](../mise/SKILL.md).172. **Single version source** — `mise.toml` drives both node and aube; after18 migrating, remove the `packageManager` field from `package.json` so versions19 do not fork.203. **Keep a Dependabot-compatible lockfile** — aube reads and writes an existing21 `pnpm-lock.yaml` or `package-lock.json` in place, so keep that committed22 rather than switching to `aube-lock.yaml`. Dependabot lacks an aube ecosystem23 and cannot maintain `aube-lock.yaml`. For new projects, set24 `defaultLockfileFormat = "pnpm"` in `aube-workspace.yaml`, `.npmrc`, or25 `settings.toml`. In `dependabot.yml`, use the `npm` ecosystem for these26 projects — no `aube` ecosystem exists. Adopt `aube-lock.yaml` only without27 Dependabot. Locked versions are trusted on frozen installs (`aube ci`)28 without per-install revalidation.294. **Accept supply-chain defaults** — aube denies lifecycle scripts by default,30 holds new releases behind a 24h cooling window, checks typosquats, and31 downgrades trust. Keep these; allow only the specific builds you need.325. **Phased migration** — pilot in one project or subcomponent before33 committing; do not replace wholesale.3435## Commands3637| Command | Use |38| --- | --- |39| `aubr <script>` (= `aube run`) | Daily driver: `aubr build`, `aubr test`, `aubr dev`. Echoes `$ <cmd>` to stderr (`--silent` to mute). |40| `aube test` | Auto-installs on stale state, then runs `test` script. |41| `aube ci` | Frozen-lockfile install for CI; runs no scripts by default. |42| `aube install` | Local setup / Docker layers. |43| `aube add <pkg>` | Add a dependency (malware-checked by default). |44| `aubx <tool>` (= `aube dlx`) | Run a one-off tool without installing. |45| `aube exec [--] <cmd>` | Run binary from deps. Put `--` before binary so flags pass through (see Gotchas). |46| `aube approve-builds` | Interactive review/approval of lifecycle build scripts. |4748## CI (GitHub Actions)4950Prefer `jdx/aube-action@v1` over `jdx/mise-action@v4`: aube's repo moved51`jdx/aube` -> `aubepkg/aube`, and mise's aqua backend still verifies GitHub52attestations against the old identity, breaking `mise install aube` for every53release since 2.2.8. `jdx/aube-action@v1` downloads the release directly (no54attestation check) and installs Node.js too via `node-version: auto` (reads55`mise.toml`, `.nvmrc`, etc.) — drop `actions/setup-node`. Still need56`mise-action` for other tools in the same job? Set57`MISE_AQUA_GITHUB_ATTESTATIONS: false` on that step instead.5859Cache both aube directories — the content store and registry metadata are60separate (see https://aube.sh/package-manager/ci.html#cache-choices) — via61`aube store path` / `aube cache path`, not hardcoded paths:6263```yaml64- uses: jdx/aube-action@v165 with:66 node-version: auto67- id: aube-paths68 run: |69 echo "store=$(aube store path)" >> "$GITHUB_OUTPUT"70 echo "cache=$(aube cache path)" >> "$GITHUB_OUTPUT"71- uses: actions/cache@v672 with:73 path: ${{ steps.aube-paths.outputs.store }}74 key: ${{ runner.os }}-aube-store-${{ hashFiles('**/pnpm-lock.yaml') }}75- uses: actions/cache@v676 with:77 path: ${{ steps.aube-paths.outputs.cache }}78 key: ${{ runner.os }}-aube-cache-${{ hashFiles('**/pnpm-lock.yaml') }}79- run: aube ci80- run: aubr test81```8283## Lifecycle scripts8485aube jails lifecycle scripts by default. Allow needed builds via86`aube approve-builds` or `allowBuilds` in `aube-workspace.yaml` /87`pnpm.allowBuilds` in `package.json`, e.g. `esbuild`, `workerd`. Verify88locally before relying on CI. Jailed builds can also be granted explicit89permissions (`jailBuildPermissions`).9091## Gotchas9293- **Third-party actions auto-detect the package manager** — e.g.94 `wrangler-action` picks missing pnpm on `pnpm-lock.yaml`. Call binary95 directly: `aube exec wrangler deploy` with `CLOUDFLARE_API_TOKEN` in env.96- **`aube exec` swallows global flags** — `aube exec tsc --version` prints aube's97 version. Put `--` before binary: `aube exec -- tsc --version`.98- **`aubr` echoes commands to stderr** — prints expanded command prefixed with `$`99 to stderr (matching npm/pnpm); pass `--silent` / `-s` if scripts parse stderr.100- **Global installs use aube data root in 2.x** — `aube add -g` installs to101 `$XDG_DATA_HOME/aube/bin` (`~/.local/share/aube/bin`), ignoring `PNPM_HOME`.102 Add this directory to `$PATH`.103- **bun -> aube is also a runtime migration** — migrating runtime (`node:*`)104 and test runner (bun test -> Vitest) is separate from package-manager switch.105- **starship `nodejs`/`package` modules loop under aube** — disable in106 `~/.config/starship.toml` (`[nodejs]` and `[package]` `disabled = true`) to107 prevent prompt loops.108- **`mise install aube` fails GitHub attestation verification** — see CI109 section for the `jdx/aube-action` fix.110111## Related112113- [`mise`](../mise/SKILL.md) — installs and pins aube locally; provides the114 single version source (`mise.toml`) that `jdx/aube-action@v1` reads in CI.