musubi-sdd 5.8.2 → 5.9.0

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
@@ -71,6 +71,80 @@ musubi init --windsurf # Windsurf IDE
71
71
 
72
72
  ---
73
73
 
74
+ ## 📊 v5.9.0 の新機能
75
+
76
+ ### Phase 1-4 エンタープライズ機能 🏢
77
+
78
+ 大規模プロジェクトとモノレポ対応のエンタープライズ機能を大幅追加。
79
+
80
+ #### ワークフロー柔軟性(Phase 1)
81
+
82
+ - **3つのワークフローモード**: `small`(バグ修正)、`medium`(機能追加)、`large`(設計変更)
83
+ - **自動検出**: フィーチャー名パターンからモード自動選択
84
+ - **`musubi-release`**: CHANGELOG自動生成付きリリースCLI
85
+
86
+ ```bash
87
+ # コミットからCHANGELOGを生成
88
+ musubi-release
89
+
90
+ # フィーチャーのモードを検出
91
+ musubi-workflow mode --detect "feat: ユーザー認証"
92
+ ```
93
+
94
+ #### モノレポ対応(Phase 2)
95
+
96
+ - **パッケージレジストリ**: `steering/packages.yml` で依存関係管理
97
+ - **依存関係グラフ**: Mermaidダイアグラム生成で可視化
98
+ - **カバレッジ追跡**: パッケージ別テストカバレッジレポート
99
+
100
+ #### 憲法レベル管理(Phase 3)
101
+
102
+ - **3つの適用レベル**: `critical`(ブロック)、`advisory`(警告)、`flexible`(提案)
103
+ - **レベル別検証**: 条項の重要度に応じた異なる適用
104
+ - **プロジェクト別オーバーライド**: プロジェクトタイプ別カスタムレベル
105
+
106
+ | レベル | 条項 | 動作 |
107
+ |--------|------|------|
108
+ | Critical | CONST-001, 002, 003, 005, 009 | ワークフローをブロック |
109
+ | Advisory | CONST-004, 006, 007 | 警告のみ |
110
+ | Flexible | CONST-008 | 提案として表示 |
111
+
112
+ #### プロジェクト設定(Phase 4)
113
+
114
+ - **`musubi-config`**: 設定管理用新CLI
115
+ - **スキーマ検証**: AJVによるv2.0スキーマ検証
116
+ - **自動マイグレーション**: v1.0設定をv2.0に自動アップグレード
117
+
118
+ ```bash
119
+ musubi-config validate # project.yml を検証
120
+ musubi-config migrate # v2.0 にマイグレーション
121
+ musubi-config show # 有効な設定を表示
122
+ ```
123
+
124
+ #### オーケストレーター統合
125
+
126
+ プログラムアクセス用の5つの組み込みスキル:
127
+
128
+ | スキル | カテゴリ | 用途 |
129
+ |--------|----------|------|
130
+ | `release-manager` | release | CHANGELOG生成 |
131
+ | `workflow-mode-manager` | workflow | モード検出・管理 |
132
+ | `package-manager` | configuration | パッケージ・依存関係分析 |
133
+ | `constitution-level-manager` | validation | レベル別検証 |
134
+ | `project-config-manager` | configuration | 設定検証・マイグレーション |
135
+
136
+ ```javascript
137
+ const { workflowModeSkill } = require('musubi-sdd/src/orchestration');
138
+
139
+ const result = await workflowModeSkill.execute({
140
+ action: 'detect',
141
+ featureName: 'fix: 軽微なバグ'
142
+ });
143
+ console.log(result.detectedMode); // 'small'
144
+ ```
145
+
146
+ ---
147
+
74
148
  ## 📊 v5.6.0 の新機能
75
149
 
76
150
  ### エンタープライズスケール分析 & Rustマイグレーション支援 🏢🦀
package/README.md CHANGED
@@ -71,6 +71,80 @@ musubi init --windsurf # Windsurf IDE
71
71
 
72
72
  ---
73
73
 
