Skip to content

Add PyPI packaging metadata and a Trusted Publishing release workflow#274

Merged
seanwevans merged 1 commit into
mainfrom
claude/pypi-release-workflow
Jul 21, 2026
Merged

Add PyPI packaging metadata and a Trusted Publishing release workflow#274
seanwevans merged 1 commit into
mainfrom
claude/pypi-release-workflow

Conversation

@seanwevans

Copy link
Copy Markdown
Owner

The project shipped as a bare name/version with no publishing path. Fill in the distribution metadata (readme, SPDX license, classifiers, keywords, project URLs) and add a release workflow so tagging cuts a real PyPI release.

  • pyproject: PEP 639 license (license = "MIT" + license-files), readme, classifiers, keywords, and [project.urls]. Pin the build backend to setuptools>=77 so the emitted Metadata-2.4 (License-Expression / License-File) validates cleanly under twine check and modern PyPI.
  • .github/workflows/release.yml: on a v* tag (or manual dispatch), build the sdist+wheel, assert the tag matches the package version, run twine check, capture pyisolate-doctor provenance, and upload the artifacts. A separate publish job uploads via PyPI Trusted Publishing (OIDC, no stored token), gated on the pypi GitHub Environment so it stays a no-op until a maintainer wires the publisher up.
  • Document the release flow in docs/packaging-reproducibility.md and ignore the local dist/ and build/ output.

Verified python -m build + twine check pass on both distributions in a clean environment. Full suite: 449 passed, 4 skipped.

Claude-Session: https://claude.ai/code/session_01PbbJc7Ntj159D9LNGevwC2

The project shipped as a bare name/version with no publishing path. Fill in the
distribution metadata (readme, SPDX license, classifiers, keywords, project
URLs) and add a release workflow so tagging cuts a real PyPI release.

- pyproject: PEP 639 license (`license = "MIT"` + `license-files`), readme,
  classifiers, keywords, and [project.urls]. Pin the build backend to
  setuptools>=77 so the emitted Metadata-2.4 (License-Expression / License-File)
  validates cleanly under `twine check` and modern PyPI.
- .github/workflows/release.yml: on a `v*` tag (or manual dispatch), build the
  sdist+wheel, assert the tag matches the package version, run `twine check`,
  capture `pyisolate-doctor` provenance, and upload the artifacts. A separate
  publish job uploads via PyPI Trusted Publishing (OIDC, no stored token), gated
  on the `pypi` GitHub Environment so it stays a no-op until a maintainer wires
  the publisher up.
- Document the release flow in docs/packaging-reproducibility.md and ignore the
  local dist/ and build/ output.

Verified `python -m build` + `twine check` pass on both distributions in a clean
environment. Full suite: 449 passed, 4 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PbbJc7Ntj159D9LNGevwC2
@seanwevans
seanwevans merged commit 08cac58 into main Jul 21, 2026
16 checks passed
@seanwevans
seanwevans deleted the claude/pypi-release-workflow branch July 21, 2026 17:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants