diff --git a/docs/refactor-audit.md b/docs/refactor-audit.md new file mode 100644 index 0000000..aa87cbf --- /dev/null +++ b/docs/refactor-audit.md @@ -0,0 +1,142 @@ +# Refactor / Cleanup / Rework Audit + +Este documento lista mejoras propuestas para `scoreko-dev`, priorizadas por impacto y esfuerzo. + +## 1) Arquitectura y organización + +### Alta prioridad +1. **Definir capas explícitas (`domain`, `application`, `infra`, `ui`)** para separar reglas de negocio (scoreboard, players, commentary) de NodeCG/Pinia/Vue y reducir acoplamiento. +2. **Extraer lógica de negocio fuera de componentes Vue** (sobre todo de `ScoreboardPanel.vue`) a composables/servicios dedicados. +3. **Unificar contratos compartidos en un módulo `src/domain`** para evitar que cada store redeclare defaults/normalizadores manuales. +4. **Introducir un patrón de “casos de uso”** (`swapPlayers`, `resetScores`, `savePlayer`, etc.) para dejar de mezclar orquestación y estado reactivo. +5. **Crear un sistema de módulos por feature** (`features/scoreboard`, `features/players`, `features/commentary`) para facilitar testeo y mantenimiento. + +### Media prioridad +6. Consolidar helpers transversales (`filterOptions`, normalizadores, parseo de storage) en utilidades versionadas. +7. Estandarizar convención de nombres (`left/right`, `player/commentator`, `override`) y documentarla. +8. Introducir “barrels” (`index.ts`) por feature para reducir imports relativos largos. +9. Separar claramente código “runtime NodeCG” (extension) de código “browser/dashboard”. + +## 2) Stores y sincronización con Replicants + +### Alta prioridad +10. **Eliminar duplicación de normalización** en `scoreboard.ts`, `players.ts` y `commentary.ts` usando un validador común (zod/valibot o validadores propios centralizados). +11. **Modelar una política única de snapshots en localStorage**: actualmente algunos stores persisten y otros no; unificar criterio por feature. +12. **Tipar mejor `ReplicantLike`** para contemplar estados de carga, errores y ausencia de datos, no solo `data | undefined`. +13. **Agregar control anti-loop más robusto en `syncStateWithReplicant`** (versionado/cambios por hash) para evitar escrituras redundantes. +14. **Introducir acciones atómicas** para operaciones compuestas (ej. swap + persistencia) y facilitar test unitario. + +### Media prioridad +15. Añadir métricas de latencia/frecuencia de `save()` para detectar exceso de persistencia. +16. Exponer `dirty state`/`isSynced` por store para feedback de UI y depuración. +17. Implementar estrategia de migración de snapshots al cambiar schema/version. +18. Crear utilidades de actualización parcial (`patchScoreboard`) en vez de reasignar objetos completos repetidamente. + +## 3) Componentes Vue y UI (dashboard) + +### Alta prioridad +19. **Partir `ScoreboardPanel.vue` en subcomponentes** (jugador izquierdo/derecho, juego/personajes, score controls, overrides). +20. **Mover filtros y autocompletado a composables** (`usePlayerSearch`, `useCountrySearch`, `useCharacterSearch`). +21. **Reducir watchers y `watchEffect` ad-hoc** sustituyéndolos por derivaciones computadas puras y acciones explícitas. +22. **Crear componentes reutilizables** para pares simétricos izquierda/derecha y eliminar lógica duplicada. +23. **Formalizar estados vacíos/errores/carga** en paneles (players, bracket, commentary) para UX consistente. + +### Media prioridad +24. Consolidar strings hardcodeados de juegos en una fuente única + i18n. +25. Definir diseño de formularios con reglas de validación declarativas (Quasar rules reutilizables). +26. Introducir navegación por teclado consistente en selects/inputs críticos para operación en vivo. +27. Añadir micro-feedback visual de acciones críticas (swap/reset/save). +28. Desacoplar assets de personajes de la lógica de presentación para soportar themes/skins. + +## 4) Extensión NodeCG e integraciones externas + +### Alta prioridad +29. **Refactorizar `src/extension/index.ts` a registro de módulos** con manejo explícito de inicialización y fallos por integración. +30. **Encapsular `startgg` y `challonge` detrás de puertos/adaptadores** para que el dominio no dependa de APIs concretas. +31. **Agregar retry/backoff/timeouts centralizados** para llamadas externas. +32. **Registrar logs estructurados** (nivel, contexto, correlación) en vez de logs dispersos. +33. **Definir feature flags/config para habilitar/deshabilitar integraciones** sin tocar código. + +### Media prioridad +34. Crear una capa de cache para respuestas repetidas de torneos. +35. Tipar estrictamente respuestas externas y validar payloads de entrada/salida. +36. Establecer límites de tasa por proveedor para evitar bloqueos. +37. Agregar pruebas de contrato para integraciones. + +## 5) Esquemas, tipos y contratos + +### Alta prioridad +38. **Alinear defaults de código con schemas JSON** y evitar drift entre `schemas/*` y stores. +39. **Automatizar comprobación en CI** de que `schema-types` está actualizado. +40. **Versionar schemas y definir estrategia de migración** para datos persistidos. +41. **Introducir invariantes de dominio explícitas** (scores >= 0, ids válidos, países válidos, etc.). + +### Media prioridad +42. Centralizar tipos derivados repetidos en `src/types` para eliminar alias locales redundantes. +43. Definir `branded types` para IDs sensibles (`PlayerId`, `GameId`). +44. Crear tests de regresión de normalizadores contra casos borde. + +## 6) Tooling, calidad y automatización + +### Alta prioridad +45. **Agregar pipeline CI completo** (lint, typecheck, build, tests, schema drift check). +46. **Separar `lint` de `typecheck`** con scripts dedicados y fail-fast claro. +47. **Incluir tests unitarios** para stores, normalizadores y utilidades compartidas. +48. **Añadir tests de integración de replicants** simulando cambios bidireccionales dashboard/extension. +49. **Incorporar pruebas E2E críticas** para flujos de operación (swap players, update scores, reset). + +### Media prioridad +50. Incorporar coverage mínimo y umbrales por carpeta. +51. Añadir pre-commit hooks (lint-staged + prettier/eslint). +52. Documentar comandos de release y versionado semántico. +53. Introducir changelog automático. + +## 7) Rendimiento y robustez + +### Alta prioridad +54. **Evitar recomputaciones costosas en cada render** cacheando opciones derivadas grandes (jugadores, países, personajes). +55. **Reducir escrituras frecuentes a localStorage/replicant** con debounce/throttle configurable. +56. **Optimizar payloads de replicants** para enviar solo campos cambiados cuando sea viable. + +### Media prioridad +57. Medir tiempos de montaje de paneles y establecer presupuesto de rendimiento. +58. Revisar tamaño de bundle y lazy-load de vistas no críticas. +59. Añadir fallback robusto para assets de personajes faltantes. + +## 8) Seguridad operativa y resiliencia + +### Alta prioridad +60. **Sanitizar y validar inputs de usuario** antes de persistir/renderizar (nombres, handles, textos libres). +61. **Definir límites de longitud por campo** y truncado seguro para evitar overflows visuales. +62. **Manejar degradación controlada** cuando APIs externas fallen durante directo. + +### Media prioridad +63. Auditar dependencia y política de actualizaciones de seguridad. +64. Añadir guía de incidentes operativos (qué hacer si falla startgg/challonge). + +## 9) Limpieza y eliminación técnica + +### Alta prioridad +65. **Eliminar código muerto y utilidades no usadas** tras dividir componentes/composables. +66. **Reducir duplicados izquierda/derecha** mediante abstracciones reutilizables. +67. **Homogeneizar manejo de errores silenciosos** (`catch {}`) con reporte opcional de diagnóstico. + +### Media prioridad +68. Revisar assets/imágenes huérfanas y limpiar peso innecesario del repo. +69. Estandarizar comentarios y retirar comentarios obvios/desactualizados. +70. Reorganizar carpetas de `graphics` para facilitar escalado a nuevas overlays. + +## 10) Plan sugerido por fases + +- **Fase 1 (rápida, alto impacto):** 10, 19, 29, 38, 45, 47, 54, 55, 60, 65. +- **Fase 2 (estabilización):** 11, 13, 20, 30, 31, 39, 46, 48, 56, 67. +- **Fase 3 (escala y DX):** 1, 4, 5, 24, 33, 40, 49, 50, 58, 70. + +## 11) Quick wins (1–2 días) + +1. Añadir scripts `typecheck` y `test` en `package.json` + pipeline CI base. +2. Extraer filtros de `ScoreboardPanel` a composables (`useFilterOptions`, `useCountryFilter`). +3. Unificar normalizadores en `src/shared/normalize`. +4. Añadir tests unitarios de `syncStateWithReplicant` y normalizadores. +5. Convertir strings de juegos a una constante única internacionalizable. +6. Agregar debounce a persistencia de storage/replicant.