This document describes how to create a new release of fmapi-codingagent-opskit.
The version string must match in all three files:
| File | Format | Example |
|---|---|---|
VERSION |
Single line, no prefix | 0.2.0 |
pyproject.toml |
version = "X.Y.Z" in [project] |
version = "0.2.0" |
.claude-plugin/plugin.json |
"version": "X.Y.Z" |
"version": "0.2.0" |
This project follows Semantic Versioning:
- MAJOR — incompatible changes to CLI flags, settings format, or hook behavior
- MINOR — new commands, flags, or features (backward-compatible)
- PATCH — bug fixes, documentation, and internal improvements
Note: While the version is
0.x, minor releases may include breaking changes. Stability guarantees begin at1.0.0.
git checkout main
git pull origin main
git checkout -b release/vX.Y.ZUpdate the version string in each file listed in Version Locations. All three must match.
# Verify they match after editing
grep -n 'version' VERSION pyproject.toml .claude-plugin/plugin.json- Rename
[Unreleased]to[X.Y.Z] - YYYY-MM-DD(use today's date) - Add a new empty
[Unreleased]section above it - Update the comparison links at the bottom:
[Unreleased]: https://github.com/anthonyivn2/fmapi-codingagent-opskit/compare/vX.Y.Z...HEAD
[X.Y.Z]: https://github.com/anthonyivn2/fmapi-codingagent-opskit/compare/vPREVIOUS...vX.Y.Zuv run ruff check src/ tests/
uv run ruff format --check src/ tests/
uv run pytestAll checks must pass before proceeding.
Open a pull request from release/vX.Y.Z into main. Use the Release PR template (.github/PULL_REQUEST_TEMPLATE/release.md).
gh pr create --title "Release vX.Y.Z" \
--template release.md \
--base main \
--head release/vX.Y.ZGet code owner approval, then merge.
After the PR is merged, tag the merge commit on main:
git checkout main
git pull origin main
git tag -a vX.Y.Z -m "Release vX.Y.Z"
git push origin vX.Y.Z- Go to the repo's Releases page
- Click Draft a new release
- Select the
vX.Y.Ztag - Title:
vX.Y.Z - Body: copy the changelog entry for this version
- Check Set as a pre-release (while version is
0.x) - Publish
Or via CLI:
gh release create vX.Y.Z --title "vX.Y.Z" \
--notes "$(sed -n '/^## \[X.Y.Z\]/,/^## \[/{ /^## \[X.Y.Z\]/d; /^## \[/d; p; }' CHANGELOG.md)" \
--prereleaseVerify the default install picks up the new release automatically:
bash <(curl -sL https://raw.githubusercontent.com/anthonyivn2/fmapi-codingagent-opskit/main/install.sh)
setup-fmapi-claudecode --versionAlso verify pinned version install:
bash <(curl -sL https://raw.githubusercontent.com/anthonyivn2/fmapi-codingagent-opskit/main/install.sh) --version X.Y.Z
setup-fmapi-claudecode --versionBoth should show X.Y.Z.
For urgent fixes to a released version:
- Branch from the release tag:
git checkout -b hotfix/vX.Y.Z vX.Y.Z - Apply the fix and bump the PATCH version
- Follow the same release checklist (steps 2–8)
Configure these rules on main via GitHub Settings > Branches > Add rule:
- Branch name pattern:
main - Require a pull request before merging
- Required approvals: 1
- Dismiss stale pull request approvals when new commits are pushed: enabled
- Require review from Code Owners: enabled
- Do not restrict who can push — leave admin bypass enabled (sole maintainer escape hatch)
- Save changes