Significant-Gravitas/AutoGPT

30 workflows · maturity 100% · 10 patterns · GitHub ↗

Security 13.33/100

Practices

✓ Matrix✓ Permissions✓ Security scan✓ AI review✓ Cache✓ Concurrency○ Reusable workflows

Detected patterns

Security dimensions

permissions
5
security scan
8.3
supply chain
0
secret handling
0
harden runner
0

Tools: github/codeql-action/analyze, github/codeql-action/init

Workflows (30)

classic-autogpt-ci matrix .github/workflows/classic-autogpt-ci.yml
Triggers
push, pull_request
Runs on
${{ matrix.platform-os != 'macos-arm64' && format('{0}-latest', matrix.platform-os) || 'macos-14' }}
Jobs
test
Matrix
platform-os, python-version→ 3.10, macos, macos-arm64, ubuntu, windows
Actions
codecov/test-results-action, codecov/codecov-action
Commands
  • docker pull minio/minio:edge-cicd docker run -d -p 9000:9000 minio/minio:edge-cicd
  • brew install minio/stable/minio mkdir data minio server ./data &
  • git config --global user.name "Auto-GPT-Bot" git config --global user.email "github-bot@agpt.co"
  • echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
  • curl -sSL https://install.python-poetry.org | python3 - if [ "${{ runner.os }}" = "macOS" ]; then PATH="$HOME/.local/bin:$PATH" echo "$HOME/.local/bin" >> $GITHUB_PATH fi
  • (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python - $env:PATH += ";$env:APPDATA\Python\Scripts" echo "$env:APPDATA\Python\Scripts" >> $env:GITHUB_PATH
  • poetry install
  • poetry run pytest -vv \ --cov=autogpt --cov-branch --cov-report term-missing --cov-report xml \ --numprocesses=logical --durations=10 \ --junitxml=junit.xml -o junit_family=legacy \ tests/unit tests/integration
View raw YAML
name: Classic - AutoGPT CI

on:
  push:
    branches: [ master, dev, ci-test* ]
    paths:
      - '.github/workflows/classic-autogpt-ci.yml'
      - 'classic/original_autogpt/**'
  pull_request:
    branches: [ master, dev, release-* ]
    paths:
      - '.github/workflows/classic-autogpt-ci.yml'
      - 'classic/original_autogpt/**'

concurrency:
  group: ${{ format('classic-autogpt-ci-{0}', github.head_ref && format('{0}-{1}', github.event_name, github.event.pull_request.number) || github.sha) }}
  cancel-in-progress: ${{ startsWith(github.event_name, 'pull_request') }}

defaults:
  run:
    shell: bash
    working-directory: classic/original_autogpt

jobs:
  test:
    permissions:
      contents: read
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.10"]
        platform-os: [ubuntu, macos, macos-arm64, windows]
    runs-on: ${{ matrix.platform-os != 'macos-arm64' && format('{0}-latest', matrix.platform-os) || 'macos-14' }}

    steps:
      # Quite slow on macOS (2~4 minutes to set up Docker)
      # - name: Set up Docker (macOS)
      #   if: runner.os == 'macOS'
      #   uses: crazy-max/ghaction-setup-docker@v3

      - name: Start MinIO service (Linux)
        if: runner.os == 'Linux'
        working-directory: '.'
        run: |
          docker pull minio/minio:edge-cicd
          docker run -d -p 9000:9000 minio/minio:edge-cicd

      - name: Start MinIO service (macOS)
        if: runner.os == 'macOS'
        working-directory: ${{ runner.temp }}
        run: |
          brew install minio/stable/minio
          mkdir data
          minio server ./data &

      # No MinIO on Windows:
      # - Windows doesn't support running Linux Docker containers
      # - It doesn't seem possible to start background processes on Windows. They are
      #   killed after the step returns.
      #   See: https://github.com/actions/runner/issues/598#issuecomment-2011890429

      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          submodules: true

      - name: Configure git user Auto-GPT-Bot
        run: |
          git config --global user.name "Auto-GPT-Bot"
          git config --global user.email "github-bot@agpt.co"

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - id: get_date
        name: Get date
        run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT

      - name: Set up Python dependency cache
        # On Windows, unpacking cached dependencies takes longer than just installing them
        if: runner.os != 'Windows'
        uses: actions/cache@v4
        with:
          path: ${{ runner.os == 'macOS' && '~/Library/Caches/pypoetry' || '~/.cache/pypoetry' }}
          key: poetry-${{ runner.os }}-${{ hashFiles('classic/original_autogpt/poetry.lock') }}

      - name: Install Poetry (Unix)
        if: runner.os != 'Windows'
        run: |
          curl -sSL https://install.python-poetry.org | python3 -

          if [ "${{ runner.os }}" = "macOS" ]; then
            PATH="$HOME/.local/bin:$PATH"
            echo "$HOME/.local/bin" >> $GITHUB_PATH
          fi

      - name: Install Poetry (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -

          $env:PATH += ";$env:APPDATA\Python\Scripts"
          echo "$env:APPDATA\Python\Scripts" >> $env:GITHUB_PATH

      - name: Install Python dependencies
        run: poetry install

      - name: Run pytest with coverage
        run: |
          poetry run pytest -vv \
            --cov=autogpt --cov-branch --cov-report term-missing --cov-report xml \
            --numprocesses=logical --durations=10 \
            --junitxml=junit.xml -o junit_family=legacy \
            tests/unit tests/integration
        env:
          CI: true
          PLAIN_OUTPUT: True
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          S3_ENDPOINT_URL: ${{ runner.os != 'Windows' && 'http://127.0.0.1:9000' || '' }}
          AWS_ACCESS_KEY_ID: minioadmin
          AWS_SECRET_ACCESS_KEY: minioadmin

      - name: Upload test results to Codecov
        if: ${{ !cancelled() }}  # Run even if tests fail
        uses: codecov/test-results-action@v1
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

      - name: Upload coverage reports to Codecov
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          flags: autogpt-agent,${{ runner.os }}

      - name: Upload logs to artifact
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-logs
          path: classic/original_autogpt/logs/
classic-autogpt-docker-cache-clean matrix .github/workflows/classic-autogpt-docker-cache-clean.yml
Triggers
schedule
Runs on
ubuntu-latest
Jobs
build
Matrix
build-type→ dev, release
Actions
docker/setup-buildx-action, docker/build-push-action
Commands
  • .github/workflows/scripts/docker-ci-summary.sh >> $GITHUB_STEP_SUMMARY
View raw YAML
name: Classic - Purge Auto-GPT Docker CI cache

on:
  schedule:
    - cron: 20 4 * * 1,4

env:
  BASE_BRANCH: dev
  IMAGE_NAME: auto-gpt

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        build-type: [release, dev]
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - id: build
        name: Build image
        uses: docker/build-push-action@v6
        with:
          context: classic/
          file: classic/Dockerfile.autogpt
          build-args: BUILD_TYPE=${{ matrix.build-type }}
          load: true # save to docker images
          # use GHA cache as read-only
          cache-to: type=gha,scope=autogpt-docker-${{ matrix.build-type }},mode=max

      - name: Generate build report
        env:
          event_name: ${{ github.event_name }}
          event_ref: ${{ github.event.schedule }}

          build_type: ${{ matrix.build-type }}

          prod_branch: master
          dev_branch: dev
          repository: ${{ github.repository }}
          base_branch: ${{ github.ref_name != 'master' && github.ref_name != 'dev' && 'dev' || 'master' }}

          current_ref: ${{ github.ref_name }}
          commit_hash: ${{ github.sha }}
          source_url: ${{ format('{0}/tree/{1}', github.event.repository.url, github.sha) }}
          push_forced_label:

          new_commits_json: ${{ null }}
          compare_url_template: ${{ format('/{0}/compare/{{base}}...{{head}}', github.repository) }}

          github_context_json: ${{ toJSON(github) }}
          job_env_json: ${{ toJSON(env) }}
          vars_json: ${{ toJSON(vars) }}

        run: .github/workflows/scripts/docker-ci-summary.sh >> $GITHUB_STEP_SUMMARY
        continue-on-error: true
classic-autogpt-docker-ci matrix .github/workflows/classic-autogpt-docker-ci.yml
Triggers
push, pull_request
Runs on
ubuntu-latest, ubuntu-latest
Jobs
build, test
Matrix
build-type→ dev, release
Actions
docker/setup-buildx-action, docker/build-push-action, docker/login-action, docker/setup-buildx-action, docker/build-push-action
Commands
  • ls -al du -hs *
  • .github/workflows/scripts/docker-ci-summary.sh >> $GITHUB_STEP_SUMMARY
  • set +e docker run --env CI --env OPENAI_API_KEY \ --network container:minio \ --env S3_ENDPOINT_URL --env AWS_ACCESS_KEY_ID --env AWS_SECRET_ACCESS_KEY \ --entrypoint poetry ${{ env.IMAGE_NAME }} run \ pytest -v --cov=autogpt --cov-branch --cov-report term-missing \ --numprocesses=4 --durations=10 \ tests/unit tests/integration 2>&1 | tee test_output.txt test_failure=${PIPESTATUS[0]} cat << $EOF >> $GITHUB_STEP_SUMMARY # Tests $([ $test_failure = 0 ] && echo '✅' || echo '❌') \`\`\` $(cat test_output.txt) \`\`\` $EOF exit $test_failure
  • docker push ${{ env.DEPLOY_IMAGE_NAME }}:${{ env.DEV_IMAGE_TAG }}
View raw YAML
name: Classic - AutoGPT Docker CI

on:
  push:
    branches: [master, dev]
    paths:
      - '.github/workflows/classic-autogpt-docker-ci.yml'
      - 'classic/original_autogpt/**'
      - 'classic/forge/**'
  pull_request:
    branches: [ master, dev, release-* ]
    paths:
      - '.github/workflows/classic-autogpt-docker-ci.yml'
      - 'classic/original_autogpt/**'
      - 'classic/forge/**'

concurrency:
  group: ${{ format('classic-autogpt-docker-ci-{0}', github.head_ref && format('pr-{0}', github.event.pull_request.number) || github.sha) }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

defaults:
  run:
    working-directory: classic/original_autogpt

env:
  IMAGE_NAME: auto-gpt
  DEPLOY_IMAGE_NAME: ${{ secrets.DOCKER_USER && format('{0}/', secrets.DOCKER_USER) || '' }}auto-gpt
  DEV_IMAGE_TAG: latest-dev

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        build-type: [release, dev]
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - if: runner.debug
        run: |
          ls -al
          du -hs *

      - id: build
        name: Build image
        uses: docker/build-push-action@v6
        with:
          context: classic/
          file: classic/Dockerfile.autogpt
          build-args: BUILD_TYPE=${{ matrix.build-type }}
          tags: ${{ env.IMAGE_NAME }}
          labels: GIT_REVISION=${{ github.sha }}
          load: true # save to docker images
          # cache layers in GitHub Actions cache to speed up builds
          cache-from: type=gha,scope=autogpt-docker-${{ matrix.build-type }}
          cache-to: type=gha,scope=autogpt-docker-${{ matrix.build-type }},mode=max

      - name: Generate build report
        env:
          event_name: ${{ github.event_name }}
          event_ref: ${{ github.event.ref }}
          event_ref_type: ${{ github.event.ref}}

          build_type: ${{ matrix.build-type }}

          prod_branch: master
          dev_branch: dev
          repository: ${{ github.repository }}
          base_branch: ${{ github.ref_name != 'master' && github.ref_name != 'dev' && 'dev' || 'master' }}

          current_ref: ${{ github.ref_name }}
          commit_hash: ${{ github.event.after }}
          source_url: ${{ format('{0}/tree/{1}', github.event.repository.url, github.event.release && github.event.release.tag_name || github.sha) }}
          push_forced_label: ${{ github.event.forced && '☢️ forced' || '' }}

          new_commits_json: ${{ toJSON(github.event.commits) }}
          compare_url_template: ${{ format('/{0}/compare/{{base}}...{{head}}', github.repository) }}

          github_context_json: ${{ toJSON(github) }}
          job_env_json: ${{ toJSON(env) }}
          vars_json: ${{ toJSON(vars) }}

        run: .github/workflows/scripts/docker-ci-summary.sh >> $GITHUB_STEP_SUMMARY
        continue-on-error: true

  test:
    runs-on: ubuntu-latest
    timeout-minutes: 10

    services:
      minio:
        image: minio/minio:edge-cicd
        options: >
          --name=minio
          --health-interval=10s --health-timeout=5s --health-retries=3
          --health-cmd="curl -f http://localhost:9000/minio/health/live"

    steps:
      - name: Check out repository
        uses: actions/checkout@v4
        with:
          submodules: true

      - if: github.event_name == 'push'
        name: Log in to Docker hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - id: build
        name: Build image
        uses: docker/build-push-action@v6
        with:
          context: classic/
          file: classic/Dockerfile.autogpt
          build-args: BUILD_TYPE=dev # include pytest
          tags: >
            ${{ env.IMAGE_NAME }},
            ${{ env.DEPLOY_IMAGE_NAME }}:${{ env.DEV_IMAGE_TAG }}
          labels: GIT_REVISION=${{ github.sha }}
          load: true # save to docker images
          # cache layers in GitHub Actions cache to speed up builds
          cache-from: type=gha,scope=autogpt-docker-dev
          cache-to: type=gha,scope=autogpt-docker-dev,mode=max

      - id: test
        name: Run tests
        env:
          CI: true
          PLAIN_OUTPUT: True
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          S3_ENDPOINT_URL: http://minio:9000
          AWS_ACCESS_KEY_ID: minioadmin
          AWS_SECRET_ACCESS_KEY: minioadmin
        run: |
          set +e
          docker run --env CI --env OPENAI_API_KEY \
            --network container:minio \
            --env S3_ENDPOINT_URL --env AWS_ACCESS_KEY_ID --env AWS_SECRET_ACCESS_KEY \
            --entrypoint poetry ${{ env.IMAGE_NAME }} run \
            pytest -v --cov=autogpt --cov-branch --cov-report term-missing \
            --numprocesses=4 --durations=10 \
            tests/unit tests/integration 2>&1 | tee test_output.txt

          test_failure=${PIPESTATUS[0]}

          cat << $EOF >> $GITHUB_STEP_SUMMARY
          # Tests $([ $test_failure = 0 ] && echo '✅' || echo '❌')
          \`\`\`
          $(cat test_output.txt)
          \`\`\`
          $EOF

          exit $test_failure

      - if: github.event_name == 'push' && github.ref_name == 'master'
        name: Push image to Docker Hub
        run: docker push ${{ env.DEPLOY_IMAGE_NAME }}:${{ env.DEV_IMAGE_TAG }}
classic-autogpt-docker-release .github/workflows/classic-autogpt-docker-release.yml
Triggers
release, workflow_dispatch
Runs on
ubuntu-latest
Jobs
build
Actions
docker/login-action, docker/setup-buildx-action, docker/build-push-action
Commands
  • tag=${raw_tag//\//-} echo tag=${tag#autogpt-} >> $GITHUB_OUTPUT
  • docker push --all-tags ${{ env.DEPLOY_IMAGE_NAME }}
  • .github/workflows/scripts/docker-release-summary.sh >> $GITHUB_STEP_SUMMARY
View raw YAML
name: Classic - AutoGPT Docker Release

on:
  release:
    types: [published, edited]

  workflow_dispatch:
    inputs:
      no_cache:
        type: boolean
        description: 'Build from scratch, without using cached layers'

env:
  IMAGE_NAME: auto-gpt
  DEPLOY_IMAGE_NAME: ${{ secrets.DOCKER_USER }}/auto-gpt

jobs:
  build:
    if: startsWith(github.ref, 'refs/tags/autogpt-')
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Log in to Docker hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

        # slashes are not allowed in image tags, but can appear in git branch or tag names
      - id: sanitize_tag
        name: Sanitize image tag
        run: |
          tag=${raw_tag//\//-}
          echo tag=${tag#autogpt-} >> $GITHUB_OUTPUT
        env:
          raw_tag: ${{ github.ref_name }}

      - id: build
        name: Build image
        uses: docker/build-push-action@v6
        with:
          context: classic/
          file: Dockerfile.autogpt
          build-args: BUILD_TYPE=release
          load: true # save to docker images
          # push: true  # TODO: uncomment when this issue is fixed: https://github.com/moby/buildkit/issues/1555
          tags: >
            ${{ env.IMAGE_NAME }},
            ${{ env.DEPLOY_IMAGE_NAME }}:latest,
            ${{ env.DEPLOY_IMAGE_NAME }}:${{ steps.sanitize_tag.outputs.tag }}
          labels: GIT_REVISION=${{ github.sha }}

          # cache layers in GitHub Actions cache to speed up builds
          cache-from: ${{ !inputs.no_cache && 'type=gha' || '' }},scope=autogpt-docker-release
          cache-to: type=gha,scope=autogpt-docker-release,mode=max

      - name: Push image to Docker Hub
        run: docker push --all-tags ${{ env.DEPLOY_IMAGE_NAME }}

      - name: Generate build report
        env:
          event_name: ${{ github.event_name }}
          event_ref: ${{ github.event.ref }}
          event_ref_type: ${{ github.event.ref}}
          inputs_no_cache: ${{ inputs.no_cache }}

          prod_branch: master
          dev_branch: dev
          repository: ${{ github.repository }}
          base_branch: ${{ github.ref_name != 'master' && github.ref_name != 'dev' && 'dev' || 'master' }}

          ref_type: ${{ github.ref_type }}
          current_ref: ${{ github.ref_name }}
          commit_hash: ${{ github.sha }}
          source_url: ${{ format('{0}/tree/{1}', github.event.repository.url, github.event.release && github.event.release.tag_name || github.sha) }}

          github_context_json: ${{ toJSON(github) }}
          job_env_json: ${{ toJSON(env) }}
          vars_json: ${{ toJSON(vars) }}

        run: .github/workflows/scripts/docker-release-summary.sh >> $GITHUB_STEP_SUMMARY
        continue-on-error: true
classic-autogpts-ci matrix .github/workflows/classic-autogpts-ci.yml
Triggers
workflow_dispatch, schedule, push, pull_request
Runs on
ubuntu-latest
Jobs
serve-agent-protocol
Matrix
agent-name→ original_autogpt
Commands
  • curl -sSL https://install.python-poetry.org | python -
  • ./run agent start ${{ matrix.agent-name }} cd ${{ matrix.agent-name }} poetry run agbenchmark --mock --test=BasicRetrieval --test=Battleship --test=WebArenaTask_0 poetry run agbenchmark --test=WriteFile
View raw YAML
name: Classic - Agent smoke tests

on:
  workflow_dispatch:
  schedule:
    - cron: '0 8 * * *'
  push:
    branches: [ master, dev, ci-test* ]
    paths:
      - '.github/workflows/classic-autogpts-ci.yml'
      - 'classic/original_autogpt/**'
      - 'classic/forge/**'
      - 'classic/benchmark/**'
      - 'classic/run'
      - 'classic/cli.py'
      - 'classic/setup.py'
      - '!**/*.md'
  pull_request:
    branches: [ master, dev, release-* ]
    paths:
      - '.github/workflows/classic-autogpts-ci.yml'
      - 'classic/original_autogpt/**'
      - 'classic/forge/**'
      - 'classic/benchmark/**'
      - 'classic/run'
      - 'classic/cli.py'
      - 'classic/setup.py'
      - '!**/*.md'

defaults:
  run:
    shell: bash
    working-directory: classic

jobs:
  serve-agent-protocol:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        agent-name: [ original_autogpt ]
      fail-fast: false
    timeout-minutes: 20
    env:
      min-python-version: '3.10'
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          submodules: true

      - name: Set up Python ${{ env.min-python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ env.min-python-version }}

      - name: Install Poetry
        working-directory: ./classic/${{ matrix.agent-name }}/
        run: |
          curl -sSL https://install.python-poetry.org | python -

      - name: Run regression tests
        run: |
          ./run agent start ${{ matrix.agent-name }}
          cd ${{ matrix.agent-name }}
          poetry run agbenchmark --mock --test=BasicRetrieval --test=Battleship --test=WebArenaTask_0
          poetry run agbenchmark --test=WriteFile
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          AGENT_NAME: ${{ matrix.agent-name }}
          REQUESTS_CA_BUNDLE: /etc/ssl/certs/ca-certificates.crt
          HELICONE_CACHE_ENABLED: false
          HELICONE_PROPERTY_AGENT: ${{ matrix.agent-name }}
          REPORTS_FOLDER: ${{ format('../../reports/{0}', matrix.agent-name) }}
          TELEMETRY_ENVIRONMENT: autogpt-ci
          TELEMETRY_OPT_IN: ${{ github.ref_name == 'master' }}
classic-benchmark-ci matrix .github/workflows/classic-benchmark-ci.yml
Triggers
push, pull_request
Runs on
${{ matrix.platform-os != 'macos-arm64' && format('{0}-latest', matrix.platform-os) || 'macos-14' }}, ubuntu-latest
Jobs
test, self-test-with-agent
Matrix
agent-name, platform-os, python-version→ 3.10, forge, macos, macos-arm64, ubuntu, windows
Actions
codecov/test-results-action, codecov/codecov-action
Commands
  • curl -sSL https://install.python-poetry.org | python3 - if [ "${{ runner.os }}" = "macOS" ]; then PATH="$HOME/.local/bin:$PATH" echo "$HOME/.local/bin" >> $GITHUB_PATH fi
  • (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python - $env:PATH += ";$env:APPDATA\Python\Scripts" echo "$env:APPDATA\Python\Scripts" >> $env:GITHUB_PATH
  • poetry install
  • poetry run pytest -vv \ --cov=agbenchmark --cov-branch --cov-report term-missing --cov-report xml \ --durations=10 \ --junitxml=junit.xml -o junit_family=legacy \ tests
  • curl -sSL https://install.python-poetry.org | python -
  • ./run agent start ${{ matrix.agent-name }} cd ${{ matrix.agent-name }} set +e # Ignore non-zero exit codes and continue execution echo "Running the following command: poetry run agbenchmark --maintain --mock" poetry run agbenchmark --maintain --mock EXIT_CODE=$? set -e # Stop ignoring non-zero exit codes # Check if the exit code was 5, and if so, exit with 0 instead if [ $EXIT_CODE -eq 5 ]; then echo "regression_tests.json is empty." fi echo "Running the following command: poetry run agbenchmark --mock" poetry run agbenchmark --mock echo "Running the following command: poetry run agbenchmark --mock --category=data" poetry run agbenchmark --mock --category=data echo "Running the following command: poetry run agbenchmark --mock --category=coding" poetry run agbenchmark --mock --category=coding # echo "Running the following command: poetry run agbenchmark --test=WriteFile" # poetry run agbenchmark --test=WriteFile cd ../benchmark poetry install echo "Adding the BUILD_SKILL_TREE environment variable. This will attempt to add new elements in the skill tree. If new elements are added, the CI fails because they should have been pushed" export BUILD_SKILL_TREE=true # poetry run agbenchmark --mock # CHANGED=$(git diff --name-only | grep -E '(agbenchmark/challenges)|(../classic/frontend/assets)') || echo "No diffs" # if [ ! -z "$CHANGED" ]; then # echo "There are unstaged changes please run agbenchmark and commit those changes since they are needed." # echo "$CHANGED" # exit 1 # else # echo "No unstaged changes." # fi
View raw YAML
name: Classic - AGBenchmark CI

on:
  push:
    branches: [ master, dev, ci-test* ]
    paths:
      - 'classic/benchmark/**'
      - '!classic/benchmark/reports/**'
      - .github/workflows/classic-benchmark-ci.yml
  pull_request:
    branches: [ master, dev, release-* ]
    paths:
      - 'classic/benchmark/**'
      - '!classic/benchmark/reports/**'
      - .github/workflows/classic-benchmark-ci.yml

concurrency:
  group: ${{ format('benchmark-ci-{0}', github.head_ref && format('{0}-{1}', github.event_name, github.event.pull_request.number) || github.sha) }}
  cancel-in-progress: ${{ startsWith(github.event_name, 'pull_request') }}

defaults:
  run:
    shell: bash

env:
  min-python-version: '3.10'

jobs:
  test:
    permissions:
      contents: read
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.10"]
        platform-os: [ubuntu, macos, macos-arm64, windows]
    runs-on: ${{ matrix.platform-os != 'macos-arm64' && format('{0}-latest', matrix.platform-os) || 'macos-14' }}
    defaults:
      run:
        shell: bash
        working-directory: classic/benchmark
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          submodules: true

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Set up Python dependency cache
        # On Windows, unpacking cached dependencies takes longer than just installing them
        if: runner.os != 'Windows'
        uses: actions/cache@v4
        with:
          path: ${{ runner.os == 'macOS' && '~/Library/Caches/pypoetry' || '~/.cache/pypoetry' }}
          key: poetry-${{ runner.os }}-${{ hashFiles('classic/benchmark/poetry.lock') }}

      - name: Install Poetry (Unix)
        if: runner.os != 'Windows'
        run: |
          curl -sSL https://install.python-poetry.org | python3 -

          if [ "${{ runner.os }}" = "macOS" ]; then
            PATH="$HOME/.local/bin:$PATH"
            echo "$HOME/.local/bin" >> $GITHUB_PATH
          fi

      - name: Install Poetry (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -

          $env:PATH += ";$env:APPDATA\Python\Scripts"
          echo "$env:APPDATA\Python\Scripts" >> $env:GITHUB_PATH

      - name: Install Python dependencies
        run: poetry install

      - name: Run pytest with coverage
        run: |
          poetry run pytest -vv \
            --cov=agbenchmark --cov-branch --cov-report term-missing --cov-report xml \
            --durations=10 \
            --junitxml=junit.xml -o junit_family=legacy \
            tests
        env:
          CI: true
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

      - name: Upload test results to Codecov
        if: ${{ !cancelled() }}  # Run even if tests fail
        uses: codecov/test-results-action@v1
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

      - name: Upload coverage reports to Codecov
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          flags: agbenchmark,${{ runner.os }}

  self-test-with-agent:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        agent-name: [forge]
      fail-fast: false
    timeout-minutes: 20
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          submodules: true

      - name: Set up Python ${{ env.min-python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ env.min-python-version }}

      - name: Install Poetry
        run: |
          curl -sSL https://install.python-poetry.org | python -

      - name: Run regression tests
        working-directory: classic
        run: |
          ./run agent start ${{ matrix.agent-name }}
          cd ${{ matrix.agent-name }}

          set +e # Ignore non-zero exit codes and continue execution
          echo "Running the following command: poetry run agbenchmark --maintain --mock"
          poetry run agbenchmark --maintain --mock
          EXIT_CODE=$?
          set -e  # Stop ignoring non-zero exit codes
          # Check if the exit code was 5, and if so, exit with 0 instead
          if [ $EXIT_CODE -eq 5 ]; then
            echo "regression_tests.json is empty."
          fi

          echo "Running the following command: poetry run agbenchmark --mock"
          poetry run agbenchmark --mock

          echo "Running the following command: poetry run agbenchmark --mock --category=data"
          poetry run agbenchmark --mock --category=data

          echo "Running the following command: poetry run agbenchmark --mock --category=coding"
          poetry run agbenchmark --mock --category=coding

          # echo "Running the following command: poetry run agbenchmark --test=WriteFile"
          # poetry run agbenchmark --test=WriteFile
          cd ../benchmark
          poetry install
          echo "Adding the BUILD_SKILL_TREE environment variable. This will attempt to add new elements in the skill tree. If new elements are added, the CI fails because they should have been pushed"
          export BUILD_SKILL_TREE=true

          # poetry run agbenchmark --mock

          # CHANGED=$(git diff --name-only | grep -E '(agbenchmark/challenges)|(../classic/frontend/assets)') || echo "No diffs"
          # if [ ! -z "$CHANGED" ]; then
          #   echo "There are unstaged changes please run agbenchmark and commit those changes since they are needed."
          #   echo "$CHANGED"
          #   exit 1
          # else
          #   echo "No unstaged changes."
          # fi
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          TELEMETRY_ENVIRONMENT: autogpt-benchmark-ci
          TELEMETRY_OPT_IN: ${{ github.ref_name == 'master' }}
classic-benchmark_publish_package .github/workflows/classic-benchmark_publish_package.yml
Triggers
workflow_dispatch
Runs on
ubuntu-latest
Jobs
deploy
Actions
ncipollo/release-action
Commands
  • curl -sSL https://install.python-poetry.org | python3 - echo "$HOME/.poetry/bin" >> $GITHUB_PATH
  • poetry build
  • poetry install
  • echo version=$(poetry version --short) >> $GITHUB_OUTPUT
  • poetry publish -u __token__ -p ${{ secrets.PYPI_API_TOKEN }}
View raw YAML
name: Classic - Publish to PyPI

on:
  workflow_dispatch:

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4
      with:
        submodules: true
        fetch-depth: 0

    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: 3.8

    - name: Install Poetry
      working-directory: ./classic/benchmark/
      run: |
        curl -sSL https://install.python-poetry.org | python3 -
        echo "$HOME/.poetry/bin" >> $GITHUB_PATH

    - name: Build project for distribution
      working-directory: ./classic/benchmark/
      run: poetry build

    - name: Install dependencies
      working-directory: ./classic/benchmark/
      run: poetry install

    - name: Check Version
      working-directory: ./classic/benchmark/
      id: check-version
      run: |
        echo version=$(poetry version --short) >> $GITHUB_OUTPUT

    - name: Create Release
      uses: ncipollo/release-action@v1
      with:
        artifacts: "classic/benchmark/dist/*"
        token: ${{ secrets.GITHUB_TOKEN }}
        draft: false
        generateReleaseNotes: false
        tag: agbenchmark-v${{ steps.check-version.outputs.version }}
        commit: master

    - name: Build and publish
      working-directory: ./classic/benchmark/
      run: poetry publish -u __token__ -p ${{ secrets.PYPI_API_TOKEN }}
classic-forge-ci matrix .github/workflows/classic-forge-ci.yml
Triggers
push, pull_request
Runs on
${{ matrix.platform-os != 'macos-arm64' && format('{0}-latest', matrix.platform-os) || 'macos-14' }}
Jobs
test
Matrix
platform-os, python-version→ 3.10, macos, macos-arm64, ubuntu, windows
Actions
codecov/test-results-action, codecov/codecov-action
Commands
  • docker pull minio/minio:edge-cicd docker run -d -p 9000:9000 minio/minio:edge-cicd
  • brew install minio/stable/minio mkdir data minio server ./data &
  • cassette_branch="${PR_AUTHOR}-${PR_BRANCH}" cassette_base_branch="${PR_BASE}" cd tests/vcr_cassettes if ! git ls-remote --exit-code --heads origin $cassette_base_branch ; then cassette_base_branch="master" fi if git ls-remote --exit-code --heads origin $cassette_branch ; then git fetch origin $cassette_branch git fetch origin $cassette_base_branch git checkout $cassette_branch # Pick non-conflicting cassette updates from the base branch git merge --no-commit --strategy-option=ours origin/$cassette_base_branch echo "Using cassettes from mirror branch '$cassette_branch'," \ "synced to upstream branch '$cassette_base_branch'." else git checkout -b $cassette_branch echo "Branch '$cassette_branch' does not exist in cassette submodule." \ "Using cassettes from '$cassette_base_branch'." fi
  • curl -sSL https://install.python-poetry.org | python3 - if [ "${{ runner.os }}" = "macOS" ]; then PATH="$HOME/.local/bin:$PATH" echo "$HOME/.local/bin" >> $GITHUB_PATH fi
  • (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python - $env:PATH += ";$env:APPDATA\Python\Scripts" echo "$env:APPDATA\Python\Scripts" >> $env:GITHUB_PATH
  • poetry install
  • poetry run pytest -vv \ --cov=forge --cov-branch --cov-report term-missing --cov-report xml \ --durations=10 \ --junitxml=junit.xml -o junit_family=legacy \ forge
  • config_key="http.${{ github.server_url }}/.extraheader" if [ "${{ runner.os }}" = 'macOS' ]; then base64_pat=$(echo -n "pat:${{ secrets.PAT_REVIEW }}" | base64) else base64_pat=$(echo -n "pat:${{ secrets.PAT_REVIEW }}" | base64 -w0) fi git config "$config_key" \ "Authorization: Basic $base64_pat" cd tests/vcr_cassettes git config "$config_key" \ "Authorization: Basic $base64_pat" echo "config_key=$config_key" >> $GITHUB_OUTPUT
View raw YAML
name: Classic - Forge CI

on:
  push:
    branches: [ master, dev, ci-test* ]
    paths:
      - '.github/workflows/classic-forge-ci.yml'
      - 'classic/forge/**'
      - '!classic/forge/tests/vcr_cassettes'
  pull_request:
    branches: [ master, dev, release-* ]
    paths:
      - '.github/workflows/classic-forge-ci.yml'
      - 'classic/forge/**'
      - '!classic/forge/tests/vcr_cassettes'

concurrency:
  group: ${{ format('forge-ci-{0}', github.head_ref && format('{0}-{1}', github.event_name, github.event.pull_request.number) || github.sha) }}
  cancel-in-progress: ${{ startsWith(github.event_name, 'pull_request') }}

defaults:
  run:
    shell: bash
    working-directory: classic/forge

jobs:
  test:
    permissions:
      contents: read
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.10"]
        platform-os: [ubuntu, macos, macos-arm64, windows]
    runs-on: ${{ matrix.platform-os != 'macos-arm64' && format('{0}-latest', matrix.platform-os) || 'macos-14' }}

    steps:
      # Quite slow on macOS (2~4 minutes to set up Docker)
      # - name: Set up Docker (macOS)
      #   if: runner.os == 'macOS'
      #   uses: crazy-max/ghaction-setup-docker@v3

      - name: Start MinIO service (Linux)
        if: runner.os == 'Linux'
        working-directory: '.'
        run: |
          docker pull minio/minio:edge-cicd
          docker run -d -p 9000:9000 minio/minio:edge-cicd

      - name: Start MinIO service (macOS)
        if: runner.os == 'macOS'
        working-directory: ${{ runner.temp }}
        run: |
          brew install minio/stable/minio
          mkdir data
          minio server ./data &

      # No MinIO on Windows:
      # - Windows doesn't support running Linux Docker containers
      # - It doesn't seem possible to start background processes on Windows. They are
      #   killed after the step returns.
      #   See: https://github.com/actions/runner/issues/598#issuecomment-2011890429

      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          submodules: true

      - name: Checkout cassettes
        if: ${{ startsWith(github.event_name, 'pull_request') }}
        env:
          PR_BASE: ${{ github.event.pull_request.base.ref }}
          PR_BRANCH: ${{ github.event.pull_request.head.ref }}
          PR_AUTHOR: ${{ github.event.pull_request.user.login }}
        run: |
          cassette_branch="${PR_AUTHOR}-${PR_BRANCH}"
          cassette_base_branch="${PR_BASE}"
          cd tests/vcr_cassettes

          if ! git ls-remote --exit-code --heads origin $cassette_base_branch ; then
            cassette_base_branch="master"
          fi

          if git ls-remote --exit-code --heads origin $cassette_branch ; then
            git fetch origin $cassette_branch
            git fetch origin $cassette_base_branch

            git checkout $cassette_branch

            # Pick non-conflicting cassette updates from the base branch
            git merge --no-commit --strategy-option=ours origin/$cassette_base_branch
            echo "Using cassettes from mirror branch '$cassette_branch'," \
              "synced to upstream branch '$cassette_base_branch'."
          else
            git checkout -b $cassette_branch
            echo "Branch '$cassette_branch' does not exist in cassette submodule." \
              "Using cassettes from '$cassette_base_branch'."
          fi

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Set up Python dependency cache
        # On Windows, unpacking cached dependencies takes longer than just installing them
        if: runner.os != 'Windows'
        uses: actions/cache@v4
        with:
          path: ${{ runner.os == 'macOS' && '~/Library/Caches/pypoetry' || '~/.cache/pypoetry' }}
          key: poetry-${{ runner.os }}-${{ hashFiles('classic/forge/poetry.lock') }}

      - name: Install Poetry (Unix)
        if: runner.os != 'Windows'
        run: |
          curl -sSL https://install.python-poetry.org | python3 -

          if [ "${{ runner.os }}" = "macOS" ]; then
            PATH="$HOME/.local/bin:$PATH"
            echo "$HOME/.local/bin" >> $GITHUB_PATH
          fi

      - name: Install Poetry (Windows)
        if: runner.os == 'Windows'
        shell: pwsh
        run: |
          (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python -

          $env:PATH += ";$env:APPDATA\Python\Scripts"
          echo "$env:APPDATA\Python\Scripts" >> $env:GITHUB_PATH

      - name: Install Python dependencies
        run: poetry install

      - name: Run pytest with coverage
        run: |
          poetry run pytest -vv \
            --cov=forge --cov-branch --cov-report term-missing --cov-report xml \
            --durations=10 \
            --junitxml=junit.xml -o junit_family=legacy \
            forge
        env:
          CI: true
          PLAIN_OUTPUT: True
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          S3_ENDPOINT_URL: ${{ runner.os != 'Windows' && 'http://127.0.0.1:9000' || '' }}
          AWS_ACCESS_KEY_ID: minioadmin
          AWS_SECRET_ACCESS_KEY: minioadmin

      - name: Upload test results to Codecov
        if: ${{ !cancelled() }}  # Run even if tests fail
        uses: codecov/test-results-action@v1
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

      - name: Upload coverage reports to Codecov
        uses: codecov/codecov-action@v5
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          flags: forge,${{ runner.os }}

      - id: setup_git_auth
        name: Set up git token authentication
        # Cassettes may be pushed even when tests fail
        if: success() || failure()
        run: |
          config_key="http.${{ github.server_url }}/.extraheader"
          if [ "${{ runner.os }}" = 'macOS' ]; then
            base64_pat=$(echo -n "pat:${{ secrets.PAT_REVIEW }}" | base64)
          else
            base64_pat=$(echo -n "pat:${{ secrets.PAT_REVIEW }}" | base64 -w0)
          fi

          git config "$config_key" \
            "Authorization: Basic $base64_pat"

          cd tests/vcr_cassettes
          git config "$config_key" \
            "Authorization: Basic $base64_pat"

          echo "config_key=$config_key" >> $GITHUB_OUTPUT

      - id: push_cassettes
        name: Push updated cassettes
        # For pull requests, push updated cassettes even when tests fail
        if: github.event_name == 'push' || (! github.event.pull_request.head.repo.fork && (success() || failure()))
        env:
          PR_BRANCH: ${{ github.event.pull_request.head.ref }}
          PR_AUTHOR: ${{ github.event.pull_request.user.login }}
        run: |
          if [ "${{ startsWith(github.event_name, 'pull_request') }}" = "true" ]; then
            is_pull_request=true
            cassette_branch="${PR_AUTHOR}-${PR_BRANCH}"
          else
            cassette_branch="${{ github.ref_name }}"
          fi

          cd tests/vcr_cassettes
          # Commit & push changes to cassettes if any
          if ! git diff --quiet; then
            git add .
            git commit -m "Auto-update cassettes"
            git push origin HEAD:$cassette_branch
            if [ ! $is_pull_request ]; then
              cd ../..
              git add tests/vcr_cassettes
              git commit -m "Update cassette submodule"
              git push origin HEAD:$cassette_branch
            fi
            echo "updated=true" >> $GITHUB_OUTPUT
          else
            echo "updated=false" >> $GITHUB_OUTPUT
            echo "No cassette changes to commit"
          fi

      - name: Post Set up git token auth
        if: steps.setup_git_auth.outcome == 'success'
        run: |
          git config --unset-all '${{ steps.setup_git_auth.outputs.config_key }}'
          git submodule foreach git config --unset-all '${{ steps.setup_git_auth.outputs.config_key }}'

      - name: Apply "behaviour change" label and comment on PR
        if: ${{ startsWith(github.event_name, 'pull_request') }}
        run: |
          PR_NUMBER="${{ github.event.pull_request.number }}"
          TOKEN="${{ secrets.PAT_REVIEW }}"
          REPO="${{ github.repository }}"

          if [[ "${{ steps.push_cassettes.outputs.updated }}" == "true" ]]; then
            echo "Adding label and comment..."
            echo $TOKEN | gh auth login --with-token
            gh issue edit $PR_NUMBER --add-label "behaviour change"
            gh issue comment $PR_NUMBER --body "You changed AutoGPT's behaviour on ${{ runner.os }}. The cassettes have been updated and will be merged to the submodule when this Pull Request gets merged."
          fi

      - name: Upload logs to artifact
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-logs
          path: classic/forge/logs/
classic-frontend-ci .github/workflows/classic-frontend-ci.yml
Triggers
push, pull_request
Runs on
ubuntu-latest
Jobs
build
Actions
subosito/flutter-action, peter-evans/create-pull-request
Commands
  • cd classic/frontend flutter build web --base-href /app/
View raw YAML
name: Classic - Frontend CI/CD

on:
  push:
    branches:
      - master
      - dev
      - 'ci-test*' # This will match any branch that starts with "ci-test"
    paths:
      - 'classic/frontend/**'
      - '.github/workflows/classic-frontend-ci.yml'
  pull_request:
    paths:
      - 'classic/frontend/**'
      - '.github/workflows/classic-frontend-ci.yml'

jobs:
  build:
    permissions:
      contents: write
      pull-requests: write
    runs-on: ubuntu-latest
    env:
      BUILD_BRANCH: ${{ format('classic-frontend-build/{0}', github.ref_name) }}

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

      - name: Setup Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: '3.13.2'

      - name: Build Flutter to Web
        run: |
          cd classic/frontend
          flutter build web --base-href /app/

      # - name: Commit and Push to ${{ env.BUILD_BRANCH }}
      #   if: github.event_name == 'push'
      #   run: |
      #     git config --local user.email "action@github.com"
      #     git config --local user.name "GitHub Action"
      #     git add classic/frontend/build/web
      #     git checkout -B ${{ env.BUILD_BRANCH }}
      #     git commit -m "Update frontend build to ${GITHUB_SHA:0:7}" -a
      #     git push -f origin ${{ env.BUILD_BRANCH }}

      - name: Create PR ${{ env.BUILD_BRANCH }} -> ${{ github.ref_name }}
        if: github.event_name == 'push'
        uses: peter-evans/create-pull-request@v8
        with:
          add-paths: classic/frontend/build/web
          base: ${{ github.ref_name }}
          branch: ${{ env.BUILD_BRANCH }}
          delete-branch: true
          title: "Update frontend build in `${{ github.ref_name }}`"
          body: "This PR updates the frontend build based on commit ${{ github.sha }}."
          commit-message: "Update frontend build based on commit ${{ github.sha }}"
classic-python-checks matrix .github/workflows/classic-python-checks.yml
Triggers
push, pull_request
Runs on
ubuntu-latest, ubuntu-latest, ubuntu-latest
Jobs
get-changed-parts, lint, types
Matrix
sub-package→ ${{ fromJson(needs.get-changed-parts.outputs.changed-parts) }}
Actions
dorny/paths-filter
Commands
  • curl -sSL https://install.python-poetry.org | python3 -
  • poetry -C classic/${{ matrix.sub-package }} install
  • poetry run isort --check .
  • poetry run black --check .
  • poetry run flake8 .
  • curl -sSL https://install.python-poetry.org | python3 -
  • poetry -C classic/${{ matrix.sub-package }} install
  • poetry run pyright
View raw YAML
name: Classic - Python checks

on:
  push:
    branches: [ master, dev, ci-test* ]
    paths:
      - '.github/workflows/classic-python-checks-ci.yml'
      - 'classic/original_autogpt/**'
      - 'classic/forge/**'
      - 'classic/benchmark/**'
      - '**.py'
      - '!classic/forge/tests/vcr_cassettes'
  pull_request:
    branches: [ master, dev, release-* ]
    paths:
      - '.github/workflows/classic-python-checks-ci.yml'
      - 'classic/original_autogpt/**'
      - 'classic/forge/**'
      - 'classic/benchmark/**'
      - '**.py'
      - '!classic/forge/tests/vcr_cassettes'

concurrency:
  group: ${{ format('classic-python-checks-ci-{0}', github.head_ref && format('{0}-{1}', github.event_name, github.event.pull_request.number) || github.sha) }}
  cancel-in-progress: ${{ startsWith(github.event_name, 'pull_request') }}

defaults:
  run:
    shell: bash

jobs:
  get-changed-parts:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - id: changes-in
        name: Determine affected subprojects
        uses: dorny/paths-filter@v3
        with:
          filters: |
            original_autogpt:
              - classic/original_autogpt/autogpt/**
              - classic/original_autogpt/tests/**
              - classic/original_autogpt/poetry.lock
            forge:
              - classic/forge/forge/**
              - classic/forge/tests/**
              - classic/forge/poetry.lock
            benchmark:
              - classic/benchmark/agbenchmark/**
              - classic/benchmark/tests/**
              - classic/benchmark/poetry.lock
    outputs:
      changed-parts: ${{ steps.changes-in.outputs.changes }}

  lint:
    needs: get-changed-parts
    runs-on: ubuntu-latest
    env:
      min-python-version: "3.10"

    strategy:
      matrix:
        sub-package: ${{ fromJson(needs.get-changed-parts.outputs.changed-parts) }}
      fail-fast: false

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Set up Python ${{ env.min-python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ env.min-python-version }}

      - name: Set up Python dependency cache
        uses: actions/cache@v4
        with:
          path: ~/.cache/pypoetry
          key: ${{ runner.os }}-poetry-${{ hashFiles(format('{0}/poetry.lock', matrix.sub-package)) }}

      - name: Install Poetry
        run: curl -sSL https://install.python-poetry.org | python3 -

      # Install dependencies

      - name: Install Python dependencies
        run: poetry -C classic/${{ matrix.sub-package }} install

      # Lint

      - name: Lint (isort)
        run: poetry run isort --check .
        working-directory: classic/${{ matrix.sub-package }}

      - name: Lint (Black)
        if: success() || failure()
        run: poetry run black --check .
        working-directory: classic/${{ matrix.sub-package }}

      - name: Lint (Flake8)
        if: success() || failure()
        run: poetry run flake8 .
        working-directory: classic/${{ matrix.sub-package }}

  types:
    needs: get-changed-parts
    runs-on: ubuntu-latest
    env:
      min-python-version: "3.10"

    strategy:
      matrix:
        sub-package: ${{ fromJson(needs.get-changed-parts.outputs.changed-parts) }}
      fail-fast: false

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Set up Python ${{ env.min-python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ env.min-python-version }}

      - name: Set up Python dependency cache
        uses: actions/cache@v4
        with:
          path: ~/.cache/pypoetry
          key: ${{ runner.os }}-poetry-${{ hashFiles(format('{0}/poetry.lock', matrix.sub-package)) }}

      - name: Install Poetry
        run: curl -sSL https://install.python-poetry.org | python3 -

      # Install dependencies

      - name: Install Python dependencies
        run: poetry -C classic/${{ matrix.sub-package }} install

      # Typecheck

      - name: Typecheck
        if: success() || failure()
        run: poetry run pyright
        working-directory: classic/${{ matrix.sub-package }}
claude AI .github/workflows/claude.yml
Triggers
issue_comment, pull_request_review_comment, issues, pull_request_review
Runs on
ubuntu-latest
Jobs
claude
Actions
jlumbroso/free-disk-space, docker/setup-buildx-action, anthropics/claude-code-action
Commands
  • # Extract Poetry version from backend/poetry.lock (matches CI) cd autogpt_platform/backend HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry) echo "Found Poetry version ${HEAD_POETRY_VERSION} in backend/poetry.lock" # Install Poetry curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 - # Add Poetry to PATH echo "$HOME/.local/bin" >> $GITHUB_PATH
  • poetry lock if ! git diff --quiet --ignore-matching-lines="^# " poetry.lock; then echo "Warning: poetry.lock not up to date, but continuing for setup" git checkout poetry.lock # Reset for clean setup fi
  • poetry install
  • poetry run prisma generate && poetry run gen-prisma-stub
  • corepack enable
  • pnpm install --frozen-lockfile
  • # Copy default environment files for development cp .env.default .env cp backend/.env.default backend/.env cp frontend/.env.default frontend/.env
  • mkdir -p ~/docker-cache # Define image list for easy maintenance IMAGES=( "redis:latest" "rabbitmq:management" "clamav/clamav-debian:latest" "busybox:latest" "kong:2.8.1" "supabase/gotrue:v2.170.0" "supabase/postgres:15.8.1.049" "supabase/postgres-meta:v0.86.1" "supabase/studio:20250224-d10db0f" ) # Check if any cached tar files exist (more reliable than cache-hit) if ls ~/docker-cache/*.tar 1> /dev/null 2>&1; then echo "Docker cache found, loading images in parallel..." for image in "${IMAGES[@]}"; do # Convert image name to filename (replace : and / with -) filename=$(echo "$image" | tr ':/' '--') if [ -f ~/docker-cache/${filename}.tar ]; then echo "Loading $image..." docker load -i ~/docker-cache/${filename}.tar || echo "Warning: Failed to load $image from cache" & fi done wait echo "All cached images loaded" else echo "No Docker cache found, pulling images in parallel..." # Pull all images in parallel for image in "${IMAGES[@]}"; do docker pull "$image" & done wait # Only save cache on main branches (not PRs) to avoid cache pollution if [[ "${{ github.ref }}" == "refs/heads/master" ]] || [[ "${{ github.ref }}" == "refs/heads/dev" ]]; then echo "Saving Docker images to cache in parallel..." for image in "${IMAGES[@]}"; do # Convert image name to filename (replace : and / with -) filename=$(echo "$image" | tr ':/' '--') echo "Saving $image..." docker save -o ~/docker-cache/${filename}.tar "$image" || echo "Warning: Failed to save $image" & done wait echo "Docker image cache saved" else echo "Skipping cache save for PR/feature branch" fi fi echo "Docker images ready for use"
View raw YAML
name: Claude Code

on:
  issue_comment:
    types: [created]
  pull_request_review_comment:
    types: [created]
  issues:
    types: [opened, assigned]
  pull_request_review:
    types: [submitted]

jobs:
  claude:
    if: |
      (
        (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
        (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
        (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
        (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
      ) && (
        github.event.comment.author_association == 'OWNER' ||
        github.event.comment.author_association == 'MEMBER' ||
        github.event.comment.author_association == 'COLLABORATOR' ||
        github.event.review.author_association == 'OWNER' ||
        github.event.review.author_association == 'MEMBER' ||
        github.event.review.author_association == 'COLLABORATOR' ||
        github.event.issue.author_association == 'OWNER' ||
        github.event.issue.author_association == 'MEMBER' ||
        github.event.issue.author_association == 'COLLABORATOR'
      )
    runs-on: ubuntu-latest
    timeout-minutes: 45

    permissions:
      contents: write
      pull-requests: read
      issues: read
      id-token: write
      actions: read # Required for CI access
    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          fetch-depth: 1

      - name: Free Disk Space (Ubuntu)
        uses: jlumbroso/free-disk-space@v1.3.1
        with:
          large-packages: false  # slow
          docker-images: false  # limited benefit

      # Backend Python/Poetry setup (mirrors platform-backend-ci.yml)
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"  # Use standard version matching CI

      - name: Set up Python dependency cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: poetry-${{ runner.os }}-${{ hashFiles('autogpt_platform/backend/poetry.lock') }}

      - name: Install Poetry
        run: |
          # Extract Poetry version from backend/poetry.lock (matches CI)
          cd autogpt_platform/backend
          HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry)
          echo "Found Poetry version ${HEAD_POETRY_VERSION} in backend/poetry.lock"
          
          # Install Poetry
          curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 -
          
          # Add Poetry to PATH
          echo "$HOME/.local/bin" >> $GITHUB_PATH

      - name: Check poetry.lock
        working-directory: autogpt_platform/backend
        run: |
          poetry lock
          if ! git diff --quiet --ignore-matching-lines="^# " poetry.lock; then
            echo "Warning: poetry.lock not up to date, but continuing for setup"
            git checkout poetry.lock  # Reset for clean setup
          fi

      - name: Install Python dependencies
        working-directory: autogpt_platform/backend
        run: poetry install

      - name: Generate Prisma Client
        working-directory: autogpt_platform/backend
        run: poetry run prisma generate && poetry run gen-prisma-stub

      # Frontend Node.js/pnpm setup (mirrors platform-frontend-ci.yml)
      - name: Enable corepack
        run: corepack enable

      - name: Set up Node.js
        uses: actions/setup-node@v6
        with:
          node-version: "22"
          cache: "pnpm"
          cache-dependency-path: autogpt_platform/frontend/pnpm-lock.yaml

      - name: Install JavaScript dependencies
        working-directory: autogpt_platform/frontend
        run: pnpm install --frozen-lockfile

      # Install Playwright browsers for frontend testing
      # NOTE: Disabled to save ~1 minute of setup time. Re-enable if Copilot needs browser automation (e.g., for MCP)
      # - name: Install Playwright browsers
      #   working-directory: autogpt_platform/frontend
      #   run: pnpm playwright install --with-deps chromium

      # Docker setup for development environment
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Copy default environment files
        working-directory: autogpt_platform
        run: |
          # Copy default environment files for development
          cp .env.default .env
          cp backend/.env.default backend/.env
          cp frontend/.env.default frontend/.env

      # Phase 1: Cache and load Docker images for faster setup
      - name: Set up Docker image cache
        id: docker-cache
        uses: actions/cache@v5
        with:
          path: ~/docker-cache
          # Use a versioned key for cache invalidation when image list changes
          key: docker-images-v2-${{ runner.os }}-${{ hashFiles('.github/workflows/copilot-setup-steps.yml') }}
          restore-keys: |
            docker-images-v2-${{ runner.os }}-
            docker-images-v1-${{ runner.os }}-

      - name: Load or pull Docker images
        working-directory: autogpt_platform
        run: |
          mkdir -p ~/docker-cache
          
          # Define image list for easy maintenance
          IMAGES=(
            "redis:latest"
            "rabbitmq:management"
            "clamav/clamav-debian:latest"
            "busybox:latest"
            "kong:2.8.1"
            "supabase/gotrue:v2.170.0"
            "supabase/postgres:15.8.1.049"
            "supabase/postgres-meta:v0.86.1"
            "supabase/studio:20250224-d10db0f"
          )
          
          # Check if any cached tar files exist (more reliable than cache-hit)
          if ls ~/docker-cache/*.tar 1> /dev/null 2>&1; then
            echo "Docker cache found, loading images in parallel..."
            for image in "${IMAGES[@]}"; do
              # Convert image name to filename (replace : and / with -)
              filename=$(echo "$image" | tr ':/' '--')
              if [ -f ~/docker-cache/${filename}.tar ]; then
                echo "Loading $image..."
                docker load -i ~/docker-cache/${filename}.tar || echo "Warning: Failed to load $image from cache" &
              fi
            done
            wait
            echo "All cached images loaded"
          else
            echo "No Docker cache found, pulling images in parallel..."
            # Pull all images in parallel
            for image in "${IMAGES[@]}"; do
              docker pull "$image" &
            done
            wait
            
            # Only save cache on main branches (not PRs) to avoid cache pollution
            if [[ "${{ github.ref }}" == "refs/heads/master" ]] || [[ "${{ github.ref }}" == "refs/heads/dev" ]]; then
              echo "Saving Docker images to cache in parallel..."
              for image in "${IMAGES[@]}"; do
                # Convert image name to filename (replace : and / with -)
                filename=$(echo "$image" | tr ':/' '--')
                echo "Saving $image..."
                docker save -o ~/docker-cache/${filename}.tar "$image" || echo "Warning: Failed to save $image" &
              done
              wait
              echo "Docker image cache saved"
            else
              echo "Skipping cache save for PR/feature branch"
            fi
          fi
          
          echo "Docker images ready for use"

      # Phase 2: Build migrate service with GitHub Actions cache
      - name: Build migrate Docker image with cache
        working-directory: autogpt_platform
        run: |
          # Build the migrate image with buildx for GHA caching
          docker buildx build \
            --cache-from type=gha \
            --cache-to type=gha,mode=max \
            --target migrate \
            --tag autogpt_platform-migrate:latest \
            --load \
            -f backend/Dockerfile \
            ..

      # Start services using pre-built images
      - name: Start Docker services for development
        working-directory: autogpt_platform
        run: |
          # Start essential services (migrate image already built with correct tag)
          docker compose --profile local up deps --no-build --detach
          echo "Waiting for services to be ready..."
          
          # Wait for database to be ready
          echo "Checking database readiness..."
          timeout 30 sh -c 'until docker compose exec -T db pg_isready -U postgres 2>/dev/null; do 
            echo "  Waiting for database..."
            sleep 2
          done' && echo "✅ Database is ready" || echo "⚠️ Database ready check timeout after 30s, continuing..."
          
          # Check migrate service status
          echo "Checking migration status..."
          docker compose ps migrate || echo "  Migrate service not visible in ps output"
          
          # Wait for migrate service to complete
          echo "Waiting for migrations to complete..."
          timeout 30 bash -c '
            ATTEMPTS=0
            while [ $ATTEMPTS -lt 15 ]; do
              ATTEMPTS=$((ATTEMPTS + 1))
              
              # Check using docker directly (more reliable than docker compose ps)
              CONTAINER_STATUS=$(docker ps -a --filter "label=com.docker.compose.service=migrate" --format "{{.Status}}" | head -1)
              
              if [ -z "$CONTAINER_STATUS" ]; then
                echo "  Attempt $ATTEMPTS: Migrate container not found yet..."
              elif echo "$CONTAINER_STATUS" | grep -q "Exited (0)"; then
                echo "✅ Migrations completed successfully"
                docker compose logs migrate --tail=5 2>/dev/null || true
                exit 0
              elif echo "$CONTAINER_STATUS" | grep -q "Exited ([1-9]"; then
                EXIT_CODE=$(echo "$CONTAINER_STATUS" | grep -oE "Exited \([0-9]+\)" | grep -oE "[0-9]+")
                echo "❌ Migrations failed with exit code: $EXIT_CODE"
                echo "Migration logs:"
                docker compose logs migrate --tail=20 2>/dev/null || true
                exit 1
              elif echo "$CONTAINER_STATUS" | grep -q "Up"; then
                echo "  Attempt $ATTEMPTS: Migrate container is running... ($CONTAINER_STATUS)"
              else
                echo "  Attempt $ATTEMPTS: Migrate container status: $CONTAINER_STATUS"
              fi
              
              sleep 2
            done
            
            echo "⚠️ Timeout: Could not determine migration status after 30 seconds"
            echo "Final container check:"
            docker ps -a --filter "label=com.docker.compose.service=migrate" || true
            echo "Migration logs (if available):"
            docker compose logs migrate --tail=10 2>/dev/null || echo "  No logs available"
          ' || echo "⚠️ Migration check completed with warnings, continuing..."
          
          # Brief wait for other services to stabilize
          echo "Waiting 5 seconds for other services to stabilize..."
          sleep 5

      # Verify installations and provide environment info
      - name: Verify setup and show environment info
        run: |
          echo "=== Python Setup ==="
          python --version
          poetry --version
          
          echo "=== Node.js Setup ==="
          node --version
          pnpm --version
          
          echo "=== Additional Tools ==="
          docker --version
          docker compose version
          gh --version || true
          
          echo "=== Services Status ==="
          cd autogpt_platform
          docker compose ps || true
          
          echo "=== Backend Dependencies ==="
          cd backend
          poetry show | head -10 || true
          
          echo "=== Frontend Dependencies ==="
          cd ../frontend
          pnpm list --depth=0 | head -10 || true
          
          echo "=== Environment Files ==="
          ls -la ../.env* || true
          ls -la .env* || true
          ls -la ../backend/.env* || true
          
          echo "✅ AutoGPT Platform development environment setup complete!"
          echo "🚀 Ready for development with Docker services running"
          echo "📝 Backend server: poetry run serve (port 8000)"
          echo "🌐 Frontend server: pnpm dev (port 3000)"

      - name: Run Claude Code
        id: claude
        uses: anthropics/claude-code-action@v1
        with:
          claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
          claude_args: |
            --allowedTools "Bash(npm:*),Bash(pnpm:*),Bash(poetry:*),Bash(git:*),Edit,Replace,NotebookEditCell,mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*), Bash(gh pr diff:*), Bash(gh pr view:*), Bash(gh pr edit:*)"
            --model opus
          additional_permissions: |
            actions: read
claude-ci-failure-auto-fix perms AI .github/workflows/claude-ci-failure-auto-fix.yml
Triggers
workflow_run
Runs on
ubuntu-latest
Jobs
auto-fix
Actions
anthropics/claude-code-action
Commands
  • git config --global user.email "claude[bot]@users.noreply.github.com" git config --global user.name "claude[bot]"
  • BRANCH_NAME="claude-auto-fix-ci-${{ github.event.workflow_run.head_branch }}-${{ github.run_id }}" git checkout -b "$BRANCH_NAME" echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT
  • cd autogpt_platform/backend HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry) curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 - echo "$HOME/.local/bin" >> $GITHUB_PATH
  • poetry install
  • poetry run prisma generate && poetry run gen-prisma-stub
  • corepack enable
  • pnpm install --frozen-lockfile
View raw YAML
name: Auto Fix CI Failures

on:
  workflow_run:
    workflows: ["CI"]
    types:
      - completed

permissions:
  contents: write
  pull-requests: write
  actions: read
  issues: write
  id-token: write # Required for OIDC token exchange

jobs:
  auto-fix:
    if: |
      github.event.workflow_run.conclusion == 'failure' &&
      github.event.workflow_run.pull_requests[0] &&
      !startsWith(github.event.workflow_run.head_branch, 'claude-auto-fix-ci-')
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          ref: ${{ github.event.workflow_run.head_branch }}
          fetch-depth: 0
          token: ${{ secrets.GITHUB_TOKEN }}

      - name: Setup git identity
        run: |
          git config --global user.email "claude[bot]@users.noreply.github.com"
          git config --global user.name "claude[bot]"

      - name: Create fix branch
        id: branch
        run: |
          BRANCH_NAME="claude-auto-fix-ci-${{ github.event.workflow_run.head_branch }}-${{ github.run_id }}"
          git checkout -b "$BRANCH_NAME"
          echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT

      # Backend Python/Poetry setup (so Claude can run linting/tests)
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Set up Python dependency cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: poetry-${{ runner.os }}-${{ hashFiles('autogpt_platform/backend/poetry.lock') }}

      - name: Install Poetry
        run: |
          cd autogpt_platform/backend
          HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry)
          curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 -
          echo "$HOME/.local/bin" >> $GITHUB_PATH

      - name: Install Python dependencies
        working-directory: autogpt_platform/backend
        run: poetry install

      - name: Generate Prisma Client
        working-directory: autogpt_platform/backend
        run: poetry run prisma generate && poetry run gen-prisma-stub

      # Frontend Node.js/pnpm setup (so Claude can run linting/tests)
      - name: Enable corepack
        run: corepack enable

      - name: Set up Node.js
        uses: actions/setup-node@v6
        with:
          node-version: "22"
          cache: "pnpm"
          cache-dependency-path: autogpt_platform/frontend/pnpm-lock.yaml

      - name: Install JavaScript dependencies
        working-directory: autogpt_platform/frontend
        run: pnpm install --frozen-lockfile

      - name: Get CI failure details
        id: failure_details
        uses: actions/github-script@v8
        with:
          script: |
            const run = await github.rest.actions.getWorkflowRun({
              owner: context.repo.owner,
              repo: context.repo.repo,
              run_id: ${{ github.event.workflow_run.id }}
            });

            const jobs = await github.rest.actions.listJobsForWorkflowRun({
              owner: context.repo.owner,
              repo: context.repo.repo,
              run_id: ${{ github.event.workflow_run.id }}
            });

            const failedJobs = jobs.data.jobs.filter(job => job.conclusion === 'failure');

            let errorLogs = [];
            for (const job of failedJobs) {
              const logs = await github.rest.actions.downloadJobLogsForWorkflowRun({
                owner: context.repo.owner,
                repo: context.repo.repo,
                job_id: job.id
              });
              errorLogs.push({
                jobName: job.name,
                logs: logs.data
              });
            }

            return {
              runUrl: run.data.html_url,
              failedJobs: failedJobs.map(j => j.name),
              errorLogs: errorLogs
            };

      - name: Fix CI failures with Claude
        id: claude
        uses: anthropics/claude-code-action@v1
        with:
          prompt: |
            /fix-ci 
            Failed CI Run: ${{ fromJSON(steps.failure_details.outputs.result).runUrl }}
            Failed Jobs: ${{ join(fromJSON(steps.failure_details.outputs.result).failedJobs, ', ') }}
            PR Number: ${{ github.event.workflow_run.pull_requests[0].number }}
            Branch Name: ${{ steps.branch.outputs.branch_name }}
            Base Branch: ${{ github.event.workflow_run.head_branch }}
            Repository: ${{ github.repository }}

            Error logs:
            ${{ toJSON(fromJSON(steps.failure_details.outputs.result).errorLogs) }}
          claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
          claude_args: "--allowedTools 'Edit,MultiEdit,Write,Read,Glob,Grep,LS,Bash(git:*),Bash(bun:*),Bash(npm:*),Bash(npx:*),Bash(gh:*)'"
claude-dependabot AI .github/workflows/claude-dependabot.yml
Triggers
pull_request
Runs on
ubuntu-latest
Jobs
dependabot-review
Actions
docker/setup-buildx-action, anthropics/claude-code-action
Commands
  • # Extract Poetry version from backend/poetry.lock (matches CI) cd autogpt_platform/backend HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry) echo "Found Poetry version ${HEAD_POETRY_VERSION} in backend/poetry.lock" # Install Poetry curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 - # Add Poetry to PATH echo "$HOME/.local/bin" >> $GITHUB_PATH
  • poetry lock if ! git diff --quiet --ignore-matching-lines="^# " poetry.lock; then echo "Warning: poetry.lock not up to date, but continuing for setup" git checkout poetry.lock # Reset for clean setup fi
  • poetry install
  • poetry run prisma generate && poetry run gen-prisma-stub
  • corepack enable
  • pnpm install --frozen-lockfile
  • # Copy default environment files for development cp .env.default .env cp backend/.env.default backend/.env cp frontend/.env.default frontend/.env
  • mkdir -p ~/docker-cache # Define image list for easy maintenance IMAGES=( "redis:latest" "rabbitmq:management" "clamav/clamav-debian:latest" "busybox:latest" "kong:2.8.1" "supabase/gotrue:v2.170.0" "supabase/postgres:15.8.1.049" "supabase/postgres-meta:v0.86.1" "supabase/studio:20250224-d10db0f" ) # Check if any cached tar files exist (more reliable than cache-hit) if ls ~/docker-cache/*.tar 1> /dev/null 2>&1; then echo "Docker cache found, loading images in parallel..." for image in "${IMAGES[@]}"; do # Convert image name to filename (replace : and / with -) filename=$(echo "$image" | tr ':/' '--') if [ -f ~/docker-cache/${filename}.tar ]; then echo "Loading $image..." docker load -i ~/docker-cache/${filename}.tar || echo "Warning: Failed to load $image from cache" & fi done wait echo "All cached images loaded" else echo "No Docker cache found, pulling images in parallel..." # Pull all images in parallel for image in "${IMAGES[@]}"; do docker pull "$image" & done wait # Only save cache on main branches (not PRs) to avoid cache pollution if [[ "${{ github.ref }}" == "refs/heads/master" ]] || [[ "${{ github.ref }}" == "refs/heads/dev" ]]; then echo "Saving Docker images to cache in parallel..." for image in "${IMAGES[@]}"; do # Convert image name to filename (replace : and / with -) filename=$(echo "$image" | tr ':/' '--') echo "Saving $image..." docker save -o ~/docker-cache/${filename}.tar "$image" || echo "Warning: Failed to save $image" & done wait echo "Docker image cache saved" else echo "Skipping cache save for PR/feature branch" fi fi echo "Docker images ready for use"
View raw YAML
# Claude Dependabot PR Review Workflow
# 
# This workflow automatically runs Claude analysis on Dependabot PRs to:
# - Identify dependency changes and their versions
# - Look up changelogs for updated packages  
# - Assess breaking changes and security impacts
# - Provide actionable recommendations for the development team
#
# Triggered on: Dependabot PRs (opened, synchronize)
# Requirements: CLAUDE_CODE_OAUTH_TOKEN secret must be configured

name: Claude Dependabot PR Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  dependabot-review:
    # Only run on Dependabot PRs
    if: github.actor == 'dependabot[bot]'
    runs-on: ubuntu-latest
    timeout-minutes: 30

    permissions:
      contents: write
      pull-requests: read
      issues: read
      id-token: write
      actions: read # Required for CI access
    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          fetch-depth: 1

      # Backend Python/Poetry setup (mirrors platform-backend-ci.yml)
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"  # Use standard version matching CI

      - name: Set up Python dependency cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: poetry-${{ runner.os }}-${{ hashFiles('autogpt_platform/backend/poetry.lock') }}

      - name: Install Poetry
        run: |
          # Extract Poetry version from backend/poetry.lock (matches CI)
          cd autogpt_platform/backend
          HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry)
          echo "Found Poetry version ${HEAD_POETRY_VERSION} in backend/poetry.lock"
          
          # Install Poetry
          curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 -
          
          # Add Poetry to PATH
          echo "$HOME/.local/bin" >> $GITHUB_PATH

      - name: Check poetry.lock
        working-directory: autogpt_platform/backend
        run: |
          poetry lock
          if ! git diff --quiet --ignore-matching-lines="^# " poetry.lock; then
            echo "Warning: poetry.lock not up to date, but continuing for setup"
            git checkout poetry.lock  # Reset for clean setup
          fi

      - name: Install Python dependencies
        working-directory: autogpt_platform/backend
        run: poetry install

      - name: Generate Prisma Client
        working-directory: autogpt_platform/backend
        run: poetry run prisma generate && poetry run gen-prisma-stub

      # Frontend Node.js/pnpm setup (mirrors platform-frontend-ci.yml)
      - name: Enable corepack
        run: corepack enable

      - name: Set up Node.js
        uses: actions/setup-node@v6
        with:
          node-version: "22"
          cache: "pnpm"
          cache-dependency-path: autogpt_platform/frontend/pnpm-lock.yaml

      - name: Install JavaScript dependencies
        working-directory: autogpt_platform/frontend
        run: pnpm install --frozen-lockfile

      # Install Playwright browsers for frontend testing
      # NOTE: Disabled to save ~1 minute of setup time. Re-enable if Copilot needs browser automation (e.g., for MCP)
      # - name: Install Playwright browsers
      #   working-directory: autogpt_platform/frontend
      #   run: pnpm playwright install --with-deps chromium

      # Docker setup for development environment
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Copy default environment files
        working-directory: autogpt_platform
        run: |
          # Copy default environment files for development
          cp .env.default .env
          cp backend/.env.default backend/.env
          cp frontend/.env.default frontend/.env

      # Phase 1: Cache and load Docker images for faster setup
      - name: Set up Docker image cache
        id: docker-cache
        uses: actions/cache@v5
        with:
          path: ~/docker-cache
          # Use a versioned key for cache invalidation when image list changes
          key: docker-images-v2-${{ runner.os }}-${{ hashFiles('.github/workflows/copilot-setup-steps.yml') }}
          restore-keys: |
            docker-images-v2-${{ runner.os }}-
            docker-images-v1-${{ runner.os }}-

      - name: Load or pull Docker images
        working-directory: autogpt_platform
        run: |
          mkdir -p ~/docker-cache
          
          # Define image list for easy maintenance
          IMAGES=(
            "redis:latest"
            "rabbitmq:management"
            "clamav/clamav-debian:latest"
            "busybox:latest"
            "kong:2.8.1"
            "supabase/gotrue:v2.170.0"
            "supabase/postgres:15.8.1.049"
            "supabase/postgres-meta:v0.86.1"
            "supabase/studio:20250224-d10db0f"
          )
          
          # Check if any cached tar files exist (more reliable than cache-hit)
          if ls ~/docker-cache/*.tar 1> /dev/null 2>&1; then
            echo "Docker cache found, loading images in parallel..."
            for image in "${IMAGES[@]}"; do
              # Convert image name to filename (replace : and / with -)
              filename=$(echo "$image" | tr ':/' '--')
              if [ -f ~/docker-cache/${filename}.tar ]; then
                echo "Loading $image..."
                docker load -i ~/docker-cache/${filename}.tar || echo "Warning: Failed to load $image from cache" &
              fi
            done
            wait
            echo "All cached images loaded"
          else
            echo "No Docker cache found, pulling images in parallel..."
            # Pull all images in parallel
            for image in "${IMAGES[@]}"; do
              docker pull "$image" &
            done
            wait
            
            # Only save cache on main branches (not PRs) to avoid cache pollution
            if [[ "${{ github.ref }}" == "refs/heads/master" ]] || [[ "${{ github.ref }}" == "refs/heads/dev" ]]; then
              echo "Saving Docker images to cache in parallel..."
              for image in "${IMAGES[@]}"; do
                # Convert image name to filename (replace : and / with -)
                filename=$(echo "$image" | tr ':/' '--')
                echo "Saving $image..."
                docker save -o ~/docker-cache/${filename}.tar "$image" || echo "Warning: Failed to save $image" &
              done
              wait
              echo "Docker image cache saved"
            else
              echo "Skipping cache save for PR/feature branch"
            fi
          fi
          
          echo "Docker images ready for use"

      # Phase 2: Build migrate service with GitHub Actions cache
      - name: Build migrate Docker image with cache
        working-directory: autogpt_platform
        run: |
          # Build the migrate image with buildx for GHA caching
          docker buildx build \
            --cache-from type=gha \
            --cache-to type=gha,mode=max \
            --target migrate \
            --tag autogpt_platform-migrate:latest \
            --load \
            -f backend/Dockerfile \
            ..

      # Start services using pre-built images
      - name: Start Docker services for development
        working-directory: autogpt_platform
        run: |
          # Start essential services (migrate image already built with correct tag)
          docker compose --profile local up deps --no-build --detach
          echo "Waiting for services to be ready..."
          
          # Wait for database to be ready
          echo "Checking database readiness..."
          timeout 30 sh -c 'until docker compose exec -T db pg_isready -U postgres 2>/dev/null; do 
            echo "  Waiting for database..."
            sleep 2
          done' && echo "✅ Database is ready" || echo "⚠️ Database ready check timeout after 30s, continuing..."
          
          # Check migrate service status
          echo "Checking migration status..."
          docker compose ps migrate || echo "  Migrate service not visible in ps output"
          
          # Wait for migrate service to complete
          echo "Waiting for migrations to complete..."
          timeout 30 bash -c '
            ATTEMPTS=0
            while [ $ATTEMPTS -lt 15 ]; do
              ATTEMPTS=$((ATTEMPTS + 1))
              
              # Check using docker directly (more reliable than docker compose ps)
              CONTAINER_STATUS=$(docker ps -a --filter "label=com.docker.compose.service=migrate" --format "{{.Status}}" | head -1)
              
              if [ -z "$CONTAINER_STATUS" ]; then
                echo "  Attempt $ATTEMPTS: Migrate container not found yet..."
              elif echo "$CONTAINER_STATUS" | grep -q "Exited (0)"; then
                echo "✅ Migrations completed successfully"
                docker compose logs migrate --tail=5 2>/dev/null || true
                exit 0
              elif echo "$CONTAINER_STATUS" | grep -q "Exited ([1-9]"; then
                EXIT_CODE=$(echo "$CONTAINER_STATUS" | grep -oE "Exited \([0-9]+\)" | grep -oE "[0-9]+")
                echo "❌ Migrations failed with exit code: $EXIT_CODE"
                echo "Migration logs:"
                docker compose logs migrate --tail=20 2>/dev/null || true
                exit 1
              elif echo "$CONTAINER_STATUS" | grep -q "Up"; then
                echo "  Attempt $ATTEMPTS: Migrate container is running... ($CONTAINER_STATUS)"
              else
                echo "  Attempt $ATTEMPTS: Migrate container status: $CONTAINER_STATUS"
              fi
              
              sleep 2
            done
            
            echo "⚠️ Timeout: Could not determine migration status after 30 seconds"
            echo "Final container check:"
            docker ps -a --filter "label=com.docker.compose.service=migrate" || true
            echo "Migration logs (if available):"
            docker compose logs migrate --tail=10 2>/dev/null || echo "  No logs available"
          ' || echo "⚠️ Migration check completed with warnings, continuing..."
          
          # Brief wait for other services to stabilize
          echo "Waiting 5 seconds for other services to stabilize..."
          sleep 5

      # Verify installations and provide environment info
      - name: Verify setup and show environment info
        run: |
          echo "=== Python Setup ==="
          python --version
          poetry --version
          
          echo "=== Node.js Setup ==="
          node --version
          pnpm --version
          
          echo "=== Additional Tools ==="
          docker --version
          docker compose version
          gh --version || true
          
          echo "=== Services Status ==="
          cd autogpt_platform
          docker compose ps || true
          
          echo "=== Backend Dependencies ==="
          cd backend
          poetry show | head -10 || true
          
          echo "=== Frontend Dependencies ==="
          cd ../frontend
          pnpm list --depth=0 | head -10 || true
          
          echo "=== Environment Files ==="
          ls -la ../.env* || true
          ls -la .env* || true
          ls -la ../backend/.env* || true
          
          echo "✅ AutoGPT Platform development environment setup complete!"
          echo "🚀 Ready for development with Docker services running"
          echo "📝 Backend server: poetry run serve (port 8000)"
          echo "🌐 Frontend server: pnpm dev (port 3000)"


      - name: Run Claude Dependabot Analysis
        id: claude_review
        uses: anthropics/claude-code-action@v1
        with:
          claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
          allowed_bots: "dependabot[bot]"
          claude_args: |
            --allowedTools "Bash(npm:*),Bash(pnpm:*),Bash(poetry:*),Bash(git:*),Edit,Replace,NotebookEditCell,mcp__github_inline_comment__create_inline_comment,Bash(gh pr comment:*), Bash(gh pr diff:*), Bash(gh pr view:*)"
          prompt: |
            You are Claude, an AI assistant specialized in reviewing Dependabot dependency update PRs. 
            
            Your primary tasks are:
            1. **Analyze the dependency changes** in this Dependabot PR
            2. **Look up changelogs** for all updated dependencies to understand what changed
            3. **Identify breaking changes** and assess potential impact on the AutoGPT codebase
            4. **Provide actionable recommendations** for the development team
            
            ## Analysis Process:
            
            1. **Identify Changed Dependencies**: 
               - Use git diff to see what dependencies were updated
               - Parse package.json, poetry.lock, requirements files, etc.
               - List all package versions: old → new
            
            2. **Changelog Research**:
               - For each updated dependency, look up its changelog/release notes
               - Use WebFetch to access GitHub releases, NPM package pages, PyPI project pages. The pr should also have some details
               - Focus on versions between the old and new versions
               - Identify: breaking changes, deprecations, security fixes, new features
            
            3. **Breaking Change Assessment**:
               - Categorize changes: BREAKING, MAJOR, MINOR, PATCH, SECURITY
               - Assess impact on AutoGPT's usage patterns
               - Check if AutoGPT uses affected APIs/features
               - Look for migration guides or upgrade instructions
            
            4. **Codebase Impact Analysis**:
               - Search the AutoGPT codebase for usage of changed APIs
               - Identify files that might be affected by breaking changes
               - Check test files for deprecated usage patterns
               - Look for configuration changes needed
            
            ## Output Format:
            
            Provide a comprehensive review comment with:
            
            ### 🔍 Dependency Analysis Summary
            - List of updated packages with version changes
            - Overall risk assessment (LOW/MEDIUM/HIGH)
            
            ### 📋 Detailed Changelog Review
            For each updated dependency:
            - **Package**: name (old_version → new_version)
            - **Changes**: Summary of key changes
            - **Breaking Changes**: List any breaking changes
            - **Security Fixes**: Note security improvements
            - **Migration Notes**: Any upgrade steps needed
            
            ### ⚠️ Impact Assessment
            - **Breaking Changes Found**: Yes/No with details
            - **Affected Files**: List AutoGPT files that may need updates
            - **Test Impact**: Any tests that may need updating
            - **Configuration Changes**: Required config updates
            
            ### 🛠️ Recommendations
            - **Action Required**: What the team should do
            - **Testing Focus**: Areas to test thoroughly
            - **Follow-up Tasks**: Any additional work needed
            - **Merge Recommendation**: APPROVE/REVIEW_NEEDED/HOLD
            
            ### 📚 Useful Links
            - Links to relevant changelogs, migration guides, documentation
            
            Be thorough but concise. Focus on actionable insights that help the development team make informed decisions about the dependency updates.
codeql matrix security .github/workflows/codeql.yml
Triggers
push, pull_request, merge_group, schedule
Runs on
${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
Jobs
analyze
Matrix
include, include.build-mode, include.language→ none, python, typescript
Actions
github/codeql-action/init, github/codeql-action/analyze
Commands
  • echo 'If you are using a "manual" build mode for one or more of the' \ 'languages you are analyzing, replace this with the commands to build' \ 'your code, for example:' echo ' make bootstrap' echo ' make release' exit 1
View raw YAML
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"

on:
  push:
    branches: [ "master", "release-*", "dev" ]
  pull_request:
    branches: [ "master", "release-*", "dev" ]
  merge_group:
  schedule:
    - cron: '15 4 * * 0'

jobs:
  analyze:
    name: Analyze (${{ matrix.language }})
    # Runner size impacts CodeQL analysis time. To learn more, please see:
    #   - https://gh.io/recommended-hardware-resources-for-running-codeql
    #   - https://gh.io/supported-runners-and-hardware-resources
    #   - https://gh.io/using-larger-runners (GitHub.com only)
    # Consider using larger runners or machines with greater resources for possible analysis time improvements.
    runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
    permissions:
      # required for all workflows
      security-events: write

      # required to fetch internal or private CodeQL packs
      packages: read

      # only required for workflows in private repositories
      actions: read
      contents: read

    strategy:
      fail-fast: false
      matrix:
        include:
        - language: typescript
          build-mode: none
        - language: python
          build-mode: none
        # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift'
        # Use `c-cpp` to analyze code written in C, C++ or both
        # Use 'java-kotlin' to analyze code written in Java, Kotlin or both
        # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
        # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
        # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
        # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
        # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
    steps:
    - name: Checkout repository
      uses: actions/checkout@v6

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v4
      with:
        languages: ${{ matrix.language }}
        build-mode: ${{ matrix.build-mode }}
        # If you wish to specify custom queries, you can do so here or in a config file.
        # By default, queries listed here will override any specified in a config file.
        # Prefix the list here with "+" to use these queries and those in the config file.
        config: |
          paths-ignore:
            - classic/frontend/build/**

        # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
        # queries: security-extended,security-and-quality

    # If the analyze step fails for one of the languages you are analyzing with
    # "We were unable to automatically build your code", modify the matrix above
    # to set the build mode to "manual" for that language. Then modify this step
    # to build your code.
    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
    - if: matrix.build-mode == 'manual'
      shell: bash
      run: |
        echo 'If you are using a "manual" build mode for one or more of the' \
          'languages you are analyzing, replace this with the commands to build' \
          'your code, for example:'
        echo '  make bootstrap'
        echo '  make release'
        exit 1

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v4
      with:
        category: "/language:${{matrix.language}}"
copilot-setup-steps .github/workflows/copilot-setup-steps.yml
Triggers
workflow_dispatch, push, pull_request
Runs on
ubuntu-latest
Jobs
copilot-setup-steps
Actions
docker/setup-buildx-action
Commands
  • # Extract Poetry version from backend/poetry.lock (matches CI) cd autogpt_platform/backend HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry) echo "Found Poetry version ${HEAD_POETRY_VERSION} in backend/poetry.lock" # Install Poetry curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 - # Add Poetry to PATH echo "$HOME/.local/bin" >> $GITHUB_PATH
  • poetry lock if ! git diff --quiet --ignore-matching-lines="^# " poetry.lock; then echo "Warning: poetry.lock not up to date, but continuing for setup" git checkout poetry.lock # Reset for clean setup fi
  • poetry install
  • poetry run prisma generate && poetry run gen-prisma-stub
  • corepack enable
  • pnpm config set store-dir ~/.pnpm-store echo "PNPM_HOME=$HOME/.pnpm-store" >> $GITHUB_ENV
  • pnpm install --frozen-lockfile
  • # Remove large unused tools to free disk space for Docker builds sudo rm -rf /usr/share/dotnet sudo rm -rf /usr/local/lib/android sudo rm -rf /opt/ghc sudo rm -rf /opt/hostedtoolcache/CodeQL sudo docker system prune -af df -h
View raw YAML
name: "Copilot Setup Steps"

# Automatically run the setup steps when they are changed to allow for easy validation, and
# allow manual testing through the repository's "Actions" tab
on:
  workflow_dispatch:
  push:
    paths:
      - .github/workflows/copilot-setup-steps.yml
  pull_request:
    paths:
      - .github/workflows/copilot-setup-steps.yml

jobs:
  # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot.
  copilot-setup-steps:
    runs-on: ubuntu-latest
    timeout-minutes: 45

    # Set the permissions to the lowest permissions possible needed for your steps.
    # Copilot will be given its own token for its operations.
    permissions:
      # If you want to clone the repository as part of your setup steps, for example to install dependencies, you'll need the `contents: read` permission. If you don't clone the repository in your setup steps, Copilot will do this for you automatically after the steps complete.
      contents: read

    # You can define any steps you want, and they will run before the agent starts.
    # If you do not check out your code, Copilot will do this for you.
    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
          submodules: true

      # Backend Python/Poetry setup (mirrors platform-backend-ci.yml)
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"  # Use standard version matching CI

      - name: Set up Python dependency cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: poetry-${{ runner.os }}-${{ hashFiles('autogpt_platform/backend/poetry.lock') }}

      - name: Install Poetry
        run: |
          # Extract Poetry version from backend/poetry.lock (matches CI)
          cd autogpt_platform/backend
          HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry)
          echo "Found Poetry version ${HEAD_POETRY_VERSION} in backend/poetry.lock"
          
          # Install Poetry
          curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 -
          
          # Add Poetry to PATH
          echo "$HOME/.local/bin" >> $GITHUB_PATH

      - name: Check poetry.lock
        working-directory: autogpt_platform/backend
        run: |
          poetry lock
          if ! git diff --quiet --ignore-matching-lines="^# " poetry.lock; then
            echo "Warning: poetry.lock not up to date, but continuing for setup"
            git checkout poetry.lock  # Reset for clean setup
          fi

      - name: Install Python dependencies
        working-directory: autogpt_platform/backend
        run: poetry install

      - name: Generate Prisma Client
        working-directory: autogpt_platform/backend
        run: poetry run prisma generate && poetry run gen-prisma-stub

      # Frontend Node.js/pnpm setup (mirrors platform-frontend-ci.yml)
      - name: Set up Node.js
        uses: actions/setup-node@v6
        with:
          node-version: "22"

      - name: Enable corepack
        run: corepack enable

      - name: Set pnpm store directory
        run: |
          pnpm config set store-dir ~/.pnpm-store
          echo "PNPM_HOME=$HOME/.pnpm-store" >> $GITHUB_ENV

      - name: Cache frontend dependencies
        uses: actions/cache@v5
        with:
          path: ~/.pnpm-store
          key: ${{ runner.os }}-pnpm-${{ hashFiles('autogpt_platform/frontend/pnpm-lock.yaml', 'autogpt_platform/frontend/package.json') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-${{ hashFiles('autogpt_platform/frontend/pnpm-lock.yaml') }}
            ${{ runner.os }}-pnpm-

      - name: Install JavaScript dependencies
        working-directory: autogpt_platform/frontend
        run: pnpm install --frozen-lockfile

      # Install Playwright browsers for frontend testing
      # NOTE: Disabled to save ~1 minute of setup time. Re-enable if Copilot needs browser automation (e.g., for MCP)
      # - name: Install Playwright browsers
      #   working-directory: autogpt_platform/frontend
      #   run: pnpm playwright install --with-deps chromium

      # Docker setup for development environment
      - name: Free up disk space
        run: |
          # Remove large unused tools to free disk space for Docker builds
          sudo rm -rf /usr/share/dotnet
          sudo rm -rf /usr/local/lib/android
          sudo rm -rf /opt/ghc
          sudo rm -rf /opt/hostedtoolcache/CodeQL
          sudo docker system prune -af
          df -h

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Copy default environment files
        working-directory: autogpt_platform
        run: |
          # Copy default environment files for development
          cp .env.default .env
          cp backend/.env.default backend/.env
          cp frontend/.env.default frontend/.env

      # Phase 1: Cache and load Docker images for faster setup
      - name: Set up Docker image cache
        id: docker-cache
        uses: actions/cache@v5
        with:
          path: ~/docker-cache
          # Use a versioned key for cache invalidation when image list changes
          key: docker-images-v2-${{ runner.os }}-${{ hashFiles('.github/workflows/copilot-setup-steps.yml') }}
          restore-keys: |
            docker-images-v2-${{ runner.os }}-
            docker-images-v1-${{ runner.os }}-

      - name: Load or pull Docker images
        working-directory: autogpt_platform
        run: |
          mkdir -p ~/docker-cache
          
          # Define image list for easy maintenance
          IMAGES=(
            "redis:latest"
            "rabbitmq:management"
            "clamav/clamav-debian:latest"
            "busybox:latest"
            "kong:2.8.1"
            "supabase/gotrue:v2.170.0"
            "supabase/postgres:15.8.1.049"
            "supabase/postgres-meta:v0.86.1"
            "supabase/studio:20250224-d10db0f"
          )
          
          # Check if any cached tar files exist (more reliable than cache-hit)
          if ls ~/docker-cache/*.tar 1> /dev/null 2>&1; then
            echo "Docker cache found, loading images in parallel..."
            for image in "${IMAGES[@]}"; do
              # Convert image name to filename (replace : and / with -)
              filename=$(echo "$image" | tr ':/' '--')
              if [ -f ~/docker-cache/${filename}.tar ]; then
                echo "Loading $image..."
                docker load -i ~/docker-cache/${filename}.tar || echo "Warning: Failed to load $image from cache" &
              fi
            done
            wait
            echo "All cached images loaded"
          else
            echo "No Docker cache found, pulling images in parallel..."
            # Pull all images in parallel
            for image in "${IMAGES[@]}"; do
              docker pull "$image" &
            done
            wait
            
            # Only save cache on main branches (not PRs) to avoid cache pollution
            if [[ "${{ github.ref }}" == "refs/heads/master" ]] || [[ "${{ github.ref }}" == "refs/heads/dev" ]]; then
              echo "Saving Docker images to cache in parallel..."
              for image in "${IMAGES[@]}"; do
                # Convert image name to filename (replace : and / with -)
                filename=$(echo "$image" | tr ':/' '--')
                echo "Saving $image..."
                docker save -o ~/docker-cache/${filename}.tar "$image" || echo "Warning: Failed to save $image" &
              done
              wait
              echo "Docker image cache saved"
            else
              echo "Skipping cache save for PR/feature branch"
            fi
          fi
          
          echo "Docker images ready for use"

      # Phase 2: Build migrate service with GitHub Actions cache
      - name: Build migrate Docker image with cache
        working-directory: autogpt_platform
        run: |
          # Build the migrate image with buildx for GHA caching
          docker buildx build \
            --cache-from type=gha \
            --cache-to type=gha,mode=max \
            --target migrate \
            --tag autogpt_platform-migrate:latest \
            --load \
            -f backend/Dockerfile \
            ..

      # Start services using pre-built images
      - name: Start Docker services for development
        working-directory: autogpt_platform
        run: |
          # Start essential services (migrate image already built with correct tag)
          docker compose --profile local up deps --no-build --detach
          echo "Waiting for services to be ready..."
          
          # Wait for database to be ready
          echo "Checking database readiness..."
          timeout 30 sh -c 'until docker compose exec -T db pg_isready -U postgres 2>/dev/null; do 
            echo "  Waiting for database..."
            sleep 2
          done' && echo "✅ Database is ready" || echo "⚠️ Database ready check timeout after 30s, continuing..."
          
          # Check migrate service status
          echo "Checking migration status..."
          docker compose ps migrate || echo "  Migrate service not visible in ps output"
          
          # Wait for migrate service to complete
          echo "Waiting for migrations to complete..."
          timeout 30 bash -c '
            ATTEMPTS=0
            while [ $ATTEMPTS -lt 15 ]; do
              ATTEMPTS=$((ATTEMPTS + 1))
              
              # Check using docker directly (more reliable than docker compose ps)
              CONTAINER_STATUS=$(docker ps -a --filter "label=com.docker.compose.service=migrate" --format "{{.Status}}" | head -1)
              
              if [ -z "$CONTAINER_STATUS" ]; then
                echo "  Attempt $ATTEMPTS: Migrate container not found yet..."
              elif echo "$CONTAINER_STATUS" | grep -q "Exited (0)"; then
                echo "✅ Migrations completed successfully"
                docker compose logs migrate --tail=5 2>/dev/null || true
                exit 0
              elif echo "$CONTAINER_STATUS" | grep -q "Exited ([1-9]"; then
                EXIT_CODE=$(echo "$CONTAINER_STATUS" | grep -oE "Exited \([0-9]+\)" | grep -oE "[0-9]+")
                echo "❌ Migrations failed with exit code: $EXIT_CODE"
                echo "Migration logs:"
                docker compose logs migrate --tail=20 2>/dev/null || true
                exit 1
              elif echo "$CONTAINER_STATUS" | grep -q "Up"; then
                echo "  Attempt $ATTEMPTS: Migrate container is running... ($CONTAINER_STATUS)"
              else
                echo "  Attempt $ATTEMPTS: Migrate container status: $CONTAINER_STATUS"
              fi
              
              sleep 2
            done
            
            echo "⚠️ Timeout: Could not determine migration status after 30 seconds"
            echo "Final container check:"
            docker ps -a --filter "label=com.docker.compose.service=migrate" || true
            echo "Migration logs (if available):"
            docker compose logs migrate --tail=10 2>/dev/null || echo "  No logs available"
          ' || echo "⚠️ Migration check completed with warnings, continuing..."
          
          # Brief wait for other services to stabilize
          echo "Waiting 5 seconds for other services to stabilize..."
          sleep 5

      # Verify installations and provide environment info
      - name: Verify setup and show environment info
        run: |
          echo "=== Python Setup ==="
          python --version
          poetry --version
          
          echo "=== Node.js Setup ==="
          node --version
          pnpm --version
          
          echo "=== Additional Tools ==="
          docker --version
          docker compose version
          gh --version || true
          
          echo "=== Services Status ==="
          cd autogpt_platform
          docker compose ps || true
          
          echo "=== Backend Dependencies ==="
          cd backend
          poetry show | head -10 || true
          
          echo "=== Frontend Dependencies ==="
          cd ../frontend
          pnpm list --depth=0 | head -10 || true
          
          echo "=== Environment Files ==="
          ls -la ../.env* || true
          ls -la .env* || true
          ls -la ../backend/.env* || true
          
          echo "✅ AutoGPT Platform development environment setup complete!"
          echo "🚀 Ready for development with Docker services running"
          echo "📝 Backend server: poetry run serve (port 8000)"
          echo "🌐 Frontend server: pnpm dev (port 3000)"
docs-block-sync .github/workflows/docs-block-sync.yml
Triggers
push, pull_request
Runs on
ubuntu-latest
Jobs
check-docs-sync
Commands
  • cd autogpt_platform/backend HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry) echo "Found Poetry version ${HEAD_POETRY_VERSION} in backend/poetry.lock" curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 - echo "$HOME/.local/bin" >> $GITHUB_PATH
  • poetry install --only main poetry run prisma generate
  • echo "Checking if block documentation is in sync with code..." poetry run python scripts/generate_block_docs.py --check
  • echo "::error::Block documentation is out of sync with code!" echo "" echo "To fix this, run the following command locally:" echo " cd autogpt_platform/backend && poetry run python scripts/generate_block_docs.py" echo "" echo "Then commit the updated documentation files." echo "" echo "Regenerating docs to show diff..." poetry run python scripts/generate_block_docs.py echo "" echo "Changes detected:" git diff ../../docs/integrations/ || true
View raw YAML
name: Block Documentation Sync Check

on:
  push:
    branches: [master, dev]
    paths:
      - "autogpt_platform/backend/backend/blocks/**"
      - "docs/integrations/**"
      - "autogpt_platform/backend/scripts/generate_block_docs.py"
      - ".github/workflows/docs-block-sync.yml"
  pull_request:
    branches: [master, dev]
    paths:
      - "autogpt_platform/backend/backend/blocks/**"
      - "docs/integrations/**"
      - "autogpt_platform/backend/scripts/generate_block_docs.py"
      - ".github/workflows/docs-block-sync.yml"

jobs:
  check-docs-sync:
    runs-on: ubuntu-latest
    timeout-minutes: 15

    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          fetch-depth: 1

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Set up Python dependency cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: poetry-${{ runner.os }}-${{ hashFiles('autogpt_platform/backend/poetry.lock') }}
          restore-keys: |
            poetry-${{ runner.os }}-

      - name: Install Poetry
        run: |
          cd autogpt_platform/backend
          HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry)
          echo "Found Poetry version ${HEAD_POETRY_VERSION} in backend/poetry.lock"
          curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 -
          echo "$HOME/.local/bin" >> $GITHUB_PATH

      - name: Install dependencies
        working-directory: autogpt_platform/backend
        run: |
          poetry install --only main
          poetry run prisma generate

      - name: Check block documentation is in sync
        working-directory: autogpt_platform/backend
        run: |
          echo "Checking if block documentation is in sync with code..."
          poetry run python scripts/generate_block_docs.py --check

      - name: Show diff if out of sync
        if: failure()
        working-directory: autogpt_platform/backend
        run: |
          echo "::error::Block documentation is out of sync with code!"
          echo ""
          echo "To fix this, run the following command locally:"
          echo "  cd autogpt_platform/backend && poetry run python scripts/generate_block_docs.py"
          echo ""
          echo "Then commit the updated documentation files."
          echo ""
          echo "Regenerating docs to show diff..."
          poetry run python scripts/generate_block_docs.py
          echo ""
          echo "Changes detected:"
          git diff ../../docs/integrations/ || true
docs-claude-review AI .github/workflows/docs-claude-review.yml
Triggers
pull_request
Runs on
ubuntu-latest
Jobs
claude-review
Actions
anthropics/claude-code-action
Commands
  • cd autogpt_platform/backend HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry) curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 - echo "$HOME/.local/bin" >> $GITHUB_PATH
  • poetry install --only main poetry run prisma generate
  • # Get all comment IDs with our marker, sorted by creation date (oldest first) COMMENT_IDS=$(gh api \ repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments \ --jq '[.[] | select(.body | contains("<!-- CLAUDE_DOCS_REVIEW -->"))] | sort_by(.created_at) | .[].id') # Count comments COMMENT_COUNT=$(echo "$COMMENT_IDS" | grep -c . || true) if [ "$COMMENT_COUNT" -gt 1 ]; then # Delete all but the last (newest) comment echo "$COMMENT_IDS" | head -n -1 | while read -r COMMENT_ID; do if [ -n "$COMMENT_ID" ]; then echo "Deleting old review comment: $COMMENT_ID" gh api -X DELETE repos/${{ github.repository }}/issues/comments/$COMMENT_ID fi done else echo "No old review comments to clean up" fi
View raw YAML
name: Claude Block Docs Review

on:
  pull_request:
    types: [opened, synchronize]
    paths:
      - "docs/integrations/**"
      - "autogpt_platform/backend/backend/blocks/**"

concurrency:
  group: claude-docs-review-${{ github.event.pull_request.number }}
  cancel-in-progress: true

jobs:
  claude-review:
    # Only run for PRs from members/collaborators
    if: |
      github.event.pull_request.author_association == 'OWNER' ||
      github.event.pull_request.author_association == 'MEMBER' ||
      github.event.pull_request.author_association == 'COLLABORATOR'
    runs-on: ubuntu-latest
    timeout-minutes: 15
    permissions:
      contents: read
      pull-requests: write
      id-token: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Set up Python dependency cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: poetry-${{ runner.os }}-${{ hashFiles('autogpt_platform/backend/poetry.lock') }}
          restore-keys: |
            poetry-${{ runner.os }}-

      - name: Install Poetry
        run: |
          cd autogpt_platform/backend
          HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry)
          curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 -
          echo "$HOME/.local/bin" >> $GITHUB_PATH

      - name: Install dependencies
        working-directory: autogpt_platform/backend
        run: |
          poetry install --only main
          poetry run prisma generate

      - name: Run Claude Code Review
        uses: anthropics/claude-code-action@v1
        with:
          claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
          claude_args: |
            --allowedTools "Read,Glob,Grep,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*)"
          prompt: |
            You are reviewing a PR that modifies block documentation or block code for AutoGPT.

            ## Your Task
            Review the changes in this PR and provide constructive feedback. Focus on:

            1. **Documentation Accuracy**: For any block code changes, verify that:
               - Input/output tables in docs match the actual block schemas
               - Description text accurately reflects what the block does
               - Any new blocks have corresponding documentation

            2. **Manual Content Quality**: Check manual sections (marked with `<!-- MANUAL: -->` markers):
               - "How it works" sections should have clear technical explanations
               - "Possible use case" sections should have practical, real-world examples
               - Content should be helpful for users trying to understand the blocks

            3. **Template Compliance**: Ensure docs follow the standard template:
               - What it is (brief intro)
               - What it does (description)
               - How it works (technical explanation)
               - Inputs table
               - Outputs table
               - Possible use case

            4. **Cross-references**: Check that links and anchors are correct

            ## Review Process
            1. First, get the PR diff to see what changed: `gh pr diff ${{ github.event.pull_request.number }}`
            2. Read any modified block files to understand the implementation
            3. Read corresponding documentation files to verify accuracy
            4. Provide your feedback as a PR comment

            ## IMPORTANT: Comment Marker
            Start your PR comment with exactly this HTML comment marker on its own line:
            <!-- CLAUDE_DOCS_REVIEW -->

            This marker is used to identify and replace your comment on subsequent runs.

            Be constructive and specific. If everything looks good, say so!
            If there are issues, explain what's wrong and suggest how to fix it.

      - name: Delete old Claude review comments
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          # Get all comment IDs with our marker, sorted by creation date (oldest first)
          COMMENT_IDS=$(gh api \
            repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments \
            --jq '[.[] | select(.body | contains("<!-- CLAUDE_DOCS_REVIEW -->"))] | sort_by(.created_at) | .[].id')

          # Count comments
          COMMENT_COUNT=$(echo "$COMMENT_IDS" | grep -c . || true)

          if [ "$COMMENT_COUNT" -gt 1 ]; then
            # Delete all but the last (newest) comment
            echo "$COMMENT_IDS" | head -n -1 | while read -r COMMENT_ID; do
              if [ -n "$COMMENT_ID" ]; then
                echo "Deleting old review comment: $COMMENT_ID"
                gh api -X DELETE repos/${{ github.repository }}/issues/comments/$COMMENT_ID
              fi
            done
          else
            echo "No old review comments to clean up"
          fi
docs-enhance AI .github/workflows/docs-enhance.yml
Triggers
workflow_dispatch
Runs on
ubuntu-latest
Jobs
enhance-docs
Actions
anthropics/claude-code-action
Commands
  • cd autogpt_platform/backend HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry) curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 - echo "$HOME/.local/bin" >> $GITHUB_PATH
  • poetry install --only main poetry run prisma generate
  • # Check if there are changes if git diff --quiet docs/integrations/; then echo "No changes to commit" exit 0 fi # Configure git git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" # Create branch and commit BRANCH_NAME="docs/enhance-blocks-$(date +%Y%m%d-%H%M%S)" git checkout -b "$BRANCH_NAME" git add docs/integrations/ git commit -m "docs: enhance block documentation with LLM-generated content Pattern: ${{ inputs.block_pattern }} Max blocks: ${{ inputs.max_blocks }} 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>" # Push and create PR git push -u origin "$BRANCH_NAME" gh pr create \ --title "docs: LLM-enhanced block documentation" \ --body "## Summary This PR contains LLM-enhanced documentation for block files matching pattern: \`${{ inputs.block_pattern }}\` The following manual sections were improved: - **How it works**: Technical explanations based on block implementations - **Possible use case**: Practical, real-world examples ## Review Checklist - [ ] Content is accurate based on block implementations - [ ] Examples are practical and helpful - [ ] No auto-generated sections were modified --- 🤖 Generated with [Claude Code](https://claude.com/claude-code)" \ --base dev
View raw YAML
name: Enhance Block Documentation

on:
  workflow_dispatch:
    inputs:
      block_pattern:
        description: 'Block file pattern to enhance (e.g., "google/*.md" or "*" for all blocks)'
        required: true
        default: '*'
        type: string
      dry_run:
        description: 'Dry run mode - show proposed changes without committing'
        type: boolean
        default: true
      max_blocks:
        description: 'Maximum number of blocks to process (0 for unlimited)'
        type: number
        default: 10

jobs:
  enhance-docs:
    runs-on: ubuntu-latest
    timeout-minutes: 45
    permissions:
      contents: write
      pull-requests: write
      id-token: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          fetch-depth: 1

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Set up Python dependency cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: poetry-${{ runner.os }}-${{ hashFiles('autogpt_platform/backend/poetry.lock') }}
          restore-keys: |
            poetry-${{ runner.os }}-

      - name: Install Poetry
        run: |
          cd autogpt_platform/backend
          HEAD_POETRY_VERSION=$(python3 ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry)
          curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 -
          echo "$HOME/.local/bin" >> $GITHUB_PATH

      - name: Install dependencies
        working-directory: autogpt_platform/backend
        run: |
          poetry install --only main
          poetry run prisma generate

      - name: Run Claude Enhancement
        uses: anthropics/claude-code-action@v1
        with:
          claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
          claude_args: |
            --allowedTools "Read,Edit,Glob,Grep,Write,Bash(git:*),Bash(gh:*),Bash(find:*),Bash(ls:*)"
          prompt: |
            You are enhancing block documentation for AutoGPT. Your task is to improve the MANUAL sections
            of block documentation files by reading the actual block implementations and writing helpful content.

            ## Configuration
            - Block pattern: ${{ inputs.block_pattern }}
            - Dry run: ${{ inputs.dry_run }}
            - Max blocks to process: ${{ inputs.max_blocks }}

            ## Your Task

            1. **Find Documentation Files**
               Find block documentation files matching the pattern in `docs/integrations/`
               Pattern: ${{ inputs.block_pattern }}

               Use: `find docs/integrations -name "*.md" -type f`

            2. **For Each Documentation File** (up to ${{ inputs.max_blocks }} files):

               a. Read the documentation file

               b. Identify which block(s) it documents (look for the block class name)

               c. Find and read the corresponding block implementation in `autogpt_platform/backend/backend/blocks/`

               d. Improve the MANUAL sections:

                  **"How it works" section** (within `<!-- MANUAL: how_it_works -->` markers):
                  - Explain the technical flow of the block
                  - Describe what APIs or services it connects to
                  - Note any important configuration or prerequisites
                  - Keep it concise but informative (2-4 paragraphs)

                  **"Possible use case" section** (within `<!-- MANUAL: use_case -->` markers):
                  - Provide 2-3 practical, real-world examples
                  - Make them specific and actionable
                  - Show how this block could be used in an automation workflow

            3. **Important Rules**
               - ONLY modify content within `<!-- MANUAL: -->` and `<!-- END MANUAL -->` markers
               - Do NOT modify auto-generated sections (inputs/outputs tables, descriptions)
               - Keep content accurate based on the actual block implementation
               - Write for users who may not be technical experts

            4. **Output**
               ${{ inputs.dry_run == true && 'DRY RUN MODE: Show proposed changes for each file but do NOT actually edit the files. Describe what you would change.' || 'LIVE MODE: Actually edit the files to improve the documentation.' }}

            ## Example Improvements

            **Before (How it works):**
            ```
            _Add technical explanation here._
            ```

            **After (How it works):**
            ```
            This block connects to the GitHub API to retrieve issue information. When executed,
            it authenticates using your GitHub credentials and fetches issue details including
            title, body, labels, and assignees.

            The block requires a valid GitHub OAuth connection with repository access permissions.
            It supports both public and private repositories you have access to.
            ```

            **Before (Possible use case):**
            ```
            _Add practical use case examples here._
            ```

            **After (Possible use case):**
            ```
            **Customer Support Automation**: Monitor a GitHub repository for new issues with
            the "bug" label, then automatically create a ticket in your support system and
            notify the on-call engineer via Slack.

            **Release Notes Generation**: When a new release is published, gather all closed
            issues since the last release and generate a summary for your changelog.
            ```

            Begin by finding and listing the documentation files to process.

      - name: Create PR with enhanced documentation
        if: ${{ inputs.dry_run == false }}
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          # Check if there are changes
          if git diff --quiet docs/integrations/; then
            echo "No changes to commit"
            exit 0
          fi

          # Configure git
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"

          # Create branch and commit
          BRANCH_NAME="docs/enhance-blocks-$(date +%Y%m%d-%H%M%S)"
          git checkout -b "$BRANCH_NAME"
          git add docs/integrations/
          git commit -m "docs: enhance block documentation with LLM-generated content

          Pattern: ${{ inputs.block_pattern }}
          Max blocks: ${{ inputs.max_blocks }}

          🤖 Generated with [Claude Code](https://claude.com/claude-code)

          Co-Authored-By: Claude <noreply@anthropic.com>"

          # Push and create PR
          git push -u origin "$BRANCH_NAME"
          gh pr create \
            --title "docs: LLM-enhanced block documentation" \
            --body "## Summary
          This PR contains LLM-enhanced documentation for block files matching pattern: \`${{ inputs.block_pattern }}\`

          The following manual sections were improved:
          - **How it works**: Technical explanations based on block implementations
          - **Possible use case**: Practical, real-world examples

          ## Review Checklist
          - [ ] Content is accurate based on block implementations
          - [ ] Examples are practical and helpful
          - [ ] No auto-generated sections were modified

          ---
          🤖 Generated with [Claude Code](https://claude.com/claude-code)" \
            --base dev
platform-autogpt-deploy-dev perms .github/workflows/platform-autogpt-deploy-dev.yaml
Triggers
push, workflow_dispatch
Runs on
ubuntu-latest, ubuntu-latest
Jobs
migrate, trigger
Actions
peter-evans/repository-dispatch
Commands
  • python -m pip install --upgrade pip pip install prisma
  • python -m prisma migrate deploy
View raw YAML
name: AutoGPT Platform - Deploy Dev Environment

on:
  push:
    branches: [ dev ]
    paths:
      - 'autogpt_platform/**'
  workflow_dispatch:
    inputs:
      git_ref:
        description: 'Git ref (branch/tag) of AutoGPT to deploy'
        required: true
        default: 'master'
        type: string

permissions:
  contents: 'read'
  id-token: 'write'

jobs:
  migrate:
    environment: develop
    name: Run migrations for AutoGPT Platform
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          ref: ${{ github.event.inputs.git_ref || github.ref_name }}

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install Python dependencies
        run: |
          python -m pip install --upgrade pip
          pip install prisma

      - name: Run Backend Migrations
        working-directory: ./autogpt_platform/backend
        run: |
          python -m prisma migrate deploy
        env:
          DATABASE_URL: ${{ secrets.BACKEND_DATABASE_URL }}
          DIRECT_URL: ${{ secrets.BACKEND_DATABASE_URL }}

  trigger:
    needs: migrate
    runs-on: ubuntu-latest
    steps:
      - name: Trigger deploy workflow
        uses: peter-evans/repository-dispatch@v4
        with:
          token: ${{ secrets.DEPLOY_TOKEN }}
          repository: Significant-Gravitas/AutoGPT_cloud_infrastructure
          event-type: build_deploy_dev
          client-payload: '{"ref": "${{ github.event.inputs.git_ref || github.ref }}", "repository": "${{ github.repository }}"}'
platform-autogpt-deploy-prod perms .github/workflows/platform-autogpt-deploy-prod.yml
Triggers
release, workflow_dispatch
Runs on
ubuntu-latest, ubuntu-latest
Jobs
migrate, trigger
Actions
peter-evans/repository-dispatch
Commands
  • python -m pip install --upgrade pip pip install prisma
  • python -m prisma migrate deploy
View raw YAML
name: AutoGPT Platform - Deploy Prod Environment

on:
  release:
    types: [published]
  workflow_dispatch:

permissions:
  contents: 'read'
  id-token: 'write'

jobs:
  migrate:
    environment: production
    name: Run migrations for AutoGPT Platform
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          ref: ${{ github.ref_name || 'master' }}

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install Python dependencies
        run: |
          python -m pip install --upgrade pip
          pip install prisma

      - name: Run Backend Migrations
        working-directory: ./autogpt_platform/backend
        run: |
          python -m prisma migrate deploy
        env:
          DATABASE_URL: ${{ secrets.BACKEND_DATABASE_URL }}
          DIRECT_URL: ${{ secrets.BACKEND_DATABASE_URL }}


  trigger:
    needs: migrate
    runs-on: ubuntu-latest
    steps:
      - name: Trigger deploy workflow
        uses: peter-evans/repository-dispatch@v4
        with:
          token: ${{ secrets.DEPLOY_TOKEN }}
          repository: Significant-Gravitas/AutoGPT_cloud_infrastructure
          event-type: build_deploy_prod
          client-payload: |
            {"ref": "${{ github.ref_name || 'master' }}", "repository": "${{ github.repository }}"}
platform-backend-ci matrix .github/workflows/platform-backend-ci.yml
Triggers
push, pull_request, merge_group
Runs on
ubuntu-latest, ubuntu-latest, ubuntu-latest
Jobs
lint, type-check, test
Matrix
python-version→ 3.11, 3.12, 3.13
Actions
supabase/setup-cli
Commands
  • HEAD_POETRY_VERSION=$(python ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry) echo "Using Poetry version ${HEAD_POETRY_VERSION}" curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 -
  • poetry install
  • poetry run lint --skip-pyright
  • HEAD_POETRY_VERSION=$(python ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry) echo "Using Poetry version ${HEAD_POETRY_VERSION}" curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 -
  • poetry install
  • poetry run prisma generate && poetry run gen-prisma-stub
  • poetry run pyright --pythonversion ${{ matrix.python-version }}
  • echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
View raw YAML
name: AutoGPT Platform - Backend CI

on:
  push:
    branches: [master, dev, ci-test*]
    paths:
      - ".github/workflows/platform-backend-ci.yml"
      - ".github/workflows/scripts/get_package_version_from_lockfile.py"
      - "autogpt_platform/backend/**"
      - "autogpt_platform/autogpt_libs/**"
  pull_request:
    branches: [master, dev, release-*]
    paths:
      - ".github/workflows/platform-backend-ci.yml"
      - ".github/workflows/scripts/get_package_version_from_lockfile.py"
      - "autogpt_platform/backend/**"
      - "autogpt_platform/autogpt_libs/**"
  merge_group:

concurrency:
  group: ${{ format('backend-ci-{0}', github.head_ref && format('{0}-{1}', github.event_name, github.event.pull_request.number) || github.sha) }}
  cancel-in-progress: ${{ startsWith(github.event_name, 'pull_request') }}

defaults:
  run:
    shell: bash
    working-directory: autogpt_platform/backend

jobs:
  lint:
    permissions:
      contents: read
    timeout-minutes: 10
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Set up Python 3.12
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Set up Python dependency cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: poetry-${{ runner.os }}-py3.12-${{ hashFiles('autogpt_platform/backend/poetry.lock') }}

      - name: Install Poetry
        run: |
          HEAD_POETRY_VERSION=$(python ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry)
          echo "Using Poetry version ${HEAD_POETRY_VERSION}"
          curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 -

      - name: Install Python dependencies
        run: poetry install

      - name: Run Linters
        run: poetry run lint --skip-pyright

    env:
      CI: true
      PLAIN_OUTPUT: True

  type-check:
    permissions:
      contents: read
    timeout-minutes: 10
    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.11", "3.12", "3.13"]
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Set up Python dependency cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: poetry-${{ runner.os }}-py${{ matrix.python-version }}-${{ hashFiles('autogpt_platform/backend/poetry.lock') }}

      - name: Install Poetry
        run: |
          HEAD_POETRY_VERSION=$(python ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry)
          echo "Using Poetry version ${HEAD_POETRY_VERSION}"
          curl -sSL https://install.python-poetry.org | POETRY_VERSION=$HEAD_POETRY_VERSION python3 -

      - name: Install Python dependencies
        run: poetry install

      - name: Generate Prisma Client
        run: poetry run prisma generate && poetry run gen-prisma-stub

      - name: Run Pyright
        run: poetry run pyright --pythonversion ${{ matrix.python-version }}

    env:
      CI: true
      PLAIN_OUTPUT: True

  test:
    permissions:
      contents: read
    timeout-minutes: 15
    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.11", "3.12", "3.13"]
    runs-on: ubuntu-latest

    services:
      redis:
        image: redis:latest
        ports:
          - 6379:6379
      rabbitmq:
        image: rabbitmq:4.1.4
        ports:
          - 5672:5672
        env:
          RABBITMQ_DEFAULT_USER: ${{ env.RABBITMQ_DEFAULT_USER }}
          RABBITMQ_DEFAULT_PASS: ${{ env.RABBITMQ_DEFAULT_PASS }}
        options: >-
          --health-cmd "rabbitmq-diagnostics -q ping"
          --health-interval 30s
          --health-timeout 10s
          --health-retries 5
          --health-start-period 10s
      clamav:
        image: clamav/clamav-debian:latest
        ports:
          - 3310:3310
        env:
          CLAMAV_NO_FRESHCLAMD: false
          CLAMD_CONF_StreamMaxLength: 50M
          CLAMD_CONF_MaxFileSize: 100M
          CLAMD_CONF_MaxScanSize: 100M
          CLAMD_CONF_MaxThreads: 4
          CLAMD_CONF_ReadTimeout: 300
        options: >-
          --health-cmd "clamdscan --version || exit 1"
          --health-interval 30s
          --health-timeout 10s
          --health-retries 5
          --health-start-period 180s

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
          submodules: true

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Setup Supabase
        uses: supabase/setup-cli@v1
        with:
          version: 1.178.1

      - id: get_date
        name: Get date
        run: echo "date=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT

      - name: Set up Python dependency cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: poetry-${{ runner.os }}-py${{ matrix.python-version }}-${{ hashFiles('autogpt_platform/backend/poetry.lock') }}

      - name: Install Poetry
        run: |
          # Extract Poetry version from backend/poetry.lock
          HEAD_POETRY_VERSION=$(python ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry)
          echo "Found Poetry version ${HEAD_POETRY_VERSION} in backend/poetry.lock"

          if [ -n "$BASE_REF" ]; then
            BASE_BRANCH=${BASE_REF/refs\/heads\//}
            BASE_POETRY_VERSION=$((git show "origin/$BASE_BRANCH":./poetry.lock; true) | python ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry -)
            echo "Found Poetry version ${BASE_POETRY_VERSION} in backend/poetry.lock on ${BASE_REF}"
            POETRY_VERSION=$(printf '%s\n' "$HEAD_POETRY_VERSION" "$BASE_POETRY_VERSION" | sort -V | tail -n1)
          else
            POETRY_VERSION=$HEAD_POETRY_VERSION
          fi
          echo "Using Poetry version ${POETRY_VERSION}"

          # Install Poetry
          curl -sSL https://install.python-poetry.org | POETRY_VERSION=$POETRY_VERSION python3 -

          if [ "${{ runner.os }}" = "macOS" ]; then
            PATH="$HOME/.local/bin:$PATH"
            echo "$HOME/.local/bin" >> $GITHUB_PATH
          fi
        env:
          BASE_REF: ${{ github.base_ref || github.event.merge_group.base_ref }}

      - name: Check poetry.lock
        run: |
          poetry lock

          if ! git diff --quiet --ignore-matching-lines="^# " poetry.lock; then
            echo "Error: poetry.lock not up to date."
            echo
            git diff poetry.lock
            exit 1
          fi

      - name: Install Python dependencies
        run: poetry install

      - name: Generate Prisma Client
        run: poetry run prisma generate && poetry run gen-prisma-stub

      - id: supabase
        name: Start Supabase
        working-directory: .
        run: |
          supabase init
          supabase start --exclude postgres-meta,realtime,storage-api,imgproxy,inbucket,studio,edge-runtime,logflare,vector,supavisor
          supabase status -o env | sed 's/="/=/; s/"$//' >> $GITHUB_OUTPUT
        # outputs:
        # DB_URL, API_URL, GRAPHQL_URL, ANON_KEY, SERVICE_ROLE_KEY, JWT_SECRET

      - name: Wait for ClamAV to be ready
        run: |
          echo "Waiting for ClamAV daemon to start..."
          max_attempts=60
          attempt=0

          until nc -z localhost 3310 || [ $attempt -eq $max_attempts ]; do
            echo "ClamAV is unavailable - sleeping (attempt $((attempt+1))/$max_attempts)"
            sleep 5
            attempt=$((attempt+1))
          done

          if [ $attempt -eq $max_attempts ]; then
            echo "ClamAV failed to start after $((max_attempts*5)) seconds"
            echo "Checking ClamAV service logs..."
            docker logs $(docker ps -q --filter "ancestor=clamav/clamav-debian:latest") 2>&1 | tail -50 || echo "No ClamAV container found"
            exit 1
          fi

          echo "ClamAV is ready!"

          # Verify ClamAV is responsive
          echo "Testing ClamAV connection..."
          timeout 10 bash -c 'echo "PING" | nc localhost 3310' || {
            echo "ClamAV is not responding to PING"
            docker logs $(docker ps -q --filter "ancestor=clamav/clamav-debian:latest") 2>&1 | tail -50 || echo "No ClamAV container found"
            exit 1
          }

      - name: Run Database Migrations
        run: poetry run prisma migrate deploy
        env:
          DATABASE_URL: ${{ steps.supabase.outputs.DB_URL }}
          DIRECT_URL: ${{ steps.supabase.outputs.DB_URL }}

      - name: Run pytest
        run: |
          if [[ "${{ runner.debug }}" == "1" ]]; then
            poetry run pytest -s -vv -o log_cli=true -o log_cli_level=DEBUG
          else
            poetry run pytest -s -vv
          fi
        env:
          LOG_LEVEL: ${{ runner.debug && 'DEBUG' || 'INFO' }}
          DATABASE_URL: ${{ steps.supabase.outputs.DB_URL }}
          DIRECT_URL: ${{ steps.supabase.outputs.DB_URL }}
          SUPABASE_URL: ${{ steps.supabase.outputs.API_URL }}
          SUPABASE_SERVICE_ROLE_KEY: ${{ steps.supabase.outputs.SERVICE_ROLE_KEY }}
          JWT_VERIFY_KEY: ${{ steps.supabase.outputs.JWT_SECRET }}
          REDIS_HOST: "localhost"
          REDIS_PORT: "6379"
          ENCRYPTION_KEY: "dvziYgz0KSK8FENhju0ZYi8-fRTfAdlz6YLhdB_jhNw=" # DO NOT USE IN PRODUCTION!!

      # - name: Upload coverage reports to Codecov
      #   uses: codecov/codecov-action@v4
      #   with:
      #     token: ${{ secrets.CODECOV_TOKEN }}
      #     flags: backend,${{ runner.os }}

    env:
      CI: true
      PLAIN_OUTPUT: True
      RUN_ENV: local
      PORT: 8080
      OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
      # We know these are here, don't report this as a security vulnerability
      # This is used as the default credential for the entire system's RabbitMQ instance
      # If you want to replace this, you can do so by making our entire system generate
      # new credentials for each local user and update the environment variables in
      # the backend service, docker composes, and examples
      RABBITMQ_DEFAULT_USER: "rabbitmq_user_default"
      RABBITMQ_DEFAULT_PASS: "k0VMxyIJF9S35f3x2uaw5IWAl6Y536O7"
platform-dev-deploy-event-dispatcher perms .github/workflows/platform-dev-deploy-event-dispatcher.yml
Triggers
pull_request, issue_comment
Runs on
ubuntu-latest
Jobs
dispatch
Actions
peter-evans/repository-dispatch, peter-evans/repository-dispatch, peter-evans/repository-dispatch
View raw YAML
name: AutoGPT Platform - Dev Deploy PR Event Dispatcher

on:
  pull_request:
    types: [closed]
  issue_comment:
    types: [created]

permissions:
  issues: write
  pull-requests: write

jobs:
  dispatch:
    runs-on: ubuntu-latest
    steps:
      - name: Check comment permissions and deployment status
        id: check_status
        if: github.event_name == 'issue_comment' && github.event.issue.pull_request
        uses: actions/github-script@v8
        with:
          script: |
            const commentBody = context.payload.comment.body.trim();
            const commentUser = context.payload.comment.user.login;
            const prAuthor = context.payload.issue.user.login;
            const authorAssociation = context.payload.comment.author_association;
            
            // Check permissions
            const hasPermission = (
              authorAssociation === 'OWNER' ||
              authorAssociation === 'MEMBER' ||
              authorAssociation === 'COLLABORATOR'
            );
            
            core.setOutput('comment_body', commentBody);
            core.setOutput('has_permission', hasPermission);
            
            if (!hasPermission && (commentBody === '!deploy' || commentBody === '!undeploy')) {
              core.setOutput('permission_denied', 'true');
              return;
            }
            
            if (commentBody !== '!deploy' && commentBody !== '!undeploy') {
              return;
            }
            
            // Process deploy command
            if (commentBody === '!deploy') {
              core.setOutput('should_deploy', 'true');
            }
            // Process undeploy command
            else if (commentBody === '!undeploy') {
              core.setOutput('should_undeploy', 'true');
            }

      - name: Post permission denied comment
        if: steps.check_status.outputs.permission_denied == 'true'
        uses: actions/github-script@v8
        with:
          script: |
            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              body: `❌ **Permission denied**: Only the repository owners, members, or collaborators can use deployment commands.`
            });

      - name: Get PR details for deployment
        id: pr_details
        if: steps.check_status.outputs.should_deploy == 'true' || steps.check_status.outputs.should_undeploy == 'true'
        uses: actions/github-script@v8
        with:
          script: |
            const pr = await github.rest.pulls.get({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: context.issue.number
            });
            core.setOutput('pr_number', pr.data.number);
            core.setOutput('pr_title', pr.data.title);
            core.setOutput('pr_state', pr.data.state);
          
      - name: Dispatch Deploy Event
        if: steps.check_status.outputs.should_deploy == 'true'
        uses: peter-evans/repository-dispatch@v4
        with:
          token: ${{ secrets.DISPATCH_TOKEN }}
          repository: Significant-Gravitas/AutoGPT_cloud_infrastructure
          event-type: pr-event
          client-payload: |
            {
              "action": "deploy",
              "pr_number": "${{ steps.pr_details.outputs.pr_number }}",
              "pr_title": "${{ steps.pr_details.outputs.pr_title }}",
              "pr_state": "${{ steps.pr_details.outputs.pr_state }}",
              "repo": "${{ github.repository }}"
            }

      - name: Post deploy success comment
        if: steps.check_status.outputs.should_deploy == 'true'
        uses: actions/github-script@v8
        with:
          script: |
            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              body: `🚀 **Deploying PR #${{ steps.pr_details.outputs.pr_number }}** to development environment...`
            });

      - name: Dispatch Undeploy Event (from comment)
        if: steps.check_status.outputs.should_undeploy == 'true'
        uses: peter-evans/repository-dispatch@v4
        with:
          token: ${{ secrets.DISPATCH_TOKEN }}
          repository: Significant-Gravitas/AutoGPT_cloud_infrastructure
          event-type: pr-event
          client-payload: |
            {
              "action": "undeploy",
              "pr_number": "${{ steps.pr_details.outputs.pr_number }}",
              "pr_title": "${{ steps.pr_details.outputs.pr_title }}",
              "pr_state": "${{ steps.pr_details.outputs.pr_state }}",
              "repo": "${{ github.repository }}"
            }

      - name: Post undeploy success comment
        if: steps.check_status.outputs.should_undeploy == 'true'
        uses: actions/github-script@v8
        with:
          script: |
            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              body: `🗑️ **Undeploying PR #${{ steps.pr_details.outputs.pr_number }}** from development environment...`
            });

      - name: Check deployment status on PR close
        id: check_pr_close
        if: github.event_name == 'pull_request' && github.event.action == 'closed'
        uses: actions/github-script@v8
        with:
          script: |
            const comments = await github.rest.issues.listComments({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number
            });
            
            let lastDeployIndex = -1;
            let lastUndeployIndex = -1;
            
            comments.data.forEach((comment, index) => {
              if (comment.body.trim() === '!deploy') {
                lastDeployIndex = index;
              } else if (comment.body.trim() === '!undeploy') {
                lastUndeployIndex = index;
              }
            });
            
            // Should undeploy if there's a !deploy without a subsequent !undeploy
            const shouldUndeploy = lastDeployIndex !== -1 && lastDeployIndex > lastUndeployIndex;
            core.setOutput('should_undeploy', shouldUndeploy);
            
      - name: Dispatch Undeploy Event (PR closed with active deployment)
        if: >-
          github.event_name == 'pull_request' &&
          github.event.action == 'closed' &&
          steps.check_pr_close.outputs.should_undeploy == 'true'
        uses: peter-evans/repository-dispatch@v4
        with:
          token: ${{ secrets.DISPATCH_TOKEN }}
          repository: Significant-Gravitas/AutoGPT_cloud_infrastructure
          event-type: pr-event
          client-payload: |
            {
              "action": "undeploy",
              "pr_number": "${{ github.event.pull_request.number }}",
              "pr_title": "${{ github.event.pull_request.title }}",
              "pr_state": "${{ github.event.pull_request.state }}",
              "repo": "${{ github.repository }}"
            }

      - name: Post PR close undeploy comment
        if: >-
          github.event_name == 'pull_request' &&
          github.event.action == 'closed' &&
          steps.check_pr_close.outputs.should_undeploy == 'true'
        uses: actions/github-script@v8
        with:
          script: |
            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              body: `🧹 **Auto-undeploying**: PR closed with active deployment. Cleaning up development environment for PR #${{ github.event.pull_request.number }}.`
            });
