--- description: Revisión de código — cambios locales no confirmados o PR de GitHub (pasa número/URL del PR para modo PR) argument-hint: [número-pr | url-pr | vacío para revisión local] --- # Revisión de Código > Modo de revisión de PR adaptado de PRPs-agentic-eng por Wirasm. Parte de la serie de flujos de trabajo PRP. **Entrada**: $ARGUMENTS --- ## Selección de Modo Si `$ARGUMENTS` contiene un número de PR, URL de PR, o `--pr`: → Ir a **Modo de Revisión de PR** más abajo. De lo contrario: → Usar **Modo de Revisión Local**. --- ## Modo de Revisión Local Revisión exhaustiva de seguridad y calidad de los cambios no confirmados. ### Fase 1 — RECOPILAR ```bash git diff --name-only HEAD ``` Si no hay archivos modificados, detener: "Nada que revisar." ### Fase 2 — REVISAR Leer cada archivo modificado completo. Verificar: **Problemas de Seguridad (CRÍTICO):** - Credenciales, claves de API, tokens hardcodeados - Vulnerabilidades de inyección SQL - Vulnerabilidades XSS - Validación de entrada faltante - Dependencias inseguras - Riesgos de path traversal **Calidad de Código (ALTO):** - Funciones de más de 50 líneas - Archivos de más de 800 líneas - Profundidad de anidamiento mayor a 4 niveles - Manejo de errores faltante - Sentencias console.log - Comentarios TODO/FIXME - JSDoc faltante para APIs públicas **Buenas Prácticas (MEDIO):** - Patrones de mutación (usar inmutable en su lugar) - Uso de emojis en código/comentarios - Pruebas faltantes para código nuevo - Problemas de accesibilidad (a11y) ### Fase 3 — REPORTE Generar reporte con: - Severidad: CRÍTICO, ALTO, MEDIO, BAJO - Ubicación del archivo y números de línea - Descripción del problema - Corrección sugerida Bloquear commit si se encuentran problemas CRÍTICOS o ALTOS. Nunca aprobar código con vulnerabilidades de seguridad. --- ## Modo de Revisión de PR Revisión exhaustiva de PR de GitHub — obtiene el diff, lee los archivos completos, ejecuta validación, publica la revisión. ### Fase 1 — OBTENER Parsear la entrada para determinar el PR: | Entrada | Acción | |---|---| | Número (ej. `42`) | Usar como número de PR | | URL (`github.com/.../pull/42`) | Extraer número de PR | | Nombre de branch | Encontrar PR via `gh pr list --head ` | ```bash gh pr view --json number,title,body,author,baseRefName,headRefName,changedFiles,additions,deletions gh pr diff ``` Si no se encuentra el PR, detener con error. Almacenar metadatos del PR para fases posteriores. ### Fase 2 — CONTEXTO Construir contexto de revisión: 1. **Reglas del proyecto** — Leer `CLAUDE.md`, `.claude/docs/`, y cualquier guía de contribución 2. **Artefactos de planificación** — Verificar `.claude/prds/`, `.claude/plans/`, `.claude/reviews/`, y legacy `.claude/PRPs/{prds,plans,reports,reviews}/` para contexto relacionado con este PR 3. **Intención del PR** — Parsear la descripción del PR para objetivos, issues vinculados, planes de prueba 4. **Archivos modificados** — Listar todos los archivos modificados y categorizar por tipo (fuente, prueba, config, docs) ### Fase 3 — REVISAR Leer cada archivo modificado **completo** (no solo los hunks del diff — se necesita el contexto circundante). Para revisiones de PR, obtener el contenido completo del archivo en la revisión head del PR: ```bash gh pr diff --name-only | while IFS= read -r file; do gh api "repos/{owner}/{repo}/contents/$file?ref=" --jq '.content' | base64 -d done ``` Aplicar la lista de verificación de revisión en 7 categorías: | Categoría | Qué Verificar | |---|---| | **Corrección** | Errores lógicos, off-by-ones, manejo de null, casos límite, condiciones de carrera | | **Seguridad de Tipos** | Incompatibilidades de tipos, castings inseguros, uso de `any`, generics faltantes | | **Cumplimiento de Patrones** | Coincide con convenciones del proyecto (nomenclatura, estructura de archivos, manejo de errores, imports) | | **Seguridad** | Inyección, brechas de auth, exposición de secretos, SSRF, path traversal, XSS | | **Rendimiento** | Consultas N+1, índices faltantes, bucles sin límite, fugas de memoria, payloads grandes | | **Completitud** | Pruebas faltantes, manejo de errores faltante, migraciones incompletas, docs faltante | | **Mantenibilidad** | Código muerto, números mágicos, anidamiento profundo, nomenclatura poco clara, tipos faltantes | Asignar severidad a cada hallazgo: | Severidad | Significado | Acción | |---|---|---| | **CRÍTICO** | Vulnerabilidad de seguridad o riesgo de pérdida de datos | Debe corregirse antes de merge | | **ALTO** | Bug o error lógico que probablemente causará problemas | Debería corregirse antes de merge | | **MEDIO** | Problema de calidad de código o buena práctica faltante | Se recomienda corregir | | **BAJO** | Detalle de estilo o sugerencia menor | Opcional | ### Fase 4 — VALIDAR Ejecutar comandos de validación disponibles: Detectar el tipo de proyecto desde los archivos de configuración (`package.json`, `Cargo.toml`, `go.mod`, `pyproject.toml`, etc.), luego ejecutar los comandos apropiados: **Node.js / TypeScript** (tiene `package.json`): ```bash npm run typecheck 2>/dev/null || npx tsc --noEmit 2>/dev/null # Verificación de tipos npm run lint # Lint npm test # Pruebas npm run build # Build ``` **Rust** (tiene `Cargo.toml`): ```bash cargo clippy -- -D warnings # Lint cargo test # Pruebas cargo build # Build ``` **Go** (tiene `go.mod`): ```bash go vet ./... # Lint go test ./... # Pruebas go build ./... # Build ``` **Python** (tiene `pyproject.toml` / `setup.py`): ```bash pytest # Pruebas ``` Ejecutar solo los comandos que apliquen al tipo de proyecto detectado. Registrar pass/fail para cada uno. ### Fase 5 — DECIDIR Formular recomendación basada en los hallazgos: | Condición | Decisión | |---|---| | Cero problemas CRÍTICOS/ALTOS, validación pasa | **APROBAR** | | Solo problemas MEDIO/BAJO, validación pasa | **APROBAR** con comentarios | | Cualquier problema ALTO o fallos de validación | **SOLICITAR CAMBIOS** | | Cualquier problema CRÍTICO | **BLOQUEAR** — debe corregirse antes del merge | Casos especiales: - PR en borrador → Siempre usar **COMENTAR** (no aprobar/bloquear) - Solo cambios de docs/config → Revisión más ligera, enfocada en corrección - Flag explícito `--approve` o `--request-changes` → Anular decisión (pero reportar todos los hallazgos) ### Fase 6 — REPORTE Crear artefacto de revisión en `.claude/reviews/pr--review.md` a menos que el repositorio ya use el legacy `.claude/PRPs/reviews/` para este flujo: ```markdown # Revisión de PR: # **Revisado**: **Autor**: **Branch**: → **Decisión**: APROBAR | SOLICITAR CAMBIOS | BLOQUEAR ## Resumen ## Hallazgos ### CRÍTICO ### ALTO ### MEDIO ### BAJO ## Resultados de Validación | Verificación | Resultado | |---|---| | Verificación de tipos | Pass / Fail / Omitido | | Lint | Pass / Fail / Omitido | | Pruebas | Pass / Fail / Omitido | | Build | Pass / Fail / Omitido | ## Archivos Revisados ``` ### Fase 7 — PUBLICAR Publicar la revisión en GitHub: ```bash # Si APROBAR gh pr review --approve --body "" # Si SOLICITAR CAMBIOS gh pr review --request-changes --body "" # Si solo COMENTAR (PR en borrador o informativo) gh pr review --comment --body "" ``` Para comentarios en línea en líneas específicas, usar la API de comentarios de revisión de GitHub: ```bash gh api "repos/{owner}/{repo}/pulls//comments" \ -f body="" \ -f path="" \ -F line= \ -f side="RIGHT" \ -f commit_id="$(gh pr view --json headRefOid --jq .headRefOid)" ``` Alternativamente, publicar una sola revisión con múltiples comentarios en línea a la vez: ```bash gh api "repos/{owner}/{repo}/pulls//reviews" \ -f event="COMMENT" \ -f body="" \ --input comments.json # [{"path": "archivo", "line": N, "body": "comentario"}, ...] ``` ### Fase 8 — SALIDA Reportar al usuario: ``` PR #: Decisión: Problemas: críticos, altos, medios, bajos Validación: / verificaciones pasaron Artefactos: Revisión: .claude/reviews/pr--review.md GitHub: Próximos pasos: - ``` --- ## Casos Límite - **Sin CLI `gh`**: Volver a revisión solo local (leer el diff, omitir publicación en GitHub). Advertir al usuario. - **Branches divergidos**: Sugerir `git fetch origin && git rebase origin/` antes de la revisión. - **PRs grandes (>50 archivos)**: Advertir sobre el alcance de la revisión. Enfocarse primero en cambios de fuente, luego pruebas, luego config/docs.