opencode-swarm-plugin 0.44.0 → 0.44.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/swarm.serve.test.ts +6 -4
- package/bin/swarm.ts +18 -12
- 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/hive.js +14834 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7743 -62593
- package/dist/plugin.js +24052 -78907
- package/dist/swarm-orchestrate.d.ts.map +1 -1
- package/dist/swarm-prompts.d.ts.map +1 -1
- package/dist/swarm-prompts.js +39407 -0
- package/dist/swarm-review.d.ts.map +1 -1
- package/dist/swarm-validation.d.ts +127 -0
- package/dist/swarm-validation.d.ts.map +1 -0
- package/dist/validators/index.d.ts +7 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/schema-validator.d.ts +58 -0
- package/dist/validators/schema-validator.d.ts.map +1 -0
- 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-strategies.ts
DELETED
|
@@ -1,407 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Swarm Strategies Module - Strategy selection and guidelines
|
|
3
|
-
*
|
|
4
|
-
* Handles decomposition strategy selection (file-based, feature-based, risk-based, research-based)
|
|
5
|
-
* and provides strategy-specific guidelines for task decomposition.
|
|
6
|
-
*
|
|
7
|
-
* Key responsibilities:
|
|
8
|
-
* - Strategy keyword matching and selection
|
|
9
|
-
* - Strategy definition and description
|
|
10
|
-
* - Anti-pattern warnings
|
|
11
|
-
* - Guidelines formatting for prompts
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { tool } from "@opencode-ai/plugin";
|
|
15
|
-
import { z } from "zod";
|
|
16
|
-
|
|
17
|
-
// ============================================================================
|
|
18
|
-
// Strategy Definitions
|
|
19
|
-
// ============================================================================
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Decomposition strategy types
|
|
23
|
-
*/
|
|
24
|
-
export type DecompositionStrategy =
|
|
25
|
-
| "file-based"
|
|
26
|
-
| "feature-based"
|
|
27
|
-
| "risk-based"
|
|
28
|
-
| "research-based"
|
|
29
|
-
| "auto";
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Zod schema for decomposition strategy validation
|
|
33
|
-
*/
|
|
34
|
-
export const DecompositionStrategySchema = z.enum([
|
|
35
|
-
"file-based",
|
|
36
|
-
"feature-based",
|
|
37
|
-
"risk-based",
|
|
38
|
-
"research-based",
|
|
39
|
-
"auto",
|
|
40
|
-
]);
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Marker words that indicate positive directives
|
|
44
|
-
*/
|
|
45
|
-
export const POSITIVE_MARKERS = [
|
|
46
|
-
"always",
|
|
47
|
-
"must",
|
|
48
|
-
"required",
|
|
49
|
-
"ensure",
|
|
50
|
-
"use",
|
|
51
|
-
"prefer",
|
|
52
|
-
];
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Marker words that indicate negative directives
|
|
56
|
-
*/
|
|
57
|
-
export const NEGATIVE_MARKERS = [
|
|
58
|
-
"never",
|
|
59
|
-
"dont",
|
|
60
|
-
"don't",
|
|
61
|
-
"avoid",
|
|
62
|
-
"forbid",
|
|
63
|
-
"no ",
|
|
64
|
-
"not ",
|
|
65
|
-
];
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Strategy definition with keywords, guidelines, and anti-patterns
|
|
69
|
-
*/
|
|
70
|
-
export interface StrategyDefinition {
|
|
71
|
-
name: DecompositionStrategy;
|
|
72
|
-
description: string;
|
|
73
|
-
keywords: string[];
|
|
74
|
-
guidelines: string[];
|
|
75
|
-
antiPatterns: string[];
|
|
76
|
-
examples: string[];
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Strategy definitions for task decomposition
|
|
81
|
-
*/
|
|
82
|
-
export const STRATEGIES: Record<
|
|
83
|
-
Exclude<DecompositionStrategy, "auto">,
|
|
84
|
-
StrategyDefinition
|
|
85
|
-
> = {
|
|
86
|
-
"file-based": {
|
|
87
|
-
name: "file-based",
|
|
88
|
-
description:
|
|
89
|
-
"Group by file type or directory. Best for refactoring, migrations, and pattern changes across codebase.",
|
|
90
|
-
keywords: [
|
|
91
|
-
"refactor",
|
|
92
|
-
"migrate",
|
|
93
|
-
"update all",
|
|
94
|
-
"rename",
|
|
95
|
-
"replace",
|
|
96
|
-
"convert",
|
|
97
|
-
"upgrade",
|
|
98
|
-
"deprecate",
|
|
99
|
-
"remove",
|
|
100
|
-
"cleanup",
|
|
101
|
-
"lint",
|
|
102
|
-
"format",
|
|
103
|
-
],
|
|
104
|
-
guidelines: [
|
|
105
|
-
"Group files by directory or type (e.g., all components, all tests)",
|
|
106
|
-
"Minimize cross-directory dependencies within a subtask",
|
|
107
|
-
"Handle shared types/utilities first if they change",
|
|
108
|
-
"Each subtask should be a complete transformation of its file set",
|
|
109
|
-
"Consider import/export relationships when grouping",
|
|
110
|
-
],
|
|
111
|
-
antiPatterns: [
|
|
112
|
-
"Don't split tightly coupled files across subtasks",
|
|
113
|
-
"Don't group files that have no relationship",
|
|
114
|
-
"Don't forget to update imports when moving/renaming",
|
|
115
|
-
],
|
|
116
|
-
examples: [
|
|
117
|
-
"Migrate all components to new API → split by component directory",
|
|
118
|
-
"Rename userId to accountId → split by module (types first, then consumers)",
|
|
119
|
-
"Update all tests to use new matcher → split by test directory",
|
|
120
|
-
],
|
|
121
|
-
},
|
|
122
|
-
"feature-based": {
|
|
123
|
-
name: "feature-based",
|
|
124
|
-
description:
|
|
125
|
-
"Vertical slices with UI + API + data. Best for new features and adding functionality.",
|
|
126
|
-
keywords: [
|
|
127
|
-
"add",
|
|
128
|
-
"implement",
|
|
129
|
-
"build",
|
|
130
|
-
"create",
|
|
131
|
-
"feature",
|
|
132
|
-
"new",
|
|
133
|
-
"integrate",
|
|
134
|
-
"connect",
|
|
135
|
-
"enable",
|
|
136
|
-
"support",
|
|
137
|
-
],
|
|
138
|
-
guidelines: [
|
|
139
|
-
"Each subtask is a complete vertical slice (UI + logic + data)",
|
|
140
|
-
"Start with data layer/types, then logic, then UI",
|
|
141
|
-
"Keep related components together (form + validation + submission)",
|
|
142
|
-
"Separate concerns that can be developed independently",
|
|
143
|
-
"Consider user-facing features as natural boundaries",
|
|
144
|
-
],
|
|
145
|
-
antiPatterns: [
|
|
146
|
-
"Don't split a single feature across multiple subtasks",
|
|
147
|
-
"Don't create subtasks that can't be tested independently",
|
|
148
|
-
"Don't forget integration points between features",
|
|
149
|
-
],
|
|
150
|
-
examples: [
|
|
151
|
-
"Add user auth → [OAuth setup, Session management, Protected routes]",
|
|
152
|
-
"Build dashboard → [Data fetching, Chart components, Layout/navigation]",
|
|
153
|
-
"Add search → [Search API, Search UI, Results display]",
|
|
154
|
-
],
|
|
155
|
-
},
|
|
156
|
-
"risk-based": {
|
|
157
|
-
name: "risk-based",
|
|
158
|
-
description:
|
|
159
|
-
"Isolate high-risk changes, add tests first. Best for bug fixes, security issues, and critical changes.",
|
|
160
|
-
keywords: [
|
|
161
|
-
"fix",
|
|
162
|
-
"bug",
|
|
163
|
-
"security",
|
|
164
|
-
"vulnerability",
|
|
165
|
-
"critical",
|
|
166
|
-
"urgent",
|
|
167
|
-
"hotfix",
|
|
168
|
-
"patch",
|
|
169
|
-
"audit",
|
|
170
|
-
"review",
|
|
171
|
-
],
|
|
172
|
-
guidelines: [
|
|
173
|
-
"Write tests FIRST to capture expected behavior",
|
|
174
|
-
"Isolate the risky change to minimize blast radius",
|
|
175
|
-
"Add monitoring/logging around the change",
|
|
176
|
-
"Create rollback plan as part of the task",
|
|
177
|
-
"Audit similar code for the same issue",
|
|
178
|
-
],
|
|
179
|
-
antiPatterns: [
|
|
180
|
-
"Don't make multiple risky changes in one subtask",
|
|
181
|
-
"Don't skip tests for 'simple' fixes",
|
|
182
|
-
"Don't forget to check for similar issues elsewhere",
|
|
183
|
-
],
|
|
184
|
-
examples: [
|
|
185
|
-
"Fix auth bypass → [Add regression test, Fix vulnerability, Audit similar endpoints]",
|
|
186
|
-
"Fix race condition → [Add test reproducing issue, Implement fix, Add concurrency tests]",
|
|
187
|
-
"Security audit → [Scan for vulnerabilities, Fix critical issues, Document remaining risks]",
|
|
188
|
-
],
|
|
189
|
-
},
|
|
190
|
-
"research-based": {
|
|
191
|
-
name: "research-based",
|
|
192
|
-
description:
|
|
193
|
-
"Parallel search across multiple sources, then synthesize. Best for investigation, learning, and discovery tasks.",
|
|
194
|
-
keywords: [
|
|
195
|
-
"research",
|
|
196
|
-
"investigate",
|
|
197
|
-
"explore",
|
|
198
|
-
"find out",
|
|
199
|
-
"discover",
|
|
200
|
-
"understand",
|
|
201
|
-
"learn about",
|
|
202
|
-
"analyze",
|
|
203
|
-
"what is",
|
|
204
|
-
"what are",
|
|
205
|
-
"how does",
|
|
206
|
-
"how do",
|
|
207
|
-
"why does",
|
|
208
|
-
"why do",
|
|
209
|
-
"compare",
|
|
210
|
-
"evaluate",
|
|
211
|
-
"study",
|
|
212
|
-
"look up",
|
|
213
|
-
"look into",
|
|
214
|
-
"search for",
|
|
215
|
-
"dig into",
|
|
216
|
-
"figure out",
|
|
217
|
-
"debug options",
|
|
218
|
-
"debug levers",
|
|
219
|
-
"configuration options",
|
|
220
|
-
"environment variables",
|
|
221
|
-
"available options",
|
|
222
|
-
"documentation",
|
|
223
|
-
],
|
|
224
|
-
guidelines: [
|
|
225
|
-
"Split by information source (PDFs, repos, history, web)",
|
|
226
|
-
"Each agent searches with different query angles",
|
|
227
|
-
"Include a synthesis subtask that depends on all search subtasks",
|
|
228
|
-
"Use pdf-brain for documentation/books if available",
|
|
229
|
-
"Use repo-crawl for GitHub repos if URL provided",
|
|
230
|
-
"Use cass for past agent session history",
|
|
231
|
-
"Assign NO files to research subtasks (read-only)",
|
|
232
|
-
],
|
|
233
|
-
antiPatterns: [
|
|
234
|
-
"Don't have one agent search everything sequentially",
|
|
235
|
-
"Don't skip synthesis - raw search results need consolidation",
|
|
236
|
-
"Don't forget to check tool availability before assigning sources",
|
|
237
|
-
],
|
|
238
|
-
examples: [
|
|
239
|
-
"Research auth patterns → [Search PDFs, Search repos, Search history, Synthesize]",
|
|
240
|
-
"Investigate error → [Search cass for similar errors, Search repo for error handling, Synthesize]",
|
|
241
|
-
"Learn about library → [Search docs, Search examples, Search issues, Synthesize findings]",
|
|
242
|
-
],
|
|
243
|
-
},
|
|
244
|
-
};
|
|
245
|
-
|
|
246
|
-
/**
|
|
247
|
-
* Analyze task description and select best decomposition strategy
|
|
248
|
-
*
|
|
249
|
-
* @param task - Task description
|
|
250
|
-
* @returns Selected strategy with reasoning
|
|
251
|
-
*/
|
|
252
|
-
export function selectStrategy(task: string): {
|
|
253
|
-
strategy: Exclude<DecompositionStrategy, "auto">;
|
|
254
|
-
confidence: number;
|
|
255
|
-
reasoning: string;
|
|
256
|
-
alternatives: Array<{
|
|
257
|
-
strategy: Exclude<DecompositionStrategy, "auto">;
|
|
258
|
-
score: number;
|
|
259
|
-
}>;
|
|
260
|
-
} {
|
|
261
|
-
const taskLower = task.toLowerCase();
|
|
262
|
-
|
|
263
|
-
// Score each strategy based on keyword matches
|
|
264
|
-
const scores: Record<Exclude<DecompositionStrategy, "auto">, number> = {
|
|
265
|
-
"file-based": 0,
|
|
266
|
-
"feature-based": 0,
|
|
267
|
-
"risk-based": 0,
|
|
268
|
-
"research-based": 0,
|
|
269
|
-
};
|
|
270
|
-
|
|
271
|
-
for (const [strategyName, definition] of Object.entries(STRATEGIES)) {
|
|
272
|
-
const name = strategyName as Exclude<DecompositionStrategy, "auto">;
|
|
273
|
-
for (const keyword of definition.keywords) {
|
|
274
|
-
// Use word boundary matching to avoid "debug" matching "bug"
|
|
275
|
-
// For multi-word keywords, just check includes (they're specific enough)
|
|
276
|
-
if (keyword.includes(" ")) {
|
|
277
|
-
if (taskLower.includes(keyword)) {
|
|
278
|
-
scores[name] += 1;
|
|
279
|
-
}
|
|
280
|
-
} else {
|
|
281
|
-
// Single word: use word boundary regex
|
|
282
|
-
const regex = new RegExp(`\\b${keyword}\\b`, "i");
|
|
283
|
-
if (regex.test(taskLower)) {
|
|
284
|
-
scores[name] += 1;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
// Find the winner
|
|
291
|
-
const entries = Object.entries(scores) as Array<
|
|
292
|
-
[Exclude<DecompositionStrategy, "auto">, number]
|
|
293
|
-
>;
|
|
294
|
-
entries.sort((a, b) => b[1] - a[1]);
|
|
295
|
-
|
|
296
|
-
const [winner, winnerScore] = entries[0];
|
|
297
|
-
const [, runnerUpScore] = entries[1] || [null, 0];
|
|
298
|
-
|
|
299
|
-
// Calculate confidence based on margin
|
|
300
|
-
const totalScore = entries.reduce((sum, [, score]) => sum + score, 0);
|
|
301
|
-
const confidence =
|
|
302
|
-
totalScore > 0
|
|
303
|
-
? Math.min(0.95, 0.5 + (winnerScore - runnerUpScore) / totalScore)
|
|
304
|
-
: 0.5; // Default to 50% if no keywords matched
|
|
305
|
-
|
|
306
|
-
// Build reasoning
|
|
307
|
-
let reasoning: string;
|
|
308
|
-
if (winnerScore === 0) {
|
|
309
|
-
reasoning = `No strong keyword signals. Defaulting to feature-based as it's most versatile.`;
|
|
310
|
-
} else {
|
|
311
|
-
const matchedKeywords = STRATEGIES[winner].keywords.filter((k) =>
|
|
312
|
-
taskLower.includes(k),
|
|
313
|
-
);
|
|
314
|
-
reasoning = `Matched keywords: ${matchedKeywords.join(", ")}. ${STRATEGIES[winner].description}`;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// If no keywords matched, default to feature-based
|
|
318
|
-
const finalStrategy = winnerScore === 0 ? "feature-based" : winner;
|
|
319
|
-
|
|
320
|
-
return {
|
|
321
|
-
strategy: finalStrategy,
|
|
322
|
-
confidence,
|
|
323
|
-
reasoning,
|
|
324
|
-
alternatives: entries
|
|
325
|
-
.filter(([s]) => s !== finalStrategy)
|
|
326
|
-
.map(([strategy, score]) => ({ strategy, score })),
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
/**
|
|
331
|
-
* Format strategy-specific guidelines for the decomposition prompt
|
|
332
|
-
*/
|
|
333
|
-
export function formatStrategyGuidelines(
|
|
334
|
-
strategy: Exclude<DecompositionStrategy, "auto">,
|
|
335
|
-
): string {
|
|
336
|
-
const def = STRATEGIES[strategy];
|
|
337
|
-
|
|
338
|
-
const guidelines = def.guidelines.map((g) => `- ${g}`).join("\n");
|
|
339
|
-
const antiPatterns = def.antiPatterns.map((a) => `- ${a}`).join("\n");
|
|
340
|
-
const examples = def.examples.map((e) => `- ${e}`).join("\n");
|
|
341
|
-
|
|
342
|
-
return `## Strategy: ${strategy}
|
|
343
|
-
|
|
344
|
-
${def.description}
|
|
345
|
-
|
|
346
|
-
### Guidelines
|
|
347
|
-
${guidelines}
|
|
348
|
-
|
|
349
|
-
### Anti-Patterns (Avoid These)
|
|
350
|
-
${antiPatterns}
|
|
351
|
-
|
|
352
|
-
### Examples
|
|
353
|
-
${examples}`;
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
// ============================================================================
|
|
357
|
-
// Tool Definitions
|
|
358
|
-
// ============================================================================
|
|
359
|
-
|
|
360
|
-
/**
|
|
361
|
-
* Select the best decomposition strategy for a task
|
|
362
|
-
*
|
|
363
|
-
* Analyzes task description and recommends a strategy with reasoning.
|
|
364
|
-
* Use this before swarm_plan_prompt to understand the recommended approach.
|
|
365
|
-
*/
|
|
366
|
-
export const swarm_select_strategy = tool({
|
|
367
|
-
description:
|
|
368
|
-
"Analyze task and recommend decomposition strategy (file-based, feature-based, or risk-based)",
|
|
369
|
-
args: {
|
|
370
|
-
task: tool.schema.string().min(1).describe("Task description to analyze"),
|
|
371
|
-
codebase_context: tool.schema
|
|
372
|
-
.string()
|
|
373
|
-
.optional()
|
|
374
|
-
.describe("Optional codebase context (file structure, tech stack, etc.)"),
|
|
375
|
-
},
|
|
376
|
-
async execute(args) {
|
|
377
|
-
const result = selectStrategy(args.task);
|
|
378
|
-
|
|
379
|
-
// Enhance reasoning with codebase context if provided
|
|
380
|
-
let enhancedReasoning = result.reasoning;
|
|
381
|
-
if (args.codebase_context) {
|
|
382
|
-
enhancedReasoning += `\n\nCodebase context considered: ${args.codebase_context.slice(0, 200)}...`;
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
return JSON.stringify(
|
|
386
|
-
{
|
|
387
|
-
strategy: result.strategy,
|
|
388
|
-
confidence: Math.round(result.confidence * 100) / 100,
|
|
389
|
-
reasoning: enhancedReasoning,
|
|
390
|
-
description: STRATEGIES[result.strategy].description,
|
|
391
|
-
guidelines: STRATEGIES[result.strategy].guidelines,
|
|
392
|
-
anti_patterns: STRATEGIES[result.strategy].antiPatterns,
|
|
393
|
-
alternatives: result.alternatives.map((alt) => ({
|
|
394
|
-
strategy: alt.strategy,
|
|
395
|
-
description: STRATEGIES[alt.strategy].description,
|
|
396
|
-
score: alt.score,
|
|
397
|
-
})),
|
|
398
|
-
},
|
|
399
|
-
null,
|
|
400
|
-
2,
|
|
401
|
-
);
|
|
402
|
-
},
|
|
403
|
-
});
|
|
404
|
-
|
|
405
|
-
export const strategyTools = {
|
|
406
|
-
swarm_select_strategy,
|
|
407
|
-
};
|