platform-frontend-ci .github/workflows/platform-frontend-ci.yml
Triggers
push, pull_request, merge_group, workflow_dispatch
Runs on
ubuntu-latest, ubuntu-latest, ubuntu-latest, ubuntu-latest
Jobs
setup, lint, chromatic, integration_test
Actions
dorny/paths-filter, chromaui/action
Commands
  • corepack enable
  • pnpm install --frozen-lockfile
  • corepack enable
  • pnpm install --frozen-lockfile
  • pnpm lint
  • corepack enable
  • pnpm install --frozen-lockfile
  • corepack enable
View raw YAML
name: AutoGPT Platform - Frontend CI

on:
  push:
    branches: [master, dev]
    paths:
      - ".github/workflows/platform-frontend-ci.yml"
      - "autogpt_platform/frontend/**"
      - "autogpt_platform/backend/Dockerfile"
      - "autogpt_platform/docker-compose.yml"
      - "autogpt_platform/docker-compose.platform.yml"
  pull_request:
    paths:
      - ".github/workflows/platform-frontend-ci.yml"
      - "autogpt_platform/frontend/**"
      - "autogpt_platform/backend/Dockerfile"
      - "autogpt_platform/docker-compose.yml"
      - "autogpt_platform/docker-compose.platform.yml"
  merge_group:
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name == 'merge_group' && format('merge-queue-{0}', github.ref) || format('{0}-{1}', github.ref, github.event.pull_request.number || github.sha) }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

