How fhenix-toolkit versions get cut and what triggers a bump.
The plugin uses its own semver, decoupled from @cofhe/sdk and cofhe-contracts versions (SPEC §10):
| Plugin bump | When |
|---|---|
| Patch (0.1.0 → 0.1.1) | Bug fixes in skill content, lookup-recipe URL fixes, gotcha catalog corrections, doc fixes |
| Minor (0.1.0 → 0.2.0) | New concept files, new gotchas added to catalog, new lookup recipes, new skills landing into v1 scope |
| Major (0.x → 1.0, 1.x → 2.0) | Skill renames, activation-trigger changes, removed concepts, restructuring that breaks Skill(skill="...") invocations |
CoFHE upstream version bumps (@cofhe/sdk, cofhe-contracts) are handled separately via compatibility.json — see below.
- Pick a version. Look at what's landed in
## [Unreleased]ofCHANGELOG.mdsince the last tag. Match it against the table above. - Update version in three places — they have to stay in sync:
.claude-plugin/marketplace.json→metadata.versionANDplugins[0].versionplugins/fhenix-toolkit/.claude-plugin/plugin.json→versionCHANGELOG.md→ rename## [Unreleased]to## [X.Y.Z] — YYYY-MM-DDand add a fresh## [Unreleased]block above
- Open a release PR titled
[RELEASE] vX.Y.Z. The PR body summarizes the user-visible changes (copied / refined from the CHANGELOG entry). - Merge to main.
- Tag the merge commit:
git tag -a vX.Y.Z -m "vX.Y.Z — <short summary>" git push origin vX.Y.Z - Create the GitHub release (
gh release create vX.Y.Z --notes-file <release notes>). Release notes are typically the CHANGELOG entry for that version, lightly polished.
Users who installed with @FhenixProtocol pin to the latest published release once a tag exists.
compatibility.json declares which @cofhe/sdk and cofhe-contracts majors the curated content was authored against:
{
"@cofhe/sdk": "^0.5.0",
"@fhenixprotocol/cofhe-contracts": "^0.2.0"
}The plugin tracks a single major per upstream dep, not a matrix. When upstream majors, the plugin picks the new one and moves forward.
Per SPEC §9 and docs/ci.md:
- Upstream majors release.
- Workflows in
cofhesdk/cofhe-contractsfirerepository_dispatchinto this repo. on-cofhe-release.yml(not yet built) auto-opens a PR titledBump compatibility.json to vX.Y — review lookup recipes for drift.- Maintainer reviews drift, fixes whatever broke (renamed functions, removed flags, changed semantics), merges.
Until on-cofhe-release.yml lands, this is human-driven:
- Notice the upstream major release (subscribe to
cofhesdk/cofhe-contractsreleases on GitHub). - Bump
compatibility.jsonto the new caret range. - Run the lookup recipes locally against the new version — check that grepped symbols still resolve in the new source.
- Update any concept files / hard-rules that the new version changes.
- Cut a plugin minor or major release depending on how invasive the changes are.
The bump PR title convention is [CHORE] bump compatibility.json to vX.Y (or [FIX] if it also patches broken skill content).
These do not trigger a compatibility bump. The curated content shouldn't churn on them — concepts, hard rules, and the ACL taxonomy don't move on a minor release.
If a minor release breaks something (a renamed function, a changed default), it's caught by lookup-recipe-smoke.yml and surfaces as a CI failure on the next nightly run. That failure is the trigger to patch the recipe (and maybe the concept file that links to it), then cut a plugin patch release.
- Open a normal bug-fix PR against
main. - Add the fix entry under
## [Unreleased]in CHANGELOG. - Cut a patch release as soon as practical.
Don't sit on broken content. The plugin is teaching Claude how to write production-critical confidential code; silently-wrong skill output is the worst failure mode.
While we're in v0.x (pre-1.0):
- Tag often — every meaningful change can get a tag, since there are no external consumers being disrupted.
- Don't be precious about majors — a v0.x → v0.(x+1) major is cheap.
- Once we hit v1.0 (public release), tighten this up: minors land only after a working integration test against
cofhe-hardhat-starter, majors require a migration note in the release body.