uv-ship
uv-ship
is a lightweight companion to uv that removes the risky parts of cutting a release. It verifies the repo state, bumps your project metadata and optionally refreshes the changelog. It then commits, tags & pushes the result, while giving you the chance to review every step.
key capabilities
- version automation: drive
uv version
to bump or set the next release number, keepingpyproject.toml
anduv.lock
in sync. - preflight checks: guard your release workflow by verifying branch, tags, and a clean working tree before shipping.
- changelog generation: auto-builds changelog sections from commits since the latest tag.
- one-shot release: stage, commit, tag, and push in a single step.
- dry-run mode: preview every action before making changes.
installation
install it as a standalone CLI tool into a dedicated environment:
or add uv-ship
as a dependency to a uv mangaged project:
quick start
after installation, set up basic configurations by placing a [tool.uv-ship]
table in your pyrproject.toml
.
- Ensure your working tree is clean and that you are on the configured release branch.
- Run
uv-ship next patch
(orminor
/major
). - Review the changelog preview, confirm the prompts, and watch the tag and push finish.
Prefer to set an explicit version? Use uv-ship version 1.2.0
instead of bumping.
Need to inspect the changelog first? Run uv-ship log --latest
to preview commits since the last tag or uv-ship log --save
to refresh the configured changelog file.
CLI overview
uv-ship next <bump-type>
– bumppyproject.toml
&uv.lock
, update the changelog (optional), commit, tag, push.uv-ship version <version>
– set a specific version without calculating the bump.uv-ship log [--latest] [--save]
– show/update the changelog section built from commits after the latest tag.
Pass --dry-run
on the root command to rehearse any of the subcommands without touching disk:
troubleshooting
- Not inside a Git repository – Run the CLI from within your project checkout.
- Not on release branch – Update your [tool.uv-ship] config or check out the correct branch before retrying.
- Tag already exists – uv-ship will not overwrite tags. Delete or rename the existing tag locally and remotely, then rerun.
- Dirty working tree – Inspect changes with git status --short. Either clean up, or if intentional, pass --dirty (per run) or set allow-dirty = true.
- uv not found / fails – Ensure the uv executable is installed, available in your PATH, and that your project has a valid pyproject.toml.
requirements
- a project running Python 3.10+
- uv 0.7.0 or later on your
PATH
- a Git repository
happy shipping!