Skip to content

devsebastian44/AutoPR-Lab

Repository files navigation

🤖 AutoPR Lab

Sistema de revisión y merge automático de Pull Requests con análisis de seguridad integrado.
Cero intervención humana. Reglas estrictas. Decisiones trazables.

GitHub Actions Python 3.10+ License: MIT Security: Automated


¿Qué es AutoPR Lab?

AutoPR Lab es un sistema de revisión automática de Pull Requests construido sobre GitHub Actions y Python. Analiza cada PR en tiempo real, ejecuta detectores de seguridad modulares, y toma una de tres decisiones sin intervención humana:

Decisión Condición Acción
MERGE Sin problemas Aprueba + merge automático
⚠️ WARN MERGE Solo advertencias Aprueba + merge + comentario
REJECT Errores críticos Comenta problemas + cierra PR

🏗️ Arquitectura del Proyecto

AutoPR-Lab/
│
├── .github/
│   └── workflows/
│       └── auto-pr.yml          # Workflow principal de GitHub Actions
│
├── core/
│   ├── __init__.py
│   └── scanner.py               # Motor principal de análisis
│
├── detectors/
│   ├── __init__.py              # Auto-descubrimiento de detectores
│   ├── base_detector.py         # Clase base abstracta (contrato)
│   ├── api_keys_detector.py     # Detecta API keys y tokens
│   ├── passwords_detector.py    # Detecta passwords hardcodeados
│   ├── sensitive_files_detector.py  # Detecta archivos sensibles
│   └── detector_validator.py    # Valida estructura de detectores nuevos
│
├── utils/
│   ├── __init__.py
│   ├── github_api.py            # Cliente de la GitHub REST API
│   ├── comment_templates.py     # Templates para comentarios del bot
│   └── logger.py                # Sistema de logging con colores
│
├── scripts/
│   └── decision_engine.py       # Entry point: orquesta todo el flujo
│
├── tests/
│   ├── test_detectors.py        # Tests unitarios de detectores
│   └── test_scanner.py          # Tests de integración del scanner
│
├── docs/
│   ├── how-to-add-detector.md   # Guía para contributors
│   └── example-outputs.md       # Ejemplos de outputs del sistema
│
├── examples/
│   ├── valid-pr/                # Ejemplos de PRs que serán aceptados
│   └── invalid-pr/              # Ejemplos de PRs que serán rechazados
│
└── requirements.txt             # Dependencias (solo stdlib de Python)

🔍 Sistema de Detectores

Los detectores son módulos independientes que analizan el código y devuelven resultados estandarizados:

@dataclass
class DetectorResult:
    status: DetectorStatus      # OK | WARNING | ERROR
    detector_name: str
    message: str
    details: List[str]
    file_path: Optional[str]
    line_number: Optional[int]

Detectores incluidos

Detector Qué detecta Severidad
APIKeysDetector GitHub tokens, OpenAI keys, AWS secrets, claves RSA, URLs con credenciales 🔴 Critical
PasswordsDetector Passwords hardcodeados, contraseñas triviales, tokens de autenticación 🔴 Critical
SensitiveFilesDetector .env, .pem, .key, credentials.json, archivos de BD 🔴 Critical
DetectorFormatValidator Estructura, imports prohibidos, eval/exec, herencia correcta 🔴 Critical

🛡️ Reglas de Seguridad (Auto-Merge)

El sistema solo permite merge automático cuando se cumplen TODAS estas condiciones:

✅ Rutas permitidas para auto-merge

detectors/     ← Nuevos detectores
tests/         ← Tests
docs/          ← Documentación
examples/      ← Ejemplos
README.md      ← Readme principal

🚫 Rutas siempre bloqueadas

core/                    ← Motor principal (requiere revisión manual)
.github/workflows/       ← Workflows de CI/CD (crítico)
scripts/                 ← Scripts de decisión
requirements.txt         ← Dependencias
pyproject.toml           ← Configuración del proyecto
Makefile                 ← Automatización

📏 Límites de tamaño

  • Máximo 10 archivos por PR
  • Máximo 500 líneas cambiadas

⚡ Cómo Funciona (Flujo Completo)

PR Abierto/Actualizado
        │
        ▼
┌─────────────────────────────────┐
│   GitHub Actions Trigger        │
│   on: pull_request              │
└─────────────┬───────────────────┘
              │
              ▼
┌─────────────────────────────────┐
│   decision_engine.py            │
│   - Lee variables de entorno    │
│   - Obtiene archivos del PR     │
└─────────────┬───────────────────┘
              │
              ▼
