ostacky 0.5.6 → 0.5.7
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/README.md +22 -22
- package/assets/agents/ostacky.md +89 -120
- package/assets/commands/install-stack.md +7 -8
- package/assets/mcp/ostacky-controller/index.js +16 -4
- package/assets/mcp/ostacky-controller/package.json +1 -1
- package/assets/skills/execution-mode-evaluation/SKILL.md +107 -529
- package/assets/skills/openspec-apply-change/SKILL.md +18 -9
- package/assets/skills/openspec-archive-change/SKILL.md +3 -3
- package/assets/skills/openspec-propose/SKILL.md +10 -8
- package/assets/skills/review/SKILL.md +7 -5
- package/assets/skills/subagent-driven-development/SKILL.md +14 -0
- package/assets/skills/thinking/SKILL.md +195 -0
- package/assets/skills/using-git-worktrees/SKILL.md +1 -1
- package/assets/skills/using-superpowers/SKILL.md +8 -8
- package/assets/skills/writing-plans/SKILL.md +12 -1
- package/assets/tests/e2e-scenarios.md +502 -0
- package/assets/tests/validate-config.sh +254 -0
- package/dist/cli.js +76 -50
- package/dist/mcp/ostacky-controller/index.js +15 -4
- package/manifest.json +58 -44
- package/package.json +1 -1
- package/assets/skills/brainstorming/SKILL.md +0 -153
- package/assets/skills/openspec-explore/SKILL.md +0 -288
- package/assets/skills/question-validation/SKILL.md +0 -77
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
# Ostacky E2E Test Scenarios
|
|
2
|
+
|
|
3
|
+
Tests para verificar que Ostacky clasifica correctamente y rutea al flujo adecuado.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Ensure CodeGraph is initialized
|
|
9
|
+
codegraph init -i
|
|
10
|
+
|
|
11
|
+
# Ensure Engram is running
|
|
12
|
+
engram serve &
|
|
13
|
+
|
|
14
|
+
# Start OpenCode with Ostacky agent
|
|
15
|
+
opencode
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Test 1: Level 0 — Cambio trivial → Superpowers (DIRECT)
|
|
21
|
+
|
|
22
|
+
### Input del usuario
|
|
23
|
+
```
|
|
24
|
+
Agregá un tooltip al botón de "Submit" en el formulario de contacto
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Comportamiento esperado
|
|
28
|
+
|
|
29
|
+
**Paso 1 — Recepción:**
|
|
30
|
+
- Ostacky llama `start_request`
|
|
31
|
+
- Ostacky analiza: 1 archivo, sin API pública, sin dependencias nuevas, <15 líneas
|
|
32
|
+
- Clasificación: **Nivel 0**
|
|
33
|
+
|
|
34
|
+
**Paso 2 — Pregunta al usuario:**
|
|
35
|
+
```
|
|
36
|
+
Esto es Nivel 0. Por defecto lo ejecuto directo con Superpowers. ¿O preferís spec?
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Paso 3 — Si usuario responde "directo" (default):**
|
|
40
|
+
- Ostacky llama `record_discovery({ level: "0" })`
|
|
41
|
+
- Ostacky llama `consume_route_decision({ choice: "DIRECT" })`
|
|
42
|
+
- Ostacky ejecuta el cambio directamente usando:
|
|
43
|
+
- `Read` para leer el archivo
|
|
44
|
+
- `validate_edit` antes de editar
|
|
45
|
+
- `edit` para hacer el cambio
|
|
46
|
+
- `complete_task` para marcar completado
|
|
47
|
+
|
|
48
|
+
**Paso 4 — Cierre:**
|
|
49
|
+
- Tests pasan
|
|
50
|
+
- Review rápido
|
|
51
|
+
- `codegraph sync`
|
|
52
|
+
- `implementation_complete` → `sync_complete`
|
|
53
|
+
|
|
54
|
+
### Validación
|
|
55
|
+
- [ ] No se invocó `thinking` skill
|
|
56
|
+
- [ ] No se invocó `openspec-propose`
|
|
57
|
+
- [ ] Cambio se hizo directamente con Superpowers
|
|
58
|
+
- [ ] Controller termina en estado DONE
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Test 2: Level 0+1 — Cambio chico no trivial → Superpowers (DIRECT)
|
|
63
|
+
|
|
64
|
+
### Input del usuario
|
|
65
|
+
```
|
|
66
|
+
Agregá validación de email en el formulario de registro — que rejecte emails inválidos y muestre un mensaje de error
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Comportamiento esperado
|
|
70
|
+
|
|
71
|
+
**Paso 1 — Recepción:**
|
|
72
|
+
- Ostacky analiza: 1-2 archivos, sin API pública nueva, <30 líneas
|
|
73
|
+
- Clasificación: **Nivel 0+1**
|
|
74
|
+
|
|
75
|
+
**Paso 2 — Pregunta al usuario:**
|
|
76
|
+
```
|
|
77
|
+
Esto es Nivel 0+1. Por defecto lo ejecuto directo con Superpowers. ¿O preferís spec?
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Paso 3 — Si usuario responde "directo":**
|
|
81
|
+
- Mismo flujo que Test 1
|
|
82
|
+
|
|
83
|
+
### Validación
|
|
84
|
+
- [ ] Clasificación correcta como Nivel 0+1
|
|
85
|
+
- [ ] Se sugiere Superpowers por defecto
|
|
86
|
+
- [ ] Cambio se ejecuta directamente
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Test 3: Level 1+ — Cambio complejo → OpenSpec (SPEC)
|
|
91
|
+
|
|
92
|
+
### Input del usuario
|
|
93
|
+
```
|
|
94
|
+
Necesito agregar autenticación con OAuth a la aplicación — que soporte Google y GitHub login, con sesiones persistentes
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Comportamiento esperado
|
|
98
|
+
|
|
99
|
+
**Paso 1 — Recepción:**
|
|
100
|
+
- Ostacky analiza: modifica API pública, agrega dependencias, impacto cross-module
|
|
101
|
+
- Clasificación: **Nivel 1+**
|
|
102
|
+
|
|
103
|
+
**Paso 2 — Pregunta al usuario:**
|
|
104
|
+
```
|
|
105
|
+
Esto es Nivel 1+ porque requiere autenticación completa con OAuth, sesiones, y múltiples providers. Recomiendo generar spec con OpenSpec. ¿O preferís ejecutar directo?
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Paso 3 — Si usuario responde "spec":**
|
|
109
|
+
- Ostacky llama `record_discovery({ level: "1+" })`
|
|
110
|
+
- Ostacky llama `consume_route_decision({ choice: "SPEC" })`
|
|
111
|
+
|
|
112
|
+
**Paso 4 — Specification phase:**
|
|
113
|
+
- Ostacky pregunta si quiere thinking o ir directo a spec
|
|
114
|
+
- Si usuario elige thinking:
|
|
115
|
+
- Se invoca skill `thinking` (creative-design mode)
|
|
116
|
+
- thinking explora el codebase via CodeGraph
|
|
117
|
+
- thinking busca en Engram decisiones previas de auth
|
|
118
|
+
- thinking propone 2-3 approaches
|
|
119
|
+
- thinking escribe design doc
|
|
120
|
+
- thinking transiciona a `openspec-propose` (porque routing=SPEC)
|
|
121
|
+
- Si usuario elige directo a spec:
|
|
122
|
+
- Se invoca `openspec-propose` directamente
|
|
123
|
+
|
|
124
|
+
**Paso 5 — openspec-propose:**
|
|
125
|
+
- Crea change directory
|
|
126
|
+
- Genera proposal.md, design.md, tasks.md
|
|
127
|
+
- llama `spec_complete`
|
|
128
|
+
|
|
129
|
+
**Paso 6 — Execution:**
|
|
130
|
+
- Se invoca `execution-mode-evaluation` para determinar INLINE vs SUBAGENT
|
|
131
|
+
- Se ejecutan las tasks
|
|
132
|
+
- `implementation_complete` → `sync_complete`
|
|
133
|
+
|
|
134
|
+
### Validación
|
|
135
|
+
- [ ] Clasificación correcta como Nivel 1+
|
|
136
|
+
- [ ] Se sugiere OpenSpec
|
|
137
|
+
- [ ] Se invocó `thinking` (si usuario eligió thinking)
|
|
138
|
+
- [ ] thinking transicionó a `openspec-propose`
|
|
139
|
+
- [ ] Se crearon artifacts en `openspec/changes/<name>/`
|
|
140
|
+
- [ ] Controller termina en estado DONE
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Test 4: Level 1+ con requisitos vagos → Thinking first
|
|
145
|
+
|
|
146
|
+
### Input del usuario
|
|
147
|
+
```
|
|
148
|
+
Quiero mejorar el sistema de notificaciones de la app
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Comportamiento esperado
|
|
152
|
+
|
|
153
|
+
**Paso 1 — Clasificación:**
|
|
154
|
+
- Requisitos vagos pero área amplia → **Nivel 1+**
|
|
155
|
+
|
|
156
|
+
**Paso 2 — Pregunta:**
|
|
157
|
+
```
|
|
158
|
+
Esto es Nivel 1+ porque afecta múltiples módulos. Recomiendo generar spec con OpenSpec. ¿O preferís ejecutar directo?
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**Paso 3 — Si usuario responde "spec":**
|
|
162
|
+
- Ostacky pregunta: "Los requisitos están un poco vagos. ¿Querés que exploremos y diseñemos juntos (thinking) o preferís ir directo a generar el spec?"
|
|
163
|
+
|
|
164
|
+
**Paso 4 — Si usuario elige thinking:**
|
|
165
|
+
- Se invoca `thinking` (creative-design mode)
|
|
166
|
+
- thinking pregunta: "¿Qué tipo de notificaciones tenés en mente?"
|
|
167
|
+
- thinking explora el sistema actual de notificaciones
|
|
168
|
+
- thinking propone approach
|
|
169
|
+
- thinking escribe design doc
|
|
170
|
+
- thinking transiciona a `openspec-propose`
|
|
171
|
+
|
|
172
|
+
### Validación
|
|
173
|
+
- [ ] Se detectaron requisitos vagos
|
|
174
|
+
- [ ] Se ofreció thinking como opción
|
|
175
|
+
- [ ] thinking exploró antes de diseñar
|
|
176
|
+
- [ ] Flujo completo hasta openspec-propose
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Test 5: Exploración open-ended → Thinking (open-explore)
|
|
181
|
+
|
|
182
|
+
### Input del usuario
|
|
183
|
+
```
|
|
184
|
+
¿Cómo funciona actualmente el sistema de permisos? Quiero entender si es escalable
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Comportamiento esperado
|
|
188
|
+
|
|
189
|
+
**Paso 1 — Detección de modo:**
|
|
190
|
+
- Señales: "cómo funciona", "entender", "querés entender"
|
|
191
|
+
- Modo detectado: **open-explore**
|
|
192
|
+
|
|
193
|
+
**Paso 2 — thinking ejecuta:**
|
|
194
|
+
- `codegraph_explore` sobre el sistema de permisos
|
|
195
|
+
- Mapea arquitectura actual
|
|
196
|
+
- Identifica patrones
|
|
197
|
+
- Presenta diagrama ASCII del flujo de permisos
|
|
198
|
+
- Analiza escalabilidad
|
|
199
|
+
|
|
200
|
+
**Paso 3 — Cierre:**
|
|
201
|
+
- Usuario tiene lo que necesita
|
|
202
|
+
- No se crea design doc (no es necesario)
|
|
203
|
+
- No se invoca siguiente skill
|
|
204
|
+
|
|
205
|
+
### Validación
|
|
206
|
+
- [ ] Se detectó modo open-explore
|
|
207
|
+
- [ ] No se forzó output de design doc
|
|
208
|
+
- [ ] Se usó CodeGraph para explorar
|
|
209
|
+
- [ ] Se presentó análisis estructurado
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Test 6: Cambio que parece simple pero es complejo
|
|
214
|
+
|
|
215
|
+
### Input del usuario
|
|
216
|
+
```
|
|
217
|
+
Agregá un botón de "Export to CSV" en la tabla de usuarios
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Comportamiento esperado
|
|
221
|
+
|
|
222
|
+
**Paso 1 — Análisis:**
|
|
223
|
+
- Superficialmente: 1 archivo, botón simple → Nivel 0
|
|
224
|
+
- Pero: exportar CSV puede implicar:
|
|
225
|
+
- Manejo de datos sensibles (usuarios)
|
|
226
|
+
- Permisos (¿quién puede exportar?)
|
|
227
|
+
- Performance (¿tabla grande?)
|
|
228
|
+
- Formato de datos (¿encoding, separadores?)
|
|
229
|
+
|
|
230
|
+
**Paso 2 — Ostacky investiga:**
|
|
231
|
+
- Usa CodeGraph para entender la tabla de usuarios
|
|
232
|
+
- Descubre que hay 10,000+ usuarios
|
|
233
|
+
- Descubre que hay datos sensibles (email, teléfono)
|
|
234
|
+
- Clasificación revisada: **Nivel 1+**
|
|
235
|
+
|
|
236
|
+
**Paso 3 — Pregunta:**
|
|
237
|
+
```
|
|
238
|
+
Esto es Nivel 1+ porque involucra datos sensibles de usuarios, permisos, y potencialmente performance con tablas grandes. Recomiendo generar spec con OpenSpec. ¿O preferís ejecutar directo?
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Validación
|
|
242
|
+
- [ ] Ostacky no asumió que era trivial
|
|
243
|
+
- [ ] Investigó antes de clasificar
|
|
244
|
+
- [ ] Reclasificó si encontró complejidad oculta
|
|
245
|
+
- [ ] Informó al usuario por qué es nivel superior
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Test 7: Transición thinking → openspec-propose
|
|
250
|
+
|
|
251
|
+
### Input del usuario
|
|
252
|
+
```
|
|
253
|
+
Refactorizá el módulo de pagos para usar una abstracción de provider
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Flujo completo
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
1. Ostacky: start_request
|
|
260
|
+
2. Ostacky: codegraph_explore (área de pagos)
|
|
261
|
+
3. Ostacky: Clasifica como Level 1+
|
|
262
|
+
4. Ostacky: Pregunta SPEC vs DIRECT
|
|
263
|
+
5. Usuario: "SPEC"
|
|
264
|
+
6. Ostacky: record_discovery({ level: "1+" })
|
|
265
|
+
7. Ostacky: consume_route_decision({ choice: "SPEC" })
|
|
266
|
+
8. Ostacky: Pregunta thinking vs directo a spec
|
|
267
|
+
9. Usuario: "thinking"
|
|
268
|
+
10. Ostacky: Invoca skill thinking (creative-design)
|
|
269
|
+
11. thinking: engram_mem_search (pagos, providers)
|
|
270
|
+
12. thinking: codegraph_explore (módulo de pagos)
|
|
271
|
+
13. thinking: Propone 2-3 approaches
|
|
272
|
+
14. thinking: Presenta diseño
|
|
273
|
+
15. thinking: Usuario aprueba
|
|
274
|
+
16. thinking: Escribe design doc
|
|
275
|
+
17. thinking: Transition Rules → routing=SPEC → invoca openspec-propose
|
|
276
|
+
18. openspec-propose: Crea change directory
|
|
277
|
+
19. openspec-propose: Genera proposal.md
|
|
278
|
+
20. openspec-propose: Genera design.md (o lee el de thinking)
|
|
279
|
+
21. openspec-propose: Genera tasks.md
|
|
280
|
+
22. openspec-propose: spec_complete
|
|
281
|
+
23. Ostacky: Execution phase
|
|
282
|
+
24. Ostacky: execution-mode-evaluation
|
|
283
|
+
25. Ostacky: Ejecuta tasks
|
|
284
|
+
26. Ostacky: sync_complete
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Validación
|
|
288
|
+
- [ ] Flujo completo sin interrupciones
|
|
289
|
+
- [ ] thinking transiciona correctamente a openspec-propose
|
|
290
|
+
- [ ] No se perdió contexto entre skills
|
|
291
|
+
- [ ] Controller mantiene estado correcto durante todo el flujo
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Test 8: Análisis de archivos compartidos en execution-mode-evaluation
|
|
296
|
+
|
|
297
|
+
### Input del usuario
|
|
298
|
+
```
|
|
299
|
+
Agregá soporte para multi-idioma en el módulo de configuración — que soporte español, inglés y portugués
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### tasks.md esperado
|
|
303
|
+
|
|
304
|
+
```markdown
|
|
305
|
+
### Task 1: Crear archivo de traducciones
|
|
306
|
+
- [ ] Crear src/i18n/locales/es.json con traducciones en español
|
|
307
|
+
|
|
308
|
+
### Task 2: Crear archivo de traducciones inglés
|
|
309
|
+
- [ ] Crear src/i18n/locales/en.json con traducciones en inglés
|
|
310
|
+
|
|
311
|
+
### Task 3: Crear configuración i18n
|
|
312
|
+
- [ ] Crear src/i18n/config.ts que carga los archivos de traducción
|
|
313
|
+
|
|
314
|
+
### Task 4: Integrar i18n en el componente de configuración
|
|
315
|
+
- [ ] Modificar src/settings/Settings.tsx para usar traducciones
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Análisis esperado
|
|
319
|
+
|
|
320
|
+
**Paso 1 — Construcción de sharedFiles:**
|
|
321
|
+
```
|
|
322
|
+
sharedFiles: {
|
|
323
|
+
"src/i18n/locales/es.json": ["task1"],
|
|
324
|
+
"src/i18n/locales/en.json": ["task2"],
|
|
325
|
+
"src/i18n/config.ts": ["task3"],
|
|
326
|
+
"src/settings/Settings.tsx": ["task4"]
|
|
327
|
+
}
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
**Paso 2 — Construcción de fileClusters:**
|
|
331
|
+
```
|
|
332
|
+
fileClusters: [
|
|
333
|
+
["task1"], // es.json
|
|
334
|
+
["task2"], // en.json
|
|
335
|
+
["task3"], // config.ts
|
|
336
|
+
["task4"] // Settings.tsx
|
|
337
|
+
]
|
|
338
|
+
clusterCount: 4 (== taskCount)
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
**Paso 3 — Reglas aplicadas:**
|
|
342
|
+
- clusterCount == 4, taskCount == 4 → Rule 3a/3b/3c aplica
|
|
343
|
+
- Si estLines >= 30 y taskCount >= 3 → **Rule 3c: SUBAGENT-DRIVEN**
|
|
344
|
+
|
|
345
|
+
**Output esperado al usuario:**
|
|
346
|
+
```markdown
|
|
347
|
+
## Análisis de modo de ejecución
|
|
348
|
+
|
|
349
|
+
**Recomendación:** SUBAGENT_DRIVEN
|
|
350
|
+
|
|
351
|
+
### Archivos compartidos entre tasks
|
|
352
|
+
| Archivo | Tasks que lo modifican |
|
|
353
|
+
|---------|------------------------|
|
|
354
|
+
| src/i18n/locales/es.json | task1 |
|
|
355
|
+
| src/i18n/locales/en.json | task2 |
|
|
356
|
+
| src/i18n/config.ts | task3 |
|
|
357
|
+
| src/settings/Settings.tsx | task4 |
|
|
358
|
+
|
|
359
|
+
### Clusters detectados
|
|
360
|
+
| Cluster | Tasks | Archivos |
|
|
361
|
+
|---------|-------|----------|
|
|
362
|
+
| A | task1 | src/i18n/locales/es.json |
|
|
363
|
+
| B | task2 | src/i18n/locales/en.json |
|
|
364
|
+
| C | task3 | src/i18n/config.ts |
|
|
365
|
+
| D | task4 | src/settings/Settings.tsx |
|
|
366
|
+
|
|
367
|
+
### Dependencias secuenciales
|
|
368
|
+
- Ninguna detectada
|
|
369
|
+
|
|
370
|
+
### Razón principal
|
|
371
|
+
[Regla 3c]: 4 clusters independientes (== taskCount) → SUBAGENT-DRIVEN. Cada task corre en paralelo.
|
|
372
|
+
|
|
373
|
+
### Estimación
|
|
374
|
+
~60 líneas en 4 archivos
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### Validación
|
|
378
|
+
- [ ] sharedFiles muestra cada archivo y qué tasks lo modifican
|
|
379
|
+
- [ ] fileClusters muestra las tareas agrupadas por archivos compartidos
|
|
380
|
+
- [ ] La razón explica qué regla se aplicó y por qué
|
|
381
|
+
- [ ] El usuario puede ver si hay archivos compartidos antes de confirmar
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Test 9: Archivos compartidos forzan INLINE
|
|
386
|
+
|
|
387
|
+
### Input del usuario
|
|
388
|
+
```
|
|
389
|
+
Refactorizá el sistema de logging — extraer una interfaz común y actualizar todos los módulos que la usan
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### tasks.md esperado
|
|
393
|
+
|
|
394
|
+
```markdown
|
|
395
|
+
### Task 1: Definir interfaz de logger
|
|
396
|
+
- [ ] Crear src/logger/LoggerInterface.ts
|
|
397
|
+
|
|
398
|
+
### Task 2: Implementar ConsoleLogger
|
|
399
|
+
- [ ] Crear src/logger/ConsoleLogger.ts que implemente la interfaz
|
|
400
|
+
|
|
401
|
+
### Task 3: Actualizar módulo de auth para usar la nueva interfaz
|
|
402
|
+
- [ ] Modificar src/auth/auth.ts para usar LoggerInterface
|
|
403
|
+
|
|
404
|
+
### Task 4: Actualizar módulo de pagos para usar la nueva interfaz
|
|
405
|
+
- [ ] Modificar src/payments/payments.ts para usar LoggerInterface
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Análisis esperado
|
|
409
|
+
|
|
410
|
+
**sharedFiles:**
|
|
411
|
+
```
|
|
412
|
+
sharedFiles: {
|
|
413
|
+
"src/logger/LoggerInterface.ts": ["task1"],
|
|
414
|
+
"src/logger/ConsoleLogger.ts": ["task2"],
|
|
415
|
+
"src/auth/auth.ts": ["task3"],
|
|
416
|
+
"src/payments/payments.ts": ["task4"]
|
|
417
|
+
}
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
**fileClusters:**
|
|
421
|
+
```
|
|
422
|
+
fileClusters: [
|
|
423
|
+
["task1"], // interfaz
|
|
424
|
+
["task2"], // implementación
|
|
425
|
+
["task3"], // auth
|
|
426
|
+
["task4"] // pagos
|
|
427
|
+
]
|
|
428
|
+
clusterCount: 4
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
**Pero hay sequentialDeps:**
|
|
432
|
+
```
|
|
433
|
+
sequentialDeps: [
|
|
434
|
+
["task1", "task2"], // task2 necesita la interfaz de task1
|
|
435
|
+
["task1", "task3"], // task3 necesita la interfaz de task1
|
|
436
|
+
["task1", "task4"] // task4 necesita la interfaz de task1
|
|
437
|
+
]
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
**Regla aplicada:**
|
|
441
|
+
- clusterCount == 4, taskCount == 4
|
|
442
|
+
- Hay deps entre clusters (task2, task3, task4 dependen de task1)
|
|
443
|
+
- **Rule 2a: INLINE** — deps secuenciales entre clusters sin contrato explícito
|
|
444
|
+
|
|
445
|
+
**Output esperado al usuario:**
|
|
446
|
+
```markdown
|
|
447
|
+
## Análisis de modo de ejecución
|
|
448
|
+
|
|
449
|
+
**Recomendación:** INLINE
|
|
450
|
+
|
|
451
|
+
### Archivos compartidos entre tasks
|
|
452
|
+
| Archivo | Tasks que lo modifican |
|
|
453
|
+
|---------|------------------------|
|
|
454
|
+
| src/logger/LoggerInterface.ts | task1 |
|
|
455
|
+
| src/logger/ConsoleLogger.ts | task2 |
|
|
456
|
+
| src/auth/auth.ts | task3 |
|
|
457
|
+
| src/payments/payments.ts | task4 |
|
|
458
|
+
|
|
459
|
+
### Clusters detectados
|
|
460
|
+
| Cluster | Tasks | Archivos |
|
|
461
|
+
|---------|-------|----------|
|
|
462
|
+
| A | task1 | src/logger/LoggerInterface.ts |
|
|
463
|
+
| B | task2 | src/logger/ConsoleLogger.ts |
|
|
464
|
+
| C | task3 | src/auth/auth.ts |
|
|
465
|
+
| D | task4 | src/payments/payments.ts |
|
|
466
|
+
|
|
467
|
+
### Dependencias secuenciales
|
|
468
|
+
- task2 depende de task1 (necesita la interfaz definida)
|
|
469
|
+
- task3 depende de task1 (necesita la interfaz definida)
|
|
470
|
+
- task4 depende de task1 (necesita la interfaz definida)
|
|
471
|
+
|
|
472
|
+
### Razón principal
|
|
473
|
+
[Regla 2a]: 4 clusters pero hay dependencias secuenciales entre ellos sin contrato explícito → INLINE
|
|
474
|
+
|
|
475
|
+
### Estimación
|
|
476
|
+
~80 líneas en 4 archivos
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Validación
|
|
480
|
+
- [ ] Las dependencias secuenciales se detectan correctamente
|
|
481
|
+
- [ ] La razón explica por qué no se puede paralelizar
|
|
482
|
+
- [ ] El usuario entiende que debe ejecutarse en orden secuencial
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
## Ejecución de tests
|
|
487
|
+
|
|
488
|
+
### Test automatizado de configuración
|
|
489
|
+
```bash
|
|
490
|
+
bash assets/tests/validate-config.sh
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### Test manual de comportamiento
|
|
494
|
+
1. Iniciar OpenCode con Ostacky
|
|
495
|
+
2. Ejecutar cada escenario
|
|
496
|
+
3. Verificar cada checkbox de validación
|
|
497
|
+
4. Reportar resultados en `assets/tests/results.md`
|
|
498
|
+
|
|
499
|
+
### Criterio de éxito
|
|
500
|
+
- Todos los tests automatizados pasan
|
|
501
|
+
- Todos los escenarios manuales pasan
|
|
502
|
+
- No hay regressions en flujos existentes
|