Skip to content

ci(release): PyPI Trusted Publishing workflow + /release skill#358

Open
gloryfromca wants to merge 1 commit into
mainfrom
ci/pypi-trusted-publishing
Open

ci(release): PyPI Trusted Publishing workflow + /release skill#358
gloryfromca wants to merge 1 commit into
mainfrom
ci/pypi-trusted-publishing

Conversation

@gloryfromca

Copy link
Copy Markdown
Collaborator

Brings PyPI publishing to the public GitHub repo. The package was previously released from the now-archived GitLab mirror; GitHub had no publish path at all.

What this adds

File Purpose
.github/workflows/release.yml On a vX.Y.Z tag: build + smoke-test (make package) → upload to PyPI via Trusted Publishing (OIDC, no stored token), gated behind the release environment. A guard step refuses to publish if the tag ≠ pyproject version.
.claude/skills/release/SKILL.md /release — documents the release cut (bump version → CHANGELOG → tag → approve → verify) + the one-time setup.
CLAUDE.md list /release alongside the other skills.

⚠️ Two owner-only steps required before the first release (cannot be done from CI)

  1. PyPI → project everos → Settings → Publishing → add a GitHub trusted publisher: owner EverMind-AI, repo EverOS, workflow release.yml, environment release.
  2. GitHub → repo Settings → Environments → create release with required reviewers (so every publish needs manual approval).

Until (1) is done the upload step will fail; until (2) is done there is no approval gate. No PyPI API token is stored anywhere — the workflow mints a short-lived OIDC token at publish time.

Not included (deliberate)

  • Coverage-gate CI job (GitLab parity): the cov Makefile target exists but isn't wired into CI. Left out here — enabling an 80% gate needs a check of current GitHub coverage first, so it belongs in its own PR.
  • GitLab's publish stage is retired (repo archived); this replaces it as the sole release origin.

🤖 Generated with Claude Code

GitHub had no publish path — the package was previously released from the
(now-archived) GitLab mirror. Bring publishing to the public repo:

- .github/workflows/release.yml: on a vX.Y.Z tag, build + smoke-test
  (make package) and upload to PyPI via Trusted Publishing (OIDC, no stored
  token), gated behind the `release` environment for manual approval. A guard
  step refuses to publish when the tag != pyproject version.
- .claude/skills/release: /release documents the cut (bump version →
  CHANGELOG → tag → approve → verify) and the one-time PyPI trusted-publisher
  + GitHub environment setup.

Requires two owner-only one-time steps before the first release (documented
in the workflow header and the skill): register the GitHub trusted publisher
on PyPI, and create the `release` environment with required reviewers.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.

1 participant