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.
- 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 +164 -145
- package/src/analyzers/codegraph-auto-update.js +858 -0
- package/src/analyzers/complexity-analyzer.js +536 -0
- package/src/analyzers/context-optimizer.js +247 -125
- package/src/analyzers/impact-analyzer.js +1 -1
- package/src/analyzers/large-project-analyzer.js +766 -0
- package/src/analyzers/repository-map.js +83 -80
- 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 +53 -44
- package/src/monitoring/incident-manager.js +123 -103
- package/src/monitoring/index.js +144 -134
- package/src/monitoring/observability.js +82 -59
- package/src/monitoring/quality-dashboard.js +51 -39
- package/src/monitoring/release-manager.js +70 -50
- 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
|
* WorkflowOrchestrator - Complex multi-pattern workflow execution
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Enables end-to-end workflows combining multiple orchestration patterns
|
|
5
5
|
* for complete SDD lifecycle (Research → Monitoring)
|
|
6
6
|
*/
|
|
@@ -11,12 +11,12 @@ const { PatternType, ExecutionContext, ExecutionStatus } = require('./orchestrat
|
|
|
11
11
|
* Workflow step types
|
|
12
12
|
*/
|
|
13
13
|
const StepType = {
|
|
14
|
-
SKILL: 'skill',
|
|
15
|
-
PATTERN: 'pattern',
|
|
14
|
+
SKILL: 'skill', // Single skill execution
|
|
15
|
+
PATTERN: 'pattern', // Execute an orchestration pattern
|
|
16
16
|
CONDITIONAL: 'conditional', // Branch based on condition
|
|
17
|
-
PARALLEL: 'parallel',
|
|
17
|
+
PARALLEL: 'parallel', // Parallel steps
|
|
18
18
|
CHECKPOINT: 'checkpoint', // Save state checkpoint
|
|
19
|
-
HUMAN_GATE: 'human-gate'
|
|
19
|
+
HUMAN_GATE: 'human-gate', // Require human approval
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -28,7 +28,7 @@ const WorkflowState = {
|
|
|
28
28
|
PAUSED: 'paused',
|
|
29
29
|
COMPLETED: 'completed',
|
|
30
30
|
FAILED: 'failed',
|
|
31
|
-
CANCELLED: 'cancelled'
|
|
31
|
+
CANCELLED: 'cancelled',
|
|
32
32
|
};
|
|
33
33
|
|
|
34
34
|
/**
|
|
@@ -43,7 +43,7 @@ class WorkflowOrchestrator {
|
|
|
43
43
|
maxRetries: options.maxRetries || 3,
|
|
44
44
|
retryDelay: options.retryDelay || 1000,
|
|
45
45
|
timeout: options.timeout || 300000, // 5 minutes default
|
|
46
|
-
...options
|
|
46
|
+
...options,
|
|
47
47
|
};
|
|
48
48
|
|
|
49
49
|
this.workflows = new Map();
|
|
@@ -68,7 +68,7 @@ class WorkflowOrchestrator {
|
|
|
68
68
|
inputs: definition.inputs || [],
|
|
69
69
|
outputs: definition.outputs || [],
|
|
70
70
|
onError: definition.onError || 'stop',
|
|
71
|
-
metadata: definition.metadata || {}
|
|
71
|
+
metadata: definition.metadata || {},
|
|
72
72
|
});
|
|
73
73
|
|
|
74
74
|
return this;
|
|
@@ -106,7 +106,7 @@ class WorkflowOrchestrator {
|
|
|
106
106
|
|
|
107
107
|
const executionId = this._generateId();
|
|
108
108
|
const startTime = Date.now();
|
|
109
|
-
|
|
109
|
+
|
|
110
110
|
const execution = {
|
|
111
111
|
id: executionId,
|
|
112
112
|
workflow: workflowName,
|
|
@@ -119,7 +119,7 @@ class WorkflowOrchestrator {
|
|
|
119
119
|
checkpoints: [],
|
|
120
120
|
startTime,
|
|
121
121
|
endTime: null,
|
|
122
|
-
error: null
|
|
122
|
+
error: null,
|
|
123
123
|
};
|
|
124
124
|
|
|
125
125
|
this.activeExecutions.set(executionId, execution);
|
|
@@ -127,7 +127,7 @@ class WorkflowOrchestrator {
|
|
|
127
127
|
this.engine.emit('workflowStarted', {
|
|
128
128
|
executionId,
|
|
129
129
|
workflow: workflowName,
|
|
130
|
-
input
|
|
130
|
+
input,
|
|
131
131
|
});
|
|
132
132
|
|
|
133
133
|
try {
|
|
@@ -140,17 +140,17 @@ class WorkflowOrchestrator {
|
|
|
140
140
|
executionId,
|
|
141
141
|
stepIndex: i,
|
|
142
142
|
step: step.name || step.type,
|
|
143
|
-
totalSteps: workflow.steps.length
|
|
143
|
+
totalSteps: workflow.steps.length,
|
|
144
144
|
});
|
|
145
145
|
|
|
146
146
|
const stepResult = await this._executeStep(step, execution, options);
|
|
147
|
-
|
|
147
|
+
|
|
148
148
|
execution.stepResults.push({
|
|
149
149
|
step: step.name || `step-${i}`,
|
|
150
150
|
type: step.type,
|
|
151
151
|
status: stepResult.status,
|
|
152
152
|
output: stepResult.output,
|
|
153
|
-
duration: stepResult.duration
|
|
153
|
+
duration: stepResult.duration,
|
|
154
154
|
});
|
|
155
155
|
|
|
156
156
|
// Merge step output into context
|
|
@@ -158,7 +158,7 @@ class WorkflowOrchestrator {
|
|
|
158
158
|
execution.context = {
|
|
159
159
|
...execution.context,
|
|
160
160
|
...stepResult.output,
|
|
161
|
-
[`step_${i}_result`]: stepResult.output
|
|
161
|
+
[`step_${i}_result`]: stepResult.output,
|
|
162
162
|
};
|
|
163
163
|
}
|
|
164
164
|
|
|
@@ -166,7 +166,7 @@ class WorkflowOrchestrator {
|
|
|
166
166
|
executionId,
|
|
167
167
|
stepIndex: i,
|
|
168
168
|
step: step.name || step.type,
|
|
169
|
-
result: stepResult
|
|
169
|
+
result: stepResult,
|
|
170
170
|
});
|
|
171
171
|
|
|
172
172
|
// Handle step failure
|
|
@@ -188,7 +188,7 @@ class WorkflowOrchestrator {
|
|
|
188
188
|
executionId,
|
|
189
189
|
state: WorkflowState.PAUSED,
|
|
190
190
|
resumeFrom: i + 1,
|
|
191
|
-
context: execution.context
|
|
191
|
+
context: execution.context,
|
|
192
192
|
};
|
|
193
193
|
}
|
|
194
194
|
}
|
|
@@ -205,16 +205,15 @@ class WorkflowOrchestrator {
|
|
|
205
205
|
output: execution.output,
|
|
206
206
|
stepResults: execution.stepResults,
|
|
207
207
|
duration: execution.endTime - startTime,
|
|
208
|
-
summary: this._createSummary(execution)
|
|
208
|
+
summary: this._createSummary(execution),
|
|
209
209
|
};
|
|
210
210
|
|
|
211
211
|
this.engine.emit('workflowCompleted', {
|
|
212
212
|
executionId,
|
|
213
|
-
result
|
|
213
|
+
result,
|
|
214
214
|
});
|
|
215
215
|
|
|
216
216
|
return result;
|
|
217
|
-
|
|
218
217
|
} catch (error) {
|
|
219
218
|
execution.state = WorkflowState.FAILED;
|
|
220
219
|
execution.endTime = Date.now();
|
|
@@ -223,7 +222,7 @@ class WorkflowOrchestrator {
|
|
|
223
222
|
this.engine.emit('workflowFailed', {
|
|
224
223
|
executionId,
|
|
225
224
|
error,
|
|
226
|
-
stepResults: execution.stepResults
|
|
225
|
+
stepResults: execution.stepResults,
|
|
227
226
|
});
|
|
228
227
|
|
|
229
228
|
throw error;
|
|
@@ -274,14 +273,13 @@ class WorkflowOrchestrator {
|
|
|
274
273
|
return {
|
|
275
274
|
status: ExecutionStatus.COMPLETED,
|
|
276
275
|
output,
|
|
277
|
-
duration: Date.now() - startTime
|
|
276
|
+
duration: Date.now() - startTime,
|
|
278
277
|
};
|
|
279
|
-
|
|
280
278
|
} catch (error) {
|
|
281
279
|
return {
|
|
282
280
|
status: ExecutionStatus.FAILED,
|
|
283
281
|
error: error.message,
|
|
284
|
-
duration: Date.now() - startTime
|
|
282
|
+
duration: Date.now() - startTime,
|
|
285
283
|
};
|
|
286
284
|
}
|
|
287
285
|
}
|
|
@@ -293,7 +291,7 @@ class WorkflowOrchestrator {
|
|
|
293
291
|
async _executeSkillStep(step, execution) {
|
|
294
292
|
const input = this._resolveInput(step.input, execution.context);
|
|
295
293
|
const skill = this.engine.getSkill(step.skill);
|
|
296
|
-
|
|
294
|
+
|
|
297
295
|
if (!skill) {
|
|
298
296
|
throw new Error(`Unknown skill: ${step.skill}`);
|
|
299
297
|
}
|
|
@@ -301,7 +299,7 @@ class WorkflowOrchestrator {
|
|
|
301
299
|
const parentContext = new ExecutionContext({
|
|
302
300
|
task: `Workflow skill: ${step.skill}`,
|
|
303
301
|
skill: step.skill,
|
|
304
|
-
input
|
|
302
|
+
input,
|
|
305
303
|
});
|
|
306
304
|
|
|
307
305
|
return await this.engine.executeSkill(step.skill, input, parentContext);
|
|
@@ -313,9 +311,9 @@ class WorkflowOrchestrator {
|
|
|
313
311
|
*/
|
|
314
312
|
async _executePatternStep(step, execution) {
|
|
315
313
|
const input = this._resolveInput(step.input, execution.context);
|
|
316
|
-
|
|
314
|
+
|
|
317
315
|
const context = await this.engine.execute(step.pattern, {
|
|
318
|
-
input: { ...input, ...step.config }
|
|
316
|
+
input: { ...input, ...step.config },
|
|
319
317
|
});
|
|
320
318
|
|
|
321
319
|
return context.output;
|
|
@@ -327,9 +325,9 @@ class WorkflowOrchestrator {
|
|
|
327
325
|
*/
|
|
328
326
|
async _executeConditionalStep(step, execution) {
|
|
329
327
|
const condition = this._evaluateCondition(step.condition, execution.context);
|
|
330
|
-
|
|
328
|
+
|
|
331
329
|
const branchSteps = condition ? step.then : step.else;
|
|
332
|
-
|
|
330
|
+
|
|
333
331
|
if (branchSteps && branchSteps.length > 0) {
|
|
334
332
|
for (const branchStep of branchSteps) {
|
|
335
333
|
const result = await this._executeStep(branchStep, execution, {});
|
|
@@ -348,16 +346,14 @@ class WorkflowOrchestrator {
|
|
|
348
346
|
*/
|
|
349
347
|
async _executeParallelStep(step, execution) {
|
|
350
348
|
const results = await Promise.allSettled(
|
|
351
|
-
step.steps.map(subStep =>
|
|
352
|
-
this._executeStep(subStep, execution, {})
|
|
353
|
-
)
|
|
349
|
+
step.steps.map(subStep => this._executeStep(subStep, execution, {}))
|
|
354
350
|
);
|
|
355
351
|
|
|
356
352
|
const outputs = results.map((r, i) => ({
|
|
357
353
|
step: step.steps[i].name || `parallel-${i}`,
|
|
358
354
|
status: r.status === 'fulfilled' ? r.value.status : ExecutionStatus.FAILED,
|
|
359
355
|
output: r.status === 'fulfilled' ? r.value.output : null,
|
|
360
|
-
error: r.status === 'rejected' ? r.reason.message : null
|
|
356
|
+
error: r.status === 'rejected' ? r.reason.message : null,
|
|
361
357
|
}));
|
|
362
358
|
|
|
363
359
|
return { parallelResults: outputs };
|
|
@@ -372,7 +368,7 @@ class WorkflowOrchestrator {
|
|
|
372
368
|
id: this._generateId(),
|
|
373
369
|
name: step.name || 'checkpoint',
|
|
374
370
|
timestamp: Date.now(),
|
|
375
|
-
context: { ...execution.context }
|
|
371
|
+
context: { ...execution.context },
|
|
376
372
|
};
|
|
377
373
|
|
|
378
374
|
execution.checkpoints.push(checkpoint);
|
|
@@ -411,7 +407,7 @@ class WorkflowOrchestrator {
|
|
|
411
407
|
_resolveInput(input, context) {
|
|
412
408
|
if (!input) return context;
|
|
413
409
|
if (typeof input === 'function') return input(context);
|
|
414
|
-
|
|
410
|
+
|
|
415
411
|
const resolved = {};
|
|
416
412
|
for (const [key, value] of Object.entries(input)) {
|
|
417
413
|
if (typeof value === 'string' && value.startsWith('$')) {
|
|
@@ -454,8 +450,9 @@ class WorkflowOrchestrator {
|
|
|
454
450
|
*/
|
|
455
451
|
_resolveTemplate(template, context) {
|
|
456
452
|
if (typeof template !== 'string') return template;
|
|
457
|
-
return template.replace(
|
|
458
|
-
|
|
453
|
+
return template.replace(
|
|
454
|
+
/\$\{([^}]+)\}/g,
|
|
455
|
+
(_, path) => this._getValueByPath(context, path) || ''
|
|
459
456
|
);
|
|
460
457
|
}
|
|
461
458
|
|
|
@@ -465,7 +462,7 @@ class WorkflowOrchestrator {
|
|
|
465
462
|
*/
|
|
466
463
|
_extractOutputs(context, outputs) {
|
|
467
464
|
if (!outputs || outputs.length === 0) return context;
|
|
468
|
-
|
|
465
|
+
|
|
469
466
|
const result = {};
|
|
470
467
|
for (const output of outputs) {
|
|
471
468
|
result[output] = context[output];
|
|
@@ -478,7 +475,9 @@ class WorkflowOrchestrator {
|
|
|
478
475
|
* @private
|
|
479
476
|
*/
|
|
480
477
|
_createSummary(execution) {
|
|
481
|
-
const completed = execution.stepResults.filter(
|
|
478
|
+
const completed = execution.stepResults.filter(
|
|
479
|
+
s => s.status === ExecutionStatus.COMPLETED
|
|
480
|
+
).length;
|
|
482
481
|
const failed = execution.stepResults.filter(s => s.status === ExecutionStatus.FAILED).length;
|
|
483
482
|
const total = execution.stepResults.length;
|
|
484
483
|
|
|
@@ -486,9 +485,9 @@ class WorkflowOrchestrator {
|
|
|
486
485
|
totalSteps: total,
|
|
487
486
|
completedSteps: completed,
|
|
488
487
|
failedSteps: failed,
|
|
489
|
-
successRate: total > 0 ? (completed / total * 100).toFixed(1) + '%' : '0%',
|
|
488
|
+
successRate: total > 0 ? ((completed / total) * 100).toFixed(1) + '%' : '0%',
|
|
490
489
|
duration: execution.endTime - execution.startTime,
|
|
491
|
-
checkpoints: execution.checkpoints.length
|
|
490
|
+
checkpoints: execution.checkpoints.length,
|
|
492
491
|
};
|
|
493
492
|
}
|
|
494
493
|
|
|
@@ -504,7 +503,7 @@ class WorkflowOrchestrator {
|
|
|
504
503
|
workflow: execution.workflow,
|
|
505
504
|
currentStep: execution.currentStep,
|
|
506
505
|
context: execution.context,
|
|
507
|
-
timestamp: Date.now()
|
|
506
|
+
timestamp: Date.now(),
|
|
508
507
|
};
|
|
509
508
|
this.options.checkpointStorage.set(checkpoint.id, checkpoint);
|
|
510
509
|
return checkpoint;
|
|
@@ -532,7 +531,7 @@ class WorkflowOrchestrator {
|
|
|
532
531
|
const remainingSteps = workflow.steps.slice(checkpoint.currentStep);
|
|
533
532
|
const resumedWorkflow = {
|
|
534
533
|
...workflow,
|
|
535
|
-
steps: remainingSteps
|
|
534
|
+
steps: remainingSteps,
|
|
536
535
|
};
|
|
537
536
|
|
|
538
537
|
// Temporarily register resumed workflow
|
|
@@ -596,22 +595,22 @@ const SDDWorkflowTemplates = {
|
|
|
596
595
|
name: 'requirements',
|
|
597
596
|
type: StepType.SKILL,
|
|
598
597
|
skill: 'requirements-analyst',
|
|
599
|
-
input: { feature: '$featureName' }
|
|
598
|
+
input: { feature: '$featureName' },
|
|
600
599
|
},
|
|
601
600
|
{
|
|
602
601
|
name: 'design',
|
|
603
602
|
type: StepType.SKILL,
|
|
604
603
|
skill: 'software-architect',
|
|
605
|
-
input: { requirements: '$step_0_result' }
|
|
604
|
+
input: { requirements: '$step_0_result' },
|
|
606
605
|
},
|
|
607
606
|
{
|
|
608
607
|
name: 'tasks',
|
|
609
608
|
type: StepType.SKILL,
|
|
610
609
|
skill: 'task-planner',
|
|
611
|
-
input: { design: '$step_1_result' }
|
|
612
|
-
}
|
|
610
|
+
input: { design: '$step_1_result' },
|
|
611
|
+
},
|
|
613
612
|
],
|
|
614
|
-
outputs: ['requirements', 'design', 'tasks']
|
|
613
|
+
outputs: ['requirements', 'design', 'tasks'],
|
|
615
614
|
},
|
|
616
615
|
|
|
617
616
|
/**
|
|
@@ -625,17 +624,17 @@ const SDDWorkflowTemplates = {
|
|
|
625
624
|
name: 'research',
|
|
626
625
|
type: StepType.PATTERN,
|
|
627
626
|
pattern: PatternType.AUTO,
|
|
628
|
-
input: { task: 'Research: $featureName' }
|
|
627
|
+
input: { task: 'Research: $featureName' },
|
|
629
628
|
},
|
|
630
629
|
{
|
|
631
630
|
name: 'requirements',
|
|
632
631
|
type: StepType.SKILL,
|
|
633
|
-
skill: 'requirements-analyst'
|
|
632
|
+
skill: 'requirements-analyst',
|
|
634
633
|
},
|
|
635
634
|
{
|
|
636
635
|
name: 'review-requirements',
|
|
637
636
|
type: StepType.HUMAN_GATE,
|
|
638
|
-
question: 'Please review the requirements for ${featureName}'
|
|
637
|
+
question: 'Please review the requirements for ${featureName}',
|
|
639
638
|
},
|
|
640
639
|
{
|
|
641
640
|
name: 'design',
|
|
@@ -643,16 +642,16 @@ const SDDWorkflowTemplates = {
|
|
|
643
642
|
pattern: PatternType.GROUP_CHAT,
|
|
644
643
|
config: {
|
|
645
644
|
participants: ['software-architect', 'security-reviewer', 'ux-designer'],
|
|
646
|
-
topic: 'Design review'
|
|
647
|
-
}
|
|
645
|
+
topic: 'Design review',
|
|
646
|
+
},
|
|
648
647
|
},
|
|
649
648
|
{
|
|
650
649
|
name: 'implementation',
|
|
651
650
|
type: StepType.PATTERN,
|
|
652
651
|
pattern: PatternType.SEQUENTIAL,
|
|
653
652
|
config: {
|
|
654
|
-
skills: ['code-generator', 'test-engineer']
|
|
655
|
-
}
|
|
653
|
+
skills: ['code-generator', 'test-engineer'],
|
|
654
|
+
},
|
|
656
655
|
},
|
|
657
656
|
{
|
|
658
657
|
name: 'validation',
|
|
@@ -662,22 +661,22 @@ const SDDWorkflowTemplates = {
|
|
|
662
661
|
tasks: [
|
|
663
662
|
{ skill: 'code-reviewer' },
|
|
664
663
|
{ skill: 'security-reviewer' },
|
|
665
|
-
{ skill: 'accessibility-specialist' }
|
|
666
|
-
]
|
|
667
|
-
}
|
|
664
|
+
{ skill: 'accessibility-specialist' },
|
|
665
|
+
],
|
|
666
|
+
},
|
|
668
667
|
},
|
|
669
668
|
{
|
|
670
669
|
name: 'checkpoint',
|
|
671
670
|
type: StepType.CHECKPOINT,
|
|
672
|
-
|
|
671
|
+
checkpoint: 'pre-deployment',
|
|
673
672
|
},
|
|
674
673
|
{
|
|
675
674
|
name: 'deploy-approval',
|
|
676
675
|
type: StepType.HUMAN_GATE,
|
|
677
|
-
question: 'Approve deployment for ${featureName}?'
|
|
678
|
-
}
|
|
676
|
+
question: 'Approve deployment for ${featureName}?',
|
|
677
|
+
},
|
|
679
678
|
],
|
|
680
|
-
outputs: ['requirements', 'design', 'code', 'tests', 'reviews']
|
|
679
|
+
outputs: ['requirements', 'design', 'code', 'tests', 'reviews'],
|
|
681
680
|
},
|
|
682
681
|
|
|
683
682
|
/**
|
|
@@ -694,29 +693,29 @@ const SDDWorkflowTemplates = {
|
|
|
694
693
|
{
|
|
695
694
|
type: StepType.SKILL,
|
|
696
695
|
skill: 'code-reviewer',
|
|
697
|
-
input: { focus: 'quality' }
|
|
696
|
+
input: { focus: 'quality' },
|
|
698
697
|
},
|
|
699
698
|
{
|
|
700
699
|
type: StepType.SKILL,
|
|
701
700
|
skill: 'security-reviewer',
|
|
702
|
-
input: { focus: 'security' }
|
|
701
|
+
input: { focus: 'security' },
|
|
703
702
|
},
|
|
704
703
|
{
|
|
705
704
|
type: StepType.SKILL,
|
|
706
705
|
skill: 'performance-engineer',
|
|
707
|
-
input: { focus: 'performance' }
|
|
708
|
-
}
|
|
709
|
-
]
|
|
706
|
+
input: { focus: 'performance' },
|
|
707
|
+
},
|
|
708
|
+
],
|
|
710
709
|
},
|
|
711
710
|
{
|
|
712
711
|
name: 'consolidate',
|
|
713
712
|
type: StepType.SKILL,
|
|
714
713
|
skill: 'documentation-writer',
|
|
715
|
-
input: { reviews: '$parallelResults' }
|
|
716
|
-
}
|
|
714
|
+
input: { reviews: '$parallelResults' },
|
|
715
|
+
},
|
|
717
716
|
],
|
|
718
|
-
outputs: ['reviews', 'summary']
|
|
719
|
-
}
|
|
717
|
+
outputs: ['reviews', 'summary'],
|
|
718
|
+
},
|
|
720
719
|
};
|
|
721
720
|
|
|
722
721
|
/**
|
|
@@ -734,5 +733,5 @@ module.exports = {
|
|
|
734
733
|
StepType,
|
|
735
734
|
WorkflowState,
|
|
736
735
|
SDDWorkflowTemplates,
|
|
737
|
-
createWorkflowOrchestrator
|
|
736
|
+
createWorkflowOrchestrator,
|
|
738
737
|
};
|
|
@@ -10,9 +10,17 @@
|
|
|
10
10
|
const mcpIntegration = require('./integrations/mcp');
|
|
11
11
|
|
|
12
12
|
// Sprint 4.2: Codebase Intelligence
|
|
13
|
-
const {
|
|
13
|
+
const {
|
|
14
|
+
RepositoryMap,
|
|
15
|
+
createRepositoryMap,
|
|
16
|
+
generateRepositoryMap,
|
|
17
|
+
} = require('./analyzers/repository-map');
|
|
14
18
|
const { ASTExtractor, createASTExtractor } = require('./analyzers/ast-extractor');
|
|
15
|
-
const {
|
|
19
|
+
const {
|
|
20
|
+
ContextOptimizer,
|
|
21
|
+
createContextOptimizer,
|
|
22
|
+
optimizeContext,
|
|
23
|
+
} = require('./analyzers/context-optimizer');
|
|
16
24
|
|
|
17
25
|
// Sprint 4.3: Agentic Reasoning
|
|
18
26
|
const {
|
|
@@ -26,7 +34,7 @@ const {
|
|
|
26
34
|
STEP_TYPE,
|
|
27
35
|
TASK_STATUS,
|
|
28
36
|
PLAN_STATUS,
|
|
29
|
-
PRIORITY
|
|
37
|
+
PRIORITY,
|
|
30
38
|
} = require('./orchestration/reasoning');
|
|
31
39
|
|
|
32
40
|
// Sprint 4.4: Agentic Features
|
|
@@ -42,7 +50,7 @@ const {
|
|
|
42
50
|
TEMPLATES,
|
|
43
51
|
SEVERITY,
|
|
44
52
|
CATEGORY,
|
|
45
|
-
DEFAULT_RULES
|
|
53
|
+
DEFAULT_RULES,
|
|
46
54
|
} = require('./agents/agentic');
|
|
47
55
|
|
|
48
56
|
/**
|
|
@@ -53,10 +61,10 @@ const phase4 = {
|
|
|
53
61
|
// Version
|
|
54
62
|
version: '4.0.0',
|
|
55
63
|
phase: 4,
|
|
56
|
-
|
|
64
|
+
|
|
57
65
|
// Sprint 4.1: MCP Integration
|
|
58
66
|
mcp: mcpIntegration,
|
|
59
|
-
|
|
67
|
+
|
|
60
68
|
// Sprint 4.2: Codebase Intelligence
|
|
61
69
|
codebase: {
|
|
62
70
|
RepositoryMap,
|
|
@@ -66,9 +74,9 @@ const phase4 = {
|
|
|
66
74
|
createASTExtractor,
|
|
67
75
|
ContextOptimizer,
|
|
68
76
|
createContextOptimizer,
|
|
69
|
-
optimizeContext
|
|
77
|
+
optimizeContext,
|
|
70
78
|
},
|
|
71
|
-
|
|
79
|
+
|
|
72
80
|
// Sprint 4.3: Agentic Reasoning
|
|
73
81
|
reasoning: {
|
|
74
82
|
ReasoningEngine,
|
|
@@ -81,9 +89,9 @@ const phase4 = {
|
|
|
81
89
|
STEP_TYPE,
|
|
82
90
|
TASK_STATUS,
|
|
83
91
|
PLAN_STATUS,
|
|
84
|
-
PRIORITY
|
|
92
|
+
PRIORITY,
|
|
85
93
|
},
|
|
86
|
-
|
|
94
|
+
|
|
87
95
|
// Sprint 4.4: Agentic Features
|
|
88
96
|
agentic: {
|
|
89
97
|
CodeGenerator,
|
|
@@ -97,8 +105,8 @@ const phase4 = {
|
|
|
97
105
|
TEMPLATES,
|
|
98
106
|
SEVERITY,
|
|
99
107
|
CATEGORY,
|
|
100
|
-
DEFAULT_RULES
|
|
101
|
-
}
|
|
108
|
+
DEFAULT_RULES,
|
|
109
|
+
},
|
|
102
110
|
};
|
|
103
111
|
|
|
104
112
|
/**
|
|
@@ -112,16 +120,16 @@ function createIntegratedAgent(options = {}) {
|
|
|
112
120
|
repositoryMap: createRepositoryMap(options.repositoryMap),
|
|
113
121
|
astExtractor: createASTExtractor(options.astExtractor),
|
|
114
122
|
contextOptimizer: createContextOptimizer(options.contextOptimizer),
|
|
115
|
-
|
|
123
|
+
|
|
116
124
|
// Agentic Reasoning
|
|
117
125
|
reasoningEngine: createReasoningEngine(options.reasoning),
|
|
118
126
|
planningEngine: createPlanningEngine(options.planning),
|
|
119
127
|
selfCorrection: createSelfCorrection(options.selfCorrection),
|
|
120
|
-
|
|
128
|
+
|
|
121
129
|
// Agentic Features
|
|
122
130
|
codeGenerator: createCodeGenerator(options.codeGenerator),
|
|
123
131
|
codeReviewer: createCodeReviewer(options.codeReviewer),
|
|
124
|
-
|
|
132
|
+
|
|
125
133
|
/**
|
|
126
134
|
* Analyze repository and generate context
|
|
127
135
|
* @param {string} rootPath - Repository root path
|
|
@@ -131,10 +139,10 @@ function createIntegratedAgent(options = {}) {
|
|
|
131
139
|
const map = await this.repositoryMap.generate(rootPath);
|
|
132
140
|
return {
|
|
133
141
|
map,
|
|
134
|
-
stats: this.repositoryMap.getStats()
|
|
142
|
+
stats: this.repositoryMap.getStats(),
|
|
135
143
|
};
|
|
136
144
|
},
|
|
137
|
-
|
|
145
|
+
|
|
138
146
|
/**
|
|
139
147
|
* Generate code with reasoning
|
|
140
148
|
* @param {string} description - What to generate
|
|
@@ -144,50 +152,49 @@ function createIntegratedAgent(options = {}) {
|
|
|
144
152
|
async generateWithReasoning(description, options = {}) {
|
|
145
153
|
// Plan the generation
|
|
146
154
|
const plan = this.planningEngine.createPlan(`Generate: ${description}`, {
|
|
147
|
-
strategy: 'incremental'
|
|
155
|
+
strategy: 'incremental',
|
|
148
156
|
});
|
|
149
|
-
|
|
157
|
+
|
|
150
158
|
// Reason about the implementation
|
|
151
|
-
const reasoning = this.reasoningEngine.reason(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
159
|
+
const reasoning = this.reasoningEngine.reason(`How to implement: ${description}`, {
|
|
160
|
+
type: 'decomposition',
|
|
161
|
+
});
|
|
162
|
+
|
|
156
163
|
// Generate the code
|
|
157
164
|
const generated = await this.codeGenerator.generate({
|
|
158
165
|
description,
|
|
159
|
-
...options
|
|
166
|
+
...options,
|
|
160
167
|
});
|
|
161
|
-
|
|
168
|
+
|
|
162
169
|
// Review the generated code
|
|
163
170
|
const review = this.codeReviewer.review(generated.code, options);
|
|
164
|
-
|
|
171
|
+
|
|
165
172
|
// Self-correct if needed
|
|
166
173
|
if (review.score < 70) {
|
|
167
174
|
const correction = this.selfCorrection.analyzeError({
|
|
168
175
|
error: new Error('Code quality below threshold'),
|
|
169
|
-
context: { review, generated }
|
|
176
|
+
context: { review, generated },
|
|
170
177
|
});
|
|
171
|
-
|
|
178
|
+
|
|
172
179
|
return {
|
|
173
180
|
generated,
|
|
174
181
|
review,
|
|
175
182
|
correction,
|
|
176
183
|
reasoning: reasoning.result,
|
|
177
184
|
plan: plan.id,
|
|
178
|
-
needsImprovement: true
|
|
185
|
+
needsImprovement: true,
|
|
179
186
|
};
|
|
180
187
|
}
|
|
181
|
-
|
|
188
|
+
|
|
182
189
|
return {
|
|
183
190
|
generated,
|
|
184
191
|
review,
|
|
185
192
|
reasoning: reasoning.result,
|
|
186
193
|
plan: plan.id,
|
|
187
|
-
needsImprovement: false
|
|
194
|
+
needsImprovement: false,
|
|
188
195
|
};
|
|
189
196
|
},
|
|
190
|
-
|
|
197
|
+
|
|
191
198
|
/**
|
|
192
199
|
* Get agent statistics
|
|
193
200
|
* @returns {Object} Agent statistics
|
|
@@ -198,9 +205,9 @@ function createIntegratedAgent(options = {}) {
|
|
|
198
205
|
reasoning: this.reasoningEngine.getStats(),
|
|
199
206
|
planning: this.planningEngine.getStats(),
|
|
200
207
|
codeGenerator: this.codeGenerator.getStats(),
|
|
201
|
-
codeReviewer: this.codeReviewer.getStats()
|
|
208
|
+
codeReviewer: this.codeReviewer.getStats(),
|
|
202
209
|
};
|
|
203
|
-
}
|
|
210
|
+
},
|
|
204
211
|
};
|
|
205
212
|
}
|
|
206
213
|
|
|
@@ -208,7 +215,7 @@ module.exports = {
|
|
|
208
215
|
...phase4,
|
|
209
216
|
phase4,
|
|
210
217
|
createIntegratedAgent,
|
|
211
|
-
|
|
218
|
+
|
|
212
219
|
// Direct exports for convenience
|
|
213
220
|
RepositoryMap,
|
|
214
221
|
ASTExtractor,
|
|
@@ -218,7 +225,7 @@ module.exports = {
|
|
|
218
225
|
SelfCorrection,
|
|
219
226
|
CodeGenerator,
|
|
220
227
|
CodeReviewer,
|
|
221
|
-
|
|
228
|
+
|
|
222
229
|
// Factory functions
|
|
223
230
|
createRepositoryMap,
|
|
224
231
|
createASTExtractor,
|
|
@@ -228,13 +235,13 @@ module.exports = {
|
|
|
228
235
|
createSelfCorrection,
|
|
229
236
|
createCodeGenerator,
|
|
230
237
|
createCodeReviewer,
|
|
231
|
-
|
|
238
|
+
|
|
232
239
|
// Helper functions
|
|
233
240
|
generateRepositoryMap,
|
|
234
241
|
optimizeContext,
|
|
235
242
|
generateCode,
|
|
236
243
|
reviewCode,
|
|
237
|
-
|
|
244
|
+
|
|
238
245
|
// Enums
|
|
239
246
|
STRATEGY,
|
|
240
247
|
STEP_TYPE,
|
|
@@ -244,5 +251,5 @@ module.exports = {
|
|
|
244
251
|
GEN_MODE,
|
|
245
252
|
LANGUAGE,
|
|
246
253
|
SEVERITY,
|
|
247
|
-
CATEGORY
|
|
254
|
+
CATEGORY,
|
|
248
255
|
};
|