Skip to content

test(sealevel): backward compat e2e with old core programs #5779

test(sealevel): backward compat e2e with old core programs

test(sealevel): backward compat e2e with old core programs #5779

name: Claude Code Review
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
paths:
- 'solidity/**'
- 'rust/**'
- 'typescript/infra/**'
pull_request_review_comment:
types: [created]
issue_comment:
types: [created]
env:
CLAUDE_OPUS_MODEL: claude-opus-4-6
CLAUDE_SONNET_MODEL: claude-sonnet-4-5
concurrency:
group: claude-review-${{ github.event.pull_request.number || github.event.issue.number }}
cancel-in-progress: false
jobs:
# On-demand code review triggered by @claude review comment or 'claude-review' label
code-review:
if: |
(
github.event_name == 'issue_comment' &&
github.event.issue.pull_request &&
contains(github.event.comment.body, '@claude review') &&
(
github.event.comment.author_association == 'MEMBER' ||
github.event.comment.author_association == 'OWNER' ||
github.event.comment.author_association == 'COLLABORATOR'
)
) ||
(
github.event_name == 'pull_request' &&
contains(join(github.event.pull_request.labels.*.name, ','), 'claude-review') &&
github.event.pull_request.head.repo.full_name == github.repository
)
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
pull-requests: write
issues: write
id-token: write
steps:
- name: Get PR SHA
id: pr-sha
uses: actions/github-script@v7
with:
script: |
if (context.eventName === 'issue_comment') {
const { data: pr } = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number
});
core.setOutput('head_sha', pr.head.sha);
} else {
core.setOutput('head_sha', context.payload.pull_request.head.sha);
}
- name: Checkout repository
uses: actions/checkout@v6
with:
ref: ${{ steps.pr-sha.outputs.head_sha }}
fetch-depth: 0
- name: Run Claude Code Review
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: Run /claude-review
track_progress: true
use_sticky_comment: true
claude_args: |
--model ${{ env.CLAUDE_OPUS_MODEL }}
--max-turns 30
# Security-focused review: manual via @claude security comment only
security-review:
if: |
github.event_name == 'issue_comment' &&
github.event.issue.pull_request &&
contains(github.event.comment.body, '@claude security') &&
(
github.event.comment.author_association == 'MEMBER' ||
github.event.comment.author_association == 'OWNER' ||
github.event.comment.author_association == 'COLLABORATOR'
)
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: read
pull-requests: write
issues: write
id-token: write
steps:
- name: Get PR SHA
id: pr-sha
uses: actions/github-script@v7
with:
script: |
if (context.eventName === 'issue_comment') {
const { data: pr } = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number
});
core.setOutput('head_sha', pr.head.sha);
} else {
core.setOutput('head_sha', context.payload.pull_request.head.sha);
}
- name: Checkout repository
uses: actions/checkout@v6
with:
ref: ${{ steps.pr-sha.outputs.head_sha }}
fetch-depth: 2
- name: Run Claude Security Review
uses: anthropics/claude-code-security-review@25e460eb0a12077f0c6a1934d5dbae2f50785dda
with:
claude-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
comment-pr: true
upload-results: true
exclude-directories: 'node_modules,dist,coverage,artifacts,cache,typechain'
claudecode-timeout: '15'
claude-model: ${{ env.CLAUDE_OPUS_MODEL }}
custom-security-scan-instructions: '.github/prompts/security-scan.md'
# Trail of Bits security skills: manual via @claude security comment only
tob-security-skills:
if: |
github.event_name == 'issue_comment' &&
github.event.issue.pull_request &&
contains(github.event.comment.body, '@claude security') &&
(
github.event.comment.author_association == 'MEMBER' ||
github.event.comment.author_association == 'OWNER' ||
github.event.comment.author_association == 'COLLABORATOR'
)
runs-on: ubuntu-latest
timeout-minutes: 25
permissions:
contents: read
pull-requests: write
issues: write
id-token: write
steps:
- name: Get PR SHA
id: pr-sha
uses: actions/github-script@v7
with:
script: |
if (context.eventName === 'issue_comment') {
const { data: pr } = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.issue.number
});
core.setOutput('head_sha', pr.head.sha);
core.setOutput('base_sha', pr.base.sha);
} else {
core.setOutput('head_sha', context.payload.pull_request.head.sha);
core.setOutput('base_sha', context.payload.pull_request.base.sha);
}
- name: Checkout repository
uses: actions/checkout@v6
with:
ref: ${{ steps.pr-sha.outputs.head_sha }}
fetch-depth: 0
- name: Check for Solidity changes
id: solidity-changes
uses: dorny/paths-filter@v3
with:
base: ${{ steps.pr-sha.outputs.base_sha }}
ref: ${{ steps.pr-sha.outputs.head_sha }}
filters: |
solidity:
- 'solidity/**'
- name: Run ToB Security Skills
if: steps.solidity-changes.outputs.solidity == 'true'
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: Run /claude-tob-review
track_progress: true
use_sticky_comment: true
claude_args: |
--model ${{ env.CLAUDE_OPUS_MODEL }}
--max-turns 25
# Interactive @claude mentions in comments
interactive:
if: |
(
github.event_name == 'issue_comment' &&
contains(github.event.comment.body, '@claude') &&
!contains(github.event.comment.body, '@claude review') &&
!contains(github.event.comment.body, '@claude security') &&
(
github.event.comment.author_association == 'MEMBER' ||
github.event.comment.author_association == 'OWNER' ||
github.event.comment.author_association == 'COLLABORATOR'
)
) ||
(
github.event_name == 'pull_request_review_comment' &&
contains(github.event.comment.body, '@claude') &&
!contains(github.event.comment.body, '@claude security') &&
(
github.event.comment.author_association == 'MEMBER' ||
github.event.comment.author_association == 'OWNER' ||
github.event.comment.author_association == 'COLLABORATOR'
)
)
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
pull-requests: write
issues: write
id-token: write
steps:
- name: Get PR SHA
id: pr-sha
uses: actions/github-script@v7
with:
script: |
let prNumber;
if (context.eventName === 'issue_comment') {
prNumber = context.issue.number;
} else if (context.eventName === 'pull_request_review_comment') {
prNumber = context.payload.pull_request.number;
}
if (prNumber) {
const { data: pr } = await github.rest.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: prNumber
});
core.setOutput('head_sha', pr.head.sha);
}
- name: Checkout repository
uses: actions/checkout@v6
with:
ref: ${{ steps.pr-sha.outputs.head_sha || github.sha }}
fetch-depth: 0
- name: Run Claude Code Assistant
uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
track_progress: true
use_sticky_comment: true
claude_args: |
--model ${{ env.CLAUDE_SONNET_MODEL }}
--max-turns 20