Releasing
How to cut a warden release: bump the version, write the notes, tag it, move stable, and prove it on a real project before the next one.
How a release reaches projects#
Projects add the marketplace as thucxuong/warden#stable, so they track the stable branch. A commit on main reaches nobody until stable moves to it. Claude Code sees an update when the version in plugins/warden/.claude-plugin/plugin.json changes on stable.
At the project's next session start, warden prints:
warden: version <v> is available; this session runs <old>. ...when the local marketplace copy is newer than the running plugin (no network is used for this);warden: updated to <v>; this project is on <old>. ...once the new plugin runs and the project's.warden/warden.jsonstill names the old version. The project's agent then offers/warden:upgrade, which applies the upgrade notes.
Diagram source (Mermaid)
flowchart LR
main["main<br/>(work)"] --> tag["tag vX.Y.Z"] --> stable["stable<br/>(fast-forward)"] --> update["projects: plugin update"] --> upgrade["/warden:upgrade<br/>(upgrade notes)"]Steps#
-
Bump the version in both files, in the release commit:
plugins/warden/.claude-plugin/plugin.json(version)package.json(version)
tests/unit/manifest.test.tsfails when they differ. Never put a version in.claude-plugin/marketplace.json. -
Add the changelog section at the top of
CHANGELOG.md:markdown## 0.6.2 — 2026-10-20 - One line per change, in plain words, as a project would read it. -
Write the upgrade note
plugins/warden/upgrades/v0.6.2.md. Every version gets one. It starts withNo layout changes.when the project's files need nothing, or with a numbered list of exact edits. The project's agent applies the note word for word, so write each edit so it needs no judgement.warden upgrade --notesprints the notes of every version above the project'swardenVersionand up to the installed one, oldest first.warden upgrade --donethen setswardenVersion. -
Check everything:
bashbun run check bun run ui:check bun run test:ui bun run validatecheckis the type check plus the full test suite.ui:checkfails when the committedplugins/warden/site-dist/is not a fresh build ofsite-ui/(runbun run ui:buildand commit it).test:uiruns the Playwright tests of the site.validaterunsclaude plugin validate --stricton the marketplace and on the plugin. -
Commit on
main. The message starts with the version and a summary of the changes, for example0.6.2: <what changed>. -
Tag and push:
bashgit tag v0.6.2 git push origin main v0.6.2 -
Fast-forward
stableto the tag once CI is green on the pushed commit. Never force it:bashgit fetch origin git merge-base --is-ancestor origin/stable v0.6.2 git push origin v0.6.2^{commit}:refs/heads/stableIf
merge-baseexits 1,stablehas commits that the tag does not. Stop and find out why. -
Close the reports that the release fixes:
bashplugins/warden/bin/warden report set <key> --status fixed --fixed-in 0.6.2Each project sees the new status at its next session start. See Triage.
-
Re-register the doorbell if the release changed
scripts/wa-register.tsor the triage skill's allowed commands:bun scripts/wa-register.ts.
Verify in the playground#
A release is not done when the tests pass. Each version is proven on a real consumer project, the playground, before work on the next version starts.
- Update the plugin in the playground and let its agent run
/warden:upgrade. - Have the playground's agent do one to three real tickets that use what the release changed. Use a cheaper model (Sonnet or Haiku); the goal is to test warden, not to build the app.
- The playground's agent reports what goes wrong with warden through
/warden:reportand the retro, as any project would. The doorbell triages the reports. - Fix the real bugs, release a patch, mark the reports fixed, and upgrade the playground again.
- Repeat until a round finds no real warden problem. Then start the next version.
Grow the playground one ticket at a time, only as far as a warden feature needs. Its menu of possible features is in playground requirements. Do not spend long on a flaky test: fix it fast or set it aside.
See also#
- Maintainers overview
- Triage
- Contributing
- Upgrading (the project side)
- Installation