Bump Release
Release one package or several packages with version bumps, changelog entries, commits, and tags. Supports
single-package repos, workspace monorepos, regular releases, beta releases, and dry runs.
Arguments
packages: Optional monorepo package names or directories, such as evm or evm-safe. Omit in single-package repos.
version: Optional explicit semver, such as 2.0.0. Only valid for one target package.
--beta: Create or advance a -beta.X prerelease.
--dry-run: Preview the release plan without modifying files, committing, or tagging.
Fast Planner
Run the bundled planner before manual inspection. It is read-only and gives one JSON fact base for package discovery,
previous tags, scoped changed files, dependency edges, and dirty-tree status. In pnpm workspaces, it uses
pnpm list -r --depth -1 --json when available and falls back to local workspace-glob discovery. Bun and npm-style
package.json workspaces use the local glob discovery, including negative workspace patterns.
Resolve <skill-dir> from the loaded SKILL.md path:
node "<skill-dir>/scripts/plan-release.mjs" [--cwd <repo>] [--beta] [--dry-run] [--version <semver>] [--package <name-or-dir>]...
Map user arguments directly:
- Pass every package selector as
--package <selector>.
- Pass an explicit version as
--version <semver>.
- Pass
--beta and --dry-run when requested.
If the helper exits 2, stop: the cwd is not a git repo or has no root package.json. If it exits 64, read the JSON
errors when present, report the invalid arguments, and stop.
Workflow
- Run the planner - Use the JSON output as the source of truth for
mode, packages, targets, previousTags,
changedFiles, includedFiles, excludedFiles, dependencyEdges, needsSelection, and workingTree.
- Require a clean tree - If
workingTree.clean is false, stop and show the short status. Do not invoke the
commit skill or commit unrelated work unless the user explicitly asks.
- Resolve targets - If
needsSelection is true, ask the user which workspace packages to release. If package
selectors are unknown or ambiguous, stop and ask for exact package names or directories.
- Reject invalid version scope - If an explicit
version was supplied for more than one target package, stop.
Explicit versions are single-package only.
- Plan versions - Determine a candidate version for each target package. For explicit versions, beta suffixing,
and prerelease transitions, follow the Version Examples table below. For a regular release from a stable version
with no explicit version, inspect relevant net changes and choose patch, minor, or major by Semantic Versioning.
- Skip no-op releases - For regular releases, if a target has no
includedFiles and no dependency-range cascade,
report that there are no relevant release changes and do not bump it.
- Cascade dependents - Use
dependencyEdges to find workspace packages whose dependencies or peerDependencies
point at bumped packages. Check ranges with a structured semver parser or package manager API when available, not ad
hoc string comparison. If the new version is outside the declared range, update the range and add the dependent to
the release plan. Treat dependency range widening as patch by default; treat peer dependency major changes as major
unless the user confirms otherwise.
- Confirm inferred versions - For non-dry-run regular releases without explicit versions, ask the user to confirm
inferred versions. For multi-package releases, include requested packages and cascaded dependents in the same
release-plan confirmation when the agent UI allows it.
- Preview dry runs - For
--dry-run, print the package order, current versions, planned versions,
changelog/tag/commit actions, dependency range updates, and skipped files. Stop before edits.
- Write changelogs - For regular releases only, read
references/common-changelog.md after the final package set
is known and apply it as the authoritative changelog contract. Bound diff inspection per target using its
includedFiles against previousTags[package].tag.
- Edit release files - Update each target package's
CHANGELOG.md and package.json. For beta releases, skip
CHANGELOG.md. Update any cascaded dependent ranges before committing the dependent release.
- Format once - After all release edits, run formatting once. If a
justfile exists, inspect just --list and
prefer the narrowest relevant write recipe; use broad recipes such as just full-write only when no narrower
established recipe covers the touched files. Without a suitable recipe, use the repo's established formatter
commands or leave formatting unchanged.
- Commit and tag in dependency order - Process dependencies before dependents. Use one commit and one annotated
tag per package:
- Single-package commit:
docs: release <version>
- Monorepo commit:
docs: release <package> <version>
- Single-package tag:
v<version> unless existing tags use bare semver.
- Monorepo tag: follow existing tag patterns from
previousTags; default to <package-dir>@<version>.
Script Reference
| Script |
Purpose |
scripts/plan-release.mjs |
Read-only release discovery and scoped diff facts |
Planner output fields to use:
packages and targets: package identity, directory, name, version, files, dependency names, and peer dependency
names.
previousTags: per-package previous release tag and tag patterns used.
changedFiles, includedFiles, excludedFiles: scoped file lists for changelog and no-op decisions.
dependencyEdges: workspace dependency and peer dependency relationships.
workingTree: dirty-tree status that must be clean before release edits.
needsSelection and errors: package-selection or argument problems to resolve before proceeding.
Version Examples
| Current Version |
Release Type |
New Version |
1.2.3 |
Regular |
1.2.4 (patch) |
1.2.3 |
Beta |
1.2.4-beta.1 |
1.2.3-beta.1 |
Beta |
1.2.3-beta.2 |
1.2.3-beta.5 |
Regular |
1.2.3 |
1.2.3 |
2.0.0 |
2.0.0 |
1.2.3 |
2.0.0 + Beta |
2.0.0-beta.1 |
Resources
references/common-changelog.md - Read only for regular releases after the final stable release package set is known.
Completion
Dry-run completion is a planner-backed package/version/action preview with zero writes. Release completion requires the
planned manifests and changelogs, repository formatting, one commit and annotated tag per target in dependency order,
and a final report of created commits/tags and skipped packages.
1---2name: bump-release3description: Cut a release: bump versions, write changelogs, commit, tag.4---56# Bump Release78Release one package or several packages with version bumps, changelog entries, commits, and tags. Supports9single-package repos, workspace monorepos, regular releases, beta releases, and dry runs.1011## Arguments1213- `packages`: Optional monorepo package names or directories, such as `evm` or `evm-safe`. Omit in single-package repos.14- `version`: Optional explicit semver, such as `2.0.0`. Only valid for one target package.15- `--beta`: Create or advance a `-beta.X` prerelease.16- `--dry-run`: Preview the release plan without modifying files, committing, or tagging.1718## Fast Planner1920Run the bundled planner before manual inspection. It is read-only and gives one JSON fact base for package discovery,21previous tags, scoped changed files, dependency edges, and dirty-tree status. In pnpm workspaces, it uses22`pnpm list -r --depth -1 --json` when available and falls back to local workspace-glob discovery. Bun and npm-style23`package.json` workspaces use the local glob discovery, including negative workspace patterns.2425Resolve `<skill-dir>` from the loaded `SKILL.md` path:2627```sh28node "<skill-dir>/scripts/plan-release.mjs" [--cwd <repo>] [--beta] [--dry-run] [--version <semver>] [--package <name-or-dir>]...29```3031Map user arguments directly:3233- Pass every package selector as `--package <selector>`.34- Pass an explicit version as `--version <semver>`.35- Pass `--beta` and `--dry-run` when requested.3637If the helper exits `2`, stop: the cwd is not a git repo or has no root `package.json`. If it exits `64`, read the JSON38`errors` when present, report the invalid arguments, and stop.3940## Workflow41421. **Run the planner** - Use the JSON output as the source of truth for `mode`, `packages`, `targets`, `previousTags`,43 `changedFiles`, `includedFiles`, `excludedFiles`, `dependencyEdges`, `needsSelection`, and `workingTree`.442. **Require a clean tree** - If `workingTree.clean` is false, stop and show the short status. Do not invoke the45 `commit` skill or commit unrelated work unless the user explicitly asks.463. **Resolve targets** - If `needsSelection` is true, ask the user which workspace packages to release. If package47 selectors are unknown or ambiguous, stop and ask for exact package names or directories.484. **Reject invalid version scope** - If an explicit `version` was supplied for more than one target package, stop.49 Explicit versions are single-package only.505. **Plan versions** - Determine a candidate version for each target package. For explicit versions, beta suffixing,51 and prerelease transitions, follow the Version Examples table below. For a regular release from a stable version52 with no explicit version, inspect relevant net changes and choose patch, minor, or major by Semantic Versioning.536. **Skip no-op releases** - For regular releases, if a target has no `includedFiles` and no dependency-range cascade,54 report that there are no relevant release changes and do not bump it.557. **Cascade dependents** - Use `dependencyEdges` to find workspace packages whose `dependencies` or `peerDependencies`56 point at bumped packages. Check ranges with a structured semver parser or package manager API when available, not ad57 hoc string comparison. If the new version is outside the declared range, update the range and add the dependent to58 the release plan. Treat dependency range widening as patch by default; treat peer dependency major changes as major59 unless the user confirms otherwise.608. **Confirm inferred versions** - For non-dry-run regular releases without explicit versions, ask the user to confirm61 inferred versions. For multi-package releases, include requested packages and cascaded dependents in the same62 release-plan confirmation when the agent UI allows it.639. **Preview dry runs** - For `--dry-run`, print the package order, current versions, planned versions,64 changelog/tag/commit actions, dependency range updates, and skipped files. Stop before edits.6510. **Write changelogs** - For regular releases only, read `references/common-changelog.md` after the final package set66 is known and apply it as the authoritative changelog contract. Bound diff inspection per target using its67 `includedFiles` against `previousTags[package].tag`.6811. **Edit release files** - Update each target package's `CHANGELOG.md` and `package.json`. For beta releases, skip69 `CHANGELOG.md`. Update any cascaded dependent ranges before committing the dependent release.7012. **Format once** - After all release edits, run formatting once. If a `justfile` exists, inspect `just --list` and71 prefer the narrowest relevant write recipe; use broad recipes such as `just full-write` only when no narrower72 established recipe covers the touched files. Without a suitable recipe, use the repo's established formatter73 commands or leave formatting unchanged.7413. **Commit and tag in dependency order** - Process dependencies before dependents. Use one commit and one annotated75 tag per package:76 - Single-package commit: `docs: release <version>`77 - Monorepo commit: `docs: release <package> <version>`78 - Single-package tag: `v<version>` unless existing tags use bare semver.79 - Monorepo tag: follow existing tag patterns from `previousTags`; default to `<package-dir>@<version>`.8081## Script Reference8283| Script | Purpose |84| -------------------------- | ------------------------------------------------- |85| `scripts/plan-release.mjs` | Read-only release discovery and scoped diff facts |8687Planner output fields to use:8889- `packages` and `targets`: package identity, directory, name, version, `files`, dependency names, and peer dependency90 names.91- `previousTags`: per-package previous release tag and tag patterns used.92- `changedFiles`, `includedFiles`, `excludedFiles`: scoped file lists for changelog and no-op decisions.93- `dependencyEdges`: workspace dependency and peer dependency relationships.94- `workingTree`: dirty-tree status that must be clean before release edits.95- `needsSelection` and `errors`: package-selection or argument problems to resolve before proceeding.9697## Version Examples9899| Current Version | Release Type | New Version |100| --------------- | -------------- | --------------- |101| `1.2.3` | Regular | `1.2.4` (patch) |102| `1.2.3` | Beta | `1.2.4-beta.1` |103| `1.2.3-beta.1` | Beta | `1.2.3-beta.2` |104| `1.2.3-beta.5` | Regular | `1.2.3` |105| `1.2.3` | `2.0.0` | `2.0.0` |106| `1.2.3` | `2.0.0` + Beta | `2.0.0-beta.1` |107108## Resources109110- `references/common-changelog.md` - Read only for regular releases after the final stable release package set is known.111112## Completion113114Dry-run completion is a planner-backed package/version/action preview with zero writes. Release completion requires the115planned manifests and changelogs, repository formatting, one commit and annotated tag per target in dependency order,116and a final report of created commits/tags and skipped packages.