Code Health — Dashboard de Calidad
Ejecuta las herramientas de calidad del proyecto y computa un score 0-10.
Detecta automáticamente los scripts disponibles en package.json.
Lectura previa obligatoria
package.json— detectar scripts:lint,typecheck,test,buildAGENTS.md— reglas y convenciones del proyectotsconfig.json— configuración de TypeScripteslint.config.mjs— reglas custom del linter (si existe)
Cuándo usar esta skill
- "health check"
- "cómo está el código"
- "code quality"
- "quality score"
- "run all checks"
- Al final de cualquier cadena de skills
- Antes de un release
Cuándo NO usar esta skill
- Solo correr lint → ejecutar
pnpm run lintdirecto, no hace falta la skill - Debuggear un bug →
nextjs-debug-flow - Revisar un diff específico →
nextjs-code-review
Metodología
Paso 0 — Detectar el entorno
Antes de ejecutar, detectar:
- Package manager:
pnpm,npm, oyarn(mirar lock file opackage.json) - Scripts disponibles: leer
package.json→scripts - Reglas del linter: si existe
eslint.config.mjs, leerlo para entender qué se verifica
# Detectar package manager
ls pnpm-lock.yaml && echo "pnpm" || ls yarn.lock && echo "yarn" || echo "npm"
# Detectar scripts
cat package.json | grep -A 20 '"scripts"'
Paso 1 — Ejecutar checks reales
El método preferido y multiplataforma es ejecutar el script de salud sin dependencias de tuberías bash:
# Ejecución completa con resumen en terminal y colores ANSI
node scripts/check_code_health.mjs
# Para agentes y pipelines CI/CD (emite JSON estructurado de métricas)
node scripts/check_code_health.mjs --json
# Guardar métricas automáticamente en .health-history.jsonl
node scripts/check_code_health.mjs --save
Si se ejecutan las herramientas manualmente, evitar pipes dependientes de GNU bash (tee /tmp/...):
# Linter
pnpm run lint
# TypeScript
pnpm run typecheck
# Tests (si existe)
pnpm run test
# Build (opcional, para verificar que compila)
pnpm run build
Si un script no existe, reportarlo y continuar con los demás. NO fallar silenciosamente.
Check 1 — Linter (3 puntos)
- Ejecutar
pnpm run linty capturar salida - Contar errores (E) y warnings (W)
- Si hay errores: listar los 5 más frecuentes (archivo:línea)
- Reglas del eslint.config.mjs: si el lint falla, revisar qué reglas están activas. En el frontend-nextjs las reglas más comunes son:
semi: always,quotes: single,indent: 2,comma-dangle: never,camelcase(exceptoUNSAFE_),@mui/*restringido.
Scoring:
| Errores | Warnings | Puntos |
|---|---|---|
| 0 | 0 | 3 |
| 0 | >0 | 2 |
| 1-5 | - | 1 |
| 6-20 | - | 0.5 |
| >20 | - | 0 |
Fix suggestions
Si el lint falla, sugerir fixes concretos:
semi→ agregar punto y coma al final de statementsquotes→ cambiar comillas dobles a simplesindent→-indentar con 2 espacioscomma-dangle→ quitar trailing commascamelcase→ renombrar variables a camelCase@mui/*→ importar desde@desingSystem/*en vez de@mui/materialdirecto
Check 2 — TypeScript (3 puntos)
- Ejecutar
pnpm run typecheckonpx tsc --noEmit - Contar errores de tipo
- Agrupar por tipo de error (props incompatibles, imports rotos, etc.)
- Scoring:
| Errores | Puntos |
|---|---|
| 0 | 3 |
| 1-5 | 1 |
| >5 | 0 |
Fix suggestions
Type 'X' is not assignable to type 'Y'→ revisar tipado de props/returnCannot find module→ verificar alias en tsconfig.json o包不存在Property 'X' does not exist on type 'Y'→ revisar tipos o usar type assertion
Check 3 — Estructura de módulos (2 puntos)
Según el AGENTS.md y docs/architecture.md del repo, NO todos los módulos tienen el set completo de carpetas (domain/, services/, hooks/, query/, components/, pages/). Algunos usan nombres irregulares (hook singular, componentes). Respetar la convención local.
Verificar SOLO las violaciones reales:
- ¿Hay lógica de negocio en
src/app/que debería estar ensrc/modules/? - ¿Hay imports de
@mui/*(sin subpath) fuera del design system? - ¿Hay imports de
date-fns/formaten vez desrc/modules/core/utils/date.ts? - ¿Los módulos que usan React Query tienen
query/keys.tso siguen la convención local?
Scoring:
| Violaciones | Puntos |
|---|---|
| Ninguna | 2 |
Menores (1-2 date-fns/format, @mui/* puntuales) |
1 |
Graves (lógica en app/, @mui/* directo fuera del DS, query keys hardcodeadas) |
0 |
Fix suggestions
- Lógica en
src/app/→ mover asrc/modules/[nombre]/domain/oservices/ @mui/materialdirecto → importar desde@desingSystem/*date-fns/format→ usarsrc/modules/core/utils/date.ts- Query keys hardcodeadas → mover a
src/modules/[nombre]/query/keys.ts
Check 4 — Deuda técnica (1 punto)
scripts/check_code_health.mjs realiza el análisis estático de código sin pipes bash. Si se desea auditar patrones manualmente:
# Console logs y debugger
grep -rn "console\.\(log\|debug\|info\)" src/ --include="*.ts" --include="*.tsx"
grep -rn "debugger" src/ --include="*.ts" --include="*.tsx"
# TODOs sin resolver
grep -rn "TODO\|FIXME\|HACK\|XXX" src/ --include="*.ts" --include="*.tsx"
Scoring:
| Issues | Puntos |
|---|---|
| Ninguno | 1 |
| Menores (1-3 console.log, 1-2 TODOs) | 0.5 |
| Muchos o código comentado grande | 0 |
Bonus — Archivos grandes (-1 punto si aplica)
scripts/check_code_health.mjs cuenta las líneas de todos los archivos fuente automáticamente.
Para inspección manual:
- Archivos > 500 líneas: listarlos
- Archivos > 1000 líneas: flaggear como crítico
- Penalización: -1 punto si hay archivos > 1000 líneas
Score final (0-10)
Sumar los puntos de los 4 checks, restar penalizaciones. Mínimo 0, máximo 10.
| Score | Interpretación | Acción |
|---|---|---|
| 0-3 | Deuda técnica crítica | No mergeable. Fix inmediato. |
| 4-6 | Aceptable | Hay cosas para mejorar antes del próximo release. |
| 7-8 | Buen estado | Issues menores, se puede mergear. |
| 9-10 | Excelente | Código limpio y consistente. |
Protocolo Direct-to-Disk OBLIGATORIO
- Plantilla oficial: Utilizar la estructura definida en
templates/code-health.template.md. - Destino del reporte: Escribir el informe detallado en
.agents/health/health-report.md(write_to_file). - Registro histórico: Apendear la entrada de score en
.health-history.jsonl. - Prohibido volcar logs masivos en chat: No imprimir listas exhaustivas de warnings ni volcados de terminal. Si se detectan más de 10 violaciones o errores masivos (>50), truncar el listado en el chat a los 5 errores más frecuentes y remitir al informe detallado en
.agents/health/health-report.md. - Reporte Sintético en Chat:
- Ruta del informe: enlace a
.agents/health/health-report.md. - Score final: puntaje 0-10 con desglose de checks y tendencia histórica.
- Monolitos y acciones inmediatas: lista de archivos >1000 líneas y fixes prioritarios recomendados.
- Ruta del informe: enlace a
Reglas de lo que SÍ debe hacer
- Guardar el reporte completo en
.agents/health/health-report.md(write_to_file) - Apendear el resultado en
.health-history.jsonl - Reportar en el chat únicamente el resumen sintético, score y tendencia
- Ejecutar los checks REALES con
node scripts/check_code_health.mjs(no adivinar) - Detectar automáticamente los scripts del
package.json(no hardcodearpnpm) - Reportar tendencia si hay health checks anteriores
- Dar fixes concretos para cada problema encontrado
- Priorizar: errores de tipo > errores de lint > estructura > deuda
- Reportar el score con interpretación clara
- Guardar historial para comparar en futuras corridas
Reglas de lo que NO debe hacer
- NO volcar logs completos ni salidas masivas de linter en la respuesta de chat
- NO omitir la escritura del informe en
.agents/health/health-report.md - NO cambiar código para "arreglar" el score durante el health check
- NO ignorar errores de tipo aunque el lint pase
- NO reportar como "saludable" si hay >10 errores de cualquier tipo
- NO sugerir cambios de arquitectura masivos — esto es diagnóstico, no plan
- NO modificar
package.jsonpara cambiar scripts de lint/typecheck - NO ejecutar
lint --fixsin preguntar - NO instalar dependencias nuevas para los checks
- NO fallar silenciosamente si un script no existe — reportarlo
Verificación
- Confirmar persistencia del reporte en
.agents/health/health-report.mdy de la entrada en.health-history.jsonl. - Ejecutar el runner de Code Health (
node scripts/check_code_health.mjsopnpm health). - Validar que el puntaje final calculado sea >= 8/10 y que los checks bloqueantes (Linter y TypeScript) tengan 0 errores.
- Confirmar que el resumen y el historial
.health-history.jsonlreflejen fielmente el estado actual del repositorio.
Al terminar
Confirmar la persistencia del reporte en .agents/health/health-report.md. Mostrar score final con breakdown por categoría y tendencia (si hay historial).
Si el score es < 6, sugerir fixes concretos por prioridad y recomendar volver a correr
nextjs-code-review después de los arreglos.
No hay siguiente skill obligatoria — nextjs-code-health es el final de la cadena.