opencode-swarm-plugin 0.44.0 → 0.44.1
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/bin/swarm.serve.test.ts +6 -4
- package/bin/swarm.ts +16 -10
- package/dist/compaction-prompt-scoring.js +139 -0
- package/dist/eval-capture.js +12811 -0
- package/dist/hive.d.ts.map +1 -1
- package/dist/index.js +7644 -62599
- package/dist/plugin.js +23766 -78721
- package/dist/swarm-orchestrate.d.ts.map +1 -1
- package/dist/swarm-prompts.d.ts.map +1 -1
- package/dist/swarm-review.d.ts.map +1 -1
- package/package.json +17 -5
- package/.changeset/swarm-insights-data-layer.md +0 -63
- package/.hive/analysis/eval-failure-analysis-2025-12-25.md +0 -331
- package/.hive/analysis/session-data-quality-audit.md +0 -320
- package/.hive/eval-results.json +0 -483
- package/.hive/issues.jsonl +0 -138
- package/.hive/memories.jsonl +0 -729
- package/.opencode/eval-history.jsonl +0 -327
- package/.turbo/turbo-build.log +0 -9
- package/CHANGELOG.md +0 -2286
- package/SCORER-ANALYSIS.md +0 -598
- package/docs/analysis/subagent-coordination-patterns.md +0 -902
- package/docs/analysis-socratic-planner-pattern.md +0 -504
- package/docs/planning/ADR-001-monorepo-structure.md +0 -171
- package/docs/planning/ADR-002-package-extraction.md +0 -393
- package/docs/planning/ADR-003-performance-improvements.md +0 -451
- package/docs/planning/ADR-004-message-queue-features.md +0 -187
- package/docs/planning/ADR-005-devtools-observability.md +0 -202
- package/docs/planning/ADR-007-swarm-enhancements-worktree-review.md +0 -168
- package/docs/planning/ADR-008-worker-handoff-protocol.md +0 -293
- package/docs/planning/ADR-009-oh-my-opencode-patterns.md +0 -353
- package/docs/planning/ADR-010-cass-inhousing.md +0 -1215
- package/docs/planning/ROADMAP.md +0 -368
- package/docs/semantic-memory-cli-syntax.md +0 -123
- package/docs/swarm-mail-architecture.md +0 -1147
- package/docs/testing/context-recovery-test.md +0 -470
- package/evals/ARCHITECTURE.md +0 -1189
- package/evals/README.md +0 -768
- package/evals/compaction-prompt.eval.ts +0 -149
- package/evals/compaction-resumption.eval.ts +0 -289
- package/evals/coordinator-behavior.eval.ts +0 -307
- package/evals/coordinator-session.eval.ts +0 -154
- package/evals/evalite.config.ts.bak +0 -15
- package/evals/example.eval.ts +0 -31
- package/evals/fixtures/cass-baseline.ts +0 -217
- package/evals/fixtures/compaction-cases.ts +0 -350
- package/evals/fixtures/compaction-prompt-cases.ts +0 -311
- package/evals/fixtures/coordinator-sessions.ts +0 -328
- package/evals/fixtures/decomposition-cases.ts +0 -105
- package/evals/lib/compaction-loader.test.ts +0 -248
- package/evals/lib/compaction-loader.ts +0 -320
- package/evals/lib/data-loader.evalite-test.ts +0 -289
- package/evals/lib/data-loader.test.ts +0 -345
- package/evals/lib/data-loader.ts +0 -281
- package/evals/lib/llm.ts +0 -115
- package/evals/scorers/compaction-prompt-scorers.ts +0 -145
- package/evals/scorers/compaction-scorers.ts +0 -305
- package/evals/scorers/coordinator-discipline.evalite-test.ts +0 -539
- package/evals/scorers/coordinator-discipline.ts +0 -325
- package/evals/scorers/index.test.ts +0 -146
- package/evals/scorers/index.ts +0 -328
- package/evals/scorers/outcome-scorers.evalite-test.ts +0 -27
- package/evals/scorers/outcome-scorers.ts +0 -349
- package/evals/swarm-decomposition.eval.ts +0 -121
- package/examples/commands/swarm.md +0 -745
- package/examples/plugin-wrapper-template.ts +0 -2515
- package/examples/skills/hive-workflow/SKILL.md +0 -212
- package/examples/skills/skill-creator/SKILL.md +0 -223
- package/examples/skills/swarm-coordination/SKILL.md +0 -292
- package/global-skills/cli-builder/SKILL.md +0 -344
- package/global-skills/cli-builder/references/advanced-patterns.md +0 -244
- package/global-skills/learning-systems/SKILL.md +0 -644
- package/global-skills/skill-creator/LICENSE.txt +0 -202
- package/global-skills/skill-creator/SKILL.md +0 -352
- package/global-skills/skill-creator/references/output-patterns.md +0 -82
- package/global-skills/skill-creator/references/workflows.md +0 -28
- package/global-skills/swarm-coordination/SKILL.md +0 -995
- package/global-skills/swarm-coordination/references/coordinator-patterns.md +0 -235
- package/global-skills/swarm-coordination/references/strategies.md +0 -138
- package/global-skills/system-design/SKILL.md +0 -213
- package/global-skills/testing-patterns/SKILL.md +0 -430
- package/global-skills/testing-patterns/references/dependency-breaking-catalog.md +0 -586
- package/opencode-swarm-plugin-0.30.7.tgz +0 -0
- package/opencode-swarm-plugin-0.31.0.tgz +0 -0
- package/scripts/cleanup-test-memories.ts +0 -346
- package/scripts/init-skill.ts +0 -222
- package/scripts/migrate-unknown-sessions.ts +0 -349
- package/scripts/validate-skill.ts +0 -204
- package/src/agent-mail.ts +0 -1724
- package/src/anti-patterns.test.ts +0 -1167
- package/src/anti-patterns.ts +0 -448
- package/src/compaction-capture.integration.test.ts +0 -257
- package/src/compaction-hook.test.ts +0 -838
- package/src/compaction-hook.ts +0 -1204
- package/src/compaction-observability.integration.test.ts +0 -139
- package/src/compaction-observability.test.ts +0 -187
- package/src/compaction-observability.ts +0 -324
- package/src/compaction-prompt-scorers.test.ts +0 -475
- package/src/compaction-prompt-scoring.ts +0 -300
- package/src/contributor-tools.test.ts +0 -133
- package/src/contributor-tools.ts +0 -201
- package/src/dashboard.test.ts +0 -611
- package/src/dashboard.ts +0 -462
- package/src/error-enrichment.test.ts +0 -403
- package/src/error-enrichment.ts +0 -219
- package/src/eval-capture.test.ts +0 -1015
- package/src/eval-capture.ts +0 -929
- package/src/eval-gates.test.ts +0 -306
- package/src/eval-gates.ts +0 -218
- package/src/eval-history.test.ts +0 -508
- package/src/eval-history.ts +0 -214
- package/src/eval-learning.test.ts +0 -378
- package/src/eval-learning.ts +0 -360
- package/src/eval-runner.test.ts +0 -223
- package/src/eval-runner.ts +0 -402
- package/src/export-tools.test.ts +0 -476
- package/src/export-tools.ts +0 -257
- package/src/hive.integration.test.ts +0 -2241
- package/src/hive.ts +0 -1628
- package/src/index.ts +0 -940
- package/src/learning.integration.test.ts +0 -1815
- package/src/learning.ts +0 -1079
- package/src/logger.test.ts +0 -189
- package/src/logger.ts +0 -135
- package/src/mandate-promotion.test.ts +0 -473
- package/src/mandate-promotion.ts +0 -239
- package/src/mandate-storage.integration.test.ts +0 -601
- package/src/mandate-storage.test.ts +0 -578
- package/src/mandate-storage.ts +0 -794
- package/src/mandates.ts +0 -540
- package/src/memory-tools.test.ts +0 -195
- package/src/memory-tools.ts +0 -344
- package/src/memory.integration.test.ts +0 -334
- package/src/memory.test.ts +0 -158
- package/src/memory.ts +0 -527
- package/src/model-selection.test.ts +0 -188
- package/src/model-selection.ts +0 -68
- package/src/observability-tools.test.ts +0 -359
- package/src/observability-tools.ts +0 -871
- package/src/output-guardrails.test.ts +0 -438
- package/src/output-guardrails.ts +0 -381
- package/src/pattern-maturity.test.ts +0 -1160
- package/src/pattern-maturity.ts +0 -525
- package/src/planning-guardrails.test.ts +0 -491
- package/src/planning-guardrails.ts +0 -438
- package/src/plugin.ts +0 -23
- package/src/post-compaction-tracker.test.ts +0 -251
- package/src/post-compaction-tracker.ts +0 -237
- package/src/query-tools.test.ts +0 -636
- package/src/query-tools.ts +0 -324
- package/src/rate-limiter.integration.test.ts +0 -466
- package/src/rate-limiter.ts +0 -774
- package/src/replay-tools.test.ts +0 -496
- package/src/replay-tools.ts +0 -240
- package/src/repo-crawl.integration.test.ts +0 -441
- package/src/repo-crawl.ts +0 -610
- package/src/schemas/cell-events.test.ts +0 -347
- package/src/schemas/cell-events.ts +0 -807
- package/src/schemas/cell.ts +0 -257
- package/src/schemas/evaluation.ts +0 -166
- package/src/schemas/index.test.ts +0 -199
- package/src/schemas/index.ts +0 -286
- package/src/schemas/mandate.ts +0 -232
- package/src/schemas/swarm-context.ts +0 -115
- package/src/schemas/task.ts +0 -161
- package/src/schemas/worker-handoff.test.ts +0 -302
- package/src/schemas/worker-handoff.ts +0 -131
- package/src/sessions/agent-discovery.test.ts +0 -137
- package/src/sessions/agent-discovery.ts +0 -112
- package/src/sessions/index.ts +0 -15
- package/src/skills.integration.test.ts +0 -1192
- package/src/skills.test.ts +0 -643
- package/src/skills.ts +0 -1549
- package/src/storage.integration.test.ts +0 -341
- package/src/storage.ts +0 -884
- package/src/structured.integration.test.ts +0 -817
- package/src/structured.test.ts +0 -1046
- package/src/structured.ts +0 -762
- package/src/swarm-decompose.test.ts +0 -188
- package/src/swarm-decompose.ts +0 -1302
- package/src/swarm-deferred.integration.test.ts +0 -157
- package/src/swarm-deferred.test.ts +0 -38
- package/src/swarm-insights.test.ts +0 -214
- package/src/swarm-insights.ts +0 -459
- package/src/swarm-mail.integration.test.ts +0 -970
- package/src/swarm-mail.ts +0 -739
- package/src/swarm-orchestrate.integration.test.ts +0 -282
- package/src/swarm-orchestrate.test.ts +0 -548
- package/src/swarm-orchestrate.ts +0 -3084
- package/src/swarm-prompts.test.ts +0 -1270
- package/src/swarm-prompts.ts +0 -2077
- package/src/swarm-research.integration.test.ts +0 -701
- package/src/swarm-research.test.ts +0 -698
- package/src/swarm-research.ts +0 -472
- package/src/swarm-review.integration.test.ts +0 -285
- package/src/swarm-review.test.ts +0 -879
- package/src/swarm-review.ts +0 -709
- package/src/swarm-strategies.ts +0 -407
- package/src/swarm-worktree.test.ts +0 -501
- package/src/swarm-worktree.ts +0 -575
- package/src/swarm.integration.test.ts +0 -2377
- package/src/swarm.ts +0 -38
- package/src/tool-adapter.integration.test.ts +0 -1221
- package/src/tool-availability.ts +0 -461
- package/tsconfig.json +0 -28
package/src/swarm-prompts.ts
DELETED
|
@@ -1,2077 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Swarm Prompts Module - Prompt templates and generation
|
|
3
|
-
*
|
|
4
|
-
* Provides all prompt templates used for swarm coordination:
|
|
5
|
-
* - Decomposition prompts (basic and strategy-specific)
|
|
6
|
-
* - Subtask agent prompts (V1 and V2)
|
|
7
|
-
* - Evaluation prompts
|
|
8
|
-
*
|
|
9
|
-
* Key responsibilities:
|
|
10
|
-
* - Prompt template definitions
|
|
11
|
-
* - Prompt formatting/generation tools
|
|
12
|
-
* - Template parameter substitution
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { tool } from "@opencode-ai/plugin";
|
|
16
|
-
import { generateWorkerHandoff } from "./swarm-orchestrate";
|
|
17
|
-
import { captureCoordinatorEvent } from "./eval-capture.js";
|
|
18
|
-
import { getMemoryAdapter } from "./memory-tools.js";
|
|
19
|
-
|
|
20
|
-
// ============================================================================
|
|
21
|
-
// Prompt Templates
|
|
22
|
-
// ============================================================================
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Prompt for decomposing a task into parallelizable subtasks.
|
|
26
|
-
*
|
|
27
|
-
* Used by swarm_decompose to instruct the agent on how to break down work.
|
|
28
|
-
* The agent responds with a CellTree that gets validated.
|
|
29
|
-
*/
|
|
30
|
-
export const DECOMPOSITION_PROMPT = `You are decomposing a task into parallelizable subtasks for a swarm of agents.
|
|
31
|
-
|
|
32
|
-
## Task
|
|
33
|
-
{task}
|
|
34
|
-
|
|
35
|
-
{context_section}
|
|
36
|
-
|
|
37
|
-
## MANDATORY: Hive Issue Tracking
|
|
38
|
-
|
|
39
|
-
**Every subtask MUST become a cell.** This is non-negotiable.
|
|
40
|
-
|
|
41
|
-
After decomposition, the coordinator will:
|
|
42
|
-
1. Create an epic cell for the overall task
|
|
43
|
-
2. Create child cells for each subtask
|
|
44
|
-
3. Track progress through cell status updates
|
|
45
|
-
4. Close cells with summaries when complete
|
|
46
|
-
|
|
47
|
-
Agents MUST update their cell status as they work. No silent progress.
|
|
48
|
-
|
|
49
|
-
## Requirements
|
|
50
|
-
|
|
51
|
-
1. **Break into independent subtasks** that can run in parallel (as many as needed)
|
|
52
|
-
2. **Assign files** - each subtask must specify which files it will modify
|
|
53
|
-
3. **No file overlap** - files cannot appear in multiple subtasks (they get exclusive locks)
|
|
54
|
-
4. **Order by dependency** - if subtask B needs subtask A's output, A must come first in the array
|
|
55
|
-
5. **Estimate complexity** - 1 (trivial) to 5 (complex)
|
|
56
|
-
6. **Plan aggressively** - break down more than you think necessary, smaller is better
|
|
57
|
-
|
|
58
|
-
## Response Format
|
|
59
|
-
|
|
60
|
-
Respond with a JSON object matching this schema:
|
|
61
|
-
|
|
62
|
-
\`\`\`typescript
|
|
63
|
-
{
|
|
64
|
-
epic: {
|
|
65
|
-
title: string, // Epic title for the hive tracker
|
|
66
|
-
description?: string // Brief description of the overall goal
|
|
67
|
-
},
|
|
68
|
-
subtasks: [
|
|
69
|
-
{
|
|
70
|
-
title: string, // What this subtask accomplishes
|
|
71
|
-
description?: string, // Detailed instructions for the agent
|
|
72
|
-
files: string[], // Files this subtask will modify (globs allowed)
|
|
73
|
-
dependencies: number[], // Indices of subtasks this depends on (0-indexed)
|
|
74
|
-
estimated_complexity: 1-5 // Effort estimate
|
|
75
|
-
},
|
|
76
|
-
// ... more subtasks
|
|
77
|
-
]
|
|
78
|
-
}
|
|
79
|
-
\`\`\`
|
|
80
|
-
|
|
81
|
-
## Guidelines
|
|
82
|
-
|
|
83
|
-
- **Plan aggressively** - when in doubt, split further. 3 small tasks > 1 medium task
|
|
84
|
-
- **Prefer smaller, focused subtasks** over large complex ones
|
|
85
|
-
- **Include test files** in the same subtask as the code they test
|
|
86
|
-
- **Consider shared types** - if multiple files share types, handle that first
|
|
87
|
-
- **Think about imports** - changes to exported APIs affect downstream files
|
|
88
|
-
- **Explicit > implicit** - spell out what each subtask should do, don't assume
|
|
89
|
-
|
|
90
|
-
## File Assignment Examples
|
|
91
|
-
|
|
92
|
-
- Schema change: \`["src/schemas/user.ts", "src/schemas/index.ts"]\`
|
|
93
|
-
- Component + test: \`["src/components/Button.tsx", "src/components/Button.test.tsx"]\`
|
|
94
|
-
- API route: \`["src/app/api/users/route.ts"]\`
|
|
95
|
-
|
|
96
|
-
Now decompose the task:`;
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Strategy-specific decomposition prompt template
|
|
100
|
-
*/
|
|
101
|
-
export const STRATEGY_DECOMPOSITION_PROMPT = `You are decomposing a task into parallelizable subtasks for a swarm of agents.
|
|
102
|
-
|
|
103
|
-
## Task
|
|
104
|
-
{task}
|
|
105
|
-
|
|
106
|
-
{strategy_guidelines}
|
|
107
|
-
|
|
108
|
-
{context_section}
|
|
109
|
-
|
|
110
|
-
{cass_history}
|
|
111
|
-
|
|
112
|
-
{skills_context}
|
|
113
|
-
|
|
114
|
-
## MANDATORY: Hive Issue Tracking
|
|
115
|
-
|
|
116
|
-
**Every subtask MUST become a cell.** This is non-negotiable.
|
|
117
|
-
|
|
118
|
-
After decomposition, the coordinator will:
|
|
119
|
-
1. Create an epic cell for the overall task
|
|
120
|
-
2. Create child cells for each subtask
|
|
121
|
-
3. Track progress through cell status updates
|
|
122
|
-
4. Close cells with summaries when complete
|
|
123
|
-
|
|
124
|
-
Agents MUST update their cell status as they work. No silent progress.
|
|
125
|
-
|
|
126
|
-
## Requirements
|
|
127
|
-
|
|
128
|
-
1. **Break into independent subtasks** that can run in parallel (as many as needed)
|
|
129
|
-
2. **Assign files** - each subtask must specify which files it will modify
|
|
130
|
-
3. **No file overlap** - files cannot appear in multiple subtasks (they get exclusive locks)
|
|
131
|
-
4. **Order by dependency** - if subtask B needs subtask A's output, A must come first in the array
|
|
132
|
-
5. **Estimate complexity** - 1 (trivial) to 5 (complex)
|
|
133
|
-
6. **Plan aggressively** - break down more than you think necessary, smaller is better
|
|
134
|
-
|
|
135
|
-
## Response Format
|
|
136
|
-
|
|
137
|
-
Respond with a JSON object matching this schema:
|
|
138
|
-
|
|
139
|
-
\`\`\`typescript
|
|
140
|
-
{
|
|
141
|
-
epic: {
|
|
142
|
-
title: string, // Epic title for the hive tracker
|
|
143
|
-
description?: string // Brief description of the overall goal
|
|
144
|
-
},
|
|
145
|
-
subtasks: [
|
|
146
|
-
{
|
|
147
|
-
title: string, // What this subtask accomplishes
|
|
148
|
-
description?: string, // Detailed instructions for the agent
|
|
149
|
-
files: string[], // Files this subtask will modify (globs allowed)
|
|
150
|
-
dependencies: number[], // Indices of subtasks this depends on (0-indexed)
|
|
151
|
-
estimated_complexity: 1-5 // Effort estimate
|
|
152
|
-
},
|
|
153
|
-
// ... more subtasks
|
|
154
|
-
]
|
|
155
|
-
}
|
|
156
|
-
\`\`\`
|
|
157
|
-
|
|
158
|
-
Now decompose the task:`;
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Prompt template for spawned subtask agents.
|
|
162
|
-
*
|
|
163
|
-
* Each agent receives this prompt with their specific subtask details filled in.
|
|
164
|
-
* The prompt establishes context, constraints, and expectations.
|
|
165
|
-
*/
|
|
166
|
-
export const SUBTASK_PROMPT = `You are a swarm agent working on a subtask of a larger epic.
|
|
167
|
-
|
|
168
|
-
## Your Identity
|
|
169
|
-
- **Agent Name**: {agent_name}
|
|
170
|
-
- **Cell ID**: {bead_id}
|
|
171
|
-
- **Epic ID**: {epic_id}
|
|
172
|
-
|
|
173
|
-
## Your Subtask
|
|
174
|
-
**Title**: {subtask_title}
|
|
175
|
-
|
|
176
|
-
{subtask_description}
|
|
177
|
-
|
|
178
|
-
## File Scope
|
|
179
|
-
You have exclusive reservations for these files:
|
|
180
|
-
{file_list}
|
|
181
|
-
|
|
182
|
-
**CRITICAL**: Only modify files in your reservation. If you need to modify other files,
|
|
183
|
-
send a message to the coordinator requesting the change.
|
|
184
|
-
|
|
185
|
-
## Shared Context
|
|
186
|
-
{shared_context}
|
|
187
|
-
|
|
188
|
-
## MANDATORY: Hive Tracking
|
|
189
|
-
|
|
190
|
-
You MUST keep your cell updated as you work:
|
|
191
|
-
|
|
192
|
-
1. **Your cell is already in_progress** - don't change this unless blocked
|
|
193
|
-
2. **If blocked**: \`hive_update {bead_id} --status blocked\` and message coordinator
|
|
194
|
-
3. **When done**: Use \`swarm_complete\` - it closes your cell automatically
|
|
195
|
-
4. **Discovered issues**: Create new cells with \`hive_create "issue" -t bug\`
|
|
196
|
-
|
|
197
|
-
**Never work silently.** Your cell status is how the swarm tracks progress.
|
|
198
|
-
|
|
199
|
-
## MANDATORY: Swarm Mail Communication
|
|
200
|
-
|
|
201
|
-
You MUST communicate with other agents:
|
|
202
|
-
|
|
203
|
-
1. **Report progress** every significant milestone (not just at the end)
|
|
204
|
-
2. **Ask questions** if requirements are unclear - don't guess
|
|
205
|
-
3. **Announce blockers** immediately - don't spin trying to fix alone
|
|
206
|
-
4. **Coordinate on shared concerns** - if you see something affecting other agents, say so
|
|
207
|
-
|
|
208
|
-
Use Swarm Mail for all communication:
|
|
209
|
-
\`\`\`
|
|
210
|
-
swarmmail_send(
|
|
211
|
-
to: ["coordinator" or specific agent],
|
|
212
|
-
subject: "Brief subject",
|
|
213
|
-
body: "Message content",
|
|
214
|
-
thread_id: "{epic_id}"
|
|
215
|
-
)
|
|
216
|
-
\`\`\`
|
|
217
|
-
|
|
218
|
-
## Coordination Protocol
|
|
219
|
-
|
|
220
|
-
1. **Start**: Your cell is already marked in_progress
|
|
221
|
-
2. **Progress**: Use swarm_progress to report status updates
|
|
222
|
-
3. **Blocked**: Report immediately via Swarm Mail - don't spin
|
|
223
|
-
4. **Complete**: Use swarm_complete when done - it handles:
|
|
224
|
-
- Closing your cell with a summary
|
|
225
|
-
- Releasing file reservations
|
|
226
|
-
- Notifying the coordinator
|
|
227
|
-
|
|
228
|
-
## Self-Evaluation
|
|
229
|
-
|
|
230
|
-
Before calling swarm_complete, evaluate your work:
|
|
231
|
-
- Type safety: Does it compile without errors?
|
|
232
|
-
- No obvious bugs: Did you handle edge cases?
|
|
233
|
-
- Follows patterns: Does it match existing code style?
|
|
234
|
-
- Readable: Would another developer understand it?
|
|
235
|
-
|
|
236
|
-
If evaluation fails, fix the issues before completing.
|
|
237
|
-
|
|
238
|
-
## Planning Your Work
|
|
239
|
-
|
|
240
|
-
Before writing code:
|
|
241
|
-
1. **Read the files** you're assigned to understand current state
|
|
242
|
-
2. **Plan your approach** - what changes, in what order?
|
|
243
|
-
3. **Identify risks** - what could go wrong? What dependencies?
|
|
244
|
-
4. **Communicate your plan** via Swarm Mail if non-trivial
|
|
245
|
-
|
|
246
|
-
Begin work on your subtask now.`;
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Streamlined subtask prompt (V2) - uses Swarm Mail and hive tracking
|
|
250
|
-
*
|
|
251
|
-
* This is a cleaner version of SUBTASK_PROMPT that's easier to parse.
|
|
252
|
-
* Agents MUST use Swarm Mail for communication and hive cells for tracking.
|
|
253
|
-
*
|
|
254
|
-
* Supports {error_context} placeholder for retry prompts.
|
|
255
|
-
*/
|
|
256
|
-
export const SUBTASK_PROMPT_V2 = `You are a swarm agent working on: **{subtask_title}**
|
|
257
|
-
|
|
258
|
-
## [IDENTITY]
|
|
259
|
-
Agent: (assigned at spawn)
|
|
260
|
-
Cell: {bead_id}
|
|
261
|
-
Epic: {epic_id}
|
|
262
|
-
|
|
263
|
-
## [TASK]
|
|
264
|
-
{subtask_description}
|
|
265
|
-
|
|
266
|
-
## [FILES]
|
|
267
|
-
Reserved (exclusive):
|
|
268
|
-
{file_list}
|
|
269
|
-
|
|
270
|
-
Only modify these files. Need others? Message the coordinator.
|
|
271
|
-
|
|
272
|
-
## [CONTEXT]
|
|
273
|
-
{shared_context}
|
|
274
|
-
|
|
275
|
-
{compressed_context}
|
|
276
|
-
|
|
277
|
-
{error_context}
|
|
278
|
-
|
|
279
|
-
## [MANDATORY SURVIVAL CHECKLIST]
|
|
280
|
-
|
|
281
|
-
**CRITICAL: Follow this checklist IN ORDER. Each step builds on the previous.**
|
|
282
|
-
|
|
283
|
-
### Step 1: Initialize Coordination (REQUIRED - DO THIS FIRST)
|
|
284
|
-
\`\`\`
|
|
285
|
-
swarmmail_init(project_path="{project_path}", task_description="{bead_id}: {subtask_title}")
|
|
286
|
-
\`\`\`
|
|
287
|
-
|
|
288
|
-
**This registers you with the coordination system and enables:**
|
|
289
|
-
- File reservation tracking
|
|
290
|
-
- Inter-agent communication
|
|
291
|
-
- Progress monitoring
|
|
292
|
-
- Conflict detection
|
|
293
|
-
|
|
294
|
-
**If you skip this step, your work will not be tracked and swarm_complete will fail.**
|
|
295
|
-
|
|
296
|
-
### Step 2: 🧠 Query Past Learnings (MANDATORY - BEFORE starting work)
|
|
297
|
-
|
|
298
|
-
**⚠️ CRITICAL: ALWAYS query semantic memory BEFORE writing ANY code.**
|
|
299
|
-
|
|
300
|
-
\`\`\`
|
|
301
|
-
semantic-memory_find(query="<keywords from your task>", limit=5, expand=true)
|
|
302
|
-
\`\`\`
|
|
303
|
-
|
|
304
|
-
**Why this is MANDATORY:**
|
|
305
|
-
- Past agents may have already solved your exact problem
|
|
306
|
-
- Avoids repeating mistakes that wasted 30+ minutes before
|
|
307
|
-
- Discovers project-specific patterns and gotchas
|
|
308
|
-
- Finds known workarounds for tool/library quirks
|
|
309
|
-
|
|
310
|
-
**Search Query Examples by Task Type:**
|
|
311
|
-
|
|
312
|
-
- **Bug fix**: Use exact error message or "<symptom> <component>"
|
|
313
|
-
- **New feature**: Search "<domain concept> implementation pattern"
|
|
314
|
-
- **Refactor**: Query "<pattern name> migration approach"
|
|
315
|
-
- **Integration**: Look for "<library name> gotchas configuration"
|
|
316
|
-
- **Testing**: Find "testing <component type> characterization tests"
|
|
317
|
-
- **Performance**: Search "<technology> performance optimization"
|
|
318
|
-
|
|
319
|
-
**BEFORE you start coding:**
|
|
320
|
-
1. Run semantic-memory_find with keywords from your task
|
|
321
|
-
2. Read the results with expand=true for full content
|
|
322
|
-
3. Check if any memory solves your problem or warns of pitfalls
|
|
323
|
-
4. Adjust your approach based on past learnings
|
|
324
|
-
|
|
325
|
-
**If you skip this step, you WILL waste time solving already-solved problems.**
|
|
326
|
-
|
|
327
|
-
### Step 3: Load Relevant Skills (if available)
|
|
328
|
-
\`\`\`
|
|
329
|
-
skills_list() # See what skills exist
|
|
330
|
-
skills_use(name="<relevant-skill>", context="<your task>") # Load skill
|
|
331
|
-
\`\`\`
|
|
332
|
-
|
|
333
|
-
**Common skill triggers:**
|
|
334
|
-
- Writing tests? → \`skills_use(name="testing-patterns")\`
|
|
335
|
-
- Breaking dependencies? → \`skills_use(name="testing-patterns")\`
|
|
336
|
-
- Multi-agent coordination? → \`skills_use(name="swarm-coordination")\`
|
|
337
|
-
- Building a CLI? → \`skills_use(name="cli-builder")\`
|
|
338
|
-
|
|
339
|
-
### Step 4: Reserve Your Files (YOU reserve, not coordinator)
|
|
340
|
-
\`\`\`
|
|
341
|
-
swarmmail_reserve(
|
|
342
|
-
paths=[{file_list}],
|
|
343
|
-
reason="{bead_id}: {subtask_title}",
|
|
344
|
-
exclusive=true
|
|
345
|
-
)
|
|
346
|
-
\`\`\`
|
|
347
|
-
|
|
348
|
-
**Workers reserve their own files.** This prevents edit conflicts with other agents.
|
|
349
|
-
|
|
350
|
-
### Step 5: Do the Work (TDD MANDATORY)
|
|
351
|
-
|
|
352
|
-
**Follow RED → GREEN → REFACTOR. No exceptions.**
|
|
353
|
-
|
|
354
|
-
1. **RED**: Write a failing test that describes the expected behavior
|
|
355
|
-
- Test MUST fail before you write implementation
|
|
356
|
-
- If test passes immediately, your test is wrong
|
|
357
|
-
|
|
358
|
-
2. **GREEN**: Write minimal code to make the test pass
|
|
359
|
-
- Don't over-engineer - just make it green
|
|
360
|
-
- Hardcode if needed, refactor later
|
|
361
|
-
|
|
362
|
-
3. **REFACTOR**: Clean up while tests stay green
|
|
363
|
-
- Run tests after every change
|
|
364
|
-
- If tests break, undo and try again
|
|
365
|
-
|
|
366
|
-
\`\`\`bash
|
|
367
|
-
# Run tests continuously
|
|
368
|
-
bun test <your-test-file> --watch
|
|
369
|
-
\`\`\`
|
|
370
|
-
|
|
371
|
-
**Why TDD?**
|
|
372
|
-
- Catches bugs before they exist
|
|
373
|
-
- Documents expected behavior
|
|
374
|
-
- Enables fearless refactoring
|
|
375
|
-
- Proves your code works
|
|
376
|
-
|
|
377
|
-
### Step 6: Report Progress at Milestones
|
|
378
|
-
\`\`\`
|
|
379
|
-
swarm_progress(
|
|
380
|
-
project_key="{project_path}",
|
|
381
|
-
agent_name="<your-agent-name>",
|
|
382
|
-
bead_id="{bead_id}",
|
|
383
|
-
status="in_progress",
|
|
384
|
-
progress_percent=25, # or 50, 75
|
|
385
|
-
message="<what you just completed>"
|
|
386
|
-
)
|
|
387
|
-
\`\`\`
|
|
388
|
-
|
|
389
|
-
**Report at 25%, 50%, 75% completion.** This:
|
|
390
|
-
- Triggers auto-checkpoint (saves context)
|
|
391
|
-
- Keeps coordinator informed
|
|
392
|
-
- Prevents silent failures
|
|
393
|
-
|
|
394
|
-
### Step 7: Manual Checkpoint BEFORE Risky Operations
|
|
395
|
-
\`\`\`
|
|
396
|
-
swarm_checkpoint(
|
|
397
|
-
project_key="{project_path}",
|
|
398
|
-
agent_name="<your-agent-name>",
|
|
399
|
-
bead_id="{bead_id}"
|
|
400
|
-
)
|
|
401
|
-
\`\`\`
|
|
402
|
-
|
|
403
|
-
**Call BEFORE:**
|
|
404
|
-
- Large refactors
|
|
405
|
-
- File deletions
|
|
406
|
-
- Breaking API changes
|
|
407
|
-
- Anything that might fail catastrophically
|
|
408
|
-
|
|
409
|
-
**Checkpoints preserve context so you can recover if things go wrong.**
|
|
410
|
-
|
|
411
|
-
### Step 8: 💾 STORE YOUR LEARNINGS (if you discovered something)
|
|
412
|
-
|
|
413
|
-
**If you learned it the hard way, STORE IT so the next agent doesn't have to.**
|
|
414
|
-
|
|
415
|
-
\`\`\`
|
|
416
|
-
semantic-memory_store(
|
|
417
|
-
information="<what you learned, WHY it matters, how to apply it>",
|
|
418
|
-
tags="<domain, tech-stack, pattern-type>"
|
|
419
|
-
)
|
|
420
|
-
\`\`\`
|
|
421
|
-
|
|
422
|
-
**MANDATORY Storage Triggers - Store when you:**
|
|
423
|
-
- 🐛 **Solved a tricky bug** (>15min debugging) - include root cause + solution
|
|
424
|
-
- 💡 **Discovered a project-specific pattern** - domain rules, business logic quirks
|
|
425
|
-
- ⚠️ **Found a tool/library gotcha** - API quirks, version-specific bugs, workarounds
|
|
426
|
-
- 🚫 **Tried an approach that failed** - anti-patterns to avoid, why it didn't work
|
|
427
|
-
- 🏗️ **Made an architectural decision** - reasoning, alternatives considered, tradeoffs
|
|
428
|
-
|
|
429
|
-
**What Makes a GOOD Memory:**
|
|
430
|
-
|
|
431
|
-
✅ **GOOD** (actionable, explains WHY):
|
|
432
|
-
\`\`\`
|
|
433
|
-
"OAuth refresh tokens need 5min buffer before expiry to avoid race conditions.
|
|
434
|
-
Without buffer, token refresh can fail mid-request if expiry happens between
|
|
435
|
-
check and use. Implemented with: if (expiresAt - Date.now() < 300000) refresh()"
|
|
436
|
-
\`\`\`
|
|
437
|
-
|
|
438
|
-
❌ **BAD** (generic, no context):
|
|
439
|
-
\`\`\`
|
|
440
|
-
"Fixed the auth bug by adding a null check"
|
|
441
|
-
\`\`\`
|
|
442
|
-
|
|
443
|
-
**What NOT to Store:**
|
|
444
|
-
- Generic knowledge that's in official documentation
|
|
445
|
-
- Implementation details that change frequently
|
|
446
|
-
- Vague descriptions without context ("fixed the thing")
|
|
447
|
-
|
|
448
|
-
**The WHY matters more than the WHAT.** Future agents need context to apply your learning.
|
|
449
|
-
|
|
450
|
-
### Step 9: Complete (REQUIRED - releases reservations)
|
|
451
|
-
\`\`\`
|
|
452
|
-
swarm_complete(
|
|
453
|
-
project_key="{project_path}",
|
|
454
|
-
agent_name="<your-agent-name>",
|
|
455
|
-
bead_id="{bead_id}",
|
|
456
|
-
summary="<what you accomplished>",
|
|
457
|
-
files_touched=["list", "of", "files"]
|
|
458
|
-
)
|
|
459
|
-
\`\`\`
|
|
460
|
-
|
|
461
|
-
**This automatically:**
|
|
462
|
-
- Runs UBS bug scan
|
|
463
|
-
- Releases file reservations
|
|
464
|
-
- Records learning signals
|
|
465
|
-
- Notifies coordinator
|
|
466
|
-
|
|
467
|
-
**DO NOT manually close the cell with hive_close.** Use swarm_complete.
|
|
468
|
-
|
|
469
|
-
## [ON-DEMAND RESEARCH]
|
|
470
|
-
|
|
471
|
-
If you encounter unknown API behavior or version-specific issues:
|
|
472
|
-
|
|
473
|
-
1. **Check semantic-memory first:**
|
|
474
|
-
\`semantic-memory_find(query="<library> <version> <topic>", limit=3, expand=true)\`
|
|
475
|
-
|
|
476
|
-
2. **If not found, spawn researcher:**
|
|
477
|
-
\`swarm_spawn_researcher(research_id="{bead_id}-research", epic_id="{epic_id}", tech_stack=["<library>"], project_path="{project_path}")\`
|
|
478
|
-
Then spawn with Task tool: \`Task(subagent_type="swarm/researcher", prompt="<from above>")\`
|
|
479
|
-
|
|
480
|
-
3. **Wait for research, then continue**
|
|
481
|
-
|
|
482
|
-
**Research triggers:**
|
|
483
|
-
- "I'm not sure how this API works in version X"
|
|
484
|
-
- "This might have breaking changes"
|
|
485
|
-
- "The docs I remember might be outdated"
|
|
486
|
-
|
|
487
|
-
**Don't research:**
|
|
488
|
-
- Standard patterns you're confident about
|
|
489
|
-
- Well-documented, stable APIs
|
|
490
|
-
- Obvious implementations
|
|
491
|
-
|
|
492
|
-
## [SWARM MAIL COMMUNICATION]
|
|
493
|
-
|
|
494
|
-
### Check Inbox Regularly
|
|
495
|
-
\`\`\`
|
|
496
|
-
swarmmail_inbox() # Check for coordinator messages
|
|
497
|
-
swarmmail_read_message(message_id=N) # Read specific message
|
|
498
|
-
\`\`\`
|
|
499
|
-
|
|
500
|
-
### When Blocked
|
|
501
|
-
\`\`\`
|
|
502
|
-
swarmmail_send(
|
|
503
|
-
to=["coordinator"],
|
|
504
|
-
subject="BLOCKED: {bead_id}",
|
|
505
|
-
body="<blocker description, what you need>",
|
|
506
|
-
importance="high",
|
|
507
|
-
thread_id="{epic_id}"
|
|
508
|
-
)
|
|
509
|
-
hive_update(id="{bead_id}", status="blocked")
|
|
510
|
-
\`\`\`
|
|
511
|
-
|
|
512
|
-
### Report Issues to Other Agents
|
|
513
|
-
\`\`\`
|
|
514
|
-
swarmmail_send(
|
|
515
|
-
to=["OtherAgent", "coordinator"],
|
|
516
|
-
subject="Issue in {bead_id}",
|
|
517
|
-
body="<describe problem, don't fix their code>",
|
|
518
|
-
thread_id="{epic_id}"
|
|
519
|
-
)
|
|
520
|
-
\`\`\`
|
|
521
|
-
|
|
522
|
-
### Manual Release (if needed)
|
|
523
|
-
\`\`\`
|
|
524
|
-
swarmmail_release() # Manually release reservations
|
|
525
|
-
\`\`\`
|
|
526
|
-
|
|
527
|
-
**Note:** \`swarm_complete\` automatically releases reservations. Only use manual release if aborting work.
|
|
528
|
-
|
|
529
|
-
## [OTHER TOOLS]
|
|
530
|
-
### Hive - You Have Autonomy to File Issues
|
|
531
|
-
You can create new cells against this epic when you discover:
|
|
532
|
-
- **Bugs**: Found a bug while working? File it.
|
|
533
|
-
- **Tech debt**: Spotted something that needs cleanup? File it.
|
|
534
|
-
- **Follow-up work**: Task needs more work than scoped? File a follow-up.
|
|
535
|
-
- **Dependencies**: Need something from another agent? File and link it.
|
|
536
|
-
|
|
537
|
-
\`\`\`
|
|
538
|
-
hive_create(
|
|
539
|
-
title="<descriptive title>",
|
|
540
|
-
type="bug", # or "task", "chore"
|
|
541
|
-
priority=2,
|
|
542
|
-
parent_id="{epic_id}", # Links to this epic
|
|
543
|
-
description="Found while working on {bead_id}: <details>"
|
|
544
|
-
)
|
|
545
|
-
\`\`\`
|
|
546
|
-
|
|
547
|
-
**Don't silently ignore issues.** File them so they get tracked and addressed.
|
|
548
|
-
|
|
549
|
-
Other cell operations:
|
|
550
|
-
- hive_update(id, status) - Mark blocked if stuck
|
|
551
|
-
- hive_query(status="open") - See what else needs work
|
|
552
|
-
|
|
553
|
-
### Skills
|
|
554
|
-
- skills_list() - Discover available skills
|
|
555
|
-
- skills_use(name) - Activate skill for specialized guidance
|
|
556
|
-
- skills_create(name) - Create new skill (if you found a reusable pattern)
|
|
557
|
-
|
|
558
|
-
## [CRITICAL REQUIREMENTS]
|
|
559
|
-
|
|
560
|
-
**NON-NEGOTIABLE:**
|
|
561
|
-
1. Step 1 (swarmmail_init) MUST be first - do it before anything else
|
|
562
|
-
2. 🧠 Step 2 (semantic-memory_find) MUST happen BEFORE starting work - query first, code second
|
|
563
|
-
3. Step 4 (swarmmail_reserve) - YOU reserve files, not coordinator
|
|
564
|
-
4. Step 6 (swarm_progress) - Report at milestones, don't work silently
|
|
565
|
-
5. 💾 Step 8 (semantic-memory_store) - If you learned something hard, STORE IT
|
|
566
|
-
6. Step 9 (swarm_complete) - Use this to close, NOT hive_close
|
|
567
|
-
|
|
568
|
-
**If you skip these steps:**
|
|
569
|
-
- Your work won't be tracked (swarm_complete will fail)
|
|
570
|
-
- 🔄 You'll waste time repeating already-solved problems (no semantic memory query)
|
|
571
|
-
- Edit conflicts with other agents (no file reservation)
|
|
572
|
-
- Lost work if you crash (no checkpoints)
|
|
573
|
-
- 🔄 Future agents repeat YOUR mistakes (no learnings stored)
|
|
574
|
-
|
|
575
|
-
**Memory is the swarm's collective intelligence. Query it. Feed it.**
|
|
576
|
-
|
|
577
|
-
Begin now.`;
|
|
578
|
-
|
|
579
|
-
/**
|
|
580
|
-
* Coordinator Agent Prompt Template
|
|
581
|
-
*
|
|
582
|
-
* Used by the /swarm command to instruct coordinators on their role.
|
|
583
|
-
* Coordinators NEVER execute work directly - they clarify, decompose, spawn workers, and review.
|
|
584
|
-
*
|
|
585
|
-
* Key sections:
|
|
586
|
-
* - Role boundaries (what coordinators NEVER do)
|
|
587
|
-
* - Phase 1.5: Research Phase (spawn researchers, DON'T fetch docs directly)
|
|
588
|
-
* - Forbidden tools (repo-crawl, webfetch, context7, pdf-brain_search)
|
|
589
|
-
* - MANDATORY review loop after each worker completes
|
|
590
|
-
*
|
|
591
|
-
* Placeholders:
|
|
592
|
-
* - {task} - The task description from user
|
|
593
|
-
* - {project_path} - Absolute path to project root
|
|
594
|
-
*/
|
|
595
|
-
export const COORDINATOR_PROMPT = `You are a swarm coordinator. Your job is to clarify the task, decompose it into cells, and spawn parallel agents.
|
|
596
|
-
|
|
597
|
-
## Task
|
|
598
|
-
|
|
599
|
-
{task}
|
|
600
|
-
|
|
601
|
-
## CRITICAL: Coordinator Role Boundaries
|
|
602
|
-
|
|
603
|
-
**⚠️ COORDINATORS NEVER EXECUTE WORK DIRECTLY**
|
|
604
|
-
|
|
605
|
-
Your role is **ONLY** to:
|
|
606
|
-
1. **Clarify** - Ask questions to understand scope
|
|
607
|
-
2. **Decompose** - Break into subtasks with clear boundaries
|
|
608
|
-
3. **Spawn** - Create worker agents for ALL subtasks
|
|
609
|
-
4. **Monitor** - Check progress, unblock, mediate conflicts
|
|
610
|
-
5. **Verify** - Confirm completion, run final checks
|
|
611
|
-
|
|
612
|
-
**YOU DO NOT:**
|
|
613
|
-
- Read implementation files (only metadata/structure for planning)
|
|
614
|
-
- Edit code directly
|
|
615
|
-
- Run tests yourself (workers run tests)
|
|
616
|
-
- Implement features
|
|
617
|
-
- Fix bugs inline
|
|
618
|
-
- Make "quick fixes" yourself
|
|
619
|
-
|
|
620
|
-
**ALWAYS spawn workers, even for sequential tasks.** Sequential just means spawn them in order and wait for each to complete before spawning the next.
|
|
621
|
-
|
|
622
|
-
### Why This Matters
|
|
623
|
-
|
|
624
|
-
| Coordinator Work | Worker Work | Consequence of Mixing |
|
|
625
|
-
|-----------------|-------------|----------------------|
|
|
626
|
-
| Sonnet context ($$$) | Disposable context | Expensive context waste |
|
|
627
|
-
| Long-lived state | Task-scoped state | Context exhaustion |
|
|
628
|
-
| Orchestration concerns | Implementation concerns | Mixed concerns |
|
|
629
|
-
| No checkpoints | Checkpoints enabled | No recovery |
|
|
630
|
-
| No learning signals | Outcomes tracked | No improvement |
|
|
631
|
-
|
|
632
|
-
## CRITICAL: NEVER Fetch Documentation Directly
|
|
633
|
-
|
|
634
|
-
**⚠️ COORDINATORS DO NOT CALL RESEARCH TOOLS DIRECTLY**
|
|
635
|
-
|
|
636
|
-
The following tools are **FORBIDDEN** for coordinators to call:
|
|
637
|
-
|
|
638
|
-
- \`repo-crawl_file\`, \`repo-crawl_readme\`, \`repo-crawl_search\`, \`repo-crawl_structure\`, \`repo-crawl_tree\`
|
|
639
|
-
- \`repo-autopsy_*\` (all variants)
|
|
640
|
-
- \`webfetch\`, \`fetch_fetch\`
|
|
641
|
-
- \`context7_resolve-library-id\`, \`context7_get-library-docs\`
|
|
642
|
-
- \`pdf-brain_search\`, \`pdf-brain_read\`
|
|
643
|
-
|
|
644
|
-
**WHY?** These tools dump massive context that exhausts your expensive Sonnet context. Your job is orchestration, not research.
|
|
645
|
-
|
|
646
|
-
**INSTEAD:** Use \`swarm_spawn_researcher\` (see Phase 1.5 below) to spawn a researcher worker who:
|
|
647
|
-
- Fetches documentation in disposable context
|
|
648
|
-
- Stores full details in semantic-memory
|
|
649
|
-
- Returns a condensed summary for shared_context
|
|
650
|
-
|
|
651
|
-
## Workflow
|
|
652
|
-
|
|
653
|
-
### Phase 0: Socratic Planning (INTERACTIVE - unless --fast)
|
|
654
|
-
|
|
655
|
-
**Before decomposing, clarify the task with the user.**
|
|
656
|
-
|
|
657
|
-
Check for flags in the task:
|
|
658
|
-
- \`--fast\` → Skip questions, use reasonable defaults
|
|
659
|
-
- \`--auto\` → Zero interaction, heuristic decisions
|
|
660
|
-
- \`--confirm-only\` → Show plan, get yes/no only
|
|
661
|
-
|
|
662
|
-
**Default (no flags): Full Socratic Mode**
|
|
663
|
-
|
|
664
|
-
1. **Analyze task for ambiguity:**
|
|
665
|
-
- Scope unclear? (what's included/excluded)
|
|
666
|
-
- Strategy unclear? (file-based vs feature-based)
|
|
667
|
-
- Dependencies unclear? (what needs to exist first)
|
|
668
|
-
- Success criteria unclear? (how do we know it's done)
|
|
669
|
-
|
|
670
|
-
2. **If clarification needed, ask ONE question at a time:**
|
|
671
|
-
\`\`\`
|
|
672
|
-
The task "<task>" needs clarification before I can decompose it.
|
|
673
|
-
|
|
674
|
-
**Question:** <specific question>
|
|
675
|
-
|
|
676
|
-
Options:
|
|
677
|
-
a) <option 1> - <tradeoff>
|
|
678
|
-
b) <option 2> - <tradeoff>
|
|
679
|
-
c) <option 3> - <tradeoff>
|
|
680
|
-
|
|
681
|
-
I'd recommend (b) because <reason>. Which approach?
|
|
682
|
-
\`\`\`
|
|
683
|
-
|
|
684
|
-
3. **Wait for user response before proceeding**
|
|
685
|
-
|
|
686
|
-
4. **Iterate if needed** (max 2-3 questions)
|
|
687
|
-
|
|
688
|
-
**Rules:**
|
|
689
|
-
- ONE question at a time - don't overwhelm
|
|
690
|
-
- Offer concrete options - not open-ended
|
|
691
|
-
- Lead with recommendation - save cognitive load
|
|
692
|
-
- Wait for answer - don't assume
|
|
693
|
-
|
|
694
|
-
### Phase 1: Initialize
|
|
695
|
-
\`swarmmail_init(project_path="{project_path}", task_description="Swarm: {task}")\`
|
|
696
|
-
|
|
697
|
-
### Phase 1.5: Research Phase (FOR COMPLEX TASKS)
|
|
698
|
-
|
|
699
|
-
**⚠️ If the task requires understanding unfamiliar technologies, APIs, or libraries, spawn a researcher FIRST.**
|
|
700
|
-
|
|
701
|
-
**DO NOT call documentation tools directly.** Instead:
|
|
702
|
-
|
|
703
|
-
\`\`\`
|
|
704
|
-
// 1. Spawn researcher with explicit tech stack
|
|
705
|
-
swarm_spawn_researcher(
|
|
706
|
-
research_id="research-nextjs-cache-components",
|
|
707
|
-
epic_id="<epic-id>",
|
|
708
|
-
tech_stack=["Next.js 16 Cache Components", "React Server Components"],
|
|
709
|
-
project_path="{project_path}"
|
|
710
|
-
)
|
|
711
|
-
|
|
712
|
-
// 2. Spawn researcher as Task subagent
|
|
713
|
-
const researchFindings = await Task(subagent_type="swarm/researcher", prompt="<from above>")
|
|
714
|
-
|
|
715
|
-
// 3. Researcher returns condensed summary
|
|
716
|
-
// Use this summary in shared_context for workers
|
|
717
|
-
\`\`\`
|
|
718
|
-
|
|
719
|
-
**When to spawn a researcher:**
|
|
720
|
-
- Task involves unfamiliar framework versions (e.g., Next.js 16 vs 14)
|
|
721
|
-
- Need to compare installed vs latest library APIs
|
|
722
|
-
- Working with experimental/preview features
|
|
723
|
-
- Need architectural guidance from documentation
|
|
724
|
-
|
|
725
|
-
**When NOT to spawn a researcher:**
|
|
726
|
-
- Using well-known stable APIs (React hooks, Express middleware)
|
|
727
|
-
- Task is purely refactoring existing code
|
|
728
|
-
- You already have relevant findings from semantic-memory or CASS
|
|
729
|
-
|
|
730
|
-
**Researcher output:**
|
|
731
|
-
- Full findings stored in semantic-memory (searchable by future agents)
|
|
732
|
-
- Condensed 3-5 bullet summary returned for shared_context
|
|
733
|
-
|
|
734
|
-
### Phase 2: Knowledge Gathering (MANDATORY)
|
|
735
|
-
|
|
736
|
-
**Before decomposing, query ALL knowledge sources:**
|
|
737
|
-
|
|
738
|
-
\`\`\`
|
|
739
|
-
semantic-memory_find(query="<task keywords>", limit=5) # Past learnings
|
|
740
|
-
cass_search(query="<task description>", limit=5) # Similar past tasks
|
|
741
|
-
skills_list() # Available skills
|
|
742
|
-
\`\`\`
|
|
743
|
-
|
|
744
|
-
Synthesize findings into shared_context for workers.
|
|
745
|
-
|
|
746
|
-
### Phase 3: Decompose
|
|
747
|
-
\`\`\`
|
|
748
|
-
swarm_select_strategy(task="<task>")
|
|
749
|
-
swarm_plan_prompt(task="<task>", context="<synthesized knowledge>")
|
|
750
|
-
swarm_validate_decomposition(response="<CellTree JSON>")
|
|
751
|
-
\`\`\`
|
|
752
|
-
|
|
753
|
-
### Phase 4: Create Cells
|
|
754
|
-
\`hive_create_epic(epic_title="<task>", subtasks=[...])\`
|
|
755
|
-
|
|
756
|
-
### Phase 5: DO NOT Reserve Files
|
|
757
|
-
|
|
758
|
-
> **⚠️ Coordinator NEVER reserves files.** Workers reserve their own files.
|
|
759
|
-
> If coordinator reserves, workers get blocked and swarm stalls.
|
|
760
|
-
|
|
761
|
-
### Phase 6: Spawn Workers for ALL Subtasks (MANDATORY)
|
|
762
|
-
|
|
763
|
-
> **⚠️ ALWAYS spawn workers, even for sequential tasks.**
|
|
764
|
-
> - Parallel tasks: Spawn ALL in a single message
|
|
765
|
-
> - Sequential tasks: Spawn one, wait for completion, spawn next
|
|
766
|
-
|
|
767
|
-
**For parallel work:**
|
|
768
|
-
\`\`\`
|
|
769
|
-
// Single message with multiple Task calls
|
|
770
|
-
swarm_spawn_subtask(bead_id_1, epic_id, title_1, files_1, shared_context, project_path="{project_path}")
|
|
771
|
-
Task(subagent_type="swarm/worker", prompt="<from above>")
|
|
772
|
-
swarm_spawn_subtask(bead_id_2, epic_id, title_2, files_2, shared_context, project_path="{project_path}")
|
|
773
|
-
Task(subagent_type="swarm/worker", prompt="<from above>")
|
|
774
|
-
\`\`\`
|
|
775
|
-
|
|
776
|
-
**For sequential work:**
|
|
777
|
-
\`\`\`
|
|
778
|
-
// Spawn worker 1, wait for completion
|
|
779
|
-
swarm_spawn_subtask(bead_id_1, ...)
|
|
780
|
-
const result1 = await Task(subagent_type="swarm/worker", prompt="<from above>")
|
|
781
|
-
|
|
782
|
-
// THEN spawn worker 2 with context from worker 1
|
|
783
|
-
swarm_spawn_subtask(bead_id_2, ..., shared_context="Worker 1 completed: " + result1)
|
|
784
|
-
const result2 = await Task(subagent_type="swarm/worker", prompt="<from above>")
|
|
785
|
-
\`\`\`
|
|
786
|
-
|
|
787
|
-
**NEVER do the work yourself.** Even if it seems faster, spawn a worker.
|
|
788
|
-
|
|
789
|
-
**IMPORTANT:** Pass \`project_path\` to \`swarm_spawn_subtask\` so workers can call \`swarmmail_init\`.
|
|
790
|
-
|
|
791
|
-
### Phase 7: MANDATORY Review Loop (NON-NEGOTIABLE)
|
|
792
|
-
|
|
793
|
-
**⚠️ AFTER EVERY Task() RETURNS, YOU MUST:**
|
|
794
|
-
|
|
795
|
-
1. **CHECK INBOX** - Worker may have sent messages
|
|
796
|
-
\`swarmmail_inbox()\`
|
|
797
|
-
\`swarmmail_read_message(message_id=N)\`
|
|
798
|
-
|
|
799
|
-
2. **REVIEW WORK** - Generate review with diff
|
|
800
|
-
\`swarm_review(project_key, epic_id, task_id, files_touched)\`
|
|
801
|
-
|
|
802
|
-
3. **EVALUATE** - Does it meet epic goals?
|
|
803
|
-
- Fulfills subtask requirements?
|
|
804
|
-
- Serves overall epic goal?
|
|
805
|
-
- Enables downstream tasks?
|
|
806
|
-
- Type safety, no obvious bugs?
|
|
807
|
-
|
|
808
|
-
4. **SEND FEEDBACK** - Approve or request changes
|
|
809
|
-
\`swarm_review_feedback(project_key, task_id, worker_id, status, issues)\`
|
|
810
|
-
|
|
811
|
-
**If approved:**
|
|
812
|
-
- Close cell, spawn next worker
|
|
813
|
-
|
|
814
|
-
**If needs_changes:**
|
|
815
|
-
- \`swarm_review_feedback\` returns \`retry_context\` (NOT sends message - worker is dead)
|
|
816
|
-
- Generate retry prompt: \`swarm_spawn_retry(retry_context)\`
|
|
817
|
-
- Spawn NEW worker with Task() using retry prompt
|
|
818
|
-
- Max 3 attempts before marking task blocked
|
|
819
|
-
|
|
820
|
-
**If 3 failures:**
|
|
821
|
-
- Mark task blocked, escalate to human
|
|
822
|
-
|
|
823
|
-
5. **ONLY THEN** - Spawn next worker or complete
|
|
824
|
-
|
|
825
|
-
**DO NOT skip this. DO NOT batch reviews. Review EACH worker IMMEDIATELY after return.**
|
|
826
|
-
|
|
827
|
-
**Intervene if:**
|
|
828
|
-
- Worker blocked >5min → unblock or reassign
|
|
829
|
-
- File conflicts → mediate between workers
|
|
830
|
-
- Scope creep → approve or reject expansion
|
|
831
|
-
- Review fails 3x → mark task blocked, escalate to human
|
|
832
|
-
|
|
833
|
-
### Phase 8: Complete
|
|
834
|
-
\`\`\`
|
|
835
|
-
# After all workers complete and reviews pass:
|
|
836
|
-
hive_sync() # Sync all cells to git
|
|
837
|
-
# Coordinator does NOT call swarm_complete - workers do that
|
|
838
|
-
\`\`\`
|
|
839
|
-
|
|
840
|
-
## Strategy Reference
|
|
841
|
-
|
|
842
|
-
| Strategy | Best For | Keywords |
|
|
843
|
-
| -------------- | ------------------------ | -------------------------------------- |
|
|
844
|
-
| file-based | Refactoring, migrations | refactor, migrate, rename, update all |
|
|
845
|
-
| feature-based | New features | add, implement, build, create, feature |
|
|
846
|
-
| risk-based | Bug fixes, security | fix, bug, security, critical, urgent |
|
|
847
|
-
| research-based | Investigation, discovery | research, investigate, explore, learn |
|
|
848
|
-
|
|
849
|
-
## Flag Reference
|
|
850
|
-
|
|
851
|
-
| Flag | Effect |
|
|
852
|
-
|------|--------|
|
|
853
|
-
| \`--fast\` | Skip Socratic questions, use defaults |
|
|
854
|
-
| \`--auto\` | Zero interaction, heuristic decisions |
|
|
855
|
-
| \`--confirm-only\` | Show plan, get yes/no only |
|
|
856
|
-
|
|
857
|
-
Begin with Phase 0 (Socratic Planning) unless \`--fast\` or \`--auto\` flag is present.
|
|
858
|
-
`;
|
|
859
|
-
|
|
860
|
-
/**
|
|
861
|
-
* Researcher Agent Prompt Template
|
|
862
|
-
*
|
|
863
|
-
* Spawned BEFORE decomposition to gather technology documentation.
|
|
864
|
-
* Researchers receive an EXPLICIT list of technologies to research from the coordinator.
|
|
865
|
-
* They dynamically discover WHAT TOOLS are available to fetch docs.
|
|
866
|
-
* Output: condensed summary for shared_context + detailed findings in semantic-memory.
|
|
867
|
-
*/
|
|
868
|
-
export const RESEARCHER_PROMPT = `You are a swarm researcher gathering documentation for: **{research_id}**
|
|
869
|
-
|
|
870
|
-
## [IDENTITY]
|
|
871
|
-
Agent: (assigned at spawn)
|
|
872
|
-
Research Task: {research_id}
|
|
873
|
-
Epic: {epic_id}
|
|
874
|
-
|
|
875
|
-
## [MISSION]
|
|
876
|
-
Gather comprehensive documentation for the specified technologies to inform task decomposition.
|
|
877
|
-
|
|
878
|
-
**COORDINATOR PROVIDED THESE TECHNOLOGIES TO RESEARCH:**
|
|
879
|
-
{tech_stack}
|
|
880
|
-
|
|
881
|
-
You do NOT discover what to research - the coordinator already decided that.
|
|
882
|
-
You DO discover what TOOLS are available to fetch documentation.
|
|
883
|
-
|
|
884
|
-
## [OUTPUT MODE]
|
|
885
|
-
{check_upgrades}
|
|
886
|
-
|
|
887
|
-
## [WORKFLOW]
|
|
888
|
-
|
|
889
|
-
### Step 1: Initialize (MANDATORY FIRST)
|
|
890
|
-
\`\`\`
|
|
891
|
-
swarmmail_init(project_path="{project_path}", task_description="{research_id}: Documentation research")
|
|
892
|
-
\`\`\`
|
|
893
|
-
|
|
894
|
-
### Step 2: Discover Available Documentation Tools
|
|
895
|
-
Check what's available for fetching docs:
|
|
896
|
-
- **next-devtools**: \`nextjs_docs\` for Next.js documentation
|
|
897
|
-
- **context7**: Library documentation lookup (\`use context7\` in prompts)
|
|
898
|
-
- **fetch**: General web fetching for official docs sites
|
|
899
|
-
- **pdf-brain**: Internal knowledge base search
|
|
900
|
-
|
|
901
|
-
**Don't assume** - check which tools exist in your environment.
|
|
902
|
-
|
|
903
|
-
### Step 3: Read Installed Versions
|
|
904
|
-
For each technology in the tech stack:
|
|
905
|
-
1. Check package.json (or equivalent) for installed version
|
|
906
|
-
2. Record exact version numbers
|
|
907
|
-
3. Note any version constraints (^, ~, etc.)
|
|
908
|
-
|
|
909
|
-
### Step 4: Fetch Documentation
|
|
910
|
-
For EACH technology in the list:
|
|
911
|
-
- Use the most appropriate tool (Next.js → nextjs_docs, libraries → context7, others → fetch)
|
|
912
|
-
- Fetch documentation for the INSTALLED version (not latest, unless --check-upgrades)
|
|
913
|
-
- Focus on: API changes, breaking changes, migration guides, best practices
|
|
914
|
-
- Extract key patterns, gotchas, and compatibility notes
|
|
915
|
-
|
|
916
|
-
**If --check-upgrades mode:**
|
|
917
|
-
- ALSO fetch docs for the LATEST version
|
|
918
|
-
- Compare installed vs latest
|
|
919
|
-
- Note breaking changes, new features, migration complexity
|
|
920
|
-
|
|
921
|
-
### Step 5: Store Detailed Findings
|
|
922
|
-
For EACH technology, store in semantic-memory:
|
|
923
|
-
\`\`\`
|
|
924
|
-
semantic-memory_store(
|
|
925
|
-
information="<technology-name> <version>: <key patterns, gotchas, API changes, compatibility notes>",
|
|
926
|
-
tags="research, <tech-name>, documentation, {epic_id}"
|
|
927
|
-
)
|
|
928
|
-
\`\`\`
|
|
929
|
-
|
|
930
|
-
**Why store individually?** Future agents can search by technology name.
|
|
931
|
-
|
|
932
|
-
### Step 6: Broadcast Summary
|
|
933
|
-
Send condensed findings to coordinator:
|
|
934
|
-
\`\`\`
|
|
935
|
-
swarmmail_send(
|
|
936
|
-
to=["coordinator"],
|
|
937
|
-
subject="Research Complete: {research_id}",
|
|
938
|
-
body="<brief summary - see semantic-memory for details>",
|
|
939
|
-
thread_id="{epic_id}"
|
|
940
|
-
)
|
|
941
|
-
\`\`\`
|
|
942
|
-
|
|
943
|
-
### Step 7: Return Structured Output
|
|
944
|
-
Output JSON with:
|
|
945
|
-
\`\`\`json
|
|
946
|
-
{
|
|
947
|
-
"technologies": [
|
|
948
|
-
{
|
|
949
|
-
"name": "string",
|
|
950
|
-
"installed_version": "string",
|
|
951
|
-
"latest_version": "string | null", // Only if --check-upgrades
|
|
952
|
-
"key_patterns": ["string"],
|
|
953
|
-
"gotchas": ["string"],
|
|
954
|
-
"breaking_changes": ["string"], // Only if --check-upgrades
|
|
955
|
-
"memory_id": "string" // ID of semantic-memory entry
|
|
956
|
-
}
|
|
957
|
-
],
|
|
958
|
-
"summary": "string" // Condensed summary for shared_context
|
|
959
|
-
}
|
|
960
|
-
\`\`\`
|
|
961
|
-
|
|
962
|
-
## [CRITICAL REQUIREMENTS]
|
|
963
|
-
|
|
964
|
-
**NON-NEGOTIABLE:**
|
|
965
|
-
1. Step 1 (swarmmail_init) MUST be first
|
|
966
|
-
2. Research ONLY the technologies the coordinator specified
|
|
967
|
-
3. Fetch docs for INSTALLED versions (unless --check-upgrades)
|
|
968
|
-
4. Store detailed findings in semantic-memory (one per technology)
|
|
969
|
-
5. Return condensed summary for coordinator (full details in memory)
|
|
970
|
-
6. Use appropriate doc tools (nextjs_docs for Next.js, context7 for libraries, etc.)
|
|
971
|
-
|
|
972
|
-
**Output goes TWO places:**
|
|
973
|
-
- **semantic-memory**: Detailed findings (searchable by future agents)
|
|
974
|
-
- **Return JSON**: Condensed summary (for coordinator's shared_context)
|
|
975
|
-
|
|
976
|
-
Begin research now.`;
|
|
977
|
-
|
|
978
|
-
/**
|
|
979
|
-
* Coordinator post-worker checklist - MANDATORY review loop
|
|
980
|
-
*
|
|
981
|
-
* This checklist is returned to coordinators after spawning a worker.
|
|
982
|
-
* It ensures coordinators REVIEW worker output before spawning the next worker.
|
|
983
|
-
*/
|
|
984
|
-
export const COORDINATOR_POST_WORKER_CHECKLIST = `
|
|
985
|
-
## ⚠️ MANDATORY: Post-Worker Review (DO THIS IMMEDIATELY)
|
|
986
|
-
|
|
987
|
-
**A worker just returned. Before doing ANYTHING else, complete this checklist:**
|
|
988
|
-
|
|
989
|
-
### Step 1: Check Swarm Mail
|
|
990
|
-
\`\`\`
|
|
991
|
-
swarmmail_inbox()
|
|
992
|
-
swarmmail_read_message(message_id=N) // Read any messages from the worker
|
|
993
|
-
\`\`\`
|
|
994
|
-
|
|
995
|
-
### Step 2: Review the Work
|
|
996
|
-
\`\`\`
|
|
997
|
-
swarm_review(
|
|
998
|
-
project_key="{project_key}",
|
|
999
|
-
epic_id="{epic_id}",
|
|
1000
|
-
task_id="{task_id}",
|
|
1001
|
-
files_touched=[{files_touched}]
|
|
1002
|
-
)
|
|
1003
|
-
\`\`\`
|
|
1004
|
-
|
|
1005
|
-
This generates a review prompt with:
|
|
1006
|
-
- Epic context (what we're trying to achieve)
|
|
1007
|
-
- Subtask requirements
|
|
1008
|
-
- Git diff of changes
|
|
1009
|
-
- Dependency status
|
|
1010
|
-
|
|
1011
|
-
### Step 3: Evaluate Against Criteria
|
|
1012
|
-
- Does the work fulfill the subtask requirements?
|
|
1013
|
-
- Does it serve the overall epic goal?
|
|
1014
|
-
- Does it enable downstream tasks?
|
|
1015
|
-
- Type safety, no obvious bugs?
|
|
1016
|
-
|
|
1017
|
-
### Step 4: Send Feedback
|
|
1018
|
-
\`\`\`
|
|
1019
|
-
swarm_review_feedback(
|
|
1020
|
-
project_key="{project_key}",
|
|
1021
|
-
task_id="{task_id}",
|
|
1022
|
-
worker_id="{worker_id}",
|
|
1023
|
-
status="approved", // or "needs_changes"
|
|
1024
|
-
summary="<brief summary>",
|
|
1025
|
-
issues="[]" // or "[{file, line, issue, suggestion}]"
|
|
1026
|
-
)
|
|
1027
|
-
\`\`\`
|
|
1028
|
-
|
|
1029
|
-
### Step 5: Take Action Based on Review
|
|
1030
|
-
|
|
1031
|
-
**If APPROVED:**
|
|
1032
|
-
- Close the cell with hive_close
|
|
1033
|
-
- Spawn next worker (if any) using swarm_spawn_subtask
|
|
1034
|
-
|
|
1035
|
-
**If NEEDS_CHANGES:**
|
|
1036
|
-
- Generate retry prompt:
|
|
1037
|
-
\`\`\`
|
|
1038
|
-
swarm_spawn_retry(
|
|
1039
|
-
bead_id="{task_id}",
|
|
1040
|
-
epic_id="{epic_id}",
|
|
1041
|
-
original_prompt="<original prompt>",
|
|
1042
|
-
attempt=<current_attempt>,
|
|
1043
|
-
issues="<JSON from swarm_review_feedback>",
|
|
1044
|
-
diff="<git diff of previous changes>",
|
|
1045
|
-
files=[{files_touched}],
|
|
1046
|
-
project_path="{project_key}"
|
|
1047
|
-
)
|
|
1048
|
-
\`\`\`
|
|
1049
|
-
- Spawn new worker with Task() using the retry prompt
|
|
1050
|
-
- Increment attempt counter (max 3 attempts)
|
|
1051
|
-
|
|
1052
|
-
**If 3 FAILURES:**
|
|
1053
|
-
- Mark task as blocked: \`hive_update(id="{task_id}", status="blocked")\`
|
|
1054
|
-
- Escalate to human - likely an architectural problem, not execution issue
|
|
1055
|
-
|
|
1056
|
-
**⚠️ DO NOT spawn the next worker until review is complete.**
|
|
1057
|
-
`;
|
|
1058
|
-
|
|
1059
|
-
/**
|
|
1060
|
-
* Prompt for self-evaluation before completing a subtask.
|
|
1061
|
-
*
|
|
1062
|
-
* Agents use this to assess their work quality before marking complete.
|
|
1063
|
-
*/
|
|
1064
|
-
export const EVALUATION_PROMPT = `Evaluate the work completed for this subtask.
|
|
1065
|
-
|
|
1066
|
-
## Subtask
|
|
1067
|
-
**Cell ID**: {bead_id}
|
|
1068
|
-
**Title**: {subtask_title}
|
|
1069
|
-
|
|
1070
|
-
## Files Modified
|
|
1071
|
-
{files_touched}
|
|
1072
|
-
|
|
1073
|
-
## Evaluation Criteria
|
|
1074
|
-
|
|
1075
|
-
For each criterion, assess passed/failed and provide brief feedback:
|
|
1076
|
-
|
|
1077
|
-
1. **type_safe**: Code compiles without TypeScript errors
|
|
1078
|
-
2. **no_bugs**: No obvious bugs, edge cases handled
|
|
1079
|
-
3. **patterns**: Follows existing codebase patterns and conventions
|
|
1080
|
-
4. **readable**: Code is clear and maintainable
|
|
1081
|
-
|
|
1082
|
-
## Response Format
|
|
1083
|
-
|
|
1084
|
-
\`\`\`json
|
|
1085
|
-
{
|
|
1086
|
-
"passed": boolean, // Overall pass/fail
|
|
1087
|
-
"criteria": {
|
|
1088
|
-
"type_safe": { "passed": boolean, "feedback": string },
|
|
1089
|
-
"no_bugs": { "passed": boolean, "feedback": string },
|
|
1090
|
-
"patterns": { "passed": boolean, "feedback": string },
|
|
1091
|
-
"readable": { "passed": boolean, "feedback": string }
|
|
1092
|
-
},
|
|
1093
|
-
"overall_feedback": string,
|
|
1094
|
-
"retry_suggestion": string | null // If failed, what to fix
|
|
1095
|
-
}
|
|
1096
|
-
\`\`\`
|
|
1097
|
-
|
|
1098
|
-
If any criterion fails, the overall evaluation fails and retry_suggestion
|
|
1099
|
-
should describe what needs to be fixed.`;
|
|
1100
|
-
|
|
1101
|
-
// ============================================================================
|
|
1102
|
-
// Eval Failure Learning Integration
|
|
1103
|
-
// ============================================================================
|
|
1104
|
-
|
|
1105
|
-
/**
|
|
1106
|
-
* Query recent eval failures from semantic memory
|
|
1107
|
-
*
|
|
1108
|
-
* Coordinators call this at session start to learn from recent eval regressions.
|
|
1109
|
-
* Returns formatted string for injection into coordinator prompts.
|
|
1110
|
-
*
|
|
1111
|
-
* @returns Formatted string of recent failures (empty if none or memory unavailable)
|
|
1112
|
-
*/
|
|
1113
|
-
export async function getRecentEvalFailures(): Promise<string> {
|
|
1114
|
-
try {
|
|
1115
|
-
const adapter = await getMemoryAdapter();
|
|
1116
|
-
|
|
1117
|
-
// Query memories for eval failures
|
|
1118
|
-
const result = await adapter.find({
|
|
1119
|
-
query: "eval-failure regression coordinator",
|
|
1120
|
-
limit: 3,
|
|
1121
|
-
});
|
|
1122
|
-
|
|
1123
|
-
if (result.count === 0) {
|
|
1124
|
-
return "";
|
|
1125
|
-
}
|
|
1126
|
-
|
|
1127
|
-
const lines = result.results.map((f) => `- ${f.content.slice(0, 200)}...`);
|
|
1128
|
-
|
|
1129
|
-
return `
|
|
1130
|
-
## ⚠️ Recent Eval Failures (Learn From These)
|
|
1131
|
-
|
|
1132
|
-
The following eval regressions were detected recently. Avoid these patterns:
|
|
1133
|
-
|
|
1134
|
-
${lines.join("\n")}
|
|
1135
|
-
|
|
1136
|
-
**Action:** Review these failures and ensure your coordination avoids similar issues.
|
|
1137
|
-
`;
|
|
1138
|
-
} catch (e) {
|
|
1139
|
-
// Best effort - don't fail if memory unavailable
|
|
1140
|
-
console.warn("Failed to query eval failures:", e);
|
|
1141
|
-
return "";
|
|
1142
|
-
}
|
|
1143
|
-
}
|
|
1144
|
-
|
|
1145
|
-
// ============================================================================
|
|
1146
|
-
// Prompt Insights Integration
|
|
1147
|
-
// ============================================================================
|
|
1148
|
-
|
|
1149
|
-
interface PromptInsightsOptions {
|
|
1150
|
-
role: "coordinator" | "worker";
|
|
1151
|
-
project_key?: string;
|
|
1152
|
-
files?: string[];
|
|
1153
|
-
domain?: string;
|
|
1154
|
-
}
|
|
1155
|
-
|
|
1156
|
-
/**
|
|
1157
|
-
* Get swarm insights for prompt injection
|
|
1158
|
-
*
|
|
1159
|
-
* Queries recent swarm outcomes and semantic memory to surface:
|
|
1160
|
-
* - Strategy success rates
|
|
1161
|
-
* - Common failure modes
|
|
1162
|
-
* - Anti-patterns
|
|
1163
|
-
* - File/domain-specific learnings
|
|
1164
|
-
*
|
|
1165
|
-
* Returns formatted string for injection into coordinator or worker prompts.
|
|
1166
|
-
*
|
|
1167
|
-
* @param options - Role and filters for insights
|
|
1168
|
-
* @returns Formatted insights string (empty if no data or errors)
|
|
1169
|
-
*/
|
|
1170
|
-
export async function getPromptInsights(
|
|
1171
|
-
options: PromptInsightsOptions,
|
|
1172
|
-
): Promise<string> {
|
|
1173
|
-
try {
|
|
1174
|
-
if (options.role === "coordinator") {
|
|
1175
|
-
return await getCoordinatorInsights(options.project_key);
|
|
1176
|
-
} else {
|
|
1177
|
-
return await getWorkerInsights(options.files, options.domain);
|
|
1178
|
-
}
|
|
1179
|
-
} catch (e) {
|
|
1180
|
-
// Best effort - don't fail if data unavailable
|
|
1181
|
-
console.warn("Failed to query prompt insights:", e);
|
|
1182
|
-
return "";
|
|
1183
|
-
}
|
|
1184
|
-
}
|
|
1185
|
-
|
|
1186
|
-
/**
|
|
1187
|
-
* Get coordinator-specific insights (strategy stats, anti-patterns)
|
|
1188
|
-
*/
|
|
1189
|
-
async function getCoordinatorInsights(project_key?: string): Promise<string> {
|
|
1190
|
-
try {
|
|
1191
|
-
// Import swarm-mail and swarm-insights modules
|
|
1192
|
-
const { createLibSQLAdapter, createSwarmMailAdapter } = await import("swarm-mail");
|
|
1193
|
-
const { getStrategyInsights, getPatternInsights, formatInsightsForPrompt } = await import("./swarm-insights.js");
|
|
1194
|
-
|
|
1195
|
-
// Create libSQL database adapter
|
|
1196
|
-
const dbAdapter = await createLibSQLAdapter({ url: "file:./.swarm-mail/streams.db" });
|
|
1197
|
-
|
|
1198
|
-
// Create swarm-mail adapter with database
|
|
1199
|
-
const adapter = createSwarmMailAdapter(dbAdapter, project_key || "default");
|
|
1200
|
-
|
|
1201
|
-
// Query insights from the new data layer
|
|
1202
|
-
const [strategies, patterns] = await Promise.all([
|
|
1203
|
-
getStrategyInsights(adapter, ""),
|
|
1204
|
-
getPatternInsights(adapter),
|
|
1205
|
-
]);
|
|
1206
|
-
|
|
1207
|
-
// Bundle insights
|
|
1208
|
-
const bundle = {
|
|
1209
|
-
strategies,
|
|
1210
|
-
patterns,
|
|
1211
|
-
};
|
|
1212
|
-
|
|
1213
|
-
// Format for prompt injection (<500 tokens)
|
|
1214
|
-
const formatted = formatInsightsForPrompt(bundle, { maxTokens: 500 });
|
|
1215
|
-
|
|
1216
|
-
if (!formatted) {
|
|
1217
|
-
return "";
|
|
1218
|
-
}
|
|
1219
|
-
|
|
1220
|
-
// Add section header
|
|
1221
|
-
return `
|
|
1222
|
-
## 📊 Historical Insights
|
|
1223
|
-
|
|
1224
|
-
${formatted}
|
|
1225
|
-
|
|
1226
|
-
**Use these learnings when selecting decomposition strategies and planning subtasks.**
|
|
1227
|
-
`;
|
|
1228
|
-
} catch (e) {
|
|
1229
|
-
console.warn("Failed to get coordinator insights:", e);
|
|
1230
|
-
return "";
|
|
1231
|
-
}
|
|
1232
|
-
}
|
|
1233
|
-
|
|
1234
|
-
/**
|
|
1235
|
-
* Get worker-specific insights (file/domain learnings, common pitfalls)
|
|
1236
|
-
*/
|
|
1237
|
-
async function getWorkerInsights(
|
|
1238
|
-
files?: string[],
|
|
1239
|
-
domain?: string,
|
|
1240
|
-
): Promise<string> {
|
|
1241
|
-
try {
|
|
1242
|
-
// Import swarm-mail and swarm-insights modules
|
|
1243
|
-
const { createLibSQLAdapter, createSwarmMailAdapter } = await import("swarm-mail");
|
|
1244
|
-
const { getFileInsights, formatInsightsForPrompt } = await import("./swarm-insights.js");
|
|
1245
|
-
const memoryAdapter = await getMemoryAdapter();
|
|
1246
|
-
|
|
1247
|
-
// Build query from files and domain
|
|
1248
|
-
let query = "";
|
|
1249
|
-
if (files && files.length > 0) {
|
|
1250
|
-
// Extract domain keywords from file paths
|
|
1251
|
-
const keywords = files
|
|
1252
|
-
.flatMap((f) => f.split(/[\/\\.]/).filter((part) => part.length > 2))
|
|
1253
|
-
.slice(0, 5);
|
|
1254
|
-
query = keywords.join(" ");
|
|
1255
|
-
} else if (domain) {
|
|
1256
|
-
query = domain;
|
|
1257
|
-
} else {
|
|
1258
|
-
return ""; // No context to query
|
|
1259
|
-
}
|
|
1260
|
-
|
|
1261
|
-
// Query BOTH event store (via swarm-insights) AND semantic memory
|
|
1262
|
-
const [fileInsights, memoryResult] = await Promise.all([
|
|
1263
|
-
// Get file-specific insights from event store
|
|
1264
|
-
(async () => {
|
|
1265
|
-
if (!files || files.length === 0) return [];
|
|
1266
|
-
try {
|
|
1267
|
-
const dbAdapter = await createLibSQLAdapter({ url: "file:./.swarm-mail/streams.db" });
|
|
1268
|
-
const swarmMail = createSwarmMailAdapter(dbAdapter, "default");
|
|
1269
|
-
return await getFileInsights(swarmMail, files);
|
|
1270
|
-
} catch (e) {
|
|
1271
|
-
console.warn("Failed to get file insights from event store:", e);
|
|
1272
|
-
return [];
|
|
1273
|
-
}
|
|
1274
|
-
})(),
|
|
1275
|
-
|
|
1276
|
-
// Get domain/file learnings from semantic memory
|
|
1277
|
-
memoryAdapter.find({
|
|
1278
|
-
query: `${query} gotcha pitfall pattern bug`,
|
|
1279
|
-
limit: 3,
|
|
1280
|
-
}),
|
|
1281
|
-
]);
|
|
1282
|
-
|
|
1283
|
-
// Bundle insights for formatting
|
|
1284
|
-
const bundle = {
|
|
1285
|
-
files: fileInsights,
|
|
1286
|
-
};
|
|
1287
|
-
|
|
1288
|
-
// Format file insights using swarm-insights formatter
|
|
1289
|
-
const formattedFileInsights = formatInsightsForPrompt(bundle, { maxTokens: 300 });
|
|
1290
|
-
|
|
1291
|
-
// Format semantic memory learnings
|
|
1292
|
-
let formattedMemory = "";
|
|
1293
|
-
if (memoryResult.count > 0) {
|
|
1294
|
-
const learnings = memoryResult.results.map((r) => {
|
|
1295
|
-
const content = r.content.length > 150
|
|
1296
|
-
? r.content.slice(0, 150) + "..."
|
|
1297
|
-
: r.content;
|
|
1298
|
-
return `- ${content}`;
|
|
1299
|
-
});
|
|
1300
|
-
|
|
1301
|
-
formattedMemory = `## 💡 Relevant Learnings (from past agents)
|
|
1302
|
-
|
|
1303
|
-
${learnings.join("\n")}
|
|
1304
|
-
|
|
1305
|
-
**Check semantic-memory for full details if needed.**`;
|
|
1306
|
-
}
|
|
1307
|
-
|
|
1308
|
-
// Combine both sources
|
|
1309
|
-
const sections = [formattedFileInsights, formattedMemory].filter(s => s.length > 0);
|
|
1310
|
-
|
|
1311
|
-
if (sections.length === 0) {
|
|
1312
|
-
return "";
|
|
1313
|
-
}
|
|
1314
|
-
|
|
1315
|
-
return sections.join("\n\n");
|
|
1316
|
-
} catch (e) {
|
|
1317
|
-
console.warn("Failed to get worker insights:", e);
|
|
1318
|
-
return "";
|
|
1319
|
-
}
|
|
1320
|
-
}
|
|
1321
|
-
|
|
1322
|
-
// ============================================================================
|
|
1323
|
-
// Helper Functions
|
|
1324
|
-
// ============================================================================
|
|
1325
|
-
|
|
1326
|
-
/**
|
|
1327
|
-
* Format the researcher prompt for a documentation research task
|
|
1328
|
-
*/
|
|
1329
|
-
export function formatResearcherPrompt(params: {
|
|
1330
|
-
research_id: string;
|
|
1331
|
-
epic_id: string;
|
|
1332
|
-
tech_stack: string[];
|
|
1333
|
-
project_path: string;
|
|
1334
|
-
check_upgrades: boolean;
|
|
1335
|
-
}): string {
|
|
1336
|
-
const techList = params.tech_stack.map((t) => `- ${t}`).join("\n");
|
|
1337
|
-
|
|
1338
|
-
const upgradesMode = params.check_upgrades
|
|
1339
|
-
? "**UPGRADE COMPARISON MODE**: Fetch docs for BOTH installed AND latest versions. Compare and note breaking changes."
|
|
1340
|
-
: "**DEFAULT MODE**: Fetch docs for INSTALLED versions only (from lockfiles).";
|
|
1341
|
-
|
|
1342
|
-
return RESEARCHER_PROMPT
|
|
1343
|
-
.replace(/{research_id}/g, params.research_id)
|
|
1344
|
-
.replace(/{epic_id}/g, params.epic_id)
|
|
1345
|
-
.replace("{tech_stack}", techList)
|
|
1346
|
-
.replace("{project_path}", params.project_path)
|
|
1347
|
-
.replace("{check_upgrades}", upgradesMode);
|
|
1348
|
-
}
|
|
1349
|
-
|
|
1350
|
-
/**
|
|
1351
|
-
* Format the coordinator prompt with task and project path substitution
|
|
1352
|
-
*/
|
|
1353
|
-
export function formatCoordinatorPrompt(params: {
|
|
1354
|
-
task: string;
|
|
1355
|
-
projectPath: string;
|
|
1356
|
-
}): string {
|
|
1357
|
-
return COORDINATOR_PROMPT
|
|
1358
|
-
.replace(/{task}/g, params.task)
|
|
1359
|
-
.replace(/{project_path}/g, params.projectPath);
|
|
1360
|
-
}
|
|
1361
|
-
|
|
1362
|
-
/**
|
|
1363
|
-
* Format the V2 subtask prompt for a specific agent
|
|
1364
|
-
*/
|
|
1365
|
-
export async function formatSubtaskPromptV2(params: {
|
|
1366
|
-
bead_id: string;
|
|
1367
|
-
epic_id: string;
|
|
1368
|
-
subtask_title: string;
|
|
1369
|
-
subtask_description: string;
|
|
1370
|
-
files: string[];
|
|
1371
|
-
shared_context?: string;
|
|
1372
|
-
compressed_context?: string;
|
|
1373
|
-
error_context?: string;
|
|
1374
|
-
project_path?: string;
|
|
1375
|
-
recovery_context?: {
|
|
1376
|
-
shared_context?: string;
|
|
1377
|
-
skills_to_load?: string[];
|
|
1378
|
-
coordinator_notes?: string;
|
|
1379
|
-
};
|
|
1380
|
-
}): Promise<string> {
|
|
1381
|
-
const fileList =
|
|
1382
|
-
params.files.length > 0
|
|
1383
|
-
? params.files.map((f) => `- \`${f}\``).join("\n")
|
|
1384
|
-
: "(no specific files - use judgment)";
|
|
1385
|
-
|
|
1386
|
-
const compressedSection = params.compressed_context
|
|
1387
|
-
? params.compressed_context
|
|
1388
|
-
: "";
|
|
1389
|
-
|
|
1390
|
-
const errorSection = params.error_context ? params.error_context : "";
|
|
1391
|
-
|
|
1392
|
-
// Fetch worker insights (file/domain specific learnings)
|
|
1393
|
-
const insights = await getPromptInsights({
|
|
1394
|
-
role: "worker",
|
|
1395
|
-
files: params.files,
|
|
1396
|
-
domain: params.subtask_title.split(/\s+/).slice(0, 3).join(" ") // Extract domain from title
|
|
1397
|
-
});
|
|
1398
|
-
|
|
1399
|
-
// Build recovery context section
|
|
1400
|
-
let recoverySection = "";
|
|
1401
|
-
if (params.recovery_context) {
|
|
1402
|
-
const sections: string[] = [];
|
|
1403
|
-
|
|
1404
|
-
if (params.recovery_context.shared_context) {
|
|
1405
|
-
sections.push(
|
|
1406
|
-
`### Recovery Context\n${params.recovery_context.shared_context}`,
|
|
1407
|
-
);
|
|
1408
|
-
}
|
|
1409
|
-
|
|
1410
|
-
if (
|
|
1411
|
-
params.recovery_context.skills_to_load &&
|
|
1412
|
-
params.recovery_context.skills_to_load.length > 0
|
|
1413
|
-
) {
|
|
1414
|
-
sections.push(
|
|
1415
|
-
`### Skills to Load\nBefore starting work, load these skills for specialized guidance:\n${params.recovery_context.skills_to_load.map((s) => `- skills_use(name="${s}")`).join("\n")}`,
|
|
1416
|
-
);
|
|
1417
|
-
}
|
|
1418
|
-
|
|
1419
|
-
if (params.recovery_context.coordinator_notes) {
|
|
1420
|
-
sections.push(
|
|
1421
|
-
`### Coordinator Notes\n${params.recovery_context.coordinator_notes}`,
|
|
1422
|
-
);
|
|
1423
|
-
}
|
|
1424
|
-
|
|
1425
|
-
if (sections.length > 0) {
|
|
1426
|
-
recoverySection = `\n## [RECOVERY CONTEXT]\n\n${sections.join("\n\n")}`;
|
|
1427
|
-
}
|
|
1428
|
-
}
|
|
1429
|
-
|
|
1430
|
-
// Generate WorkerHandoff contract (machine-readable section)
|
|
1431
|
-
const handoff = generateWorkerHandoff({
|
|
1432
|
-
task_id: params.bead_id,
|
|
1433
|
-
files_owned: params.files,
|
|
1434
|
-
files_readonly: [],
|
|
1435
|
-
dependencies_completed: [],
|
|
1436
|
-
success_criteria: [
|
|
1437
|
-
"All files compile without errors",
|
|
1438
|
-
"Tests pass for modified code",
|
|
1439
|
-
"Code follows project patterns",
|
|
1440
|
-
],
|
|
1441
|
-
epic_summary: params.subtask_description || params.subtask_title,
|
|
1442
|
-
your_role: params.subtask_title,
|
|
1443
|
-
what_others_did: params.recovery_context?.shared_context || "",
|
|
1444
|
-
what_comes_next: "",
|
|
1445
|
-
});
|
|
1446
|
-
|
|
1447
|
-
const handoffJson = JSON.stringify(handoff, null, 2);
|
|
1448
|
-
const handoffSection = `\n## WorkerHandoff Contract\n\nThis is your machine-readable contract. The contract IS the instruction.\n\n\`\`\`json\n${handoffJson}\n\`\`\`\n`;
|
|
1449
|
-
|
|
1450
|
-
// Inject insights into shared_context section
|
|
1451
|
-
const sharedContextWithInsights = insights
|
|
1452
|
-
? `${params.shared_context || "(none)"}\n\n${insights}`
|
|
1453
|
-
: params.shared_context || "(none)";
|
|
1454
|
-
|
|
1455
|
-
return SUBTASK_PROMPT_V2.replace(/{bead_id}/g, params.bead_id)
|
|
1456
|
-
.replace(/{epic_id}/g, params.epic_id)
|
|
1457
|
-
.replace(/{project_path}/g, params.project_path || "$PWD")
|
|
1458
|
-
.replace("{subtask_title}", params.subtask_title)
|
|
1459
|
-
.replace(
|
|
1460
|
-
"{subtask_description}",
|
|
1461
|
-
params.subtask_description || "(see title)",
|
|
1462
|
-
)
|
|
1463
|
-
.replace("{file_list}", fileList)
|
|
1464
|
-
.replace("{shared_context}", sharedContextWithInsights)
|
|
1465
|
-
.replace("{compressed_context}", compressedSection)
|
|
1466
|
-
.replace("{error_context}", errorSection + recoverySection + handoffSection);
|
|
1467
|
-
}
|
|
1468
|
-
|
|
1469
|
-
/**
|
|
1470
|
-
* Format the subtask prompt for a specific agent
|
|
1471
|
-
*/
|
|
1472
|
-
export function formatSubtaskPrompt(params: {
|
|
1473
|
-
agent_name: string;
|
|
1474
|
-
bead_id: string;
|
|
1475
|
-
epic_id: string;
|
|
1476
|
-
subtask_title: string;
|
|
1477
|
-
subtask_description: string;
|
|
1478
|
-
files: string[];
|
|
1479
|
-
shared_context?: string;
|
|
1480
|
-
}): string {
|
|
1481
|
-
const fileList = params.files.map((f) => `- \`${f}\``).join("\n");
|
|
1482
|
-
|
|
1483
|
-
return SUBTASK_PROMPT.replace("{agent_name}", params.agent_name)
|
|
1484
|
-
.replace("{bead_id}", params.bead_id)
|
|
1485
|
-
.replace(/{epic_id}/g, params.epic_id)
|
|
1486
|
-
.replace("{subtask_title}", params.subtask_title)
|
|
1487
|
-
.replace("{subtask_description}", params.subtask_description || "(none)")
|
|
1488
|
-
.replace("{file_list}", fileList || "(no files assigned)")
|
|
1489
|
-
.replace("{shared_context}", params.shared_context || "(none)");
|
|
1490
|
-
}
|
|
1491
|
-
|
|
1492
|
-
/**
|
|
1493
|
-
* Format the evaluation prompt
|
|
1494
|
-
*/
|
|
1495
|
-
export function formatEvaluationPrompt(params: {
|
|
1496
|
-
bead_id: string;
|
|
1497
|
-
subtask_title: string;
|
|
1498
|
-
files_touched: string[];
|
|
1499
|
-
}): string {
|
|
1500
|
-
const filesList = params.files_touched.map((f) => `- \`${f}\``).join("\n");
|
|
1501
|
-
|
|
1502
|
-
return EVALUATION_PROMPT.replace("{bead_id}", params.bead_id)
|
|
1503
|
-
.replace("{subtask_title}", params.subtask_title)
|
|
1504
|
-
.replace("{files_touched}", filesList || "(no files recorded)");
|
|
1505
|
-
}
|
|
1506
|
-
|
|
1507
|
-
// ============================================================================
|
|
1508
|
-
// Tool Definitions
|
|
1509
|
-
// ============================================================================
|
|
1510
|
-
|
|
1511
|
-
/**
|
|
1512
|
-
* Generate subtask prompt for a spawned agent
|
|
1513
|
-
*/
|
|
1514
|
-
export const swarm_subtask_prompt = tool({
|
|
1515
|
-
description: "Generate the prompt for a spawned subtask agent",
|
|
1516
|
-
args: {
|
|
1517
|
-
agent_name: tool.schema.string().describe("Agent Mail name for the agent"),
|
|
1518
|
-
bead_id: tool.schema.string().describe("Subtask bead ID"),
|
|
1519
|
-
epic_id: tool.schema.string().describe("Epic bead ID"),
|
|
1520
|
-
subtask_title: tool.schema.string().describe("Subtask title"),
|
|
1521
|
-
subtask_description: tool.schema
|
|
1522
|
-
.string()
|
|
1523
|
-
.optional()
|
|
1524
|
-
.describe("Detailed subtask instructions"),
|
|
1525
|
-
files: tool.schema
|
|
1526
|
-
.array(tool.schema.string())
|
|
1527
|
-
.describe("Files assigned to this subtask"),
|
|
1528
|
-
shared_context: tool.schema
|
|
1529
|
-
.string()
|
|
1530
|
-
.optional()
|
|
1531
|
-
.describe("Context shared across all agents"),
|
|
1532
|
-
project_path: tool.schema
|
|
1533
|
-
.string()
|
|
1534
|
-
.optional()
|
|
1535
|
-
.describe("Absolute project path for swarmmail_init"),
|
|
1536
|
-
},
|
|
1537
|
-
async execute(args) {
|
|
1538
|
-
const prompt = formatSubtaskPrompt({
|
|
1539
|
-
agent_name: args.agent_name,
|
|
1540
|
-
bead_id: args.bead_id,
|
|
1541
|
-
epic_id: args.epic_id,
|
|
1542
|
-
subtask_title: args.subtask_title,
|
|
1543
|
-
subtask_description: args.subtask_description || "",
|
|
1544
|
-
files: args.files,
|
|
1545
|
-
shared_context: args.shared_context,
|
|
1546
|
-
});
|
|
1547
|
-
|
|
1548
|
-
return prompt;
|
|
1549
|
-
},
|
|
1550
|
-
});
|
|
1551
|
-
|
|
1552
|
-
/**
|
|
1553
|
-
* Prepare a subtask for spawning with Task tool (V2 prompt)
|
|
1554
|
-
*
|
|
1555
|
-
* Generates a streamlined prompt that tells agents to USE Agent Mail and hive tracking.
|
|
1556
|
-
* Returns JSON that can be directly used with Task tool.
|
|
1557
|
-
*/
|
|
1558
|
-
export const swarm_spawn_subtask = tool({
|
|
1559
|
-
description:
|
|
1560
|
-
"Prepare a subtask for spawning. Returns prompt with Agent Mail/hive tracking instructions. IMPORTANT: Pass project_path for swarmmail_init. Automatically selects appropriate model based on file types.",
|
|
1561
|
-
args: {
|
|
1562
|
-
bead_id: tool.schema.string().describe("Subtask bead ID"),
|
|
1563
|
-
epic_id: tool.schema.string().describe("Parent epic bead ID"),
|
|
1564
|
-
subtask_title: tool.schema.string().describe("Subtask title"),
|
|
1565
|
-
subtask_description: tool.schema
|
|
1566
|
-
.string()
|
|
1567
|
-
.optional()
|
|
1568
|
-
.describe("Detailed subtask instructions"),
|
|
1569
|
-
files: tool.schema
|
|
1570
|
-
.array(tool.schema.string())
|
|
1571
|
-
.describe("Files assigned to this subtask"),
|
|
1572
|
-
shared_context: tool.schema
|
|
1573
|
-
.string()
|
|
1574
|
-
.optional()
|
|
1575
|
-
.describe("Context shared across all agents"),
|
|
1576
|
-
project_path: tool.schema
|
|
1577
|
-
.string()
|
|
1578
|
-
.optional()
|
|
1579
|
-
.describe(
|
|
1580
|
-
"Absolute project path for swarmmail_init (REQUIRED for tracking)",
|
|
1581
|
-
),
|
|
1582
|
-
recovery_context: tool.schema
|
|
1583
|
-
.object({
|
|
1584
|
-
shared_context: tool.schema.string().optional(),
|
|
1585
|
-
skills_to_load: tool.schema.array(tool.schema.string()).optional(),
|
|
1586
|
-
coordinator_notes: tool.schema.string().optional(),
|
|
1587
|
-
})
|
|
1588
|
-
.optional()
|
|
1589
|
-
.describe("Recovery context from checkpoint compaction"),
|
|
1590
|
-
model: tool.schema
|
|
1591
|
-
.string()
|
|
1592
|
-
.optional()
|
|
1593
|
-
.describe("Optional explicit model override (auto-selected if not provided)"),
|
|
1594
|
-
},
|
|
1595
|
-
async execute(args, _ctx) {
|
|
1596
|
-
const prompt = await formatSubtaskPromptV2({
|
|
1597
|
-
bead_id: args.bead_id,
|
|
1598
|
-
epic_id: args.epic_id,
|
|
1599
|
-
subtask_title: args.subtask_title,
|
|
1600
|
-
subtask_description: args.subtask_description || "",
|
|
1601
|
-
files: args.files,
|
|
1602
|
-
shared_context: args.shared_context,
|
|
1603
|
-
project_path: args.project_path,
|
|
1604
|
-
recovery_context: args.recovery_context,
|
|
1605
|
-
});
|
|
1606
|
-
|
|
1607
|
-
// Import selectWorkerModel at function scope to avoid circular dependencies
|
|
1608
|
-
const { selectWorkerModel } = await import("./model-selection.js");
|
|
1609
|
-
|
|
1610
|
-
// Create a mock subtask for model selection
|
|
1611
|
-
const subtask = {
|
|
1612
|
-
title: args.subtask_title,
|
|
1613
|
-
description: args.subtask_description || "",
|
|
1614
|
-
files: args.files,
|
|
1615
|
-
estimated_effort: "medium" as const,
|
|
1616
|
-
risks: [],
|
|
1617
|
-
model: args.model,
|
|
1618
|
-
};
|
|
1619
|
-
|
|
1620
|
-
// Use placeholder config - actual config should be passed from coordinator
|
|
1621
|
-
// For now, we use reasonable defaults
|
|
1622
|
-
const config = {
|
|
1623
|
-
primaryModel: "anthropic/claude-sonnet-4-5",
|
|
1624
|
-
liteModel: "anthropic/claude-haiku-4-5",
|
|
1625
|
-
};
|
|
1626
|
-
|
|
1627
|
-
const selectedModel = selectWorkerModel(subtask, config);
|
|
1628
|
-
|
|
1629
|
-
// Generate post-completion instructions for coordinator
|
|
1630
|
-
const filesJoined = args.files.map(f => `"${f}"`).join(", ");
|
|
1631
|
-
const postCompletionInstructions = COORDINATOR_POST_WORKER_CHECKLIST
|
|
1632
|
-
.replace(/{project_key}/g, args.project_path || "$PWD")
|
|
1633
|
-
.replace(/{epic_id}/g, args.epic_id)
|
|
1634
|
-
.replace(/{task_id}/g, args.bead_id)
|
|
1635
|
-
.replace(/{files_touched}/g, filesJoined)
|
|
1636
|
-
.replace(/{worker_id}/g, "worker"); // Will be filled by actual worker name
|
|
1637
|
-
|
|
1638
|
-
// Capture worker spawn decision
|
|
1639
|
-
try {
|
|
1640
|
-
captureCoordinatorEvent({
|
|
1641
|
-
session_id: _ctx.sessionID || "unknown",
|
|
1642
|
-
epic_id: args.epic_id,
|
|
1643
|
-
timestamp: new Date().toISOString(),
|
|
1644
|
-
event_type: "DECISION",
|
|
1645
|
-
decision_type: "worker_spawned",
|
|
1646
|
-
payload: {
|
|
1647
|
-
bead_id: args.bead_id,
|
|
1648
|
-
files: args.files,
|
|
1649
|
-
worker_model: selectedModel,
|
|
1650
|
-
},
|
|
1651
|
-
});
|
|
1652
|
-
} catch (error) {
|
|
1653
|
-
// Non-fatal - don't block spawn if capture fails
|
|
1654
|
-
console.warn("[swarm_spawn_subtask] Failed to capture worker_spawned:", error);
|
|
1655
|
-
}
|
|
1656
|
-
|
|
1657
|
-
return JSON.stringify(
|
|
1658
|
-
{
|
|
1659
|
-
prompt,
|
|
1660
|
-
bead_id: args.bead_id,
|
|
1661
|
-
epic_id: args.epic_id,
|
|
1662
|
-
files: args.files,
|
|
1663
|
-
project_path: args.project_path,
|
|
1664
|
-
recovery_context: args.recovery_context,
|
|
1665
|
-
recommended_model: selectedModel,
|
|
1666
|
-
post_completion_instructions: postCompletionInstructions,
|
|
1667
|
-
},
|
|
1668
|
-
null,
|
|
1669
|
-
2,
|
|
1670
|
-
);
|
|
1671
|
-
},
|
|
1672
|
-
});
|
|
1673
|
-
|
|
1674
|
-
/**
|
|
1675
|
-
* Prepare a researcher task for spawning with Task tool
|
|
1676
|
-
*
|
|
1677
|
-
* Generates a prompt that tells the researcher to fetch documentation for specific technologies.
|
|
1678
|
-
* Returns JSON that can be directly used with Task tool.
|
|
1679
|
-
*/
|
|
1680
|
-
export const swarm_spawn_researcher = tool({
|
|
1681
|
-
description:
|
|
1682
|
-
"Prepare a research task for spawning. Returns prompt for gathering technology documentation. Researcher fetches docs and stores findings in semantic-memory.",
|
|
1683
|
-
args: {
|
|
1684
|
-
research_id: tool.schema.string().describe("Unique ID for this research task"),
|
|
1685
|
-
epic_id: tool.schema.string().describe("Parent epic ID"),
|
|
1686
|
-
tech_stack: tool.schema
|
|
1687
|
-
.array(tool.schema.string())
|
|
1688
|
-
.describe("Explicit list of technologies to research (from coordinator)"),
|
|
1689
|
-
project_path: tool.schema
|
|
1690
|
-
.string()
|
|
1691
|
-
.describe("Absolute project path for swarmmail_init"),
|
|
1692
|
-
check_upgrades: tool.schema
|
|
1693
|
-
.boolean()
|
|
1694
|
-
.optional()
|
|
1695
|
-
.describe("If true, compare installed vs latest versions (default: false)"),
|
|
1696
|
-
},
|
|
1697
|
-
async execute(args) {
|
|
1698
|
-
const prompt = formatResearcherPrompt({
|
|
1699
|
-
research_id: args.research_id,
|
|
1700
|
-
epic_id: args.epic_id,
|
|
1701
|
-
tech_stack: args.tech_stack,
|
|
1702
|
-
project_path: args.project_path,
|
|
1703
|
-
check_upgrades: args.check_upgrades ?? false,
|
|
1704
|
-
});
|
|
1705
|
-
|
|
1706
|
-
return JSON.stringify(
|
|
1707
|
-
{
|
|
1708
|
-
prompt,
|
|
1709
|
-
research_id: args.research_id,
|
|
1710
|
-
epic_id: args.epic_id,
|
|
1711
|
-
tech_stack: args.tech_stack,
|
|
1712
|
-
project_path: args.project_path,
|
|
1713
|
-
check_upgrades: args.check_upgrades ?? false,
|
|
1714
|
-
subagent_type: "swarm/researcher",
|
|
1715
|
-
expected_output: {
|
|
1716
|
-
technologies: [
|
|
1717
|
-
{
|
|
1718
|
-
name: "string",
|
|
1719
|
-
installed_version: "string",
|
|
1720
|
-
latest_version: "string | null",
|
|
1721
|
-
key_patterns: ["string"],
|
|
1722
|
-
gotchas: ["string"],
|
|
1723
|
-
breaking_changes: ["string"],
|
|
1724
|
-
memory_id: "string",
|
|
1725
|
-
},
|
|
1726
|
-
],
|
|
1727
|
-
summary: "string",
|
|
1728
|
-
},
|
|
1729
|
-
},
|
|
1730
|
-
null,
|
|
1731
|
-
2,
|
|
1732
|
-
);
|
|
1733
|
-
},
|
|
1734
|
-
});
|
|
1735
|
-
|
|
1736
|
-
/**
|
|
1737
|
-
* Generate retry prompt for a worker that needs to fix issues from review feedback
|
|
1738
|
-
*
|
|
1739
|
-
* Coordinators use this when swarm_review_feedback returns "needs_changes".
|
|
1740
|
-
* Creates a new worker spawn with context about what went wrong and what to fix.
|
|
1741
|
-
*/
|
|
1742
|
-
export const swarm_spawn_retry = tool({
|
|
1743
|
-
description:
|
|
1744
|
-
"Generate retry prompt for a worker that failed review. Includes issues from previous attempt, diff if provided, and standard worker contract.",
|
|
1745
|
-
args: {
|
|
1746
|
-
bead_id: tool.schema.string().describe("Original subtask bead ID"),
|
|
1747
|
-
epic_id: tool.schema.string().describe("Parent epic bead ID"),
|
|
1748
|
-
original_prompt: tool.schema.string().describe("The prompt given to failed worker"),
|
|
1749
|
-
attempt: tool.schema.number().int().min(1).max(3).describe("Current attempt number (1, 2, or 3)"),
|
|
1750
|
-
issues: tool.schema.string().describe("JSON array of ReviewIssue objects from swarm_review_feedback"),
|
|
1751
|
-
diff: tool.schema
|
|
1752
|
-
.string()
|
|
1753
|
-
.optional()
|
|
1754
|
-
.describe("Git diff of previous changes"),
|
|
1755
|
-
files: tool.schema
|
|
1756
|
-
.array(tool.schema.string())
|
|
1757
|
-
.describe("Files to modify (from original subtask)"),
|
|
1758
|
-
project_path: tool.schema
|
|
1759
|
-
.string()
|
|
1760
|
-
.optional()
|
|
1761
|
-
.describe("Absolute project path for swarmmail_init"),
|
|
1762
|
-
},
|
|
1763
|
-
async execute(args) {
|
|
1764
|
-
// Validate attempt number
|
|
1765
|
-
if (args.attempt > 3) {
|
|
1766
|
-
throw new Error(
|
|
1767
|
-
`Retry attempt ${args.attempt} exceeds maximum of 3. After 3 failures, task should be marked blocked.`,
|
|
1768
|
-
);
|
|
1769
|
-
}
|
|
1770
|
-
|
|
1771
|
-
// Parse issues
|
|
1772
|
-
let issuesArray: Array<{
|
|
1773
|
-
file: string;
|
|
1774
|
-
line: number;
|
|
1775
|
-
issue: string;
|
|
1776
|
-
suggestion: string;
|
|
1777
|
-
}> = [];
|
|
1778
|
-
try {
|
|
1779
|
-
issuesArray = JSON.parse(args.issues);
|
|
1780
|
-
} catch (e) {
|
|
1781
|
-
// If issues is not valid JSON, treat as empty array
|
|
1782
|
-
issuesArray = [];
|
|
1783
|
-
}
|
|
1784
|
-
|
|
1785
|
-
// Format issues section
|
|
1786
|
-
const issuesSection = issuesArray.length > 0
|
|
1787
|
-
? `## ISSUES FROM PREVIOUS ATTEMPT
|
|
1788
|
-
|
|
1789
|
-
The previous attempt had the following issues that need to be fixed:
|
|
1790
|
-
|
|
1791
|
-
${issuesArray
|
|
1792
|
-
.map(
|
|
1793
|
-
(issue, idx) =>
|
|
1794
|
-
`**${idx + 1}. ${issue.file}:${issue.line}**
|
|
1795
|
-
- **Issue**: ${issue.issue}
|
|
1796
|
-
- **Suggestion**: ${issue.suggestion}`,
|
|
1797
|
-
)
|
|
1798
|
-
.join("\n\n")}
|
|
1799
|
-
|
|
1800
|
-
**Critical**: Fix these issues while preserving any working changes from the previous attempt.`
|
|
1801
|
-
: "";
|
|
1802
|
-
|
|
1803
|
-
// Format diff section
|
|
1804
|
-
const diffSection = args.diff
|
|
1805
|
-
? `## PREVIOUS ATTEMPT
|
|
1806
|
-
|
|
1807
|
-
Here's what was tried in the previous attempt:
|
|
1808
|
-
|
|
1809
|
-
\`\`\`diff
|
|
1810
|
-
${args.diff}
|
|
1811
|
-
\`\`\`
|
|
1812
|
-
|
|
1813
|
-
Review this carefully - some changes may be correct and should be preserved.`
|
|
1814
|
-
: "";
|
|
1815
|
-
|
|
1816
|
-
// Build the retry prompt
|
|
1817
|
-
const retryPrompt = `⚠️ **RETRY ATTEMPT ${args.attempt}/3**
|
|
1818
|
-
|
|
1819
|
-
This is a retry of a previously attempted subtask. The coordinator reviewed the previous attempt and found issues that need to be fixed.
|
|
1820
|
-
|
|
1821
|
-
${issuesSection}
|
|
1822
|
-
|
|
1823
|
-
${diffSection}
|
|
1824
|
-
|
|
1825
|
-
## ORIGINAL TASK
|
|
1826
|
-
|
|
1827
|
-
${args.original_prompt}
|
|
1828
|
-
|
|
1829
|
-
## YOUR MISSION
|
|
1830
|
-
|
|
1831
|
-
1. **Understand what went wrong** - Read the issues carefully
|
|
1832
|
-
2. **Fix the specific problems** - Address each issue listed above
|
|
1833
|
-
3. **Preserve working code** - Don't throw away correct changes from previous attempt
|
|
1834
|
-
4. **Follow the standard worker contract** - See below
|
|
1835
|
-
|
|
1836
|
-
## MANDATORY WORKER CONTRACT
|
|
1837
|
-
|
|
1838
|
-
### Step 1: Initialize (REQUIRED FIRST)
|
|
1839
|
-
\`\`\`
|
|
1840
|
-
swarmmail_init(project_path="${args.project_path || "$PWD"}", task_description="${args.bead_id}: Retry ${args.attempt}/3")
|
|
1841
|
-
\`\`\`
|
|
1842
|
-
|
|
1843
|
-
### Step 2: Reserve Files
|
|
1844
|
-
\`\`\`
|
|
1845
|
-
swarmmail_reserve(
|
|
1846
|
-
paths=${JSON.stringify(args.files)},
|
|
1847
|
-
reason="${args.bead_id}: Retry attempt ${args.attempt}",
|
|
1848
|
-
exclusive=true
|
|
1849
|
-
)
|
|
1850
|
-
\`\`\`
|
|
1851
|
-
|
|
1852
|
-
### Step 3: Fix the Issues
|
|
1853
|
-
- Address each issue listed above
|
|
1854
|
-
- Run tests to verify fixes
|
|
1855
|
-
- Don't introduce new bugs
|
|
1856
|
-
|
|
1857
|
-
### Step 4: Complete
|
|
1858
|
-
\`\`\`
|
|
1859
|
-
swarm_complete(
|
|
1860
|
-
project_key="${args.project_path || "$PWD"}",
|
|
1861
|
-
agent_name="<your-agent-name>",
|
|
1862
|
-
bead_id="${args.bead_id}",
|
|
1863
|
-
summary="Fixed issues from review: <brief summary>",
|
|
1864
|
-
files_touched=[<files you modified>]
|
|
1865
|
-
)
|
|
1866
|
-
\`\`\`
|
|
1867
|
-
|
|
1868
|
-
**Remember**: This is attempt ${args.attempt} of 3. If this fails review again, there may be an architectural problem that needs human intervention.
|
|
1869
|
-
|
|
1870
|
-
Begin work now.`;
|
|
1871
|
-
|
|
1872
|
-
return JSON.stringify(
|
|
1873
|
-
{
|
|
1874
|
-
prompt: retryPrompt,
|
|
1875
|
-
bead_id: args.bead_id,
|
|
1876
|
-
attempt: args.attempt,
|
|
1877
|
-
max_attempts: 3,
|
|
1878
|
-
files: args.files,
|
|
1879
|
-
issues_count: issuesArray.length,
|
|
1880
|
-
},
|
|
1881
|
-
null,
|
|
1882
|
-
2,
|
|
1883
|
-
);
|
|
1884
|
-
},
|
|
1885
|
-
});
|
|
1886
|
-
|
|
1887
|
-
/**
|
|
1888
|
-
* Generate self-evaluation prompt
|
|
1889
|
-
*/
|
|
1890
|
-
export const swarm_evaluation_prompt = tool({
|
|
1891
|
-
description: "Generate self-evaluation prompt for a completed subtask",
|
|
1892
|
-
args: {
|
|
1893
|
-
bead_id: tool.schema.string().describe("Subtask bead ID"),
|
|
1894
|
-
subtask_title: tool.schema.string().describe("Subtask title"),
|
|
1895
|
-
files_touched: tool.schema
|
|
1896
|
-
.array(tool.schema.string())
|
|
1897
|
-
.describe("Files that were modified"),
|
|
1898
|
-
},
|
|
1899
|
-
async execute(args) {
|
|
1900
|
-
const prompt = formatEvaluationPrompt({
|
|
1901
|
-
bead_id: args.bead_id,
|
|
1902
|
-
subtask_title: args.subtask_title,
|
|
1903
|
-
files_touched: args.files_touched,
|
|
1904
|
-
});
|
|
1905
|
-
|
|
1906
|
-
return JSON.stringify(
|
|
1907
|
-
{
|
|
1908
|
-
prompt,
|
|
1909
|
-
expected_schema: "Evaluation",
|
|
1910
|
-
schema_hint: {
|
|
1911
|
-
passed: "boolean",
|
|
1912
|
-
criteria: {
|
|
1913
|
-
type_safe: { passed: "boolean", feedback: "string" },
|
|
1914
|
-
no_bugs: { passed: "boolean", feedback: "string" },
|
|
1915
|
-
patterns: { passed: "boolean", feedback: "string" },
|
|
1916
|
-
readable: { passed: "boolean", feedback: "string" },
|
|
1917
|
-
},
|
|
1918
|
-
overall_feedback: "string",
|
|
1919
|
-
retry_suggestion: "string | null",
|
|
1920
|
-
},
|
|
1921
|
-
},
|
|
1922
|
-
null,
|
|
1923
|
-
2,
|
|
1924
|
-
);
|
|
1925
|
-
},
|
|
1926
|
-
});
|
|
1927
|
-
|
|
1928
|
-
/**
|
|
1929
|
-
* Generate a strategy-specific planning prompt
|
|
1930
|
-
*
|
|
1931
|
-
* Higher-level than swarm_decompose - includes strategy selection and guidelines.
|
|
1932
|
-
* Use this when you want the full planning experience with strategy-specific advice.
|
|
1933
|
-
*/
|
|
1934
|
-
export const swarm_plan_prompt = tool({
|
|
1935
|
-
description:
|
|
1936
|
-
"Generate strategy-specific decomposition prompt. Auto-selects strategy or uses provided one. Queries CASS for similar tasks.",
|
|
1937
|
-
args: {
|
|
1938
|
-
task: tool.schema.string().min(1).describe("Task description to decompose"),
|
|
1939
|
-
strategy: tool.schema
|
|
1940
|
-
.enum(["file-based", "feature-based", "risk-based", "auto"])
|
|
1941
|
-
.optional()
|
|
1942
|
-
.describe("Decomposition strategy (default: auto-detect)"),
|
|
1943
|
-
context: tool.schema
|
|
1944
|
-
.string()
|
|
1945
|
-
.optional()
|
|
1946
|
-
.describe("Additional context (codebase info, constraints, etc.)"),
|
|
1947
|
-
query_cass: tool.schema
|
|
1948
|
-
.boolean()
|
|
1949
|
-
.optional()
|
|
1950
|
-
.describe("Query CASS for similar past tasks (default: true)"),
|
|
1951
|
-
cass_limit: tool.schema
|
|
1952
|
-
.number()
|
|
1953
|
-
.int()
|
|
1954
|
-
.min(1)
|
|
1955
|
-
.optional()
|
|
1956
|
-
.describe("Max CASS results to include (default: 3)"),
|
|
1957
|
-
include_skills: tool.schema
|
|
1958
|
-
.boolean()
|
|
1959
|
-
.optional()
|
|
1960
|
-
.describe("Include available skills in context (default: true)"),
|
|
1961
|
-
},
|
|
1962
|
-
async execute(args) {
|
|
1963
|
-
// Import needed modules dynamically
|
|
1964
|
-
const { selectStrategy, formatStrategyGuidelines, STRATEGIES } =
|
|
1965
|
-
await import("./swarm-strategies");
|
|
1966
|
-
const { formatMemoryQueryForDecomposition } = await import("./learning");
|
|
1967
|
-
const { listSkills, getSkillsContextForSwarm, findRelevantSkills } =
|
|
1968
|
-
await import("./skills");
|
|
1969
|
-
|
|
1970
|
-
// Select strategy
|
|
1971
|
-
type StrategyName =
|
|
1972
|
-
| "file-based"
|
|
1973
|
-
| "feature-based"
|
|
1974
|
-
| "risk-based"
|
|
1975
|
-
| "research-based";
|
|
1976
|
-
let selectedStrategy: StrategyName;
|
|
1977
|
-
let strategyReasoning: string;
|
|
1978
|
-
|
|
1979
|
-
if (args.strategy && args.strategy !== "auto") {
|
|
1980
|
-
selectedStrategy = args.strategy as StrategyName;
|
|
1981
|
-
strategyReasoning = `User-specified strategy: ${selectedStrategy}`;
|
|
1982
|
-
} else {
|
|
1983
|
-
const selection = selectStrategy(args.task);
|
|
1984
|
-
selectedStrategy = selection.strategy;
|
|
1985
|
-
strategyReasoning = selection.reasoning;
|
|
1986
|
-
}
|
|
1987
|
-
|
|
1988
|
-
// Fetch skills context
|
|
1989
|
-
let skillsContext = "";
|
|
1990
|
-
let skillsInfo: { included: boolean; count?: number; relevant?: string[] } =
|
|
1991
|
-
{
|
|
1992
|
-
included: false,
|
|
1993
|
-
};
|
|
1994
|
-
|
|
1995
|
-
if (args.include_skills !== false) {
|
|
1996
|
-
const allSkills = await listSkills();
|
|
1997
|
-
if (allSkills.length > 0) {
|
|
1998
|
-
skillsContext = await getSkillsContextForSwarm();
|
|
1999
|
-
const relevantSkills = await findRelevantSkills(args.task);
|
|
2000
|
-
skillsInfo = {
|
|
2001
|
-
included: true,
|
|
2002
|
-
count: allSkills.length,
|
|
2003
|
-
relevant: relevantSkills,
|
|
2004
|
-
};
|
|
2005
|
-
|
|
2006
|
-
// Add suggestion for relevant skills
|
|
2007
|
-
if (relevantSkills.length > 0) {
|
|
2008
|
-
skillsContext += `\n\n**Suggested skills for this task**: ${relevantSkills.join(", ")}`;
|
|
2009
|
-
}
|
|
2010
|
-
}
|
|
2011
|
-
}
|
|
2012
|
-
|
|
2013
|
-
// Fetch swarm insights (strategy success rates, anti-patterns)
|
|
2014
|
-
const insights = await getPromptInsights({ role: "coordinator" });
|
|
2015
|
-
|
|
2016
|
-
// Format strategy guidelines
|
|
2017
|
-
const strategyGuidelines = formatStrategyGuidelines(selectedStrategy);
|
|
2018
|
-
|
|
2019
|
-
// Combine user context and insights
|
|
2020
|
-
const contextSection = args.context
|
|
2021
|
-
? `## Additional Context\n${args.context}\n\n${insights}`
|
|
2022
|
-
: insights
|
|
2023
|
-
? `## Additional Context\n(none provided)\n\n${insights}`
|
|
2024
|
-
: "## Additional Context\n(none provided)";
|
|
2025
|
-
|
|
2026
|
-
// Build the prompt (without CASS - we'll let the module handle that)
|
|
2027
|
-
const prompt = STRATEGY_DECOMPOSITION_PROMPT.replace("{task}", args.task)
|
|
2028
|
-
.replace("{strategy_guidelines}", strategyGuidelines)
|
|
2029
|
-
.replace("{context_section}", contextSection)
|
|
2030
|
-
.replace("{cass_history}", "") // Empty for now
|
|
2031
|
-
.replace("{skills_context}", skillsContext || "");
|
|
2032
|
-
|
|
2033
|
-
return JSON.stringify(
|
|
2034
|
-
{
|
|
2035
|
-
prompt,
|
|
2036
|
-
strategy: {
|
|
2037
|
-
selected: selectedStrategy,
|
|
2038
|
-
reasoning: strategyReasoning,
|
|
2039
|
-
guidelines:
|
|
2040
|
-
STRATEGIES[selectedStrategy as keyof typeof STRATEGIES].guidelines,
|
|
2041
|
-
anti_patterns:
|
|
2042
|
-
STRATEGIES[selectedStrategy as keyof typeof STRATEGIES]
|
|
2043
|
-
.antiPatterns,
|
|
2044
|
-
},
|
|
2045
|
-
expected_schema: "CellTree",
|
|
2046
|
-
schema_hint: {
|
|
2047
|
-
epic: { title: "string", description: "string?" },
|
|
2048
|
-
subtasks: [
|
|
2049
|
-
{
|
|
2050
|
-
title: "string",
|
|
2051
|
-
description: "string?",
|
|
2052
|
-
files: "string[]",
|
|
2053
|
-
dependencies: "number[]",
|
|
2054
|
-
estimated_complexity: "1-5",
|
|
2055
|
-
},
|
|
2056
|
-
],
|
|
2057
|
-
},
|
|
2058
|
-
validation_note:
|
|
2059
|
-
"Parse agent response as JSON and validate with swarm_validate_decomposition",
|
|
2060
|
-
skills: skillsInfo,
|
|
2061
|
-
// Add semantic-memory query instruction
|
|
2062
|
-
memory_query: formatMemoryQueryForDecomposition(args.task, 3),
|
|
2063
|
-
},
|
|
2064
|
-
null,
|
|
2065
|
-
2,
|
|
2066
|
-
);
|
|
2067
|
-
},
|
|
2068
|
-
});
|
|
2069
|
-
|
|
2070
|
-
export const promptTools = {
|
|
2071
|
-
swarm_subtask_prompt,
|
|
2072
|
-
swarm_spawn_subtask,
|
|
2073
|
-
swarm_spawn_researcher,
|
|
2074
|
-
swarm_spawn_retry,
|
|
2075
|
-
swarm_evaluation_prompt,
|
|
2076
|
-
swarm_plan_prompt,
|
|
2077
|
-
};
|