| name | release |
| description | Release a new version of iosef. Use when the user asks to release, publish, tag a version, or push to PyPI. Handles version bumping, building, tagging, and pushing. Do NOT use for regular development pushes to main (use jj-just-push-main for that). |
Release Workflow
Versioning
We are pre-1.0. Always use v0.x.y versions. Do not tag v1.* until explicitly decided.
- Patch (
v0.x.Y): bug fixes, minor tweaks
- Minor (
v0.X.0): new features, new MCP tools, behavioral changes
Steps
-
Bump serverVersion in Sources/iosef/Utilities.swift to the target semver.
-
Build and verify:
swift build -c release
.build/release/iosef --version
-
Push to main (if not already there). Use /jj-just-push-main or equivalent.
-
Choose the version — check existing tags:
git --git-dir=$(jj git root) tag -l 'v*'
-
Tag and push the tag:
git --git-dir=$(jj git root) tag v{VERSION} {COMMIT_HASH}
git --git-dir=$(jj git root) push origin v{VERSION}
jj git fetch
If tagging the current jj working copy, find its git commit with jj log -r @ --no-graph -T commit_id.
-
Monitor CI: The v* tag triggers .github/workflows/release.yaml, which builds arm64 and x86_64 binaries separately via SwiftPM, combines them with lipo into a universal2 binary, and publishes the wheel to PyPI.
-
Verify on PyPI once the workflow completes:
pip index versions iosef
Checklist
Gotchas
- The
serverVersion constant is used by both iosef --version and the MCP server's version field. Always bump it.
- In jj repos,
jj doesn't manage git tags — use git --git-dir=$(jj git root) for tag operations.
- CI builds each arch separately via SwiftPM (
swift build -c release), not --arch flags (which trigger Xcode's build system and break on CI).