prodigy 0.4.4

Turn ad-hoc Claude sessions into reproducible development pipelines with parallel AI agents
Documentation
name: Release

on:
  push:
    tags: ['v*']
  workflow_dispatch:
    inputs:
      version:
        description: 'Version to release'
        required: true
        type: string

permissions:
  contents: write

jobs:
  create-release:
    name: Create Release
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.get_version.outputs.version }}
    
    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
    
    - name: Get version
      id: get_version
      run: |
        if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
          echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
        else
          echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
        fi
    
    - name: Generate release notes
      id: release_notes
      run: |
        echo "# Release ${{ steps.get_version.outputs.version }}" > release_notes.md
        echo "" >> release_notes.md
        echo "## Changes" >> release_notes.md
        
        # Get the previous tag
        PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD~1 2>/dev/null || echo "")
        
        if [[ -n "$PREVIOUS_TAG" ]]; then
          echo "Changes since $PREVIOUS_TAG:" >> release_notes.md
          git log --oneline --format="- %s" $PREVIOUS_TAG..HEAD >> release_notes.md
        else
          echo "Initial release" >> release_notes.md
          git log --oneline --format="- %s" >> release_notes.md
        fi
    
    - name: Create Release
      id: create_release
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        gh release create "${{ steps.get_version.outputs.version }}" \
          --title "Release ${{ steps.get_version.outputs.version }}" \
          --notes-file release_notes.md \
          --draft=false \
          --prerelease=false

  build-release:
    name: Build Release
    needs: create-release
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        include:
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            binary: prodigy
            archive: tar.gz
          - os: ubuntu-latest
            target: x86_64-unknown-linux-musl
            binary: prodigy
            archive: tar.gz
          - os: macos-latest
            target: x86_64-apple-darwin
            binary: prodigy
            archive: tar.gz
          - os: macos-latest
            target: aarch64-apple-darwin
            binary: prodigy
            archive: tar.gz
    
    steps:
    - uses: actions/checkout@v6
    
    - name: Install Rust
      uses: dtolnay/rust-toolchain@stable
    
    - name: Add rust target
      run: rustup target add ${{ matrix.target }}
    
    - name: Install musl tools and dependencies
      if: matrix.target == 'x86_64-unknown-linux-musl'
      run: |
        sudo apt-get update
        sudo apt-get install -y musl-tools pkg-config libssl-dev perl make

    - name: Build release binary
      run: |
        # Use vendored OpenSSL for musl and macOS cross-compilation
        if [[ "${{ matrix.target }}" == "x86_64-unknown-linux-musl" ]] || \
           [[ "${{ matrix.target }}" == "x86_64-apple-darwin" && "${{ runner.arch }}" == "ARM64" ]] || \
           [[ "${{ matrix.target }}" == "aarch64-apple-darwin" && "${{ runner.arch }}" == "X64" ]]; then
          cargo build --release --target ${{ matrix.target }} --features vendored-openssl
        else
          cargo build --release --target ${{ matrix.target }}
        fi
    
    - name: Create archive (Unix)
      if: matrix.archive == 'tar.gz'
      run: |
        mkdir -p release
        cp target/${{ matrix.target }}/release/${{ matrix.binary }} release/
        cp README.md LICENSE release/
        cd release
        tar -czf ../prodigy-${{ matrix.target }}.tar.gz .
    
    - name: Generate checksums
      shell: bash
      run: |
        if [[ "${{ runner.os }}" == "macOS" ]]; then
          shasum -a 256 prodigy-${{ matrix.target }}.tar.gz > prodigy-${{ matrix.target }}.tar.gz.sha256
        else
          sha256sum prodigy-${{ matrix.target }}.tar.gz > prodigy-${{ matrix.target }}.tar.gz.sha256
        fi
    
    - name: Upload Release Assets
      shell: bash
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        gh release upload "${{ needs.create-release.outputs.version }}" \
          "prodigy-${{ matrix.target }}.tar.gz" \
          "prodigy-${{ matrix.target }}.tar.gz.sha256"