defaults:
  run:
    shell: bash
    working-directory: autogpt_platform/frontend

jobs:
  setup:
    runs-on: ubuntu-latest
    outputs:
      components-changed: ${{ steps.filter.outputs.components }}

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Check for component changes
        uses: dorny/paths-filter@v3
        id: filter
        with:
          filters: |
            components:
              - 'autogpt_platform/frontend/src/components/**'

      - name: Enable corepack
        run: corepack enable

      - name: Set up Node
        uses: actions/setup-node@v6
        with:
          node-version: "22.18.0"
          cache: "pnpm"
          cache-dependency-path: autogpt_platform/frontend/pnpm-lock.yaml

      - name: Install dependencies to populate cache
        run: pnpm install --frozen-lockfile

  lint:
    runs-on: ubuntu-latest
    needs: setup

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Enable corepack
        run: corepack enable

      - name: Set up Node
        uses: actions/setup-node@v6
        with:
          node-version: "22.18.0"
          cache: "pnpm"
          cache-dependency-path: autogpt_platform/frontend/pnpm-lock.yaml

      - name: Install dependencies
        run: pnpm install --frozen-lockfile

      - name: Run lint
        run: pnpm lint

  chromatic:
    runs-on: ubuntu-latest
    needs: setup
    # Disabled: to re-enable, remove 'false &&' from the condition below
    if: >-
      false
      && (github.ref == 'refs/heads/dev' || github.base_ref == 'dev')
      && needs.setup.outputs.components-changed == 'true'

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Enable corepack
        run: corepack enable

      - name: Set up Node
        uses: actions/setup-node@v6
        with:
          node-version: "22.18.0"
          cache: "pnpm"
          cache-dependency-path: autogpt_platform/frontend/pnpm-lock.yaml

      - name: Install dependencies
        run: pnpm install --frozen-lockfile

      - name: Run Chromatic
        uses: chromaui/action@latest
        with:
          projectToken: chpt_9e7c1a76478c9c8
          onlyChanged: true
          workingDir: autogpt_platform/frontend
          token: ${{ secrets.GITHUB_TOKEN }}
          exitOnceUploaded: true

  integration_test:
    runs-on: ubuntu-latest
    needs: setup

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          submodules: recursive

      - name: Enable corepack
        run: corepack enable

      - name: Set up Node
        uses: actions/setup-node@v6
        with:
          node-version: "22.18.0"
          cache: "pnpm"
          cache-dependency-path: autogpt_platform/frontend/pnpm-lock.yaml

      - name: Install dependencies
        run: pnpm install --frozen-lockfile

      - name: Generate API client
        run: pnpm generate:api

      - name: Run Integration Tests
        run: pnpm test:unit
