chore(0.29.1): retag — v0.29.0 was tagged before #59 merged (streamin… #29
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Publish | |
| on: | |
| push: | |
| tags: | |
| - 'v*' | |
| workflow_dispatch: | |
| jobs: | |
| # Verify both packages build and pass tests, in lockstep. | |
| # If either fails, neither publishes. | |
| verify: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: pnpm/action-setup@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| cache: pnpm | |
| registry-url: https://registry.npmjs.org | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - name: Install JS deps | |
| run: pnpm install --frozen-lockfile | |
| - name: Typecheck JS | |
| run: pnpm typecheck | |
| - name: Test JS | |
| run: pnpm test | |
| - name: Build JS and emit OpenAPI spec | |
| run: pnpm build | |
| - name: Verify version lock between npm and PyPI packages | |
| run: | | |
| NPM_VERSION=$(node -p "require('./package.json').version") | |
| PY_VERSION=$(grep -E '^version' clients/python/pyproject.toml | head -1 | sed -E 's/.*"([^"]+)".*/\1/') | |
| PY_RUNTIME_VERSION=$(python -c "import pathlib,re; text=pathlib.Path('clients/python/src/agent_eval_rpc/__init__.py').read_text(); match=re.search(r'__version__ = \"([^\"]+)\"', text); print(match.group(1) if match else '')") | |
| if [ "$NPM_VERSION" != "$PY_VERSION" ]; then | |
| echo "::error::Version mismatch: npm=$NPM_VERSION pypi=$PY_VERSION. Bump them together." | |
| exit 1 | |
| fi | |
| if [ -n "$PY_RUNTIME_VERSION" ] && [ "$NPM_VERSION" != "$PY_RUNTIME_VERSION" ]; then | |
| echo "::error::Version mismatch: npm=$NPM_VERSION python_runtime=$PY_RUNTIME_VERSION. Bump them together." | |
| exit 1 | |
| fi | |
| if [[ "${GITHUB_REF:-}" == refs/tags/v* ]]; then | |
| TAG_VERSION="${GITHUB_REF#refs/tags/v}" | |
| if [ "$TAG_VERSION" != "$NPM_VERSION" ]; then | |
| echo "::error::Tag/version mismatch: tag=$TAG_VERSION package=$NPM_VERSION." | |
| exit 1 | |
| fi | |
| fi | |
| echo "Versions locked: $NPM_VERSION" | |
| - name: Install Python client | |
| working-directory: clients/python | |
| run: pip install -e ".[dev]" | |
| - name: Test Python client (incl. real subprocess integration) | |
| working-directory: clients/python | |
| run: pytest -v | |
| - name: Upload OpenAPI artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: openapi | |
| path: dist/openapi.json | |
| - name: Upload Python build context | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: python-source | |
| path: clients/python | |
| publish-npm: | |
| needs: verify | |
| if: startsWith(github.ref, 'refs/tags/v') | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| id-token: write | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: pnpm/action-setup@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| cache: pnpm | |
| registry-url: https://registry.npmjs.org | |
| - run: pnpm install --frozen-lockfile | |
| - run: pnpm build | |
| # Idempotent: re-running a tag whose npm version is already published | |
| # (e.g. after a manual `pnpm publish` plus a workflow rerun) must not | |
| # block the downstream PyPI step. | |
| - name: Publish to npm (skip if already published) | |
| run: | | |
| NAME=$(node -p "require('./package.json').name") | |
| VERSION=$(node -p "require('./package.json').version") | |
| if npm view "$NAME@$VERSION" version >/dev/null 2>&1; then | |
| echo "$NAME@$VERSION already on registry; skipping publish" | |
| else | |
| pnpm publish --no-git-checks --access public | |
| fi | |
| env: | |
| NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
| publish-pypi: | |
| # PyPI publish is independent of npm — both gate on `verify` so a version | |
| # mismatch blocks both, but a re-run after a successful npm publish must | |
| # still be able to push the matching PyPI artifact. | |
| needs: verify | |
| if: startsWith(github.ref, 'refs/tags/v') | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| id-token: write | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.12' | |
| - name: Install build tools | |
| run: pip install build twine | |
| - name: Build wheel + sdist | |
| working-directory: clients/python | |
| run: python -m build | |
| - name: Check whether this version is already on PyPI | |
| id: pypi-check | |
| run: | | |
| VERSION=$(grep -E '^version' clients/python/pyproject.toml | head -1 | sed -E 's/.*"([^"]+)".*/\1/') | |
| if curl -sf "https://pypi.org/pypi/agent-eval-rpc/$VERSION/json" >/dev/null; then | |
| echo "agent-eval-rpc==$VERSION already on PyPI; skipping publish" | |
| echo "skip=true" >> "$GITHUB_OUTPUT" | |
| else | |
| echo "skip=false" >> "$GITHUB_OUTPUT" | |
| fi | |
| - name: Publish to PyPI (trusted publishing) | |
| if: steps.pypi-check.outputs.skip != 'true' | |
| uses: pypa/gh-action-pypi-publish@release/v1 | |
| with: | |
| packages-dir: clients/python/dist |