Run this checklist from a clean checkout of the commit intended for release.
Replace 1.0.0 in the commands when preparing a later version.
- Confirm
pyproject.tomlcontains the intended version. - Confirm
CHANGELOG.mddescribes that version and uses the release date. - For a prerelease, use the PEP 440 form
1.0.0rc1inpyproject.tomland the matchingv1.0.0rc1Git tag. - Confirm
uv.lockis current withuv lock --check. - Confirm
git status --shortis empty. - Review the comparison with the previous release tag.
- Confirm the
pypiGitHub environment and PyPI trusted publisher target this repository and.github/workflows/publish.yml.
uv sync --locked --python 3.11
uv run --python 3.11 black --check src tests examples
uv run --python 3.11 isort --check-only src tests examples
uv run --python 3.11 python -m unittest discover -s tests -vThe GitHub Actions test workflow must also pass on every supported Python and operating-system combination.
Remove or move any previous dist/ directory, then run:
uv build
uv run --isolated --no-project --with dist/*.whl tests/smoke_test.py
uv run --isolated --no-project --with dist/*.tar.gz tests/smoke_test.py
uv run --isolated --no-project --with dist/*.whl tests/web_smoke.py
uv run --isolated --no-project --with dist/*.tar.gz tests/web_smoke.pyInspect both archives. They should contain the license; the source archive
should contain README.md, and the wheel metadata should contain its rendered
project description. Both metadata files should report the intended name,
version, Python requirement, dependencies, and project URLs.
- Commit all release preparation changes and obtain a passing branch build.
- Create and push an annotated tag matching the package version:
git tag -a v1.0.0 -m "ctui 1.0.0"
git push origin v1.0.0- Watch the Publish release to PyPI workflow through verification, artifact smoke tests, attestation, publication, and GitHub release creation.
- Confirm prerelease tags produce a GitHub prerelease that is not marked as the latest stable release.
- Do not reuse a failed or incorrect release version; fix the problem and increment the version according to semantic versioning.
- Confirm the PyPI project displays the README and correct metadata.
- Confirm PyPI provides both the wheel and source distribution plus their attestations.
- Confirm the generated GitHub release is attached to the correct tag.
- Install from PyPI in a new environment and run an import check:
uv run --isolated --no-project --with ctui==1.0.0 python -c \
"import ctui; print(ctui.__version__)"- Run at least one tutorial against the published package or a minimal external application before announcing the release.