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/client.js +50 -8
- package/commands/bundle/bundle.js +226 -0
- package/commands/doctor/doctor.js +11 -11
- package/commands/getComponent/getComponent.js +74 -36
- package/commands/init/init.js +56 -57
- package/commands/startServer/startServer.js +6 -2
- package/commands/utils/PathHelper.js +10 -0
- package/commands/utils/VersionChecker.js +2 -2
- package/commands/utils/bundling/BundleGenerator.js +389 -0
- package/commands/utils/bundling/DependencyAnalyzer.js +340 -0
- package/commands/utils/updateManager.js +87 -87
- package/package.json +1 -1
- package/refactor.md +271 -0
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
|
+
|