Inteligência Artificial

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.

Post Recentes

Banner de cookie que bloqueia de verdade: script só carrega depois do aceite

O banner aparece, o visitante não clica em nada e o Analytics já gravou cookie. Veja como segurar o script…

5 horas atrás

Cannot query field no GraphQL do Magento 2: o campo existe e some

O campo está no schema.graphqls e a API insiste em Cannot query field. Limpe o cache certo, recompile o generated…

1 dia atrás

Block pattern não aparece no inseridor: registre pelo arquivo em /patterns

Padrão registrado no functions.php que não aparece na aba Padrões. O caminho curto do WordPress 6.9: um arquivo PHP na…

2 dias atrás

Tamanho das tabelas MySQL 8: a query que acha o vilão do disco

Disco lotando por causa do banco? Uma query no information_schema mostra qual tabela cresceu, quanto é dado, quanto é índice…

2 dias atrás

CodeIgniter 3 PHP 8.3: os erros fatais que aparecem logo no boot

Sistema em CodeIgniter 3.1.13 morre no primeiro request depois do upgrade. Os três pontos que quebram no PHP 8.3 e…

3 dias atrás

rsync do pub/media no Magento 2: copiar as imagens sem levar o cache

Metade do seu pub/media é miniatura descartável. Veja o rsync com os excludes certos e o comando que reconstrói o…

4 dias atrás