Release
Typical flow: open PR → merge to main → release checklist → tag + push
Do not tag from a feature branch. Release only from main after shipped work
is merged.
Saying release means the full sequence below (Phase 0 → A → B), including
commit / tag / push for the release artifacts unless the user says otherwise
(e.g. “prepare the release but don’t push”).
User shorthand
| User says |
Agent does |
| go |
Open PR for current branch (pr skill); do not merge or release |
| merge |
Phase A only — merge PR, sync main |
| release / /release / ship |
Phase 0 → Phase A → Phase B (PR, merge, then release) |
| merge and release / merge + release |
Same as release when a PR already exists (Phase A → B); if none, run Phase 0 first |
Phase 0 — Open PR
Run before merge and version bump. Follow the pr skill.
- Branch — work must be on a feature branch (not
main). Create one if
needed; commit release-prep changes (skill edits, version, changelog) on that
branch when this pack or app is what you are shipping.
- Open or reuse PR — if an open PR already exists for the branch, use it;
otherwise push (user asked to release ⇒ push is in scope) and
gh pr create.
- Note the PR number and URL before merging.
Skip Phase 0 only when
- An open PR for the work already exists → continue at Phase A, or
- HEAD is already on
main, clean, and the commits to ship are already merged
→ continue at Phase B (tag/version only). Do not invent an empty PR.
Phase A — Merge PR to main
Run before tagging. Prefer merging the PR from Phase 0 (or the existing open PR).
Confirm the PR — open PR exists, CI/review acceptable, scope matches what
the user asked to ship. Note the PR number.
Merge via GitHub CLI when GitHub is the host (preferred):
gh pr merge <number> --merge --delete-branch
Use --squash or --rebase only when the team explicitly requests it;
default is --merge.
Sync local main:
git checkout main
git pull origin main
Verify — git log -1 --oneline shows the merge commit on main.
Local branch only (no PR)
If work never went through a PR (rare — quick solo fix) and the user still said
release, open a PR first (Phase 0) unless they explicitly waive it. If they
waive PR:
- Ensure the branch is clean (no uncommitted changes).
git checkout main && git pull origin main
- Merge the branch per project convention (prefer
--ff-only when possible).
- Resolve conflicts before continuing. Do not release with unresolved conflicts.
Phase B — Release checklist
All steps run on main after Phase A (or when Phase 0/A were correctly skipped
because work was already on main).
If version / changelog were already landed in the merged PR, Phase B is:
verify → tag → push tag → gh release create. Do not double-bump.
Pre-release gate
Checklist
- Version policy — infer from repo (semver tags, conventional commits, or
project docs such as
.github/commands/release.md)
- Bump — update version in all synced places (e.g.
package.json,
apps/*/package.json, lockfiles if required, app manifests) if not already
in the merged PR
- Changelog — add entry (create
CHANGELOG.md / docs/changelog.md if the
project uses one and it is missing). Group by user-visible domain; ban filler
bullets.
- README — when the project ships from
main with a version badge or
"current release" line, update in the same release commit
- Docs — run document
organize checks if the project has a docs tree
- Code docs — JSDoc / docstrings on new public APIs if that is project norm
- Verify — production build and tests (follow project release command if
present)
- Commit — if Phase B still has uncommitted release files: conventional
message, e.g.
release: vX.Y.Z — <short summary>. Stage only release
files — exclude unrelated untracked WIP. Prefer landing these in Phase 0’s PR
so main only needs a tag after merge.
- Tag and push —
git tag vX.Y.Z, then git push origin main (if needed)
and git push origin vX.Y.Z, then gh release create when GitHub is the host
Hotfix
If patching production: confirm base branch (tag vs main), bump patch only
unless breaking.
Conventional commits (if used)
feat: → minor
fix: / chore: → patch
- Breaking change → major (confirm with user if unclear)
Report
- PR opened/merged (number + URL) when Phase 0/A ran
- New version number
- Changelog summary
- Commands run and results
- Anything left manual (store submission, deploy, etc.)
Skill pack repo (cursor-agent-skills)
When releasing this distribution (not an app under development), use the same
Phase 0 → A → B flow:
- Branch + bump
version and syncedAt in manifest.json (semver)
- Add section to
CHANGELOG.md for the new version
- Run
node scripts/validate-skills.mjs
- Update README if skills were added or renamed
- Open PR → merge → sync
main
git tag -a vX.Y.Z and gh release create vX.Y.Z with notes from the
latest changelog section only
- Remind users to
git pull and run install.sh or install.ps1
Related skills
- pr — open PR (Phase 0; user says
go for PR-only)
- document — changelog and docs accuracy
- test — verify before tagging
1---2name: release3description: Full ship flow: open a PR, merge it to main, then cut a semver release (version bump, changelog, docs, build verify, tag, push). Use when the user says release, /release, ship, or merge and release. Only commit, tag, or push as part of this requested flow (or when the user explicitly asks).4---56# Release78**Typical flow:** **open PR → merge to `main` → release checklist → tag + push**910Do **not** tag from a feature branch. Release only from `main` after shipped work11is merged.1213Saying **release** means the full sequence below (Phase 0 → A → B), including14commit / tag / push for the release artifacts unless the user says otherwise15(e.g. “prepare the release but don’t push”).1617## User shorthand1819| User says | Agent does |20| --------- | ---------- |21| **go** | Open PR for current branch (**pr** skill); do **not** merge or release |22| **merge** | Phase A only — merge PR, sync `main` |23| **release** / **/release** / **ship** | Phase 0 → Phase A → Phase B (PR, merge, then release) |24| **merge and release** / **merge + release** | Same as **release** when a PR already exists (Phase A → B); if none, run Phase 0 first |2526---2728## Phase 0 — Open PR2930Run **before** merge and version bump. Follow the **pr** skill.31321. **Branch** — work must be on a feature branch (not `main`). Create one if33 needed; commit release-prep changes (skill edits, version, changelog) on that34 branch when this pack or app is what you are shipping.352. **Open or reuse PR** — if an open PR already exists for the branch, use it;36 otherwise push (user asked to release ⇒ push is in scope) and `gh pr create`.373. **Note** the PR number and URL before merging.3839### Skip Phase 0 only when4041- An open PR for the work already exists → continue at Phase A, or42- HEAD is already on `main`, clean, and the commits to ship are already merged43 → continue at Phase B (tag/version only). Do **not** invent an empty PR.4445---4647## Phase A — Merge PR to `main`4849Run **before** tagging. Prefer merging the PR from Phase 0 (or the existing open PR).50511. **Confirm the PR** — open PR exists, CI/review acceptable, scope matches what52 the user asked to ship. Note the PR number.532. **Merge via GitHub CLI** when GitHub is the host (preferred):5455 ```powershell56 gh pr merge <number> --merge --delete-branch57 ```5859 Use `--squash` or `--rebase` only when the team explicitly requests it;60 default is `--merge`.613. **Sync local `main`:**6263 ```powershell64 git checkout main65 git pull origin main66 ```67684. **Verify** — `git log -1 --oneline` shows the merge commit on `main`.6970### Local branch only (no PR)7172If work never went through a PR (rare — quick solo fix) and the user still said73**release**, open a PR first (Phase 0) unless they explicitly waive it. If they74waive PR:75761. Ensure the branch is clean (no uncommitted changes).772. `git checkout main && git pull origin main`783. Merge the branch per project convention (prefer `--ff-only` when possible).794. Resolve conflicts before continuing. Do not release with unresolved conflicts.8081---8283## Phase B — Release checklist8485All steps run on **`main`** after Phase A (or when Phase 0/A were correctly skipped86because work was already on `main`).8788If version / changelog were already landed in the merged PR, Phase B is:89verify → tag → push tag → `gh release create`. Do not double-bump.9091### Pre-release gate9293- [ ] Scoped from last tag (`git log vLAST..HEAD`, `git diff --stat vLAST..HEAD`)94- [ ] Version bumped in every place the project syncs95- [ ] Changelog entry written (grounded in the diff)96- [ ] Build + tests green97- [ ] Docs updated if public API or behavior changed98- [ ] Tag / push in scope (default **yes** when the user said **release**)99100### Checklist1011021. **Version policy** — infer from repo (semver tags, conventional commits, or103 project docs such as `.github/commands/release.md`)1042. **Bump** — update version in all synced places (e.g. `package.json`,105 `apps/*/package.json`, lockfiles if required, app manifests) if not already106 in the merged PR1073. **Changelog** — add entry (create `CHANGELOG.md` / `docs/changelog.md` if the108 project uses one and it is missing). Group by user-visible domain; ban filler109 bullets.1104. **README** — when the project ships from `main` with a version badge or111 "current release" line, update in the **same release commit**1125. **Docs** — run **document** `organize` checks if the project has a docs tree1136. **Code docs** — JSDoc / docstrings on new public APIs if that is project norm1147. **Verify** — production build and tests (follow project release command if115 present)1168. **Commit** — if Phase B still has uncommitted release files: conventional117 message, e.g. `release: vX.Y.Z — <short summary>`. Stage **only** release118 files — exclude unrelated untracked WIP. Prefer landing these in Phase 0’s PR119 so `main` only needs a tag after merge.1209. **Tag and push** — `git tag vX.Y.Z`, then `git push origin main` (if needed)121 and `git push origin vX.Y.Z`, then `gh release create` when GitHub is the host122123## Hotfix124125If patching production: confirm base branch (tag vs `main`), bump **patch** only126unless breaking.127128## Conventional commits (if used)129130- `feat:` → minor131- `fix:` / `chore:` → patch132- Breaking change → major (confirm with user if unclear)133134## Report135136- PR opened/merged (number + URL) when Phase 0/A ran137- New version number138- Changelog summary139- Commands run and results140- Anything left manual (store submission, deploy, etc.)141142---143144## Skill pack repo (`cursor-agent-skills`)145146When releasing **this** distribution (not an app under development), use the same147**Phase 0 → A → B** flow:1481491. Branch + bump `version` and `syncedAt` in `manifest.json` (semver)1502. Add section to `CHANGELOG.md` for the new version1513. Run `node scripts/validate-skills.mjs`1524. Update README if skills were added or renamed1535. Open PR → merge → sync `main`1546. `git tag -a vX.Y.Z` and `gh release create vX.Y.Z` with notes from the155 **latest** changelog section only1567. Remind users to `git pull` and run `install.sh` or `install.ps1`157158## Related skills159160- **pr** — open PR (Phase 0; user says `go` for PR-only)161- **document** — changelog and docs accuracy162- **test** — verify before tagging