claude-code-switcher 0.11.2

A CLI tool for managing Claude Code setting snapshots and templates
name: Release

on:
  push:
    branches: [main]

env:
  CARGO_TERM_COLOR: always

jobs:
  build-release:
    name: Build release binaries
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            asset_name: ccs-x86_64-linux
            use_cross: false
          - os: ubuntu-latest
            target: aarch64-unknown-linux-gnu
            asset_name: ccs-aarch64-linux
            use_cross: true
          - os: macos-latest
            target: x86_64-apple-darwin
            asset_name: ccs-x86_64-macos
            use_native: true
          - os: macos-latest
            target: aarch64-apple-darwin
            asset_name: ccs-aarch64-macos
            use_cross: true
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            asset_name: ccs-x86_64-windows
            use_cross: false
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: actions-rust-lang/setup-rust-toolchain@v1
        with:
          toolchain: stable
          targets: ${{ matrix.use_cross == true && matrix.target || '' }}

      - name: Install cross
        if: matrix.use_cross == true
        uses: taiki-e/install-action@v2
        with:
          tool: cross

      - uses: Swatinem/rust-cache@v2

      - name: Build release binary
        run: |

          if [ "${{ matrix.use_native }}" = "true" ]; then
            cargo build --release
          elif [ "${{ matrix.use_cross }}" = "true" ]; then
            cross build --release --target ${{ matrix.target }}
          else
            cargo build --release --target ${{ matrix.target }}
          fi
        shell: bash

      - name: Prepare artifact (Unix)
        if: "!contains(runner.os, 'Windows')"
        run: |

          if [ "${{ matrix.use_native }}" = "true" ]; then
            cp target/release/ccs ${{ matrix.asset_name }}
          else
            cp target/${{ matrix.target }}/release/ccs ${{ matrix.asset_name }}
          fi
          chmod +x ${{ matrix.asset_name }}

      - name: Prepare artifact (Windows)
        if: contains(runner.os, 'Windows')
        run: |

          copy target\${{ matrix.target }}\release\ccs.exe ${{ matrix.asset_name }}.exe

      - name: Upload artifact (Unix)
        if: "!contains(runner.os, 'Windows')"
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.asset_name }}
          path: ${{ matrix.asset_name }}

      - name: Upload artifact (Windows)
        if: contains(runner.os, 'Windows')
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.asset_name }}
          path: ${{ matrix.asset_name }}.exe

  create-github-release:
    name: Create GitHub Release
    runs-on: ubuntu-latest
    needs: build-release
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4

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

      - name: Get version from Cargo.toml
        id: version
        run: |

          version=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/' | tr -d '"')
          echo "version=$version" >> $GITHUB_OUTPUT
          echo "Version: $version"

      - name: Create or update release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ steps.version.outputs.version }}
          name: Release ${{ steps.version.outputs.version }}
          body: |

            ## Changes
            Binary built from latest main branch.

            **Version:** ${{ steps.version.outputs.version }}
            **Commit:** ${{ github.sha }}
          files: artifacts/*/*
          draft: false
          prerelease: false
          fail_on_unmatched_files: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}