Uma ferramenta CLI em Rust que descobre recursivamente repositórios Git, captura mudanças de estado, gera diffs, extrai elementos de código com snippets completos e produz relatórios focados em segurança para fluxos de trabalho de revisão de código e auditoria.
Se este projeto ajuda seu trabalho, apoie a manutenção contínua e novos recursos.
Carteira de Doação ETH
0x11282eE5726B3370c8B480e321b3B2aA13686582
Escaneie o código QR ou copie o endereço da carteira acima.
Uma ferramenta CLI em Rust que descobre recursivamente repositórios Git, captura mudanças de estado, gera diffs, extrai elementos de código com trechos completos e produz relatórios focados em segurança para fluxos de revisão de código e auditoria.
Por que não usar apenas bash?
Um one-liner como
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; donemostra apenas diffs brutos. DiffCatcher adiciona descoberta recursiva, extração de elementos de código, detecção de padrões de segurança, saída SARIF para CI/CD, processamento paralelo e agregação de segurança entre repositórios. Veja a comparação completa abaixo.
git clone https://github.com/Teycir/DiffCatcher.git
cd DiffCatcher
cargo build --release
./target/release/diffcatcher --help
# Varre todos os repositórios em um diretório (apenas fetch, sem modificações)
diffcatcher ~/projects
# Atualiza com pull e gera relatório de segurança
diffcatcher ~/projects --pull -o ./report
# Diferença entre duas branches em um único repositório (modo revisão de PR)
diffcatcher ./my-repo --diff main..feature/auth -o ./pr-report
# Gera saída SARIF para GitHub Code Scanning
diffcatcher ~/projects --summary-format sarif,json -o ./report
# Simulação para ver o que seria varrido
diffcatcher ~/projects --dry-run
# Varredura rápida com 8 trabalhadores paralelos
diffcatcher ~/projects -j 8 --quiet
# Varre com configurações padrão (apenas fetch)
diffcatcher <ROOT_DIR>
# Diretório de saída personalizado
diffcatcher ~/projects -o ./my-report
# Inclui repositórios aninhados e segue links simbólicos
diffcatcher ~/projects --nested --follow-symlinks
# Pula diretórios ocultos
diffcatcher ~/projects --skip-hidden
# Apenas fetch (padrão - sem alterações na árvore de trabalho)
diffcatcher ~/projects
# Realmente puxa alterações
diffcatcher ~/projects --pull
# Força pull com stash/pop para repositórios sujos
diffcatcher ~/projects --pull --force-pull
# Usa estratégia rebase
diffcatcher ~/projects --pull --pull-strategy rebase
# Pula fetch/pull completamente (apenas diffs históricos)
diffcatcher ~/projects --no-pull
# Pula extração de elementos (apenas diffs brutos)
diffcatcher ~/projects --no-summary-extraction
# Extrai elementos mas pula trechos de código
diffcatcher ~/projects --no-snippets
# Ajusta contexto e limites dos trechos
diffcatcher ~/projects --snippet-context 10 --max-snippet-lines 300
# Limita elementos por diff
diffcatcher ~/projects --max-elements 1000
# Pula marcação de segurança
diffcatcher ~/projects --no-security-tags
# Inclui arquivos de teste na análise de segurança
diffcatcher ~/projects --include-test-security
# Usa padrões de segurança personalizados
diffcatcher ~/projects --security-tags-file ./custom-patterns.json
DiffCatcher pode carregar automaticamente a configuração local do projeto a partir de:
<ROOT_DIR>/.diffcatcher.toml (padrão)--config <FILE>--no-configExemplo:
output = "reports-local"
no_pull = true
history_depth = 2
summary_formats = ["json", "txt"]
no_security_tags = false
[plugins]
security_pattern_files = ["plugins/security-extra.json"]
extractor_files = ["plugins/extractors.json"]
As flags da linha de comando ainda sobrescrevem os valores de configuração quando definidas explicitamente.
DiffCatcher suporta dois tipos de plugins:
--security-plugin-file <FILE> (repetível)--extractor-plugin-file <FILE> (repetível)O formato do plugin de segurança corresponde ao JSON de --security-tags-file (version, mode, tags).
Formato do plugin de extrator:
{
"version": 1,
"extractors": [
{
"name": "policy-rule",
"kind": "Config",
"regex": "^policy\\s+([A-Za-z_][A-Za-z0-9_]*)"
}
]
}
# Diferença entre duas branches em um único repositório
diffcatcher ./my-repo --diff main..feature/auth
# Diferença entre commits específicos
diffcatcher ./my-repo --diff abc123..def456
# Diferença com saída SARIF para integração CI
diffcatcher ./my-repo --diff origin/main..HEAD --summary-format sarif -o ./pr-report
A flag --diff BASE..HEAD pula a descoberta de repositórios e fetch/pull — ela difere diretamente duas referências (branches, tags ou SHAs de commit) e executa o pipeline completo de extração + marcação de segurança no resultado.
# Gera SARIF junto com outros formatos
diffcatcher ~/projects --summary-format sarif,json,md
# Apenas SARIF para upload em CI/CD
diffcatcher ~/projects --summary-format sarif -o ./report