musubi-sdd 5.0.0 → 5.6.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.
Files changed (232) hide show
  1. package/README.ja.md +106 -48
  2. package/README.md +110 -32
  3. package/bin/musubi-analyze.js +74 -67
  4. package/bin/musubi-browser.js +27 -26
  5. package/bin/musubi-change.js +48 -47
  6. package/bin/musubi-checkpoint.js +10 -7
  7. package/bin/musubi-convert.js +25 -25
  8. package/bin/musubi-costs.js +27 -10
  9. package/bin/musubi-gui.js +52 -46
  10. package/bin/musubi-init.js +1952 -10
  11. package/bin/musubi-orchestrate.js +327 -239
  12. package/bin/musubi-remember.js +69 -56
  13. package/bin/musubi-resolve.js +53 -45
  14. package/bin/musubi-trace.js +51 -22
  15. package/bin/musubi-validate.js +39 -30
  16. package/bin/musubi-workflow.js +33 -34
  17. package/bin/musubi.js +39 -2
  18. package/package.json +1 -1
  19. package/src/agents/agent-loop.js +94 -95
  20. package/src/agents/agentic/code-generator.js +119 -109
  21. package/src/agents/agentic/code-reviewer.js +105 -108
  22. package/src/agents/agentic/index.js +4 -4
  23. package/src/agents/browser/action-executor.js +13 -13
  24. package/src/agents/browser/ai-comparator.js +11 -10
  25. package/src/agents/browser/context-manager.js +6 -6
  26. package/src/agents/browser/index.js +5 -5
  27. package/src/agents/browser/nl-parser.js +31 -46
  28. package/src/agents/browser/screenshot.js +2 -2
  29. package/src/agents/browser/test-generator.js +6 -4
  30. package/src/agents/function-tool.js +71 -65
  31. package/src/agents/index.js +7 -7
  32. package/src/agents/schema-generator.js +98 -94
  33. package/src/analyzers/ast-extractor.js +164 -145
  34. package/src/analyzers/codegraph-auto-update.js +858 -0
  35. package/src/analyzers/complexity-analyzer.js +536 -0
  36. package/src/analyzers/context-optimizer.js +247 -125
  37. package/src/analyzers/impact-analyzer.js +1 -1
  38. package/src/analyzers/large-project-analyzer.js +766 -0
  39. package/src/analyzers/repository-map.js +83 -80
  40. package/src/analyzers/security-analyzer.js +19 -11
  41. package/src/analyzers/stuck-detector.js +19 -17
  42. package/src/converters/index.js +78 -57
  43. package/src/converters/ir/types.js +12 -12
  44. package/src/converters/parsers/musubi-parser.js +134 -126
  45. package/src/converters/parsers/openapi-parser.js +70 -53
  46. package/src/converters/parsers/speckit-parser.js +239 -175
  47. package/src/converters/writers/musubi-writer.js +123 -118
  48. package/src/converters/writers/speckit-writer.js +124 -113
  49. package/src/generators/rust-migration-generator.js +512 -0
  50. package/src/gui/public/index.html +1365 -1211
  51. package/src/gui/server.js +41 -40
  52. package/src/gui/services/file-watcher.js +23 -8
  53. package/src/gui/services/project-scanner.js +26 -20
  54. package/src/gui/services/replanning-service.js +27 -23
  55. package/src/gui/services/traceability-service.js +8 -8
  56. package/src/gui/services/workflow-service.js +14 -7
  57. package/src/index.js +151 -0
  58. package/src/integrations/cicd.js +90 -104
  59. package/src/integrations/codegraph-mcp.js +643 -0
  60. package/src/integrations/documentation.js +142 -103
  61. package/src/integrations/examples.js +95 -80
  62. package/src/integrations/github-client.js +17 -17
  63. package/src/integrations/index.js +5 -5
  64. package/src/integrations/mcp/index.js +21 -21
  65. package/src/integrations/mcp/mcp-context-provider.js +76 -78
  66. package/src/integrations/mcp/mcp-discovery.js +74 -72
  67. package/src/integrations/mcp/mcp-tool-registry.js +99 -94
  68. package/src/integrations/mcp-connector.js +70 -66
  69. package/src/integrations/platforms.js +50 -49
  70. package/src/integrations/tool-discovery.js +37 -31
  71. package/src/llm-providers/anthropic-provider.js +11 -11
  72. package/src/llm-providers/base-provider.js +16 -18
  73. package/src/llm-providers/copilot-provider.js +22 -19
  74. package/src/llm-providers/index.js +26 -25
  75. package/src/llm-providers/ollama-provider.js +11 -11
  76. package/src/llm-providers/openai-provider.js +12 -12
  77. package/src/managers/agent-memory.js +36 -24
  78. package/src/managers/checkpoint-manager.js +4 -8
  79. package/src/managers/delta-spec.js +19 -19
  80. package/src/managers/index.js +13 -4
  81. package/src/managers/memory-condenser.js +35 -45
  82. package/src/managers/repo-skill-manager.js +57 -31
  83. package/src/managers/skill-loader.js +25 -22
  84. package/src/managers/skill-tools.js +36 -72
  85. package/src/managers/workflow.js +30 -22
  86. package/src/monitoring/cost-tracker.js +53 -44
  87. package/src/monitoring/incident-manager.js +123 -103
  88. package/src/monitoring/index.js +144 -134
  89. package/src/monitoring/observability.js +82 -59
  90. package/src/monitoring/quality-dashboard.js +51 -39
  91. package/src/monitoring/release-manager.js +70 -50
  92. package/src/orchestration/agent-skill-binding.js +39 -47
  93. package/src/orchestration/error-handler.js +65 -107
  94. package/src/orchestration/guardrails/base-guardrail.js +26 -24
  95. package/src/orchestration/guardrails/guardrail-rules.js +50 -64
  96. package/src/orchestration/guardrails/index.js +5 -5
  97. package/src/orchestration/guardrails/input-guardrail.js +58 -45
  98. package/src/orchestration/guardrails/output-guardrail.js +104 -81
  99. package/src/orchestration/guardrails/safety-check.js +79 -79
  100. package/src/orchestration/index.js +38 -55
  101. package/src/orchestration/mcp-tool-adapters.js +96 -99
  102. package/src/orchestration/orchestration-engine.js +21 -21
  103. package/src/orchestration/pattern-registry.js +60 -45
  104. package/src/orchestration/patterns/auto.js +34 -47
  105. package/src/orchestration/patterns/group-chat.js +59 -65
  106. package/src/orchestration/patterns/handoff.js +67 -65
  107. package/src/orchestration/patterns/human-in-loop.js +51 -72
  108. package/src/orchestration/patterns/nested.js +25 -40
  109. package/src/orchestration/patterns/sequential.js +35 -34
  110. package/src/orchestration/patterns/swarm.js +63 -56
  111. package/src/orchestration/patterns/triage.js +150 -109
  112. package/src/orchestration/reasoning/index.js +9 -9
  113. package/src/orchestration/reasoning/planning-engine.js +143 -140
  114. package/src/orchestration/reasoning/reasoning-engine.js +206 -144
  115. package/src/orchestration/reasoning/self-correction.js +121 -128
  116. package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
  117. package/src/orchestration/replanning/alternative-generator.js +37 -42
  118. package/src/orchestration/replanning/config.js +63 -59
  119. package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
  120. package/src/orchestration/replanning/index.js +24 -20
  121. package/src/orchestration/replanning/plan-evaluator.js +49 -50
  122. package/src/orchestration/replanning/plan-monitor.js +32 -28
  123. package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
  124. package/src/orchestration/replanning/replan-history.js +33 -26
  125. package/src/orchestration/replanning/replanning-engine.js +106 -108
  126. package/src/orchestration/skill-executor.js +107 -109
  127. package/src/orchestration/skill-registry.js +85 -89
  128. package/src/orchestration/workflow-examples.js +228 -231
  129. package/src/orchestration/workflow-executor.js +65 -68
  130. package/src/orchestration/workflow-orchestrator.js +72 -73
  131. package/src/phase4-integration.js +47 -40
  132. package/src/phase5-integration.js +89 -30
  133. package/src/reporters/coverage-report.js +82 -30
  134. package/src/reporters/hierarchical-reporter.js +498 -0
  135. package/src/reporters/traceability-matrix-report.js +29 -20
  136. package/src/resolvers/issue-resolver.js +43 -31
  137. package/src/steering/advanced-validation.js +133 -124
  138. package/src/steering/auto-updater.js +60 -73
  139. package/src/steering/index.js +6 -6
  140. package/src/steering/quality-metrics.js +41 -35
  141. package/src/steering/steering-auto-update.js +83 -86
  142. package/src/steering/steering-validator.js +98 -106
  143. package/src/steering/template-constraints.js +53 -54
  144. package/src/templates/agents/claude-code/CLAUDE.md +32 -32
  145. package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
  146. package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
  147. package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
  148. package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
  149. package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
  150. package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
  151. package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
  152. package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
  153. package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
  154. package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
  155. package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
  156. package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
  157. package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
  158. package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
  159. package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
  160. package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
  161. package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
  162. package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
  163. package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
  164. package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
  165. package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
  166. package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
  167. package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
  168. package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
  169. package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
  170. package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
  171. package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
  172. package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
  173. package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
  174. package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
  175. package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
  176. package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
  177. package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
  178. package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
  179. package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
  180. package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
  181. package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
  182. package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
  183. package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
  184. package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
  185. package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
  186. package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
  187. package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
  188. package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
  189. package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
  190. package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
  191. package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
  192. package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
  193. package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
  194. package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
  195. package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
  196. package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
  197. package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
  198. package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
  199. package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
  200. package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
  201. package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
  202. package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
  203. package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
  204. package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
  205. package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
  206. package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
  207. package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
  208. package/src/templates/agents/codex/AGENTS.md +74 -42
  209. package/src/templates/agents/cursor/AGENTS.md +74 -42
  210. package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
  211. package/src/templates/agents/github-copilot/AGENTS.md +83 -51
  212. package/src/templates/agents/qwen-code/QWEN.md +74 -42
  213. package/src/templates/agents/windsurf/AGENTS.md +74 -42
  214. package/src/templates/architectures/README.md +41 -0
  215. package/src/templates/architectures/clean-architecture/README.md +113 -0
  216. package/src/templates/architectures/event-driven/README.md +162 -0
  217. package/src/templates/architectures/hexagonal/README.md +130 -0
  218. package/src/templates/index.js +6 -1
  219. package/src/templates/locale-manager.js +16 -16
  220. package/src/templates/shared/delta-spec-template.md +20 -13
  221. package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
  222. package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
  223. package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
  224. package/src/templates/shared/steering/structure.md +95 -0
  225. package/src/templates/skills/browser-agent.md +21 -16
  226. package/src/templates/skills/web-gui.md +8 -0
  227. package/src/templates/template-constraints.js +50 -53
  228. package/src/validators/advanced-validation.js +30 -36
  229. package/src/validators/constitutional-validator.js +77 -73
  230. package/src/validators/critic-system.js +49 -59
  231. package/src/validators/delta-format.js +59 -55
  232. package/src/validators/traceability-validator.js +7 -11
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * SequentialPattern - Linear skill execution pattern
3
- *
3
+ *
4
4
  * Executes skills in sequence, passing output from one skill
