From 71c18b479be55045bc80a56086428d4fbbf19f60 Mon Sep 17 00:00:00 2001 From: Pandipipas Date: Thu, 4 Jun 2026 17:07:01 +0200 Subject: [PATCH] feat: add architectural documentation for refactor process, including audit, rules, migration plan, session handoff, and target architecture --- docs/refactor/ARCHITECTURE_AUDIT.md | 60 ++++++++++++++++++++++++++++ docs/refactor/ARCHITECTURE_RULES.md | 37 +++++++++++++++++ docs/refactor/MIGRATION_PLAN.md | 47 ++++++++++++++++++++++ docs/refactor/SESSION_HANDOFF.md | 24 +++++++++++ docs/refactor/TARGET_ARCHITECTURE.md | 53 ++++++++++++++++++++++++ 5 files changed, 221 insertions(+) create mode 100644 docs/refactor/ARCHITECTURE_AUDIT.md create mode 100644 docs/refactor/ARCHITECTURE_RULES.md create mode 100644 docs/refactor/MIGRATION_PLAN.md create mode 100644 docs/refactor/SESSION_HANDOFF.md create mode 100644 docs/refactor/TARGET_ARCHITECTURE.md diff --git a/docs/refactor/ARCHITECTURE_AUDIT.md b/docs/refactor/ARCHITECTURE_AUDIT.md new file mode 100644 index 0000000..49dab9f --- /dev/null +++ b/docs/refactor/ARCHITECTURE_AUDIT.md @@ -0,0 +1,60 @@ +# Scoreko-dev: Auditoría de Arquitectura + +Este documento consolida el análisis de la arquitectura actual y el diagnóstico de los problemas encontrados, sirviendo como punto de partida para el refactor. + +## Análisis de la Estructura Actual + +El proyecto está estructurado utilizando `pnpm workspaces` (`nodecg`, `shared` y el directorio raíz). El código fuente principal reside en `src/`, y se compila a `extension/`, `dashboard/` y `graphics/`. + +### Distribución de Carpetas + +| Carpeta | Descripción | +| :--- | :--- | +| `src/dashboard/scoreko-dev/` | Contiene la UI del dashboard construida con Vue 3, Quasar y Pinia. | +| `src/graphics/` | Contiene los overlays (scoreboard, commentary, scoreboard-2xko) en Vue 3. | +| `src/extension/` | Backend NodeCG. Contiene la integración con start.gg, Challonge y la gestión de packs. | +| `src/shared/` | Lógica o utilidades compartidas (por ejemplo, lista de países). | +| `src/browser_shared/` | Replicantes expuestos a las apps Vue. | + +### Flujo de Datos y Estado (Stores y Replicants) + +- **Dashboard (Pinia + Replicants)**: Se usan stores de Pinia (`scoreboard.ts`, `players.ts`, `commentary.ts`) para manejar el estado en el dashboard. Existe un mecanismo de sincronización `store-sync.ts` que ata los ref de Vue (stores) a los Replicants de NodeCG, con un fallback en `localStorage`. +- **Graphics**: Los componentes gráficos (ej. `src/graphics/scoreboard/main.vue`) importan directamente los replicants de `browser_shared/replicants.ts` y usan `watch` para reaccionar a cambios. No parecen usar Pinia, sino estado reactivo local (`ref`, `computed`). + +### Componentes Monolíticos + +Existen componentes excesivamente grandes que mezclan responsabilidades: + +- **`src/dashboard/scoreko-dev/views/Players.vue`** (>680 líneas): Mezcla presentación, diálogos de UI, validaciones de formulario, llamadas a composables de integración (`useIntegration`), transformación de datos, renderizado manual de iconos SVG hardcodeados y lógica de exportación/importación JSON. +- **`src/graphics/scoreboard/main.vue`** (>690 líneas): Mezcla la UI del marcador, cálculos de dimensiones de fuentes (`fitText`), timeouts manuales para animaciones, carga asíncrona de SVG de banderas usando importación dinámica de Vite, bindings a NodeCG y redirecciones de URL basadas en configuraciones gráficas. + +### Acoplamientos y Efectos Secundarios + +- En el dashboard, la lógica de integración de torneos (start.gg/Challonge) está fuertemente acoplada a la vista de jugadores mediante composables y callbacks, con SVGs directamente embebidos en el template. +- En el backend (`src/extension/startgg.ts`), hay mezcla de servidor OAuth HTTP puro, lógica de peticiones GraphQL con strings literales gigantes, parsing de errores y endpoints de NodeCG (`nodecg.listenFor`), todo en el mismo archivo (>440 líneas). + +--- + +## Diagnóstico + +### Problemas Críticos + +1. **Lógica de negocio acoplada a la UI**: Componentes como `Players.vue` y `main.vue` del scoreboard saben demasiado. Tienen lógica de red, cálculos de DOM, manejo de timeouts y manipulación de datos en crudo en lugar de delegar a stores o servicios. +2. **"Vibe Coding" y AI Slop**: Hay parches evidentes como la inclusión manual de SVGs inmensos inline en los templates, y utilidades infladas (cálculos rudimentarios de `fitText` en los overlays en lugar de usar CSS moderno o directivas reutilizables). +3. **Estado implícito y dependencias circulares potenciales**: El sistema de `store-sync.ts` que sincroniza Pinia <-> LocalStorage <-> NodeCG Replicants es frágil, creando condiciones de carrera sobre cuál es la "fuente de la verdad". +4. **Falta de abstracción en el Backend NodeCG**: Los archivos de `extension/` son scripts procesales en lugar de arquitecturas separadas. + +### Impacto a Medio y Largo Plazo + +- **Mantenibilidad Reducida**: Agregar nuevas integraciones (ej. smash.gg, Toornament) requerirá copiar/pegar más bloques monolíticos y añadir más SVGs hardcodeados. +- **Riesgo de Regresiones**: Modificar animaciones del scoreboard puede romper el cálculo del tamaño de fuente o la lógica de banderas, debido al acoplamiento. +- **Developer Experience (DX) Pobre**: La curva de aprendizaje es alta. Entender cómo fluye un cambio de score desde el dashboard hasta el overlay se vuelve muy complejo. + +### Estrategia de Resolución + +- **Reorganización**: Mantener la estructura base (`src/dashboard`, `src/graphics`, `src/extension`), pero crear subcarpetas por dominio/feature en el backend y separación estricta en el frontend. +- **Refactor**: Simplificar stores (eliminar puentes complejos a NodeCG), extracción de composables puros en el dashboard, separación de UI *Dumb* vs UI *Smart*. +- **Reescritura controlada**: + - `Players.vue`: Dividir drásticamente. + - `main.vue` (scoreboard): Extraer lógica de flags, animaciones y `fitText`. + - `startgg.ts` / `challonge.ts`: Adoptar un patrón Service/Repository. diff --git a/docs/refactor/ARCHITECTURE_RULES.md b/docs/refactor/ARCHITECTURE_RULES.md new file mode 100644 index 0000000..58264b0 --- /dev/null +++ b/docs/refactor/ARCHITECTURE_RULES.md @@ -0,0 +1,37 @@ +# Reglas Arquitectónicas de Implementación + +> [!IMPORTANT] +> Estas reglas son estrictas y obligatorias. Se deben aplicar sin excepción durante toda la fase de refactorización y en el futuro desarrollo. + +1. **NO `any`, NO IGNORES** + - Prohibido el uso de `any`, `@ts-ignore` o casteos forzados ciegos (`as unknown as Tipo`). Todo debe tener tipado fuerte en TypeScript. + +2. **CERO LÓGICA DE NEGOCIO EN COMPONENTES** + - Los componentes de Vue (`.vue`) no deben tener llamadas `fetch`, lógica compleja de parseo, o cálculos pesados. + - Su sección `