How to ship a new version of the coding plugin. Mandatory reading before tagging or bumping plugin JSONs.
Unlike vault-cli / dark-factory / semantic-search which ship both a binary and a plugin, coding is plugin-only: docs + commands + agents + skills, distributed via the Claude Code marketplace. There is no Go or Python binary.
| Surface | Versioned by | Consumed by | Bumped how |
|---|---|---|---|
| Plugin | CHANGELOG.md top entry + .claude-plugin/plugin.json version + .claude-plugin/marketplace.json (metadata.version AND plugins[0].version) |
Claude Code via the marketplace | Manual — operator bumps the four fields together |
All four version strings MUST equal each other at release time:
CHANGELOG.md— top## vX.Y.Zentry.claude-plugin/plugin.json—"version".claude-plugin/marketplace.json—metadata.version.claude-plugin/marketplace.json—plugins[0].version
The check is release-time only — make precommit does NOT run it.
Why not in precommit: every refactor commit would otherwise have to bump plugin JSONs in lockstep, burning release numbers on internal work. Drift during development is fine; alignment is enforced when versions are bumped for a release. (Same lesson dark-factory, vault-cli, and semantic-search apply.)
make precommit is the development gate (link check + JSON syntax). It does NOT cover real Claude Code load, slash-command surfaces, or marketplace ingestion.
Until a scenarios/ regression suite exists, the operator must manually exercise:
- Reload Claude Code with the plugin source mounted; verify
commands/,agents/,skills/load without errors - Smoke-test at least one slash command (e.g.
/coding:code-review) end-to-end - Inspect any new docs added under
docs/for broken cross-references not caught bycheck-links
If any check fails, fix before tagging.
scripts/check-versions.sh enforces the locked model. Run via make check-versions, or via make release-check (which adds make precommit first).
make release-check # full gate: precommit + check-versions
# or, just the version check:
make check-versions
# or directly:
bash scripts/check-versions.shNOT wired into make precommit — see "Version alignment" above for why.
-
Land all changes for the release on
master. -
Pick the next version. Increment per SemVer based on what changed (patch for fixes, minor for new commands/agents/skills, major for breaking).
-
Update all four version fields to the new value (no
vprefix in JSON):.claude-plugin/plugin.json"version".claude-plugin/marketplace.jsonmetadata.version.claude-plugin/marketplace.jsonplugins[0].version- Add a
## vX.Y.Zsection at the top ofCHANGELOG.mdsummarising every change since the previous tag
-
Run
make release-check— must passprecommitANDcheck-versions. -
Commit:
git commit -am "release vX.Y.Z: <summary>". -
Tag and push:
git tag vX.Y.Z git push && git push --tags -
Verify: the marketplace re-checks periodically; new sessions load the bumped plugin automatically.
- Forgetting one of the three
.claude-plugin/JSON fields. The marketplace rejects mismatches silently and refuses to load the plugin. - Creating a separate "Plugin vX" CHANGELOG section. Wrong — there is one CHANGELOG.
- Bumping versions BEFORE running the release gate. Surface changes that ship in the same release escape the manual smoke check.
CLAUDE.md§ "Version Alignment — MANDATORY"CHANGELOG.md— historical record + top entry as the version source-of-truthscripts/check-versions.sh— script behindmake check-versions