Skip to content

Commit 71ce3f7

Browse files
kricheljclaude
andauthored
docs: document the release flow in CONTRIBUTING (#25)
Explain that publishing is a single automated step: bump the version, run the Upload Python Package workflow, which publishes to PyPI via Trusted Publishing and creates the matching v<version> GitHub Release with notes and built artifacts. Note that the workflow is idempotent. Claude-Session: https://claude.ai/code/session_013KvuS9HKbnZAwwFJyBkyHc Co-authored-by: Claude <noreply@anthropic.com>
1 parent 1b39def commit 71ce3f7

1 file changed

Lines changed: 19 additions & 0 deletions

File tree

CONTRIBUTING.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,25 @@ Continuous integration runs the formatter check, the linter, the type checker
3939
and the full suite (all via uv) across Python 3.11–3.14, so please make sure
4040
they pass locally.
4141

42+
## Releasing
43+
44+
Publishing a new version to PyPI and creating the matching GitHub Release is a
45+
single automated step:
46+
47+
1. Bump `version` in `pyproject.toml` (e.g. `2.0.0` -> `2.1.0`) and merge it to
48+
`master`.
49+
2. Run the publish workflow: **Actions -> Upload Python Package -> Run workflow**
50+
(on `master`).
51+
52+
That run builds the distributions with `uv build`, uploads them to PyPI via
53+
[Trusted Publishing](https://docs.pypi.org/trusted-publishers/) (OIDC — no
54+
tokens or secrets), and then creates a `v<version>` GitHub Release with
55+
auto-generated notes and the built wheels/sdist attached.
56+
57+
The workflow is idempotent: re-running it for a version already on PyPI skips
58+
the upload (`skip-existing`) and just refreshes the release assets, so it is
59+
safe to re-run.
60+
4261
Thank you for your contribution!
4362

4463
Joshua Shay Kricheli

0 commit comments

Comments
 (0)