5
5
  * as input to the next. Supports error handling and recovery.
6
6
  */
@@ -14,7 +14,7 @@ const { PatternType, ExecutionContext, ExecutionStatus } = require('../orchestra
14
14
  const SequentialOptions = {
15
15
  STOP_ON_ERROR: 'stop-on-error',
16
16
  CONTINUE_ON_ERROR: 'continue-on-error',
17
- RETRY_ON_ERROR: 'retry-on-error'
17
+ RETRY_ON_ERROR: 'retry-on-error',
18
18
  };
19
19
 
20
20
  /**
@@ -31,19 +31,19 @@ class SequentialPattern extends BasePattern {
31
31
  useCases: [
32
32
  'Step-by-step workflows',
33
33
  'Data transformation pipelines',
34
- 'Dependent task chains'
34
+ 'Dependent task chains',
35
35
  ],
36
36
  complexity: 'low',
37
37
  supportsParallel: false,
38
- requiresHuman: false
38
+ requiresHuman: false,
39
39
  });
40
40
 
41
41
  this.options = {
42
42
  errorHandling: options.errorHandling || SequentialOptions.STOP_ON_ERROR,
43
43
  maxRetries: options.maxRetries || 3,
44
44
  retryDelay: options.retryDelay || 1000,
45
- transformOutput: options.transformOutput || ((output, context) => output),
46
- ...options
45
+ transformOutput: options.transformOutput || ((output, _context) => output),
46
+ ...options,
47
47
  };
48
48
  }
49
49
 
@@ -73,7 +73,7 @@ class SequentialPattern extends BasePattern {
73
73
 
74
74
  return {
75
75
  valid: errors.length === 0,
76
- errors
76
+ errors,
77
77
  };
78
78
  }
79
79
 
@@ -97,7 +97,7 @@ class SequentialPattern extends BasePattern {
97
97
  engine.emit('sequentialStarted', {
98
98
  context,
99
99
  skills,
100
- totalSteps: skills.length
100
+ totalSteps: skills.length,
101
101
  });
102
102
 
103
103
  for (let i = 0; i < skills.length; i++) {
@@ -110,8 +110,8 @@ class SequentialPattern extends BasePattern {
110
110
  metadata: {
111
111
  stepIndex: i,
112
112
  totalSteps: skills.length,
113
- pattern: PatternType.SEQUENTIAL
114
- }
113
+ pattern: PatternType.SEQUENTIAL,
114
+ },
115
115
  });
116
116
 
117
117
  context.children.push(stepContext);
@@ -120,12 +120,12 @@ class SequentialPattern extends BasePattern {
120
120
  context,
121
121
  stepContext,
122
122
  stepIndex: i,
123
- skillName
123
+ skillName,
124
124
  });
125
125
 
126
126
  try {
127
127
  stepContext.start();
128
-
128
+
129
129
  const output = await this._executeWithRetry(
130
130
  () => engine.executeSkill(skillName, currentInput, context),
131
131
  skillName,
@@ -134,15 +134,15 @@ class SequentialPattern extends BasePattern {
134
134
 
135
135
  stepContext.complete(output);
136
136
  lastOutput = output;
137
-
137
+
138
138
  // Transform output for next step
139
139
  currentInput = this.options.transformOutput(output, stepContext);
140
-
140
+
141
141
  results.push({
142
142
  step: i + 1,
143
143
  skill: skillName,
144
144
  status: ExecutionStatus.COMPLETED,
145
- output
145
+ output,
146
146
  });
147
147
 
148
148
  engine.emit('sequentialStepCompleted', {
@@ -150,9 +150,8 @@ class SequentialPattern extends BasePattern {
150
150
  stepContext,
151
151
  stepIndex: i,
152
152
  skillName,
153
- output
153
+ output,
154
154
  });
155
-
156
155
  } catch (error) {
157
156
  stepContext.fail(error);
158
157
 
@@ -160,7 +159,7 @@ class SequentialPattern extends BasePattern {
160
159
  step: i + 1,
161
160
  skill: skillName,
162
161
  status: ExecutionStatus.FAILED,
163
- error: error.message
162
+ error: error.message,
164
163
  });
165
164
 
166
165
  engine.emit('sequentialStepFailed', {
@@ -168,7 +167,7 @@ class SequentialPattern extends BasePattern {
168
167
  stepContext,
169
168
  stepIndex: i,
170
169
  skillName,
171
- error
170
+ error,
172
171
  });
173
172
 
174
173
  // Handle error based on configuration
@@ -177,13 +176,13 @@ class SequentialPattern extends BasePattern {
177
176
  `Sequential execution failed at step ${i + 1} (${skillName}): ${error.message}`
178
177
  );
179
178
  }
180
-
179
+
181
180
  // Continue on error - use previous output as input
182
181
  engine.emit('sequentialContinuingAfterError', {
183
182
  context,
184
183
  stepIndex: i,
185
184
  skillName,
186
- error
185
+ error,
187
186
  });
188
187
  }
189
188
  }
@@ -193,13 +192,13 @@ class SequentialPattern extends BasePattern {
193
192
  engine.emit('sequentialCompleted', {
194
193
  context,
195
194
  results,
196
- summary
195
+ summary,
197
196
  });
198
197
 
199
198
  return {
200
199
  results,
201
200
  summary,
202
- finalOutput: lastOutput
201
+ finalOutput: lastOutput,
203
202
  };
204
203
  }
205
204
 
@@ -209,29 +208,31 @@ class SequentialPattern extends BasePattern {
209
208
  */
210
209
  async _executeWithRetry(fn, skillName, engine) {
211
210
  let lastError;
212
-
211
+
213
212
  for (let attempt = 1; attempt <= this.options.maxRetries; attempt++) {
214
213
  try {
215
214
  return await fn();
216
215
  } catch (error) {
217
216
  lastError = error;
218
-
219
- if (attempt < this.options.maxRetries &&
220
- this.options.errorHandling === SequentialOptions.RETRY_ON_ERROR) {
217
+
218
+ if (
219
+ attempt < this.options.maxRetries &&
220
+ this.options.errorHandling === SequentialOptions.RETRY_ON_ERROR
221
+ ) {
221
222
  engine.emit('sequentialRetrying', {
222
223
  skillName,
223
224
  attempt,
224
225
  maxRetries: this.options.maxRetries,
225
- error
226
+ error,
226
227
  });
227
-
228
+
228
229
  await this._delay(this.options.retryDelay * attempt);
229
230
  } else {
230
231
  throw error;
231
232
  }
232
233
  }
233
234
  }
234
-
235
+
235
236
  throw lastError;
236
237
  }
237
238
 
@@ -250,14 +251,14 @@ class SequentialPattern extends BasePattern {
250
251
  _createSummary(results, skills) {
251
252
  const completed = results.filter(r => r.status === ExecutionStatus.COMPLETED).length;
252
253
  const failed = results.filter(r => r.status === ExecutionStatus.FAILED).length;
253
-
254
+
254
255
  return {
255
256
  totalSteps: skills.length,
256
257
  completed,
257
258
  failed,
258
- successRate: skills.length > 0 ? (completed / skills.length * 100).toFixed(1) + '%' : '0%',
259
+ successRate: skills.length > 0 ? ((completed / skills.length) * 100).toFixed(1) + '%' : '0%',
259
260
  allCompleted: completed === skills.length,
260
- hasFailed: failed > 0
261
+ hasFailed: failed > 0,
261
262
  };
262
263
  }
263
264
  }
@@ -274,5 +275,5 @@ function createSequentialPattern(options = {}) {
274
275
  module.exports = {
275
276
  SequentialPattern,
276
277
  SequentialOptions,
277
- createSequentialPattern
278
+ createSequentialPattern,
278
279
  };
@@ -1,33 +1,38 @@
1
1
  /**
2
2
  * SwarmPattern - Parallel skill execution pattern
3
- *
3
+ *
4
4
  * Enables concurrent execution of multiple skills with
5
5
  * P-label task decomposition and dependency tracking.
6
- *
6
+ *
7
7
  * v1.1.0: Added replanning support for dynamic task recovery
8
8
  */
9
9
 
10
10
  const { BasePattern } = require('../pattern-registry');
11
- const { PatternType, ExecutionContext, ExecutionStatus, Priority } = require('../orchestration-engine');
11
+ const {
12
+ PatternType,
13
+ ExecutionContext,
14
+ ExecutionStatus: _ExecutionStatus,
15
+ Priority,
16
+ } = require('../orchestration-engine');
12
17
 
13
18
  /**
14
19
  * P-label priority levels for parallel execution
15
20
  */
16
21
  const PLabel = {
17
- P0: 'P0', // Critical - must complete first (blocking)
18
- P1: 'P1', // High priority - primary path
19
- P2: 'P2', // Medium priority - secondary path
20
- P3: 'P3' // Low priority - can be deferred
22
+ P0: 'P0', // Critical - must complete first (blocking)
23
+ P1: 'P1', // High priority - primary path
24
+ P2: 'P2', // Medium priority - secondary path
25
+ P3: 'P3', // Low priority - can be deferred
21
26
  };
22
27
 
23
28
  /**
24
29
  * Execution strategy for swarm
25
30
  */
26
31
  const SwarmStrategy = {
27
- ALL: 'all', // Wait for all to complete
28
- FIRST: 'first', // Return after first success
32
+ ALL: 'all', // Wait for all to complete
33
+ FIRST: 'first', // Return after first success
29
34
  MAJORITY: 'majority', // Return after majority complete
30
- QUORUM: 'quorum' // Return after quorum achieved
35
+ QUORUM: 'quorum', // Return after quorum achieved
31
36
  };
32
37
 
33
38
  /**
@@ -46,12 +51,12 @@ class SwarmPattern extends BasePattern {
46
51
  'Independent subtask processing',
47
52
  'Load distribution',
48
53
  'Multi-perspective analysis',
49
- 'Dynamic task recovery with replanning'
54
+ 'Dynamic task recovery with replanning',
50
55
  ],
51
56
  complexity: 'high',
52
57
  supportsParallel: true,
53
58
  supportsReplanning: true,
54
- requiresHuman: false
59
+ requiresHuman: false,
55
60
  });
56
61
 
57
62
  this.options = {
@@ -66,7 +71,7 @@ class SwarmPattern extends BasePattern {
66
71
  enableReplanning: options.enableReplanning || false,
67
72
  replanningEngine: options.replanningEngine || null,
68
73
  fallbackSkill: options.fallbackSkill || null,
69
- ...options
74
+ ...options,
70
75
  };
71
76
  }
72
77
 
@@ -114,7 +119,7 @@ class SwarmPattern extends BasePattern {
114
119
 
115
120
  return {
116
121
  valid: errors.length === 0,
117
- errors
122
+ errors,
118
123
  };
119
124
  }
120
125
 
@@ -139,7 +144,7 @@ class SwarmPattern extends BasePattern {
139
144
  engine.emit('swarmStarted', {
140
145
  context,
141
146
  totalTasks: tasks.length,
142
- strategy: this.options.strategy
147
+ strategy: this.options.strategy,
143
148
  });
144
149
 
145
150
  const startTime = Date.now();
@@ -154,7 +159,7 @@ class SwarmPattern extends BasePattern {
154
159
  const readyTasks = sortedTasks.filter(task => {
155
160
  const taskId = task.id || task.skill;
156
161
  if (!pending.has(taskId)) return false;
157
-
162
+
158
163
  const deps = dependencies[taskId] || [];
159
164
  return deps.every(dep => completed.has(dep));
160
165
  });
@@ -170,7 +175,7 @@ class SwarmPattern extends BasePattern {
170
175
  engine.emit('swarmBatchStarted', {
171
176
  context,
172
177
  batch: batch.map(t => t.id || t.skill),
173
- pending: pending.size
178
+ pending: pending.size,
174
179
  });
175
180
 
176
181
  const batchResults = await Promise.allSettled(
@@ -192,7 +197,7 @@ class SwarmPattern extends BasePattern {
192
197
  engine.emit('swarmTaskCompleted', {
193
198
  context,
194
199
  taskId,
195
- result: result.value
200
+ result: result.value,
196
201
  });
197
202
  } else {
198
203
  failed.add(taskId);
@@ -201,7 +206,7 @@ class SwarmPattern extends BasePattern {
201
206
  engine.emit('swarmTaskFailed', {
202
207
  context,
203
208
  taskId,
204
- error: result.reason
209
+ error: result.reason,
205
210
  });
206
211
 
207
212
  // Try replanning if enabled
@@ -214,17 +219,17 @@ class SwarmPattern extends BasePattern {
214
219
  sharedContext,
215
220
  results
216
221
  );
217
-
222
+
218
223
  if (alternative) {
219
224
  // Add alternative task to pending
220
225
  pending.add(alternative.id || alternative.skill);
221
226
  sortedTasks.push(alternative);
222
227
  failed.delete(taskId);
223
-
228
+
224
229
  engine.emit('swarmTaskReplanned', {
225
230
  context,
226
231
  originalTaskId: taskId,
227
- alternativeTask: alternative
232
+ alternativeTask: alternative,
228
233
  });
229
234
  continue;
230
235
  }
@@ -241,7 +246,7 @@ class SwarmPattern extends BasePattern {
241
246
  ...task,
242
247
  skill: this.options.fallbackSkill,
243
248
  id: `${taskId}-fallback`,
244
- originalTaskId: taskId
249
+ originalTaskId: taskId,
245
250
  };
246
251
  pending.add(fallbackTask.id);
247
252
  sortedTasks.push(fallbackTask);
@@ -262,21 +267,20 @@ class SwarmPattern extends BasePattern {
262
267
  engine.emit('swarmCompleted', {
263
268
  context,
264
269
  results: Object.fromEntries(results),
265
- summary
270
+ summary,
266
271
  });
267
272
 
268
273
  return {
269
274
  results: Object.fromEntries(results),
270
275
  completed: [...completed],
271
276
  failed: [...failed],
272
- summary
277
+ summary,
273
278
  };
274
-
275
279
  } catch (error) {
276
280
  engine.emit('swarmFailed', {
277
281
  context,
278
282
  results: Object.fromEntries(results),
279
- error
283
+ error,
280
284
  });
281
285
  throw error;
282
286
  }
@@ -288,7 +292,7 @@ class SwarmPattern extends BasePattern {
288
292
  */
289
293
  _sortByPriority(tasks) {
290
294
  const priorityOrder = this.options.priorityOrder;
291
-
295
+
292
296
  return [...tasks].sort((a, b) => {
293
297
  const aPriority = a.priority || PLabel.P2;
294
298
  const bPriority = b.priority || PLabel.P2;
@@ -302,22 +306,22 @@ class SwarmPattern extends BasePattern {
302
306
  */
303
307
  async _executeTask(task, engine, parentContext, sharedContext, previousResults) {
304
308
  const taskId = task.id || task.skill;
305
-
309
+
306
310
  const stepContext = new ExecutionContext({
307
311
  task: `Swarm task: ${taskId}`,
308
312
  skill: task.skill,
309
313
  input: {
310
314
  ...sharedContext,
311
315
  ...task.input,
312
- previousResults: Object.fromEntries(previousResults)
316
+ previousResults: Object.fromEntries(previousResults),
313
317
  },
314
318
  parentId: parentContext.id,
315
319
  priority: this._mapPriority(task.priority),
316
320
  metadata: {
317
321
  pattern: PatternType.SWARM,
318
322
  taskId,
319
- priority: task.priority || PLabel.P2
320
- }
323
+ priority: task.priority || PLabel.P2,
324
+ },
321
325
  });
322
326
 
323
327
  parentContext.children.push(stepContext);
@@ -327,12 +331,11 @@ class SwarmPattern extends BasePattern {
327
331
  try {
328
332
  const result = await Promise.race([
329
333
  engine.executeSkill(task.skill, stepContext.input, parentContext),
330
- this._timeout(this.options.timeout, taskId)
334
+ this._timeout(this.options.timeout, taskId),
331
335
  ]);
332
336
 
333
337
  stepContext.complete(result);
334
338
  return result;
335
-
336
339
  } catch (error) {
337
340
  stepContext.fail(error);
338
341
  throw error;
@@ -348,7 +351,7 @@ class SwarmPattern extends BasePattern {
348
351
  [PLabel.P0]: Priority.CRITICAL,
349
352
  [PLabel.P1]: Priority.HIGH,
350
353
  [PLabel.P2]: Priority.MEDIUM,
351
- [PLabel.P3]: Priority.LOW
354
+ [PLabel.P3]: Priority.LOW,
352
355
  };
353
356
  return mapping[pLabel] || Priority.MEDIUM;
354
357
  }
@@ -376,21 +379,25 @@ class SwarmPattern extends BasePattern {
376
379
  */
377
380
  async _tryReplanning(task, error, engine, context, sharedContext, previousResults) {
378
381
  const replanningEngine = this.options.replanningEngine;
379
-
382
+
380
383
  try {
381
384
  // Create context for replanning
382
385
  const replanContext = {
383
- completed: [...previousResults.entries()].filter(([, v]) => !v.error).map(([id, result]) => ({
384
- id,
385
- result
386
- })),
386
+ completed: [...previousResults.entries()]
387
+ .filter(([, v]) => !v.error)
388
+ .map(([id, result]) => ({
389
+ id,
390
+ result,
391
+ })),
387
392
  pending: [],
388
- failed: [{
389
- id: task.id || task.skill,
390
- ...task,
391
- error
392
- }],
393
- sharedContext
393
+ failed: [
394
+ {
395
+ id: task.id || task.skill,
396
+ ...task,
397
+ error,
398
+ },
399
+ ],
400
+ sharedContext,
394
401
  };
395
402
 
396
403
  // Generate alternatives
@@ -401,7 +408,7 @@ class SwarmPattern extends BasePattern {
401
408
 
402
409
  if (alternatives.length > 0) {
403
410
  const best = alternatives[0];
404
-
411
+
405
412
  // Only use alternatives with sufficient confidence
406
413
  if (best.confidence >= (replanningEngine.config.alternatives?.minConfidence || 0.5)) {
407
414
  return {
@@ -410,7 +417,7 @@ class SwarmPattern extends BasePattern {
410
417
  priority: task.priority,
411
418
  originalTaskId: task.id || task.skill,
412
419
  replanSource: 'llm',
413
- replanConfidence: best.confidence
420
+ replanConfidence: best.confidence,
414
421
  };
415
422
  }
416
423
  }
@@ -418,7 +425,7 @@ class SwarmPattern extends BasePattern {
418
425
  engine.emit('swarmReplanFailed', {
419
426
  context,
420
427
  taskId: task.id || task.skill,
421
- error: replanError
428
+ error: replanError,
422
429
  });
423
430
  }
424
431
 
@@ -433,13 +440,13 @@ class SwarmPattern extends BasePattern {
433
440
  switch (this.options.strategy) {
434
441
  case SwarmStrategy.FIRST:
435
442
  return completed.size >= 1;
436
-
443
+
437
444
  case SwarmStrategy.MAJORITY:
438
445
  return completed.size > total / 2;
439
-
446
+
440
447
  case SwarmStrategy.QUORUM:
441
448
  return completed.size >= total * this.options.quorumThreshold;
442
-
449
+
443
450
  case SwarmStrategy.ALL:
444
451
  default:
445
452
  return false; // Continue until all complete
@@ -461,7 +468,7 @@ class SwarmPattern extends BasePattern {
461
468
  [PLabel.P0]: { total: 0, completed: 0, failed: 0 },
462
469
  [PLabel.P1]: { total: 0, completed: 0, failed: 0 },
463
470
  [PLabel.P2]: { total: 0, completed: 0, failed: 0 },
464
- [PLabel.P3]: { total: 0, completed: 0, failed: 0 }
471
+ [PLabel.P3]: { total: 0, completed: 0, failed: 0 },
465
472
  };
466
473
 
467
474
  for (const task of tasks) {
@@ -478,9 +485,9 @@ class SwarmPattern extends BasePattern {
478
485
  failed: failCount,
479
486
  pending: pendingCount,
480
487
  duration,
481
- successRate: total > 0 ? (successCount / total * 100).toFixed(1) + '%' : '0%',
488
+ successRate: total > 0 ? ((successCount / total) * 100).toFixed(1) + '%' : '0%',
482
489
  strategy: this.options.strategy,
483
- byPriority
490
+ byPriority,
484
491
  };
485
492
  }
486
493
  }
@@ -498,5 +505,5 @@ module.exports = {
498
505
  SwarmPattern,
499
506
  PLabel,
500
507
  SwarmStrategy,
501
- createSwarmPattern
508
+ createSwarmPattern,
502
509
  };