Rust monorepo tooling for change detection, graph unification, changesets-style releases, and split/sync.
plan/run: file-first change detection for selective build, test, bench, docs, and infra executionunify: workspace dependency unification, feature cleanup, unused dependency detection, and MSRV derivationrelease/change: Rust-native change files, per-crate bump inference, changelog generation, tags, and publish flowsplit/sync: copybara-style crate extraction and bidirectional sync without a separate DSL
cargo install cargo-rail
cargo rail init
cargo rail unify --check
cargo rail plan --merge-base --explain
cargo rail run --merge-base --profile ciPre-built binaries: GitHub Releases
Use plan to build the deterministic contract and run to execute only the selected work.
cargo rail plan --merge-base
cargo rail plan --merge-base -f github
cargo rail run --merge-base --profile ciimpact is diagnostic. scope is the execution handoff.
Use unify to keep the workspace dependency graph lean and consistent.
cargo rail unify --check
cargo rail unify --check --explain
cargo rail unifyUse change for reviewed release intent and release for checks, version bumps, changelogs, tags, remote push,
forge releases, and publishing.
cargo rail release check
cargo rail change add cargo-rail --bump minor --message "Added Rust-native change files for releases."
cargo rail change status
cargo rail release run cargo-rail --bump auto --check
cargo rail release run cargo-rail --bump auto --yesChange files live in .changes/*.md by default and are consumed by release run:
---
"cargo-rail" = "minor"
---
Added Rust-native change files for releases.--bump auto reads change files first, then falls back to conventional commits. For monorepos, commits are
attributed to crates through the workspace graph instead of path-only changelog globs.
Use PR mode when version bumps and changelog text should be reviewed before tags or registry side effects:
cargo rail release run cargo-rail --bump auto --pr --yes
# after the release PR is merged, from the updated main branch:
cargo rail release finalize cargo-rail --yesUse [release.version_groups] for crates that must release in lockstep; cargo-rail expands the group and uses
the highest bump any member earned.
For owned GitHub or GitLab releases, set push = true, create_github_release = true, and choose
forge = "auto", "github", or "gitlab". cargo-rail pushes the release commit and tag before creating
the forge release or publishing crates.
Use split and sync when a crate needs to live in both a monorepo and a standalone repository.
cargo rail split init crates/my-crate
cargo rail split run crates/my-crate
cargo rail sync crates/my-crate --to-remoteUse cargo-rail-action for planner gates and execution scope in GitHub Actions.
cargo rail init
cargo rail config sync
cargo rail config validatePrimary references:
- Issues: GitHub Issues
- Crate: crates.io/cargo-rail
See CONTRIBUTING.md.
See SECURITY.md.
Licensed under MIT.