@@ -22,6 +22,9 @@ Requires [uv](https://docs.astral.sh/uv/) and `git`.
2222 uv run pre-commit install
2323 ```
2424
25+ ` pre-commit install ` wires both hook stages (` pre-commit ` and ` commit-msg ` );
26+ the latter enforces the commit message format below.
27+
2528## Quality checks
2629
2730Lock consistency, linting and formatting (pre-commit incl. ruff), static
@@ -137,17 +140,38 @@ strict build that fails on any warning:
137140 uv build
138141 ` ` `
139142
140- # # Releasing
143+ # # Commit messages
144+
145+ Commits follow [Conventional Commits](https://www.conventionalcommits.org/) :
146+ `type(scope) : subject`, scope optional. The local `commit-msg` hook (see
147+ Setup) rejects malformed messages, because they drive the automated release
148+ below.
141149
142- Releases are fully automated
143- ([python-semantic-release](https://python-semantic-release.readthedocs.io/)) :
144- conventional commits on `main` decide the version bump (`fix:` patch,
145- ` feat:` minor, `BREAKING CHANGE:`/`!` major), CI updates the changelog,
146- tags `vX.Y.Z`, builds, publishes to PyPI via trusted publishing and
147- deploys the versioned docs. The package version is derived from the tag
148- by `hatch-vcs`; nothing is bumped manually.
150+ | Type | Release effect |
151+ | ---- | -------------- |
152+ | `feat` | minor release |
153+ | `fix`, `perf` | patch release |
154+ | `BREAKING CHANGE:` footer, or `!` after the type | major release |
155+ | `docs`, `chore`, `test`, `refactor`, `ci`, `style`, `build` | no release |
156+
157+ # # Releasing
149158
150- To preview what the next release would be :
159+ There is no standing release branch : work goes `feature branch -> main`
160+ directly. Every pull request into `main` runs `main.yml` (quality, tests,
161+ docs), the integration suite, and a `version-preview` job that comments the
162+ version a merge would release, computed with the same conventional commits.
163+
164+ Merging to `main` starts the release job
165+ (`on-release-main.yml`), which pauses on the `pypi` GitHub environment for a
166+ required reviewer to approve -- this is the deliberate-release control, in
167+ place of a staging branch. Once approved,
168+ [python-semantic-release](https://python-semantic-release.readthedocs.io/)
169+ bumps the static version in `pyproject.toml` and `CITATION.cff` (never edited
170+ by hand), updates `CHANGELOG.md`, relocks `uv.lock`, commits, tags `vX.Y.Z`,
171+ builds, publishes to PyPI via trusted publishing and deploys the versioned
172+ docs. Reject the approval and nothing ships.
173+
174+ To preview what the next release would be locally :
151175
152176` ` ` bash
153177uv run semantic-release --noop version
0 commit comments