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
|
* Advanced Validation Module
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Provides:
|
|
5
5
|
* - Cross-artifact consistency validation
|
|
6
6
|
* - Gap detection between requirements and implementation
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
const EventEmitter = require('events');
|
|
12
|
-
const
|
|
12
|
+
const _path = require('path');
|
|
13
13
|
|
|
14
14
|
// Validation Types
|
|
15
15
|
const ValidationType = {
|
|
@@ -18,7 +18,7 @@ const ValidationType = {
|
|
|
18
18
|
GAP: 'gap',
|
|
19
19
|
DEPENDENCY: 'dependency',
|
|
20
20
|
REFERENCE: 'reference',
|
|
21
|
-
CUSTOM: 'custom'
|
|
21
|
+
CUSTOM: 'custom',
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
// Severity Levels
|
|
@@ -26,7 +26,7 @@ const Severity = {
|
|
|
26
26
|
CRITICAL: 'critical',
|
|
27
27
|
ERROR: 'error',
|
|
28
28
|
WARNING: 'warning',
|
|
29
|
-
INFO: 'info'
|
|
29
|
+
INFO: 'info',
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
// Artifact Types
|
|
@@ -36,7 +36,7 @@ const ArtifactType = {
|
|
|
36
36
|
IMPLEMENTATION: 'implementation',
|
|
37
37
|
TEST: 'test',
|
|
38
38
|
DOCUMENTATION: 'documentation',
|
|
39
|
-
STEERING: 'steering'
|
|
39
|
+
STEERING: 'steering',
|
|
40
40
|
};
|
|
41
41
|
|
|
42
42
|
/**
|
|
@@ -66,7 +66,7 @@ class ValidationIssue {
|
|
|
66
66
|
location: this.location,
|
|
67
67
|
suggestion: this.suggestion,
|
|
68
68
|
relatedArtifacts: this.relatedArtifacts,
|
|
69
|
-
timestamp: this.timestamp.toISOString()
|
|
69
|
+
timestamp: this.timestamp.toISOString(),
|
|
70
70
|
};
|
|
71
71
|
}
|
|
72
72
|
}
|
|
@@ -102,8 +102,8 @@ class ArtifactReference {
|
|
|
102
102
|
name: this.name,
|
|
103
103
|
path: this.path,
|
|
104
104
|
version: this.version,
|
|
105
|
-
dependencies: this.dependencies.map(d => typeof d === 'string' ? d : d.id),
|
|
106
|
-
references: this.references.map(r => typeof r === 'string' ? r : r.id)
|
|
105
|
+
dependencies: this.dependencies.map(d => (typeof d === 'string' ? d : d.id)),
|
|
106
|
+
references: this.references.map(r => (typeof r === 'string' ? r : r.id)),
|
|
107
107
|
};
|
|
108
108
|
}
|
|
109
109
|
}
|
|
@@ -130,19 +130,21 @@ class ConsistencyChecker {
|
|
|
130
130
|
const ruleIssues = rule.check(artifacts);
|
|
131
131
|
issues.push(...ruleIssues);
|
|
132
132
|
} catch (error) {
|
|
133
|
-
issues.push(
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
133
|
+
issues.push(
|
|
134
|
+
new ValidationIssue({
|
|
135
|
+
type: ValidationType.CONSISTENCY,
|
|
136
|
+
severity: Severity.ERROR,
|
|
137
|
+
message: `Rule check failed: ${error.message}`,
|
|
138
|
+
metadata: { rule: rule.name, error: error.message },
|
|
139
|
+
})
|
|
140
|
+
);
|
|
139
141
|
}
|
|
140
142
|
}
|
|
141
143
|
|
|
142
144
|
return {
|
|
143
145
|
valid: !issues.some(i => i.severity === Severity.CRITICAL || i.severity === Severity.ERROR),
|
|
144
146
|
issues,
|
|
145
|
-
rulesChecked: this.rules.length
|
|
147
|
+
rulesChecked: this.rules.length,
|
|
146
148
|
};
|
|
147
149
|
}
|
|
148
150
|
|
|
@@ -150,7 +152,7 @@ class ConsistencyChecker {
|
|
|
150
152
|
static createNamingConsistencyRule() {
|
|
151
153
|
return {
|
|
152
154
|
name: 'naming-consistency',
|
|
153
|
-
check:
|
|
155
|
+
check: artifacts => {
|
|
154
156
|
const issues = [];
|
|
155
157
|
const names = new Map();
|
|
156
158
|
|
|
@@ -158,13 +160,15 @@ class ConsistencyChecker {
|
|
|
158
160
|
const normalized = artifact.name?.toLowerCase().replace(/[-_\s]/g, '');
|
|
159
161
|
if (normalized && names.has(normalized)) {
|
|
160
162
|
const existing = names.get(normalized);
|
|
161
|
-
issues.push(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
163
|
+
issues.push(
|
|
164
|
+
new ValidationIssue({
|
|
165
|
+
type: ValidationType.CONSISTENCY,
|
|
166
|
+
severity: Severity.WARNING,
|
|
167
|
+
message: `Similar names detected: "${artifact.name}" and "${existing.name}"`,
|
|
168
|
+
artifact: artifact.id,
|
|
169
|
+
relatedArtifacts: [existing.id],
|
|
170
|
+
})
|
|
171
|
+
);
|
|
168
172
|
}
|
|
169
173
|
if (normalized) {
|
|
170
174
|
names.set(normalized, artifact);
|
|
@@ -172,14 +176,14 @@ class ConsistencyChecker {
|
|
|
172
176
|
}
|
|
173
177
|
|
|
174
178
|
return issues;
|
|
175
|
-
}
|
|
179
|
+
},
|
|
176
180
|
};
|
|
177
181
|
}
|
|
178
182
|
|
|
179
183
|
static createVersionConsistencyRule() {
|
|
180
184
|
return {
|
|
181
185
|
name: 'version-consistency',
|
|
182
|
-
check:
|
|
186
|
+
check: artifacts => {
|
|
183
187
|
const issues = [];
|
|
184
188
|
const versions = new Map();
|
|
185
189
|
|
|
@@ -195,17 +199,19 @@ class ConsistencyChecker {
|
|
|
195
199
|
for (const [type, typeArtifacts] of versions) {
|
|
196
200
|
const uniqueVersions = new Set(typeArtifacts.map(a => a.version));
|
|
197
201
|
if (uniqueVersions.size > 1) {
|
|
198
|
-
issues.push(
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
202
|
+
issues.push(
|
|
203
|
+
new ValidationIssue({
|
|
204
|
+
type: ValidationType.CONSISTENCY,
|
|
205
|
+
severity: Severity.WARNING,
|
|
206
|
+
message: `Multiple versions found for ${type}: ${[...uniqueVersions].join(', ')}`,
|
|
207
|
+
metadata: { type, versions: [...uniqueVersions] },
|
|
208
|
+
})
|
|
209
|
+
);
|
|
204
210
|
}
|
|
205
211
|
}
|
|
206
212
|
|
|
207
213
|
return issues;
|
|
208
|
-
}
|
|
214
|
+
},
|
|
209
215
|
};
|
|
210
216
|
}
|
|
211
217
|
}
|
|
@@ -219,7 +225,7 @@ class GapDetector {
|
|
|
219
225
|
this.requiredLinks = options.requiredLinks || {
|
|
220
226
|
[ArtifactType.REQUIREMENT]: [ArtifactType.DESIGN, ArtifactType.TEST],
|
|
221
227
|
[ArtifactType.DESIGN]: [ArtifactType.IMPLEMENTATION],
|
|
222
|
-
[ArtifactType.IMPLEMENTATION]: [ArtifactType.TEST]
|
|
228
|
+
[ArtifactType.IMPLEMENTATION]: [ArtifactType.TEST],
|
|
223
229
|
};
|
|
224
230
|
}
|
|
225
231
|
|
|
@@ -246,20 +252,22 @@ class GapDetector {
|
|
|
246
252
|
});
|
|
247
253
|
|
|
248
254
|
if (!hasLink) {
|
|
249
|
-
issues.push(
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
255
|
+
issues.push(
|
|
256
|
+
new ValidationIssue({
|
|
257
|
+
type: ValidationType.GAP,
|
|
258
|
+
severity: Severity.WARNING,
|
|
259
|
+
message: `${artifact.type} "${artifact.name}" has no linked ${requiredType}`,
|
|
260
|
+
artifact: artifact.id,
|
|
261
|
+
suggestion: `Create or link a ${requiredType} for this ${artifact.type}`,
|
|
262
|
+
})
|
|
263
|
+
);
|
|
256
264
|
}
|
|
257
265
|
}
|
|
258
266
|
}
|
|
259
267
|
|
|
260
268
|
return {
|
|
261
269
|
gaps: issues,
|
|
262
|
-
coverage: this.calculateCoverage(artifacts, issues)
|
|
270
|
+
coverage: this.calculateCoverage(artifacts, issues),
|
|
263
271
|
};
|
|
264
272
|
}
|
|
265
273
|
|
|
@@ -269,19 +277,19 @@ class GapDetector {
|
|
|
269
277
|
}, 0);
|
|
270
278
|
|
|
271
279
|
if (totalRequired === 0) return 100;
|
|
272
|
-
|
|
280
|
+
|
|
273
281
|
const gapCount = gaps.length;
|
|
274
282
|
return ((totalRequired - gapCount) / totalRequired) * 100;
|
|
275
283
|
}
|
|
276
284
|
|
|
277
285
|
getTraceabilityReport() {
|
|
278
286
|
const report = [];
|
|
279
|
-
|
|
287
|
+
|
|
280
288
|
for (const [source, targets] of this.traceabilityMatrix) {
|
|
281
289
|
report.push({
|
|
282
290
|
source,
|
|
283
291
|
targets: [...targets],
|
|
284
|
-
count: targets.size
|
|
292
|
+
count: targets.size,
|
|
285
293
|
});
|
|
286
294
|
}
|
|
287
295
|
|
|
@@ -316,43 +324,47 @@ class CompletenessChecker {
|
|
|
316
324
|
for (const field of requiredFields) {
|
|
317
325
|
const value = artifact[field] || artifact.metadata?.[field];
|
|
318
326
|
if (value === undefined || value === null || value === '') {
|
|
319
|
-
issues.push(
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
327
|
+
issues.push(
|
|
328
|
+
new ValidationIssue({
|
|
329
|
+
type: ValidationType.COMPLETENESS,
|
|
330
|
+
severity: Severity.ERROR,
|
|
331
|
+
message: `Missing required field "${field}" in ${artifact.type} "${artifact.name}"`,
|
|
332
|
+
artifact: artifact.id,
|
|
333
|
+
location: field,
|
|
334
|
+
})
|
|
335
|
+
);
|
|
326
336
|
}
|
|
327
337
|
}
|
|
328
338
|
|
|
329
339
|
// Check required sections (for document-like artifacts)
|
|
330
340
|
const requiredSections = this.requiredSections[artifact.type] || [];
|
|
331
341
|
const content = artifact.content || '';
|
|
332
|
-
|
|
342
|
+
|
|
333
343
|
for (const section of requiredSections) {
|
|
334
344
|
const sectionPattern = new RegExp(`^##?\\s+${section}`, 'im');
|
|
335
345
|
if (!sectionPattern.test(content)) {
|
|
336
|
-
issues.push(
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
346
|
+
issues.push(
|
|
347
|
+
new ValidationIssue({
|
|
348
|
+
type: ValidationType.COMPLETENESS,
|
|
349
|
+
severity: Severity.WARNING,
|
|
350
|
+
message: `Missing section "${section}" in ${artifact.type} "${artifact.name}"`,
|
|
351
|
+
artifact: artifact.id,
|
|
352
|
+
suggestion: `Add a "## ${section}" section`,
|
|
353
|
+
})
|
|
354
|
+
);
|
|
343
355
|
}
|
|
344
356
|
}
|
|
345
357
|
|
|
346
358
|
return {
|
|
347
359
|
complete: issues.filter(i => i.severity === Severity.ERROR).length === 0,
|
|
348
360
|
issues,
|
|
349
|
-
artifact: artifact.id
|
|
361
|
+
artifact: artifact.id,
|
|
350
362
|
};
|
|
351
363
|
}
|
|
352
364
|
|
|
353
365
|
checkAll(artifacts) {
|
|
354
366
|
const results = [];
|
|
355
|
-
|
|
367
|
+
|
|
356
368
|
for (const artifact of artifacts) {
|
|
357
369
|
results.push(this.checkArtifact(artifact));
|
|
358
370
|
}
|
|
@@ -364,7 +376,7 @@ class CompletenessChecker {
|
|
|
364
376
|
valid: allIssues.filter(i => i.severity === Severity.ERROR).length === 0,
|
|
365
377
|
completeness: (completeCount / artifacts.length) * 100,
|
|
366
378
|
results,
|
|
367
|
-
issues: allIssues
|
|
379
|
+
issues: allIssues,
|
|
368
380
|
};
|
|
369
381
|
}
|
|
370
382
|
}
|
|
@@ -448,23 +460,27 @@ class DependencyValidator {
|
|
|
448
460
|
// Check for missing dependencies
|
|
449
461
|
for (const [from, tos] of this.dependencies) {
|
|
450
462
|
if (!artifactIds.has(from)) {
|
|
451
|
-
issues.push(
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
463
|
+
issues.push(
|
|
464
|
+
new ValidationIssue({
|
|
465
|
+
type: ValidationType.DEPENDENCY,
|
|
466
|
+
severity: Severity.ERROR,
|
|
467
|
+
message: `Dependency source "${from}" not found in artifacts`,
|
|
468
|
+
artifact: from,
|
|
469
|
+
})
|
|
470
|
+
);
|
|
457
471
|
}
|
|
458
472
|
|
|
459
473
|
for (const to of tos) {
|
|
460
474
|
if (!artifactIds.has(to)) {
|
|
461
|
-
issues.push(
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
475
|
+
issues.push(
|
|
476
|
+
new ValidationIssue({
|
|
477
|
+
type: ValidationType.DEPENDENCY,
|
|
478
|
+
severity: Severity.ERROR,
|
|
479
|
+
message: `Dependency target "${to}" not found (required by "${from}")`,
|
|
480
|
+
artifact: from,
|
|
481
|
+
relatedArtifacts: [to],
|
|
482
|
+
})
|
|
483
|
+
);
|
|
468
484
|
}
|
|
469
485
|
}
|
|
470
486
|
}
|
|
@@ -473,19 +489,21 @@ class DependencyValidator {
|
|
|
473
489
|
if (!this.allowCycles) {
|
|
474
490
|
const cycles = this.detectCycles();
|
|
475
491
|
for (const cycle of cycles) {
|
|
476
|
-
issues.push(
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
492
|
+
issues.push(
|
|
493
|
+
new ValidationIssue({
|
|
494
|
+
type: ValidationType.DEPENDENCY,
|
|
495
|
+
severity: Severity.ERROR,
|
|
496
|
+
message: `Circular dependency detected: ${cycle.join(' → ')}`,
|
|
497
|
+
metadata: { cycle },
|
|
498
|
+
})
|
|
499
|
+
);
|
|
482
500
|
}
|
|
483
501
|
}
|
|
484
502
|
|
|
485
503
|
return {
|
|
486
504
|
valid: issues.length === 0,
|
|
487
505
|
issues,
|
|
488
|
-
cycles: this.detectCycles()
|
|
506
|
+
cycles: this.detectCycles(),
|
|
489
507
|
};
|
|
490
508
|
}
|
|
491
509
|
|
|
@@ -494,13 +512,13 @@ class DependencyValidator {
|
|
|
494
512
|
const visited = new Set();
|
|
495
513
|
const temp = new Set();
|
|
496
514
|
|
|
497
|
-
const visit =
|
|
515
|
+
const visit = node => {
|
|
498
516
|
if (temp.has(node)) return false; // cycle
|
|
499
517
|
if (visited.has(node)) return true;
|
|
500
518
|
|
|
501
519
|
temp.add(node);
|
|
502
520
|
const deps = this.dependencies.get(node) || new Set();
|
|
503
|
-
|
|
521
|
+
|
|
504
522
|
for (const dep of deps) {
|
|
505
523
|
if (!visit(dep)) return false;
|
|
506
524
|
}
|
|
@@ -529,7 +547,7 @@ class ReferenceValidator {
|
|
|
529
547
|
requirement: /REQ-\d+/g,
|
|
530
548
|
design: /DES-\d+/g,
|
|
531
549
|
test: /TEST-\d+/g,
|
|
532
|
-
issue: /#\d+/g
|
|
550
|
+
issue: /#\d+/g,
|
|
533
551
|
};
|
|
534
552
|
}
|
|
535
553
|
|
|
@@ -560,13 +578,15 @@ class ReferenceValidator {
|
|
|
560
578
|
|
|
561
579
|
for (const ref of refs) {
|
|
562
580
|
if (!this.references.has(ref.id)) {
|
|
563
|
-
issues.push(
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
581
|
+
issues.push(
|
|
582
|
+
new ValidationIssue({
|
|
583
|
+
type: ValidationType.REFERENCE,
|
|
584
|
+
severity: Severity.WARNING,
|
|
585
|
+
message: `Reference "${ref.id}" not found`,
|
|
586
|
+
artifact: artifact.id,
|
|
587
|
+
metadata: { referenceType: ref.type, referenceId: ref.id },
|
|
588
|
+
})
|
|
589
|
+
);
|
|
570
590
|
}
|
|
571
591
|
}
|
|
572
592
|
}
|
|
@@ -574,7 +594,7 @@ class ReferenceValidator {
|
|
|
574
594
|
return {
|
|
575
595
|
valid: issues.length === 0,
|
|
576
596
|
issues,
|
|
577
|
-
totalReferences: this.references.size
|
|
597
|
+
totalReferences: this.references.size,
|
|
578
598
|
};
|
|
579
599
|
}
|
|
580
600
|
}
|
|
@@ -597,11 +617,7 @@ class AdvancedValidator extends EventEmitter {
|
|
|
597
617
|
// Artifact Management
|
|
598
618
|
registerArtifact(artifact) {
|
|
599
619
|
if (!(artifact instanceof ArtifactReference)) {
|
|
600
|
-
artifact = new ArtifactReference(
|
|
601
|
-
artifact.type,
|
|
602
|
-
artifact.id,
|
|
603
|
-
artifact
|
|
604
|
-
);
|
|
620
|
+
artifact = new ArtifactReference(artifact.type, artifact.id, artifact);
|
|
605
621
|
}
|
|
606
622
|
this.artifacts.set(artifact.id, artifact);
|
|
607
623
|
this.referenceValidator.registerReference(artifact.id, artifact);
|
|
@@ -666,7 +682,7 @@ class AdvancedValidator extends EventEmitter {
|
|
|
666
682
|
gaps: this.validateGaps(),
|
|
667
683
|
completeness: this.validateCompleteness(),
|
|
668
684
|
dependencies: this.validateDependencies(),
|
|
669
|
-
references: this.validateReferences()
|
|
685
|
+
references: this.validateReferences(),
|
|
670
686
|
};
|
|
671
687
|
|
|
672
688
|
const allIssues = [
|
|
@@ -674,11 +690,11 @@ class AdvancedValidator extends EventEmitter {
|
|
|
674
690
|
...results.gaps.gaps,
|
|
675
691
|
...results.completeness.issues,
|
|
676
692
|
...results.dependencies.issues,
|
|
677
|
-
...results.references.issues
|
|
693
|
+
...results.references.issues,
|
|
678
694
|
];
|
|
679
695
|
|
|
680
|
-
const valid = !allIssues.some(
|
|
681
|
-
i.severity === Severity.CRITICAL || i.severity === Severity.ERROR
|
|
696
|
+
const valid = !allIssues.some(
|
|
697
|
+
i => i.severity === Severity.CRITICAL || i.severity === Severity.ERROR
|
|
682
698
|
);
|
|
683
699
|
|
|
684
700
|
this.emit('validation:complete', { results, valid, issues: allIssues });
|
|
@@ -694,8 +710,8 @@ class AdvancedValidator extends EventEmitter {
|
|
|
694
710
|
errorIssues: allIssues.filter(i => i.severity === Severity.ERROR).length,
|
|
695
711
|
warningIssues: allIssues.filter(i => i.severity === Severity.WARNING).length,
|
|
696
712
|
gapCoverage: results.gaps.coverage,
|
|
697
|
-
completeness: results.completeness.completeness
|
|
698
|
-
}
|
|
713
|
+
completeness: results.completeness.completeness,
|
|
714
|
+
},
|
|
699
715
|
};
|
|
700
716
|
}
|
|
701
717
|
|
|
@@ -703,7 +719,7 @@ class AdvancedValidator extends EventEmitter {
|
|
|
703
719
|
this.validationHistory.push({
|
|
704
720
|
type,
|
|
705
721
|
result,
|
|
706
|
-
timestamp: new Date()
|
|
722
|
+
timestamp: new Date(),
|
|
707
723
|
});
|
|
708
724
|
|
|
709
725
|
// Keep last 100 validations
|
|
@@ -740,15 +756,15 @@ class AdvancedValidator extends EventEmitter {
|
|
|
740
756
|
`- Critical: ${validation.summary.criticalIssues}`,
|
|
741
757
|
`- Error: ${validation.summary.errorIssues}`,
|
|
742
758
|
`- Warning: ${validation.summary.warningIssues}`,
|
|
743
|
-
''
|
|
759
|
+
'',
|
|
744
760
|
];
|
|
745
761
|
|
|
746
762
|
if (validation.issues.length > 0) {
|
|
747
763
|
lines.push('## Issues', '');
|
|
748
764
|
|
|
749
765
|
for (const issue of validation.issues) {
|
|
750
|
-
const icon =
|
|
751
|
-
|
|
766
|
+
const icon =
|
|
767
|
+
issue.severity === 'critical' ? '🔴' : issue.severity === 'error' ? '🟠' : '🟡';
|
|
752
768
|
lines.push(`### ${icon} ${issue.message}`);
|
|
753
769
|
lines.push('');
|
|
754
770
|
lines.push(`- Type: ${issue.type}`);
|
|
@@ -770,23 +786,16 @@ function createAdvancedValidator(options = {}) {
|
|
|
770
786
|
const validator = new AdvancedValidator(options);
|
|
771
787
|
|
|
772
788
|
// Add default consistency rules
|
|
773
|
-
validator.consistencyChecker.addRule(
|
|
774
|
-
|
|
775
|
-
);
|
|
776
|
-
validator.consistencyChecker.addRule(
|
|
777
|
-
ConsistencyChecker.createVersionConsistencyRule()
|
|
778
|
-
);
|
|
789
|
+
validator.consistencyChecker.addRule(ConsistencyChecker.createNamingConsistencyRule());
|
|
790
|
+
validator.consistencyChecker.addRule(ConsistencyChecker.createVersionConsistencyRule());
|
|
779
791
|
|
|
780
792
|
// Set default completeness requirements
|
|
781
793
|
validator.completenessChecker.setRequiredFields(ArtifactType.REQUIREMENT, [
|
|
782
|
-
'name',
|
|
783
|
-
|
|
784
|
-
validator.completenessChecker.setRequiredFields(ArtifactType.DESIGN, [
|
|
785
|
-
'name', 'description'
|
|
786
|
-
]);
|
|
787
|
-
validator.completenessChecker.setRequiredSections(ArtifactType.STEERING, [
|
|
788
|
-
'Overview', 'Purpose'
|
|
794
|
+
'name',
|
|
795
|
+
'description',
|
|
789
796
|
]);
|
|
797
|
+
validator.completenessChecker.setRequiredFields(ArtifactType.DESIGN, ['name', 'description']);
|
|
798
|
+
validator.completenessChecker.setRequiredSections(ArtifactType.STEERING, ['Overview', 'Purpose']);
|
|
790
799
|
|
|
791
800
|
return validator;
|
|
792
801
|
}
|
|
@@ -796,7 +805,7 @@ module.exports = {
|
|
|
796
805
|
ValidationType,
|
|
797
806
|
Severity,
|
|
798
807
|
ArtifactType,
|
|
799
|
-
|
|
808
|
+
|
|
800
809
|
// Classes
|
|
801
810
|
ValidationIssue,
|
|
802
811
|
ArtifactReference,
|
|
@@ -806,7 +815,7 @@ module.exports = {
|
|
|
806
815
|
DependencyValidator,
|
|
807
816
|
ReferenceValidator,
|
|
808
817
|
AdvancedValidator,
|
|
809
|
-
|
|
818
|
+
|
|
810
819
|
// Factory
|
|
811
|
-
createAdvancedValidator
|
|
820
|
+
createAdvancedValidator,
|
|
812
821
|
};
|