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.
Files changed (232) hide show
  1. package/README.ja.md +106 -48
  2. package/README.md +110 -32
  3. package/bin/musubi-analyze.js +74 -67
  4. package/bin/musubi-browser.js +27 -26
  5. package/bin/musubi-change.js +48 -47
  6. package/bin/musubi-checkpoint.js +10 -7
  7. package/bin/musubi-convert.js +25 -25
  8. package/bin/musubi-costs.js +27 -10
  9. package/bin/musubi-gui.js +52 -46
  10. package/bin/musubi-init.js +1952 -10
  11. package/bin/musubi-orchestrate.js +327 -239
  12. package/bin/musubi-remember.js +69 -56
  13. package/bin/musubi-resolve.js +53 -45
  14. package/bin/musubi-trace.js +51 -22
  15. package/bin/musubi-validate.js +39 -30
  16. package/bin/musubi-workflow.js +33 -34
  17. package/bin/musubi.js +39 -2
  18. package/package.json +1 -1
  19. package/src/agents/agent-loop.js +94 -95
  20. package/src/agents/agentic/code-generator.js +119 -109
  21. package/src/agents/agentic/code-reviewer.js +105 -108
  22. package/src/agents/agentic/index.js +4 -4
  23. package/src/agents/browser/action-executor.js +13 -13
  24. package/src/agents/browser/ai-comparator.js +11 -10
  25. package/src/agents/browser/context-manager.js +6 -6
  26. package/src/agents/browser/index.js +5 -5
  27. package/src/agents/browser/nl-parser.js +31 -46
  28. package/src/agents/browser/screenshot.js +2 -2
  29. package/src/agents/browser/test-generator.js +6 -4
  30. package/src/agents/function-tool.js +71 -65
  31. package/src/agents/index.js +7 -7
  32. package/src/agents/schema-generator.js +98 -94
  33. package/src/analyzers/ast-extractor.js +158 -146
  34. package/src/analyzers/codegraph-auto-update.js +858 -0
  35. package/src/analyzers/complexity-analyzer.js +536 -0
  36. package/src/analyzers/context-optimizer.js +241 -126
  37. package/src/analyzers/impact-analyzer.js +1 -1
  38. package/src/analyzers/large-project-analyzer.js +766 -0
  39. package/src/analyzers/repository-map.js +77 -81
  40. package/src/analyzers/security-analyzer.js +19 -11
  41. package/src/analyzers/stuck-detector.js +19 -17
  42. package/src/converters/index.js +78 -57
  43. package/src/converters/ir/types.js +12 -12
  44. package/src/converters/parsers/musubi-parser.js +134 -126
  45. package/src/converters/parsers/openapi-parser.js +70 -53
  46. package/src/converters/parsers/speckit-parser.js +239 -175
  47. package/src/converters/writers/musubi-writer.js +123 -118
  48. package/src/converters/writers/speckit-writer.js +124 -113
  49. package/src/generators/rust-migration-generator.js +512 -0
  50. package/src/gui/public/index.html +1365 -1211
  51. package/src/gui/server.js +41 -40
  52. package/src/gui/services/file-watcher.js +23 -8
  53. package/src/gui/services/project-scanner.js +26 -20
  54. package/src/gui/services/replanning-service.js +27 -23
  55. package/src/gui/services/traceability-service.js +8 -8
  56. package/src/gui/services/workflow-service.js +14 -7
  57. package/src/index.js +151 -0
  58. package/src/integrations/cicd.js +90 -104
  59. package/src/integrations/codegraph-mcp.js +643 -0
  60. package/src/integrations/documentation.js +142 -103
  61. package/src/integrations/examples.js +95 -80
  62. package/src/integrations/github-client.js +17 -17
  63. package/src/integrations/index.js +5 -5
  64. package/src/integrations/mcp/index.js +21 -21
  65. package/src/integrations/mcp/mcp-context-provider.js +76 -78
  66. package/src/integrations/mcp/mcp-discovery.js +74 -72
  67. package/src/integrations/mcp/mcp-tool-registry.js +99 -94
  68. package/src/integrations/mcp-connector.js +70 -66
  69. package/src/integrations/platforms.js +50 -49
  70. package/src/integrations/tool-discovery.js +37 -31
  71. package/src/llm-providers/anthropic-provider.js +11 -11
  72. package/src/llm-providers/base-provider.js +16 -18
  73. package/src/llm-providers/copilot-provider.js +22 -19
  74. package/src/llm-providers/index.js +26 -25
  75. package/src/llm-providers/ollama-provider.js +11 -11
  76. package/src/llm-providers/openai-provider.js +12 -12
  77. package/src/managers/agent-memory.js +36 -24
  78. package/src/managers/checkpoint-manager.js +4 -8
  79. package/src/managers/delta-spec.js +19 -19
  80. package/src/managers/index.js +13 -4
  81. package/src/managers/memory-condenser.js +35 -45
  82. package/src/managers/repo-skill-manager.js +57 -31
  83. package/src/managers/skill-loader.js +25 -22
  84. package/src/managers/skill-tools.js +36 -72
  85. package/src/managers/workflow.js +30 -22
  86. package/src/monitoring/cost-tracker.js +48 -46
  87. package/src/monitoring/incident-manager.js +116 -106
  88. package/src/monitoring/index.js +144 -134
  89. package/src/monitoring/observability.js +75 -62
  90. package/src/monitoring/quality-dashboard.js +45 -41
  91. package/src/monitoring/release-manager.js +63 -53
  92. package/src/orchestration/agent-skill-binding.js +39 -47
  93. package/src/orchestration/error-handler.js +65 -107
  94. package/src/orchestration/guardrails/base-guardrail.js +26 -24
  95. package/src/orchestration/guardrails/guardrail-rules.js +50 -64
  96. package/src/orchestration/guardrails/index.js +5 -5
  97. package/src/orchestration/guardrails/input-guardrail.js +58 -45
  98. package/src/orchestration/guardrails/output-guardrail.js +104 -81
  99. package/src/orchestration/guardrails/safety-check.js +79 -79
  100. package/src/orchestration/index.js +38 -55
  101. package/src/orchestration/mcp-tool-adapters.js +96 -99
  102. package/src/orchestration/orchestration-engine.js +21 -21
  103. package/src/orchestration/pattern-registry.js +60 -45
  104. package/src/orchestration/patterns/auto.js +34 -47
  105. package/src/orchestration/patterns/group-chat.js +59 -65
  106. package/src/orchestration/patterns/handoff.js +67 -65
  107. package/src/orchestration/patterns/human-in-loop.js +51 -72
  108. package/src/orchestration/patterns/nested.js +25 -40
  109. package/src/orchestration/patterns/sequential.js +35 -34
  110. package/src/orchestration/patterns/swarm.js +63 -56
  111. package/src/orchestration/patterns/triage.js +150 -109
  112. package/src/orchestration/reasoning/index.js +9 -9
  113. package/src/orchestration/reasoning/planning-engine.js +143 -140
  114. package/src/orchestration/reasoning/reasoning-engine.js +206 -144
  115. package/src/orchestration/reasoning/self-correction.js +121 -128
  116. package/src/orchestration/replanning/adaptive-goal-modifier.js +107 -112
  117. package/src/orchestration/replanning/alternative-generator.js +37 -42
  118. package/src/orchestration/replanning/config.js +63 -59
  119. package/src/orchestration/replanning/goal-progress-tracker.js +98 -100
  120. package/src/orchestration/replanning/index.js +24 -20
  121. package/src/orchestration/replanning/plan-evaluator.js +49 -50
  122. package/src/orchestration/replanning/plan-monitor.js +32 -28
  123. package/src/orchestration/replanning/proactive-path-optimizer.js +175 -178
  124. package/src/orchestration/replanning/replan-history.js +33 -26
  125. package/src/orchestration/replanning/replanning-engine.js +106 -108
  126. package/src/orchestration/skill-executor.js +107 -109
  127. package/src/orchestration/skill-registry.js +85 -89
  128. package/src/orchestration/workflow-examples.js +228 -231
  129. package/src/orchestration/workflow-executor.js +65 -68
  130. package/src/orchestration/workflow-orchestrator.js +72 -73
  131. package/src/phase4-integration.js +47 -40
  132. package/src/phase5-integration.js +89 -30
  133. package/src/reporters/coverage-report.js +82 -30
  134. package/src/reporters/hierarchical-reporter.js +498 -0
  135. package/src/reporters/traceability-matrix-report.js +29 -20
  136. package/src/resolvers/issue-resolver.js +43 -31
  137. package/src/steering/advanced-validation.js +133 -124
  138. package/src/steering/auto-updater.js +60 -73
  139. package/src/steering/index.js +6 -6
  140. package/src/steering/quality-metrics.js +41 -35
  141. package/src/steering/steering-auto-update.js +83 -86
  142. package/src/steering/steering-validator.js +98 -106
  143. package/src/steering/template-constraints.js +53 -54
  144. package/src/templates/agents/claude-code/CLAUDE.md +32 -32
  145. package/src/templates/agents/claude-code/skills/agent-assistant/SKILL.md +13 -5
  146. package/src/templates/agents/claude-code/skills/ai-ml-engineer/mlops-guide.md +23 -23
  147. package/src/templates/agents/claude-code/skills/ai-ml-engineer/model-card-template.md +60 -41
  148. package/src/templates/agents/claude-code/skills/api-designer/api-patterns.md +27 -19
  149. package/src/templates/agents/claude-code/skills/api-designer/openapi-template.md +11 -7
  150. package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +4 -3
  151. package/src/templates/agents/claude-code/skills/bug-hunter/root-cause-analysis.md +37 -15
  152. package/src/templates/agents/claude-code/skills/change-impact-analyzer/dependency-graph-patterns.md +36 -42
  153. package/src/templates/agents/claude-code/skills/change-impact-analyzer/impact-analysis-template.md +69 -60
  154. package/src/templates/agents/claude-code/skills/cloud-architect/aws-patterns.md +31 -38
  155. package/src/templates/agents/claude-code/skills/cloud-architect/azure-patterns.md +28 -23
  156. package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +61 -0
  157. package/src/templates/agents/claude-code/skills/code-reviewer/best-practices.md +27 -0
  158. package/src/templates/agents/claude-code/skills/code-reviewer/review-checklist.md +29 -10
  159. package/src/templates/agents/claude-code/skills/code-reviewer/review-standards.md +29 -24
  160. package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +8 -6
  161. package/src/templates/agents/claude-code/skills/constitution-enforcer/constitutional-articles.md +62 -26
  162. package/src/templates/agents/claude-code/skills/constitution-enforcer/phase-minus-one-gates.md +35 -16
  163. package/src/templates/agents/claude-code/skills/database-administrator/backup-recovery.md +27 -17
  164. package/src/templates/agents/claude-code/skills/database-administrator/tuning-guide.md +25 -20
  165. package/src/templates/agents/claude-code/skills/database-schema-designer/schema-patterns.md +39 -22
  166. package/src/templates/agents/claude-code/skills/devops-engineer/ci-cd-templates.md +25 -22
  167. package/src/templates/agents/claude-code/skills/issue-resolver/SKILL.md +24 -21
  168. package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +148 -63
  169. package/src/templates/agents/claude-code/skills/orchestrator/patterns.md +35 -16
  170. package/src/templates/agents/claude-code/skills/orchestrator/selection-matrix.md +69 -64
  171. package/src/templates/agents/claude-code/skills/performance-engineer/optimization-playbook.md +47 -47
  172. package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +69 -0
  173. package/src/templates/agents/claude-code/skills/performance-optimizer/benchmark-template.md +63 -45
  174. package/src/templates/agents/claude-code/skills/performance-optimizer/optimization-patterns.md +33 -35
  175. package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +7 -6
  176. package/src/templates/agents/claude-code/skills/project-manager/agile-ceremonies.md +47 -28
  177. package/src/templates/agents/claude-code/skills/project-manager/project-templates.md +94 -78
  178. package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +20 -17
  179. package/src/templates/agents/claude-code/skills/quality-assurance/qa-plan-template.md +63 -49
  180. package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +5 -5
  181. package/src/templates/agents/claude-code/skills/release-coordinator/feature-flag-guide.md +30 -26
  182. package/src/templates/agents/claude-code/skills/release-coordinator/release-plan-template.md +67 -35
  183. package/src/templates/agents/claude-code/skills/requirements-analyst/ears-format.md +54 -42
  184. package/src/templates/agents/claude-code/skills/requirements-analyst/validation-rules.md +36 -33
  185. package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +77 -19
  186. package/src/templates/agents/claude-code/skills/security-auditor/audit-checklists.md +24 -24
  187. package/src/templates/agents/claude-code/skills/security-auditor/owasp-top-10.md +61 -20
  188. package/src/templates/agents/claude-code/skills/security-auditor/vulnerability-patterns.md +43 -11
  189. package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +1 -0
  190. package/src/templates/agents/claude-code/skills/site-reliability-engineer/incident-response-template.md +55 -25
  191. package/src/templates/agents/claude-code/skills/site-reliability-engineer/observability-patterns.md +78 -68
  192. package/src/templates/agents/claude-code/skills/site-reliability-engineer/slo-sli-guide.md +73 -53
  193. package/src/templates/agents/claude-code/skills/software-developer/solid-principles.md +83 -37
  194. package/src/templates/agents/claude-code/skills/software-developer/test-first-workflow.md +38 -31
  195. package/src/templates/agents/claude-code/skills/steering/SKILL.md +1 -0
  196. package/src/templates/agents/claude-code/skills/steering/auto-update-rules.md +31 -0
  197. package/src/templates/agents/claude-code/skills/system-architect/adr-template.md +25 -7
  198. package/src/templates/agents/claude-code/skills/system-architect/c4-model-guide.md +74 -61
  199. package/src/templates/agents/claude-code/skills/technical-writer/doc-templates/documentation-templates.md +70 -52
  200. package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +2 -0
  201. package/src/templates/agents/claude-code/skills/test-engineer/ears-test-mapping.md +75 -71
  202. package/src/templates/agents/claude-code/skills/test-engineer/test-types.md +85 -63
  203. package/src/templates/agents/claude-code/skills/traceability-auditor/coverage-matrix-template.md +39 -36
  204. package/src/templates/agents/claude-code/skills/traceability-auditor/gap-detection-rules.md +22 -17
  205. package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +1 -0
  206. package/src/templates/agents/claude-code/skills/ui-ux-designer/accessibility-guidelines.md +49 -75
  207. package/src/templates/agents/claude-code/skills/ui-ux-designer/design-system-components.md +71 -59
  208. package/src/templates/agents/codex/AGENTS.md +74 -42
  209. package/src/templates/agents/cursor/AGENTS.md +74 -42
  210. package/src/templates/agents/gemini-cli/GEMINI.md +74 -42
  211. package/src/templates/agents/github-copilot/AGENTS.md +83 -51
  212. package/src/templates/agents/qwen-code/QWEN.md +74 -42
  213. package/src/templates/agents/windsurf/AGENTS.md +74 -42
  214. package/src/templates/architectures/README.md +41 -0
  215. package/src/templates/architectures/clean-architecture/README.md +113 -0
  216. package/src/templates/architectures/event-driven/README.md +162 -0
  217. package/src/templates/architectures/hexagonal/README.md +130 -0
  218. package/src/templates/index.js +6 -1
  219. package/src/templates/locale-manager.js +16 -16
  220. package/src/templates/shared/delta-spec-template.md +20 -13
  221. package/src/templates/shared/github-actions/musubi-issue-resolver.yml +5 -5
  222. package/src/templates/shared/github-actions/musubi-security-check.yml +3 -3
  223. package/src/templates/shared/github-actions/musubi-validate.yml +4 -4
  224. package/src/templates/shared/steering/structure.md +95 -0
  225. package/src/templates/skills/browser-agent.md +21 -16
  226. package/src/templates/skills/web-gui.md +8 -0
  227. package/src/templates/template-constraints.js +50 -53
  228. package/src/validators/advanced-validation.js +30 -36
  229. package/src/validators/constitutional-validator.js +77 -73
  230. package/src/validators/critic-system.js +49 -59
  231. package/src/validators/delta-format.js +59 -55
  232. package/src/validators/traceability-validator.js +7 -11
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * 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 path = require('path');
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(new ValidationIssue({
134
- type: ValidationType.CONSISTENCY,
135
- severity: Severity.ERROR,
136
- message: `Rule check failed: ${error.message}`,
137
- metadata: { rule: rule.name, error: error.message }
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: (artifacts) => {
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(new ValidationIssue({
162
- type: ValidationType.CONSISTENCY,
163
- severity: Severity.WARNING,
164
- message: `Similar names detected: "${artifact.name}" and "${existing.name}"`,
165
- artifact: artifact.id,
166
- relatedArtifacts: [existing.id]
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: (artifacts) => {
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(new ValidationIssue({
199
- type: ValidationType.CONSISTENCY,
200
- severity: Severity.WARNING,
201
- message: `Multiple versions found for ${type}: ${[...uniqueVersions].join(', ')}`,
202
- metadata: { type, versions: [...uniqueVersions] }
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(new ValidationIssue({
250
- type: ValidationType.GAP,
251
- severity: Severity.WARNING,
252
- message: `${artifact.type} "${artifact.name}" has no linked ${requiredType}`,
253
- artifact: artifact.id,
254
- suggestion: `Create or link a ${requiredType} for this ${artifact.type}`
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(new ValidationIssue({
320
- type: ValidationType.COMPLETENESS,
321
- severity: Severity.ERROR,
322
- message: `Missing required field "${field}" in ${artifact.type} "${artifact.name}"`,
323
- artifact: artifact.id,
324
- location: field
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(new ValidationIssue({
337
- type: ValidationType.COMPLETENESS,
338
- severity: Severity.WARNING,
339
- message: `Missing section "${section}" in ${artifact.type} "${artifact.name}"`,
340
- artifact: artifact.id,
341
- suggestion: `Add a "## ${section}" section`
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(new ValidationIssue({
452
- type: ValidationType.DEPENDENCY,
453
- severity: Severity.ERROR,
454
- message: `Dependency source "${from}" not found in artifacts`,
455
- artifact: from
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(new ValidationIssue({
462
- type: ValidationType.DEPENDENCY,
463
- severity: Severity.ERROR,
464
- message: `Dependency target "${to}" not found (required by "${from}")`,
465
- artifact: from,
466
- relatedArtifacts: [to]
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(new ValidationIssue({
477
- type: ValidationType.DEPENDENCY,
478
- severity: Severity.ERROR,
479
- message: `Circular dependency detected: ${cycle.join(' → ')}`,
480
- metadata: { cycle }
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 = (node) => {
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(new ValidationIssue({
564
- type: ValidationType.REFERENCE,
565
- severity: Severity.WARNING,
566
- message: `Reference "${ref.id}" not found`,
567
- artifact: artifact.id,
568
- metadata: { referenceType: ref.type, referenceId: ref.id }
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(i =>
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 = issue.severity === 'critical' ? '🔴' :
751
- issue.severity === 'error' ? '🟠' : '🟡';
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
- ConsistencyChecker.createNamingConsistencyRule()
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', 'description'
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
  };