musubi-sdd 0.1.3 → 0.1.6

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 (102) hide show
  1. package/README.md +38 -1
  2. package/bin/musubi-init.js +97 -37
  3. package/bin/musubi.js +36 -14
  4. package/package.json +3 -2
  5. package/src/agents/registry.js +36 -29
  6. package/src/templates/agents/claude-code/CLAUDE.md +13 -0
  7. package/src/templates/agents/claude-code/commands/sdd-change-apply.md +59 -30
  8. package/src/templates/agents/claude-code/commands/sdd-change-archive.md +68 -11
  9. package/src/templates/agents/claude-code/commands/sdd-change-init.md +95 -30
  10. package/src/templates/agents/claude-code/commands/sdd-design.md +115 -54
  11. package/src/templates/agents/claude-code/commands/sdd-implement.md +33 -1
  12. package/src/templates/agents/claude-code/commands/sdd-requirements.md +59 -8
  13. package/src/templates/agents/claude-code/commands/sdd-steering.md +22 -0
  14. package/src/templates/agents/claude-code/commands/sdd-tasks.md +54 -19
  15. package/src/templates/agents/claude-code/commands/sdd-validate.md +82 -10
  16. package/src/templates/agents/claude-code/skills/ai-ml-engineer/SKILL.md +121 -53
  17. package/src/templates/agents/claude-code/skills/api-designer/SKILL.md +61 -11
  18. package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +20 -2
  19. package/src/templates/agents/claude-code/skills/change-impact-analyzer/SKILL.md +53 -8
  20. package/src/templates/agents/claude-code/skills/cloud-architect/SKILL.md +72 -20
  21. package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +55 -14
  22. package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +52 -11
  23. package/src/templates/agents/claude-code/skills/database-administrator/SKILL.md +958 -653
  24. package/src/templates/agents/claude-code/skills/database-schema-designer/SKILL.md +72 -14
  25. package/src/templates/agents/claude-code/skills/devops-engineer/SKILL.md +25 -2
  26. package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +86 -63
  27. package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +17 -2
  28. package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +44 -4
  29. package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +46 -2
  30. package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +74 -11
  31. package/src/templates/agents/claude-code/skills/requirements-analyst/SKILL.md +125 -19
  32. package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +45 -2
  33. package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +51 -14
  34. package/src/templates/agents/claude-code/skills/software-developer/SKILL.md +81 -35
  35. package/src/templates/agents/claude-code/skills/steering/SKILL.md +30 -4
  36. package/src/templates/agents/claude-code/skills/system-architect/SKILL.md +125 -39
  37. package/src/templates/agents/claude-code/skills/technical-writer/SKILL.md +27 -2
  38. package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +72 -38
  39. package/src/templates/agents/claude-code/skills/traceability-auditor/SKILL.md +32 -11
  40. package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +214 -137
  41. package/src/templates/agents/codex/AGENTS.md +3 -0
  42. package/src/templates/agents/codex/commands/sdd-change-apply.md +59 -30
  43. package/src/templates/agents/codex/commands/sdd-change-archive.md +68 -11
  44. package/src/templates/agents/codex/commands/sdd-change-init.md +95 -30
  45. package/src/templates/agents/codex/commands/sdd-design.md +115 -54
  46. package/src/templates/agents/codex/commands/sdd-implement.md +33 -1
  47. package/src/templates/agents/codex/commands/sdd-requirements.md +59 -8
  48. package/src/templates/agents/codex/commands/sdd-steering.md +22 -0
  49. package/src/templates/agents/codex/commands/sdd-tasks.md +54 -19
  50. package/src/templates/agents/codex/commands/sdd-validate.md +82 -10
  51. package/src/templates/agents/cursor/AGENTS.md +3 -0
  52. package/src/templates/agents/cursor/commands/sdd-change-apply.md +59 -30
  53. package/src/templates/agents/cursor/commands/sdd-change-archive.md +68 -11
  54. package/src/templates/agents/cursor/commands/sdd-change-init.md +95 -30
  55. package/src/templates/agents/cursor/commands/sdd-design.md +115 -54
  56. package/src/templates/agents/cursor/commands/sdd-implement.md +33 -1
  57. package/src/templates/agents/cursor/commands/sdd-requirements.md +59 -8
  58. package/src/templates/agents/cursor/commands/sdd-steering.md +22 -0
  59. package/src/templates/agents/cursor/commands/sdd-tasks.md +54 -19
  60. package/src/templates/agents/cursor/commands/sdd-validate.md +82 -10
  61. package/src/templates/agents/gemini-cli/GEMINI.md +2 -0
  62. package/src/templates/agents/github-copilot/AGENTS.md +3 -0
  63. package/src/templates/agents/github-copilot/commands/sdd-change-apply.md +59 -30
  64. package/src/templates/agents/github-copilot/commands/sdd-change-archive.md +68 -11
  65. package/src/templates/agents/github-copilot/commands/sdd-change-init.md +95 -30
  66. package/src/templates/agents/github-copilot/commands/sdd-design.md +115 -54
  67. package/src/templates/agents/github-copilot/commands/sdd-implement.md +33 -1
  68. package/src/templates/agents/github-copilot/commands/sdd-requirements.md +59 -8
  69. package/src/templates/agents/github-copilot/commands/sdd-steering.md +22 -0
  70. package/src/templates/agents/github-copilot/commands/sdd-tasks.md +54 -19
  71. package/src/templates/agents/github-copilot/commands/sdd-validate.md +82 -10
  72. package/src/templates/agents/qwen-code/QWEN.md +2 -0
  73. package/src/templates/agents/qwen-code/commands/sdd-change-apply.md +59 -30
  74. package/src/templates/agents/qwen-code/commands/sdd-change-archive.md +68 -11
  75. package/src/templates/agents/qwen-code/commands/sdd-change-init.md +95 -30
  76. package/src/templates/agents/qwen-code/commands/sdd-design.md +115 -54
  77. package/src/templates/agents/qwen-code/commands/sdd-implement.md +33 -1
  78. package/src/templates/agents/qwen-code/commands/sdd-requirements.md +59 -8
  79. package/src/templates/agents/qwen-code/commands/sdd-steering.md +22 -0
  80. package/src/templates/agents/qwen-code/commands/sdd-tasks.md +54 -19
  81. package/src/templates/agents/qwen-code/commands/sdd-validate.md +82 -10
  82. package/src/templates/agents/shared/AGENTS.md +65 -10
  83. package/src/templates/agents/windsurf/AGENTS.md +3 -0
  84. package/src/templates/agents/windsurf/commands/sdd-change-apply.md +59 -30
  85. package/src/templates/agents/windsurf/commands/sdd-change-archive.md +68 -11
  86. package/src/templates/agents/windsurf/commands/sdd-change-init.md +95 -30
  87. package/src/templates/agents/windsurf/commands/sdd-design.md +115 -54
  88. package/src/templates/agents/windsurf/commands/sdd-implement.md +33 -1
  89. package/src/templates/agents/windsurf/commands/sdd-requirements.md +59 -8
  90. package/src/templates/agents/windsurf/commands/sdd-steering.md +22 -0
  91. package/src/templates/agents/windsurf/commands/sdd-tasks.md +54 -19
  92. package/src/templates/agents/windsurf/commands/sdd-validate.md +82 -10
  93. package/src/templates/shared/constitution/constitution.md +27 -23
  94. package/src/templates/shared/constitution/ears-format.md +71 -8
  95. package/src/templates/shared/constitution/workflow.md +14 -10
  96. package/src/templates/shared/documents/design.md +66 -30
  97. package/src/templates/shared/documents/requirements.md +53 -24
  98. package/src/templates/shared/documents/research.md +83 -62
  99. package/src/templates/shared/documents/tasks.md +84 -23
  100. package/src/templates/shared/steering/product.md +83 -55
  101. package/src/templates/shared/steering/structure.md +4 -1
  102. package/src/templates/shared/steering/tech.md +154 -151