platform-fullstack-ci .github/workflows/platform-fullstack-ci.yml
Triggers
push, pull_request, merge_group
Runs on
ubuntu-latest, ubuntu-latest, big-boi
Jobs
setup, check-api-types, e2e_test
Actions
docker/setup-buildx-action, crazy-max/ghaction-github-runtime
Commands
  • corepack enable
  • pnpm install --frozen-lockfile
  • POETRY_VERSION=$(python ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry) echo "Installing Poetry version ${POETRY_VERSION}" curl -sSL https://install.python-poetry.org | POETRY_VERSION=$POETRY_VERSION python3 -
  • poetry install
  • poetry run prisma generate && poetry run gen-prisma-stub
  • poetry run export-api-schema --output ../frontend/src/app/api/openapi.json
  • corepack enable
  • pnpm install --frozen-lockfile
View raw YAML
name: AutoGPT Platform - Full-stack CI

on:
  push:
    branches: [master, dev]
    paths:
      - ".github/workflows/platform-fullstack-ci.yml"
      - ".github/workflows/scripts/docker-ci-fix-compose-build-cache.py"
      - ".github/workflows/scripts/get_package_version_from_lockfile.py"
      - "autogpt_platform/**"
  pull_request:
    paths:
      - ".github/workflows/platform-fullstack-ci.yml"
      - ".github/workflows/scripts/docker-ci-fix-compose-build-cache.py"
      - ".github/workflows/scripts/get_package_version_from_lockfile.py"
      - "autogpt_platform/**"
  merge_group:

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name == 'merge_group' && format('merge-queue-{0}', github.ref) || github.head_ref && format('pr-{0}', github.event.pull_request.number) || github.sha }}
  cancel-in-progress: ${{ github.event_name == 'pull_request' }}