┌─────────────────────────────────┐
│   SecurityRules.validate_paths  │
│   - ¿Rutas permitidas?          │
│   - ¿Tamaño dentro de límites?  │
└─────────────┬───────────────────┘
              │
              ▼
┌─────────────────────────────────┐
│   Scanner.scan_pr               │
│   - Ejecuta TODOS los           │
│     detectores sobre cada       │
│     archivo del PR              │
└─────────────┬───────────────────┘
              │
    ┌─────────┼──────────┐
    ▼         ▼          ▼
  ERROR    WARNING      OK
    │         │          │
    ▼         ▼          ▼
 REJECT  WARN_MERGE    MERGE
    │         │          │
    ▼         ▼          ▼
Comentar  Aprobar    Aprobar
 + Cerrar + Merge    + Merge
           + Comentar

🚀 Instalación y Configuración

1. Fork o clona el repositorio

git clone https://github.com/devsebastian44/AutoPR-Lab.git
cd AutoPR-Lab

2. Habilitar GitHub Actions

El workflow en .github/workflows/auto-pr.yml se activa automáticamente en cada PR.

No necesitas configurar nada adicional — usa el GITHUB_TOKEN que GitHub provee automáticamente.

3. Configurar permisos del repositorio

En Settings → Actions → General:

  • Marcar "Read and write permissions" para el GITHUB_TOKEN
  • Marcar "Allow GitHub Actions to create and approve pull requests"

4. Opcional: Ejecutar localmente

# Instalar dependencias (solo para desarrollo)
pip install -r requirements.txt

# Ejecutar tests
python -m pytest tests/ -v

# Dry run (sin ejecutar acciones reales en GitHub)
export GITHUB_TOKEN="tu_token"
export GITHUB_REPOSITORY="owner/repo"
export PR_NUMBER="123"
export DRY_RUN="true"
python scripts/decision_engine.py

🔌 Agregar un Detector Nuevo

  1. Crea /detectors/mi_detector.py heredando de BaseDetector
  2. Crea /tests/test_mi_detector.py con tests unitarios
  3. Abre un PR — AutoPR Lab lo revisará y mergeará automáticamente si está bien formado
# detectors/mi_detector.py
from detectors.base_detector import BaseDetector, DetectorResult, DetectorStatus
from typing import List

class MiDetector(BaseDetector):
    @property
    def name(self) -> str:
        return "MiDetector"

    @property
    def description(self) -> str:
        return "Detecta X en el código"

    @property
    def severity(self) -> str:
        return "high"  # critical | high | medium | low

    def analyze(self, file_path: str, content: str) -> List[DetectorResult]:
        results = []
        # Tu lógica aquí...
        return results

Ver guía completa: docs/how-to-add-detector.md


📊 Ejemplo de Output

PR Rechazado (con API key)

❌ [ERROR] APIKeysDetector: Posible OpenAI API Key detectado
    - Patrón detectado: sk-ab****ijk (detectors/bad.py, línea 5)
    
❌ [ERROR] PasswordsDetector: Password hardcodeado en 'DATABASE_PASSWORD'
    - Variable: DATABASE_PASSWORD (config.py, línea 12)

DECISIÓN: REJECT
→ PR comentado y cerrado automáticamente

PR Aprobado (detector limpio)

✅ [OK] DetectorFormatValidator: Estructura del detector válida
✅ [OK] APIKeysDetector: Sin credenciales detectadas
✅ [OK] PasswordsDetector: Sin passwords hardcodeados
✅ [OK] SensitiveFilesDetector: Sin archivos sensibles

DECISIÓN: MERGE
→ PR aprobado y mergeado automáticamente en 89ms

Ver más ejemplos: docs/example-outputs.md


🔒 Modelo de Seguridad

Protección contra abuso

  • Validación de paths: Solo archivos en rutas explícitamente permitidas
  • Análisis estático de AST: Los detectores nuevos son analizados con ast.parse() antes de ser aceptados
  • Imports prohibidos: subprocess, socket, requests, eval, exec son bloqueados automáticamente
  • Límites de tamaño: PRs grandes requieren revisión manual
  • Sin ejecución de código: Los detectores NUNCA ejecutan el código que analizan, solo lo leen como texto

Qué requiere revisión manual

Cualquier cambio en estas áreas nunca se auto-mergea:

  • El motor de decisión (core/, scripts/)
  • Los workflows de GitHub Actions
  • Las dependencias del proyecto

Releases

No releases published

Packages

 
 
 

Contributors