| name | release |
| description | Use when the user asks whether a release is ready, or to gate/verify release criteria before publishing. A thin readiness-gate that runs the existing read-only verifiers (evolve release-preflight, evolve release-consistency), adds the CI-green-on-main and no-WIP-commit checks they don't cover, then delegates execution to /evo:publish. Does NOT reimplement the release pipeline. |
| argument-hint | <target-version> [--dry-run] |
/evo:release
Release readiness-gate, not a release executor. It composes the checks that already exist (evolve release-preflight, evolve release-consistency) and adds the two gaps they miss — CI green on main HEAD and no WIP/fixup commits — then hands a green report to /evo:publish, which owns the actual bump → changelog → ship → propagate lifecycle.
Why this exists
evolve release-preflight already gates: clean tree, attached branch, semver bump, recent audit PASS, gate-test suites. evolve release-consistency already verifies the 6 version markers (plugin.json, marketplace.json, README, CHANGELOG, SKILL headings). Neither checks whether GitHub CI is actually green on the commit you're about to release from, nor screens for accidental WIP commits. This skill closes exactly those gaps — nothing more.
Defense-in-depth: /evo:publish now performs the same pre-release CI-green check itself (so a direct /evo:publish call is still gated) and adds a post-release watch of the released commit's go/CI workflows. Running /evo:release first stays the recommended path; evolve release (the raw binary) is gh-free and only prints a "CI not verified" advisory.
Procedure
Run in order. Any FAIL → print the reason and stop (do not delegate to /evo:publish).
- Preflight (5 gates) — read-only:
$CLAUDE_PROJECT_DIR/go/bin/evolve release-preflight <target> --dry-run
Non-zero exit → stop.
- Consistency (version markers):
$CLAUDE_PROJECT_DIR/go/bin/evolve release-consistency <target>
Non-zero exit → stop.
- Gap 1 — CI green on
main HEAD (requires gh; if absent, report "cannot verify CI" and stop):
gh run list --branch main --limit 1 --json headSha,status,conclusion,url
Confirm headSha matches git rev-parse origin/main, status == "completed", conclusion == "success". Anything else (in-progress, failure, stale SHA) → stop with the run URL.
- Gap 2 — no WIP/fixup commits since the last tag:
git log "$(git describe --tags --abbrev=0)..HEAD" --format=%s
If any subject matches ^(WIP|fixup!|squash!|amend!) → stop and list them.
- All green → delegate: invoke
/evo:publish <target> (pass --dry-run through if the user gave it). Report the readiness summary first so the user sees what passed.
Output
Emit a compact readiness table (✅/❌ per check) before delegating or stopping, e.g.:
| Check | Result |
|---|
| preflight (5 gates) | ✅ |
| version markers | ✅ |
| CI green on main HEAD | ❌ run failed (url) |
| no WIP/fixup commits | ✅ |
→ verdict: NOT READY (or READY → handing off to /evo:publish).
When NOT to use this skill
- To actually publish. This only gates.
/evo:publish executes.
- For ordinary commits. Use
/evo:commit.