musubi-sdd 5.1.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.
- package/README.ja.md +106 -48
- package/README.md +110 -32
- package/bin/musubi-analyze.js +74 -67
- package/bin/musubi-browser.js +27 -26
- package/bin/musubi-change.js +48 -47
- package/bin/musubi-checkpoint.js +10 -7
- package/bin/musubi-convert.js +25 -25
- package/bin/musubi-costs.js +27 -10
- package/bin/musubi-gui.js +52 -46
- package/bin/musubi-init.js +1952 -10
- package/bin/musubi-orchestrate.js +327 -239
- package/bin/musubi-remember.js +69 -56
- package/bin/musubi-resolve.js +53 -45
- package/bin/musubi-trace.js +51 -22
- package/bin/musubi-validate.js +39 -30
- package/bin/musubi-workflow.js +33 -34
- package/bin/musubi.js +39 -2
- package/package.json +1 -1
- package/src/agents/agent-loop.js +94 -95
- package/src/agents/agentic/code-generator.js +119 -109
- package/src/agents/agentic/code-reviewer.js +105 -108
- package/src/agents/agentic/index.js +4 -4
- package/src/agents/browser/action-executor.js +13 -13
- package/src/agents/browser/ai-comparator.js +11 -10
- package/src/agents/browser/context-manager.js +6 -6
- package/src/agents/browser/index.js +5 -5
- package/src/agents/browser/nl-parser.js +31 -46
- package/src/agents/browser/screenshot.js +2 -2
- package/src/agents/browser/test-generator.js +6 -4
- package/src/agents/function-tool.js +71 -65
- package/src/agents/index.js +7 -7
- package/src/agents/schema-generator.js +98 -94
- package/src/analyzers/ast-extractor.js +158 -146
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +241 -126
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +77 -81
- package/src/analyzers/security-analyzer.js +19 -11
- package/src/analyzers/stuck-detector.js +19 -17
- package/src/converters/index.js +78 -57
- package/src/converters/ir/types.js +12 -12
- package/src/converters/parsers/musubi-parser.js +134 -126
- package/src/converters/parsers/openapi-parser.js +70 -53
- package/src/converters/parsers/speckit-parser.js +239 -175
- package/src/converters/writers/musubi-writer.js +123 -118
- package/src/converters/writers/speckit-writer.js +124 -113
- package/src/generators/rust-migration-generator.js +512 -0
- package/src/gui/public/index.html +1365 -1211
- package/src/gui/server.js +41 -40
- package/src/gui/services/file-watcher.js +23 -8
- package/src/gui/services/project-scanner.js +26 -20
- package/src/gui/services/replanning-service.js +27 -23
- package/src/gui/services/traceability-service.js +8 -8
- package/src/gui/services/workflow-service.js +14 -7
- package/src/index.js +151 -0
- package/src/integrations/cicd.js +90 -104
- package/src/integrations/codegraph-mcp.js +643 -0
- package/src/integrations/documentation.js +142 -103
- package/src/integrations/examples.js +95 -80
- package/src/integrations/github-client.js +17 -17
- package/src/integrations/index.js +5 -5
- package/src/integrations/mcp/index.js +21 -21
- package/src/integrations/mcp/mcp-context-provider.js +76 -78
- package/src/integrations/mcp/mcp-discovery.js +74 -72
- package/src/integrations/mcp/mcp-tool-registry.js +99 -94
- package/src/integrations/mcp-connector.js +70 -66
- package/src/integrations/platforms.js +50 -49
- package/src/integrations/tool-discovery.js +37 -31
- package/src/llm-providers/anthropic-provider.js +11 -11
- package/src/llm-providers/base-provider.js +16 -18
- package/src/llm-providers/copilot-provider.js +22 -19
- package/src/llm-providers/index.js +26 -25
- package/src/llm-providers/ollama-provider.js +11 -11
- package/src/llm-providers/openai-provider.js +12 -12
- package/src/managers/agent-memory.js +36 -24
- package/src/managers/checkpoint-manager.js +4 -8
- package/src/managers/delta-spec.js +19 -19
- package/src/managers/index.js +13 -4
- package/src/managers/memory-condenser.js +35 -45
- package/src/managers/repo-skill-manager.js +57 -31
- package/src/managers/skill-loader.js +25 -22
- package/src/managers/skill-tools.js +36 -72
- package/src/managers/workflow.js +30 -22
- package/src/monitoring/cost-tracker.js +48 -46
- package/src/monitoring/incident-manager.js +116 -106
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +75 -62
- package/src/monitoring/quality-dashboard.js +45 -41
- package/src/monitoring/release-manager.js +63 -53
- package/src/orchestration/agent-skill-binding.js +39 -47
- package/src/orchestration/error-handler.js +65 -107
- package/src/orchestration/guardrails/base-guardrail.js +26 -24
- package/src/orchestration/guardrails/guardrail-rules.js +50 -64
- package/src/orchestration/guardrails/index.js +5 -5
- package/src/orchestration/guardrails/input-guardrail.js +58 -45
- package/src/orchestration/guardrails/output-guardrail.js +104 -81
- package/src/orchestration/guardrails/safety-check.js +79 -79
- package/src/orchestration/index.js +38 -55
- package/src/orchestration/mcp-tool-adapters.js +96 -99
- package/src/orchestration/orchestration-engine.js +21 -21
- package/src/orchestration/pattern-registry.js +60 -45
- package/src/orchestration/patterns/auto.js +34 -47
- package/src/orchestration/patterns/group-chat.js +59 -65
- package/src/orchestration/patterns/handoff.js +67 -65
- package/src/orchestration/patterns/human-in-loop.js +51 -72
- package/src/orchestration/patterns/nested.js +25 -40
- package/src/orchestration/patterns/sequential.js +35 -34
- package/src/orchestration/patterns/swarm.js +63 -56
- package/src/orchestration/patterns/triage.js +150 -109
- package/src/orchestration/reasoning/index.js +9 -9
- package/src/orchestration/reasoning/planning-engine.js +143 -140
- package/src/orchestration/reasoning/reasoning-engine.js +206 -144
- package/src/orchestration/reasoning/self-correction.js +121 -128
- package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
- package/src/orchestration/replanning/alternative-generator.js +37 -42
- package/src/orchestration/replanning/config.js +63 -59
- package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
- package/src/orchestration/replanning/index.js +24 -20
- package/src/orchestration/replanning/plan-evaluator.js +49 -50
- package/src/orchestration/replanning/plan-monitor.js +32 -28
- package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
- package/src/orchestration/replanning/replan-history.js +33 -26
- package/src/orchestration/replanning/replanning-engine.js +106 -108
- package/src/orchestration/skill-executor.js +107 -109
- package/src/orchestration/skill-registry.js +85 -89
- package/src/orchestration/workflow-examples.js +228 -231
- package/src/orchestration/workflow-executor.js +65 -68
- package/src/orchestration/workflow-orchestrator.js +72 -73
- package/src/phase4-integration.js +47 -40
- package/src/phase5-integration.js +89 -30
- package/src/reporters/coverage-report.js +82 -30
- package/src/reporters/hierarchical-reporter.js +498 -0
- package/src/reporters/traceability-matrix-report.js +29 -20
- package/src/resolvers/issue-resolver.js +43 -31
- package/src/steering/advanced-validation.js +133 -124
- package/src/steering/auto-updater.js +60 -73
- package/src/steering/index.js +6 -6
- package/src/steering/quality-metrics.js +41 -35
- package/src/steering/steering-auto-update.js +83 -86
- package/src/steering/steering-validator.js +98 -106
- package/src/steering/template-constraints.js +53 -54
- package/src/templates/agents/claude-code/CLAUDE.md +32 -32
- package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
- package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
- package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
- package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
- package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
- package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
- package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
- package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
- package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
- package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
- package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
- package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
- package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
- package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
- package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
- package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
- package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
- package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
- package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
- package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
- package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
- package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
- package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
- package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
- package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
- package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
- package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
- package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
- package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
- package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
- package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
- package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
- package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
- package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
- package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
- package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
- package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
- package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
- package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
- package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
- package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
- package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
- package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
- package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
- package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
- package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
- package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
- package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
- package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
- package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
- package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
- package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
- package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
- package/src/templates/agents/codex/AGENTS.md +74 -42
- package/src/templates/agents/cursor/AGENTS.md +74 -42
- package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
- package/src/templates/agents/github-copilot/AGENTS.md +83 -51
- package/src/templates/agents/qwen-code/QWEN.md +74 -42
- package/src/templates/agents/windsurf/AGENTS.md +74 -42
- package/src/templates/architectures/README.md +41 -0
- package/src/templates/architectures/clean-architecture/README.md +113 -0
- package/src/templates/architectures/event-driven/README.md +162 -0
- package/src/templates/architectures/hexagonal/README.md +130 -0
- package/src/templates/index.js +6 -1
- package/src/templates/locale-manager.js +16 -16
- package/src/templates/shared/delta-spec-template.md +20 -13
- package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
- package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
- package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
- package/src/templates/shared/steering/structure.md +95 -0
- package/src/templates/skills/browser-agent.md +21 -16
- package/src/templates/skills/web-gui.md +8 -0
- package/src/templates/template-constraints.js +50 -53
- package/src/validators/advanced-validation.js +30 -36
- package/src/validators/constitutional-validator.js +77 -73
- package/src/validators/critic-system.js +49 -59
- package/src/validators/delta-format.js +59 -55
- 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,
|
|
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 (
|
|
220
|
-
|
|
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 {
|
|
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',
|
|
18
|
-
P1: 'P1',
|
|
19
|
-
P2: 'P2',
|
|
20
|
-
P3: 'P3'
|
|
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',
|
|
28
|
-
FIRST: 'first',
|
|
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'
|
|
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()]
|
|
384
|
-
|
|
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
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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
|
};
|