qmd/skills/release/SKILL.md
Tobi Lutke 79a53f856e
docs(release): add dependency pinning policy and update check step
Release process now checks for sqlite-vec, node-llama-cpp, and
better-sqlite3 updates before cutting a release. All deps must be
pinned to exact versions.
2026-04-05 18:17:13 -04:00

140 lines
5.3 KiB
Markdown

---
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. **Cut the release** — run `scripts/release.sh <version>`. This renames
`[Unreleased]``[X.Y.Z] - date`, inserts a fresh `[Unreleased]`,
bumps `package.json`, commits, and tags.
5. **Show the final changelog** — print the full `[Unreleased]` +
minor series rollup via `scripts/extract-changelog.sh <version>`.
Ask the user to confirm before pushing.
6. **Push** — after explicit confirmation, run `git push origin main --tags`.
7. **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.
7. **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.
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).