Releases are automatic. To ship a version:
- Bump the version in
pyproject.tomlto a finalX.Y.Z(e.g.0.1.6). Keep.dev0/rc/a/bsuffixes for work-in-progress — those are not published. - Promote the changelog: rename
## [Unreleased]to## [X.Y.Z] - <date>inCHANGELOG.md(add a fresh empty[Unreleased]above it). - Push to
main.
That's it. .github/workflows/publish.yml then:
- detects the version is a final
X.Y.Zwith no GitHub Release yet, - builds +
twine check, - tags
vX.Y.Z(force-moving a stale tag from a failed attempt), - publishes to PyPI via OIDC Trusted Publishing (no stored token),
- creates the GitHub Release with the
[X.Y.Z]changelog section as notes.
No manual tagging or release drafting. It's idempotent — if a release for the version already exists it does nothing, so re-pushing is safe.
release-reminder.yml opens/bumps a "Release due" issue weekly when commits pile
up since the last tag. Ship regularly so users don't hit already-fixed bugs.
| Workflow | Trigger |
|---|---|
ci.yml |
push/PR — tests (SQLite + Postgres, coverage gate) and dependency audit |
publish.yml |
push to main touching pyproject.toml — auto-release (see above) |
docs.yml |
push to main touching docs/ — deploy the docs site |
latest-deps.yml |
weekly — install newest deps, run suite (early breakage warning) |
release-reminder.yml |
weekly — nudge if unreleased commits pile up |
- A PyPI Trusted Publisher for this repo: workflow
publish.yml, environmentpypi. (If you rename the workflow, update the publisher.) - GitHub Pages enabled (source:
gh-pagesbranch) for the docs site.