This repository uses a lockstep microcrate publishing model. All publishable workspace crates share the same version.
Publish order is derived automatically from workspace dependency topology. Do not maintain a hard-coded list by hand.
Preview the exact order:
cargo xtask publish --plan- Bump version
cargo xtask bump <MAJOR.MINOR.PATCH>- Update changelog
- Ensure
CHANGELOG.mdhas an entry for the release version.
- Commit release changes
git commit -am "chore: release vX.Y.Z"
git push- Run release preflight
cargo xtask publish --dry-runThis performs:
- git-clean check
- workspace version consistency check
- changelog version check
- full workspace tests (
--all-features, excludingtokmd-fuzz) - local package validation (
cargo package --list) for each publishable crate
- Publish to crates.io
cargo xtask publish --yesOptional tagging via xtask:
cargo xtask publish --yes --tag
# or custom format
cargo xtask publish --yes --tag --tag-format "release-{version}"If publishing fails mid-stream, resume from a crate:
cargo xtask publish --from <crate-name>There are two ways to publish a release. Both invoke cargo xtask publish under the hood.
Run the full publish sequence locally:
cargo xtask publish --dry-run # preflight
cargo xtask publish --yes # publish to crates.ioPush a semver tag to trigger the release workflow:
git tag vX.Y.Z
git push origin vX.Y.ZThis triggers .github/workflows/release.yml, which:
- Builds cross-platform release binaries
- Creates a GitHub release with artifacts
- Runs
cargo xtask publish --yes --skip-tests --verboseto publish to crates.io
The tag-driven path is the canonical production flow.
Before releasing, ensure:
cargo fmt-checkpasses.cargo gate-checkpasses (workspace-wide fmt/check/clippy/test compile gates).cargo xtask publish --dry-runpasses end-to-end.
On Windows, prefer the repo-native quality commands above over raw cargo fmt --all; the workspace can exceed formatter argv limits and the release docs should reflect the supported path.
Once the tag-driven release completes:
- Verify the GitHub release and release workflow succeeded.
- Confirm representative crates show the new version on crates.io.
- Restore a fresh
## [Unreleased]section inCHANGELOG.mdif the release branch changed it materially. - Update planning docs (
docs/NOW.md,ROADMAP.md) so they describe the next active horizon rather than the just-shipped release. - Prune temporary release branches/worktrees so
mainis the only active lane again.