Revisar git diff com IA antes do commit: script que lê só o staged

Diff de 400 linhas, e a gente lê as três primeiras. Foi assim que entraram aqui um var_dump no meio do checkout e uma senha de teste chumbada numa constante. O que resolveu foi parar de tentar ler tudo: um script que recebe o git diff --staged pela entrada padrão e cospe só as linhas adicionadas suspeitas.

O revisa.php

<?php
// bin/revisa.php — uso: git diff --staged -U0 | php bin/revisa.php
$regras = [
    'debug'    => '/b(var_dump|print_r|dd|dump|console.log)s*(/',
    'segredo'  => '/(senha|password|passwd|secret|api_?key|token)s*[=:]s*[x27"][^x27"]{6,}/i',
    'pendente' => '/b(TODO|FIXME|XXX)b/',
    'erro_off' => '/error_reportings*(s*0s*)|@$?[a-z_]+s*(/i',
];

$arquivo = '';
$achados = [];

while (($l = fgets(STDIN)) !== false) {
    if (str_starts_with($l, '+++ b/')) { $arquivo = trim(substr($l, 6)); continue; }
    if ($l[0] !== '+') { continue; }

    foreach ($regras as $nome => $re) {
        if (preg_match($re, $l)) {
            $achados[] = sprintf('[%s] %s: %s', $nome, $arquivo, trim(substr($l, 1)));
        }
    }
}

echo $achados ? implode(PHP_EOL, $achados) . PHP_EOL : 'staged limpo' . PHP_EOL;
exit(0);

O -U0 não é enfeite. O filtro do + já descarta as linhas de contexto, mas com -U0 o que trafega é só o que entrou no índice, e isso conta quando a saída vai parar num assistente. A regra erro_off é a mais barulhenta: o @ pega qualquer função silenciada. Ajuste as quatro pro seu código.

Ligando no pre-commit sem travar nada

cat > .git/hooks/pre-commit <<'SH'
#!/bin/sh
git diff --staged -U0 | php bin/revisa.php
exit 0
SH
chmod +x .git/hooks/pre-commit

Esse cat > sobrescreve o hook que já existir: se o projeto usa husky ou captainhook, acrescente a linha no arquivo atual. O exit 0 fixo é proposital: hook que barra commit vira hook que todo mundo pula com --no-verify. Ele avisa, você decide.

Onde a IA entra

A saída curta é o que torna a revisão automática viável: em vez de despejar o diff inteiro num assistente, você manda dez linhas e pergunta o que dá pra quebrar ali. Menos a linha marcada como segredo — essa não sai da máquina. Se o script achou senha ou chave, tire do índice com git restore --staged e rode a troca da credencial.

Dúvidas? Faça um comentário logo abaixo ou envie uma mensagem clicando aqui.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *