# Cut Release

> Cut a release atomically — bump version, date the CHANGELOG section, commit, tag. Invoke with /cut-release X.Y.Z.

- Skill: `thomasrohde/cut-release` (Agent Skill)
- Install (CLI): `npx skillmds@latest add thomasrohde/cut-release`
- Raw SKILL.md: https://api.skillmd.com/api/skills/thomasrohde/cut-release/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: thomasrohde (https://skillmd.com/u/thomasrohde)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/thomasrohde/cut-release

---


Version to release: `$ARGUMENTS`.

Preflight:

1. `git status --porcelain` — must be empty. If not, stop and tell the user.
2. `python -c "import mdvw; print(mdvw.__version__)"` — must end in `.devN`. If not, stop and tell the user to run `--post-release` first or amend manually.
3. Confirm `## [Unreleased]` in `CHANGELOG.md` has real notes (not just the placeholder comment). If it looks empty, ask the user to confirm before proceeding.

Then run the `/verify` skill — don't cut a release on a failing tree.

If all green, run:

```bash
python scripts/release.py $ARGUMENTS
```

Report the resulting commit SHA and tag. Then print the push command verbatim for the user to run:

```
git push origin main v$ARGUMENTS
```

**Do not push automatically.** The tag push triggers `release.yml` which publishes to PyPI — that's a decision for the user.

After they've pushed (and the release has landed), suggest:

```
python scripts/release.py --post-release <next>.dev0
```

to reopen the dev cycle.

