Una herramienta CLI en Rust que descubre recursivamente repositorios Git, captura cambios de estado, genera diferencias, extrae elementos de código con fragmentos completos y produce informes centrados en seguridad para flujos de revisión de código y auditoría.
Si este proyecto ayuda tu trabajo, apoya el mantenimiento continuo y nuevas funcionalidades.
Dirección de Donación en ETH
0x11282eE5726B3370c8B480e321b3B2aA13686582
Escanee el código QR o copie la dirección de billetera anterior.
Una herramienta CLI en Rust que descubre recursivamente repositorios Git, captura cambios de estado, genera diferencias, extrae elementos de código con fragmentos completos y produce informes centrados en seguridad para flujos de revisión de código y auditoría.
¿Por qué no solo usar bash?
Una línea como
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; donesolo muestra diferencias en bruto. DiffCatcher añade descubrimiento recursivo, extracción de elementos de código, detección de patrones de seguridad, salida SARIF para CI/CD, procesamiento paralelo y agregación de seguridad entre repositorios. Ver comparación completa más abajo.
git clone https://github.com/Teycir/DiffCatcher.git
cd DiffCatcher
cargo build --release
./target/release/diffcatcher --help
# Escanear todos los repositorios en un directorio (solo fetch, sin modificaciones)
diffcatcher ~/projects
# Obtener actualizaciones y generar informe de seguridad
diffcatcher ~/projects --pull -o ./report
# Diferencia dos ramas en un solo repositorio (modo revisión de PR)
diffcatcher ./my-repo --diff main..feature/auth -o ./pr-report
# Generar salida SARIF para GitHub Code Scanning
diffcatcher ~/projects --summary-format sarif,json -o ./report
# Ejecución en seco para ver qué se escanearía
diffcatcher ~/projects --dry-run
# Escaneo rápido con 8 trabajadores en paralelo
diffcatcher ~/projects -j 8 --quiet
# Escanear con configuración por defecto (solo fetch)
diffcatcher <ROOT_DIR>
# Directorio de salida personalizado
diffcatcher ~/projects -o ./my-report
# Incluir repositorios anidados y seguir enlaces simbólicos
diffcatcher ~/projects --nested --follow-symlinks
# Omitir directorios ocultos
diffcatcher ~/projects --skip-hidden
# Solo fetch (por defecto - sin cambios en el árbol de trabajo)
diffcatcher ~/projects
# Realizar pull de cambios
diffcatcher ~/projects --pull
# Forzar pull con stash/pop para repositorios sucios
diffcatcher ~/projects --pull --force-pull
# Usar estrategia rebase
diffcatcher ~/projects --pull --pull-strategy rebase
# Omitir totalmente fetch/pull (solo diferencias históricas)
diffcatcher ~/projects --no-pull
# Omitir extracción de elementos (solo diferencias en bruto)
diffcatcher ~/projects --no-summary-extraction
# Extraer elementos pero omitir fragmentos de código
diffcatcher ~/projects --no-snippets
# Ajustar contexto de fragmentos y límites
diffcatcher ~/projects --snippet-context 10 --max-snippet-lines 300
# Limitar elementos por diferencia
diffcatcher ~/projects --max-elements 1000
# Omitir etiquetado de seguridad
diffcatcher ~/projects --no-security-tags
# Incluir archivos de prueba en el análisis de seguridad
diffcatcher ~/projects --include-test-security
# Usar patrones de seguridad personalizados
diffcatcher ~/projects --security-tags-file ./custom-patterns.json
DiffCatcher puede cargar automáticamente la configuración local del proyecto desde:
<ROOT_DIR>/.diffcatcher.toml (por defecto)--config <FILE>--no-configEjemplo:
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"]
Los indicadores CLI aún anulan los valores de configuración cuando se establecen explícitamente.
DiffCatcher soporta dos tipos de plugins:
--security-plugin-file <FILE> (repetible)--extractor-plugin-file <FILE> (repetible)El formato del plugin de seguridad coincide con el JSON de --security-tags-file (version, mode, tags).
Formato del plugin extractor:
{
"version": 1,
"extractors": [
{
"name": "policy-rule",
"kind": "Config",
"regex": "^policy\\s+([A-Za-z_][A-Za-z0-9_]*)"
}
]
}
# Diferencia dos ramas en un solo repositorio
diffcatcher ./my-repo --diff main..feature/auth
# Diferencia commits específicos
diffcatcher ./my-repo --diff abc123..def456
# Diferencia con salida SARIF para integración en CI
diffcatcher ./my-repo --diff origin/main..HEAD --summary-format sarif -o ./pr-report
El indicador --diff BASE..HEAD omite el descubrimiento de repositorios y fetch/pull — diferencia directamente dos referencias (ramas, tags o SHAs de commit) y ejecuta el proceso completo de extracción + etiquetado de seguridad sobre el resultado.
# Generar SARIF junto con otros formatos
diffcatcher ~/projects --summary-format sarif,json,md