cmp-standards 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +633 -611
  2. package/dist/db/drizzle-client.d.ts +3 -3
  3. package/dist/db/drizzle-client.d.ts.map +1 -1
  4. package/dist/db/drizzle-client.js +57 -58
  5. package/dist/db/drizzle-client.js.map +1 -1
  6. package/dist/db/turso-client.js +11 -11
  7. package/dist/eslint/rules/no-async-useeffect.js +6 -6
  8. package/dist/hooks/cloud-pre-tool-use.js +20 -20
  9. package/dist/hooks/cloud-session-start.d.ts +15 -3
  10. package/dist/hooks/cloud-session-start.d.ts.map +1 -1
  11. package/dist/hooks/cloud-session-start.js +135 -8
  12. package/dist/hooks/cloud-session-start.js.map +1 -1
  13. package/dist/hooks/session-start.d.ts +2 -1
  14. package/dist/hooks/session-start.d.ts.map +1 -1
  15. package/dist/hooks/session-start.js +99 -74
  16. package/dist/hooks/session-start.js.map +1 -1
  17. package/dist/index.d.ts +4 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +4 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/mcp/server.js +2 -2
  22. package/dist/mcp/server.js.map +1 -1
  23. package/dist/schema/plans.d.ts +194 -0
  24. package/dist/schema/plans.d.ts.map +1 -0
  25. package/dist/schema/plans.js +180 -0
  26. package/dist/schema/plans.js.map +1 -0
  27. package/dist/services/ContextGenerator.d.ts +16 -0
  28. package/dist/services/ContextGenerator.d.ts.map +1 -0
  29. package/dist/services/ContextGenerator.js +62 -0
  30. package/dist/services/ContextGenerator.js.map +1 -0
  31. package/dist/services/PlanManager.d.ts +99 -0
  32. package/dist/services/PlanManager.d.ts.map +1 -0
  33. package/dist/services/PlanManager.js +372 -0
  34. package/dist/services/PlanManager.js.map +1 -0
  35. package/dist/services/ProjectScaffold.js +76 -76
  36. package/dist/services/context-injector.d.ts +105 -0
  37. package/dist/services/context-injector.d.ts.map +1 -0
  38. package/dist/services/context-injector.js +357 -0
  39. package/dist/services/context-injector.js.map +1 -0
  40. package/dist/services/index.d.ts +15 -15
  41. package/dist/services/index.d.ts.map +1 -1
  42. package/dist/services/index.js +18 -20
  43. package/dist/services/index.js.map +1 -1
  44. package/dist/services/memory-router.d.ts +98 -0
  45. package/dist/services/memory-router.d.ts.map +1 -0
  46. package/dist/services/memory-router.js +373 -0
  47. package/dist/services/memory-router.js.map +1 -0
  48. package/dist/services/pattern-tracker.d.ts +93 -0
  49. package/dist/services/pattern-tracker.d.ts.map +1 -0
  50. package/dist/services/pattern-tracker.js +347 -0
  51. package/dist/services/pattern-tracker.js.map +1 -0
  52. package/dist/services/semantic-search.d.ts +33 -35
  53. package/dist/services/semantic-search.d.ts.map +1 -1
  54. package/dist/services/semantic-search.js +207 -165
  55. package/dist/services/semantic-search.js.map +1 -1
  56. package/package.json +100 -100
  57. package/standards/README.md +50 -50
  58. package/standards/experts/expert-routing.md +215 -215
  59. package/standards/general/code-quality.md +86 -86
  60. package/standards/general/memory-usage.md +205 -205
  61. package/standards/general/sync-workflow.md +235 -235
  62. package/standards/general/workflow.md +82 -82
  63. package/standards/hooks/mandatory-tracking.md +446 -446
  64. package/standards/infrastructure/cloud-database.md +287 -287
  65. package/standards/mcp/server-design.md +243 -243
  66. package/standards/mcp/tool-patterns.md +354 -354
  67. package/standards/skills/skill-structure.md +286 -286
  68. package/standards/skills/workflow-design.md +323 -323
  69. package/standards/tools/tool-design.md +297 -297
  70. package/templates/agents/architecture-expert.md +61 -61
  71. package/templates/agents/database-expert.md +62 -62
  72. package/templates/agents/documentation-expert.md +57 -57
  73. package/templates/agents/memory-expert.md +88 -88
  74. package/templates/agents/performance-expert.md +61 -61
  75. package/templates/agents/security-expert.md +59 -59
  76. package/templates/agents/ux-expert.md +63 -63
  77. package/templates/agents/worker.md +75 -75
  78. package/templates/ai-skills/SKILL_TEMPLATE.md +55 -55
  79. package/templates/claude-settings.json +72 -72
  80. package/templates/commands/experts.md +138 -138
  81. package/templates/hooks/README.md +158 -158
  82. package/templates/hooks/project.config.json.template +77 -77
  83. package/templates/hooks/settings.local.json.template +57 -57
  84. package/templates/memory-config.json +56 -56
  85. package/templates/memory-config.schema.json +212 -212
  86. package/templates/settings.json +58 -58
  87. package/templates/skills/continue.md +205 -205
  88. package/templates/workflows/business-improvement.md +264 -264
  89. package/templates/workflows/expert-review.md +153 -153
  90. package/templates/workflows/internal-app.md +245 -245
  91. package/templates/workflows/sync-docs.md +187 -187
