You are cutting a new app version — reviewing what changed since the last release and producing a structured version record.
Custom instructions: If the user included extra instructions when invoking this skill, treat them as overriding or extending the guidance below.
Read:
.docs/versions.json — previous versions (if exists)
.docs/changelog.md — running log of completed work and command runs (format: .docs/changelog-spec.md)
- Recent git history — commits since the last version's date (or all commits if no versions exist yet)
Your task:
1. Gather changes
- Find the date of the last version in
.docs/versions.json. If no versions exist, treat all changelog entries and recent commits as new.
- Collect everything that happened since that date:
- Entries from
.docs/changelog.md
- Meaningful commits from git history (skip merge commits, typo fixes, and other noise)
- Deduplicate — if a changelog entry and a commit describe the same thing, keep one.
2. Summarize
- Group changes into a short list of human-readable bullet points (max ~8 items).
- Each item should be ≤15 words, written for an end user, not a developer. Think release notes, not commit messages.
- If there's nothing meaningful since the last version, tell the user and stop.
3. Decide whether to cut at all
Most check-ins should not produce a version. Version numbers are a communication device for whoever uses the software; inflating them destroys that signal, and an agent cutting a release per merge will burn through eighty versions in a week while the product stands still.
Apply this test first: has anything changed that a user of this software would notice? If not, say so and stop. The following are not versions on their own:
- Scaffolding, project setup, folder structure, config
- Documentation, README, comments, changelog tidying
- Refactors, renames, formatting, lint fixes
- CI, build tooling, test-only changes
- Dependency bumps with no visible effect
- Work in progress toward a feature that isn't usable yet
Also don't cut if the last version was minutes ago, or if the summary would amount to a single trivial line. Batch it — wait until there's a coherent set of changes worth announcing. When in doubt, don't cut; the next run will pick everything up.
4. Propose version
Follow Semantic Versioning (MAJOR.MINOR.PATCH) — the specification the rest of the ecosystem already assumes.
The rules below are a summary, not the authority. When a case is genuinely ambiguous, fetch https://semver.org and follow what it says now — that URL always serves the current specification, so the spec can move on without this skill being rewritten. Same for https://www.conventionalcommits.org if a commit-type question is unclear. Don't guess from memory, and don't assume the summary here is complete.
- Start at
0.1.0.
- Pre-1.0 (
0.y.z) — where most projects live for a long time. SemVer treats major version zero as initial development, so the rules shift down one level:
- Minor (
0.X.0) — new features, visible UI changes, breaking changes, anything substantial
- Patch (
0.1.X) — fixes, copy changes, small tweaks
- Major stays at
0 until the user explicitly decides the software is stable and committed to its public interface. Never propose 1.0.0 on your own — that's a product decision, not a changelog one.
- Post-1.0, standard SemVer applies: MAJOR for breaking changes, MINOR for backwards-compatible features, PATCH for backwards-compatible fixes.
- Commit history is the cheapest input here: this project's commits follow Conventional Commits, so the types since the last version tell you the bump directly — any
BREAKING CHANGE: or ! → major (minor while pre-1.0), any feat: → minor, otherwise fix: → patch. Types like docs:, chore:, refactor:, test:, ci:, and style: contribute nothing to a version; if that's all there is since the last cut, there's no version to cut.
Show the user the summary and the proposed number, and let them confirm or adjust before anything is written.
5. Write
- Append a new entry to
.docs/versions.json (create the file if needed). Path is always .docs/versions.json. Format:
[
{
"version": "0.1.0",
"date": "YYYY-MM-DD",
"title": "Short milestone name",
"changes": [
"Change one",
"Change two"
]
}
]
- Keep the array sorted newest-first.
- Add a separator line in
.docs/changelog.md after the processed entries, exactly as defined in .docs/changelog-spec.md (e.g. --- v0.1.0 released)
RULES:
- Never write a version without the user confirming the number. Proposing one unprompted is fine and encouraged; deciding one silently is not.
- Prefer not cutting. A skipped version costs nothing — the changes roll into the next one. An unnecessary version is permanent.
- Keep the JSON clean and minimal. No metadata, no commit hashes, no timestamps beyond the date.
- The title should be 2-4 words capturing the milestone theme (e.g., "Project kickoff", "Auth flow", "Design polish").
- Don't remove entries from
.docs/changelog.md — just add the separator line so the next /version knows where to start (see .docs/changelog-spec.md).
1---2name: version3description: Cut a new app version — summarize changes since last release and write to versions.json. Use only when the user explicitly asks to cut a version or runs /version.4---56You are cutting a new app version — reviewing what changed since the last release and producing a structured version record.78**Custom instructions:** If the user included extra instructions when invoking this skill, treat them as overriding or extending the guidance below.910**Read:**1112- `.docs/versions.json` — previous versions (if exists)13- `.docs/changelog.md` — running log of completed work and command runs (format: `.docs/changelog-spec.md`)14- Recent git history — commits since the last version's date (or all commits if no versions exist yet)1516**Your task:**1718### 1. Gather changes1920- Find the date of the last version in `.docs/versions.json`. If no versions exist, treat all changelog entries and recent commits as new.21- Collect everything that happened since that date:22 - Entries from `.docs/changelog.md`23 - Meaningful commits from git history (skip merge commits, typo fixes, and other noise)24- Deduplicate — if a changelog entry and a commit describe the same thing, keep one.2526### 2. Summarize2728- Group changes into a short list of human-readable bullet points (max ~8 items).29- Each item should be ≤15 words, written for an end user, not a developer. Think release notes, not commit messages.30- If there's nothing meaningful since the last version, tell the user and stop.3132### 3. Decide whether to cut at all3334**Most check-ins should not produce a version.** Version numbers are a communication device for whoever uses the software; inflating them destroys that signal, and an agent cutting a release per merge will burn through eighty versions in a week while the product stands still.3536Apply this test first: **has anything changed that a user of this software would notice?** If not, say so and stop. The following are *not* versions on their own:3738- Scaffolding, project setup, folder structure, config39- Documentation, README, comments, changelog tidying40- Refactors, renames, formatting, lint fixes41- CI, build tooling, test-only changes42- Dependency bumps with no visible effect43- Work in progress toward a feature that isn't usable yet4445Also don't cut if the last version was minutes ago, or if the summary would amount to a single trivial line. Batch it — wait until there's a coherent set of changes worth announcing. When in doubt, don't cut; the next run will pick everything up.4647### 4. Propose version4849Follow **[Semantic Versioning](https://semver.org/)** (`MAJOR.MINOR.PATCH`) — the specification the rest of the ecosystem already assumes.5051The rules below are a summary, not the authority. **When a case is genuinely ambiguous, fetch <https://semver.org> and follow what it says now** — that URL always serves the current specification, so the spec can move on without this skill being rewritten. Same for <https://www.conventionalcommits.org> if a commit-type question is unclear. Don't guess from memory, and don't assume the summary here is complete.5253- Start at `0.1.0`.54- **Pre-1.0 (`0.y.z`) — where most projects live for a long time.** SemVer treats major version zero as initial development, so the rules shift down one level:55 - **Minor** (`0.X.0`) — new features, visible UI changes, breaking changes, anything substantial56 - **Patch** (`0.1.X`) — fixes, copy changes, small tweaks57 - Major stays at `0` until the user explicitly decides the software is stable and committed to its public interface. Never propose `1.0.0` on your own — that's a product decision, not a changelog one.58- **Post-1.0**, standard SemVer applies: MAJOR for breaking changes, MINOR for backwards-compatible features, PATCH for backwards-compatible fixes.59- Commit history is the cheapest input here: this project's commits follow **[Conventional Commits](https://www.conventionalcommits.org/)**, so the types since the last version tell you the bump directly — any `BREAKING CHANGE:` or `!` → major (minor while pre-1.0), any `feat:` → minor, otherwise `fix:` → patch. Types like `docs:`, `chore:`, `refactor:`, `test:`, `ci:`, and `style:` contribute **nothing** to a version; if that's all there is since the last cut, there's no version to cut.6061Show the user the summary and the proposed number, and **let them confirm or adjust before anything is written.**6263### 5. Write6465- Append a new entry to `.docs/versions.json` (create the file if needed). Path is always `.docs/versions.json`. Format:6667```json68[69 {70 "version": "0.1.0",71 "date": "YYYY-MM-DD",72 "title": "Short milestone name",73 "changes": [74 "Change one",75 "Change two"76 ]77 }78]79```8081- Keep the array sorted newest-first.82- Add a separator line in `.docs/changelog.md` after the processed entries, exactly as defined in `.docs/changelog-spec.md` (e.g. `--- v0.1.0 released`)8384**RULES:**8586- Never write a version without the user confirming the number. Proposing one unprompted is fine and encouraged; deciding one silently is not.87- Prefer not cutting. A skipped version costs nothing — the changes roll into the next one. An unnecessary version is permanent.88- Keep the JSON clean and minimal. No metadata, no commit hashes, no timestamps beyond the date.89- The title should be 2-4 words capturing the milestone theme (e.g., "Project kickoff", "Auth flow", "Design polish").90- Don't remove entries from `.docs/changelog.md` — just add the separator line so the next `/version` knows where to start (see `.docs/changelog-spec.md`).