defaults:
  run:
    shell: bash
    working-directory: autogpt_platform/frontend

jobs:
  setup:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Enable corepack
        run: corepack enable

      - name: Set up Node
        uses: actions/setup-node@v6
        with:
          node-version: "22.18.0"
          cache: "pnpm"
          cache-dependency-path: autogpt_platform/frontend/pnpm-lock.yaml

      - name: Install dependencies to populate cache
        run: pnpm install --frozen-lockfile

  check-api-types:
    name: check API types
    runs-on: ubuntu-latest
    needs: setup

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          submodules: recursive

      # ------------------------ Backend setup ------------------------

      - name: Set up Backend - Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Set up Backend - Install Poetry
        working-directory: autogpt_platform/backend
        run: |
          POETRY_VERSION=$(python ../../.github/workflows/scripts/get_package_version_from_lockfile.py poetry)
          echo "Installing Poetry version ${POETRY_VERSION}"
          curl -sSL https://install.python-poetry.org | POETRY_VERSION=$POETRY_VERSION python3 -

      - name: Set up Backend - Set up dependency cache
        uses: actions/cache@v5
        with:
          path: ~/.cache/pypoetry
          key: poetry-${{ runner.os }}-${{ hashFiles('autogpt_platform/backend/poetry.lock') }}

      - name: Set up Backend - Install dependencies
        working-directory: autogpt_platform/backend
        run: poetry install

      - name: Set up Backend - Generate Prisma client
        working-directory: autogpt_platform/backend
        run: poetry run prisma generate && poetry run gen-prisma-stub

      - name: Set up Frontend - Export OpenAPI schema from Backend
        working-directory: autogpt_platform/backend
        run: poetry run export-api-schema --output ../frontend/src/app/api/openapi.json

      # ------------------------ Frontend setup ------------------------

      - name: Set up Frontend - Enable corepack
        run: corepack enable

      - name: Set up Frontend - Set up Node
        uses: actions/setup-node@v6
        with:
          node-version: "22.18.0"
          cache: "pnpm"
          cache-dependency-path: autogpt_platform/frontend/pnpm-lock.yaml

      - name: Set up Frontend - Install dependencies
        run: pnpm install --frozen-lockfile

      - name: Set up Frontend - Format OpenAPI schema
        id: format-schema
        run: pnpm prettier --write ./src/app/api/openapi.json

      - name: Check for API schema changes
        run: |
          if ! git diff --exit-code src/app/api/openapi.json; then
            echo "❌ API schema changes detected in src/app/api/openapi.json"
            echo ""
            echo "The openapi.json file has been modified after exporting the API schema."
            echo "This usually means changes have been made in the BE endpoints without updating the Frontend."
            echo "The API schema is now out of sync with the Front-end queries."
            echo ""
            echo "To fix this:"
            echo "\nIn the backend directory:"
            echo "1. Run 'poetry run export-api-schema --output ../frontend/src/app/api/openapi.json'"
            echo "\nIn the frontend directory:"
            echo "2. Run 'pnpm prettier --write src/app/api/openapi.json'"
            echo "3. Run 'pnpm generate:api'"
            echo "4. Run 'pnpm types'"
            echo "5. Fix any TypeScript errors that may have been introduced"
            echo "6. Commit and push your changes"
            echo ""
            exit 1
          else
            echo "✅ No API schema changes detected"
          fi

      - name: Set up Frontend - Generate API client
        id: generate-api-client
        run: pnpm orval --config ./orval.config.ts
        # Continue with type generation & check even if there are schema changes
        if: success() || (steps.format-schema.outcome == 'success')

      - name: Check for TypeScript errors
        run: pnpm types
        if: success() || (steps.generate-api-client.outcome == 'success')

  e2e_test:
    name: end-to-end tests
    runs-on: big-boi

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6
        with:
          submodules: recursive

      - name: Set up Platform - Copy default supabase .env
        run: |
          cp ../.env.default ../.env

      - name: Set up Platform - Copy backend .env and set OpenAI API key
        run: |
          cp ../backend/.env.default ../backend/.env
          echo "OPENAI_INTERNAL_API_KEY=${{ secrets.OPENAI_API_KEY }}" >> ../backend/.env
        env:
          # Used by E2E test data script to generate embeddings for approved store agents
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

      - name: Set up Platform - Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          driver: docker-container
          driver-opts: network=host

      - name: Set up Platform - Expose GHA cache to docker buildx CLI
        uses: crazy-max/ghaction-github-runtime@v4

      - name: Set up Platform - Build Docker images (with cache)
        working-directory: autogpt_platform
        run: |
          pip install pyyaml

          # Resolve extends and generate a flat compose file that bake can understand
          docker compose -f docker-compose.yml config > docker-compose.resolved.yml

          # Add cache configuration to the resolved compose file
          python ../.github/workflows/scripts/docker-ci-fix-compose-build-cache.py \
            --source docker-compose.resolved.yml \
            --cache-from "type=gha" \
            --cache-to "type=gha,mode=max" \
            --backend-hash "${{ hashFiles('autogpt_platform/backend/Dockerfile', 'autogpt_platform/backend/poetry.lock', 'autogpt_platform/backend/backend/**') }}" \
            --frontend-hash "${{ hashFiles('autogpt_platform/frontend/Dockerfile', 'autogpt_platform/frontend/pnpm-lock.yaml', 'autogpt_platform/frontend/src/**') }}" \
            --git-ref "${{ github.ref }}"

          # Build with bake using the resolved compose file (now includes cache config)
          docker buildx bake --allow=fs.read=.. -f docker-compose.resolved.yml --load
        env:
          NEXT_PUBLIC_PW_TEST: true

      - name: Set up tests - Cache E2E test data
        id: e2e-data-cache
        uses: actions/cache@v5
        with:
          path: /tmp/e2e_test_data.sql
          key: e2e-test-data-${{ hashFiles('autogpt_platform/backend/test/e2e_test_data.py', 'autogpt_platform/backend/migrations/**', '.github/workflows/platform-fullstack-ci.yml') }}

      - name: Set up Platform - Start Supabase DB + Auth
        run: |
          docker compose -f ../docker-compose.resolved.yml up -d db auth --no-build
          echo "Waiting for database to be ready..."
          timeout 60 sh -c 'until docker compose -f ../docker-compose.resolved.yml exec -T db pg_isready -U postgres 2>/dev/null; do sleep 2; done'
          echo "Waiting for auth service to be ready..."
          timeout 60 sh -c 'until docker compose -f ../docker-compose.resolved.yml exec -T db psql -U postgres -d postgres -c "SELECT 1 FROM auth.users LIMIT 1" 2>/dev/null; do sleep 2; done' || echo "Auth schema check timeout, continuing..."

      - name: Set up Platform - Run migrations
        run: |
          echo "Running migrations..."
          docker compose -f ../docker-compose.resolved.yml run --rm migrate
          echo "✅ Migrations completed"
        env:
          NEXT_PUBLIC_PW_TEST: true

      - name: Set up tests - Load cached E2E test data
        if: steps.e2e-data-cache.outputs.cache-hit == 'true'
        run: |
          echo "✅ Found cached E2E test data, restoring..."
          {
            echo "SET session_replication_role = 'replica';"
            cat /tmp/e2e_test_data.sql
            echo "SET session_replication_role = 'origin';"
          } | docker compose -f ../docker-compose.resolved.yml exec -T db psql -U postgres -d postgres -b
          # Refresh materialized views after restore
          docker compose -f ../docker-compose.resolved.yml exec -T db \
            psql -U postgres -d postgres -b -c "SET search_path TO platform; SELECT refresh_store_materialized_views();" || true

          echo "✅ E2E test data restored from cache"

      - name: Set up Platform - Start (all other services)
        run: |
          docker compose -f ../docker-compose.resolved.yml up -d --no-build
          echo "Waiting for rest_server to be ready..."
          timeout 60 sh -c 'until curl -f http://localhost:8006/health 2>/dev/null; do sleep 2; done' || echo "Rest server health check timeout, continuing..."
        env:
          NEXT_PUBLIC_PW_TEST: true

      - name: Set up tests - Create E2E test data
        if: steps.e2e-data-cache.outputs.cache-hit != 'true'
        run: |
          echo "Creating E2E test data..."
          docker cp ../backend/test/e2e_test_data.py $(docker compose -f ../docker-compose.resolved.yml ps -q rest_server):/tmp/e2e_test_data.py
          docker compose -f ../docker-compose.resolved.yml exec -T rest_server sh -c "cd /app/autogpt_platform && python /tmp/e2e_test_data.py" || {
            echo "❌ E2E test data creation failed!"
            docker compose -f ../docker-compose.resolved.yml logs --tail=50 rest_server
            exit 1
          }

          # Dump auth.users + platform schema for cache (two separate dumps)
          echo "Dumping database for cache..."
          {
            docker compose -f ../docker-compose.resolved.yml exec -T db \
              pg_dump -U postgres --data-only --column-inserts \
              --table='auth.users' postgres
            docker compose -f ../docker-compose.resolved.yml exec -T db \
              pg_dump -U postgres --data-only --column-inserts \
              --schema=platform \
              --exclude-table='platform._prisma_migrations' \
              --exclude-table='platform.apscheduler_jobs' \
              --exclude-table='platform.apscheduler_jobs_batched_notifications' \
              postgres
          } > /tmp/e2e_test_data.sql

          echo "✅ Database dump created for caching ($(wc -l < /tmp/e2e_test_data.sql) lines)"

      - name: Set up tests - Enable corepack
        run: corepack enable

      - name: Set up tests - Set up Node
        uses: actions/setup-node@v6
        with:
          node-version: "22.18.0"
          cache: "pnpm"
          cache-dependency-path: autogpt_platform/frontend/pnpm-lock.yaml

      - name: Set up tests - Install dependencies
        run: pnpm install --frozen-lockfile

      - name: Set up tests - Install browser 'chromium'
        run: pnpm playwright install --with-deps chromium

      - name: Run Playwright tests
        run: pnpm test:no-build
        continue-on-error: false

      - name: Upload Playwright report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-report
          path: autogpt_platform/frontend/playwright-report
          if-no-files-found: ignore
          retention-days: 3

      - name: Upload Playwright test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-test-results
          path: autogpt_platform/frontend/test-results
          if-no-files-found: ignore
          retention-days: 3

      - name: Print Final Docker Compose logs
        if: always()
        run: docker compose -f ../docker-compose.resolved.yml logs
