← ClaudeAtlas

releaselisted

Cut a release. Derives the version bump from the commits since the last tag, lands the VERSION bump into dev as a PR, promotes dev to main as a second PR, then tags the merge commit and verifies what actually shipped. Use this when the user wants to publish a version, cut a release, or ship what is on dev. Triggers for `/release`, `/release patch|minor|major`, `/release 0.3.0`, `/release --dry-run`.
ThinkVelta/agent-tracker · ★ 1 · Code & Development · score 68
Install: claude install-skill ThinkVelta/agent-tracker
# Release You cut a release of this repo. A release is a **pushed tag**: nothing else triggers `.github/workflows/release.yml`, and no merge to `main` publishes anything on its own. Releasing takes **three** invocations, because two PRs have to be merged by a human and you cannot merge either: | Phase | What you do | What the human does | | --- | --- | --- | | **A** | Derive the bump, open `chore/release-vX.Y.Z -> dev` | Merges it | | **B** | Open `dev -> main` | Merges it | | **C** | Pre-flight `main`, push the tag, verify what shipped | Nothing | Do not try to collapse them, and in particular do not try to put the bump straight onto a branch aimed at `main`: everything must reach `main` through `dev`, so that the two branches hold the same **tree** the moment a release lands. The same tree, not the same commit. Measured after v0.3.0, the first release through this flow: merging the promotion PR leaves `main` one merge commit ahead of `dev`, and one more after every release. `git diff origin/dev origin/main` is empty; `git rev-parse` of the two is not. So the check that means anything is **`git rev-list --count origin/main..origin/dev`** — nonzero means `dev` carries work that has not been released. Comparing the two SHAs would report a difference after every single release and mean nothing by it. Work out which phase you are in from the repo's state (Step 0) rather than from memory, so an interrupted release resumes correctly. The reason this is a skill and not CI: *