Release process
specforge is versioned as a Cargo workspace ([workspace.package] version).
All crates share the same version.
Versioning
- MAJOR — breaking IR or CLI changes that break existing generate scripts
- MINOR — new languages, runtime features, backward-compatible IR additions
- PATCH — bug fixes, template fixes, docs
Current version: see Cargo.toml → [workspace.package].version.
Pre-release checklist
# 1. Full local CI
./scripts/ci.sh full
# 2. Explicit advanced e2e (included in full once wired; run directly too)
cargo test -p specforge-cli --test e2e_advanced -- --nocapture
cargo test -p specforge-cli --test e2e_smoke -- --nocapture
# 3. Smoke examples
./scripts/generate-examples.sh
Confirm:
-
CHANGELOG.mdhas a section for the new version with date - Workspace version bumped in root
Cargo.toml -
cargo build --release -p specforge-clisucceeds - README feature matrix matches reality
- GitHub Actions green on the release branch
Bump version
# Edit root Cargo.toml [workspace.package] version = "X.Y.Z"
# Then refresh lockfile:
cargo build --workspace
Tag & GitHub release
VERSION=0.1.0
git add -A
git commit -m "release: v${VERSION}"
git tag -a "v${VERSION}" -m "specforge v${VERSION}"
git push origin HEAD
git push origin "v${VERSION}"
Pushing the tag triggers .github/workflows/release.yml, which automatically:
- Builds cross-compiled binaries for 5 targets:
x86_64-unknown-linux-gnu(Linux AMD64)aarch64-unknown-linux-gnu(Linux ARM64, viacross)x86_64-apple-darwin(macOS Intel)aarch64-apple-darwin(macOS Apple Silicon)x86_64-pc-windows-msvc(Windows)
- Packages each as
.tar.gz(unix) or.zip(Windows) - Generates
checksums-sha256.txt - Creates a GitHub Release with all artifacts attached
The release notes are auto-generated from commits since the last tag. Paste the matching CHANGELOG.md section into the release description if you want richer notes.
Publish binary (optional / manual)
If you need a local binary:
cargo build --release -p specforge-cli
# artifact: target/release/specforge
Crates.io publish is optional for the generator crates; generated SDKs are not published by this project (consumers generate their own).
Generate example consumers
./scripts/generate-examples.sh
This regenerates examples/petstore-{ts,go,rust}/sdk from fixtures/petstore.yaml so docs stay in sync with the emitter.
Hotfix releases
For template-only bugs (broken JSDoc, missing import):
- Patch the emitter
- Bump patch version
- Add a
### Fixedentry under the new changelog section - Tag as usual