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
package/bin/musubi-gui.js CHANGED
@@ -26,36 +26,35 @@ program
26
26
  .option('-p, --port <port>', 'Server port', '3000')
27
27
  .option('-d, --dir <directory>', 'Project directory', process.cwd())
28
28
  .option('--no-open', 'Do not open browser automatically')
29
- .action(async (options) => {
29
+ .action(async options => {
30
30
  try {
31
31
  const Server = require('../src/gui/server');
32
32
  const projectPath = path.resolve(options.dir);
33
-
33
+
34
34
  console.log(chalk.blue('šŸ”® MUSUBI Web GUI'));
35
35
  console.log(chalk.gray(`Project: ${projectPath}`));
36
-
36
+
37
37
  const server = new Server(projectPath, {
38
38
  port: parseInt(options.port, 10),
39
39
  });
40
-
40
+
41
41
  await server.start();
42
-
42
+
43
43
  console.log(chalk.green(`\nāœ“ Server running at http://localhost:${options.port}`));
44
44
  console.log(chalk.gray('Press Ctrl+C to stop\n'));
45
-
45
+
46
46
  // Open browser if requested
47
47
  if (options.open !== false) {
48
48
  const open = await import('open');
49
49
  await open.default(`http://localhost:${options.port}`);
50
50
  }
51
-
51
+
52
52
  // Handle shutdown
53
53
  process.on('SIGINT', async () => {
54
54
  console.log(chalk.yellow('\n\nShutting down...'));
55
55
  await server.stop();
56
56
  process.exit(0);
57
57
  });
58
-
59
58
  } catch (error) {
60
59
  console.error(chalk.red(`Error: ${error.message}`));
61
60
  process.exit(1);
@@ -69,25 +68,25 @@ program
69
68
  .command('build')
70
69
  .description('Build the frontend for production')
71
70
  .option('-o, --outdir <directory>', 'Output directory', 'dist')
72
- .action(async (options) => {
71
+ .action(async options => {
73
72
  try {
74
73
  const { execSync } = require('child_process');
75
74
  const guiDir = path.join(__dirname, '..', 'src', 'gui', 'client');
76
-
75
+
77
76
  console.log(chalk.blue('Building frontend...'));
78
-
77
+
79
78
  // Check if client directory exists
80
79
  const fs = require('fs');
81
80
  if (!fs.existsSync(guiDir)) {
82
81
  console.log(chalk.yellow('Frontend client not found. Creating minimal build...'));
83
82
  return;
84
83
  }
85
-
84
+
86
85
  execSync('npm run build', {
87
86
  cwd: guiDir,
88
87
  stdio: 'inherit',
89
88
  });
90
-
89
+
91
90
  console.log(chalk.green(`āœ“ Frontend built to ${options.outdir}`));
92
91
  } catch (error) {
93
92
  console.error(chalk.red(`Build failed: ${error.message}`));
@@ -103,32 +102,31 @@ program
103
102
  .description('Start in development mode with hot reload')
104
103
  .option('-p, --port <port>', 'Server port', '3000')
105
104
  .option('-d, --dir <directory>', 'Project directory', process.cwd())
106
- .action(async (options) => {
105
+ .action(async options => {
107
106
  try {
108
107
  const Server = require('../src/gui/server');
109
108
  const projectPath = path.resolve(options.dir);
110
-
109
+
111
110
  console.log(chalk.blue('šŸ”® MUSUBI Web GUI (Development Mode)'));
112
111
  console.log(chalk.gray(`Project: ${projectPath}`));
113
-
112
+
114
113
  const server = new Server(projectPath, {
115
114
  port: parseInt(options.port, 10),
116
115
  dev: true,
117
116
  });
118
-
117
+
119
118
  await server.start();
120
-
119
+
121
120
  console.log(chalk.green(`\nāœ“ Server running at http://localhost:${options.port}`));
122
121
  console.log(chalk.cyan('Hot reload enabled'));
123
122
  console.log(chalk.gray('Press Ctrl+C to stop\n'));
124
-
123
+
125
124
  // Handle shutdown
126
125
  process.on('SIGINT', async () => {
127
126
  console.log(chalk.yellow('\n\nShutting down...'));
128
127
  await server.stop();
129
128
  process.exit(0);
130
129
  });
131
-
132
130
  } catch (error) {
133
131
  console.error(chalk.red(`Error: ${error.message}`));
134
132
  process.exit(1);
@@ -143,28 +141,30 @@ program
143
141
  .description('Show project status summary')
144
142
  .option('-d, --dir <directory>', 'Project directory', process.cwd())
145
143
  .option('--json', 'Output as JSON')
146
- .action(async (options) => {
144
+ .action(async options => {
147
145
  try {
148
146
  const ProjectScanner = require('../src/gui/services/project-scanner');
149
147
  const projectPath = path.resolve(options.dir);
150
-
148
+
151
149
  const scanner = new ProjectScanner(projectPath);
152
150
  const project = await scanner.scan();
153
-
151
+
154
152
  if (options.json) {
155
153
  console.log(JSON.stringify(project, null, 2));
156
154
  return;
157
155
  }
158
-
156
+
159
157
  console.log(chalk.blue('\nšŸ”® MUSUBI Project Status\n'));
160
158
  console.log(chalk.white(`Project: ${chalk.bold(project.name)}`));
161
159
  console.log(chalk.white(`Path: ${project.path}`));
162
160
  console.log('');
163
-
161
+
164
162
  if (project.hasSteering) {
165
163
  console.log(chalk.green('āœ“ Steering directory found'));
166
164
  if (project.constitution) {
167
- console.log(chalk.green(` āœ“ Constitution: ${project.constitution.articles.length} articles`));
165
+ console.log(
166
+ chalk.green(` āœ“ Constitution: ${project.constitution.articles.length} articles`)
167
+ );
168
168
  }
169
169
  if (project.steering) {
170
170
  const docs = ['product', 'structure', 'tech'].filter(d => project.steering[d]);
@@ -173,26 +173,26 @@ program
173
173
  } else {
174
174
  console.log(chalk.yellow('⚠ No steering directory (run musubi init)'));
175
175
  }
176
-
176
+
177
177
  if (project.hasSpecs) {
178
178
  console.log(chalk.green(`āœ“ Specs: ${project.specs.length} specification files`));
179
-
179
+
180
180
  let totalReqs = 0;
181
181
  let totalTasks = 0;
182
182
  let completedTasks = 0;
183
-
183
+
184
184
  for (const spec of project.specs) {
185
185
  totalReqs += spec.requirements.length;
186
186
  totalTasks += spec.tasks.length;
187
187
  completedTasks += spec.tasks.filter(t => t.completed).length;
188
188
  }
189
-
189
+
190
190
  console.log(chalk.white(` • Requirements: ${totalReqs}`));
191
191
  console.log(chalk.white(` • Tasks: ${completedTasks}/${totalTasks} completed`));
192
192
  } else {
193
193
  console.log(chalk.gray('ā—‹ No specs yet'));
194
194
  }
195
-
195
+
196
196
  console.log('');
197
197
  } catch (error) {
198
198
  console.error(chalk.red(`Error: ${error.message}`));
@@ -208,40 +208,47 @@ program
208
208
  .description('Display traceability matrix')
209
209
  .option('-d, --dir <directory>', 'Project directory', process.cwd())
210
210
  .option('--json', 'Output as JSON')
211
- .action(async (options) => {
211
+ .action(async options => {
212
212
  try {
213
213
  const TraceabilityService = require('../src/gui/services/traceability-service');
214
214
  const projectPath = path.resolve(options.dir);
215
-
215
+
216
216
  const service = new TraceabilityService(projectPath);
217
217
  const matrix = await service.buildMatrix();
218
-
218
+
219
219
  if (options.json) {
220
220
  console.log(JSON.stringify(matrix, null, 2));
221
221
  return;
222
222
  }
223
-
223
+
224
224
  console.log(chalk.blue('\nšŸ”® Traceability Matrix\n'));
225
-
225
+
226
226
  const coverage = await service.getCoverage();
227
227
  console.log(chalk.white('Coverage:'));
228
228
  console.log(chalk.white(` Total Requirements: ${coverage.total}`));
229
229
  console.log(chalk.white(` Linked: ${coverage.linked} (${coverage.linkedPercent}%)`));
230
- console.log(chalk.white(` Implemented: ${coverage.implemented} (${coverage.implementedPercent}%)`));
230
+ console.log(
231
+ chalk.white(` Implemented: ${coverage.implemented} (${coverage.implementedPercent}%)`)
232
+ );
231
233
  console.log('');
232
-
234
+
233
235
  if (matrix.requirements.length === 0) {
234
236
  console.log(chalk.gray('No requirements found.'));
235
237
  return;
236
238
  }
237
-
239
+
238
240
  console.log(chalk.white('Requirements:'));
239
241
  for (const req of matrix.requirements) {
240
- const statusColor = req.status === 'implemented' ? 'green' :
241
- req.status === 'tasked' ? 'yellow' :
242
- req.status === 'designed' ? 'cyan' : 'gray';
242
+ const statusColor =
243
+ req.status === 'implemented'
244
+ ? 'green'
245
+ : req.status === 'tasked'
246
+ ? 'yellow'
247
+ : req.status === 'designed'
248
+ ? 'cyan'
249
+ : 'gray';
243
250
  console.log(chalk[statusColor](` ${req.id}: ${req.title} [${req.status}]`));
244
-
251
+
245
252
  if (req.links.designs.length > 0) {
246
253
  console.log(chalk.gray(` → Designs: ${req.links.designs.map(d => d.id).join(', ')}`));
247
254
  }
@@ -249,9 +256,9 @@ program
249
256
  console.log(chalk.gray(` → Tasks: ${req.links.tasks.map(t => t.id).join(', ')}`));
250
257
  }
251
258
  }
252
-
259
+
253
260
  console.log('');
254
-
261
+
255
262
  const gaps = await service.findGaps();
256
263
  if (gaps.length > 0) {
257
264
  console.log(chalk.yellow('Gaps:'));
@@ -260,7 +267,6 @@ program
260
267
  }
261
268
  console.log('');
262
269
  }
263
-
264
270
  } catch (error) {
265
271
  console.error(chalk.red(`Error: ${error.message}`));
266
272
  process.exit(1);