pr-overlap-check perms .github/workflows/pr-overlap-check.yml
Triggers
pull_request
Runs on
ubuntu-latest
Jobs
check-overlaps
Commands
  • git config user.email "github-actions[bot]@users.noreply.github.com" git config user.name "github-actions[bot]"
  • python .github/scripts/detect_overlaps.py ${{ github.event.pull_request.number }}
View raw YAML
name: PR Overlap Detection

on:
  pull_request:
    types: [opened, synchronize, reopened]
    branches:
      - dev
      - master

permissions:
  contents: read
  pull-requests: write

jobs:
  check-overlaps:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0  # Need full history for merge testing

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Configure git
        run: |
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git config user.name "github-actions[bot]"

      - name: Run overlap detection
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        # Always succeed - this check informs contributors, it shouldn't block merging
        continue-on-error: true
        run: |
          python .github/scripts/detect_overlaps.py ${{ github.event.pull_request.number }}
repo-close-stale-issues perms .github/workflows/repo-close-stale-issues.yml
Triggers
schedule, workflow_dispatch
Runs on
ubuntu-latest
Jobs
stale
Actions
actions/stale
View raw YAML
name: Repo - Close stale issues
on:
  schedule:
    - cron: '30 1 * * *'
  workflow_dispatch:

permissions:
  issues: write

jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@v10
        with:
          # operations-per-run: 5000
          stale-issue-message: >
            This issue has automatically been marked as _stale_ because it has not had
            any activity in the last 170 days. You can _unstale_ it by commenting or
            removing the label. Otherwise, this issue will be closed in 10 days.
          stale-pr-message: >
            This pull request has automatically been marked as _stale_ because it has
            not had any activity in the last 50 days. You can _unstale_ it by commenting
            or removing the label.
          close-issue-message: >
            This issue was closed automatically because it has been stale for 10 days
            with no activity.
          days-before-stale: 170
          days-before-close: 10
          # Do not touch meta issues:
          exempt-issue-labels: meta,fridge,project management
          # Do not affect pull requests:
          days-before-pr-stale: -1
          days-before-pr-close: -1
repo-pr-enforce-base-branch .github/workflows/repo-pr-enforce-base-branch.yml
Triggers
pull_request_target
Runs on
ubuntu-latest
Jobs
check_pr_target
Commands
  • gh pr comment ${{ github.event.number }} --repo "$REPO" \ --body $'This PR targets the `master` branch but does not come from `dev` or a `hotfix/*` branch.\n\nAutomatically setting the base branch to `dev`.' gh pr edit ${{ github.event.number }} --base dev --repo "$REPO"
