Anatoly logo - multi-LLM AI agent that audits your codebase

Use case

A senior reviewer on every pull request.

Run Anatoly inside GitHub Actions or GitLab CI. Structured exit codes gate the merge, the full Markdown report uploads as an artifact, and a summary lands as a PR comment — same audit pipeline as local, headless.

Designed to run headless

Anatoly's CLI is non-interactive by default. The --plain flag drops colors and spinners for clean log output, the run is reproducible from a checkout, and the process exits with a code your pipeline can branch on.

Drop-in GitHub Actions workflow

.github/workflows/anatoly.yml
name: Anatoly audit

on:
  pull_request:
    branches: [main]
    paths:
      - 'src/**/*.ts'
      - 'src/**/*.tsx'

jobs:
  audit:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: 'npm'
      - run: npm ci
      - name: Run Anatoly
        run: npx anatoly run --plain
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
      - name: Upload report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: anatoly-report
          path: .anatoly/runs/*/report.md

Set ANTHROPIC_API_KEY as a repository secret and you're live. The report is uploaded as a build artifact if: always(), so you can inspect findings even when the job exits non-zero.

What the build log looks like

GitHub Actions · Anatoly audit
[anatoly] scanning · 312 files · TS · TSX
[anatoly] axes · 7/7 · estimated $14.20
[anatoly] deliberation · 47 raw → 28 confirmed
[anatoly] verdict: NEEDS_REFACTOR · 28 findings
[anatoly] report: .anatoly/runs/2026-05-05_134210/report.md

Error: Process completed with exit code 1.

Post the report as a PR comment

Add a second job step that reads the Markdown report and pushes it as a comment on the pull request — reviewers see findings without leaving the GitHub UI.

.github/workflows/anatoly.ymlextension
      - name: Post findings
        if: failure()
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const report = fs.readFileSync(
              '.anatoly/report.md', 'utf-8');
            constbody = report.length > 60000
              ? report.slice(0, 60000) + '\\n... (truncated)'
              : report;
            await github.rest.issues.createComment({
              owner: context.repo.owner, repo: context.repo.repo,
              issue_number: context.issue.number,
              body: `## Anatoly audit\\n\\n$${body}`,
            });

Cost control on every run

The CI budget question matters: a naive setup re-audits the whole repo on every PR. Anatoly avoids that two ways.

Other CI providers

Any pipeline that can run npx works the same way — the contract is just exit codes and a Markdown report on disk. GitLab CI, CircleCI, Jenkins, Buildkite: same recipe, different YAML.

Who this fits

Other use cases

Run your first auditSee a sample report →← All use cases