slicejs-cli 2.7.4 → 2.7.6

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.
package/refactor.md ADDED
@@ -0,0 +1,271 @@
1
+ # Plan de Refactorización del CLI para MCP
2
+
3
+ ## Objetivo
4
+ Separar la lógica de negocio de la presentación CLI para permitir importación directa desde el MCP server, manteniendo **100% de compatibilidad** con el CLI actual.
5
+
6
+ ---
7
+
8
+ ## Estructura Propuesta
9
+
10
+ ```
11
+ commands/
12
+ ├── createComponent/
13
+ │ ├── createComponent.js # CLI wrapper (presentación)
14
+ │ ├── core.js # ⭐ NUEVO - Lógica pura exportable
15
+ │ └── VisualComponentTemplate.js
16
+
17
+ ├── listComponents/
18
+ │ ├── listComponents.js # CLI wrapper (presentación)
19
+ │ └── core.js # ⭐ NUEVO - Lógica pura exportable
20
+
21
+ ├── deleteComponent/
22
+ │ ├── deleteComponent.js # CLI wrapper (presentación)
23
+ │ └── core.js # ⭐ NUEVO - Lógica pura exportable
24
+
25
+ ├── getComponent/
26
+ │ ├── getComponent.js # CLI wrapper (presentación)
27
+ │ └── core.js # ⭐ NUEVO - Lógica pura exportable
28
+
29
+ └── init/
30
+ ├── init.js # CLI wrapper (presentación)
31
+ └── core.js # ⭐ NUEVO - Lógica pura exportable
32
+ ```
33
+
34
+ ---
35
+
36
+ ## Principios de Refactorización
37
+
38
+ ### 1. Separación de Responsabilidades
39
+ - **core.js**: Lógica pura sin dependencias de CLI (Print, chalk, Table, inquirer)
40
+ - **[comando].js**: Solo presentación CLI, usa funciones del core
41
+
42
+ ### 2. Funciones Puras en Core
43
+ - Reciben parámetros explícitos (no usan import.meta.url implícitamente)
44
+ - Retornan objetos con estructura `{ success: boolean, data?, error? }`
45
+ - No imprimen a consola directamente
46
+ - Son agnósticas del entorno (CLI vs MCP)
47
+
48
+ ### 3. Compatibilidad Total
49
+ - Los archivos CLI actuales se mantienen funcionales
50
+ - Misma API de comandos
51
+ - Mismo comportamiento observable
52
+ - No romper ningún test existente
53
+
54
+ ---
55
+
56
+ ## Pasos de Refactorización por Comando
57
+
58
+ ### Fase 1: List Components
59
+
60
+ #### Paso 1.1: Análisis del Código Actual
61
+ - Identificar toda la lógica de negocio en `listComponents.js`
62
+ - Separar mentalmente: lógica vs presentación
63
+ - Funciones a extraer: `loadConfig`, `getComponents`, `countComponentFiles`, `listComponentDirectories`
64
+
65
+ #### Paso 1.2: Crear core.js
66
+ - Crear archivo `commands/listComponents/core.js`
67
+ - Extraer funciones de lógica pura
68
+ - Modificar para que acepten `projectPath` como parámetro opcional
69
+ - Retornar objetos estructurados en lugar de imprimir
70
+
71
+ #### Paso 1.3: Adaptar listComponents.js
72
+ - Importar funciones desde `core.js`
73
+ - Mantener solo la lógica de presentación (Print, Table, chalk)
74
+ - Re-exportar funciones del core: `export { getComponents, ... } from './core.js'`
75
+
76
+ #### Paso 1.4: Verificación
77
+ - Ejecutar `slice list` - debe funcionar idéntico
78
+ - Probar importación directa: `import { getComponents } from './commands/listComponents/core.js'`
79
+ - Verificar que retorna datos correctos sin CLI
80
+
81
+ ---
82
+
83
+ ### Fase 2: Create Component
84
+
85
+ #### Paso 2.1: Análisis
86
+ - Identificar lógica: validaciones, generación de templates, creación de archivos
87
+ - Identificar presentación: mensajes de error, comandos de ejemplo
88
+
89
+ #### Paso 2.2: Crear core.js
90
+ - Crear `commands/createComponent/core.js`
91
+ - Extraer: `validateComponentName`, `validateCategory`, `generateTemplate`, `createComponentFiles`
92
+ - Cada función retorna `{ success, data, error }`
93
+
94
+ #### Paso 2.3: Adaptar createComponent.js
95
+ - Importar funciones del core
96
+ - Mantener solo los Print y mensajes de ayuda
97
+ - Re-exportar funciones del core
98
+
99
+ #### Paso 2.4: Verificación
100
+ - Ejecutar `slice component create` - debe funcionar igual
101
+ - Probar importación directa y creación programática
102
+
103
+ ---
104
+
105
+ ### Fase 3: Delete Component
106
+
107
+ #### Paso 3.1: Análisis
108
+ - Identificar lógica: validaciones, verificación de existencia, eliminación de archivos
109
+ - Identificar presentación: mensajes de confirmación, errores
110
+
111
+ #### Paso 3.2: Crear core.js
112
+ - Crear `commands/deleteComponent/core.js`
113
+ - Extraer: `deleteComponentFiles` (con validaciones integradas)
114
+
115
+ #### Paso 3.3: Adaptar deleteComponent.js
116
+ - Importar del core
117
+ - Mantener presentación CLI
118
+ - Re-exportar funciones
119
+
120
+ #### Paso 3.4: Verificación
121
+ - Ejecutar `slice component delete`
122
+ - Verificar funcionamiento idéntico
123
+
124
+ ---
125
+
126
+ ### Fase 4: Get Component (Registry)
127
+
128
+ #### Paso 4.1: Análisis
129
+ - Identificar lógica: descarga de registry, instalación de componentes, actualización
130
+ - Es el más complejo - tiene clase ComponentRegistry
131
+
132
+ #### Paso 4.2: Crear core.js
133
+ - Crear `commands/getComponent/core.js`
134
+ - Extraer clase `ComponentRegistry` limpia (sin inquirer, sin Print)
135
+ - Métodos retornan objetos estructurados
136
+
137
+ #### Paso 4.3: Adaptar getComponent.js
138
+ - Importar ComponentRegistry del core
139
+ - Envolver con lógica interactiva (inquirer) solo en CLI
140
+ - Mantener funciones: `getComponents`, `listComponents`, `syncComponents`
141
+
142
+ #### Paso 4.4: Verificación
143
+ - Probar: `slice get Button`, `slice browse`, `slice sync`
144
+ - Verificar descarga y registro correctos
145
+
146
+ ---
147
+
148
+ ### Fase 5: Init Project
149
+
150
+ #### Paso 5.1: Análisis
151
+ - Identificar lógica: copia de estructuras, configuración de package.json
152
+ - Separar spinners y mensajes visuales
153
+
154
+ #### Paso 5.2: Crear core.js
155
+ - Crear `commands/init/core.js`
156
+ - Extraer: funciones de scaffolding, configuración
157
+
158
+ #### Paso 5.3: Adaptar init.js
159
+ - Importar del core
160
+ - Mantener spinners y presentación
161
+ - Re-exportar funciones
162
+
163
+ #### Paso 5.4: Verificación
164
+ - Ejecutar `slice init` en proyecto nuevo
165
+ - Verificar estructura completa creada
166
+
167
+ ---
168
+
169
+ ## Patrón de Estructura de Funciones Core
170
+
171
+ ### Firma de Función Estándar
172
+ ```
173
+ function operationName({ param1, param2, projectPath = null }) {
174
+ // Validaciones
175
+ // Lógica de negocio
176
+ return { success: boolean, data?, error? }
177
+ }
178
+ ```
179
+
180
+ ### Objeto de Retorno Estándar
181
+ ```javascript
182
+ // Éxito
183
+ {
184
+ success: true,
185
+ data: { ... },
186
+ // Campos adicionales específicos
187
+ }
188
+
189
+ // Error
190
+ {
191
+ success: false,
192
+ error: "mensaje descriptivo"
193
+ }
194
+ ```
195
+
196
+ ---
197
+
198
+ ## Estrategia de Dependencias
199
+
200
+ ### Dependencias Permitidas en core.js
201
+ - ✅ `fs`, `fs-extra`
202
+ - ✅ `path`
203
+ - ✅ `Validations.js` (lógica pura)
204
+ - ✅ Helpers de PathHelper (refactorizar para aceptar projectPath)
205
+
206
+ ### Dependencias NO Permitidas en core.js
207
+ - ❌ `Print.js` (específico de CLI)
208
+ - ❌ `chalk` (presentación)
209
+ - ❌ `cli-table3` (presentación)
210
+ - ❌ `inquirer` (interacción CLI)
211
+ - ❌ `ora` (spinners CLI)
212
+
213
+ ---
214
+
215
+ ## Refactorización de PathHelper
216
+
217
+ ### Problema Actual
218
+ PathHelper usa `import.meta.url` internamente, asumiendo que se llama desde dentro del CLI
219
+
220
+ ### Solución
221
+ Crear versiones alternativas que acepten `projectPath`:
222
+
223
+ ```
224
+ // Versión CLI (actual)
225
+ getSrcPath(import.meta.url, ...paths)
226
+
227
+ // Versión core (nueva)
228
+ getProjectSrcPath(projectPath, ...paths)
229
+ ```
230
+
231
+ O mejor: modificar funciones existentes para aceptar ambos modos:
232
+ ```
233
+ getSrcPath(importMetaUrlOrProjectPath, ...paths)
234
+ ```
235
+
236
+ ---
237
+
238
+ ## Testing de la Refactorización
239
+
240
+ ### Test 1: CLI Functionality
241
+ Para cada comando refactorizado:
242
+ - Ejecutar comando CLI
243
+ - Verificar output idéntico al anterior
244
+ - Verificar archivos creados/modificados
245
+
246
+ ### Test 2: Importación Directa
247
+ ```javascript
248
+ // test-mcp-import.js
249
+ import { getComponents } from './commands/listComponents/core.js';
250
+
251
+ const result = getComponents('/ruta/proyecto');
252
+ console.log(result); // Debe retornar objeto con componentes
253
+ ```
254
+
255
+ ### Test 3: Sin Dependencias CLI
256
+ Verificar que core.js no tiene imports de Print, chalk, etc:
257
+ ```bash
258
+ grep -r "from.*Print" commands/*/core.js # debe estar vacío
259
+ grep -r "from.*chalk" commands/*/core.js # debe estar vacío
260
+ ```
261
+
262
+ ---
263
+
264
+ ## Orden de Implementación Recomendado
265
+
266
+ 1. **listComponents** (más simple, establece patrón)
267
+ 2. **createComponent** (complejidad media)
268
+ 3. **deleteComponent** (similar a create)
269
+ 4. **getComponent** (más complejo, tiene clase)
270
+ 5. **init** (el más complejo)
271
+