View raw YAML
name: Repo - Enforce dev as base branch
on:
  pull_request_target:
    branches: [ master ]
    types: [ opened ]

jobs:
  check_pr_target:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
    steps:
      - name: Check if PR is from dev or hotfix
        if: ${{ !(startsWith(github.event.pull_request.head.ref, 'hotfix/') || github.event.pull_request.head.ref == 'dev') }}
        run: |
          gh pr comment ${{ github.event.number }} --repo "$REPO" \
            --body $'This PR targets the `master` branch but does not come from `dev` or a `hotfix/*` branch.\n\nAutomatically setting the base branch to `dev`.'
          gh pr edit ${{ github.event.number }} --base dev --repo "$REPO"
        env:
          GITHUB_TOKEN: ${{ github.token }}
          REPO: ${{ github.repository }}
repo-pr-label .github/workflows/repo-pr-label.yml
Triggers
push, pull_request_target
Runs on
ubuntu-latest, ubuntu-latest, ubuntu-latest
Jobs
conflicts, size, scope
Actions
eps1lon/actions-label-merge-conflict, codelytv/pr-size-labeler, actions/labeler
View raw YAML
name: Repo - Pull Request auto-label

on:
  # So that PRs touching the same files as the push are updated
  push:
    branches: [ master, dev, release-* ]
    paths-ignore:
      - 'classic/forge/tests/vcr_cassettes'
      - 'classic/benchmark/reports/**'
  # So that the `dirtyLabel` is removed if conflicts are resolve
  # We recommend `pull_request_target` so that github secrets are available.
  # In `pull_request` we wouldn't be able to change labels of fork PRs
  pull_request_target:
    types: [ opened, synchronize ]

concurrency:
  group: ${{ format('pr-label-{0}', github.event.pull_request.number || github.sha) }}
  cancel-in-progress: true

jobs:
  conflicts:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - name: Update PRs with conflict labels
        uses: eps1lon/actions-label-merge-conflict@releases/2.x
        with:
          dirtyLabel: "conflicts"
          #removeOnDirtyLabel: "PR: ready to ship"
          repoToken: "${{ secrets.GITHUB_TOKEN }}"
          commentOnDirty: "This pull request has conflicts with the base branch, please resolve those so we can evaluate the pull request."
          commentOnClean: "Conflicts have been resolved! 🎉 A maintainer will review the pull request shortly."

  size:
    if: ${{ github.event_name == 'pull_request_target' }}
    permissions:
      issues: write
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
      - uses: codelytv/pr-size-labeler@v1
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          xs_label: 'size/xs'
          xs_max_size: 2
          s_label: 'size/s'
          s_max_size: 10
          m_label: 'size/m'
          m_max_size: 100
          l_label: 'size/l'
          l_max_size: 500
          xl_label: 'size/xl'
          message_if_xl:

  scope:
    if: ${{ github.event_name == 'pull_request_target' }}
    permissions:
      contents: read
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
      - uses: actions/labeler@v6
        with:
          sync-labels: true
repo-stats .github/workflows/repo-stats.yml
Triggers
schedule, workflow_dispatch
Runs on
ubuntu-latest
Jobs
j1
Actions
jgehrcke/github-repo-stats
View raw YAML
name: Repo - Github Stats

on:
  schedule:
    # Run this once per day, towards the end of the day for keeping the most
    # recent data point most meaningful (hours are interpreted in UTC).
    - cron: "0 23 * * *"
  workflow_dispatch: # Allow for running this manually.

jobs:
  j1:
    name: github-repo-stats
    runs-on: ubuntu-latest
    steps:
      - name: run-ghrs
        # Use latest release.
        uses: jgehrcke/github-repo-stats@HEAD
        with:
          ghtoken: ${{ secrets.ghrs_github_api_token }}

repo-workflow-checker .github/workflows/repo-workflow-checker.yml
Triggers
pull_request, merge_group
Runs on
ubuntu-latest
Jobs
status-check
Commands
  • python -m pip install --upgrade pip pip install requests
  • echo "Current directory before running Python script:" pwd echo "Attempting to run Python script:" python .github/workflows/scripts/check_actions_status.py
View raw YAML
name: Repo - PR Status Checker
on:
  pull_request:
    types: [opened, synchronize, reopened]
  merge_group:

jobs:
  status-check:
    name: Check PR Status
    runs-on: ubuntu-latest
    steps:
      # - name: Wait some time for all actions to start
      #   run: sleep 30
      - uses: actions/checkout@v6
        # with:
          # fetch-depth: 0
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.10"
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install requests
      - name: Check PR Status
        run: |
          echo "Current directory before running Python script:"
          pwd
          echo "Attempting to run Python script:"
          python .github/workflows/scripts/check_actions_status.py
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}