elsabro 5.1.0 → 6.0.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.
- package/agents/elsabro-executor.md +25 -0
- package/agents/elsabro-planner.md +10 -0
- package/commands/elsabro/debug.md +18 -0
- package/commands/elsabro/design-ui.md +19 -0
- package/commands/elsabro/execute.md +179 -3
- package/commands/elsabro/new.md +23 -0
- package/commands/elsabro/plan.md +55 -0
- package/commands/elsabro/quick.md +37 -0
- package/commands/elsabro/research-phase.md +18 -0
- package/commands/elsabro/start.md +23 -0
- package/commands/elsabro/verify-work.md +29 -0
- package/flow-engine/package.json +13 -0
- package/flow-engine/src/checkpoint.js +112 -0
- package/flow-engine/src/executors.js +406 -0
- package/flow-engine/src/graph.js +129 -0
- package/flow-engine/src/index.js +137 -0
- package/flow-engine/src/runner.js +184 -0
- package/flow-engine/src/template.js +290 -0
- package/flow-engine/tests/executors-complex.test.js +300 -0
- package/flow-engine/tests/executors.test.js +326 -0
- package/flow-engine/tests/graph.test.js +161 -0
- package/flow-engine/tests/integration.test.js +251 -0
- package/flow-engine/tests/runner.test.js +289 -0
- package/flow-engine/tests/template.test.js +272 -0
- package/flows/development-flow.json +134 -1
- package/package.json +4 -3
|
@@ -69,6 +69,31 @@ CHECKPOINT (preguntar):
|
|
|
69
69
|
```
|
|
70
70
|
</critical_rules>
|
|
71
71
|
|
|
72
|
+
<skill_awareness>
|
|
73
|
+
## Skill Awareness
|
|
74
|
+
|
|
75
|
+
### Si recibes skills en tu contexto (seccion "SKILLS DE REFERENCIA"):
|
|
76
|
+
|
|
77
|
+
1. **Lee las guias ANTES de implementar** — los skills contienen patrones verificados
|
|
78
|
+
2. **Sigue la estructura de archivos sugerida** en `<project_structure>`
|
|
79
|
+
3. **Usa los pre-requisitos** de `<pre_requisites>` para verificar dependencias
|
|
80
|
+
4. **Aplica los patrones de codigo** de las secciones de implementacion
|
|
81
|
+
5. **En tu output, menciona que skill usaste** para cada decision
|
|
82
|
+
|
|
83
|
+
### Si NO recibes skills pero la tarea parece relevante:
|
|
84
|
+
|
|
85
|
+
1. Busca en `skills/` con Glob("skills/*.md") por archivos relevantes
|
|
86
|
+
2. Lee el archivo con Read() y usa como referencia
|
|
87
|
+
3. Prioriza skills de: auth, database, testing, api
|
|
88
|
+
|
|
89
|
+
### Keywords que activan busqueda de skills:
|
|
90
|
+
- auth/login/registro → skills/auth-setup.md
|
|
91
|
+
- database/db/prisma → skills/database-setup.md
|
|
92
|
+
- test/testing/jest → skills/testing-setup.md
|
|
93
|
+
- api/endpoint/rest → skills/api-setup.md
|
|
94
|
+
- payments/stripe → skills/payments-setup.md
|
|
95
|
+
</skill_awareness>
|
|
96
|
+
|
|
72
97
|
<execution_flow>
|
|
73
98
|
## Flujo de Ejecución
|
|
74
99
|
|
|
@@ -46,6 +46,16 @@ Cada tarea debe:
|
|
|
46
46
|
- Generar un commit significativo
|
|
47
47
|
</critical_rules>
|
|
48
48
|
|
|
49
|
+
<skill_awareness>
|
|
50
|
+
## Skill Awareness (Planner)
|
|
51
|
+
|
|
52
|
+
Si recibes skills en tu contexto:
|
|
53
|
+
1. Referencia los skills relevantes en el PLAN.md que crees
|
|
54
|
+
2. Usa las estructuras de archivos sugeridas por los skills
|
|
55
|
+
3. Incorpora los pre-requisitos como dependencias del plan
|
|
56
|
+
4. Menciona que skill aplica a cada tarea del plan
|
|
57
|
+
</skill_awareness>
|
|
58
|
+
|
|
49
59
|
<research_first>
|
|
50
60
|
## Protocolo: Research-Before-Plan
|
|
51
61
|
|
|
@@ -38,6 +38,24 @@ sync:
|
|
|
38
38
|
- Establecer `state.suggested_next = "verify-work"`
|
|
39
39
|
</state_sync>
|
|
40
40
|
|
|
41
|
+
<skill_discovery>
|
|
42
|
+
## Skill Discovery (Pre-Debug)
|
|
43
|
+
|
|
44
|
+
**ANTES de investigar el problema**, descubrir skills de debugging relevantes:
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
// Ejecutar skill discovery enfocado en debugging
|
|
48
|
+
const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "debug ${inputs.problem || args}" "medium"`, { timeout: 30000 });
|
|
49
|
+
|
|
50
|
+
// Guardar en estado
|
|
51
|
+
state.context = state.context || {};
|
|
52
|
+
state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
|
|
53
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Skills de testing, sentry, profiling y debugging pueden acelerar la investigación.
|
|
57
|
+
</skill_discovery>
|
|
58
|
+
|
|
41
59
|
<objective>
|
|
42
60
|
Investigar y resolver bugs usando el método científico, no adivinando.
|
|
43
61
|
|
|
@@ -4,6 +4,7 @@ description: Diseñar interfaces visuales con Stitch AI - genera screens y mocku
|
|
|
4
4
|
allowed-tools:
|
|
5
5
|
- Read
|
|
6
6
|
- Write
|
|
7
|
+
- Bash
|
|
7
8
|
- Task
|
|
8
9
|
- TaskCreate
|
|
9
10
|
- TaskUpdate
|
|
@@ -98,6 +99,24 @@ Write(".elsabro/context.md", generateHumanReadableContext(state));
|
|
|
98
99
|
```
|
|
99
100
|
</state_sync>
|
|
100
101
|
|
|
102
|
+
<skill_discovery>
|
|
103
|
+
## Skill Discovery (Pre-Design)
|
|
104
|
+
|
|
105
|
+
**ANTES de diseñar**, descubrir skills de UI relevantes:
|
|
106
|
+
|
|
107
|
+
```javascript
|
|
108
|
+
// Ejecutar skill discovery enfocado en UI/design
|
|
109
|
+
const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "design ui ${inputs.task || args}" "medium"`, { timeout: 30000 });
|
|
110
|
+
|
|
111
|
+
// Guardar en estado
|
|
112
|
+
state.context = state.context || {};
|
|
113
|
+
state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
|
|
114
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Skills de stitch-ui-design, frontend-design y component libraries informan las decisiones de diseño.
|
|
118
|
+
</skill_discovery>
|
|
119
|
+
|
|
101
120
|
<objective>
|
|
102
121
|
Diseñar interfaces visuales usando **Stitch AI** como motor de generación. Convierte descripciones de texto o requerimientos de fase en screens visuales profesionales.
|
|
103
122
|
|
|
@@ -139,6 +139,74 @@ Write(".elsabro/context.md", generateHumanReadableContext(state));
|
|
|
139
139
|
```
|
|
140
140
|
</state_sync>
|
|
141
141
|
|
|
142
|
+
<skill_discovery>
|
|
143
|
+
## Skill Discovery (Pre-Execution)
|
|
144
|
+
|
|
145
|
+
**ANTES de ejecutar el plan**, descubrir skills para el stack:
|
|
146
|
+
|
|
147
|
+
```javascript
|
|
148
|
+
// Ejecutar skill discovery con la tarea
|
|
149
|
+
const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "${inputs.task || state.context.current_feature || ''}" "medium"`, { timeout: 30000 });
|
|
150
|
+
|
|
151
|
+
// Guardar en estado
|
|
152
|
+
state.context = state.context || {};
|
|
153
|
+
state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
|
|
154
|
+
|
|
155
|
+
// Informar al usuario
|
|
156
|
+
if (state.context.available_skills.length > 0) {
|
|
157
|
+
output(`Skills cargados: ${state.context.available_skills.map(s => s.name).join(", ")}`);
|
|
158
|
+
}
|
|
159
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Los skills proveen patrones de código verificados, configuraciones de setup, y guides de integración durante la implementación.
|
|
163
|
+
</skill_discovery>
|
|
164
|
+
|
|
165
|
+
<skill_injection>
|
|
166
|
+
## Skill Injection (OBLIGATORIO despues de Discovery)
|
|
167
|
+
|
|
168
|
+
**Si skill discovery encontro skills relevantes, CARGAR su contenido como contexto.**
|
|
169
|
+
|
|
170
|
+
```javascript
|
|
171
|
+
// 1. Obtener skills recomendados
|
|
172
|
+
const recommendedSkills = state.context.available_skills || [];
|
|
173
|
+
|
|
174
|
+
if (recommendedSkills.length > 0) {
|
|
175
|
+
// 2. Cargar contenido de los top-3 skills con match
|
|
176
|
+
const loadedSkills = [];
|
|
177
|
+
for (const skill of recommendedSkills.slice(0, 3)) {
|
|
178
|
+
const content = Read(`skills/${skill.id}.md`);
|
|
179
|
+
if (content) {
|
|
180
|
+
loadedSkills.push({
|
|
181
|
+
name: skill.id,
|
|
182
|
+
content: content
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// 3. Guardar skills cargados en state
|
|
188
|
+
state.context.loaded_skills = loadedSkills;
|
|
189
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
190
|
+
|
|
191
|
+
// 4. Informar al usuario
|
|
192
|
+
output(`Skills cargados para esta ejecucion:`);
|
|
193
|
+
loadedSkills.forEach(s => output(` - ${s.name}`));
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**GATE**: Cuando lances agentes executors, INCLUIR los skills en el prompt:
|
|
198
|
+
```
|
|
199
|
+
Si state.context.loaded_skills tiene contenido, agregar al prompt de CADA executor:
|
|
200
|
+
|
|
201
|
+
"SKILLS DE REFERENCIA:
|
|
202
|
+
[Para cada skill cargado:]
|
|
203
|
+
### Skill: {name}
|
|
204
|
+
{contenido del archivo .md}
|
|
205
|
+
|
|
206
|
+
Usa estos skills como guia de patrones, estructura y mejores practicas."
|
|
207
|
+
```
|
|
208
|
+
</skill_injection>
|
|
209
|
+
|
|
142
210
|
<objective>
|
|
143
211
|
Ejecutar planes de una fase con:
|
|
144
212
|
- **Sistema de Tasks para tracking real** de waves y dependencias
|
|
@@ -505,6 +573,41 @@ Para cada wave:
|
|
|
505
573
|
TaskUpdate({ taskId: "wave-W-id", status: "in_progress" })
|
|
506
574
|
```
|
|
507
575
|
|
|
576
|
+
<IMPERATIVO_AGENT_TEAMS>
|
|
577
|
+
## ⛔ STOP — LEER ANTES DE LANZAR AGENTES PARALELOS
|
|
578
|
+
|
|
579
|
+
**REGLA NO NEGOCIABLE (Rule 8):** Si vas a lanzar 2+ Task() para implementacion o review:
|
|
580
|
+
|
|
581
|
+
1. **PRIMERO** → `TeamCreate({ team_name: "elsabro-impl", description: "..." })`
|
|
582
|
+
2. **DESPUES** → `Task({ ..., team_name: "elsabro-impl", name: "executor-1" })`
|
|
583
|
+
3. **AL FINAL** → `SendMessage({ type: "shutdown_request", ... })` para CADA teammate
|
|
584
|
+
4. **ULTIMO** → `TeamDelete()`
|
|
585
|
+
|
|
586
|
+
**Si ya lanzaste Task() sin TeamCreate: DETENTE AHORA. No continúes.**
|
|
587
|
+
Vuelve arriba, crea el team, y relanza los agentes CON team_name.
|
|
588
|
+
|
|
589
|
+
**NUNCA hagas esto:**
|
|
590
|
+
```javascript
|
|
591
|
+
// ⛔ PROHIBIDO — bare Task() sin team
|
|
592
|
+
Task({ subagent_type: "elsabro-executor", prompt: "..." })
|
|
593
|
+
Task({ subagent_type: "elsabro-qa", prompt: "..." })
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
**SIEMPRE haz esto:**
|
|
597
|
+
```javascript
|
|
598
|
+
// ✅ CORRECTO — con Agent Team
|
|
599
|
+
TeamCreate({ team_name: "elsabro-impl", description: "Implementation" })
|
|
600
|
+
Task({ subagent_type: "elsabro-executor", team_name: "elsabro-impl", name: "executor-1", prompt: "..." })
|
|
601
|
+
Task({ subagent_type: "elsabro-qa", team_name: "elsabro-impl", name: "qa-1", prompt: "..." })
|
|
602
|
+
// ... al completar ...
|
|
603
|
+
SendMessage({ type: "shutdown_request", recipient: "executor-1", content: "Done" })
|
|
604
|
+
SendMessage({ type: "shutdown_request", recipient: "qa-1", content: "Done" })
|
|
605
|
+
TeamDelete()
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
**Excepcion UNICA:** Exploracion read-only con HAIKU (Paso 0) puede usar subagents sueltos.
|
|
609
|
+
</IMPERATIVO_AGENT_TEAMS>
|
|
610
|
+
|
|
508
611
|
### Si hay múltiples planes en la wave → Paralelo (OPUS)
|
|
509
612
|
```javascript
|
|
510
613
|
// Marcar todos los planes como in_progress
|
|
@@ -525,13 +628,20 @@ Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
|
525
628
|
|
|
526
629
|
// Lanzar teammates OPUS en paralelo (UN SOLO MENSAJE)
|
|
527
630
|
// MODELO: OPUS porque escriben código
|
|
631
|
+
// SKILLS: Incluir loaded_skills en CADA prompt de executor
|
|
632
|
+
const skillContext = state.context.loaded_skills?.length > 0
|
|
633
|
+
? '\n\n## SKILLS DE REFERENCIA\n' + state.context.loaded_skills.map(s =>
|
|
634
|
+
'### Skill: ' + s.name + '\n' + s.content
|
|
635
|
+
).join('\n\n---\n\n') + '\n\nUsa los skills como referencia de patrones y estructura de archivos.'
|
|
636
|
+
: '';
|
|
637
|
+
|
|
528
638
|
Task({
|
|
529
639
|
subagent_type: "elsabro-executor",
|
|
530
640
|
model: "opus", // ← OPUS para implementación
|
|
531
641
|
team_name: "elsabro-impl",
|
|
532
642
|
name: "executor-1",
|
|
533
643
|
description: "Ejecutar Plan A",
|
|
534
|
-
prompt:
|
|
644
|
+
prompt: `Implementa el Plan A siguiendo TDD.${skillContext}`
|
|
535
645
|
}) |
|
|
536
646
|
Task({
|
|
537
647
|
subagent_type: "elsabro-executor",
|
|
@@ -539,7 +649,7 @@ Task({
|
|
|
539
649
|
team_name: "elsabro-impl",
|
|
540
650
|
name: "executor-2",
|
|
541
651
|
description: "Ejecutar Plan B",
|
|
542
|
-
prompt:
|
|
652
|
+
prompt: `Implementa el Plan B siguiendo TDD.${skillContext}`
|
|
543
653
|
}) |
|
|
544
654
|
Task({
|
|
545
655
|
subagent_type: "elsabro-executor",
|
|
@@ -547,7 +657,7 @@ Task({
|
|
|
547
657
|
team_name: "elsabro-impl",
|
|
548
658
|
name: "executor-3",
|
|
549
659
|
description: "Ejecutar Plan C",
|
|
550
|
-
prompt:
|
|
660
|
+
prompt: `Implementa el Plan C siguiendo TDD.${skillContext}`
|
|
551
661
|
})
|
|
552
662
|
|
|
553
663
|
// Al completar cada plan
|
|
@@ -740,6 +850,29 @@ Cuando termines, dime si funcionó o qué problemas encontraste.
|
|
|
740
850
|
|
|
741
851
|
</process>
|
|
742
852
|
|
|
853
|
+
<agent_teams_cleanup>
|
|
854
|
+
## Agent Teams Cleanup (OBLIGATORIO)
|
|
855
|
+
|
|
856
|
+
**Al completar TODAS las fases de implementacion y review:**
|
|
857
|
+
|
|
858
|
+
```javascript
|
|
859
|
+
// 1. Shutdown CADA teammate por nombre
|
|
860
|
+
const teammates = ["executor-1", "executor-2", "executor-3", "reviewer-1", "reviewer-2", "reviewer-3"];
|
|
861
|
+
for (const name of teammates) {
|
|
862
|
+
SendMessage({ type: "shutdown_request", recipient: name, content: "All phases complete" });
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
// 2. Eliminar team
|
|
866
|
+
TeamDelete();
|
|
867
|
+
|
|
868
|
+
// 3. Registrar en state
|
|
869
|
+
state.current_flow.agent_teams_cleanup = true;
|
|
870
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
871
|
+
```
|
|
872
|
+
|
|
873
|
+
**GATE**: No mostrar "Siguiente Paso" si agent_teams_cleanup !== true y hubo 2+ agentes.
|
|
874
|
+
</agent_teams_cleanup>
|
|
875
|
+
|
|
743
876
|
<code_review_gate>
|
|
744
877
|
## Code Review Gate (OBLIGATORIO - NO NEGOCIABLE)
|
|
745
878
|
|
|
@@ -763,6 +896,30 @@ Cuando termines, dime si funcionó o qué problemas encontraste.
|
|
|
763
896
|
<siguiente_paso>
|
|
764
897
|
## Siguiente Paso
|
|
765
898
|
|
|
899
|
+
### Self-Check (OBLIGATORIO antes de reportar resultado)
|
|
900
|
+
|
|
901
|
+
Antes de mostrar "Siguiente Paso", verifica CADA UNO de estos items:
|
|
902
|
+
|
|
903
|
+
```
|
|
904
|
+
[ ] Si lance 2+ Task() en paralelo → ¿use TeamCreate primero?
|
|
905
|
+
SI: Continuar
|
|
906
|
+
NO: DETENERME. Crear team y relanzar.
|
|
907
|
+
|
|
908
|
+
[ ] Si descubri skills relevantes → ¿los cargue con Read() y los pase al executor?
|
|
909
|
+
SI: Continuar
|
|
910
|
+
NO: DETENERME. Cargar skills y re-ejecutar.
|
|
911
|
+
|
|
912
|
+
[ ] Si escribi/modifique codigo → ¿ejecute code review?
|
|
913
|
+
SI: Continuar
|
|
914
|
+
NO: DETENERME. Ejecutar code review.
|
|
915
|
+
|
|
916
|
+
[ ] Si use Agent Teams → ¿ejecute SendMessage(shutdown) + TeamDelete?
|
|
917
|
+
SI: Continuar
|
|
918
|
+
NO: DETENERME. Hacer cleanup.
|
|
919
|
+
```
|
|
920
|
+
|
|
921
|
+
**Si alguna respuesta es NO: NO mostrar siguiente paso. Corregir primero.**
|
|
922
|
+
|
|
766
923
|
Al completar, establecer en state.json:
|
|
767
924
|
```javascript
|
|
768
925
|
// GATE CHECK 1: No escribir suggested_next sin code review
|
|
@@ -1214,3 +1371,22 @@ Al completar un plan:
|
|
|
1214
1371
|
- [x] Tests: npm run test
|
|
1215
1372
|
```
|
|
1216
1373
|
</summary_creation>
|
|
1374
|
+
|
|
1375
|
+
<engine_integration>
|
|
1376
|
+
## Flow Engine (v6.0.0)
|
|
1377
|
+
|
|
1378
|
+
The flow engine runtime is available at `flow-engine/src/index.js`.
|
|
1379
|
+
It can parse and execute `flows/development-flow.json`.
|
|
1380
|
+
|
|
1381
|
+
Current status: Engine handles implemented nodes (19/42).
|
|
1382
|
+
Not-implemented nodes throw NotImplementedError with gap descriptions.
|
|
1383
|
+
|
|
1384
|
+
For full engine-driven execution (future):
|
|
1385
|
+
```javascript
|
|
1386
|
+
const { FlowEngine } = require('./flow-engine/src/index.js');
|
|
1387
|
+
const flow = require('./flows/development-flow.json');
|
|
1388
|
+
const engine = new FlowEngine({ callbacks: { onAgent, onBash, onInterrupt, onCheckpoint, onParallel, onTeamRequired } });
|
|
1389
|
+
engine.loadFlow(flow);
|
|
1390
|
+
const result = await engine.run({ task, profile, complexity }, callbacks);
|
|
1391
|
+
```
|
|
1392
|
+
</engine_integration>
|
package/commands/elsabro/new.md
CHANGED
|
@@ -38,6 +38,29 @@ sync:
|
|
|
38
38
|
- Establecer `state.context.suggested_args = "1"` para la primera fase
|
|
39
39
|
</state_sync>
|
|
40
40
|
|
|
41
|
+
<skill_discovery>
|
|
42
|
+
## Skill Discovery (Pre-Work)
|
|
43
|
+
|
|
44
|
+
**DESPUÉS de saber qué quiere crear el usuario**, descubrir skills del stack:
|
|
45
|
+
|
|
46
|
+
```javascript
|
|
47
|
+
// Ejecutar skill discovery con el tipo de proyecto
|
|
48
|
+
const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "${inputs.projectType || args}" "medium"`, { timeout: 30000 });
|
|
49
|
+
|
|
50
|
+
// Guardar en estado
|
|
51
|
+
state.context = state.context || {};
|
|
52
|
+
state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
|
|
53
|
+
|
|
54
|
+
// Informar al usuario
|
|
55
|
+
if (state.context.available_skills.length > 0) {
|
|
56
|
+
output(`Skills para tu proyecto: ${state.context.available_skills.map(s => s.name).join(", ")}`);
|
|
57
|
+
}
|
|
58
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Estos skills guían la configuración inicial del proyecto (nextjs-app, expo-app, auth-setup, etc.).
|
|
62
|
+
</skill_discovery>
|
|
63
|
+
|
|
41
64
|
<objective>
|
|
42
65
|
Crear un proyecto nuevo con investigación previa, configuración correcta, y estructura lista para desarrollo.
|
|
43
66
|
|
package/commands/elsabro/plan.md
CHANGED
|
@@ -11,6 +11,9 @@ allowed-tools:
|
|
|
11
11
|
- TaskCreate
|
|
12
12
|
- TaskUpdate
|
|
13
13
|
- TaskList
|
|
14
|
+
- TeamCreate
|
|
15
|
+
- TeamDelete
|
|
16
|
+
- SendMessage
|
|
14
17
|
- WebSearch
|
|
15
18
|
- AskUserQuestion
|
|
16
19
|
- mcp__plugin_context7_context7__*
|
|
@@ -134,6 +137,58 @@ Write(".elsabro/context.md", generateHumanReadableContext(state));
|
|
|
134
137
|
```
|
|
135
138
|
</state_sync>
|
|
136
139
|
|
|
140
|
+
<skill_discovery>
|
|
141
|
+
## Skill Discovery (Pre-Planning)
|
|
142
|
+
|
|
143
|
+
**ANTES de explorar el codebase**, descubrir skills relevantes para la tarea:
|
|
144
|
+
|
|
145
|
+
```javascript
|
|
146
|
+
// Ejecutar skill discovery con la descripción de la tarea
|
|
147
|
+
const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "${inputs.task || args}" "medium"`, { timeout: 30000 });
|
|
148
|
+
|
|
149
|
+
// Guardar en estado
|
|
150
|
+
state.context = state.context || {};
|
|
151
|
+
state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
|
|
152
|
+
|
|
153
|
+
// Informar al usuario
|
|
154
|
+
if (state.context.available_skills.length > 0) {
|
|
155
|
+
output(`Skills relevantes: ${state.context.available_skills.map(s => s.name).join(", ")}`);
|
|
156
|
+
}
|
|
157
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Los skills descubiertos informan la fase de research (Context7 queries) y la creación del PLAN.md.
|
|
161
|
+
</skill_discovery>
|
|
162
|
+
|
|
163
|
+
<skill_injection>
|
|
164
|
+
## Skill Injection (Para Planificacion)
|
|
165
|
+
|
|
166
|
+
Despues de skill discovery, cargar skills relevantes para informar al planner:
|
|
167
|
+
|
|
168
|
+
```javascript
|
|
169
|
+
const recommendedSkills = state.context.available_skills || [];
|
|
170
|
+
if (recommendedSkills.length > 0) {
|
|
171
|
+
const loadedSkills = [];
|
|
172
|
+
for (const skill of recommendedSkills.slice(0, 3)) {
|
|
173
|
+
const content = Read(`skills/${skill.id}.md`);
|
|
174
|
+
if (content) {
|
|
175
|
+
loadedSkills.push({ name: skill.id, content: content });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
state.context.loaded_skills = loadedSkills;
|
|
179
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Al lanzar el planner OPUS**: Incluir skills como contexto:
|
|
184
|
+
```
|
|
185
|
+
"Skills disponibles para esta tarea:
|
|
186
|
+
${loadedSkills.map(s => '- ' + s.name + ': ' + s.content.slice(0, 200)).join('\n')}
|
|
187
|
+
|
|
188
|
+
Referencia estos skills en tu plan cuando aplique."
|
|
189
|
+
```
|
|
190
|
+
</skill_injection>
|
|
191
|
+
|
|
137
192
|
<objective>
|
|
138
193
|
Crear un plan ejecutable para una fase o feature, con investigación previa usando Context7 y WebSearch.
|
|
139
194
|
|
|
@@ -26,6 +26,43 @@ sync:
|
|
|
26
26
|
- Establecer `state.suggested_next = "progress"` en state.json
|
|
27
27
|
</state_sync>
|
|
28
28
|
|
|
29
|
+
<skill_discovery>
|
|
30
|
+
## Skill Discovery (Quick)
|
|
31
|
+
|
|
32
|
+
**Descubrir skills relevantes** para el fix rápido:
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
// Ejecutar skill discovery (rápido, usa cache)
|
|
36
|
+
const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "${inputs.task || args}" "low"`, { timeout: 15000 });
|
|
37
|
+
|
|
38
|
+
// Guardar en estado
|
|
39
|
+
state.context = state.context || {};
|
|
40
|
+
state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
|
|
41
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
42
|
+
```
|
|
43
|
+
</skill_discovery>
|
|
44
|
+
|
|
45
|
+
<skill_injection>
|
|
46
|
+
## Skill Injection (Quick)
|
|
47
|
+
|
|
48
|
+
Si discovery encontro skills relevantes, cargar el top-1 skill como referencia rapida:
|
|
49
|
+
|
|
50
|
+
```javascript
|
|
51
|
+
const skills = state.context.available_skills || [];
|
|
52
|
+
if (skills.length > 0) {
|
|
53
|
+
const topSkill = Read(`skills/${skills[0].id}.md`);
|
|
54
|
+
if (topSkill) {
|
|
55
|
+
state.context.loaded_skills = [{ name: skills[0].id, content: topSkill }];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Incluir en el prompt del agente quick:
|
|
61
|
+
```
|
|
62
|
+
"Skill de referencia: ${topSkill ? topSkill.name : 'ninguno'}"
|
|
63
|
+
```
|
|
64
|
+
</skill_injection>
|
|
65
|
+
|
|
29
66
|
<command-name>quick</command-name>
|
|
30
67
|
|
|
31
68
|
## Propósito
|
|
@@ -24,6 +24,24 @@ sync:
|
|
|
24
24
|
- Establecer `state.suggested_next = "plan"`
|
|
25
25
|
</state_sync>
|
|
26
26
|
|
|
27
|
+
<skill_discovery>
|
|
28
|
+
## Skill Discovery (Pre-Research)
|
|
29
|
+
|
|
30
|
+
**ANTES de investigar**, descubrir skills relevantes para las tecnologías:
|
|
31
|
+
|
|
32
|
+
```javascript
|
|
33
|
+
// Ejecutar skill discovery con el tema de research
|
|
34
|
+
const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "research ${inputs.phase || args}" "medium"`, { timeout: 30000 });
|
|
35
|
+
|
|
36
|
+
// Guardar en estado
|
|
37
|
+
state.context = state.context || {};
|
|
38
|
+
state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
|
|
39
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Los skills informan qué tecnologías investigar y qué patrones buscar en Context7.
|
|
43
|
+
</skill_discovery>
|
|
44
|
+
|
|
27
45
|
<command-name>research-phase</command-name>
|
|
28
46
|
|
|
29
47
|
## Propósito
|
|
@@ -49,6 +49,29 @@ allowed-tools:
|
|
|
49
49
|
- Menos de 2 agentes para detección = **ABORTAR**
|
|
50
50
|
</enforcement>
|
|
51
51
|
|
|
52
|
+
<skill_discovery>
|
|
53
|
+
## Skill Discovery (Pre-Work)
|
|
54
|
+
|
|
55
|
+
**DESPUÉS de detectar contexto**, descubrir skills relevantes para la tarea:
|
|
56
|
+
|
|
57
|
+
```javascript
|
|
58
|
+
// Ejecutar skill discovery (usa cache de 1 hora)
|
|
59
|
+
const discoveryResult = Bash(`bash ./hooks/skill-discovery.sh "${inputs.task || 'detect project'}" "medium"`, { timeout: 30000 });
|
|
60
|
+
|
|
61
|
+
// Guardar en estado
|
|
62
|
+
state.context = state.context || {};
|
|
63
|
+
state.context.available_skills = JSON.parse(discoveryResult).recommended || [];
|
|
64
|
+
|
|
65
|
+
// Informar al usuario si hay skills relevantes
|
|
66
|
+
if (state.context.available_skills.length > 0) {
|
|
67
|
+
output(`Skills detectados: ${state.context.available_skills.map(s => s.name).join(", ")}`);
|
|
68
|
+
}
|
|
69
|
+
Write(".elsabro/state.json", JSON.stringify(state, null, 2));
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Los skills descubiertos se pasan al comando siguiente (plan, execute, etc.) para informar patrones y configuraciones.
|
|
73
|
+
</skill_discovery>
|
|
74
|
+
|
|
52
75
|
<objective>
|
|
53
76
|
Eres el **orquestador principal** de ELSABRO. Tu trabajo es:
|
|
54
77
|
|
|
@@ -324,6 +324,19 @@ Agrega verificaciones extra:
|
|
|
324
324
|
- Compatible con CI/CD pipelines
|
|
325
325
|
- Genera reporte en `.planning/VERIFICATION-REPORT.md`
|
|
326
326
|
|
|
327
|
+
<IMPERATIVO_AGENT_TEAMS>
|
|
328
|
+
## ⛔ STOP — ANTES DE LANZAR REVIEWERS PARALELOS
|
|
329
|
+
|
|
330
|
+
**REGLA NO NEGOCIABLE (Rule 8):** Los 3 reviewers DEBEN ejecutarse como Agent Team.
|
|
331
|
+
|
|
332
|
+
1. **PRIMERO** → `TeamCreate({ team_name: "elsabro-verify", description: "Verification team" })`
|
|
333
|
+
2. **DESPUES** → `Task({ ..., team_name: "elsabro-verify", name: "reviewer-N" })` x3
|
|
334
|
+
3. **AL FINAL** → `SendMessage({ type: "shutdown_request", ... })` x3
|
|
335
|
+
4. **ULTIMO** → `TeamDelete()`
|
|
336
|
+
|
|
337
|
+
**NUNCA lances 3 Task() de review sin TeamCreate previo.**
|
|
338
|
+
</IMPERATIVO_AGENT_TEAMS>
|
|
339
|
+
|
|
327
340
|
<parallel_coordination>
|
|
328
341
|
## Coordinación de Verificación Paralela
|
|
329
342
|
|
|
@@ -612,6 +625,22 @@ TaskCreate({
|
|
|
612
625
|
<siguiente_paso>
|
|
613
626
|
## Siguiente Paso
|
|
614
627
|
|
|
628
|
+
### Self-Check (OBLIGATORIO antes de reportar resultado)
|
|
629
|
+
|
|
630
|
+
Antes de mostrar "Siguiente Paso", verifica CADA UNO de estos items:
|
|
631
|
+
|
|
632
|
+
```
|
|
633
|
+
[ ] Si lance 2+ Task() en paralelo → ¿use TeamCreate primero?
|
|
634
|
+
SI: Continuar
|
|
635
|
+
NO: DETENERME. Crear team y relanzar.
|
|
636
|
+
|
|
637
|
+
[ ] Si use Agent Teams → ¿ejecute SendMessage(shutdown) + TeamDelete?
|
|
638
|
+
SI: Continuar
|
|
639
|
+
NO: DETENERME. Hacer cleanup.
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
**Si alguna respuesta es NO: NO mostrar siguiente paso. Corregir primero.**
|
|
643
|
+
|
|
615
644
|
Al completar, establecer en state.json:
|
|
616
645
|
```javascript
|
|
617
646
|
// GATE CHECK: No proceder sin Agent Teams para fases con 2+ agentes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "elsabro-flow-engine",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Runtime engine for ELSABRO development-flow.json",
|
|
5
|
+
"main": "src/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "node --test tests/"
|
|
8
|
+
},
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=18.0.0"
|
|
11
|
+
},
|
|
12
|
+
"license": "MIT"
|
|
13
|
+
}
|