.agents/skills/release-bump/SKILL.md
Finalize the changelog draft, bump the version across all tracked files, and create a tagged release commit. After this skill runs, the repo has a clean release commit and tag ready to push.
gh CLI installed and authenticated (gh auth status).bumpversion installed (pip install bumpversion or available in the project venv).[Unreleased] section of CHANGELOG.md should already contain the release narrative. If it's empty or stale, run the draft-release-notes skill first.Verify the working tree is clean (except CHANGELOG.md which may have the draft).
git status --porcelain
Only CHANGELOG.md (and optionally .agents/ files) should be modified. If there are other uncommitted changes, stop and ask the user to commit or stash them first.
Determine the bump level.
Ask the user if not specified: patch, minor, or major. Check the current version:
grep '^current_version' .bumpversion.cfg
Stamp the changelog.
Read the current [Unreleased] content from CHANGELOG.md. Compute the new version (based on bump level and current version). Then:
a. Replace the ## [Unreleased] section body with an empty placeholder.
b. Insert a new stamped section immediately after ## [Unreleased]:
## [Unreleased]
## [X.Y.Z] - YYYY-MM-DD
<the content that was in [Unreleased]>
c. Update the reference links at the bottom of the file:
[Unreleased] link to compare against the new tag[Unreleased]: https://github.com/jamiepine/voicebox/compare/vX.Y.Z...HEAD
[X.Y.Z]: https://github.com/jamiepine/voicebox/compare/vPREVIOUS...vX.Y.Z
Stage the changelog.
git add CHANGELOG.md
Run bumpversion.
bumpversion --allow-dirty <patch|minor|major>
The --allow-dirty flag is needed because CHANGELOG.md is already staged. bumpversion will:
.bumpversion.cfg)Bump version: X.Y.Z -> A.B.CvA.B.CThe staged CHANGELOG.md will be included in this commit automatically.
Verify results.
git show --name-only --stat HEAD
git tag --list "v*" --sort=-v:refname | head -n 5
Confirm the commit contains:
CHANGELOG.md.bumpversion.cfgtauri/src-tauri/tauri.conf.jsontauri/src-tauri/Cargo.tomlpackage.jsonapp/package.jsontauri/package.jsonlanding/package.jsonweb/package.jsonbackend/__init__.pyConfirm the new tag exists.
Do NOT push unless the user explicitly asks. Report the tag name and suggest:
Ready to push. When you're ready:
git push origin main --follow-tags
Given current version X.Y.Z:
patch -> X.Y.(Z+1)minor -> X.(Y+1).0major -> (X+1).0.0git tag -d vX.Y.Z && git reset --soft HEAD~1.github/workflows/release.yml) automatically extracts the matching version section from CHANGELOG.md and uses it as the GitHub Release body. No manual copy-paste needed..bumpversion.cfg (Bump version: X.Y.Z -> A.B.C). Do not override it.gh release edit vX.Y.Z --notes-file <(sed -n '/## \[X.Y.Z\]/,/## \[/p' CHANGELOG.md | head -n -1)