claude-code-mux 0.5.3

High-performance, intelligent Claude Code router built in Rust
name: Release

on:
  push:
    tags:
      - 'v*'
  workflow_dispatch:
    inputs:
      version:
        description: 'Release version (e.g., v0.4.3)'
        required: true
        type: string

permissions:
  contents: write

jobs:
  validate:
    name: Validate version
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.validate.outputs.version }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Validate version format
        id: validate
        run: |
          # Get version from tag or workflow input
          if [[ "${{ github.event_name }}" == "push" ]]; then
            VERSION="${GITHUB_REF#refs/tags/}"
          else
            VERSION="${{ inputs.version }}"
          fi

          if [[ ! "$VERSION" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
            echo "Error: Invalid version format. Expected format: v0.0.0"
            exit 1
          fi
          echo "version=$VERSION" >> $GITHUB_OUTPUT
          echo "Valid version: $VERSION"

  build:
    name: Build ${{ matrix.target }}
    needs: validate
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          # Linux x86_64
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            binary_name: ccm
            archive_name: ccm-linux-x86_64.tar.gz

          # Linux x86_64 (musl for static linking)
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
            binary_name: ccm
            archive_name: ccm-linux-x86_64-musl.tar.gz

          # macOS Intel
          - os: macos-latest
            target: x86_64-apple-darwin
            binary_name: ccm
            archive_name: ccm-macos-x86_64.tar.gz

          # macOS Apple Silicon
          - os: macos-latest
            target: aarch64-apple-darwin
            binary_name: ccm
            archive_name: ccm-macos-aarch64.tar.gz

          # Windows
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            binary_name: ccm.exe
            archive_name: ccm-windows-x86_64.zip

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - name: Install musl tools (Linux musl only)
        if: matrix.target == 'x86_64-unknown-linux-musl'
        run: |
          sudo apt-get update
          sudo apt-get install -y musl-tools

      - name: Build binary
        run: cargo build --release --target ${{ matrix.target }}

      - name: Strip binary (Unix)
        if: runner.os != 'Windows'
        run: strip target/${{ matrix.target }}/release/${{ matrix.binary_name }}

      - name: Create archive (Unix)
        if: runner.os != 'Windows'
        run: |
          cd target/${{ matrix.target }}/release
          tar czf ${{ matrix.archive_name }} ${{ matrix.binary_name }}
          shasum -a 256 ${{ matrix.archive_name }} > ${{ matrix.archive_name }}.sha256

      - name: Create archive (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          cd target/${{ matrix.target }}/release
          Compress-Archive -Path ${{ matrix.binary_name }} -DestinationPath ${{ matrix.archive_name }}
          $hash = (Get-FileHash ${{ matrix.archive_name }} -Algorithm SHA256).Hash.ToLower()
          "$hash  ${{ matrix.archive_name }}" | Out-File -FilePath "${{ matrix.archive_name }}.sha256" -Encoding ASCII

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.target }}
          path: |
            target/${{ matrix.target }}/release/${{ matrix.archive_name }}
            target/${{ matrix.target }}/release/${{ matrix.archive_name }}.sha256

  release:
    name: Create Release
    needs: [validate, build]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Download all artifacts
        uses: actions/download-artifact@v4
        with:
          path: artifacts

      - name: Display structure of downloaded files
        run: ls -R artifacts

      - name: Create Release
        uses: softprops/action-gh-release@v1
        with:
          tag_name: ${{ needs.validate.outputs.version }}
          draft: false
          prerelease: false
          generate_release_notes: true
          files: |
            artifacts/**/*.tar.gz
            artifacts/**/*.zip
            artifacts/**/*.sha256
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}