yek 0.17.0

A tool to serialize a repository into chunks of text files
Documentation
name: AI Fix Loop

on:
  workflow_dispatch:
    inputs:
      branch:
        description: "Branch to run"
        required: true
        default: "main"
      attempts:
        description: "Max attempts"
        default: "40"
        type: number
      pr-on-fail:
        description: "Create a PR on failure"
        default: false
        type: boolean

permissions:
  contents: write
  pull-requests: write
  issues: write

jobs:
  loop:
    name: AI Fix Loop
    runs-on: ubuntu-latest
    timeout-minutes: 360
    env:
      MAX_ATTEMPTS: ${{ github.event.inputs.attempts }}
      BRANCH: ${{ github.event.inputs.branch }}

    steps:
      - name: Print inputs
        run: |
          echo "MAX_ATTEMPTS=${{ env.MAX_ATTEMPTS }}"
          echo "BRANCH=${{ env.BRANCH }}"

      - name: Install Yek
        run: curl -fsSL https://bodo.run/yek.sh | bash

      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: ${{ env.BRANCH }}
          fetch-depth: 0

      - name: Cache Rust dependencies
        uses: actions/cache@v3
        with:
          path: |
            ~/.cargo
            target/
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "20"

      - name: Install askds
        run: npm install -g askds@latest

      - name: Setup Rust
        uses: dtolnay/rust-toolchain@stable

      - name: Build
        run: cargo build --locked

      - name: Run AI Fix
        id: ai_fix
        timeout-minutes: 360
        continue-on-error: true
        env:
          DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
          FIREWORKS_AI_API_KEY: ${{ secrets.FIREWORKS_AI_API_KEY }}
          RUST_TEST_TIMEOUT: 300
          MAX_ATTEMPTS: ${{ env.MAX_ATTEMPTS }}
        run: |
          bash ./scripts/ai-loop.sh
          echo "success=$?" >> "$GITHUB_OUTPUT"

      - name: Upload attempts log
        uses: actions/upload-artifact@v3
        with:
          name: attempts-log
          path: attempts.txt

      - name: Create PR or Issue
        if: always() && ${{ github.event.inputs.pr-on-fail }}
        uses: peter-evans/create-pull-request@v5
        env:
          GH_TOKEN: ${{ secrets.PAT_TOKEN }}
        with:
          token: ${{ env.GH_TOKEN }}
          commit-message: "AI Fix"
          title: "AI Fix for ${{ env.BRANCH }} (Attempts: ${{ env.MAX_ATTEMPTS }})"
          body: |
            ## AI Fix Results
            - Successfully fixed: ${{ steps.ai_fix.outputs.success == '0' && 'Yes' || 'No' }}
            - Total attempts: ${{ env.MAX_ATTEMPTS }}
            - Source branch: `${{ env.BRANCH }}`

            Check the attempts.txt artifact for details.
          branch: ${{ env.BRANCH }}-ai-fix
          base: ${{ env.BRANCH }}