Curated-changelog, manual-bump release CLI for polyglot monorepos.
A single-binary release tool for the OTF monorepo. You write the release notes
(in each package's [Unreleased] changelog section), you pick the bumps — release
handles the rest: dependency-aware version cascades, internal range updates, topological
publishing, and a matrix-gated GitHub release in one release.yml.
Unlike commit-driven tools, your hand-written [Unreleased] notes are the source of
truth — never inferred from commits. Unlike npm-locked tools, the publishing backend is
adapter-based: npm, cargo, and a generic (bring-your-own-commands, e.g. JSR) today, others later.
version(local) — lists packages, you multi-select and choose bumps; cascades to internal dependents, updates dep ranges, moves[Unreleased]→ a dated section, then opens a release PR. Never touchesmaindirectly.publish(CI) — publishes changed packages in dependency order, idempotent and resumable, attaching prebuilt binaries when a workflow stages them.init— interactive setup: asks which adapters to enable and, per package, its mode (publishto a registry, orbuild-only→ GitHub Release artifacts), build matrix, command, and artifacts. Persistsrelease.tomland generates onerelease.ymlfrom it.
- You curate, it ships. Notes and bumps are human decisions; mechanics are automated.
- Strict by default. Commits since the last tag with an empty
[Unreleased]abort the release — no undocumented ships. - One committed config.
release.toml(written byinit) is the source of truth; the generatedrelease.ymland the other commands are derived from it. - Dependency-correct. peerDep dependents mirror the bump; encapsulated ones get a patch. Private apps stay buildable but are never published.
Reference docs live in docs/ — start at docs/README.md.
- Architecture · Adapters (npm · cargo · generic) · Configuration
- Commands: version · publish · init
- Changelog format · Preflight gate · CI workflow
- Implementation plan · Roadmap
v1 is functionally complete: all three commands (version, publish, init) and the npm
and cargo adapters are implemented and tested (CI on fmt + clippy + test). Setup is
config-driven: init is interactive and writes release.toml (the
source of truth, no --adapter flag), with a per-package publish vs build-only mode.
The cargo adapter supports lockstep workspaces and a GitHub-Release binary distribution
(cross-OS artifacts, no crates.io) — which is how otf-release ships itself. See the
implementation plan for the phase-by-phase breakdown. Further
ecosystem adapters (PyPI), pre-releases, and a release-PR bot remain on the
roadmap.