releaselisted
Install: claude install-skill sofiane-git/shipmate
# shipmate:release — cut a release (state machine)
Requires `.shipmate.json` (run `shipmate:init` first). Run states in order. Scripts are at
`${CLAUDE_PLUGIN_ROOT}/scripts/`. Never perform an irreversible action (tag/push-tag/
release) before the CHECKPOINT go.
## State 1 — PRE-FLIGHT (all guards must pass; nothing written yet)
Run, in order, aborting on the first failure:
1. `check-preconditions.sh <remote>` — clean tree, up to date, gh auth, remote reachable.
2. For each tagged contract: `render-tag.sh` then `check-tag-unpushed.sh <remote> <tag>`.
3. `verify-remote.sh <remote>`.
4. `version-sync-check.sh .shipmate.json`.
## State 2 — PLAN (no writes)
- Determine the diff since the **primaryContract**'s last tag. **If no tag exists yet (a
repo's first-ever release), fall back to the diff from the repository's initial commit**
(`git rev-list --max-parents=0 HEAD`) — i.e. the whole history. The curated
`[Unreleased]` section drives the notes either way. This is NOT the shipmate chicken/egg
(§7 of the design): any consuming repo's first release works because shipmate is already
installed; it just has no prior tag to diff from.
- Classify the SemVer bump **per contract** using documented nuance (e.g. tightening an
already-documented contract = PATCH, not MAJOR). Skip `bumpFrom: "manual"` contracts
unless `--bump <name>` was passed. Present the proposed version(s) + reasoning.
- Author/finalize the curated `CHANGELOG.md [Unreleased]` content (the *why*, not just