elsabro 3.8.2 → 4.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-orchestrator.md +124 -2
- package/bin/install.js +10 -11
- package/commands/elsabro/execute.md +164 -4
- package/flows/development-flow.json +183 -23
- package/hooks/hooks-config-updated.json +63 -101
- package/hooks/skill-discovery.sh +412 -385
- package/package.json +2 -2
- package/references/agent-teams-integration.md +313 -0
- package/references/flow-orchestration.md +70 -0
- package/templates/skill-marketplace-config.json +57 -358
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "development_flow",
|
|
3
3
|
"name": "Standard Development Flow",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "4.0.0",
|
|
5
5
|
"description": "Workflow completo para desarrollar features con quality gates",
|
|
6
6
|
|
|
7
7
|
"config": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"inputs": {
|
|
16
16
|
"task": { "type": "string", "required": true, "description": "Descripción de la tarea" },
|
|
17
17
|
"complexity": { "type": "enum", "values": ["low", "medium", "high"], "default": "medium" },
|
|
18
|
-
"profile": { "type": "enum", "values": ["default", "yolo", "careful"], "default": "default" }
|
|
18
|
+
"profile": { "type": "enum", "values": ["default", "yolo", "careful", "teams"], "default": "default" }
|
|
19
19
|
},
|
|
20
20
|
|
|
21
21
|
"outputs": {
|
|
@@ -31,6 +31,28 @@
|
|
|
31
31
|
{
|
|
32
32
|
"id": "start",
|
|
33
33
|
"type": "entry",
|
|
34
|
+
"next": "skill_discovery"
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
{
|
|
38
|
+
"id": "skill_discovery",
|
|
39
|
+
"type": "sequence",
|
|
40
|
+
"description": "Descubrir skills necesarios antes de cargar contexto",
|
|
41
|
+
"errorPolicy": "continue",
|
|
42
|
+
"steps": [
|
|
43
|
+
{
|
|
44
|
+
"action": "bash",
|
|
45
|
+
"command": "bash ./hooks/skill-discovery.sh \"{{inputs.task}}\" \"{{inputs.complexity}}\"",
|
|
46
|
+
"as": "discovery",
|
|
47
|
+
"timeout": 45000,
|
|
48
|
+
"captureExitCode": true
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"outputs": {
|
|
52
|
+
"discoveryResult": "{{steps.discovery.output}}",
|
|
53
|
+
"skillRecommendations": "{{steps.discovery.output.recommended.skills || []}}",
|
|
54
|
+
"installCommands": "{{steps.discovery.output.recommended.install_commands || []}}"
|
|
55
|
+
},
|
|
34
56
|
"next": "load_context"
|
|
35
57
|
},
|
|
36
58
|
|
|
@@ -47,6 +69,14 @@
|
|
|
47
69
|
{
|
|
48
70
|
"action": "load_memory",
|
|
49
71
|
"types": ["longTerm", "entity"]
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"action": "inject_state",
|
|
75
|
+
"data": {
|
|
76
|
+
"availableSkills": "{{nodes.skill_discovery.outputs.discoveryResult}}",
|
|
77
|
+
"skillRecommendations": "{{nodes.skill_discovery.outputs.skillRecommendations || []}}"
|
|
78
|
+
},
|
|
79
|
+
"optional": true
|
|
50
80
|
}
|
|
51
81
|
],
|
|
52
82
|
"next": "profile_router"
|
|
@@ -60,6 +90,7 @@
|
|
|
60
90
|
"routes": {
|
|
61
91
|
"yolo": "yolo_execute",
|
|
62
92
|
"careful": "careful_analyze",
|
|
93
|
+
"teams": "teams_spawn",
|
|
63
94
|
"default": "standard_analyze"
|
|
64
95
|
},
|
|
65
96
|
"default": "standard_analyze"
|
|
@@ -119,6 +150,92 @@
|
|
|
119
150
|
}
|
|
120
151
|
},
|
|
121
152
|
|
|
153
|
+
{
|
|
154
|
+
"id": "teams_spawn",
|
|
155
|
+
"type": "team",
|
|
156
|
+
"description": "Crear Agent Team para coordinación peer-to-peer",
|
|
157
|
+
"config": {
|
|
158
|
+
"team_name": "elsabro-{{inputs.task | slugify}}",
|
|
159
|
+
"description": "Agent Teams para: {{inputs.task}}"
|
|
160
|
+
},
|
|
161
|
+
"members": [
|
|
162
|
+
{
|
|
163
|
+
"name": "analyst",
|
|
164
|
+
"agent": "elsabro-analyst",
|
|
165
|
+
"role": "Analizar requisitos y diseñar solución",
|
|
166
|
+
"model": "opus"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"name": "planner",
|
|
170
|
+
"agent": "elsabro-planner",
|
|
171
|
+
"role": "Planificar implementación con waves",
|
|
172
|
+
"model": "opus"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"name": "executor",
|
|
176
|
+
"agent": "elsabro-executor",
|
|
177
|
+
"role": "Implementar código con TDD",
|
|
178
|
+
"model": "opus"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"name": "qa",
|
|
182
|
+
"agent": "elsabro-qa",
|
|
183
|
+
"role": "Testing y quality assurance",
|
|
184
|
+
"model": "opus"
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"name": "verifier",
|
|
188
|
+
"agent": "elsabro-verifier",
|
|
189
|
+
"role": "Verificación final y code review",
|
|
190
|
+
"model": "opus"
|
|
191
|
+
}
|
|
192
|
+
],
|
|
193
|
+
"phases": [
|
|
194
|
+
{
|
|
195
|
+
"id": "team_analyze",
|
|
196
|
+
"name": "Analysis",
|
|
197
|
+
"active_members": ["analyst", "planner"],
|
|
198
|
+
"tasks": "Analizar y planificar: {{inputs.task}}"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"id": "team_implement",
|
|
202
|
+
"name": "Implementation",
|
|
203
|
+
"active_members": ["executor", "qa"],
|
|
204
|
+
"tasks": "Implementar con TDD según plan del analyst"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"id": "team_review",
|
|
208
|
+
"name": "Review",
|
|
209
|
+
"active_members": ["verifier"],
|
|
210
|
+
"tasks": "Code review bloqueante - 0 issues para pasar"
|
|
211
|
+
}
|
|
212
|
+
],
|
|
213
|
+
"cleanup": true,
|
|
214
|
+
"onError": "interrupt_teams_failed",
|
|
215
|
+
"next": "quality_gate"
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
{
|
|
219
|
+
"id": "interrupt_teams_failed",
|
|
220
|
+
"type": "interrupt",
|
|
221
|
+
"reason": "Agent Team creation or execution failed",
|
|
222
|
+
"display": {
|
|
223
|
+
"title": "⚠️ Agent Team Falló",
|
|
224
|
+
"content": "El equipo de agentes no pudo completar la tarea. Esto puede deberse a un agente que no respondió, un timeout, o un error de configuración.",
|
|
225
|
+
"errors": "{{state.lastError}}",
|
|
226
|
+
"options": [
|
|
227
|
+
{ "id": "retry", "label": "🔄 Reintentar con Agent Teams" },
|
|
228
|
+
{ "id": "fallback", "label": "📋 Usar subagents en su lugar" },
|
|
229
|
+
{ "id": "abort", "label": "❌ Abortar ejecución" }
|
|
230
|
+
]
|
|
231
|
+
},
|
|
232
|
+
"routes": {
|
|
233
|
+
"retry": "teams_spawn",
|
|
234
|
+
"fallback": "standard_analyze",
|
|
235
|
+
"abort": "end_cancelled"
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
|
|
122
239
|
{
|
|
123
240
|
"id": "standard_analyze",
|
|
124
241
|
"type": "parallel",
|
|
@@ -205,24 +322,28 @@
|
|
|
205
322
|
"id": "quality_gate",
|
|
206
323
|
"type": "sequence",
|
|
207
324
|
"description": "Quality gate: tests, types, lint",
|
|
325
|
+
"captureExitCode": true,
|
|
208
326
|
"steps": [
|
|
209
327
|
{
|
|
210
328
|
"action": "bash",
|
|
211
|
-
"command": "npm test 2>&1
|
|
329
|
+
"command": "npm test 2>&1; echo \"EXIT_CODE=$?\"",
|
|
212
330
|
"as": "tests",
|
|
213
|
-
"timeout": 120000
|
|
331
|
+
"timeout": 120000,
|
|
332
|
+
"captureExitCode": true
|
|
214
333
|
},
|
|
215
334
|
{
|
|
216
335
|
"action": "bash",
|
|
217
|
-
"command": "npx tsc --noEmit 2>&1
|
|
336
|
+
"command": "npx tsc --noEmit 2>&1; echo \"EXIT_CODE=$?\"",
|
|
218
337
|
"as": "typescript",
|
|
219
|
-
"timeout": 60000
|
|
338
|
+
"timeout": 60000,
|
|
339
|
+
"captureExitCode": true
|
|
220
340
|
},
|
|
221
341
|
{
|
|
222
342
|
"action": "bash",
|
|
223
|
-
"command": "npm run lint 2>&1
|
|
343
|
+
"command": "npm run lint 2>&1; echo \"EXIT_CODE=$?\"",
|
|
224
344
|
"as": "lint",
|
|
225
|
-
"timeout": 60000
|
|
345
|
+
"timeout": 60000,
|
|
346
|
+
"captureExitCode": true
|
|
226
347
|
}
|
|
227
348
|
],
|
|
228
349
|
"next": "quality_check"
|
|
@@ -231,8 +352,8 @@
|
|
|
231
352
|
{
|
|
232
353
|
"id": "quality_check",
|
|
233
354
|
"type": "condition",
|
|
234
|
-
"description": "Verificar si pasó quality gate",
|
|
235
|
-
"condition": "{{nodes.quality_gate.outputs.tests.exitCode === 0 && nodes.quality_gate.outputs.typescript.exitCode === 0}}",
|
|
355
|
+
"description": "Verificar si pasó quality gate (tests + typescript + lint)",
|
|
356
|
+
"condition": "{{nodes.quality_gate.outputs.tests.exitCode === 0 && nodes.quality_gate.outputs.typescript.exitCode === 0 && nodes.quality_gate.outputs.lint.exitCode === 0}}",
|
|
236
357
|
"true": "parallel_review",
|
|
237
358
|
"false": "fix_issues"
|
|
238
359
|
},
|
|
@@ -277,13 +398,11 @@
|
|
|
277
398
|
"attempts": "3",
|
|
278
399
|
"options": [
|
|
279
400
|
{ "id": "retry", "label": "Reintentar auto-fix" },
|
|
280
|
-
{ "id": "skip", "label": "Continuar sin fix" },
|
|
281
401
|
{ "id": "manual", "label": "Corregiré manualmente" }
|
|
282
402
|
]
|
|
283
403
|
},
|
|
284
404
|
"routes": {
|
|
285
405
|
"retry": "fix_issues",
|
|
286
|
-
"skip": "parallel_review",
|
|
287
406
|
"manual": "wait_manual_fix"
|
|
288
407
|
}
|
|
289
408
|
},
|
|
@@ -354,16 +473,57 @@
|
|
|
354
473
|
{
|
|
355
474
|
"id": "fix_review_issues",
|
|
356
475
|
"type": "agent",
|
|
357
|
-
"description": "Corregir issues del code review",
|
|
476
|
+
"description": "Corregir issues del code review - BLOCKING: no avanza hasta 0 errores",
|
|
358
477
|
"agent": "elsabro-executor",
|
|
359
478
|
"config": { "model": "opus" },
|
|
360
479
|
"inputs": {
|
|
361
|
-
"task": "Corregir issues del code review",
|
|
362
|
-
"issues": "{{nodes.parallel_review.outputs}}"
|
|
480
|
+
"task": "Corregir TODOS los issues del code review. No dejar ninguno pendiente.",
|
|
481
|
+
"issues": "{{nodes.parallel_review.outputs}}",
|
|
482
|
+
"iteration": "{{state.reviewIteration || 1}}",
|
|
483
|
+
"maxIterations": 5
|
|
363
484
|
},
|
|
364
485
|
"next": "parallel_review",
|
|
365
|
-
"maxIterations":
|
|
366
|
-
"onMaxIterations": "
|
|
486
|
+
"maxIterations": 5,
|
|
487
|
+
"onMaxIterations": "interrupt_blocked"
|
|
488
|
+
},
|
|
489
|
+
|
|
490
|
+
{
|
|
491
|
+
"id": "interrupt_blocked",
|
|
492
|
+
"type": "interrupt",
|
|
493
|
+
"reason": "Code review still has issues after 5 fix iterations - BLOCKED",
|
|
494
|
+
"display": {
|
|
495
|
+
"title": "🚫 BLOQUEADO: Code Review con Errores Pendientes",
|
|
496
|
+
"content": "Se han agotado 5 iteraciones de auto-fix y aún hay issues sin resolver.",
|
|
497
|
+
"errors": "{{nodes.parallel_review.outputs}}",
|
|
498
|
+
"iterations_used": 5,
|
|
499
|
+
"options": [
|
|
500
|
+
{ "id": "retry", "label": "🔄 Reintentar auto-fix (5 intentos más)" },
|
|
501
|
+
{ "id": "manual", "label": "👤 Corregiré manualmente" },
|
|
502
|
+
{ "id": "abort", "label": "❌ Abortar ejecución" }
|
|
503
|
+
]
|
|
504
|
+
},
|
|
505
|
+
"routes": {
|
|
506
|
+
"retry": "fix_review_issues",
|
|
507
|
+
"manual": "wait_manual_review_fix",
|
|
508
|
+
"abort": "end_cancelled"
|
|
509
|
+
}
|
|
510
|
+
},
|
|
511
|
+
|
|
512
|
+
{
|
|
513
|
+
"id": "wait_manual_review_fix",
|
|
514
|
+
"type": "interrupt",
|
|
515
|
+
"reason": "Waiting for manual fix of review issues",
|
|
516
|
+
"display": {
|
|
517
|
+
"title": "👤 Esperando Corrección Manual de Review Issues",
|
|
518
|
+
"content": "Corrige los issues listados y avísame cuando estés listo. El proceso NO avanzará hasta que todos los issues estén resueltos.",
|
|
519
|
+
"errors": "{{nodes.parallel_review.outputs}}",
|
|
520
|
+
"options": [
|
|
521
|
+
{ "id": "done", "label": "✓ Ya corregí todos los issues" }
|
|
522
|
+
]
|
|
523
|
+
},
|
|
524
|
+
"routes": {
|
|
525
|
+
"done": "parallel_review"
|
|
526
|
+
}
|
|
367
527
|
},
|
|
368
528
|
|
|
369
529
|
{
|
|
@@ -391,14 +551,14 @@
|
|
|
391
551
|
"title": "❌ Verificación Final Fallida",
|
|
392
552
|
"errors": "{{nodes.verify_final.outputs.errors}}",
|
|
393
553
|
"options": [
|
|
394
|
-
{ "id": "retry", "label": "Reintentar desde implementación" },
|
|
395
|
-
{ "id": "
|
|
396
|
-
{ "id": "cancel", "label": "Cancelar" }
|
|
554
|
+
{ "id": "retry", "label": "🔄 Reintentar desde implementación" },
|
|
555
|
+
{ "id": "manual", "label": "👤 Corregiré manualmente" },
|
|
556
|
+
{ "id": "cancel", "label": "❌ Cancelar" }
|
|
397
557
|
]
|
|
398
558
|
},
|
|
399
559
|
"routes": {
|
|
400
560
|
"retry": "parallel_implementation",
|
|
401
|
-
"
|
|
561
|
+
"manual": "wait_manual_fix",
|
|
402
562
|
"cancel": "end_cancelled"
|
|
403
563
|
}
|
|
404
564
|
},
|
|
@@ -432,8 +592,8 @@
|
|
|
432
592
|
"filesCreated": "{{collectOutputs('filesCreated')}}",
|
|
433
593
|
"filesModified": "{{collectOutputs('filesModified')}}",
|
|
434
594
|
"testsCreated": "{{collectOutputs('testsCreated')}}",
|
|
435
|
-
"testsPassed":
|
|
436
|
-
"reviewApproved":
|
|
595
|
+
"testsPassed": "{{nodes.quality_gate.outputs.tests.exitCode === 0}}",
|
|
596
|
+
"reviewApproved": "{{!hasCriticalIssues(nodes.parallel_review.outputs)}}",
|
|
437
597
|
"success": true,
|
|
438
598
|
"summary": "{{generateSummary()}}"
|
|
439
599
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"description": "ELSABRO Hooks Configuration
|
|
4
|
-
"version": "
|
|
3
|
+
"description": "ELSABRO Hooks Configuration v3.1 - Agent Teams + Blocking Review + Skill Discovery (npx skills)",
|
|
4
|
+
"version": "3.1.0",
|
|
5
5
|
|
|
6
6
|
"hooks": {
|
|
7
7
|
"PreFlow": [
|
|
@@ -109,6 +109,17 @@
|
|
|
109
109
|
"auto-test-on-edit": false,
|
|
110
110
|
"lint-on-save": false,
|
|
111
111
|
"confirm-destructive": false
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
"teams": {
|
|
115
|
+
"description": "Perfil para Agent Teams - coordinación peer-to-peer con Teammate/SendMessage",
|
|
116
|
+
"auto-test-on-edit": true,
|
|
117
|
+
"lint-on-save": true,
|
|
118
|
+
"confirm-destructive": true,
|
|
119
|
+
"skill-discovery": true,
|
|
120
|
+
"agent-teams": true,
|
|
121
|
+
"blocking-review": true,
|
|
122
|
+
"max-review-iterations": 5
|
|
112
123
|
}
|
|
113
124
|
},
|
|
114
125
|
|
|
@@ -129,128 +140,78 @@
|
|
|
129
140
|
},
|
|
130
141
|
|
|
131
142
|
"skillDiscoveryConfig": {
|
|
132
|
-
"description": "Configuración
|
|
133
|
-
"
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
"id": "auth",
|
|
141
|
-
"keywords": ["auth", "login", "signin", "oauth", "jwt", "session", "password"]
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
"id": "db",
|
|
145
|
-
"keywords": ["database", "db", "postgres", "mysql", "mongodb", "firebase"]
|
|
146
|
-
},
|
|
147
|
-
{
|
|
148
|
-
"id": "payments",
|
|
149
|
-
"keywords": ["payment", "stripe", "paypal", "billing", "checkout", "commerce"]
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
"id": "mobile",
|
|
153
|
-
"keywords": ["mobile", "expo", "react-native", "ios", "android", "app"]
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
"id": "web",
|
|
157
|
-
"keywords": ["website", "web", "nextjs", "react", "vue", "angular", "frontend"]
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
"id": "devops",
|
|
161
|
-
"keywords": ["devops", "docker", "kubernetes", "ci", "cd", "github", "deploy"]
|
|
162
|
-
},
|
|
163
|
-
{
|
|
164
|
-
"id": "testing",
|
|
165
|
-
"keywords": ["test", "jest", "vitest", "mocha", "pytest", "coverage"]
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
"id": "security",
|
|
169
|
-
"keywords": ["security", "encrypt", "https", "cors", "ssl", "auth"]
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
"id": "monitoring",
|
|
173
|
-
"keywords": ["monitor", "sentry", "logging", "error", "analytics"]
|
|
174
|
-
}
|
|
175
|
-
]
|
|
176
|
-
},
|
|
177
|
-
"ranking": {
|
|
178
|
-
"algorithm": "weighted_score",
|
|
179
|
-
"weights": {
|
|
180
|
-
"match_score": 100,
|
|
181
|
-
"difficulty_beginner": 50,
|
|
182
|
-
"difficulty_intermediate": 30,
|
|
183
|
-
"difficulty_advanced": 10,
|
|
184
|
-
"source_elsabro": 20,
|
|
185
|
-
"source_external": 5,
|
|
186
|
-
"requires_installation": -10
|
|
187
|
-
},
|
|
188
|
-
"maxSkills": 10,
|
|
189
|
-
"minScore": 0
|
|
143
|
+
"description": "Configuración de skill discovery usando vercel-labs/skills (npx skills)",
|
|
144
|
+
"method": "npx-skills",
|
|
145
|
+
"commands": {
|
|
146
|
+
"find": "npx skills find <query>",
|
|
147
|
+
"add": "npx skills add -g <name>",
|
|
148
|
+
"list": "npx skills list",
|
|
149
|
+
"check": "npx skills check",
|
|
150
|
+
"update": "npx skills update"
|
|
190
151
|
},
|
|
191
152
|
"sources": {
|
|
192
|
-
"
|
|
153
|
+
"installed": {
|
|
193
154
|
"enabled": true,
|
|
194
|
-
"path": "
|
|
195
|
-
"
|
|
196
|
-
"metadataFormat": "yaml_frontmatter",
|
|
155
|
+
"path": "~/.claude/skills",
|
|
156
|
+
"description": "Skills globales instalados",
|
|
197
157
|
"priority": 1
|
|
198
158
|
},
|
|
199
|
-
"
|
|
159
|
+
"elsabro": {
|
|
200
160
|
"enabled": true,
|
|
201
|
-
"
|
|
202
|
-
"
|
|
203
|
-
"
|
|
204
|
-
"
|
|
161
|
+
"path": "./skills",
|
|
162
|
+
"filePattern": "*.md",
|
|
163
|
+
"description": "Skills bundled con ELSABRO",
|
|
164
|
+
"priority": 2
|
|
205
165
|
},
|
|
206
|
-
"
|
|
166
|
+
"registry": {
|
|
207
167
|
"enabled": true,
|
|
208
|
-
"
|
|
209
|
-
"
|
|
168
|
+
"command": "npx skills find",
|
|
169
|
+
"description": "vercel-labs/skills registry",
|
|
170
|
+
"timeout": 30000,
|
|
171
|
+
"priority": 3
|
|
210
172
|
}
|
|
211
173
|
},
|
|
174
|
+
"ranking": {
|
|
175
|
+
"algorithm": "weighted_score",
|
|
176
|
+
"weights": {
|
|
177
|
+
"match_score": 100,
|
|
178
|
+
"source_elsabro": 20,
|
|
179
|
+
"source_registry": 10
|
|
180
|
+
},
|
|
181
|
+
"maxSkills": 10
|
|
182
|
+
},
|
|
183
|
+
"cache": {
|
|
184
|
+
"enabled": true,
|
|
185
|
+
"path": "./.cache/skill-discovery-cache.json",
|
|
186
|
+
"ttl": 3600
|
|
187
|
+
},
|
|
212
188
|
"output": {
|
|
213
189
|
"format": "json",
|
|
214
|
-
"
|
|
215
|
-
"
|
|
216
|
-
"
|
|
217
|
-
"maxRecommendations": 5
|
|
190
|
+
"includeInstallCommands": true,
|
|
191
|
+
"includeUpdateStatus": true,
|
|
192
|
+
"maxRecommendations": 10
|
|
218
193
|
}
|
|
219
194
|
},
|
|
220
195
|
|
|
221
196
|
"flowEngineIntegration": {
|
|
222
|
-
"description": "
|
|
197
|
+
"description": "Integración con Flow Engine - nodo skill_discovery antes de load_context",
|
|
223
198
|
"enabled": true,
|
|
224
|
-
"nodePosition": "before:load_context",
|
|
225
199
|
"nodeId": "skill_discovery",
|
|
200
|
+
"nodePosition": "between:start:load_context",
|
|
226
201
|
"injectInto": [
|
|
227
202
|
{
|
|
228
203
|
"node": "load_context",
|
|
229
|
-
"field": "
|
|
204
|
+
"field": "state.availableSkills",
|
|
205
|
+
"source": "nodes.skill_discovery.outputs.discoveredSkills"
|
|
230
206
|
},
|
|
231
207
|
{
|
|
232
208
|
"node": "load_context",
|
|
233
|
-
"field": "
|
|
234
|
-
|
|
235
|
-
{
|
|
236
|
-
"branches": ["standard_analyze", "careful_analyze"],
|
|
237
|
-
"inputs": {
|
|
238
|
-
"available_skills": "state.skillContext",
|
|
239
|
-
"skill_recommendations": "state.discoveredSkills[*].id"
|
|
240
|
-
}
|
|
209
|
+
"field": "state.skillRecommendations",
|
|
210
|
+
"source": "nodes.skill_discovery.outputs.skillRecommendations"
|
|
241
211
|
}
|
|
242
212
|
],
|
|
243
|
-
"
|
|
244
|
-
"
|
|
245
|
-
"id": "display_skill_discovery",
|
|
246
|
-
"type": "display",
|
|
247
|
-
"position": "after:skill_discovery",
|
|
248
|
-
"title": "🎯 Skills Descubiertos",
|
|
249
|
-
"showKeywords": true,
|
|
250
|
-
"showCount": true,
|
|
251
|
-
"showRecommendations": true,
|
|
252
|
-
"showSources": true
|
|
253
|
-
}
|
|
213
|
+
"errorPolicy": "continue",
|
|
214
|
+
"displayResults": true
|
|
254
215
|
},
|
|
255
216
|
|
|
256
217
|
"installation": {
|
|
@@ -258,15 +219,16 @@
|
|
|
258
219
|
"1. Copiar este archivo a ~/.claude/hooks/hooks-config.json",
|
|
259
220
|
"2. O referenciar desde settings.json: \"hooks\": {\"configPath\": \".planning/hooks/hooks-config-updated.json\"}",
|
|
260
221
|
"3. Otorgar permisos al hook: chmod +x ./hooks/skill-discovery.sh",
|
|
261
|
-
"4.
|
|
222
|
+
"4. Instalar find-skills meta-skill: npx skills add -g https://github.com/vercel-labs/skills --skill find-skills",
|
|
223
|
+
"5. Verificar instalación: bash ./hooks/skill-discovery.sh 'crear api con auth' 'medium'"
|
|
262
224
|
],
|
|
263
225
|
"settingsPath": "~/.claude/settings.json",
|
|
264
226
|
"elsabroPath": ".planning/hooks/",
|
|
265
227
|
"requirements": {
|
|
266
228
|
"bash": "4.0+",
|
|
267
229
|
"jq": "latest (para JSON processing)",
|
|
268
|
-
"
|
|
269
|
-
"
|
|
230
|
+
"node": "18+ (para npx skills)",
|
|
231
|
+
"npm": "latest (para npx)"
|
|
270
232
|
}
|
|
271
233
|
},
|
|
272
234
|
|