Add a /release skill to drive the release process - #90
Conversation
Encodes the release process end to end: pick the version by semver from the changelog, set the heading date, match cmd/version.txt, push a release/vX.Y.Z branch, open and merge a release PR, tag it, and monitor the GitHub release to publication. The parts worth writing down are the ones that fail runs. The release workflows derive the version from the ref name, so the branch and tag names matter. cmd/version.txt is matched by substring. The Changes.md heading must be `## X.Y.Z YYYY-MM-DD` exactly, two spaces, and the date must equal the day the workflow runs in America/Chicago -- which both prepare.yaml and release.yaml check independently, so a release that crosses midnight Central passes the first and fails the second. The skill covers prevention and recovery for that. Also records how to triage the automatic Copilot review: fix the small release-engineering-shaped findings in the PR, file issues for anything larger, and never block the release on one unless it is genuinely critical. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR adds repository documentation for the release process by introducing a dedicated /release skill and linking to it from CLAUDE.md, so the release workflow (including failure modes) is captured in one repeatable, agent-runnable place.
Changes:
- Add
.claude/skills/release/SKILL.mddescribing the end-to-end release procedure and common failure modes tied to the existing GitHub Actions workflows. - Update
CLAUDE.mdto point maintainers at the new/releaseskill as the canonical driver for releases.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
CLAUDE.md |
Adds a pointer to the /release skill as the documented release driver and highlights the key failure mode around date checks. |
.claude/skills/release/SKILL.md |
New skill doc encoding the full release process from changelog/version prep through tagging and monitoring the GitHub release workflow. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| The top section of `Changes.md` must be the release being cut. During development it | ||
| reads `## WIP TBD` or `## 1.2.0 TBD`. Rewrite it to: |
The paragraph describing the between-release heading states read as if `## WIP TBD` were an acceptable release heading, next to a paragraph warning that exact form would publish the previous version's notes. Keeps both forms documented -- `## WIP TBD` is the repo's convention and step 12 restores it -- but says plainly that neither survives into a release. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Addressed the Copilot finding in 8ad4021, though not as recommended. Dropping But the finding did identify real ambiguity: two adjacent paragraphs, one listing |
Adds
.claude/skills/release/SKILL.md, a project skill that runs a release from changelog to published GitHub release, plus a pointer to it fromCLAUDE.md.The flow it encodes
Preflight on a clean, green
master→ pick the version by semver → set theChanges.mdheading and date → matchcmd/version.txt→ pushrelease/vX.Y.Z→ open the release PR → wait on CI and fix what fails → triage the Copilot review → merge → tagvX.Y.Z→ monitorrelease.yamlto publication → report.What it documents beyond the happy path
The useful part of a release skill is the failure modes, so those are written down explicitly, each verified against the workflow files:
grep -Eo '[0-9]+\.[0-9]+\.[0-9]+.*$'over the branch or tag name, sorelease/v1.2.0andv1.2.0both yield1.2.0. Get the branch name wrong and the version check fails on a value nobody typed.cmd/version.txtis matched by substring (grep -q), not equality.Changes.mdheading must be## X.Y.Z YYYY-MM-DDexactly — two spaces — and the date must equal the day the workflow runs, inAmerica/Chicago.prepare.yamlchecks that date when the branch is pushed andrelease.yamlchecks it again when the tag is pushed. Those are separate runs, so a release that crosses midnight Central passes the first and fails the second, leaving a tag with no release. The skill covers both prevention and recovery.release.yamlbuilds the release notes by reading from the first^## [0-9]line to the next, so a heading left as## WIPwould silently publish the previous version's notes.prepare.yamlandrelease.yamlshare ten steps andtest.yamldiffs them — editing one alone fails CI.sedis GNU-only and fails on macOS BSDsed:awk '/^## [0-9]/{if(n++)exit;next} n' Changes.mdCopilot review handling
Copilot auto-reviews every PR here. The skill says to triage rather than obey: fix the small release-engineering-shaped findings (changelog typo, wrong version string) in the release PR, open issues for anything larger, and never block the release on a finding unless it is genuinely critical — and in that case stop and ask rather than abandoning the release alone.
Semver mapping
Tied to this changelog's existing emoji conventions:
:boom:→ major,:computer:/:sparkles:→ minor,:hammer:and dependency bumps → patch. With the project past 1.0, any breaking change to an exported API or to command behavior is a major bump.No code changes; nothing to test beyond CI.
🤖 Generated with Claude Code