vership
A release orchestrator that handles version bumping, changelog generation, and publishing — with zero configuration.
$ vership bump patch
✓ No uncommitted changes
✓ On branch main
✓ Tag v0.4.1 does not exist
✓ Lock file in sync
✓ Lint passes
✓ Tests pass
→ Bumping 0.4.0 → 0.4.1
→ Updated rust
→ Updating version files
→ Generated changelog (3 entries)
→ Running artifact: cargo run --release -- schema generate
→ Committed: chore: bump version to v0.4.1
→ Tagged: v0.4.1
→ Pushed to origin
Why vership?
Most release tools require config files, plugins, or CI integration before they do anything. vership works out of the box: it detects your project type, runs pre-flight checks, generates a changelog from conventional commits, bumps the version, and pushes — in one command.
| vership | cargo-release | semantic-release | git-cliff | |
|---|---|---|---|---|
| Zero config | Yes | No | No | No |
| Multi-ecosystem | Rust, Node, Python, Go | Rust only | Node only | Any (changelog only) |
| Changelog generation | Built-in | External tool | Plugin | Yes |
| Multi-file version sync | Built-in | No | Plugin | No |
| Artifact regeneration | Built-in | No | Plugin | No |
| Pre-flight checks | Built-in | Partial | No | No |
| Single binary | Yes | Yes | No (Node runtime) | Yes |
Agent-friendly (--json, schema) |
Yes | No | No | No |
Install
# Homebrew
# From crates.io
# From PyPI
# From source
&& &&
Quick Start
No setup required. Just use conventional commits and run:
Initial release? Tag the version already in your manifest:
Interrupted run? Continue where it stopped:
Preview before releasing:
Commands
vership bump <patch|minor|major> Bump version, generate changelog, tag, push
--dry-run Preview without making changes
--skip-checks Skip lint and test checks
--no-push Stop after tagging, do not push
vership release Tag the on-disk version as-is (no bump)
--dry-run / --skip-checks / --no-push same as bump
vership resume Finish an interrupted bump (trusts on-disk version)
--dry-run / --skip-checks / --no-push same as bump
vership changelog Preview changelog for unreleased commits
vership preflight Run all pre-flight checks
vership status Show version, project type, unreleased commits
vership config init Create vership.toml with defaults
vership schema JSON schema for agent integration
vership completions <shell> Generate shell completions
bump auto-detects an interrupted prior run when the on-disk version already
matches the expected post-bump value AND the working tree is dirty. The
explicit resume subcommand is the escape hatch for cases where auto-detection
doesn't fire.
What It Does
vership bump patch runs this flow:
- Detect project type (Rust, Rust+Maturin, Node, Go, Python)
- Check clean working tree, correct branch, tag doesn't exist, lockfile in sync
- Check lint and tests pass (skippable with
--skip-checks) - Bump version in project files (Cargo.toml, package.json, pyproject.toml) or tag directly (Go)
- Update version references in extra files (
version_files) - Generate changelog from conventional commits since last tag
- Regenerate artifacts from commands (
artifacts) - Commit, tag, and push
Your existing CI release workflow (GitHub Actions, etc.) triggers on the tag push as usual. vership handles the local side only.
Changelog Format
Generated from conventional commits in Keep a Changelog format:
-
-
| Commit type | Section |
|---|---|
feat |
Added |
fix |
Fixed |
perf |
Performance |
change |
Changed |
feat! / BREAKING CHANGE |
Breaking Changes |
chore, docs, ci, test, refactor, build, style |
Excluded |
Version Files
Projects often have version strings scattered across READMEs, docs, and companion packages. vership updates them all during the bump:
# Text mode: search/replace with placeholders
[[]]
= "README.md"
= "rev: v{prev}" # {prev} = old version
= "rev: v{version}" # {version} = new version
# Field mode: update JSON fields directly
[[]]
= "npm/*/package.json"
= "version"
# Wildcard: update all values in an object
[[]]
= "package.json"
= "optionalDependencies.*"
All matched files are staged and included in the release commit automatically.
Artifacts
Some projects need to regenerate files from the built binary during release (schemas, rule exports, API docs). vership runs these commands and commits the output:
# Capture stdout to a file
[[]]
= "cargo run --release -- schema generate-json"
= "schema.json"
# Or let the command write its own files
[[]]
= "make generate-docs"
= ["docs/api.json"]
Commands run from the project root via sh -c. Output files are staged automatically. If a declared file doesn't exist after the command runs, the release aborts with a clear error.
Configuration
vership works without any configuration. Only create vership.toml if you need to override defaults:
[]
= "main" # Branch to release from
[]
= "make verify" # Run before version bump
= "echo done" # Run after push (e.g. trigger Homebrew update)
[]
= true # Run lint checks (default: true)
= true # Run tests (default: true)
= "npm run lint" # Override default lint command
= "npm test" # Override default test command
[]
= "exclude" # "exclude", "include", or "strict"
Agent Integration
vership is designed to work with AI coding assistants:
# Machine-readable project status
# Full command schema for tool discovery
License
MIT