fix(plugin): gate releases on the manifest version, and bump to 1.0.1 #6

Merged
john merged 1 commit from fix/plugin-version-gate into main 2026-08-01 12:16:36 +00:00
Owner

plugin.json has read 1.0.0 since 07576bb, the only commit that ever touched it. The plugin cache is keyed on that string, so v0.1.1 and v0.1.2 shipped to no installed copy, mine included.

Bumps to 1.0.1, which carries the 1h cache-write fix out. Verified end to end in a throwaway config dir: install at 1.0.0, bump, 'claude plugin update burnrate@burnrate' reports 1.0.0 -> 1.0.1 and writes a new version directory beside the old one. No uninstall, nothing removed by hand.

The old test asserted version was truthy, which passes forever at 1.0.0. It now asserts a v* tag on HEAD names the version committed at HEAD. Since a test only helps when run, .githooks/pre-push refuses the tag push itself on a mismatch, and a case fails if the hook disappears or loses its execute bit. Hook proven against a scratch remote: mismatch blocked, match accepted, ship-without-bump blocked, deletions allowed.

plugin.json has read 1.0.0 since 07576bb, the only commit that ever touched it. The plugin cache is keyed on that string, so v0.1.1 and v0.1.2 shipped to no installed copy, mine included. Bumps to 1.0.1, which carries the 1h cache-write fix out. Verified end to end in a throwaway config dir: install at 1.0.0, bump, 'claude plugin update burnrate@burnrate' reports 1.0.0 -> 1.0.1 and writes a new version directory beside the old one. No uninstall, nothing removed by hand. The old test asserted version was truthy, which passes forever at 1.0.0. It now asserts a v* tag on HEAD names the version committed at HEAD. Since a test only helps when run, .githooks/pre-push refuses the tag push itself on a mismatch, and a case fails if the hook disappears or loses its execute bit. Hook proven against a scratch remote: mismatch blocked, match accepted, ship-without-bump blocked, deletions allowed.
An installed plugin lives in <config>/plugins/cache/burnrate/burnrate/
<version>/, keyed on .claude-plugin/plugin.json. `claude plugin update`
compares that string and refetches nothing when it has not moved, which is
correct behavior and exactly what a version number is for. plugin.json has
been modified once in this repository's life, in 07576bb, and has read 1.0.0
ever since. v0.1.1 and v0.1.2 therefore shipped to nobody: my own cache still
held a copy predating both, missing CONTRIBUTING.md entirely and running the
old cache-write weights.

This bumps the manifest to 1.0.1, which carries the 1h cache-write fix out to
every installed copy. Verified end to end in a throwaway config dir rather
than assumed: install at 1.0.0, bump, `claude plugin update burnrate@burnrate`
reports 1.0.0 -> 1.0.1, writes a new version directory beside the old one, and
needs no uninstall. Nobody has to remove anything by hand.

The reason it went unnoticed for two releases is that the only test touching
the version asserted it was truthy, which passes forever at 1.0.0. That is a
presence check wearing a coverage check's clothes. It now asserts the version
MOVED: a v* tag on HEAD must name the version committed at HEAD.

A test only helps when someone runs it, and forgetting to run it is the same
class of mistake as forgetting to bump. So .githooks/pre-push refuses the tag
push itself when the name disagrees with the manifest at that commit, and a
second case fails if the hook goes missing or loses its execute bit.
CONTRIBUTING documents the order, manifest first and tag second, and says why.
john merged commit c0ada55d01 into main 2026-08-01 12:16:36 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: crenshawdev/burnrate#6
No description provided.