Ship 1.0.0 to PyPI.
Today's release process is manual twine — twine is listed in requirements.txt and there is no release workflow at all. The last release was 0.1.0 in 2023.
Scope
.github/workflows/release.yml, triggered on tag v*.*.*, ported from Winged-Swift/.github/workflows/release.yml:
- Build sdist and wheel with
python -m build.
- Run the full test suite and
verify.sh against the built artifact, not the source tree.
- Extract the version's section from
CHANGELOG.md — Swift does this with sed -n "/## \[$VERSION\]/,/## \[/p" — and use it as the release body.
- Publish the GitHub release with the artifacts attached.
- Upload to PyPI via trusted publishing (OIDC,
pypa/gh-action-pypi-publish). No long-lived API token in repository secrets.
Pre-release checklist
Acceptance criteria
Depends on #32, #33, #34, #35, #36.
Ship 1.0.0 to PyPI.
Today's release process is manual
twine—twineis listed inrequirements.txtand there is no release workflow at all. The last release was 0.1.0 in 2023.Scope
.github/workflows/release.yml, triggered on tagv*.*.*, ported fromWinged-Swift/.github/workflows/release.yml:python -m build.verify.shagainst the built artifact, not the source tree.CHANGELOG.md— Swift does this withsed -n "/## \[$VERSION\]/,/## \[/p"— and use it as the release body.pypa/gh-action-pypi-publish). No long-lived API token in repository secrets.Pre-release checklist
CHANGELOG.mdhas a complete[1.0.0]section, assembled from the phasesMIGRATION.mdandPORTING.mdare currentREADME.mdexamples match installed behaviour, and every output block is real outputpyproject.toml), withwinged.__version__read from distribution metadata (dsl: top-level winged exports and prelude #21)twine check)Acceptance criteria
git tag v1.0.0 && git push --tagsproduces a GitHub release and a PyPI release with no manual steppip install winged-python==1.0.0in a clean venv, then the README's first example, renders correctlywinged/py.typedandmypysees types for a consumerDepends on #32, #33, #34, #35, #36.