# Release

> Release one or more packages from this monorepo using the scripts in agent-files/scripts/release/. Activate when the user says "release", "/release", or asks to release specific packages (e.g. "/release dmk signer-eth").

- Skill: `ledgerhq/release` (Agent Skill)
- Install (CLI): `npx skillmds@latest add ledgerhq/release`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ledgerhq/release/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: ledgerhq (https://skillmd.com/u/ledgerhq)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ledgerhq/release

---


# Release Packages

Release one or more packages from this monorepo using the scripts in `agent-files/scripts/release/`.

## Permission prompts

The following commands need network access, post-install scripts, or the GitHub CLI, so they will trigger a permission prompt (Claude Code) or must be run with `required_permissions: ["all"]` (Cursor):

- `pnpm exec zx agent-files/scripts/release/preflight.cjs` (Step 1 — `gh auth status`)
- `pnpm exec zx agent-files/scripts/release/changelog.cjs` (Step 7 — GitHub API via `gh`)
- `pnpm install --no-frozen-lockfile` (Step 9 — post-install scripts, native deps)
- `pnpm exec zx agent-files/scripts/release/create-pr.cjs` (Step 11 — `gh pr create`)

All other scripts (`discover`, `set-private`, `pin-deps`, `bump`, `cleanup`) run fine inside the sandbox.

## Package aliases

Use these short names in the `--packages` flag. The user may use either aliases or full names.

| Alias                   | Full package name                                              |
| ----------------------- | -------------------------------------------------------------- |
| `dmk`                   | `@ledgerhq/device-management-kit`                              |
| `signer-eth`            | `@ledgerhq/device-signer-kit-ethereum`                         |
| `signer-btc`            | `@ledgerhq/device-signer-kit-bitcoin`                          |
| `signer-sol`            | `@ledgerhq/device-signer-kit-solana`                           |
| `signer-aleo`           | `@ledgerhq/device-signer-kit-aleo`                             |
| `signer-cosmos`         | `@ledgerhq/device-signer-kit-cosmos`                           |
| `signer-hyperliquid`    | `@ledgerhq/device-signer-kit-hyperliquid`                      |
| `signer-concordium`     | `@ledgerhq/device-signer-kit-concordium`                       |
| `signer-polkadot`       | `@ledgerhq/device-signer-kit-polkadot`                         |
| `signer-zcash`          | `@ledgerhq/device-signer-kit-zcash`                            |
| `signer-utils`          | `@ledgerhq/signer-utils`                                       |
| `signer-xrp`            | `@ledgerhq/device-signer-kit-xrp`                              |
| `context-module`        | `@ledgerhq/context-module`                                     |
| `transport-web-hid`     | `@ledgerhq/device-transport-kit-web-hid`                       |
| `transport-web-ble`     | `@ledgerhq/device-transport-kit-web-ble`                       |
| `transport-rn-ble`      | `@ledgerhq/device-transport-kit-react-native-ble`              |
| `transport-rn-hid`      | `@ledgerhq/device-transport-kit-react-native-hid`              |
| `transport-node-hid`    | `@ledgerhq/device-transport-kit-node-hid`                      |
| `transport-mockserver`  | `@ledgerhq/device-transport-kit-mockserver`                    |
| `transport-speculos`    | `@ledgerhq/device-transport-kit-speculos`                      |
| `mockserver-client`     | `@ledgerhq/device-mockserver-client`                           |
| `speculos-controller`   | `@ledgerhq/speculos-device-controller`                         |
| `keyring-protocol`      | `@ledgerhq/device-trusted-app-kit-ledger-keyring-protocol`     |
| `ledger-wallet`         | `@ledgerhq/dmk-ledger-wallet`                                  |
| `devtools-core`         | `@ledgerhq/device-management-kit-devtools-core`                |
| `devtools-rozenite`     | `@ledgerhq/device-management-kit-devtools-rozenite`            |
| `devtools-ui`           | `@ledgerhq/device-management-kit-devtools-ui`                  |
| `devtools-ws-common`    | `@ledgerhq/device-management-kit-devtools-websocket-common`    |
| `devtools-ws-connector` | `@ledgerhq/device-management-kit-devtools-websocket-connector` |
| `devtools-ws-server`    | `@ledgerhq/device-management-kit-devtools-websocket-server`    |

## Release flow (step by step)

All scripts live in `agent-files/scripts/release/` and are run with `pnpm exec zx`.
Replace `<PKGS>` with a comma-separated list of aliases (e.g., `dmk,signer-eth`).

**Important:** Commit after every step that modifies files. This keeps the release branch bisectable and easy to review.

### Step 1 -- Preflight

```bash
pnpm exec zx agent-files/scripts/release/preflight.cjs
```

- If any check fails, fix the issue before proceeding.
- This step **MUST** pass before running any other release step.

### Step 2 -- Discover & confirm

```bash
pnpm exec zx agent-files/scripts/release/discover.cjs --packages <PKGS>
```

- `--packages` is required. Pass the same comma-separated aliases the user requested (e.g. `signer-sol,signer-eth`).
- Parse the JSON output. The script returns `{ releasable, selected }`.
- Present two sections to the user, in order:

#### a. All releasable packages

`releasable[]` lists every package with pending changesets in the repo. Each entry has `name`, `displayName`, `version`, `bump` (highest of major > minor > patch), and `changesets`.

```
| Package | Current version | Bump | Changesets |
|---------|----------------|------|------------|
| @ledgerhq/device-signer-kit-ethereum | 1.13.0 | minor | long-flies-try, tidy-onions-flow |
| @ledgerhq/signer-utils | 1.1.3 | minor | calm-ducks-love |
```

#### b. Packages that will be released in this run

`selected[]` is the intersection of `releasable` and the requested aliases. Each row has `from`, `to`, `bump`, `changesets`, and `depsNotReleased` (workspace deps of this package that are NOT in the selected set).

```
| Package | From | To | Bump | Changesets |
|---------|------|----|------|------------|
| @ledgerhq/device-signer-kit-solana | 1.7.1 | 1.8.0 | minor | heavy-mangos-write, itchy-teams-join, ripe-suits-lie |
```

For each row where `depsNotReleased` is non-empty, add a sub-bullet block immediately below it:

> **Signer SOL** has workspace deps that are NOT in this release:
>
> - @ledgerhq/context-module (dependency)
> - @ledgerhq/signer-utils (dependency)
> - @ledgerhq/device-management-kit (peerDependency)

These deps will be pinned by `pin-deps.cjs` to their currently-published versions — confirm with the user that this is intended.

After the table, diff the requested aliases against `selected[].name`. If any requested package did not appear in `selected`, tell the user it has no pending changesets and will be skipped.

**Wait for the user to confirm** before proceeding. Do NOT continue until the user explicitly approves.

### Step 3 -- Create release branch

```bash
git checkout develop && git pull
git checkout -b release
```

### Step 4 -- Set release scope

```bash
pnpm exec zx agent-files/scripts/release/set-private.cjs --packages <PKGS>
```

- Sets `private:false` on target packages, `private:true` on everything else.
- Auto-includes dependents of major-bumped packages (creates a patch changeset for them).
- Review the JSON summary to confirm the right packages are public.

**Commit:**

```bash
git add .
git commit -m "📦 (release): Set release scope to <packages>"
```

### Step 5 -- Pin workspace deps

```bash
pnpm exec zx agent-files/scripts/release/pin-deps.cjs --packages <PKGS>
```

- Replaces `workspace:^` with `^<version>` for deps pointing to non-released internal packages.
- Review the pinned list; deps between released packages stay as `workspace:^`.

**Commit:**

```bash
git add .
git commit -m "🔧 (release): Pin workspace dependencies"
```

### Step 6 -- Bump versions

```bash
pnpm exec zx agent-files/scripts/release/bump.cjs
```

- Reads changesets and applies semver bumps to `package.json`.
- Propagates patch bumps to released packages that depend on bumped packages.
- Review the bumps summary. Verify versions look correct.

**Commit:**

```bash
git add .
git commit -m "🔖 (release): Bump versions"
```

### Step 7 -- Generate changelogs

```bash
pnpm exec zx agent-files/scripts/release/changelog.cjs
```

- Prepends new entries to each bumped package's `CHANGELOG.md`.
- Review a couple of changelogs to confirm formatting.

**Commit:**

```bash
git add .
git commit -m "📝 (release): Generate changelogs"
```

### Step 8 -- Clean up changesets

```bash
pnpm exec zx agent-files/scripts/release/cleanup.cjs
```

- Deletes `.changeset/*.md` files consumed by the release.

**Commit:**

```bash
git add .
git commit -m "🔥 (release): Clean up consumed changesets"
```

### Step 9 -- Update lockfile

```bash
pnpm install --no-frozen-lockfile
```

- The `--no-frozen-lockfile` flag is required because Step 5 pinned workspace deps (replacing `workspace:^` with concrete versions), which makes the existing lockfile out of date.

**Commit:**

```bash
git add .
git commit -m "🔧 (release): Update lockfile"
```

### Step 10 -- Update the docs version tables

Update the version tables in `apps/docs/content/docs/index.mdx` to reflect the new versions of all released packages.

- Read the file and locate the library tables (DMK, Signers & Trusted App Kit, Transports, DevTools).
- For each released (public) package, find its row in the table and replace the old version number with the new bumped version from Step 6.
- Only update rows for packages that were actually released.

**Commit:**

```bash
git add .
git commit -m "📝 (release): Update getting-started versions"
```

### Step 11 -- Create release PR

```bash
pnpm exec zx agent-files/scripts/release/create-pr.cjs
```

- Opens a PR targeting `main` with a version summary body.
- Report the PR URL to the user.

### Step 12 -- Verify documentation and README

Perform a documentation health check. This step does not block the release but surfaces issues for the user.

- **`apps/docs/content/docs/index.mdx`**: Cross-check that every released package now shows its new version in the tables. Report any mismatches.
- **`README.md`**: Check that every released package appears in the package inventory tables (around lines 88-153). If a package is missing, warn the user.
- **Migration guides**: For any package with a **major** or **minor** bump, check whether a migration guide exists under `apps/docs/content/docs/integration/migrations/`. If none is found, remind the user that a migration guide may be needed.
- Report all findings to the user.

## Error handling

- If any script fails, read its stderr output and fix the issue before retrying.
- If `set-private.cjs` fails on an unknown alias, check the alias table above or `agent-files/scripts/release/config.cjs`.
- If `bump.cjs` reports "No changesets found", verify that `.changeset/*.md` files exist for the target packages.
- If `create-pr.cjs` fails, ensure `gh` CLI is authenticated (`gh auth status`) and the branch is pushed.
- Never force-push or amend commits that have been pushed to a shared branch.

