From dd2fd70513eeae717801692ca3691240e9cdcbbf Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 24 May 2026 10:07:34 +0800 Subject: [PATCH] ci(publish-python): drop PyPI wheel push, GH Release becomes canonical MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Python SDK matrix (4 CPython × 3 platforms = 12 wheels per release, ~17 MB each) burned through PyPI's 10 GB per-project quota and tripped v3.2.0 with `400 Project size too large` mid-upload. PyPI offers no API to delete files; even after manually clearing the 1.x series, every future release would just refill the quota. GitHub Releases has no per-project size cap and the workflow already uploads the full wheel set + a `python-native-manifest.json` index there. Stop pushing to PyPI and call GH Releases the canonical wheel host. Changes - publish-python.yml: remove the `Publish wheels to PyPI` step entirely. The `if: startsWith(github.ref, 'refs/tags/')` guards on the GH-Release steps stay (they were added for debug dispatch and remain valid for branch dispatch). - release.sh: update the post-release summary text to reflect the new Python distribution path. - README + sdk/python/README: replace `pip install a3s-code` with a concrete GH-Release URL example, and explain why. Note that ≤3.1.0 versions remain installable from PyPI. - CHANGELOG: add a [3.2.0] Packaging note documenting the change. PYPI_NATIVE_TOKEN repo secret is now unused — leave for the user to revoke / delete from repo settings as a separate step. --- .github/workflows/publish-python.yml | 24 +++++++----------------- CHANGELOG.md | 9 +++++++++ README.md | 13 ++++++++++--- release.sh | 2 +- sdk/python/README.md | 19 ++++++++++++++++++- 5 files changed, 45 insertions(+), 22 deletions(-) diff --git a/.github/workflows/publish-python.yml b/.github/workflows/publish-python.yml index 5f01c8c..d9d6f1a 100644 --- a/.github/workflows/publish-python.yml +++ b/.github/workflows/publish-python.yml @@ -1,7 +1,9 @@ name: Publish Python SDK -# This workflow builds native Python wheels, uploads them to GitHub Releases, -# and publishes the wheels to PyPI. +# This workflow builds native Python wheels and uploads them to GitHub +# Releases. Wheels are NOT pushed to PyPI — they grew the project past +# PyPI's default 10 GB per-project quota, so GitHub Releases is now the +# canonical wheel host. See README.md for the install command. on: workflow_call: @@ -108,10 +110,7 @@ jobs: - name: List wheels run: ls -la dist/ - # Upload native wheels to GitHub Releases (NOT to PyPI). - # Guarded by a tag check so workflow_dispatch from a branch can still - # exercise the PyPI publish path for debugging without the GitHub - # Release steps tripping on a missing release name. + # Upload native wheels to GitHub Releases — the canonical wheel host. - name: Ensure release exists and upload native assets if: startsWith(github.ref, 'refs/tags/') env: @@ -126,7 +125,8 @@ jobs: fi gh release upload "$GITHUB_REF_NAME" dist/*.whl --clobber - # Generate manifest with wheel metadata for bootstrap downloader + # Generate manifest of wheel metadata (filename + sha256) so a + # future bootstrap installer can pick the right wheel by platform. - name: Generate native wheel manifest if: startsWith(github.ref, 'refs/tags/') run: | @@ -135,19 +135,9 @@ jobs: dist/python-native-manifest.json \ --version "${GITHUB_REF_NAME#v}" - # Upload manifest to GitHub Releases - name: Upload manifest to GitHub Releases if: startsWith(github.ref, 'refs/tags/') env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | gh release upload "$GITHUB_REF_NAME" dist/python-native-manifest.json --clobber - - # Publish native wheels to PyPI - - name: Publish wheels to PyPI - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_NATIVE_TOKEN }} - run: | - python -m pip install --upgrade pip twine - python -m twine upload --verbose --skip-existing dist/*.whl diff --git a/CHANGELOG.md b/CHANGELOG.md index ef7d486..d903fee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 that query the tracker immediately after scheduling do not race the spawned task. +### Packaging + +- The Python SDK no longer ships native wheels to PyPI. The project + grew past PyPI's default 10 GB per-project quota, and binary wheels + for the full Rust × CPython × platform matrix consume that budget + fast. From v3.2.0 onwards the canonical wheel host is GitHub + Releases — see README for the install command. Versions up to 3.1.0 + remain installable from PyPI for backward compatibility. + ### Breaking - `TaskExecutor::execute`, `execute_parallel`, and `execute_background` now diff --git a/README.md b/README.md index b946e6e..8a5fa71 100644 --- a/README.md +++ b/README.md @@ -81,15 +81,22 @@ Full migration notes are in [CHANGELOG.md](./CHANGELOG.md). ## Install ```bash -# Python -pip install a3s-code - # Node.js npm install @a3s-lab/code + +# Python (from v3.2.0; pick the wheel for your interpreter/platform) +pip install \ + https://github.com/AI45Lab/Code/releases/download/v3.2.0/a3s_code-3.2.0-cp312-cp312-manylinux_2_28_x86_64.whl ``` Rust users can depend on `a3s-code-core`. +Python wheels are hosted on [GitHub Releases](https://github.com/AI45Lab/Code/releases) +from v3.2.0 onwards — the project grew past PyPI's per-project storage +quota for binary distributions. Each release ships a +`python-native-manifest.json` with sha256 hashes for every wheel. +Versions up to 3.1.0 remain installable via `pip install a3s-code==3.1.0`. + --- ## Quick Start diff --git a/release.sh b/release.sh index 6c1d4db..e8bac64 100755 --- a/release.sh +++ b/release.sh @@ -198,7 +198,7 @@ echo "GitHub Actions will now:" echo " 1. Run CI checks" echo " 2. Publish to crates.io" echo " 3. Publish Node SDK to npm" -echo " 4. Publish Python SDK to PyPI" +echo " 4. Build Python SDK wheels and attach to GitHub Release (PyPI no longer used)" echo " 5. Create GitHub Release" echo "" echo "Monitor progress at:" diff --git a/sdk/python/README.md b/sdk/python/README.md index 14ffa0c..4044eeb 100644 --- a/sdk/python/README.md +++ b/sdk/python/README.md @@ -4,10 +4,27 @@ Native Python bindings for the A3S Code AI coding agent, built with PyO3. ## Installation +From v3.2.0 onwards the native wheels are hosted on GitHub Releases +(PyPI's per-project storage quota grew too tight for a Rust SDK that +ships a binary per Python × platform). Pick the wheel that matches +your interpreter and platform: + +```bash +# Example: CPython 3.12 on linux x86_64 +pip install \ + https://github.com/AI45Lab/Code/releases/download/v3.2.0/a3s_code-3.2.0-cp312-cp312-manylinux_2_28_x86_64.whl +``` + +Or list all wheels for a version: + ```bash -pip install a3s-code +gh release view v3.2.0 --json assets -q '.assets[].browser_download_url' \ + | grep '\.whl$' ``` +Earlier versions (≤ 3.1.0) remain on PyPI and install with the usual +`pip install a3s-code==3.1.0`. + ## Quick Start ```python