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

Erro 500 no Magento 2: achar o relatório em var/report pelo ID da tela

O hash que o Magento mostra junto do erro é o nome de um arquivo em var/report. Veja como abrir,…

23 horas atrás

Campo extra no checkout em blocos do WooCommerce sem voltar pro shortcode

Seu snippet com woocommerce_checkout_fields parou de aparecer no checkout em blocos. Registre o campo pela API nova e leia o…

2 dias atrás

Fuso horário no PHP 8.3: log com 3 horas de diferença no servidor

O pedido entrou às 21h e o relatório mostra 00h do dia seguinte. Onde setar date.timezone no PHP 8.3 e…

2 dias atrás

Magento 2 não envia e-mail de pedido: async sending e cron parado

O pedido entra na loja e o e-mail nunca sai: antes de culpar o SMTP, veja o envio assíncrono, a…

3 dias atrás

cron_schedules WordPress: intervalo de 5 minutos no WP-Cron

O WordPress só oferece hourly, twicedaily, daily e weekly. Use o filtro cron_schedules para criar um intervalo de 5 minutos…

4 dias atrás

E-mails do WooCommerce não chegam: como testar o envio de um pedido real

Dispare pela linha de comando o e-mail de um pedido que já existe na loja e descubra se a falha…

4 dias atrás