@orxataguy/tyr 1.0.0 → 1.0.2
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/LICENSE +21 -21
- package/README.md +408 -408
- package/bin/tyr.js +10 -7
- package/bin/tyr.ts +13 -13
- package/config/map.yml +4 -7
- package/package.json +66 -60
- package/src/commands/di.tyr.ts +112 -112
- package/src/commands/dw.tyr.ts +115 -115
- package/src/commands/install.tyr.ts +30 -104
- package/src/core/Container.ts +56 -56
- package/src/core/Kernel.ts +213 -165
- package/src/core/Logger.ts +51 -48
- package/src/core/TyrError.ts +57 -57
- package/src/core/sys/ai.ts +160 -162
- package/src/core/sys/config.ts +231 -0
- package/src/core/sys/doc.ts +324 -324
- package/src/core/sys/gen.ts +75 -72
- package/src/core/sys/rem.ts +61 -57
- package/src/index.ts +5 -0
- package/src/lib/DockerManager.ts +108 -108
- package/src/lib/FileSystemManager.ts +152 -152
- package/src/lib/GitManager.ts +75 -75
- package/src/lib/PackageManager.ts +87 -87
- package/src/lib/SQLManager.ts +112 -120
- package/src/lib/ShellManager.ts +117 -117
- package/src/lib/SystemManager.ts +83 -83
- package/src/lib/WebManager.ts +62 -62
package/README.md
CHANGED
|
@@ -1,408 +1,408 @@
|
|
|
1
|
-
# Tyr Framework - Guía Completa del Proyecto
|
|
2
|
-
|
|
3
|
-
**Autor:** Manel Andreu Pérez
|
|
4
|
-
**Versión:** 1.0.0
|
|
5
|
-
**Licencia:** MIT
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 📋 Descripción del Proyecto
|
|
10
|
-
|
|
11
|
-
Tyr Framework es un entorno de ejecución basado en TypeScript que permite crear, ejecutar y automatizar herramientas CLI de manera declarativa.
|
|
12
|
-
|
|
13
|
-
La arquitectura se construye sobre **inyección de dependencias**: el "Kernel" proporciona un contexto de ejecución donde los "Managers" exponen su funcionalidad a través de una API auto-generada. Gracias a un sistema de introspección de código, el entorno analiza tipos y documentación en tiempo real.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## 📁 Estructura del Proyecto
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
/
|
|
21
|
-
├── bin/
|
|
22
|
-
│ └── tyr.ts // Punto de entrada del CLI
|
|
23
|
-
│
|
|
24
|
-
├── src/
|
|
25
|
-
│ ├── core/
|
|
26
|
-
│ │ ├── Kernel.ts // Motor principal de ejecución
|
|
27
|
-
│ │ ├── Container.ts // Contenedor de servicios (inyección de dependencias)
|
|
28
|
-
│ │ ├── TyrError.ts // Manejo de errores personalizado
|
|
29
|
-
│ │ └── sys/
|
|
30
|
-
│ │ ├── gen.ts // Comando: generar nuevos comandos
|
|
31
|
-
│ │ ├── rem.ts // Comando: remover comandos
|
|
32
|
-
│ │ └── doc.ts // Comando: generar documentación
|
|
33
|
-
│ │
|
|
34
|
-
│ ├── commands/
|
|
35
|
-
│ │ ├── install.tyr.ts // Comando: instalar el framework
|
|
36
|
-
│ │ └── dw.tyr.ts // Comando: descargar dependencias
|
|
37
|
-
│ │
|
|
38
|
-
│ └── lib/
|
|
39
|
-
│ ├── ShellManager.ts // Ejecución de comandos shell
|
|
40
|
-
│ ├── FileSystemManager.ts // Operaciones del sistema de archivos
|
|
41
|
-
│ ├── PackageManager.ts // Gestión de paquetes (npm)
|
|
42
|
-
│ ├── DockerManager.ts // Integración con Docker
|
|
43
|
-
│ ├── GitManager.ts // Operaciones de Git
|
|
44
|
-
│ ├── SystemManager.ts // Gestión del sistema
|
|
45
|
-
│ ├── SQLManager.ts // Consultas a bases de datos MSSQL
|
|
46
|
-
│ └── WebManager.ts // Requests HTTP
|
|
47
|
-
│
|
|
48
|
-
├── tests/
|
|
49
|
-
│ ├── commands.test.ts // Tests de comandos (Vitest)
|
|
50
|
-
│ ├── test-runner.ts // Runner de smoke tests
|
|
51
|
-
│ └── setup.ts // Configuración de mocks
|
|
52
|
-
│
|
|
53
|
-
├── config/
|
|
54
|
-
│ └── map.yml // Configuración de comandos del framework
|
|
55
|
-
│
|
|
56
|
-
├── local/
|
|
57
|
-
│ ├── aliases.sh // Alias de shell personalizados
|
|
58
|
-
│ └── plugins.sh // Plugins para shell
|
|
59
|
-
│
|
|
60
|
-
├── package.json // Dependencias y scripts
|
|
61
|
-
├── tsconfig.json // Configuración de TypeScript
|
|
62
|
-
├── vitest.config.ts // Configuración de tests
|
|
63
|
-
└── html-reporter.ts // Generador de reportes HTML
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## 🎯 Conceptos Clave
|
|
69
|
-
|
|
70
|
-
### 1. KERNEL (`src/core/Kernel.ts`)
|
|
71
|
-
|
|
72
|
-
- **Orquestador principal** del framework
|
|
73
|
-
- Carga configuración desde `config/map.yml`
|
|
74
|
-
- Enruta comandos hacia sus manejadores
|
|
75
|
-
- Proporciona el contexto de ejecución (`TyrContext`)
|
|
76
|
-
- **Métodos principales:**
|
|
77
|
-
- `boot(args)`: Inicializa el framework
|
|
78
|
-
- `handle(args)`: Ejecuta comandos
|
|
79
|
-
|
|
80
|
-
### 2. CONTAINER (`src/core/Container.ts`)
|
|
81
|
-
|
|
82
|
-
- Contenedor de **inyección de dependencias**
|
|
83
|
-
- Instancia todos los servicios (Managers)
|
|
84
|
-
- Expone interfaz `ServiceContainer` con todos los servicios
|
|
85
|
-
- Implementa patrón Singleton para servicios
|
|
86
|
-
|
|
87
|
-
### 3. MANAGERS (`src/lib/*.ts`)
|
|
88
|
-
|
|
89
|
-
Conjunto de abstracciones sobre librerías externas. Ejecutar comando de documentación para saber más.
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
tyr doc
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
### 4. COMANDOS
|
|
96
|
-
|
|
97
|
-
Son funciones que siguen el patrón:
|
|
98
|
-
|
|
99
|
-
```typescript
|
|
100
|
-
export default ({ task, fail, logger, fs, shell }: TyrContext) => {
|
|
101
|
-
return async (args: string[]) => {
|
|
102
|
-
// Lógica del comando
|
|
103
|
-
};
|
|
104
|
-
};
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
Los comandos personalizados se registran en `config/map.yml`
|
|
108
|
-
|
|
109
|
-
### 5. CONFIGURACIÓN (`config/map.yml`)
|
|
110
|
-
|
|
111
|
-
Define los comandos disponibles:
|
|
112
|
-
|
|
113
|
-
```yaml
|
|
114
|
-
commands:
|
|
115
|
-
install: ./src/commands/install.tyr.ts
|
|
116
|
-
dw: ./src/commands/dw.tyr.ts
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
## 🚀 Cómo Usar el Framework
|
|
122
|
-
|
|
123
|
-
### Instalación
|
|
124
|
-
|
|
125
|
-
```bash
|
|
126
|
-
npm install
|
|
127
|
-
npm run install # Ejecuta el comando install
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### Ejecutar Comandos
|
|
131
|
-
|
|
132
|
-
```bash
|
|
133
|
-
tyr <nombre-comando> [argumentos]
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
**Ejemplos:**
|
|
137
|
-
- `tyr install` - Instala y configura el framework
|
|
138
|
-
- `tyr gen micomando` - Genera un nuevo comando
|
|
139
|
-
- `tyr rem micomando` - Elimina un comando
|
|
140
|
-
- `tyr doc` - Genera documentación
|
|
141
|
-
- `tyr dw` - Descarga dependencias
|
|
142
|
-
|
|
143
|
-
### Crear un Nuevo Comando
|
|
144
|
-
|
|
145
|
-
```bash
|
|
146
|
-
tyr gen <nombre-comando> <nombre-archivo>
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
Se creará el archivo en `src/commands/<nombre-archivo>.tyr.ts`:
|
|
150
|
-
|
|
151
|
-
```typescript
|
|
152
|
-
import { TyrContext } from '../core/Kernel';
|
|
153
|
-
|
|
154
|
-
export default ({ task, fail, logger, fs, shell }: TyrContext) => {
|
|
155
|
-
return async (args: string[]) => {
|
|
156
|
-
// Validar argumentos
|
|
157
|
-
if (args.length === 0) {
|
|
158
|
-
fail('Se requiere al menos un argumento');
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Usar tareas con descripción
|
|
162
|
-
await task('Realizando acción', async () => {
|
|
163
|
-
logger.info('Procesando...');
|
|
164
|
-
// Tu lógica aquí
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
logger.success('¡Listo!');
|
|
168
|
-
};
|
|
169
|
-
};
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### Eliminarc un Comando Existente
|
|
173
|
-
```bash
|
|
174
|
-
tyr rem <nombre-comando>
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## 🧪 Testing
|
|
181
|
-
|
|
182
|
-
El framework incluye un sistema de testing completo:
|
|
183
|
-
|
|
184
|
-
### Tests Unitarios (Vitest)
|
|
185
|
-
|
|
186
|
-
```bash
|
|
187
|
-
npm run test # Ejecutar tests
|
|
188
|
-
npm run test:watch # Modo watch
|
|
189
|
-
npm run test:ui # UI interactivo
|
|
190
|
-
npm run test:coverage # Cobertura
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
### Smoke Tests
|
|
194
|
-
|
|
195
|
-
```bash
|
|
196
|
-
npm run test:smoke # Valida que todos los comandos cargan correctamente
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
**Verifica:**
|
|
200
|
-
- Comandos cargan como módulos
|
|
201
|
-
- Exportan función por defecto
|
|
202
|
-
- Se instancian con contexto
|
|
203
|
-
- Se ejecutan sin excepciones no controladas
|
|
204
|
-
|
|
205
|
-
### Mocks
|
|
206
|
-
|
|
207
|
-
El archivo `tests/setup.ts` proporciona `createMockContext()` que mocka:
|
|
208
|
-
- Logger
|
|
209
|
-
- ShellManager
|
|
210
|
-
- FileSystemManager
|
|
211
|
-
- Todos los managers
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
## 📊 Flujo de Ejecución
|
|
216
|
-
|
|
217
|
-
```
|
|
218
|
-
1. Usuario ejecuta: tyr micomando arg1 arg2
|
|
219
|
-
↓
|
|
220
|
-
2. bin/tyr.ts captura el comando
|
|
221
|
-
↓
|
|
222
|
-
3. Kernel.boot() inicializa el framework
|
|
223
|
-
↓
|
|
224
|
-
4. Container.init() crea todos los Managers
|
|
225
|
-
↓
|
|
226
|
-
5. Carga config/map.yml
|
|
227
|
-
↓
|
|
228
|
-
6. Kernel.handle() recibe [micomando, arg1, arg2]
|
|
229
|
-
↓
|
|
230
|
-
7. Busca el comando en la configuración
|
|
231
|
-
↓
|
|
232
|
-
8. Importa el módulo dinámicamente
|
|
233
|
-
↓
|
|
234
|
-
9. Instancia el comando pasando TyrContext
|
|
235
|
-
↓
|
|
236
|
-
10. Ejecuta comando(args)
|
|
237
|
-
↓
|
|
238
|
-
11. Retorna resultado o error
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
---
|
|
242
|
-
|
|
243
|
-
## 📦 Dependencias Principales
|
|
244
|
-
|
|
245
|
-
### Runtime
|
|
246
|
-
|
|
247
|
-
- **chalk** - Colores en terminal
|
|
248
|
-
- **execa** - Ejecución de shell mejorada
|
|
249
|
-
- **axios** - HTTP client
|
|
250
|
-
- **mssql** - Driver MSSQL
|
|
251
|
-
- **js-yaml** - Parser YAML
|
|
252
|
-
- **inquirer** - Prompts interactivos
|
|
253
|
-
- **dotenv** - Variables de entorno
|
|
254
|
-
- **cheerio** - Web scraping
|
|
255
|
-
- **find-config** - Búsqueda de archivos de config
|
|
256
|
-
|
|
257
|
-
### Dev
|
|
258
|
-
|
|
259
|
-
- **TypeScript** - Lenguaje
|
|
260
|
-
- **Vitest** - Testing framework
|
|
261
|
-
- **tsx** - Ejecutor TypeScript
|
|
262
|
-
- **Vite** - Build tool
|
|
263
|
-
- **Husky** - Git hooks
|
|
264
|
-
|
|
265
|
-
---
|
|
266
|
-
|
|
267
|
-
## 🔧 Configuración Importante
|
|
268
|
-
|
|
269
|
-
### tsconfig.json
|
|
270
|
-
- `target`: ES2020
|
|
271
|
-
- `module`: ES2020
|
|
272
|
-
- `moduleResolution`: node
|
|
273
|
-
|
|
274
|
-
### package.json
|
|
275
|
-
- `type`: module (módulos ES)
|
|
276
|
-
- `bin`: { tyr: ./bin/tyr.ts }
|
|
277
|
-
|
|
278
|
-
### vitest.config.ts
|
|
279
|
-
- Test runner del proyecto
|
|
280
|
-
- Configuración de mocks y setup
|
|
281
|
-
|
|
282
|
-
---
|
|
283
|
-
|
|
284
|
-
## 🎨 Patrones y Best Practices
|
|
285
|
-
|
|
286
|
-
### Inyección de Dependencias
|
|
287
|
-
|
|
288
|
-
```typescript
|
|
289
|
-
const command = ({ logger, fs, shell }: TyrContext) => {
|
|
290
|
-
// Los managers se inyectan automáticamente
|
|
291
|
-
return async (args) => { ... };
|
|
292
|
-
};
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
### Manejo de Errores
|
|
296
|
-
|
|
297
|
-
- Usa `fail(message, suggestion?)` para errores controlados
|
|
298
|
-
- `fail()` lanza `TyrError`
|
|
299
|
-
- Los comandos pueden capturar y manejar excepciones
|
|
300
|
-
|
|
301
|
-
### Tareas con Descripción
|
|
302
|
-
|
|
303
|
-
```typescript
|
|
304
|
-
await task('Descripción', async () => {
|
|
305
|
-
// Operación
|
|
306
|
-
});
|
|
307
|
-
// Muestra progreso en terminal
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
### Logging
|
|
311
|
-
|
|
312
|
-
```typescript
|
|
313
|
-
logger.info() // Información general
|
|
314
|
-
logger.success() // Operación exitosa
|
|
315
|
-
logger.error() // Error (solo en debug)
|
|
316
|
-
logger.warn() // Advertencia (solo en debug)
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
### Argumentos de Comando
|
|
320
|
-
|
|
321
|
-
Siempre valida los argumentos al inicio:
|
|
322
|
-
|
|
323
|
-
```typescript
|
|
324
|
-
if (args.length < 2) {
|
|
325
|
-
fail('Se requieren 2 argumentos', 'Sintaxis: tyr cmd arg1 arg2');
|
|
326
|
-
}
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
---
|
|
330
|
-
|
|
331
|
-
## 📚 Comandos Disponibles
|
|
332
|
-
|
|
333
|
-
### Comandos del Sistema
|
|
334
|
-
|
|
335
|
-
#### `tyr gen <nombre-comando> [archivo-salida]`
|
|
336
|
-
Genera un nuevo comando con template
|
|
337
|
-
- Crea archivo en `src/commands/`
|
|
338
|
-
- Registra en `config/map.yml`
|
|
339
|
-
|
|
340
|
-
#### `tyr rem <nombre-comando>`
|
|
341
|
-
Elimina un comando
|
|
342
|
-
- Borra archivo del comando
|
|
343
|
-
- Elimina entrada en `config/map.yml`
|
|
344
|
-
|
|
345
|
-
#### `tyr doc`
|
|
346
|
-
Genera documentación completa del sistema
|
|
347
|
-
- Analiza todos los comandos
|
|
348
|
-
- Extrae tipos y comentarios JSDoc
|
|
349
|
-
- Genera HTML interactivo
|
|
350
|
-
|
|
351
|
-
### Comandos Personalizados
|
|
352
|
-
|
|
353
|
-
#### `tyr install`
|
|
354
|
-
Instala y configura el framework
|
|
355
|
-
- Crea estructura de carpetas
|
|
356
|
-
- Copia templates
|
|
357
|
-
- Configura alias 'tyre' en .zshrc
|
|
358
|
-
|
|
359
|
-
#### `tyr dw`
|
|
360
|
-
Descarga y configura dependencias
|
|
361
|
-
- Instala paquetes npm
|
|
362
|
-
- Configura variables de entorno
|
|
363
|
-
- Verifica instalaciones externas
|
|
364
|
-
|
|
365
|
-
---
|
|
366
|
-
|
|
367
|
-
## 🐛 Debugging
|
|
368
|
-
|
|
369
|
-
Ejecuta con flag `--debug` para ver más información:
|
|
370
|
-
|
|
371
|
-
```bash
|
|
372
|
-
tyr micomando --debug
|
|
373
|
-
```
|
|
374
|
-
|
|
375
|
-
- Activa logging de errores y warnings
|
|
376
|
-
- Muestra detalles de operaciones
|
|
377
|
-
|
|
378
|
-
---
|
|
379
|
-
|
|
380
|
-
## 📝 Notas de Desarrollo
|
|
381
|
-
|
|
382
|
-
- El framework usa módulos ES6, asegúrate de `"type": "module"` en `package.json`
|
|
383
|
-
- Los comandos deben ser `async`
|
|
384
|
-
- Siempre retorna del handler o lanza error
|
|
385
|
-
- Usa la inyección de dependencias, no importes managers directamente
|
|
386
|
-
- Los tests usan mocks automáticos del `setup.ts`
|
|
387
|
-
- El smoke test valida que todos los comandos cargan correctamente
|
|
388
|
-
|
|
389
|
-
---
|
|
390
|
-
|
|
391
|
-
## 🔗 Referencias Útiles
|
|
392
|
-
|
|
393
|
-
Archivos principales para empezar:
|
|
394
|
-
|
|
395
|
-
- [src/core/Kernel.ts](src/core/Kernel.ts) - Entender cómo funciona el motor
|
|
396
|
-
- [src/core/Container.ts](src/core/Container.ts) - Ver cómo se inyectan dependencias
|
|
397
|
-
- [src/commands/install.tyr.ts](src/commands/install.tyr.ts) - Ejemplo de comando completo
|
|
398
|
-
- [src/core/sys/gen.ts](src/core/sys/gen.ts) - Cómo generar nuevos comandos
|
|
399
|
-
- [tests/test-runner.ts](tests/test-runner.ts) - Sistema de testing
|
|
400
|
-
|
|
401
|
-
---
|
|
402
|
-
|
|
403
|
-
## Licencia
|
|
404
|
-
|
|
405
|
-
**Autor:** Manel Andreu Pérez
|
|
406
|
-
**Versión:** 1.0.0
|
|
407
|
-
**Licencia:** MIT
|
|
408
|
-
**Tipo de proyecto:** CLI Framework para Automatización DevOps
|
|
1
|
+
# Tyr Framework - Guía Completa del Proyecto
|
|
2
|
+
|
|
3
|
+
**Autor:** Manel Andreu Pérez
|
|
4
|
+
**Versión:** 1.0.0
|
|
5
|
+
**Licencia:** MIT
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 📋 Descripción del Proyecto
|
|
10
|
+
|
|
11
|
+
Tyr Framework es un entorno de ejecución basado en TypeScript que permite crear, ejecutar y automatizar herramientas CLI de manera declarativa.
|
|
12
|
+
|
|
13
|
+
La arquitectura se construye sobre **inyección de dependencias**: el "Kernel" proporciona un contexto de ejecución donde los "Managers" exponen su funcionalidad a través de una API auto-generada. Gracias a un sistema de introspección de código, el entorno analiza tipos y documentación en tiempo real.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 📁 Estructura del Proyecto
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
/
|
|
21
|
+
├── bin/
|
|
22
|
+
│ └── tyr.ts // Punto de entrada del CLI
|
|
23
|
+
│
|
|
24
|
+
├── src/
|
|
25
|
+
│ ├── core/
|
|
26
|
+
│ │ ├── Kernel.ts // Motor principal de ejecución
|
|
27
|
+
│ │ ├── Container.ts // Contenedor de servicios (inyección de dependencias)
|
|
28
|
+
│ │ ├── TyrError.ts // Manejo de errores personalizado
|
|
29
|
+
│ │ └── sys/
|
|
30
|
+
│ │ ├── gen.ts // Comando: generar nuevos comandos
|
|
31
|
+
│ │ ├── rem.ts // Comando: remover comandos
|
|
32
|
+
│ │ └── doc.ts // Comando: generar documentación
|
|
33
|
+
│ │
|
|
34
|
+
│ ├── commands/
|
|
35
|
+
│ │ ├── install.tyr.ts // Comando: instalar el framework
|
|
36
|
+
│ │ └── dw.tyr.ts // Comando: descargar dependencias
|
|
37
|
+
│ │
|
|
38
|
+
│ └── lib/
|
|
39
|
+
│ ├── ShellManager.ts // Ejecución de comandos shell
|
|
40
|
+
│ ├── FileSystemManager.ts // Operaciones del sistema de archivos
|
|
41
|
+
│ ├── PackageManager.ts // Gestión de paquetes (npm)
|
|
42
|
+
│ ├── DockerManager.ts // Integración con Docker
|
|
43
|
+
│ ├── GitManager.ts // Operaciones de Git
|
|
44
|
+
│ ├── SystemManager.ts // Gestión del sistema
|
|
45
|
+
│ ├── SQLManager.ts // Consultas a bases de datos MSSQL
|
|
46
|
+
│ └── WebManager.ts // Requests HTTP
|
|
47
|
+
│
|
|
48
|
+
├── tests/
|
|
49
|
+
│ ├── commands.test.ts // Tests de comandos (Vitest)
|
|
50
|
+
│ ├── test-runner.ts // Runner de smoke tests
|
|
51
|
+
│ └── setup.ts // Configuración de mocks
|
|
52
|
+
│
|
|
53
|
+
├── config/
|
|
54
|
+
│ └── map.yml // Configuración de comandos del framework
|
|
55
|
+
│
|
|
56
|
+
├── local/
|
|
57
|
+
│ ├── aliases.sh // Alias de shell personalizados
|
|
58
|
+
│ └── plugins.sh // Plugins para shell
|
|
59
|
+
│
|
|
60
|
+
├── package.json // Dependencias y scripts
|
|
61
|
+
├── tsconfig.json // Configuración de TypeScript
|
|
62
|
+
├── vitest.config.ts // Configuración de tests
|
|
63
|
+
└── html-reporter.ts // Generador de reportes HTML
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 🎯 Conceptos Clave
|
|
69
|
+
|
|
70
|
+
### 1. KERNEL (`src/core/Kernel.ts`)
|
|
71
|
+
|
|
72
|
+
- **Orquestador principal** del framework
|
|
73
|
+
- Carga configuración desde `config/map.yml`
|
|
74
|
+
- Enruta comandos hacia sus manejadores
|
|
75
|
+
- Proporciona el contexto de ejecución (`TyrContext`)
|
|
76
|
+
- **Métodos principales:**
|
|
77
|
+
- `boot(args)`: Inicializa el framework
|
|
78
|
+
- `handle(args)`: Ejecuta comandos
|
|
79
|
+
|
|
80
|
+
### 2. CONTAINER (`src/core/Container.ts`)
|
|
81
|
+
|
|
82
|
+
- Contenedor de **inyección de dependencias**
|
|
83
|
+
- Instancia todos los servicios (Managers)
|
|
84
|
+
- Expone interfaz `ServiceContainer` con todos los servicios
|
|
85
|
+
- Implementa patrón Singleton para servicios
|
|
86
|
+
|
|
87
|
+
### 3. MANAGERS (`src/lib/*.ts`)
|
|
88
|
+
|
|
89
|
+
Conjunto de abstracciones sobre librerías externas. Ejecutar comando de documentación para saber más.
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
tyr doc
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 4. COMANDOS
|
|
96
|
+
|
|
97
|
+
Son funciones que siguen el patrón:
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
export default ({ task, fail, logger, fs, shell }: TyrContext) => {
|
|
101
|
+
return async (args: string[]) => {
|
|
102
|
+
// Lógica del comando
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Los comandos personalizados se registran en `config/map.yml`
|
|
108
|
+
|
|
109
|
+
### 5. CONFIGURACIÓN (`config/map.yml`)
|
|
110
|
+
|
|
111
|
+
Define los comandos disponibles:
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
commands:
|
|
115
|
+
install: ./src/commands/install.tyr.ts
|
|
116
|
+
dw: ./src/commands/dw.tyr.ts
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 🚀 Cómo Usar el Framework
|
|
122
|
+
|
|
123
|
+
### Instalación
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npm install
|
|
127
|
+
npm run install # Ejecuta el comando install
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Ejecutar Comandos
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
tyr <nombre-comando> [argumentos]
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Ejemplos:**
|
|
137
|
+
- `tyr install` - Instala y configura el framework
|
|
138
|
+
- `tyr gen micomando` - Genera un nuevo comando
|
|
139
|
+
- `tyr rem micomando` - Elimina un comando
|
|
140
|
+
- `tyr doc` - Genera documentación
|
|
141
|
+
- `tyr dw` - Descarga dependencias
|
|
142
|
+
|
|
143
|
+
### Crear un Nuevo Comando
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
tyr gen <nombre-comando> <nombre-archivo>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Se creará el archivo en `src/commands/<nombre-archivo>.tyr.ts`:
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import { TyrContext } from '../core/Kernel';
|
|
153
|
+
|
|
154
|
+
export default ({ task, fail, logger, fs, shell }: TyrContext) => {
|
|
155
|
+
return async (args: string[]) => {
|
|
156
|
+
// Validar argumentos
|
|
157
|
+
if (args.length === 0) {
|
|
158
|
+
fail('Se requiere al menos un argumento');
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Usar tareas con descripción
|
|
162
|
+
await task('Realizando acción', async () => {
|
|
163
|
+
logger.info('Procesando...');
|
|
164
|
+
// Tu lógica aquí
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
logger.success('¡Listo!');
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Eliminarc un Comando Existente
|
|
173
|
+
```bash
|
|
174
|
+
tyr rem <nombre-comando>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## 🧪 Testing
|
|
181
|
+
|
|
182
|
+
El framework incluye un sistema de testing completo:
|
|
183
|
+
|
|
184
|
+
### Tests Unitarios (Vitest)
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
npm run test # Ejecutar tests
|
|
188
|
+
npm run test:watch # Modo watch
|
|
189
|
+
npm run test:ui # UI interactivo
|
|
190
|
+
npm run test:coverage # Cobertura
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Smoke Tests
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
npm run test:smoke # Valida que todos los comandos cargan correctamente
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Verifica:**
|
|
200
|
+
- Comandos cargan como módulos
|
|
201
|
+
- Exportan función por defecto
|
|
202
|
+
- Se instancian con contexto
|
|
203
|
+
- Se ejecutan sin excepciones no controladas
|
|
204
|
+
|
|
205
|
+
### Mocks
|
|
206
|
+
|
|
207
|
+
El archivo `tests/setup.ts` proporciona `createMockContext()` que mocka:
|
|
208
|
+
- Logger
|
|
209
|
+
- ShellManager
|
|
210
|
+
- FileSystemManager
|
|
211
|
+
- Todos los managers
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 📊 Flujo de Ejecución
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
1. Usuario ejecuta: tyr micomando arg1 arg2
|
|
219
|
+
↓
|
|
220
|
+
2. bin/tyr.ts captura el comando
|
|
221
|
+
↓
|
|
222
|
+
3. Kernel.boot() inicializa el framework
|
|
223
|
+
↓
|
|
224
|
+
4. Container.init() crea todos los Managers
|
|
225
|
+
↓
|
|
226
|
+
5. Carga config/map.yml
|
|
227
|
+
↓
|
|
228
|
+
6. Kernel.handle() recibe [micomando, arg1, arg2]
|
|
229
|
+
↓
|
|
230
|
+
7. Busca el comando en la configuración
|
|
231
|
+
↓
|
|
232
|
+
8. Importa el módulo dinámicamente
|
|
233
|
+
↓
|
|
234
|
+
9. Instancia el comando pasando TyrContext
|
|
235
|
+
↓
|
|
236
|
+
10. Ejecuta comando(args)
|
|
237
|
+
↓
|
|
238
|
+
11. Retorna resultado o error
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## 📦 Dependencias Principales
|
|
244
|
+
|
|
245
|
+
### Runtime
|
|
246
|
+
|
|
247
|
+
- **chalk** - Colores en terminal
|
|
248
|
+
- **execa** - Ejecución de shell mejorada
|
|
249
|
+
- **axios** - HTTP client
|
|
250
|
+
- **mssql** - Driver MSSQL
|
|
251
|
+
- **js-yaml** - Parser YAML
|
|
252
|
+
- **inquirer** - Prompts interactivos
|
|
253
|
+
- **dotenv** - Variables de entorno
|
|
254
|
+
- **cheerio** - Web scraping
|
|
255
|
+
- **find-config** - Búsqueda de archivos de config
|
|
256
|
+
|
|
257
|
+
### Dev
|
|
258
|
+
|
|
259
|
+
- **TypeScript** - Lenguaje
|
|
260
|
+
- **Vitest** - Testing framework
|
|
261
|
+
- **tsx** - Ejecutor TypeScript
|
|
262
|
+
- **Vite** - Build tool
|
|
263
|
+
- **Husky** - Git hooks
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## 🔧 Configuración Importante
|
|
268
|
+
|
|
269
|
+
### tsconfig.json
|
|
270
|
+
- `target`: ES2020
|
|
271
|
+
- `module`: ES2020
|
|
272
|
+
- `moduleResolution`: node
|
|
273
|
+
|
|
274
|
+
### package.json
|
|
275
|
+
- `type`: module (módulos ES)
|
|
276
|
+
- `bin`: { tyr: ./bin/tyr.ts }
|
|
277
|
+
|
|
278
|
+
### vitest.config.ts
|
|
279
|
+
- Test runner del proyecto
|
|
280
|
+
- Configuración de mocks y setup
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 🎨 Patrones y Best Practices
|
|
285
|
+
|
|
286
|
+
### Inyección de Dependencias
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
const command = ({ logger, fs, shell }: TyrContext) => {
|
|
290
|
+
// Los managers se inyectan automáticamente
|
|
291
|
+
return async (args) => { ... };
|
|
292
|
+
};
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Manejo de Errores
|
|
296
|
+
|
|
297
|
+
- Usa `fail(message, suggestion?)` para errores controlados
|
|
298
|
+
- `fail()` lanza `TyrError`
|
|
299
|
+
- Los comandos pueden capturar y manejar excepciones
|
|
300
|
+
|
|
301
|
+
### Tareas con Descripción
|
|
302
|
+
|
|
303
|
+
```typescript
|
|
304
|
+
await task('Descripción', async () => {
|
|
305
|
+
// Operación
|
|
306
|
+
});
|
|
307
|
+
// Muestra progreso en terminal
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Logging
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
logger.info() // Información general
|
|
314
|
+
logger.success() // Operación exitosa
|
|
315
|
+
logger.error() // Error (solo en debug)
|
|
316
|
+
logger.warn() // Advertencia (solo en debug)
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Argumentos de Comando
|
|
320
|
+
|
|
321
|
+
Siempre valida los argumentos al inicio:
|
|
322
|
+
|
|
323
|
+
```typescript
|
|
324
|
+
if (args.length < 2) {
|
|
325
|
+
fail('Se requieren 2 argumentos', 'Sintaxis: tyr cmd arg1 arg2');
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## 📚 Comandos Disponibles
|
|
332
|
+
|
|
333
|
+
### Comandos del Sistema
|
|
334
|
+
|
|
335
|
+
#### `tyr gen <nombre-comando> [archivo-salida]`
|
|
336
|
+
Genera un nuevo comando con template
|
|
337
|
+
- Crea archivo en `src/commands/`
|
|
338
|
+
- Registra en `config/map.yml`
|
|
339
|
+
|
|
340
|
+
#### `tyr rem <nombre-comando>`
|
|
341
|
+
Elimina un comando
|
|
342
|
+
- Borra archivo del comando
|
|
343
|
+
- Elimina entrada en `config/map.yml`
|
|
344
|
+
|
|
345
|
+
#### `tyr doc`
|
|
346
|
+
Genera documentación completa del sistema
|
|
347
|
+
- Analiza todos los comandos
|
|
348
|
+
- Extrae tipos y comentarios JSDoc
|
|
349
|
+
- Genera HTML interactivo
|
|
350
|
+
|
|
351
|
+
### Comandos Personalizados
|
|
352
|
+
|
|
353
|
+
#### `tyr install`
|
|
354
|
+
Instala y configura el framework
|
|
355
|
+
- Crea estructura de carpetas
|
|
356
|
+
- Copia templates
|
|
357
|
+
- Configura alias 'tyre' en .zshrc
|
|
358
|
+
|
|
359
|
+
#### `tyr dw`
|
|
360
|
+
Descarga y configura dependencias
|
|
361
|
+
- Instala paquetes npm
|
|
362
|
+
- Configura variables de entorno
|
|
363
|
+
- Verifica instalaciones externas
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## 🐛 Debugging
|
|
368
|
+
|
|
369
|
+
Ejecuta con flag `--debug` para ver más información:
|
|
370
|
+
|
|
371
|
+
```bash
|
|
372
|
+
tyr micomando --debug
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
- Activa logging de errores y warnings
|
|
376
|
+
- Muestra detalles de operaciones
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## 📝 Notas de Desarrollo
|
|
381
|
+
|
|
382
|
+
- El framework usa módulos ES6, asegúrate de `"type": "module"` en `package.json`
|
|
383
|
+
- Los comandos deben ser `async`
|
|
384
|
+
- Siempre retorna del handler o lanza error
|
|
385
|
+
- Usa la inyección de dependencias, no importes managers directamente
|
|
386
|
+
- Los tests usan mocks automáticos del `setup.ts`
|
|
387
|
+
- El smoke test valida que todos los comandos cargan correctamente
|
|
388
|
+
|
|
389
|
+
---
|
|
390
|
+
|
|
391
|
+
## 🔗 Referencias Útiles
|
|
392
|
+
|
|
393
|
+
Archivos principales para empezar:
|
|
394
|
+
|
|
395
|
+
- [src/core/Kernel.ts](src/core/Kernel.ts) - Entender cómo funciona el motor
|
|
396
|
+
- [src/core/Container.ts](src/core/Container.ts) - Ver cómo se inyectan dependencias
|
|
397
|
+
- [src/commands/install.tyr.ts](src/commands/install.tyr.ts) - Ejemplo de comando completo
|
|
398
|
+
- [src/core/sys/gen.ts](src/core/sys/gen.ts) - Cómo generar nuevos comandos
|
|
399
|
+
- [tests/test-runner.ts](tests/test-runner.ts) - Sistema de testing
|
|
400
|
+
|
|
401
|
+
---
|
|
402
|
+
|
|
403
|
+
## Licencia
|
|
404
|
+
|
|
405
|
+
**Autor:** Manel Andreu Pérez
|
|
406
|
+
**Versión:** 1.0.0
|
|
407
|
+
**Licencia:** MIT
|
|
408
|
+
**Tipo de proyecto:** CLI Framework para Automatización DevOps
|