74
+ ## 📊 What's New in v5.9.0
75
+
76
+ ### Phase 1-4 Enterprise Features 🏢
77
+
78
+ Major update with enterprise-ready features for large-scale projects and monorepo support.
79
+
80
+ #### Workflow Flexibility (Phase 1)
81
+
82
+ - **3 Workflow Modes**: `small` (bug fixes), `medium` (features), `large` (architecture)
83
+ - **Auto-detection**: Smart mode selection based on feature name patterns
84
+ - **`musubi-release`**: New CLI for release automation with CHANGELOG generation
85
+
86
+ ```bash
87
+ # Generate CHANGELOG from commits
88
+ musubi-release
89
+
90
+ # Show detected mode for a feature
91
+ musubi-workflow mode --detect "feat: user authentication"
92
+ ```
93
+
94
+ #### Monorepo Support (Phase 2)
95
+
96
+ - **Package Registry**: `steering/packages.yml` for dependency management
97
+ - **Dependency Graphs**: Mermaid diagram generation for visualization
98
+ - **Coverage Tracking**: Per-package test coverage reporting
99
+
100
+ #### Constitution Level Management (Phase 3)
101
+
102
+ - **3 Enforcement Levels**: `critical` (blocking), `advisory` (warnings), `flexible` (suggestions)
103
+ - **Level-aware Validation**: Different enforcement based on article importance
104
+ - **Project Overrides**: Custom levels per project type
105
+
106
+ | Level | Articles | Behavior |
107
+ |-------|----------|----------|
108
+ | Critical | CONST-001, 002, 003, 005, 009 | Blocks workflow |
109
+ | Advisory | CONST-004, 006, 007 | Warnings only |
110
+ | Flexible | CONST-008 | Suggestions |
111
+
112
+ #### Project Configuration (Phase 4)
113
+
114
+ - **`musubi-config`**: New CLI for configuration management
115
+ - **Schema Validation**: v2.0 schema with AJV validation
116
+ - **Auto-migration**: Upgrade v1.0 configs to v2.0
117
+
118
+ ```bash
119
+ musubi-config validate # Validate project.yml
120
+ musubi-config migrate # Migrate to v2.0
121
+ musubi-config show # Show effective config
122
+ ```
123
+
124
+ #### Orchestrator Integration
125
+
126
+ 5 new built-in skills for programmatic access:
127
+
128
+ | Skill | Category | Usage |
129
+ |-------|----------|-------|
130
+ | `release-manager` | release | CHANGELOG generation |
131
+ | `workflow-mode-manager` | workflow | Mode detection & management |
132
+ | `package-manager` | configuration | Package & dependency analysis |
133
+ | `constitution-level-manager` | validation | Level-aware validation |
134
+ | `project-config-manager` | configuration | Config validation & migration |
135
+
136
+ ```javascript
137
+ const { workflowModeSkill } = require('musubi-sdd/src/orchestration');
138
+
139
+ const result = await workflowModeSkill.execute({
140
+ action: 'detect',
141
+ featureName: 'fix: minor bug'
142
+ });
143
+ console.log(result.detectedMode); // 'small'
144
+ ```
145
+
146
+ ---
147
+
74
148
  ## 📊 What's New in v5.8.0
75
149
 
76
150
  ### CodeGraph MCP v0.8.0 Integration 🔗
