Skip to content

feat(publish): abi3 maturin wheel publish workflow → PyPI#44

Merged
hartsock merged 1 commit into
mainfrom
feat/pypi-publish
Jun 27, 2026
Merged

feat(publish): abi3 maturin wheel publish workflow → PyPI#44
hartsock merged 1 commit into
mainfrom
feat/pypi-publish

Conversation

@hartsock

Copy link
Copy Markdown
Owner

Summary

  • Adds .github/workflows/publish.yml — fires on vX.Y.Z tags (or workflow_dispatch)
  • Builds abi3 cp39 wheels (linux x86_64+aarch64 manylinux, macOS universal2, Windows x86_64) + sdist
  • Uploads via maturin upload --skip-existing using the repo's pypi environment and PYPI_API_TOKEN secret
  • abi3-py39 added to pyo3 features in Cargo.toml (verified builds clean)
  • Hook/pipeline parity cross-refs updated in ci.yml + .githooks/pre-push

Why now

gila-cap-git-tend in gilamonster-capabilities (branch feat/cap-git-tend) declares gitxtend>=0.1.0 as a dependency. The caps CI is Python-only — it can't compile Rust from source — so gitxtend must be on PyPI for the cap to land CI-green.

v0.1.0 is release-ready: all M1 read-side methods merged, parity-tested vs git, E2E suite green, version already bumped on pilot/p1-release-v0.1.0 (this branch is based on it).

After merge

  1. Create and push the release tag: git tag v0.1.0 && git push origin v0.1.0
  2. The publish workflow fires; wheels appear on PyPI as gitxtend 0.1.0
  3. Create a GitHub Release from the tag (optional but standard)
  4. Open PR for gila-cap-git-tendgilamonster-capabilities main

PyPI setup required (one-time)

  • In repo Settings → Environments: create a pypi environment
  • Add PYPI_API_TOKEN secret (a PyPI API token scoped to gitxtend, or a Trusted Publisher via OIDC — remove the MATURIN_PYPI_TOKEN env var from the workflow if using OIDC)

risk:low — additive (publish workflow only; no change to the Rust logic)

WHAT: Add .github/workflows/publish.yml — fires on vX.Y.Z tags (and
workflow_dispatch). Builds abi3 wheels (cp39 ABI floor) across:
  - linux x86_64 + aarch64 (manylinux, QEMU)
  - macOS universal2 (x86_64+arm64, combined by maturin-action)
  - windows x86_64
Plus an sdist. Uploads via `maturin upload --skip-existing` using the repo's
`pypi` environment + PYPI_API_TOKEN secret.

Also add `abi3-py39` to the pyo3 feature list in Cargo.toml (required for
maturin to stamp the wheel tag correctly); verified it still builds clean.
Hook/pipeline parity notes updated in ci.yml + pre-push.

WHY: gila-cap-git-tend (branch feat/cap-git-tend in gilamonster-capabilities)
declares `gitxtend>=0.1.0` as a dep. The caps CI is Python-only and can't
build Rust from source, so gitxtend must be on PyPI for that cap to land.
v0.1.0 is release-ready (all M1 read methods + parity-tests merged, E2E
suite green, version already bumped on this branch).

To release: push the tag — `git tag v0.1.0 && git push origin v0.1.0`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018R92DDLCsWorb4fSJQrdvD
@hartsock
hartsock force-pushed the feat/pypi-publish branch from f6baa77 to bc48c2e Compare June 27, 2026 01:17
@hartsock
hartsock merged commit 955bc7c into main Jun 27, 2026
2 checks passed
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