package/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # MUSUBI
2
2
 
3
+ [![CI](https://github.com/nahisaho/musubi/actions/workflows/ci.yml/badge.svg)](https://github.com/nahisaho/musubi/actions/workflows/ci.yml)
4
+ [![npm version](https://badge.fury.io/js/musubi-sdd.svg)](https://www.npmjs.com/package/musubi-sdd)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+
3
7
  **Ultimate Specification Driven Development Tool for 7 AI Coding Agents**
4
8
 
5
9
  MUSUBI is a comprehensive SDD (Specification Driven Development) framework that synthesizes the best features from 6 leading frameworks into a production-ready tool for multiple AI coding agents.
@@ -566,9 +570,36 @@ steering/rules/constitution.md
566
570
 
567
571
  ## Development
568
572
 
573
+ ### Contributing Workflow
574
+
575
+ 1. Fork the repository
576
+ 2. Create a feature branch: `git checkout -b feature/your-feature`
577
+ 3. Make your changes
578
+ 4. Run tests locally: `npm test`
579
+ 5. Run lint: `npm run lint`
580
+ 6. Commit with conventional commits: `git commit -m "feat: add new feature"`
581
+ 7. Push to your fork: `git push origin feature/your-feature`
582
+ 8. Create a Pull Request
583
+ 9. Wait for CI checks to pass (all checks must succeed)
584
+ 10. Request review
585
+ 11. Merge after approval
586
+
587
+ ### CI/CD Pipeline
588
+
589
+ - **CI**: Runs on every PR and push to `main`
590
+ - ESLint & Prettier
591
+ - Jest Tests (80% coverage required)
592
+ - Build Verification
593
+ - Security Audit
594
+ - Platform Initialization Tests (7 platforms)
595
+ - **Release**: Automated npm publish on version tags (`v*.*.*`)
596
+ - **Dependabot**: Weekly dependency updates (Mondays 9:00 JST)
597
+
598
+ ### Local Testing
599
+
569
600
  ```bash
570
601
  # Clone repository
571
- git clone https://github.com/your-org/musubi.git
602
+ git clone https://github.com/nahisaho/musubi.git
572
603
  cd musubi
573
604
 
574
605
  # Install dependencies
@@ -577,6 +608,12 @@ npm install
577
608
  # Run tests
578
609
  npm test
579
610
 
611
+ # Run lint
612
+ npm run lint
613
+
614
+ # Check formatting
615
+ npm run format:check
616
+
580
617
  # Link for local development
581
618
  npm link
582
619
  musubi init
@@ -34,7 +34,7 @@ const AGENTS_TEMPLATE_DIR = path.join(TEMPLATE_DIR, 'agents');
34
34
  async function main(agent, agentKey) {
35
35
  // Dynamic import for inquirer (ESM module)
36
36
  const inquirer = await import('inquirer');
37
-
37
+
38
38
  // If called directly without agent parameter, default to Claude Code
39
39
  if (!agent) {
40
40
  const { getAgentDefinition } = require('../src/agents/registry');
@@ -53,8 +53,8 @@ async function main(agent, agentKey) {
53
53
  type: 'confirm',
54
54
  name: 'overwrite',
55
55
  message: `MUSUBI for ${agent.label} is already initialized. Overwrite?`,
56
- default: false
57
- }
56
+ default: false,
57
+ },
58
58
  ]);
59
59
 
60
60
  if (!overwrite) {
@@ -69,38 +69,66 @@ async function main(agent, agentKey) {
69
69
  type: 'input',
70
70
  name: 'projectName',
71
71
  message: 'Project name:',
72
- default: path.basename(process.cwd())
72
+ default: path.basename(process.cwd()),
73
73
  },
74
74
  {
75
75
  type: 'input',
76
76
  name: 'description',
77
77
  message: 'Project description:',
78
- default: 'A software project using MUSUBI SDD'
78
+ default: 'A software project using MUSUBI SDD',
79
79
  },
80
80
  {
81
81
  type: 'list',
82
82
  name: 'projectType',
83
83
  message: 'Project type:',
84
- choices: ['Greenfield (0→1)', 'Brownfield (1→n)', 'Both']
85
- }
84
+ choices: ['Greenfield (0→1)', 'Brownfield (1→n)', 'Both'],
85
+ },
86
86
  ];
87
87
 
88
88
  // Skills selection is only for Claude Code (Skills API exclusive)
89
- if (agent.features.hasSkills) {
89
+ if (agentKey === 'claude-code' && agent.layout.skillsDir) {
90
90
  prompts.push({
91
91
  type: 'checkbox',
92
92
  name: 'skills',
93
93
  message: 'Select skills to install (all recommended):',
94
94
  choices: [
95
- { name: 'Core (orchestrator, steering, constitution-enforcer)', value: 'core', checked: true },
96
- { name: 'Requirements & Planning (requirements-analyst, project-manager, change-impact-analyzer)', value: 'requirements', checked: true },
97
- { name: 'Architecture & Design (system-architect, api-designer, database-schema-designer, ui-ux-designer)', value: 'architecture', checked: true },
95
+ {
96
+ name: 'Core (orchestrator, steering, constitution-enforcer)',
97
+ value: 'core',
98
+ checked: true,
99
+ },
100
+ {
101
+ name: 'Requirements & Planning (requirements-analyst, project-manager, change-impact-analyzer)',
102
+ value: 'requirements',
103
+ checked: true,
104
+ },
105
+ {
106
+ name: 'Architecture & Design (system-architect, api-designer, database-schema-designer, ui-ux-designer)',
107
+ value: 'architecture',
108
+ checked: true,
109
+ },
98
110
  { name: 'Development (software-developer)', value: 'development', checked: true },
99
- { name: 'Quality & Review (test-engineer, code-reviewer, bug-hunter, quality-assurance, traceability-auditor)', value: 'quality', checked: true },
100
- { name: 'Security & Performance (security-auditor, performance-optimizer)', value: 'security', checked: true },
101
- { name: 'Infrastructure (devops-engineer, cloud-architect, database-administrator, site-reliability-engineer, release-coordinator)', value: 'infrastructure', checked: true },
102
- { name: 'Documentation (technical-writer, ai-ml-engineer)', value: 'documentation', checked: true }
103
- ]
111
+ {
112
+ name: 'Quality & Review (test-engineer, code-reviewer, bug-hunter, quality-assurance, traceability-auditor)',
113
+ value: 'quality',
114
+ checked: true,
115
+ },
116
+ {
117
+ name: 'Security & Performance (security-auditor, performance-optimizer)',
118
+ value: 'security',
119
+ checked: true,
120
+ },
121
+ {
122
+ name: 'Infrastructure (devops-engineer, cloud-architect, database-administrator, site-reliability-engineer, release-coordinator)',
123
+ value: 'infrastructure',
124
+ checked: true,
125
+ },
126
+ {
127
+ name: 'Documentation (technical-writer, ai-ml-engineer)',
128
+ value: 'documentation',
129
+ checked: true,
130
+ },
131
+ ],
104
132
  });
105
133
  }
106
134
 
@@ -109,13 +137,13 @@ async function main(agent, agentKey) {
109
137
  type: 'confirm',
110
138
  name: 'createSteering',
111
139
  message: 'Generate initial steering context?',
112
- default: true
140
+ default: true,
113
141
  },
114
142
  {
115
143
  type: 'confirm',
116
144
  name: 'createConstitution',
117
145
  message: 'Create constitutional governance?',
118
- default: true
146
+ default: true,
119
147
  }
120
148
  );
121
149
 
@@ -130,7 +158,7 @@ async function main(agent, agentKey) {
130
158
  'templates',
131
159
  'storage/specs',
132
160
  'storage/changes',
133
- 'storage/features'
161
+ 'storage/features',
134
162
  ];
135
163
 
136
164
  // Add agent-specific directories
@@ -149,17 +177,34 @@ async function main(agent, agentKey) {
149
177
  console.log(chalk.gray(` Created ${dir}/`));
150
178
  }
151
179
 
152
- // Install skills (Claude Code only)
153
- if (agent.features.hasSkills && answers.skills) {
180
+ // Install skills (Claude Code only - Skills API)
181
+ if (agentKey === 'claude-code' && agent.layout.skillsDir && answers.skills) {
154
182
  const skillGroups = {
155
183
  core: ['orchestrator', 'steering', 'constitution-enforcer'],
156
184
  requirements: ['requirements-analyst', 'project-manager', 'change-impact-analyzer'],
157
- architecture: ['system-architect', 'api-designer', 'database-schema-designer', 'ui-ux-designer'],
185
+ architecture: [
186
+ 'system-architect',
187
+ 'api-designer',
188
+ 'database-schema-designer',
189
+ 'ui-ux-designer',
190
+ ],
158
191
  development: ['software-developer'],
159
- quality: ['test-engineer', 'code-reviewer', 'bug-hunter', 'quality-assurance', 'traceability-auditor'],
192
+ quality: [
193
+ 'test-engineer',
194
+ 'code-reviewer',
195
+ 'bug-hunter',
196
+ 'quality-assurance',
197
+ 'traceability-auditor',
198
+ ],
160
199
  security: ['security-auditor', 'performance-optimizer'],
161
- infrastructure: ['devops-engineer', 'cloud-architect', 'database-administrator', 'site-reliability-engineer', 'release-coordinator'],
162
- documentation: ['technical-writer', 'ai-ml-engineer']
200
+ infrastructure: [
201
+ 'devops-engineer',
202
+ 'cloud-architect',
203
+ 'database-administrator',
204
+ 'site-reliability-engineer',
205
+ 'release-coordinator',
206
+ ],
207
+ documentation: ['technical-writer', 'ai-ml-engineer'],
163
208
  };
164
209
 
165
210
  let skillCount = 0;
@@ -176,8 +221,12 @@ async function main(agent, agentKey) {
176
221
  // Install commands/prompts/workflows
177
222
  if (agent.features.hasCommands) {
178
223
  await copyCommands(agent, agentKey);
179
- const commandType = agentKey === 'github-copilot' || agentKey === 'codex' ? 'prompts' :
180
- agentKey === 'windsurf' ? 'workflows' : 'commands';
224
+ const commandType =
225
+ agentKey === 'github-copilot' || agentKey === 'codex'
226
+ ? 'prompts'
227
+ : agentKey === 'windsurf'
228
+ ? 'workflows'
229
+ : 'commands';
181
230
  console.log(chalk.green(` Installed ${commandType}`));
182
231
  }
183
232
 
@@ -221,6 +270,11 @@ async function main(agent, agentKey) {
221
270
  }
222
271
 
223
272
  async function copySkill(skillName, agent) {
273
+ // Only Claude Code has skillsDir (Skills API)
274
+ if (!agent.layout.skillsDir) {
275
+ return; // Skip for agents without Skills API support
276
+ }
277
+
224
278
  const srcDir = path.join(AGENTS_TEMPLATE_DIR, 'claude-code', 'skills', skillName);
225
279
  const destDir = path.join(agent.layout.skillsDir, skillName);
226
280
  await fs.copy(srcDir, destDir);
@@ -247,18 +301,19 @@ async function copyAgentsFile(agent) {
247
301
  if (destFile === 'GEMINI.md') {
248
302
  // Read shared AGENTS.md
249
303
  const agentsContent = await fs.readFile(sharedAgentsFile, 'utf8');
250
-
304
+
251
305
  // Read existing GEMINI.md template if exists
252
306
  const geminiTemplate = path.join(AGENTS_TEMPLATE_DIR, 'gemini-cli', 'GEMINI.md');
253
307
  let geminiContent = '';
254
308
  if (fs.existsSync(geminiTemplate)) {
255
309
  geminiContent = await fs.readFile(geminiTemplate, 'utf8');
256
310
  } else {
257
- geminiContent = `# Gemini CLI - MUSUBI Configuration\n\n` +
258
- `This file configures Gemini CLI for MUSUBI SDD.\n\n` +
259
- `---\n\n`;
311
+ geminiContent =
312
+ '# Gemini CLI - MUSUBI Configuration\n\n' +
313
+ 'This file configures Gemini CLI for MUSUBI SDD.\n\n' +
314
+ '---\n\n';
260
315
  }
261
-
316
+
262
317
  // Append AGENTS.md content
263
318
  geminiContent += agentsContent;
264
319
  await fs.writeFile(destFile, geminiContent);
@@ -291,20 +346,25 @@ async function createConstitution() {
291
346
  }
292
347
 
293
348
  async function createReadme(answers, agent, agentKey) {
294
- const skillsSection = agent.features.hasSkills && answers.skills
295
- ? `This project uses **MUSUBI** (Ultimate Specification Driven Development) with ${answers.skills.length} skill groups.
349
+ const skillsSection =
350
+ agent.features.hasSkills && answers.skills
351
+ ? `This project uses **MUSUBI** (Ultimate Specification Driven Development) with ${answers.skills.length} skill groups.
296
352
 
297
353
  ### Available Skills
298
354
 
299
355
  Check \`${agent.layout.skillsDir}/\` directory for all installed skills.
300
356
 
301
357
  `
302
- : `This project uses **MUSUBI** (Ultimate Specification Driven Development).
358
+ : `This project uses **MUSUBI** (Ultimate Specification Driven Development).
303
359
 
304
360
  `;
305
361
 
306
- const commandType = agentKey === 'github-copilot' || agentKey === 'codex' ? 'Prompts' :
307
- agentKey === 'windsurf' ? 'Workflows' : 'Commands';
362
+ const commandType =
363
+ agentKey === 'github-copilot' || agentKey === 'codex'
364
+ ? 'Prompts'
365
+ : agentKey === 'windsurf'
366
+ ? 'Workflows'
367
+ : 'Commands';
308
368
 
309
369
  const readme = `# MUSUBI - ${answers.projectName}
310
370
 
package/bin/musubi.js CHANGED
@@ -14,7 +14,11 @@ const { Command } = require('commander');
14
14
  const chalk = require('chalk');
15
15
  const fs = require('fs-extra');
16
16
  const path = require('path');
17
- const { detectAgentFromFlags, getAgentDefinition, getAllAliasFlags } = require('../src/agents/registry');
17
+ const {
18
+ detectAgentFromFlags,
19
+ getAgentDefinition,
20
+ getAllAliasFlags,
21
+ } = require('../src/agents/registry');
18
22
 
19
23
  const program = new Command();
20
24
 
@@ -29,9 +33,7 @@ program
29
33
  // ============================================================================
30
34
  // Command: init
31
35
  // ============================================================================
32
- const initCommand = program
33
- .command('init')
34
- .description('Initialize MUSUBI in current project');
36
+ const initCommand = program.command('init').description('Initialize MUSUBI in current project');
35
37
 
36
38
  // Add all agent selection flags dynamically
37
39
  const aliasFlags = getAllAliasFlags();
@@ -39,7 +41,7 @@ aliasFlags.forEach(flag => {
39
41
  initCommand.option(`--${flag}`, `Select agent: ${flag}`);
40
42
  });
41
43
 
42
- initCommand.action((options) => {
44
+ initCommand.action(async options => {
43
45
  const agentKey = detectAgentFromFlags(options);
44
46
  const agent = getAgentDefinition(agentKey);
45
47
 
@@ -47,7 +49,8 @@ initCommand.action((options) => {
47
49
  console.log(chalk.gray(`Description: ${agent.description}\n`));
48
50
 
49
51
  // Delegate to musubi-init.js with agent info
50
- require('./musubi-init.js')(agent, agentKey);
52
+ const initMain = require('./musubi-init.js');
53
+ await initMain(agent, agentKey);
51
54
  });
52
55
 
53
56
  // ============================================================================
@@ -77,7 +80,7 @@ program
77
80
  if (fs.existsSync(skillsDir)) {
78
81
  const skills = fs.readdirSync(skillsDir);
79
82
  console.log(chalk.white(`📁 Claude Code Skills: ${skills.length} installed`));
80
- console.log(chalk.gray(` Location: .claude/skills/\n`));
83
+ console.log(chalk.gray(' Location: .claude/skills/\n'));
81
84
  }
82
85
 
83
86
  // Check steering files
@@ -201,7 +204,8 @@ program
201
204
  console.log(chalk.white('\nArticle IV: EARS Requirements Format'));
202
205
  const specsDir = path.join(cwd, 'storage', 'specs');
203
206
  if (fs.existsSync(specsDir)) {
204
- const requirementFiles = fs.readdirSync(specsDir)
207
+ const requirementFiles = fs
208
+ .readdirSync(specsDir)
205
209
  .filter(f => f.includes('requirements') && f.endsWith('.md'));
206
210
 
207
211
  if (requirementFiles.length > 0) {
@@ -223,9 +227,13 @@ program
223
227
  });
224
228
 
225
229
  if (earsCompliant === requirementFiles.length) {
226
- console.log(chalk.green(` ✅ All requirements use EARS format`));
230
+ console.log(chalk.green(' ✅ All requirements use EARS format'));
227
231
  } else {
228
- console.log(chalk.yellow(` ⚠️ ${earsCompliant}/${requirementFiles.length} documents have EARS patterns`));
232
+ console.log(
233
+ chalk.yellow(
234
+ ` ⚠️ ${earsCompliant}/${requirementFiles.length} documents have EARS patterns`
235
+ )
236
+ );
229
237
  }
230
238
  } else {
231
239
  console.log(chalk.gray(' ℹ️ No requirements documents found'));
@@ -299,12 +307,26 @@ program
299
307
 
300
308
  console.log(chalk.white('25 Claude Code Skills:'));
301
309
  console.log(chalk.gray(' Orchestration: orchestrator, steering, constitution-enforcer'));
302
- console.log(chalk.gray(' Requirements: requirements-analyst, project-manager, change-impact-analyzer'));
303
- console.log(chalk.gray(' Architecture: system-architect, api-designer, database-schema-designer, ui-ux-designer'));
310
+ console.log(
311
+ chalk.gray(' Requirements: requirements-analyst, project-manager, change-impact-analyzer')
312
+ );
313
+ console.log(
314
+ chalk.gray(
315
+ ' Architecture: system-architect, api-designer, database-schema-designer, ui-ux-designer'
316
+ )
317
+ );
304
318
  console.log(chalk.gray(' Development: software-developer'));
305
- console.log(chalk.gray(' Quality: test-engineer, code-reviewer, bug-hunter, quality-assurance, traceability-auditor'));
319
+ console.log(
320
+ chalk.gray(
321
+ ' Quality: test-engineer, code-reviewer, bug-hunter, quality-assurance, traceability-auditor'
322
+ )
323
+ );
306
324
  console.log(chalk.gray(' Security: security-auditor, performance-optimizer'));
307
- console.log(chalk.gray(' Infrastructure: devops-engineer, cloud-architect, database-administrator, site-reliability-engineer, release-coordinator'));
325
+ console.log(
326
+ chalk.gray(
327
+ ' Infrastructure: devops-engineer, cloud-architect, database-administrator, site-reliability-engineer, release-coordinator'
328
+ )
329
+ );
308
330
  console.log(chalk.gray(' Documentation: technical-writer, ai-ml-engineer\n'));
309
331
  });
310
332
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "musubi-sdd",
3
- "version": "0.1.3",
3
+ "version": "0.1.6",
4
4
  "description": "Ultimate Specification Driven Development Tool with 25 Agents for 7 AI Coding Platforms (Claude Code, GitHub Copilot, Cursor, Gemini CLI, Windsurf, Codex, Qwen Code)",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -14,7 +14,8 @@
14
14
  "test:coverage": "jest --coverage",
15
15
  "lint": "eslint bin/ src/ tests/",
16
16
  "lint:fix": "eslint bin/ src/ tests/ --fix",
17
- "format": "prettier --write bin/ src/ tests/"
17
+ "format": "prettier --write bin/ src/ tests/",
18
+ "format:check": "prettier --check 'bin/**/*.js' 'src/**/*.js' 'tests/**/*.js'"
18
19
  },
19
20
  "keywords": [
20
21
  "specification-driven-development",
@@ -8,15 +8,16 @@
8
8
  const agentDefinitions = {
9
9
  'claude-code': {
10
10
  label: 'Claude Code',
11
- description: 'Installs MUSUBI skills in `.claude/skills/`, commands in `.claude/commands/`, agents in `CLAUDE.md`, and steering in `steering/`',
11
+ description:
12
+ 'Installs MUSUBI skills in `.claude/skills/`, commands in `.claude/commands/`, agents in `CLAUDE.md`, and steering in `steering/`',
12
13
  aliasFlags: ['--claude-code', '--claude'],
13
14
  recommendedModels: ['Claude Sonnet 4.5 or newer'],
14
15
  layout: {
15
- skillsDir: '.claude/skills', // MUSUBI-specific: 25 skills (Skills API)
16
+ skillsDir: '.claude/skills', // MUSUBI-specific: 25 skills (Skills API)
16
17
  commandsDir: '.claude/commands',
17
18
  agentDir: '.claude',
18
19
  docFile: 'CLAUDE.md',
19
- agentsFile: '.claude/AGENTS.md', // 25 agents definition (shared format)
20
+ agentsFile: '.claude/AGENTS.md', // 25 agents definition (shared format)
20
21
  },
21
22
  commands: {
22
23
  steering: '/sdd-steering',
@@ -27,20 +28,21 @@ const agentDefinitions = {
27
28
  validate: '/sdd-validate <feature>',
28
29
  },
29
30
  features: {
30
- hasSkills: true, // Claude Code supports Skills API
31
+ hasSkills: true, // Claude Code supports Skills API
31
32
  hasCommands: true,
32
33
  commandPrefix: '/',
33
34
  },
34
35
  },
35
36
  'github-copilot': {
36
37
  label: 'GitHub Copilot',
37
- description: 'Installs MUSUBI prompts in `.github/prompts/`, agents in `.github/AGENTS.md`, and steering in `steering/`',
38
+ description:
39
+ 'Installs MUSUBI prompts in `.github/prompts/`, agents in `.github/AGENTS.md`, and steering in `steering/`',
38
40
  aliasFlags: ['--copilot', '--github-copilot'],
39
41
  recommendedModels: ['Claude Sonnet 4.5 or newer', 'GPT-4'],
40
42
  layout: {
41
43
  commandsDir: '.github/prompts',
42
44
  agentDir: '.github',
43
- docFile: 'AGENTS.md', // Main doc file
45
+ docFile: 'AGENTS.md', // Main doc file
44
46
  agentsFile: '.github/AGENTS.md', // 25 agents definition
45
47
  },
46
48
  commands: {
@@ -52,20 +54,21 @@ const agentDefinitions = {
52
54
  validate: '#sdd-validate <feature>',
53
55
  },
54
56
  features: {
55
- hasSkills: true, // AGENTS.md provides 25 agents
57
+ hasSkills: true, // AGENTS.md provides 25 agents
56
58
  hasCommands: true,
57
59
  commandPrefix: '#',
58
60
  },
59
61
  },
60
- 'cursor': {
62
+ cursor: {
61
63
  label: 'Cursor IDE',
62
- description: 'Installs MUSUBI commands in `.cursor/commands/`, agents in `.cursor/AGENTS.md`, and steering in `steering/`',
64
+ description:
65
+ 'Installs MUSUBI commands in `.cursor/commands/`, agents in `.cursor/AGENTS.md`, and steering in `steering/`',
63
66
  aliasFlags: ['--cursor'],
64
67
  recommendedModels: ['Claude Sonnet 4.5 or newer', 'GPT-4'],
65
68
  layout: {
66
69
  commandsDir: '.cursor/commands',
67
70
  agentDir: '.cursor',
68
- docFile: 'AGENTS.md', // Main doc file
71
+ docFile: 'AGENTS.md', // Main doc file
69
72
  agentsFile: '.cursor/AGENTS.md', // 25 agents definition
70
73
  },
71
74
  commands: {
@@ -77,21 +80,22 @@ const agentDefinitions = {
77
80
  validate: '/sdd-validate <feature>',
78
81
  },
79
82
  features: {
80
- hasSkills: true, // AGENTS.md provides 25 agents
83
+ hasSkills: true, // AGENTS.md provides 25 agents
81
84
  hasCommands: true,
82
85
  commandPrefix: '/',
83
86
  },
84
87
  },
85
88
  'gemini-cli': {
86
89
  label: 'Gemini CLI',
87
- description: 'Installs MUSUBI commands in `.gemini/commands/` (TOML format), agents in `GEMINI.md`, and steering in `steering/`',
90
+ description:
91
+ 'Installs MUSUBI commands in `.gemini/commands/` (TOML format), agents in `GEMINI.md`, and steering in `steering/`',
88
92
  aliasFlags: ['--gemini-cli', '--gemini'],
89
93
  recommendedModels: ['Gemini 2.0 Flash or newer'],
90
94
  layout: {
91
95
  commandsDir: '.gemini/commands',
92
96
  agentDir: '.gemini',
93
97
  docFile: 'GEMINI.md',
94
- agentsFile: 'GEMINI.md', // Agents embedded in GEMINI.md
98
+ agentsFile: 'GEMINI.md', // Agents embedded in GEMINI.md
95
99
  },
96
100
  commands: {
97
101
  steering: '/sdd-steering',
@@ -102,22 +106,23 @@ const agentDefinitions = {
102
106
  validate: '/sdd-validate <feature>',
103
107
  },
104
108
  features: {
105
- hasSkills: true, // GEMINI.md provides 25 agents
109
+ hasSkills: true, // GEMINI.md provides 25 agents
106
110
  hasCommands: true,
107
111
  commandPrefix: '/',
108
- commandFormat: 'toml', // Unique: Gemini uses TOML instead of Markdown
112
+ commandFormat: 'toml', // Unique: Gemini uses TOML instead of Markdown
109
113
  },
110
114
  },
111
- 'codex': {
115
+ codex: {
112
116
  label: 'Codex CLI',
113
- description: 'Installs MUSUBI prompts in `.codex/prompts/`, agents in `.codex/AGENTS.md`, and steering in `steering/`',
117
+ description:
118
+ 'Installs MUSUBI prompts in `.codex/prompts/`, agents in `.codex/AGENTS.md`, and steering in `steering/`',
114
119
  aliasFlags: ['--codex', '--codex-cli'],
115
120
  recommendedModels: ['GPT-4 or newer'],
116
121
  layout: {
117
122
  commandsDir: '.codex/prompts',
118
123
  agentDir: '.codex',
119
- docFile: 'AGENTS.md', // Main doc file
120
- agentsFile: '.codex/AGENTS.md', // 25 agents definition
124
+ docFile: 'AGENTS.md', // Main doc file
125
+ agentsFile: '.codex/AGENTS.md', // 25 agents definition
121
126
  },
122
127
  commands: {
123
128
  steering: '/prompts:sdd-steering',
@@ -128,21 +133,22 @@ const agentDefinitions = {
128
133
  validate: '/prompts:sdd-validate <feature>',
129
134
  },
130
135
  features: {
131
- hasSkills: true, // AGENTS.md provides 25 agents
136
+ hasSkills: true, // AGENTS.md provides 25 agents
132
137
  hasCommands: true,
133
138
  commandPrefix: '/prompts:',
134
139
  },
135
140
  },
136
141
  'qwen-code': {
137
142
  label: 'Qwen Code',
138
- description: 'Installs MUSUBI commands in `.qwen/commands/`, agents in `.qwen/AGENTS.md`, and steering in `steering/`',
143
+ description:
144
+ 'Installs MUSUBI commands in `.qwen/commands/`, agents in `.qwen/AGENTS.md`, and steering in `steering/`',
139
145
  aliasFlags: ['--qwen-code', '--qwen'],
140
146
  recommendedModels: ['Qwen 2.5 Coder or newer'],
141
147
  layout: {
142
148
  commandsDir: '.qwen/commands',
143
149
  agentDir: '.qwen',
144
150
  docFile: 'QWEN.md',
145
- agentsFile: '.qwen/AGENTS.md', // 25 agents definition
151
+ agentsFile: '.qwen/AGENTS.md', // 25 agents definition
146
152
  },
147
153
  commands: {
148
154
  steering: '/sdd-steering',
@@ -153,21 +159,22 @@ const agentDefinitions = {
153
159
  validate: '/sdd-validate <feature>',
154
160
  },
155
161
  features: {
156
- hasSkills: true, // AGENTS.md provides 25 agents
162
+ hasSkills: true, // AGENTS.md provides 25 agents
157
163
  hasCommands: true,
158
164
  commandPrefix: '/',
159
165
  },
160
166
  },
161
- 'windsurf': {
167
+ windsurf: {
162
168
  label: 'Windsurf IDE',
163
- description: 'Installs MUSUBI workflows in `.windsurf/workflows/`, agents in `.windsurf/AGENTS.md`, and steering in `steering/`',
169
+ description:
170
+ 'Installs MUSUBI workflows in `.windsurf/workflows/`, agents in `.windsurf/AGENTS.md`, and steering in `steering/`',
164
171
  aliasFlags: ['--windsurf'],
165
172
  recommendedModels: ['Claude Sonnet 4.5 or newer', 'GPT-4'],
166
173
  layout: {
167
174
  commandsDir: '.windsurf/workflows',
168
175
  agentDir: '.windsurf',
169
- docFile: 'AGENTS.md', // Main doc file
170
- agentsFile: '.windsurf/AGENTS.md', // 25 agents definition
176
+ docFile: 'AGENTS.md', // Main doc file
177
+ agentsFile: '.windsurf/AGENTS.md', // 25 agents definition
171
178
  },
172
179
  commands: {
173
180
  steering: '/sdd-steering',
@@ -178,7 +185,7 @@ const agentDefinitions = {
178
185
  validate: '/sdd-validate <feature>',
179
186
  },
180
187
  features: {
181
- hasSkills: true, // AGENTS.md provides 25 agents
188
+ hasSkills: true, // AGENTS.md provides 25 agents
182
189
  hasCommands: true,
183
190
  commandPrefix: '/',
184
191
  },
@@ -209,7 +216,7 @@ function detectAgentFromFlags(options) {
209
216
  for (const flag of definition.aliasFlags) {
210
217
  const flagName = flag.replace(/^--/, '');
211
218
  // Convert kebab-case to camelCase for commander compatibility
212
- const camelCaseFlagName = flagName.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
219
+ const camelCaseFlagName = flagName.replace(/-([a-z])/g, g => g[1].toUpperCase());
213
220
  if (options[flagName] || options[camelCaseFlagName]) {
214
221
  return agentKey;
215
222
  }