release — Claude Code skill: what it does, how to install
This skill manages a project release by checking the changelog, installing git hooks, and updating release versions. Use it when the project has a defined release flow.
npx skills add tobi/qmd --skill release -a claude-codeWhat release does
The skill starts a release with /release <version> or /release patch. It gathers repository status, commits, changed files, the [Unreleased] section, and the previous release entry. It can commit outstanding work, prepare CHANGELOG.md, and then run scripts/release.sh <version>. That script updates versions in package.json and .claude-plugin/marketplace.json, creates a commit, and adds a tag.
Before cutting the release, the skill checks sqlite-vec, platform packages, node-llama-cpp, and better-sqlite3 with pnpm outdated. Dependencies must use exact versions. It prints the resulting changelog and waits for confirmation before running git push origin main --tags.
Git hooks are installed by the context script, through skills/release/scripts/install-hooks.sh, or during bun install. The pre-push hook checks the package version, the matching CHANGELOG.md entry, and GitHub CI before allowing v* tags to be pushed. Check GitHub CI access before relying on that gate.
What it helps with
- validate the changelog before cutting a version
- collect commits and file changes for release notes
- synchronize project and plugin versions
- install git hooks that check release tags
- hold the push until the changelog is confirmed
Example prompts for the agent
- Run `/release 1.0.5` and prepare the release after checking the changelog.
- Cut the next patch release with `/release patch`.
- Review the final changelog and wait for confirmation before pushing the tags.
How to install release
1Skills CLI (Vercel)
npx skills add tobi/qmd --skill release -a claude-code2Manually: put the files in place
~/.claude/skills/release/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/release/
1Skills CLI (Vercel)
npx skills add tobi/qmd --skill release -a codex2Manually: put the files in place
.agents/skills/release/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add tobi/qmd --skill release -a cursor2Manually: put the files in place
.cursor/skills/release/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install tobi/qmd release2Manually: put the files in place
.github/skills/release/SKILL.md1Skills CLI (Vercel)
npx skills add tobi/qmd --skill release -a gemini-cli2Platform CLI
gemini skills install https://github.com/tobi/qmd --path skills/releaseManually: put the files in place
.devin/skills/release/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add tobi/qmd --skill release -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set2
The whole set →Similar
Questions about release
How do I install release in Claude Code?
Run npx skills add tobi/qmd --skill release -a claude-code, then run npx skills add tobi/qmd --skill release -a claude-code again and check ~/.claude/skills/release/SKILL.md.
What does release do?
The skill gathers repository context, checks the changelog and selected dependencies, updates project versions, and creates a commit and tag. It shows the final changelog before asking for confirmation to push.
What does the pre-push hook check?
It checks that the package.json version matches the tag, that CHANGELOG.md contains the release entry, and that GitHub CI has passed.
Source text
SKILL.md · MIT
--- name: release description: Manage releases for this project. Validates changelog, installs git hooks, and cuts releases. Use when user says "/release", "release 1.0.5", "cut a release", or asks about the release process. NOT auto-invoked by the model. disable-model-invocation: true --- # Release Cut a release, validate the changelog, and ensure git hooks are installed. ## Usage `/release 1.0.5` or `/release patch` (bumps patch from current version). ## Process When the user triggers `/release <version>`: 1. **Gather context** — run `skills/release/scripts/release-context.sh <version>`. This silently installs git hooks and prints everything needed: version info, working directory status, commits since last release, files changed, current `[Unreleased]` content, and the previous release entry for style reference. 2. **Commit outstanding work** — if the context shows staged, modified, or untracked files that belong in this release, commit them first. Use the /commit skill or make well-formed commits directly. 3. **Write the changelog** — if `[Unreleased]` is empty, write it now using the commits and file changes from the context output. Follow the changelog standard below. Re-run the context script after committing if needed. 4. **Check dependency updates** — before cutting the release, check for updates to `sqlite-vec` (and platform packages), `node-llama-cpp`, and `better-sqlite3`. Run `pnpm outdated` and report any available updates for these packages. If updates exist, bump them (pinned, no `^` ranges) and re-run tests before proceeding. 5. **Cut the release** — run `scripts/release.sh <version>`. This renames `[Unreleased]` → `[X.Y.Z] - date`, inserts a fresh `[Unreleased]`, bumps `package.json` and the plugin version in `.claude-plugin/marketplace.json` (so installed plugins see the update), commits, and tags. 6. **Show the final changelog** — print the full `[Unreleased]` + minor series rollup via `scripts/extract-changelog.sh <version>`. Ask the user to confirm before pushing. 7. **Push** — after explicit confirmation, run `git push origin main --tags`. 8. **Watch CI** — after the push, start a background dispatch to watch the publish workflow. Use `interactive_shell` in dispatch mode with: ``` gh run watch $(gh run list --workflow=publish.yml --limit=1 --json databaseId --jq '.[0].databaseId') --exit-status ``` The agent will be notified when CI completes and should report the result. If any step fails, stop and explain. Never force-push or skip validation. ## Dependency Policy All dependencies must be pinned to exact versions (no `^` or `~` ranges). The lockfile ensures reproducible installs. When adding or updating any dependency, always use the exact version string (e.g. `"3.18.1"` not `"^3.18.1"`). ## Changelog Standard The changelog lives in `CHANGELOG.md` and follows [Keep a Changelog](https://keepachangelog.com/) conventions. ### Heading format - `## [Unreleased]` — accumulates entries between releases - `## [X.Y.Z] - YYYY-MM-DD` — released versions ### Structure of a release entry Each version entry has two parts: **1. Highlights (optional, 1-4 sentences of prose)** Immediately after the version heading, before any `###` section. The elevator pitch — what would you tell someone in 30 seconds? Only for significant releases; skip for small patches. ```markdown ## [1.1.0] - 2026-03-01 QMD now runs on both Node.js and Bun, with up to 2.7x faster reranking through parallel contexts. GPU auto-detection replaces the unreliable `gpu: "auto"` with explicit CUDA/Metal/Vulkan probing. ``` **2. Detailed changelog (`### Changes` and `### Fixes`)** ```markdown ### Changes - Runtime: support Node.js (>=22) alongside Bun. The `qmd` wrapper auto-detects a suitable install via PATH. #149 (thanks @igrigorik) - Performance: parallel embedding & reranking — up to 2.7x faster on multi-core machines. ### Fixes - Prevent VRAM waste from duplicate context creation during concurrent `embedBatch` calls. #152 (thanks @jkrems) ``` ### Writing guidelines - **Explain the why, not just the what.** The changelog is for users. - **Include numbers.** "2.7x faster", "17x less memory". - **Group by theme, not by file.** "Performance" not "Changes to llm.ts". - **Don't list every commit.** Aggregate related changes. - **Credit contributors:** end bullets with `#NNN (thanks @username)` for external PRs. No need to credit the repo owner. ### What not to include - Internal refactors with no user-visible effect - Dependency bumps (unless fixing a user-facing bug) - CI/tooling changes (unless affecting the release artifact) - Test additions (unless validating a fix worth mentioning) ## GitHub Release Notes Each GitHub release includes the full changelog for the **minor series** back to x.x.0. The `scripts/extract-changelog.sh` script handles this, and the publish workflow (`publish.yml`) calls it to populate the GitHub release. ## Git Hooks The pre-push hook (`scripts/pre-push`) blocks `v*` tag pushes unless: 1. `package.json` version matches the tag 2. `CHANGELOG.md` has a `## [X.Y.Z] - date` entry for the version 3. CI passed on GitHub (warns in non-interactive shells, blocks in terminals) Hooks are installed silently by the context script. They can also be installed manually via `skills/release/scripts/install-hooks.sh` or automatically via `bun install` (prepare script).
© tobi · MIT · tobi/qmd