Prepare versions, changelogs, tags and GitHub Releases using SemVer and Conventional Commits. Use for releases, hotfixes, version selection or release automation.
Resources
1Install
npx skillscat add nbfrodri/agent-tack/release Install via the SkillsCat registry.
Releases and versioning
A release is a promise to the people who use your code: the version says how risky the upgrade is, and the changelog says what changed. Both come straight from the commit history, which is why each milestone commit and PR title follows Conventional Commits and integration preserves the commits.
The convention (versioning, tag format, method, changelog) is defined in dev-workflow → references/conventions.md → "Releases and tags". In short: SemVer, annotated vX.Y.Z tags, release-please by default, CHANGELOG.md plus the GitHub Release.
Working out the next version
fix/perf → patch; any feat → minor; any breaking change (feat!:, BREAKING CHANGE:) → major. While at 0.y.z, breaking changes bump the minor. docs, chore, test, ci, refactor and style alone don't need a release.
git describe --tags --abbrev=0 # last tag, e.g. v1.4.2
git log v1.4.2..HEAD --pretty='%s%n%b' | grep -E '^(feat|fix|perf)(\(.+\))?!?:|BREAKING CHANGE'Always tell the user the version and why.
Default: release-please
Setup (new projects get it from new-project)
Copy this skill's assets/:
| Asset | Goes to |
|---|---|
assets/release-please.yml |
.github/workflows/release-please.yml |
assets/release-please-config.json |
release-please-config.json |
assets/release-please-manifest.json |
.release-please-manifest.json |
Set release-type in the config to the stack: node (package.json), python (pyproject.toml), php (composer.json), rust, go, or simple (a version.txt) for anything else. Set the manifest to the current version ("0.1.0" for a new project). Commit as ci: add release-please.
Required CI checks: PRs opened with the default GITHUB_TOKEN don't trigger other workflows, so if main requires CI checks the release PR can't be merged normally. Either add a fine-grained token (contents, pull requests, issues: read and write) as the repo secret RELEASE_PLEASE_TOKEN, which the workflow already prefers, or merge release PRs as an admin. Tell the user when you set it up.
Releasing
- Merging feature and fix PRs into
mainmakes release-please open or update a PR titledchore(main): release X.Y.Z, with the version bump and the CHANGELOG entries. - Review it with the user: is the version right, and are the notes understandable for users? Edit the PR's CHANGELOG text if needed.
- Merging it (after asking the user, like any merge) creates the annotated tag
vX.Y.Zand the GitHub Release. - Deploy or publish according to
deployment(npm, PyPI, Packagist via the tag, a Docker image taggedX.Y.Zandlatest), then smoke-test.
To force a specific version (e.g. 1.0.0), add a commit with the footer Release-As: 1.0.0.
Manual release (only where release-please isn't set up)
- On an up-to-date
mainwith a clean tree and green CI:git pull --ff-only. - Work out the version (above). If the user only asked what the next version would be, stop and propose it. If they asked you to prepare the release, go ahead and state the version and the reason: the commit and tag are local and easy to undo (
git tag -d,git reset); the push is the irreversible step. - Bump the version where it lives:
package.json(npm version <x> --no-git-tag-version),pyproject.toml(uv version <x>), app constants, Helm/Docker labels.composer.jsonusually has none: the tag is the version. - Update
CHANGELOG.md(below). - Commit
chore(release): vX.Y.Zand tag it:git tag -a vX.Y.Z -m "vX.Y.Z". - Ask the user, then
git push origin main --follow-tags. gh release create vX.Y.Z --title "vX.Y.Z" --notes-file <the new CHANGELOG section>(add--prereleasefor alpha/beta/rc).- Deploy or publish and smoke-test.
Changelog
CHANGELOG.md in Keep a Changelog style, written for the project's users, not as a commit dump: sections Added, Changed, Deprecated, Removed, Fixed, Security; each entry describes the impact and links the PR or issue; newest version first, with an [Unreleased] section in manual mode. release-please generates the sections from commit types, so good commit subjects make good release notes.
Tags
- Format:
vX.Y.Z, orvX.Y.Z-alpha.N/-beta.N/-rc.Nfor pre-releases. Always annotated. - Never move or delete a published tag. If a release is bad, ship a new patch (or revert and release), and mark the bad version in the CHANGELOG and on its GitHub Release.
- In enabled projects the
pre-pushhook rejects tags that don't follow the format or aren't annotated.
Hotfixes
Fix on main with a fix: commit and release a patch. Only when main holds unreleasable work: branch from the tag (git switch -c hotfix/1.5.1 v1.5.0), fix, release v1.5.1 from that branch manually, then bring the fix back to main (cherry-pick or merge).
Release commits, tags and notes carry no AI attribution, like every commit.