agentswap 0.13.0

AgentSwap CLI for requesting quotes, inspecting tokens and pools, managing intents, and registering an API key against the AgentSwap service.
# Tests gate binary releases on tag pushes and manual rebuilds. Tag pushes also publish
# to crates.io after all builds pass, using Trusted Publishing (OIDC) without a stored token.
name: release

on:
  push:
    tags: ["v*"]
  workflow_dispatch:
    inputs:
      tag:
        description: Existing version tag to rebuild and release
        required: true
        type: string

permissions:
  contents: read
  id-token: write

env:
  RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref_name }}

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
        with:
          ref: ${{ env.RELEASE_TAG }}
      - uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: stable
      - name: The tag must name the version in Cargo.toml
        run: |
          version=$(grep -m1 '^version' Cargo.toml | sed -E 's/.*"([^"]+)".*/\1/')
          [ "$RELEASE_TAG" = "v$version" ] || { echo "tag $RELEASE_TAG does not match Cargo.toml version $version"; exit 1; }
      - run: cargo test --locked

  publish:
    needs: [test, build]
    if: github.event_name == 'push'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
        with:
          ref: ${{ env.RELEASE_TAG }}
      - uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: stable
      - uses: rust-lang/crates-io-auth-action@v1
        id: auth
      - run: cargo publish --locked
        env:
          CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}

  build:
    needs: test
    name: Build ${{ matrix.target }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
          - os: ubuntu-latest
            target: aarch64-unknown-linux-musl
          - os: macos-14
            target: x86_64-apple-darwin
          - os: macos-14
            target: aarch64-apple-darwin
    steps:
      - uses: actions/checkout@v7
        with:
          ref: ${{ env.RELEASE_TAG }}
      - uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: stable
          targets: ${{ matrix.target }}
      - uses: taiki-e/install-action@v2
        if: contains(matrix.target, '-unknown-linux-musl')
        with:
          tool: cross
      - name: Install the aarch64 strip tool
        if: matrix.target == 'aarch64-unknown-linux-musl'
        run: sudo apt-get update && sudo apt-get install -y binutils-aarch64-linux-gnu
      - name: Build the release binary with cross
        if: contains(matrix.target, '-unknown-linux-musl')
        run: cross build --locked --release --target "${{ matrix.target }}"
      - name: Build the release binary
        if: contains(matrix.target, '-apple-darwin')
        run: cargo build --locked --release --target "${{ matrix.target }}"
      - name: Strip and package the binary
        shell: bash
        run: |
          target="${{ matrix.target }}"
          binary="target/$target/release/agentswap"
          if [ "$target" = "aarch64-unknown-linux-musl" ]; then
            aarch64-linux-gnu-strip "$binary"
          else
            strip "$binary"
          fi
          asset="agentswap-v${RELEASE_TAG#v}-$target.tar.gz"
          staging=$(mktemp -d)
          cp "$binary" "$staging/agentswap"
          tar -C "$staging" -czf "$asset" agentswap
          if command -v sha256sum >/dev/null 2>&1; then
            sha256sum "$asset" > "$asset.sha256"
          else
            shasum -a 256 "$asset" > "$asset.sha256"
          fi
      - uses: actions/upload-artifact@v7
        with:
          name: release-${{ matrix.target }}
          path: |
            agentswap-*.tar.gz
            agentswap-*.tar.gz.sha256
          if-no-files-found: error

  release:
    needs: build
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/download-artifact@v8
        with:
          path: dist
          pattern: release-*
          merge-multiple: true
      - name: Create or update the GitHub Release
        env:
          GH_TOKEN: ${{ github.token }}
          GH_REPO: ${{ github.repository }}
        run: |
          cd dist
          cat agentswap-*.tar.gz.sha256 | sort > SHA256SUMS
          if gh release view "$RELEASE_TAG" >/dev/null 2>&1; then
            gh release upload "$RELEASE_TAG" agentswap-*.tar.gz SHA256SUMS --clobber
          else
            gh release create "$RELEASE_TAG" agentswap-*.tar.gz SHA256SUMS --title "$RELEASE_TAG" --generate-notes
          fi