@@ -0,0 +1,230 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * musubi-config CLI
5
+ *
6
+ * Manage project configuration (project.yml)
7
+ * - validate: Validate project.yml against schema
8
+ * - migrate: Migrate v1.0 to v2.0
9
+ * - show: Display effective configuration
10
+ */
11
+
12
+ const { Command } = require('commander');
13
+ const { ProjectValidator } = require('../src/validators/project-validator');
14
+ const chalk = require('chalk');
15
+
16
+ const program = new Command();
17
+
18
+ program
19
+ .name('musubi-config')
20
+ .description('MUSUBI Project Configuration Manager')
21
+ .version('1.0.0');
22
+
23
+ program
24
+ .command('validate')
25
+ .description('Validate project.yml against schema')
26
+ .option('-d, --dir <path>', 'Project directory', process.cwd())
27
+ .option('--strict', 'Treat warnings as errors')
28
+ .action(async options => {
29
+ try {
30
+ const validator = new ProjectValidator(options.dir);
31
+ const result = await validator.validateConfig();
32
+
33
+ console.log('\n📋 Project Configuration Validation\n');
34
+ console.log(`Schema Version: ${result.schemaVersion}`);
35
+ console.log(`Valid: ${result.valid ? chalk.green('✓ Yes') : chalk.red('✗ No')}`);
36
+
37
+ if (result.needsMigration) {
38
+ console.log(chalk.yellow('\n⚠️ Migration recommended: v1.0 → v2.0'));
39
+ console.log(' Run: musubi-config migrate');
40
+ }
41
+
42
+ if (result.errors.length > 0) {
43
+ console.log(chalk.red('\n❌ Errors:'));
44
+ result.errors.forEach(err => {
45
+ console.log(` • ${err.path}: ${err.message}`);
46
+ });
47
+ }
48
+
49
+ if (result.warnings.length > 0) {
50
+ console.log(chalk.yellow('\n⚠️ Warnings:'));
51
+ result.warnings.forEach(warn => {
52
+ console.log(` • ${warn.path}: ${warn.message}`);
53
+ });
54
+ }
55
+
56
+ if (result.valid && result.errors.length === 0) {
57
+ console.log(chalk.green('\n✅ Configuration is valid'));
58
+ }
59
+
60
+ const exitCode = result.errors.length > 0 || (options.strict && result.warnings.length > 0) ? 1 : 0;
61
+ process.exit(exitCode);
62
+ } catch (error) {
63
+ console.error(chalk.red(`Error: ${error.message}`));
64
+ process.exit(1);
65
+ }
66
+ });
67
+
68
+ program
69
+ .command('migrate')
70
+ .description('Migrate project.yml from v1.0 to v2.0')
71
+ .option('-d, --dir <path>', 'Project directory', process.cwd())
72
+ .option('--dry-run', 'Show changes without saving')
73
+ .action(async options => {
74
+ try {
75
+ const validator = new ProjectValidator(options.dir);
76
+ const result = await validator.migrateToV2();
77
+
78
+ console.log('\n📦 Project Configuration Migration\n');
79
+
80
+ if (!result.migrated) {
81
+ console.log(chalk.green(result.message));
82
+ return;
83
+ }
84
+
85
+ console.log(chalk.cyan('Migration changes:'));
86
+ console.log(` • schema_version: 1.0 → 2.0`);
87
+ console.log(` • package_type: ${result.config.package_type}`);
88
+ console.log(` • workflow.mode: ${result.config.workflow?.mode}`);
89
+ console.log(` • workflow.auto_detect_mode: ${result.config.workflow?.auto_detect_mode}`);
90
+ console.log(` • constitution section added`);
91
+
92
+ if (options.dryRun) {
93
+ console.log(chalk.yellow('\n[Dry run] No changes saved'));
94
+ } else {
95
+ await validator.saveConfig(result.config);
96
+ console.log(chalk.green('\n✅ Migration complete'));
97
+ console.log(` Backup saved to: steering/project.yml.backup`);
98
+ }
99
+ } catch (error) {
100
+ console.error(chalk.red(`Error: ${error.message}`));
101
+ process.exit(1);
102
+ }
103
+ });
104
+
105
+ program
106
+ .command('show')
107
+ .description('Display effective configuration')
108
+ .option('-d, --dir <path>', 'Project directory', process.cwd())
109
+ .option('--json', 'Output as JSON')
110
+ .action(async options => {
111
+ try {
112
+ const validator = new ProjectValidator(options.dir);
113
+ const report = await validator.generateReport();
114
+
115
+ if (options.json) {
116
+ console.log(JSON.stringify(report, null, 2));
117
+ return;
118
+ }
119
+
120
+ console.log('\n📊 Effective Project Configuration\n');
121
+ console.log(`Project: ${report.projectRoot}`);
122
+ console.log(`Schema Version: ${report.effective.schema_version}`);
123
+ console.log(`Package Type: ${report.effective.package_type}`);
124
+ console.log(`Workflow Mode: ${report.effective.workflow_mode}`);
125
+ console.log(`Coverage Threshold: ${report.effective.coverage_threshold || 80}%`);
126
+
127
+ if (report.effective.constitution_overrides) {
128
+ console.log('\nConstitution Overrides:');
129
+ Object.entries(report.effective.constitution_overrides).forEach(([key, value]) => {
130
+ console.log(` • ${key}: ${JSON.stringify(value)}`);
131
+ });
132
+ }
133
+
134
+ console.log('\nValidation:');
135
+ console.log(` Valid: ${report.validation.valid ? 'Yes' : 'No'}`);
136
+ console.log(` Errors: ${report.validation.errors.length}`);
137
+ console.log(` Warnings: ${report.validation.warnings.length}`);
138
+ } catch (error) {
139
+ console.error(chalk.red(`Error: ${error.message}`));
140
+ process.exit(1);
141
+ }
142
+ });
143
+
144
+ program
145
+ .command('init')
146
+ .description('Create a new project.yml with v2.0 schema')
147
+ .option('-d, --dir <path>', 'Project directory', process.cwd())
148
+ .option('-n, --name <name>', 'Project name')
149
+ .option('-t, --type <type>', 'Package type', 'application')
150
+ .action(async options => {
151
+ try {
152
+ const fs = require('fs-extra');
153
+ const path = require('path');
154
+ const yaml = require('js-yaml');
155
+
156
+ const projectRoot = options.dir;
157
+ const configPath = path.join(projectRoot, 'steering/project.yml');
158
+
159
+ if (await fs.pathExists(configPath)) {
160
+ console.log(chalk.yellow('project.yml already exists. Use "migrate" to upgrade.'));
161
+ return;
162
+ }
163
+
164
+ await fs.ensureDir(path.join(projectRoot, 'steering'));
165
+
166
+ const projectName = options.name || path.basename(projectRoot);
167
+ const config = {
168
+ schema_version: '2.0',
169
+ project_name: projectName,
170
+ description: `${projectName} project`,
171
+ version: '0.1.0',
172
+ package_type: options.type,
173
+ languages: ['javascript'],
174
+ frameworks: [],
175
+ conventions: {
176
+ architecture_pattern: 'unknown',
177
+ directory_structure: {},
178
+ },
179
+ steering: {
180
+ auto_update: { enabled: false, frequency: 'on-demand' },
181
+ excluded_paths: ['node_modules/**', 'dist/**', '.git/**'],
182
+ memories: {
183
+ enabled: true,
184
+ path: 'steering/memories/',
185
+ max_file_size_kb: 500,
186
+ retention_days: 365,
187
+ },
188
+ },
189
+ agents: {
190
+ default_language: 'en',
191
+ bilingual_output: { enabled: false, languages: ['en'] },
192
+ output: {
193
+ gradual_generation: true,
194
+ progress_indicators: true,
195
+ large_file_splitting: false,
196
+ split_threshold_lines: 300,
197
+ },
198
+ },
199
+ workflow: {
200
+ mode: 'medium',
201
+ auto_detect_mode: true,
202
+ testing: {
203
+ required: true,
204
+ coverage_threshold: 80,
205
+ },
206
+ quality_gates: [],
207
+ },
208
+ constitution: {
209
+ level_config: 'steering/rules/constitution-levels.yml',
210
+ overrides: {},
211
+ },
212
+ custom_rules: [],
213
+ metadata: {
214
+ created_at: new Date().toISOString(),
215
+ musubi_version: require('../package.json').version,
216
+ },
217
+ };
218
+
219
+ await fs.writeFile(configPath, yaml.dump(config, { indent: 2 }), 'utf8');
220
+
221
+ console.log(chalk.green('\n✅ Created steering/project.yml (v2.0 schema)'));
222
+ console.log(` Project: ${projectName}`);
223
+ console.log(` Type: ${options.type}`);
224
+ } catch (error) {
225
+ console.error(chalk.red(`Error: ${error.message}`));
226
+ process.exit(1);
227
+ }
228
+ });
229
+
230
+ program.parse();
@@ -30,6 +30,7 @@ const {
30
30
  TriageCategory,
31
31
  TriageStrategy,
32
32
  AgentCapability,
33
+ getBuiltInSkills,
33
34
  } = require('../src/orchestration');
34
35
 
35
36
  const {
@@ -145,6 +146,21 @@ async function loadSkills(projectPath) {
145
146
  }
146
147
  }
147
148
 
149
+ // Add built-in Phase 1-4 skills
150
+ const builtInSkills = getBuiltInSkills();
151
+ for (const skill of builtInSkills) {
152
+ skills.set(skill.id, {
153
+ name: skill.name,
154
+ description: skill.description,
155
+ keywords: skill.tags || [],
156
+ categories: [skill.category],
157
+ execute: skill.execute,
158
+ version: skill.version,
159
+ inputs: skill.inputs,
160
+ outputs: skill.outputs,
161
+ });
162
+ }
163
+
148
164
  return skills;
149
165
  }
150
166