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 CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
  ---
19
19
 
20
- > 🤖 **7つのAIエージェント** × 📋 **27の専門スキル** × ⚖️ **憲法ガバナンス**
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** × 📋 **27 Specialized Skills** × ⚖️ **Constitutional Governance**
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.0",
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",