@@ -1,215 +1,215 @@
1
- # Expert Routing - Cuándo Consultar Expertos
2
-
3
- ## Principio
4
-
5
- Los expertos (`/experts`) validan código crítico. No todo código necesita revisión de expertos.
6
-
7
- ## Cuándo Consultar
8
-
9
- ### SIEMPRE Consultar
10
-
11
- | Área | Expertos | Por qué |
12
- |------|----------|---------|
13
- | **Finanzas** | Security, Architecture | Dinero real, dual-write requerido |
14
- | **Autenticación** | Security, Architecture | Seguridad crítica |
15
- | **Schema DB** | Database, Architecture | Cambios irreversibles |
16
- | **Pagos externos** | Security, Performance | Integraciones sensibles |
17
-
18
- ```bash
19
- # Ejemplos de rutas críticas
20
- src/server/api/routers/finances/**
21
- src/server/api/routers/auth/**
22
- src/server/schema/**
23
- drizzle/migrations/**
24
- ```
25
-
26
- ### CONSIDERAR Consultar
27
-
28
- | Área | Expertos | Cuándo |
29
- |------|----------|--------|
30
- | **APIs** | Performance, Architecture | Si es nueva o cambia contrato |
31
- | **Componentes UI** | UX, Performance | Si es core o afecta muchos usuarios |
32
- | **Refactoring** | Architecture | Si toca múltiples dominios |
33
-
34
- ### NO Consultar
35
-
36
- - Typos y fixes menores
37
- - Documentación
38
- - Tests
39
- - Código experimental/WIP
40
- - Generado automáticamente
41
-
42
- ## Proceso de Consulta
43
-
44
- ```
45
- 1. Identificar cambios críticos
46
-
47
- 2. Ejecutar /experts [archivos]
48
-
49
- 3. Esperar consenso
50
-
51
- 4. Si APPROVED → continuar
52
- Si REJECTED → aplicar feedback → volver a 2
53
- ```
54
-
55
- ## Decisiones por Experto
56
-
57
- ### Security Expert
58
-
59
- **Consultar cuando:**
60
- - Input de usuario no validado
61
- - Queries a base de datos
62
- - Operaciones financieras
63
- - Cambios de permisos
64
-
65
- **Busca:**
66
- - SQL injection
67
- - XSS vulnerabilities
68
- - Missing Zod validation
69
- - Finance dual-write violations
70
-
71
- ### Performance Expert
72
-
73
- **Consultar cuando:**
74
- - Loops con await
75
- - Queries en componentes
76
- - Imports de librerías pesadas
77
- - Cambios en data fetching
78
-
79
- **Busca:**
80
- - N+1 queries
81
- - API waterfalls
82
- - Missing lazy loading
83
- - Unnecessary re-renders
84
-
85
- ### Architecture Expert
86
-
87
- **Consultar cuando:**
88
- - Nuevos módulos/dominios
89
- - Cambios de estructura
90
- - Tipos compartidos
91
- - Imports cross-domain
92
-
93
- **Busca:**
94
- - Type inference chain breaks
95
- - Circular dependencies
96
- - SOLID violations
97
- - ADR misalignment
98
-
99
- ### Database Expert
100
-
101
- **Consultar cuando:**
102
- - Cambios de schema
103
- - Nuevas migraciones
104
- - Queries complejas
105
- - Relaciones entre tablas
106
-
107
- **Busca:**
108
- - Missing constraints
109
- - Type sync issues
110
- - Unsafe migrations
111
- - N+1 patterns
112
-
113
- ### UX Expert
114
-
115
- **Consultar cuando:**
116
- - Componentes de formulario
117
- - Navegación
118
- - Modales/overlays
119
- - Responsive design
120
-
121
- **Busca:**
122
- - Missing ARIA
123
- - Touch target size
124
- - Hardcoded colors
125
- - i18n issues
126
-
127
- ## Reglas de Consenso
128
-
129
- ### Código Crítico (Unanimidad)
130
-
131
- Todos los expertos deben aprobar:
132
-
133
- ```
134
- ✅ Security: APPROVE
135
- ✅ Architecture: APPROVE
136
- ✅ Database: APPROVE
137
- ⊝ Memory: ABSTAIN
138
-
139
- Result: APPROVED (3/3 voting approved)
140
- ```
141
-
142
- ### Código Normal (Mayoría)
143
-
144
- ≥3 de 5 expertos aprueban:
145
-
146
- ```
147
- ✅ Security: APPROVE
148
- ✅ Architecture: APPROVE
149
- ❌ Performance: REJECT
150
- ✅ UX: APPROVE
151
- ⊝ Memory: ABSTAIN
152
-
153
- Result: APPROVED (3/4 voting approved, 1 rejected)
154
- ```
155
-
156
- ## Integración en Workflow
157
-
158
- ```markdown
159
- ## Después de implementar
160
-
161
- 1. Verificar si cambios son críticos:
162
- - ¿Toca finanzas/auth/schema?
163
- - ¿Nuevo dominio o refactoring grande?
164
-
165
- 2. Si es crítico:
166
- /experts [archivos modificados]
167
-
168
- 3. Esperar resultado:
169
- - APPROVED → commit
170
- - REJECTED → aplicar fixes → volver a consultar
171
- ```
172
-
173
- ## Memory Expert (Especial)
174
-
175
- El Memory Expert **nunca rechaza** - su rol es aprender:
176
-
177
- - Detecta patrones repetidos (3+ = auto-improve)
178
- - Genera reglas ESLint automáticamente
179
- - Crea memorias de gotchas
180
- - Propone ADRs para decisiones
181
-
182
- Siempre vota ABSTAIN pero captura aprendizajes.
183
-
184
- ## Comandos Rápidos
185
-
186
- ```bash
187
- # Review archivos específicos
188
- /experts src/server/api/routers/finances/expenses.ts
189
-
190
- # Review directorio
191
- /experts src/server/api/routers/finances/
192
-
193
- # Solo expertos específicos
194
- /experts src/file.ts --only security,architecture
195
-
196
- # Modo verbose
197
- /experts src/file.ts --verbose
198
- ```
199
-
200
- ## Ejemplo de Flujo
201
-
202
- ```
203
- Tarea: Agregar endpoint de pago
204
-
205
- 1. Implementar endpoint
206
- 2. Detectar: es código financiero → CRÍTICO
207
- 3. Ejecutar: /experts src/server/api/routers/payments/...
208
- 4. Resultado:
209
- ❌ REJECTED - Security Expert
210
- "Missing LedgerService.createEntry() for dual-write"
211
- 5. Aplicar fix
212
- 6. Re-ejecutar: /experts ...
213
- 7. ✅ APPROVED
214
- 8. Commit
215
- ```
1
+ # Expert Routing - Cuándo Consultar Expertos
2
+
3
+ ## Principio
4
+
5
+ Los expertos (`/experts`) validan código crítico. No todo código necesita revisión de expertos.
6
+
7
+ ## Cuándo Consultar
8
+
9
+ ### SIEMPRE Consultar
10
+
11
+ | Área | Expertos | Por qué |
12
+ |------|----------|---------|
13
+ | **Finanzas** | Security, Architecture | Dinero real, dual-write requerido |
14
+ | **Autenticación** | Security, Architecture | Seguridad crítica |
15
+ | **Schema DB** | Database, Architecture | Cambios irreversibles |
16
+ | **Pagos externos** | Security, Performance | Integraciones sensibles |
17
+
18
+ ```bash
19
+ # Ejemplos de rutas críticas
20
+ src/server/api/routers/finances/**
21
+ src/server/api/routers/auth/**
22
+ src/server/schema/**
23
+ drizzle/migrations/**
24
+ ```
25
+
26
+ ### CONSIDERAR Consultar
27
+
28
+ | Área | Expertos | Cuándo |
29
+ |------|----------|--------|
30
+ | **APIs** | Performance, Architecture | Si es nueva o cambia contrato |
31
+ | **Componentes UI** | UX, Performance | Si es core o afecta muchos usuarios |
32
+ | **Refactoring** | Architecture | Si toca múltiples dominios |
33
+
34
+ ### NO Consultar
35
+
36
+ - Typos y fixes menores
37
+ - Documentación
38
+ - Tests
39
+ - Código experimental/WIP
40
+ - Generado automáticamente
41
+
42
+ ## Proceso de Consulta
43
+
44
+ ```
45
+ 1. Identificar cambios críticos
46
+
47
+ 2. Ejecutar /experts [archivos]
48
+
49
+ 3. Esperar consenso
50
+
51
+ 4. Si APPROVED → continuar
52
+ Si REJECTED → aplicar feedback → volver a 2
53
+ ```
54
+
55
+ ## Decisiones por Experto
56
+
57
+ ### Security Expert
58
+
59
+ **Consultar cuando:**
60
+ - Input de usuario no validado
61
+ - Queries a base de datos
62
+ - Operaciones financieras
63
+ - Cambios de permisos
64
+
65
+ **Busca:**
66
+ - SQL injection
67
+ - XSS vulnerabilities
68
+ - Missing Zod validation
69
+ - Finance dual-write violations
70
+
71
+ ### Performance Expert
72
+
73
+ **Consultar cuando:**
74
+ - Loops con await
75
+ - Queries en componentes
76
+ - Imports de librerías pesadas
77
+ - Cambios en data fetching
78
+
79
+ **Busca:**
80
+ - N+1 queries
81
+ - API waterfalls
82
+ - Missing lazy loading
83
+ - Unnecessary re-renders
84
+
85
+ ### Architecture Expert
86
+
87
+ **Consultar cuando:**
88
+ - Nuevos módulos/dominios
89
+ - Cambios de estructura
90
+ - Tipos compartidos
91
+ - Imports cross-domain
92
+
93
+ **Busca:**
94
+ - Type inference chain breaks
95
+ - Circular dependencies
96
+ - SOLID violations
97
+ - ADR misalignment
98
+
99
+ ### Database Expert
100
+
101
+ **Consultar cuando:**
102
+ - Cambios de schema
103
+ - Nuevas migraciones
104
+ - Queries complejas
105
+ - Relaciones entre tablas
106
+
107
+ **Busca:**
108
+ - Missing constraints
109
+ - Type sync issues
110
+ - Unsafe migrations
111
+ - N+1 patterns
112
+
113
+ ### UX Expert
114
+
115
+ **Consultar cuando:**
116
+ - Componentes de formulario
117
+ - Navegación
118
+ - Modales/overlays
119
+ - Responsive design
120
+
121
+ **Busca:**
122
+ - Missing ARIA
123
+ - Touch target size
124
+ - Hardcoded colors
125
+ - i18n issues
126
+
127
+ ## Reglas de Consenso
128
+
129
+ ### Código Crítico (Unanimidad)
130
+
131
+ Todos los expertos deben aprobar:
132
+
133
+ ```
134
+ ✅ Security: APPROVE
135
+ ✅ Architecture: APPROVE
136
+ ✅ Database: APPROVE
137
+ ⊝ Memory: ABSTAIN
138
+
139
+ Result: APPROVED (3/3 voting approved)
140
+ ```
141
+
142
+ ### Código Normal (Mayoría)
143
+
144
+ ≥3 de 5 expertos aprueban:
145
+
146
+ ```
147
+ ✅ Security: APPROVE
148
+ ✅ Architecture: APPROVE
149
+ ❌ Performance: REJECT
150
+ ✅ UX: APPROVE
151
+ ⊝ Memory: ABSTAIN
152
+
153
+ Result: APPROVED (3/4 voting approved, 1 rejected)
154
+ ```
155
+
156
+ ## Integración en Workflow
157
+
158
+ ```markdown
159
+ ## Después de implementar
160
+
161
+ 1. Verificar si cambios son críticos:
162
+ - ¿Toca finanzas/auth/schema?
163
+ - ¿Nuevo dominio o refactoring grande?
164
+
165
+ 2. Si es crítico:
166
+ /experts [archivos modificados]
167
+
168
+ 3. Esperar resultado:
169
+ - APPROVED → commit
170
+ - REJECTED → aplicar fixes → volver a consultar
171
+ ```
172
+
173
+ ## Memory Expert (Especial)
174
+
175
+ El Memory Expert **nunca rechaza** - su rol es aprender:
176
+
177
+ - Detecta patrones repetidos (3+ = auto-improve)
178
+ - Genera reglas ESLint automáticamente
179
+ - Crea memorias de gotchas
180
+ - Propone ADRs para decisiones
181
+
182
+ Siempre vota ABSTAIN pero captura aprendizajes.
183
+
184
+ ## Comandos Rápidos
185
+
186
+ ```bash
187
+ # Review archivos específicos
188
+ /experts src/server/api/routers/finances/expenses.ts
189
+
190
+ # Review directorio
191
+ /experts src/server/api/routers/finances/
192
+
193
+ # Solo expertos específicos
194
+ /experts src/file.ts --only security,architecture
195
+
196
+ # Modo verbose
197
+ /experts src/file.ts --verbose
198
+ ```
199
+
200
+ ## Ejemplo de Flujo
201
+
202
+ ```
203
+ Tarea: Agregar endpoint de pago
204
+
205
+ 1. Implementar endpoint
206
+ 2. Detectar: es código financiero → CRÍTICO
207
+ 3. Ejecutar: /experts src/server/api/routers/payments/...
208
+ 4. Resultado:
209
+ ❌ REJECTED - Security Expert
210
+ "Missing LedgerService.createEntry() for dual-write"
211
+ 5. Aplicar fix
212
+ 6. Re-ejecutar: /experts ...
213
+ 7. ✅ APPROVED
214
+ 8. Commit
215
+ ```
@@ -1,86 +1,86 @@
1
- # Estándares de Calidad de Código
2
-
3
- ## TypeScript
4
-
5
- ### Tipos
6
- - **NO usar `any`** - Usar tipos específicos o `unknown` con validación
7
- - **NO usar `as` casting** innecesario - Preferir type guards
8
- - **Inferir tipos** cuando sea posible - No duplicar tipos manualmente
9
-
10
- ```typescript
11
- // MAL
12
- const data: any = await fetch(...)
13
- const user = response as User
14
-
15
- // BIEN
16
- const data: unknown = await fetch(...)
17
- if (isUser(data)) {
18
- // data es User aquí
19
- }
20
- ```
21
-
22
- ### Imports
23
- - Usar **barrel exports** (`index.ts`)
24
- - Imports **absolutos** con aliases (`@/components/...`)
25
- - NO importar tipos con `import type` a menos que sea necesario para evitar ciclos
26
-
27
- ### Async/Await
28
- - **NO await en loops** - Usar `Promise.all` o `Promise.allSettled`
29
- - Manejar errores con try/catch o `.catch()`
30
-
31
- ```typescript
32
- // MAL
33
- for (const item of items) {
34
- await processItem(item) // N+1 pattern
35
- }
36
-
37
- // BIEN
38
- await Promise.all(items.map(item => processItem(item)))
39
- ```
40
-
41
- ## React
42
-
43
- ### Componentes
44
- - **Server Components por defecto** - Solo usar Client cuando necesites interactividad
45
- - **NO inline functions en JSX** para event handlers
46
- - Usar **hooks personalizados** para lógica reutilizable
47
-
48
- ```tsx
49
- // MAL
50
- <Button onClick={() => setOpen(true)} />
51
-
52
- // BIEN
53
- const handleOpen = useCallback(() => setOpen(true), [])
54
- <Button onClick={handleOpen} />
55
- ```
56
-
57
- ### Estado
58
- - **Mínimo estado local** - Preferir server state (React Query/tRPC)
59
- - **NO prop drilling** - Usar Context o composición
60
-
61
- ## Base de Datos (Drizzle)
62
-
63
- ### Queries
64
- - Siempre **filtrar por sistema** en tablas compartidas
65
- - Usar **transacciones** para operaciones múltiples
66
- - Evitar **N+1 queries** - Usar joins o Promise.all
67
-
68
- ```typescript
69
- // MAL
70
- const items = await db.select().from(devItems)
71
-
72
- // BIEN
73
- const items = await db.select().from(devItems)
74
- .where(eq(devItems.system, 'MYPROJECT'))
75
- ```
76
-
77
- ### Migraciones
78
- - **Nunca** modificar migraciones ya ejecutadas
79
- - Siempre revisar el SQL generado antes de push
80
- - Usar `tablesFilter` para no afectar tablas de otros proyectos
81
-
82
- ## Tests
83
-
84
- - Tests para **lógica crítica** (pagos, auth, cálculos)
85
- - **NO tests para código trivial**
86
- - Preferir **integration tests** sobre unit tests para APIs
1
+ # Estándares de Calidad de Código
2
+
3
+ ## TypeScript
4
+
5
+ ### Tipos
6
+ - **NO usar `any`** - Usar tipos específicos o `unknown` con validación
7
+ - **NO usar `as` casting** innecesario - Preferir type guards
8
+ - **Inferir tipos** cuando sea posible - No duplicar tipos manualmente
9
+
10
+ ```typescript
11
+ // MAL
12
+ const data: any = await fetch(...)
13
+ const user = response as User
14
+
15
+ // BIEN
16
+ const data: unknown = await fetch(...)
17
+ if (isUser(data)) {
18
+ // data es User aquí
19
+ }
20
+ ```
21
+
22
+ ### Imports
23
+ - Usar **barrel exports** (`index.ts`)
24
+ - Imports **absolutos** con aliases (`@/components/...`)
25
+ - NO importar tipos con `import type` a menos que sea necesario para evitar ciclos
26
+
27
+ ### Async/Await
28
+ - **NO await en loops** - Usar `Promise.all` o `Promise.allSettled`
29
+ - Manejar errores con try/catch o `.catch()`
30
+
31
+ ```typescript
32
+ // MAL
33
+ for (const item of items) {
34
+ await processItem(item) // N+1 pattern
35
+ }
36
+
37
+ // BIEN
38
+ await Promise.all(items.map(item => processItem(item)))
39
+ ```
40
+
41
+ ## React
42
+
43
+ ### Componentes
44
+ - **Server Components por defecto** - Solo usar Client cuando necesites interactividad
45
+ - **NO inline functions en JSX** para event handlers
46
+ - Usar **hooks personalizados** para lógica reutilizable
47
+
48
+ ```tsx
49
+ // MAL
50
+ <Button onClick={() => setOpen(true)} />
51
+
52
+ // BIEN
53
+ const handleOpen = useCallback(() => setOpen(true), [])
54
+ <Button onClick={handleOpen} />
55
+ ```
56
+
57
+ ### Estado
58
+ - **Mínimo estado local** - Preferir server state (React Query/tRPC)
59
+ - **NO prop drilling** - Usar Context o composición
60
+
61
+ ## Base de Datos (Drizzle)
62
+
63
+ ### Queries
64
+ - Siempre **filtrar por sistema** en tablas compartidas
65
+ - Usar **transacciones** para operaciones múltiples
66
+ - Evitar **N+1 queries** - Usar joins o Promise.all
67
+
68
+ ```typescript
69
+ // MAL
70
+ const items = await db.select().from(devItems)
71
+
72
+ // BIEN
73
+ const items = await db.select().from(devItems)
74
+ .where(eq(devItems.system, 'MYPROJECT'))
75
+ ```
76
+
77
+ ### Migraciones
78
+ - **Nunca** modificar migraciones ya ejecutadas
79
+ - Siempre revisar el SQL generado antes de push
80
+ - Usar `tablesFilter` para no afectar tablas de otros proyectos
81
+
82
+ ## Tests
83
+
84
+ - Tests para **lógica crítica** (pagos, auth, cálculos)
85
+ - **NO tests para código trivial**
86
+ - Preferir **integration tests** sobre unit tests para APIs