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
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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 =
|
|
241
|
-
|
|
242
|
-
|
|
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);
|