Una GitHub Action che revisiona ogni PR
Avanzato
- Collegare Claude Code headless a un workflow pull_request che revisiona il diff e commenta
- Impostare il blocco permissions su solo commento, e spiegare perché contents: write è la linea che non si supera
- Trattare il contenuto delle pull request come input non attendibile, perché è esattamente ciò che è
- Mantenere limitato il costo di una revisione al crescere dei diff
- Scrivere il prompt in modo che il commento venga letto invece di essere compresso
Un classico dell'automazione ad alto valore: far revisionare a Claude ogni pull request e pubblicare le sue osservazioni come commento — eseguendolo headless in CI. Ecco la forma, con le protezioni che lo mantengono sicuro.
Cosa fa
A ogni PR: fa il checkout del diff, chiede a Claude di revisionarlo cercando bug, casi limite e problemi di convenzioni, e pubblica un commento. Le persone decidono ancora; Claude dà solo una prima passata rapida.
Guided walkthrough1 of 4
- Un clone shallow non vede il branch di base, quindi il diff esce vuoto e la revisione si legge come un via libera sicuro su nulla. Recupera la profondità completa.
- Fai il diff del ref di base contro HEAD e scrivilo su disco. Tenerlo come artefatto invece che in una variabile di shell evita che diff molto grandi rompano la riga di comando.
- Un prompt, una passata, output catturato come Markdown. Nessuno strumento, nessuna scrittura sul repo — questo passo deve solo leggere e produrre testo.
- Con la CLI gh o con una action. È l'unico passo che richiede un permesso di scrittura di qualsiasi tipo, e l'unica scrittura che gli serve è pull-requests.
Il workflow (bozza)
name: Claude PR review
on: pull_request
permissions:
contents: read
pull-requests: write # to comment — NOT write to code
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- name: Review the diff
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
git diff origin/${{ github.base_ref }}...HEAD > /tmp/diff.patch
claude -p "Review this diff for correctness bugs, missing edge cases, and
security issues. Report ONLY high-confidence findings as a Markdown
checklist with file:line. Diff:" < /tmp/diff.patch > /tmp/review.md
# then post /tmp/review.md as a PR comment (e.g. with the gh CLI or an action)
(L'invocazione headless esatta può differire — vedi la documentazione. Il principio è: dare in pasto il diff, catturare il Markdown, pubblicarlo.)
Le protezioni (leggi Rafforzare le esecuzioni autonome)
Privilegio minimo in CI
- Solo commento. Concedi
pull-requests: write, noncontents: write— il bot non deve pushare codice. - Limita il token; non esporre mai accesso a deploy/segreti a un job che legge contenuto non attendibile di una PR.
- Tratta il contenuto della PR come non attendibile — può portare prompt injection; non lasciare che il job compia azioni con conseguenze.
- Limita il costo — i diff grandi costano token; valuta di revisionare solo i file modificati.
Renderlo utile, non rumoroso
- Chiedi solo osservazioni ad alta confidenza — un muro di pignolerie viene ignorato.
- Tienilo come prima passata, con le persone che decidono il merge.
The review prompt — tuned for a comment people actually read
Review this diff for correctness bugs, missing edge cases, and security issues. Rules for your output: - Report ONLY high-confidence findings. If you are unsure, leave it out. - One Markdown checklist item per finding, each starting with file:line. - State the concrete failure: what input or state leads to what wrong result. - No style nitpicks, no praise, no summary of what the diff does. - If you find nothing high-confidence, say exactly that in one line. Diff:
Check yourself
0/3- L'intero job è: checkout a profondità completa, diff su file, una passata headless, pubblicazione del Markdown. Quattro passi, uno solo dei quali richiede accesso in scrittura.
- pull-requests: write e contents: read. Mai contents: write in un job che legge contenuto scritto da contributor.
- fetch-depth: 0, altrimenti il diff è vuoto e la revisione si legge come un certificato di buona salute.
- Il contenuto delle PR non è attendibile e può portare prompt injection. Il privilegio minimo è il controllo; la formulazione del prompt non è un confine.
- Chiedi solo osservazioni ad alta confidenza, con file:line. Un muro di pignolerie viene compresso e l'automazione muore di indifferenza.
- Limita il costo al crescere dei diff — revisionare solo i file modificati è la leva abituale.
- È una prima passata. Le persone decidono ancora il merge.