Releasing
This page covers the local release workflow: calculating the next version, promoting [Unreleased], and optionally keeping version strings in sync outside the changelog.
For publishing to GitHub or GitLab, see GitHub automation and GitLab automation.
Where your version number lives
Before using release, decide where your project's authoritative version number lives.
Option A — changelog is the single source of truth.
If your build does not read a static version string from pyproject.toml or source files, changelogmanager release is enough.
Option B — version appears in multiple places.
If your project also stores the version in pyproject.toml or Python __version__ strings, keep those files in sync with --bump-versions.
Automatic version bump
release inspects the change types in [Unreleased] and bumps the version according to the configured scheme (semver, pep440, or calver):
| Change type present | Bump |
|---|---|
removed |
Major |
added or security |
Minor |
changed, deprecated, fixed only |
Patch or micro |
Preview the next version:
changelogmanager version --reference future
Release it:
changelogmanager release --yes
If [Unreleased] exists but has no entries, the command exits successfully with a skip notice.
Override the version explicitly
changelogmanager release --override-version 2.0.0 --yes
A leading v is accepted and stripped automatically.
Non-interactive releases
In scripts and CI, pass --yes:
changelogmanager release --yes
Without --yes, non-interactive runs are refused. Use --dry-run first if you want a preview.
Syncing version strings with --bump-versions
If your project stores the version outside the changelog, use --bump-versions to keep everything aligned in one step.
Install the optional extra first:
# uv project dependency
uv add "keepachangelog-manager-fork[jiggle]"
# or standalone tool install
uv tool install "keepachangelog-manager-fork[jiggle]"
# or pip
pip install "keepachangelog-manager-fork[jiggle]"
Release and sync together:
changelogmanager release --bump-versions --yes
That command:
- promotes
[Unreleased]to the released version inCHANGELOG.md - updates
[project] versioninpyproject.toml - updates Python
__version__ = "..."strings unless you opt out
Limit the bump to pyproject.toml only:
changelogmanager release --bump-versions --pyproject-only --yes
Preview without writing:
changelogmanager release --bump-versions --dry-run
JSON output includes the bumped files:
changelogmanager --json release --bump-versions --yes
{
"released": "1.3.0",
"bumped_version": "1.3.0",
"bumped_files": ["pyproject.toml", "mypackage/__about__.py"]
}
Typical build sequence:
changelogmanager release --bump-versions --yes
uv build
uv publish
Querying versions
# most recently released version
changelogmanager version
# the version before that
changelogmanager version --reference previous
# what the next release would be
changelogmanager version --reference future