musubi-sdd 6.2.0 → 6.2.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 +60 -1
- package/README.md +60 -1
- package/bin/musubi-dashboard.js +340 -0
- package/package.json +3 -2
- package/src/cli/dashboard-cli.js +536 -0
- package/src/constitutional/checker.js +633 -0
- package/src/constitutional/ci-reporter.js +336 -0
- package/src/constitutional/index.js +22 -0
- package/src/constitutional/phase-minus-one.js +404 -0
- package/src/constitutional/steering-sync.js +473 -0
- package/src/dashboard/index.js +20 -0
- package/src/dashboard/sprint-planner.js +361 -0
- package/src/dashboard/sprint-reporter.js +378 -0
- package/src/dashboard/transition-recorder.js +209 -0
- package/src/dashboard/workflow-dashboard.js +434 -0
- package/src/enterprise/error-recovery.js +524 -0
- package/src/enterprise/experiment-report.js +573 -0
- package/src/enterprise/index.js +57 -4
- package/src/enterprise/rollback-manager.js +584 -0
- package/src/enterprise/tech-article.js +509 -0
- package/src/traceability/extractor.js +294 -0
- package/src/traceability/gap-detector.js +230 -0
- package/src/traceability/index.js +15 -0
- package/src/traceability/matrix-storage.js +368 -0
package/README.ja.md
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
> 🤖 **7つのAIエージェント** × 📋 **
|
|
20
|
+
> 🤖 **7つのAIエージェント** × 📋 **31の専門スキル** × ⚖️ **憲法ガバナンス**
|
|
21
21
|
|
|
22
22
|
MUSUBI(結び)は、6つの主要フレームワークのベスト機能を統合した包括的な**仕様駆動開発(SDD)**フレームワークです。複数のAIコーディングエージェントに対応した本番環境対応ツールです。
|
|
23
23
|
|
|
@@ -71,6 +71,65 @@ musubi init --windsurf # Windsurf IDE
|
|
|
71
71
|
|
|
72
72
|
---
|
|
73
73
|
|
|
74
|
+
## 📊 v6.2.0 の新機能
|
|
75
|
+
|
|
76
|
+
### Review Gate Engine 🛡️
|
|
77
|
+
|
|
78
|
+
各開発ステージでの体系的なレビューのための新しい品質ゲート。
|
|
79
|
+
|
|
80
|
+
#### レビューゲート
|
|
81
|
+
|
|
82
|
+
| ゲート | 説明 | プロンプト |
|
|
83
|
+
|------|------|------------|
|
|
84
|
+
| **Requirements Gate** | EARS形式、優先度、受入基準の検証 | `#sdd-review-requirements` |
|
|
85
|
+
| **Design Gate** | C4モデル、ADR、コンポーネント設計の検証 | `#sdd-review-design` |
|
|
86
|
+
| **Implementation Gate** | コード品質、テストカバレッジ、命名規則 | `#sdd-review-implementation` |
|
|
87
|
+
| **Full Review** | 全ゲートを順番に実行 | `#sdd-review-all` |
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# AIエージェントでレビュープロンプトを使用
|
|
91
|
+
#sdd-review-requirements user-auth
|
|
92
|
+
#sdd-review-design user-auth
|
|
93
|
+
#sdd-review-implementation user-auth
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
#### ワークフローダッシュボード
|
|
97
|
+
|
|
98
|
+
- **進捗可視化**: 5ステージのリアルタイム進捗表示
|
|
99
|
+
- **ブロッカー管理**: ブロッカーの追加・解決・追跡
|
|
100
|
+
- **遷移記録**: ステージ間遷移の記録と分析
|
|
101
|
+
- **スプリント計画**: ベロシティ追跡付きタスク優先度付け
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
musubi dashboard show <feature> # ワークフロー状態表示
|
|
105
|
+
musubi dashboard start <feature> # 新規ワークフロー開始
|
|
106
|
+
musubi dashboard blocker <feature> # ブロッカー管理
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### トレーサビリティシステム
|
|
110
|
+
|
|
111
|
+
- **自動抽出**: コード・テスト・コミットからID自動抽出
|
|
112
|
+
- **ギャップ検出**: 設計・実装・テストの欠落検出
|
|
113
|
+
- **マトリックスストレージ**: 履歴付きYAMLベース追跡マトリックス
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
musubi-trace extract <dir> # トレーサビリティID抽出
|
|
117
|
+
musubi-trace gaps <feature> # ギャップ検出
|
|
118
|
+
musubi-trace matrix # マトリックスレポート生成
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
#### エンタープライズ機能
|
|
122
|
+
|
|
123
|
+
| 機能 | 説明 |
|
|
124
|
+
|------|------|
|
|
125
|
+
| **エラーリカバリー** | 修復手順付き自動エラー分析 |
|
|
126
|
+
| **ロールバックマネージャー** | ファイル/コミット/ステージ/スプリント単位のロールバック |
|
|
127
|
+
| **CIレポーター** | GitHub Actions統合 |
|
|
128
|
+
| **Phase -1 ゲート** | 全ステージ前の憲法準拠チェック |
|
|
129
|
+
| **Steering同期** | バージョン変更時のステアリングファイル自動更新 |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
74
133
|
## 📊 v5.9.0 の新機能
|
|
75
134
|
|
|
76
135
|
### Phase 1-4 エンタープライズ機能 🏢
|
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
> 🤖 **7 AI Coding Agents** × 📋 **
|
|
20
|
+
> 🤖 **7 AI Coding Agents** × 📋 **31 Specialized Skills** × ⚖️ **Constitutional Governance**
|
|
21
21
|
|
|
22
22
|
MUSUBI (結び - "connection/binding") is a comprehensive **Specification Driven Development (SDD)** framework that synthesizes the best features from 6 leading frameworks into a production-ready tool for multiple AI coding agents.
|
|
23
23
|
|
|
@@ -71,6 +71,65 @@ musubi init --windsurf # Windsurf IDE
|
|
|
71
71
|
|
|
72
72
|
---
|
|
73
73
|
|
|
74
|
+
## 📊 What's New in v6.2.0
|
|
75
|
+
|
|
76
|
+
### Review Gate Engine 🛡️
|
|
77
|
+
|
|
78
|
+
New quality gates for systematic review at each development stage.
|
|
79
|
+
|
|
80
|
+
#### Review Gates
|
|
81
|
+
|
|
82
|
+
| Gate | Description | Prompt |
|
|
83
|
+
|------|-------------|--------|
|
|
84
|
+
| **Requirements Gate** | EARS format, priority, acceptance criteria validation | `#sdd-review-requirements` |
|
|
85
|
+
| **Design Gate** | C4 model, ADR, component design validation | `#sdd-review-design` |
|
|
86
|
+
| **Implementation Gate** | Code quality, test coverage, naming conventions | `#sdd-review-implementation` |
|
|
87
|
+
| **Full Review** | All gates in sequence | `#sdd-review-all` |
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Use review prompts in your AI agent
|
|
91
|
+
#sdd-review-requirements user-auth
|
|
92
|
+
#sdd-review-design user-auth
|
|
93
|
+
#sdd-review-implementation user-auth
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
#### Workflow Dashboard
|
|
97
|
+
|
|
98
|
+
- **Progress Visualization**: Real-time progress across 5 stages
|
|
99
|
+
- **Blocker Management**: Add, resolve, and track blockers
|
|
100
|
+
- **Transition Recording**: Record and analyze stage transitions
|
|
101
|
+
- **Sprint Planning**: Task prioritization with velocity tracking
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
musubi dashboard show <feature> # Show workflow status
|
|
105
|
+
musubi dashboard start <feature> # Start new workflow
|
|
106
|
+
musubi dashboard blocker <feature> # Manage blockers
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### Traceability System
|
|
110
|
+
|
|
111
|
+
- **Auto-Extraction**: Automatic ID extraction from code, tests, commits
|
|
112
|
+
- **Gap Detection**: Detect missing design, implementation, or tests
|
|
113
|
+
- **Matrix Storage**: YAML-based traceability matrix with history
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
musubi-trace extract <dir> # Extract traceability IDs
|
|
117
|
+
musubi-trace gaps <feature> # Detect gaps
|
|
118
|
+
musubi-trace matrix # Generate matrix report
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
#### Enterprise Features
|
|
122
|
+
|
|
123
|
+
| Feature | Description |
|
|
124
|
+
|---------|-------------|
|
|
125
|
+
| **Error Recovery** | Auto error analysis with remediation steps |
|
|
126
|
+
| **Rollback Manager** | File/commit/stage/sprint level rollback |
|
|
127
|
+
| **CI Reporter** | GitHub Actions integration |
|
|
128
|
+
| **Phase -1 Gate** | Constitutional compliance before all stages |
|
|
129
|
+
| **Steering Sync** | Auto-update steering files on version change |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
74
133
|
## 📊 What's New in v5.9.0
|
|
75
134
|
|
|
76
135
|
### Phase 1-4 Enterprise Features 🏢
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* MUSUBI Dashboard CLI
|
|
5
|
+
*
|
|
6
|
+
* Workflow dashboard for progress visualization and management.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* musubi-dashboard show <feature> Show workflow status
|
|
10
|
+
* musubi-dashboard create <feature> Create new workflow
|
|
11
|
+
* musubi-dashboard advance <feature> Advance to next stage
|
|
12
|
+
* musubi-dashboard blocker <feature> Manage blockers
|
|
13
|
+
* musubi-dashboard sprint <action> Sprint management
|
|
14
|
+
* musubi-dashboard trace <action> Traceability management
|
|
15
|
+
*
|
|
16
|
+
* Requirement: IMP-6.2-003-05
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const { DashboardCLI } = require('../src/cli/dashboard-cli');
|
|
20
|
+
|
|
21
|
+
const args = process.argv.slice(2);
|
|
22
|
+
const command = args[0];
|
|
23
|
+
const subcommand = args[1];
|
|
24
|
+
const feature = args[2] || args[1];
|
|
25
|
+
|
|
26
|
+
// Parse options
|
|
27
|
+
const options = {};
|
|
28
|
+
for (let i = 0; i < args.length; i++) {
|
|
29
|
+
if (args[i].startsWith('--')) {
|
|
30
|
+
const key = args[i].slice(2);
|
|
31
|
+
const value = args[i + 1] && !args[i + 1].startsWith('--') ? args[i + 1] : true;
|
|
32
|
+
options[key] = value;
|
|
33
|
+
if (value !== true) i++;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function main() {
|
|
38
|
+
const cli = new DashboardCLI();
|
|
39
|
+
|
|
40
|
+
if (!command || command === '--help' || command === '-h') {
|
|
41
|
+
showHelp();
|
|
42
|
+
process.exit(0);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
let result;
|
|
47
|
+
|
|
48
|
+
switch (command) {
|
|
49
|
+
case 'show':
|
|
50
|
+
case 'status':
|
|
51
|
+
result = await cli.execute('workflow:status', [subcommand]);
|
|
52
|
+
formatWorkflowStatus(result);
|
|
53
|
+
break;
|
|
54
|
+
|
|
55
|
+
case 'create':
|
|
56
|
+
case 'start':
|
|
57
|
+
result = await cli.execute('workflow:create', [subcommand], options);
|
|
58
|
+
console.log(`\n✅ Workflow created for: ${subcommand}`);
|
|
59
|
+
formatWorkflowStatus(result);
|
|
60
|
+
break;
|
|
61
|
+
|
|
62
|
+
case 'advance':
|
|
63
|
+
result = await cli.execute('workflow:advance', [subcommand], options);
|
|
64
|
+
console.log(`\n✅ Workflow advanced`);
|
|
65
|
+
formatWorkflowStatus(result);
|
|
66
|
+
break;
|
|
67
|
+
|
|
68
|
+
case 'blocker':
|
|
69
|
+
if (options.add) {
|
|
70
|
+
result = await cli.execute('blocker:add', [subcommand], {
|
|
71
|
+
stage: options.stage || 'current',
|
|
72
|
+
description: options.add,
|
|
73
|
+
severity: options.severity || 'medium'
|
|
74
|
+
});
|
|
75
|
+
console.log(`\n✅ Blocker added: ${options.add}`);
|
|
76
|
+
} else if (options.resolve) {
|
|
77
|
+
result = await cli.execute('blocker:resolve', [subcommand], {
|
|
78
|
+
blockerId: options.resolve,
|
|
79
|
+
resolution: options.resolution || 'Resolved'
|
|
80
|
+
});
|
|
81
|
+
console.log(`\n✅ Blocker resolved`);
|
|
82
|
+
} else {
|
|
83
|
+
result = await cli.execute('blocker:list', [subcommand]);
|
|
84
|
+
formatBlockers(result);
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
|
|
88
|
+
case 'sprint':
|
|
89
|
+
await handleSprintCommand(cli, subcommand, args.slice(2), options);
|
|
90
|
+
break;
|
|
91
|
+
|
|
92
|
+
case 'trace':
|
|
93
|
+
await handleTraceCommand(cli, subcommand, args.slice(2), options);
|
|
94
|
+
break;
|
|
95
|
+
|
|
96
|
+
case 'report':
|
|
97
|
+
result = await cli.execute('report:generate', [subcommand], options);
|
|
98
|
+
console.log(result.report);
|
|
99
|
+
break;
|
|
100
|
+
|
|
101
|
+
default:
|
|
102
|
+
console.error(`Unknown command: ${command}`);
|
|
103
|
+
showHelp();
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error(`\n❌ Error: ${error.message}`);
|
|
108
|
+
if (options.verbose) {
|
|
109
|
+
console.error(error.stack);
|
|
110
|
+
}
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function handleSprintCommand(cli, action, args, options) {
|
|
116
|
+
let result;
|
|
117
|
+
|
|
118
|
+
switch (action) {
|
|
119
|
+
case 'create':
|
|
120
|
+
result = await cli.execute('sprint:create', args, options);
|
|
121
|
+
console.log(`\n✅ Sprint created: ${result.id}`);
|
|
122
|
+
break;
|
|
123
|
+
|
|
124
|
+
case 'start':
|
|
125
|
+
result = await cli.execute('sprint:start', args);
|
|
126
|
+
console.log(`\n✅ Sprint started: ${args[0]}`);
|
|
127
|
+
break;
|
|
128
|
+
|
|
129
|
+
case 'complete':
|
|
130
|
+
result = await cli.execute('sprint:complete', args);
|
|
131
|
+
console.log(`\n✅ Sprint completed: ${args[0]}`);
|
|
132
|
+
break;
|
|
133
|
+
|
|
134
|
+
case 'status':
|
|
135
|
+
result = await cli.execute('sprint:status', args);
|
|
136
|
+
formatSprintStatus(result);
|
|
137
|
+
break;
|
|
138
|
+
|
|
139
|
+
case 'report':
|
|
140
|
+
result = await cli.execute('sprint:report', args, options);
|
|
141
|
+
console.log(result.markdown || result.report);
|
|
142
|
+
break;
|
|
143
|
+
|
|
144
|
+
default:
|
|
145
|
+
console.error(`Unknown sprint action: ${action}`);
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function handleTraceCommand(cli, action, args, options) {
|
|
151
|
+
let result;
|
|
152
|
+
|
|
153
|
+
switch (action) {
|
|
154
|
+
case 'extract':
|
|
155
|
+
result = await cli.execute('trace:extract', args, options);
|
|
156
|
+
console.log(`\n✅ Extracted ${result.references?.length || 0} traceability references`);
|
|
157
|
+
break;
|
|
158
|
+
|
|
159
|
+
case 'gaps':
|
|
160
|
+
result = await cli.execute('trace:gaps', args);
|
|
161
|
+
formatGaps(result);
|
|
162
|
+
break;
|
|
163
|
+
|
|
164
|
+
case 'matrix':
|
|
165
|
+
result = await cli.execute('trace:matrix', args, options);
|
|
166
|
+
console.log(result.markdown || JSON.stringify(result, null, 2));
|
|
167
|
+
break;
|
|
168
|
+
|
|
169
|
+
case 'report':
|
|
170
|
+
result = await cli.execute('trace:report', args, options);
|
|
171
|
+
console.log(result.report);
|
|
172
|
+
break;
|
|
173
|
+
|
|
174
|
+
default:
|
|
175
|
+
console.error(`Unknown trace action: ${action}`);
|
|
176
|
+
process.exit(1);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function formatWorkflowStatus(workflow) {
|
|
181
|
+
if (!workflow) {
|
|
182
|
+
console.log('\n⚠️ No workflow found for this feature');
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
console.log(`\n📊 Workflow Dashboard: ${workflow.featureId || 'Unknown'}`);
|
|
187
|
+
console.log('═'.repeat(50));
|
|
188
|
+
|
|
189
|
+
if (workflow.title) {
|
|
190
|
+
console.log(`📝 Title: ${workflow.title}`);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
console.log(`📍 Current Stage: ${workflow.currentStage || 'N/A'}`);
|
|
194
|
+
console.log(`📈 Completion: ${workflow.completion || 0}%`);
|
|
195
|
+
console.log('');
|
|
196
|
+
|
|
197
|
+
// Stage visualization
|
|
198
|
+
const stages = ['steering', 'requirements', 'design', 'implementation', 'validation'];
|
|
199
|
+
const stageStatus = workflow.stages || {};
|
|
200
|
+
|
|
201
|
+
console.log('Stages:');
|
|
202
|
+
stages.forEach((stage, index) => {
|
|
203
|
+
const status = stageStatus[stage]?.status || 'pending';
|
|
204
|
+
const icon = getStatusIcon(status);
|
|
205
|
+
const current = stage === workflow.currentStage ? '◀' : '';
|
|
206
|
+
console.log(` ${index + 1}. ${icon} ${stage.padEnd(15)} ${current}`);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
if (workflow.blockers && workflow.blockers.length > 0) {
|
|
210
|
+
console.log(`\n⚠️ Blockers: ${workflow.blockers.filter(b => !b.resolvedAt).length} active`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function formatBlockers(result) {
|
|
215
|
+
const blockers = result.blockers || [];
|
|
216
|
+
|
|
217
|
+
if (blockers.length === 0) {
|
|
218
|
+
console.log('\n✅ No blockers');
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
console.log(`\n⚠️ Blockers (${blockers.length}):`);
|
|
223
|
+
console.log('─'.repeat(40));
|
|
224
|
+
|
|
225
|
+
blockers.forEach((blocker, i) => {
|
|
226
|
+
const status = blocker.resolvedAt ? '✅' : '🚫';
|
|
227
|
+
console.log(`${i + 1}. ${status} [${blocker.severity || 'medium'}] ${blocker.description}`);
|
|
228
|
+
if (blocker.stage) {
|
|
229
|
+
console.log(` Stage: ${blocker.stage}`);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function formatSprintStatus(sprint) {
|
|
235
|
+
if (!sprint) {
|
|
236
|
+
console.log('\n⚠️ Sprint not found');
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
console.log(`\n🏃 Sprint: ${sprint.name || sprint.id}`);
|
|
241
|
+
console.log('═'.repeat(50));
|
|
242
|
+
console.log(`Status: ${sprint.status || 'unknown'}`);
|
|
243
|
+
console.log(`Tasks: ${sprint.tasks?.length || 0}`);
|
|
244
|
+
|
|
245
|
+
if (sprint.metrics) {
|
|
246
|
+
console.log(`Completion: ${sprint.metrics.completionPercentage || 0}%`);
|
|
247
|
+
console.log(`Points: ${sprint.metrics.completedPoints || 0}/${sprint.metrics.totalPoints || 0}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function formatGaps(result) {
|
|
252
|
+
const gaps = result.gaps || [];
|
|
253
|
+
|
|
254
|
+
if (gaps.length === 0) {
|
|
255
|
+
console.log('\n✅ No traceability gaps detected');
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
console.log(`\n⚠️ Traceability Gaps (${gaps.length}):`);
|
|
260
|
+
console.log('─'.repeat(50));
|
|
261
|
+
|
|
262
|
+
// Group by severity
|
|
263
|
+
const bySeverity = { critical: [], high: [], medium: [], low: [] };
|
|
264
|
+
gaps.forEach(gap => {
|
|
265
|
+
const sev = gap.severity || 'medium';
|
|
266
|
+
if (bySeverity[sev]) bySeverity[sev].push(gap);
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
Object.entries(bySeverity).forEach(([severity, items]) => {
|
|
270
|
+
if (items.length > 0) {
|
|
271
|
+
const icon = severity === 'critical' ? '🔴' : severity === 'high' ? '🟠' : severity === 'medium' ? '🟡' : '🟢';
|
|
272
|
+
console.log(`\n${icon} ${severity.toUpperCase()} (${items.length}):`);
|
|
273
|
+
items.forEach(gap => {
|
|
274
|
+
console.log(` - ${gap.requirementId}: ${gap.gapType}`);
|
|
275
|
+
if (gap.suggestion) {
|
|
276
|
+
console.log(` 💡 ${gap.suggestion}`);
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
function getStatusIcon(status) {
|
|
284
|
+
const icons = {
|
|
285
|
+
'completed': '✅',
|
|
286
|
+
'in-progress': '🔄',
|
|
287
|
+
'blocked': '🚫',
|
|
288
|
+
'pending': '⬜',
|
|
289
|
+
'not-started': '⬜'
|
|
290
|
+
};
|
|
291
|
+
return icons[status] || '⬜';
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function showHelp() {
|
|
295
|
+
console.log(`
|
|
296
|
+
MUSUBI Dashboard CLI v6.2.0
|
|
297
|
+
|
|
298
|
+
Usage: musubi-dashboard <command> [options]
|
|
299
|
+
|
|
300
|
+
Workflow Commands:
|
|
301
|
+
show <feature> Show workflow status
|
|
302
|
+
create <feature> Create new workflow
|
|
303
|
+
start <feature> Alias for create
|
|
304
|
+
advance <feature> Advance to next stage
|
|
305
|
+
blocker <feature> Manage blockers
|
|
306
|
+
--add <description> Add a blocker
|
|
307
|
+
--resolve <id> Resolve a blocker
|
|
308
|
+
--stage <stage> Specify stage
|
|
309
|
+
--severity <level> Set severity (low/medium/high/critical)
|
|
310
|
+
|
|
311
|
+
Sprint Commands:
|
|
312
|
+
sprint create <name> Create a new sprint
|
|
313
|
+
--feature <id> Associated feature
|
|
314
|
+
--velocity <points> Sprint velocity
|
|
315
|
+
sprint start <id> Start a sprint
|
|
316
|
+
sprint complete <id> Complete a sprint
|
|
317
|
+
sprint status <id> Show sprint status
|
|
318
|
+
sprint report <id> Generate sprint report
|
|
319
|
+
|
|
320
|
+
Traceability Commands:
|
|
321
|
+
trace extract <dir> Extract traceability IDs
|
|
322
|
+
trace gaps <feature> Detect traceability gaps
|
|
323
|
+
trace matrix Generate traceability matrix
|
|
324
|
+
trace report Generate full report
|
|
325
|
+
|
|
326
|
+
General Options:
|
|
327
|
+
--verbose Show detailed output
|
|
328
|
+
--format <type> Output format (text/json/markdown)
|
|
329
|
+
--help, -h Show this help
|
|
330
|
+
|
|
331
|
+
Examples:
|
|
332
|
+
musubi-dashboard show user-auth
|
|
333
|
+
musubi-dashboard create FEAT-001 --title "User Authentication"
|
|
334
|
+
musubi-dashboard blocker FEAT-001 --add "Waiting for API spec"
|
|
335
|
+
musubi-dashboard sprint create "Sprint 1" --feature FEAT-001
|
|
336
|
+
musubi-dashboard trace gaps FEAT-001
|
|
337
|
+
`);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
main();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "musubi-sdd",
|
|
3
|
-
"version": "6.2.
|
|
3
|
+
"version": "6.2.1",
|
|
4
4
|
"description": "Ultimate Specification Driven Development Tool with 27 Agents for 7 AI Coding Platforms + MCP Integration (Claude Code, GitHub Copilot, Cursor, Gemini CLI, Windsurf, Codex, Qwen Code)",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -73,7 +73,8 @@
|
|
|
73
73
|
"js-yaml": "^4.1.0",
|
|
74
74
|
"open": "^10.1.0",
|
|
75
75
|
"playwright": "^1.40.0",
|
|
76
|
-
"ws": "^8.14.2"
|
|
76
|
+
"ws": "^8.14.2",
|
|
77
|
+
"yaml": "^2.8.2"
|
|
77
78
|
},
|
|
78
79
|
"devDependencies": {
|
|
79
80
|
"eslint": "^8.50.0",
|