A CLI tool to bump semver versions in Cargo.toml or package.json, commit the change, and optionally create a signed tag and push to remote.
cargo install vup-rs- Detects whether the current directory contains a
Cargo.tomlorpackage.json(see Package detection) - Increments the requested version component (major, minor, or patch)
- Prompts for confirmation before making any changes
- Writes the updated version to the package file
- Commits the change with message
chore(version): X.Y.Z - Optionally creates a GPG-signed git tag (
-t) - Optionally pushes the commit and tag to remote (
-u)
vup [OPTIONS]vup must be run from the directory that contains your Cargo.toml or package.json. It does not search parent directories.
| Flag | Long | Description |
|---|---|---|
-m |
--major |
Increment the major version (resets minor and patch to 0) |
-n |
--minor |
Increment the minor version (resets patch to 0) |
-p |
--patch |
Increment the patch version |
-t |
--tag |
Create a GPG-signed git tag named v{version} after committing |
-u |
--push |
Push the commit and tag (if created) to the remote |
-v |
--verbose |
Print debug information |
-y |
--yes |
Skip the confirmation prompt (useful in CI pipelines) |
--no-sign |
Create an annotated tag instead of a GPG-signed tag (use with --tag) |
Bump patch version:
vup --patchBump minor version and create a signed tag:
vup --minor --tagBump major version, create a signed tag, and push everything:
vup --major --tag --pushBump patch version non-interactively (CI):
vup --patch --yesvup looks for package files in the current directory in this order:
Cargo.toml— if found, updates the[package].versionfieldpackage.json— if found, updates theversionfield
If both files exist, Cargo.toml takes priority.
vup is configured via a vup.toml file in the current directory. Use vup init to create one.
Running vup init walks you through each configuration field, shows the default in brackets, and writes vup.toml with your chosen values and inline comments:
vup initTag prefix (empty string = bare tags like "1.2.3" instead of "v1.2.3") [v]:
Commit message prefix [chore(version): ]:
Package file (auto-detects Cargo.toml — press Enter to keep, or type a path):
Git remote name (not a URL, required): origin
Created vup.toml
tag_prefix = "v"
commit_prefix = "chore(version): "
package = (auto-detect)
push_remote = "origin"
Press Enter to accept the default for any field. For push_remote you must type a value (the remote name, not a URL).
Use --yes to write the default vup.toml without any prompts:
vup init --yesvup init always skips and warns if vup.toml already exists, so it is safe to call in a bootstrap script.
| Field | Default | Description |
|---|---|---|
tag_prefix |
"v" |
Prepended to the version when creating git tags. Set to "" for bare tags like 1.2.3. |
commit_prefix |
"chore(version): " |
Prefix for the version-bump commit message. |
package |
(auto-detect) | Explicit path to Cargo.toml or package.json. Omit to auto-detect. |
push_remote |
"origin" |
Git remote name to push commits and tags to. |
vup release-notes generates release notes from git history and prints Markdown to stdout.
| Subcommand | Description |
|---|---|
changelog |
Lists all commits since the last git tag, grouped by conventional commit type |
structured |
Extracts item references (e.g. #US-17) matching patterns defined in vup.toml |
Both modes accept an optional --from <ref> flag to override the default commit range start.
Generate a changelog since the last tag:
vup release-notes changelogGenerate a changelog from a specific tag or SHA:
vup release-notes changelog --from v1.2.0Generate structured release notes (item refs only):
vup release-notes structuredPipe structured notes to a file for a CI artifact:
vup release-notes structured > release-notes.mdPipe changelog into an Azure DevOps wiki API call:
vup release-notes changelog | az devops wiki page create ...Generate structured notes from a specific ref:
vup release-notes structured --from v1.2.0Add a [release_notes] table to vup.toml to define pattern-to-section mappings. Each entry is a regex that is tested against each commit's subject and body; all matches are extracted as item references.
[[release_notes.patterns]]
regex = "#US-\\d+"
section = "User Stories"
[[release_notes.patterns]]
regex = "#BUG-\\d+"
section = "Bug Fixes"A commit matching multiple patterns appears under each matching section. Unmatched commits are silently omitted. Running structured with no patterns configured produces only the header.
vup release-notes traverses the full git history to find the previous tag. CI checkout steps default to shallow clones, which will cause vup to fail with a clear error. Configure your checkout step to fetch the full history:
GitHub Actions:
- uses: actions/checkout@v4
with:
fetch-depth: 0Azure Pipelines:
- checkout: self
fetchDepth: 0- Both
Cargo.tomlandpackage.jsonpresent:Cargo.tomlis always used. Bumping both files in a single run is not yet supported. --tagrequires GPG signing: The tag is created withgit tag -s, which requires a GPG key configured in your git environment. Use--no-signalongside--tagto create an annotated tag instead, which works without GPG.
cargo buildThe first build sets up pre-commit hooks via rusty-hook. After that, the hooks run automatically on each commit.
Bug reports and pull requests are welcome on GitHub.