musubi-sdd 0.1.4 → 0.1.7
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.md +38 -1
- package/bin/musubi-init.js +90 -35
- package/bin/musubi.js +34 -13
- package/package.json +3 -2
- package/src/agents/registry.js +36 -29
- package/src/templates/agents/claude-code/CLAUDE.md +13 -0
- package/src/templates/agents/claude-code/commands/sdd-change-apply.md +59 -30
- package/src/templates/agents/claude-code/commands/sdd-change-archive.md +68 -11
- package/src/templates/agents/claude-code/commands/sdd-change-init.md +95 -30
- package/src/templates/agents/claude-code/commands/sdd-design.md +115 -54
- package/src/templates/agents/claude-code/commands/sdd-implement.md +33 -1
- package/src/templates/agents/claude-code/commands/sdd-requirements.md +59 -8
- package/src/templates/agents/claude-code/commands/sdd-steering.md +22 -0
- package/src/templates/agents/claude-code/commands/sdd-tasks.md +54 -19
- package/src/templates/agents/claude-code/commands/sdd-validate.md +82 -10
- package/src/templates/agents/claude-code/skills/ai-ml-engineer/SKILL.md +214 -54
- package/src/templates/agents/claude-code/skills/api-designer/SKILL.md +82 -11
- package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +96 -5
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/SKILL.md +141 -9
- package/src/templates/agents/claude-code/skills/cloud-architect/SKILL.md +93 -20
- package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +145 -16
- package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +136 -12
- package/src/templates/agents/claude-code/skills/database-administrator/SKILL.md +1045 -654
- package/src/templates/agents/claude-code/skills/database-schema-designer/SKILL.md +93 -14
- package/src/templates/agents/claude-code/skills/devops-engineer/SKILL.md +110 -3
- package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +86 -63
- package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +96 -5
- package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +65 -4
- package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +134 -3
- package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +161 -12
- package/src/templates/agents/claude-code/skills/requirements-analyst/SKILL.md +146 -19
- package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +142 -4
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +142 -15
- package/src/templates/agents/claude-code/skills/software-developer/SKILL.md +143 -45
- package/src/templates/agents/claude-code/skills/steering/SKILL.md +30 -4
- package/src/templates/agents/claude-code/skills/system-architect/SKILL.md +146 -39
- package/src/templates/agents/claude-code/skills/technical-writer/SKILL.md +46 -2
- package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +116 -48
- package/src/templates/agents/claude-code/skills/traceability-auditor/SKILL.md +117 -12
- package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +236 -137
- package/src/templates/agents/codex/AGENTS.md +3 -0
- package/src/templates/agents/codex/commands/sdd-change-apply.md +59 -30
- package/src/templates/agents/codex/commands/sdd-change-archive.md +68 -11
- package/src/templates/agents/codex/commands/sdd-change-init.md +95 -30
- package/src/templates/agents/codex/commands/sdd-design.md +115 -54
- package/src/templates/agents/codex/commands/sdd-implement.md +33 -1
- package/src/templates/agents/codex/commands/sdd-requirements.md +59 -8
- package/src/templates/agents/codex/commands/sdd-steering.md +22 -0
- package/src/templates/agents/codex/commands/sdd-tasks.md +54 -19
- package/src/templates/agents/codex/commands/sdd-validate.md +82 -10
- package/src/templates/agents/cursor/AGENTS.md +3 -0
- package/src/templates/agents/cursor/commands/sdd-change-apply.md +59 -30
- package/src/templates/agents/cursor/commands/sdd-change-archive.md +68 -11
- package/src/templates/agents/cursor/commands/sdd-change-init.md +95 -30
- package/src/templates/agents/cursor/commands/sdd-design.md +115 -54
- package/src/templates/agents/cursor/commands/sdd-implement.md +33 -1
- package/src/templates/agents/cursor/commands/sdd-requirements.md +59 -8
- package/src/templates/agents/cursor/commands/sdd-steering.md +22 -0
- package/src/templates/agents/cursor/commands/sdd-tasks.md +54 -19
- package/src/templates/agents/cursor/commands/sdd-validate.md +82 -10
- package/src/templates/agents/gemini-cli/GEMINI.md +2 -0
- package/src/templates/agents/github-copilot/AGENTS.md +3 -0
- package/src/templates/agents/github-copilot/commands/sdd-change-apply.md +59 -30
- package/src/templates/agents/github-copilot/commands/sdd-change-archive.md +68 -11
- package/src/templates/agents/github-copilot/commands/sdd-change-init.md +95 -30
- package/src/templates/agents/github-copilot/commands/sdd-design.md +115 -54
- package/src/templates/agents/github-copilot/commands/sdd-implement.md +33 -1
- package/src/templates/agents/github-copilot/commands/sdd-requirements.md +59 -8
- package/src/templates/agents/github-copilot/commands/sdd-steering.md +22 -0
- package/src/templates/agents/github-copilot/commands/sdd-tasks.md +54 -19
- package/src/templates/agents/github-copilot/commands/sdd-validate.md +82 -10
- package/src/templates/agents/qwen-code/QWEN.md +2 -0
- package/src/templates/agents/qwen-code/commands/sdd-change-apply.md +59 -30
- package/src/templates/agents/qwen-code/commands/sdd-change-archive.md +68 -11
- package/src/templates/agents/qwen-code/commands/sdd-change-init.md +95 -30
- package/src/templates/agents/qwen-code/commands/sdd-design.md +115 -54
- package/src/templates/agents/qwen-code/commands/sdd-implement.md +33 -1
- package/src/templates/agents/qwen-code/commands/sdd-requirements.md +59 -8
- package/src/templates/agents/qwen-code/commands/sdd-steering.md +22 -0
- package/src/templates/agents/qwen-code/commands/sdd-tasks.md +54 -19
- package/src/templates/agents/qwen-code/commands/sdd-validate.md +82 -10
- package/src/templates/agents/shared/AGENTS.md +65 -10
- package/src/templates/agents/windsurf/AGENTS.md +3 -0
- package/src/templates/agents/windsurf/commands/sdd-change-apply.md +59 -30
- package/src/templates/agents/windsurf/commands/sdd-change-archive.md +68 -11
- package/src/templates/agents/windsurf/commands/sdd-change-init.md +95 -30
- package/src/templates/agents/windsurf/commands/sdd-design.md +115 -54
- package/src/templates/agents/windsurf/commands/sdd-implement.md +33 -1
- package/src/templates/agents/windsurf/commands/sdd-requirements.md +59 -8
- package/src/templates/agents/windsurf/commands/sdd-steering.md +22 -0
- package/src/templates/agents/windsurf/commands/sdd-tasks.md +54 -19
- package/src/templates/agents/windsurf/commands/sdd-validate.md +82 -10
- package/src/templates/shared/constitution/constitution.md +27 -23
- package/src/templates/shared/constitution/ears-format.md +71 -8
- package/src/templates/shared/constitution/workflow.md +14 -10
- package/src/templates/shared/documents/design.md +66 -30
- package/src/templates/shared/documents/requirements.md +53 -24
- package/src/templates/shared/documents/research.md +83 -62
- package/src/templates/shared/documents/tasks.md +84 -23
- package/src/templates/shared/steering/product.md +83 -55
- package/src/templates/shared/steering/structure.md +4 -1
- package/src/templates/shared/steering/tech.md +154 -151
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# MUSUBI
|
|
2
2
|
|
|
3
|
+
[](https://github.com/nahisaho/musubi/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/musubi-sdd)
|
|
5
|
+
[](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/
|
|
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
|
package/bin/musubi-init.js
CHANGED
|
@@ -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,20 +69,20 @@ 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)
|
|
@@ -92,15 +92,43 @@ async function main(agent, agentKey) {
|
|
|
92
92
|
name: 'skills',
|
|
93
93
|
message: 'Select skills to install (all recommended):',
|
|
94
94
|
choices: [
|
|
95
|
-
{
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
{
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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
|
|
@@ -154,12 +182,29 @@ async function main(agent, agentKey) {
|
|
|
154
182
|
const skillGroups = {
|
|
155
183
|
core: ['orchestrator', 'steering', 'constitution-enforcer'],
|
|
156
184
|
requirements: ['requirements-analyst', 'project-manager', 'change-impact-analyzer'],
|
|
157
|
-
architecture: [
|
|
185
|
+
architecture: [
|
|
186
|
+
'system-architect',
|
|
187
|
+
'api-designer',
|
|
188
|
+
'database-schema-designer',
|
|
189
|
+
'ui-ux-designer',
|
|
190
|
+
],
|
|
158
191
|
development: ['software-developer'],
|
|
159
|
-
quality: [
|
|
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: [
|
|
162
|
-
|
|
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 =
|
|
180
|
-
|
|
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
|
|
|
@@ -225,7 +274,7 @@ async function copySkill(skillName, agent) {
|
|
|
225
274
|
if (!agent.layout.skillsDir) {
|
|
226
275
|
return; // Skip for agents without Skills API support
|
|
227
276
|
}
|
|
228
|
-
|
|
277
|
+
|
|
229
278
|
const srcDir = path.join(AGENTS_TEMPLATE_DIR, 'claude-code', 'skills', skillName);
|
|
230
279
|
const destDir = path.join(agent.layout.skillsDir, skillName);
|
|
231
280
|
await fs.copy(srcDir, destDir);
|
|
@@ -252,18 +301,19 @@ async function copyAgentsFile(agent) {
|
|
|
252
301
|
if (destFile === 'GEMINI.md') {
|
|
253
302
|
// Read shared AGENTS.md
|
|
254
303
|
const agentsContent = await fs.readFile(sharedAgentsFile, 'utf8');
|
|
255
|
-
|
|
304
|
+
|
|
256
305
|
// Read existing GEMINI.md template if exists
|
|
257
306
|
const geminiTemplate = path.join(AGENTS_TEMPLATE_DIR, 'gemini-cli', 'GEMINI.md');
|
|
258
307
|
let geminiContent = '';
|
|
259
308
|
if (fs.existsSync(geminiTemplate)) {
|
|
260
309
|
geminiContent = await fs.readFile(geminiTemplate, 'utf8');
|
|
261
310
|
} else {
|
|
262
|
-
geminiContent =
|
|
263
|
-
|
|
264
|
-
|
|
311
|
+
geminiContent =
|
|
312
|
+
'# Gemini CLI - MUSUBI Configuration\n\n' +
|
|
313
|
+
'This file configures Gemini CLI for MUSUBI SDD.\n\n' +
|
|
314
|
+
'---\n\n';
|
|
265
315
|
}
|
|
266
|
-
|
|
316
|
+
|
|
267
317
|
// Append AGENTS.md content
|
|
268
318
|
geminiContent += agentsContent;
|
|
269
319
|
await fs.writeFile(destFile, geminiContent);
|
|
@@ -296,20 +346,25 @@ async function createConstitution() {
|
|
|
296
346
|
}
|
|
297
347
|
|
|
298
348
|
async function createReadme(answers, agent, agentKey) {
|
|
299
|
-
const skillsSection =
|
|
300
|
-
|
|
349
|
+
const skillsSection =
|
|
350
|
+
agent.features.hasSkills && answers.skills
|
|
351
|
+
? `This project uses **MUSUBI** (Ultimate Specification Driven Development) with ${answers.skills.length} skill groups.
|
|
301
352
|
|
|
302
353
|
### Available Skills
|
|
303
354
|
|
|
304
355
|
Check \`${agent.layout.skillsDir}/\` directory for all installed skills.
|
|
305
356
|
|
|
306
357
|
`
|
|
307
|
-
|
|
358
|
+
: `This project uses **MUSUBI** (Ultimate Specification Driven Development).
|
|
308
359
|
|
|
309
360
|
`;
|
|
310
361
|
|
|
311
|
-
const commandType =
|
|
312
|
-
|
|
362
|
+
const commandType =
|
|
363
|
+
agentKey === 'github-copilot' || agentKey === 'codex'
|
|
364
|
+
? 'Prompts'
|
|
365
|
+
: agentKey === 'windsurf'
|
|
366
|
+
? 'Workflows'
|
|
367
|
+
: 'Commands';
|
|
313
368
|
|
|
314
369
|
const readme = `# MUSUBI - ${answers.projectName}
|
|
315
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 {
|
|
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(async
|
|
44
|
+
initCommand.action(async options => {
|
|
43
45
|
const agentKey = detectAgentFromFlags(options);
|
|
44
46
|
const agent = getAgentDefinition(agentKey);
|
|
45
47
|
|
|
@@ -78,7 +80,7 @@ program
|
|
|
78
80
|
if (fs.existsSync(skillsDir)) {
|
|
79
81
|
const skills = fs.readdirSync(skillsDir);
|
|
80
82
|
console.log(chalk.white(`📁 Claude Code Skills: ${skills.length} installed`));
|
|
81
|
-
console.log(chalk.gray(
|
|
83
|
+
console.log(chalk.gray(' Location: .claude/skills/\n'));
|
|
82
84
|
}
|
|
83
85
|
|
|
84
86
|
// Check steering files
|
|
@@ -202,7 +204,8 @@ program
|
|
|
202
204
|
console.log(chalk.white('\nArticle IV: EARS Requirements Format'));
|
|
203
205
|
const specsDir = path.join(cwd, 'storage', 'specs');
|
|
204
206
|
if (fs.existsSync(specsDir)) {
|
|
205
|
-
const requirementFiles = fs
|
|
207
|
+
const requirementFiles = fs
|
|
208
|
+
.readdirSync(specsDir)
|
|
206
209
|
.filter(f => f.includes('requirements') && f.endsWith('.md'));
|
|
207
210
|
|
|
208
211
|
if (requirementFiles.length > 0) {
|
|
@@ -224,9 +227,13 @@ program
|
|
|
224
227
|
});
|
|
225
228
|
|
|
226
229
|
if (earsCompliant === requirementFiles.length) {
|
|
227
|
-
console.log(chalk.green(
|
|
230
|
+
console.log(chalk.green(' ✅ All requirements use EARS format'));
|
|
228
231
|
} else {
|
|
229
|
-
console.log(
|
|
232
|
+
console.log(
|
|
233
|
+
chalk.yellow(
|
|
234
|
+
` ⚠️ ${earsCompliant}/${requirementFiles.length} documents have EARS patterns`
|
|
235
|
+
)
|
|
236
|
+
);
|
|
230
237
|
}
|
|
231
238
|
} else {
|
|
232
239
|
console.log(chalk.gray(' ℹ️ No requirements documents found'));
|
|
@@ -300,12 +307,26 @@ program
|
|
|
300
307
|
|
|
301
308
|
console.log(chalk.white('25 Claude Code Skills:'));
|
|
302
309
|
console.log(chalk.gray(' Orchestration: orchestrator, steering, constitution-enforcer'));
|
|
303
|
-
console.log(
|
|
304
|
-
|
|
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
|
+
);
|
|
305
318
|
console.log(chalk.gray(' Development: software-developer'));
|
|
306
|
-
console.log(
|
|
319
|
+
console.log(
|
|
320
|
+
chalk.gray(
|
|
321
|
+
' Quality: test-engineer, code-reviewer, bug-hunter, quality-assurance, traceability-auditor'
|
|
322
|
+
)
|
|
323
|
+
);
|
|
307
324
|
console.log(chalk.gray(' Security: security-auditor, performance-optimizer'));
|
|
308
|
-
console.log(
|
|
325
|
+
console.log(
|
|
326
|
+
chalk.gray(
|
|
327
|
+
' Infrastructure: devops-engineer, cloud-architect, database-administrator, site-reliability-engineer, release-coordinator'
|
|
328
|
+
)
|
|
329
|
+
);
|
|
309
330
|
console.log(chalk.gray(' Documentation: technical-writer, ai-ml-engineer\n'));
|
|
310
331
|
});
|
|
311
332
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "musubi-sdd",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
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",
|
package/src/agents/registry.js
CHANGED
|
@@ -8,15 +8,16 @@
|
|
|
8
8
|
const agentDefinitions = {
|
|
9
9
|
'claude-code': {
|
|
10
10
|
label: 'Claude Code',
|
|
11
|
-
description:
|
|
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',
|
|
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',
|
|
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,
|
|
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:
|
|
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',
|
|
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,
|
|
57
|
+
hasSkills: true, // AGENTS.md provides 25 agents
|
|
56
58
|
hasCommands: true,
|
|
57
59
|
commandPrefix: '#',
|
|
58
60
|
},
|
|
59
61
|
},
|
|
60
|
-
|
|
62
|
+
cursor: {
|
|
61
63
|
label: 'Cursor IDE',
|
|
62
|
-
description:
|
|
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',
|
|
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,
|
|
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:
|
|
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',
|
|
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,
|
|
109
|
+
hasSkills: true, // GEMINI.md provides 25 agents
|
|
106
110
|
hasCommands: true,
|
|
107
111
|
commandPrefix: '/',
|
|
108
|
-
commandFormat: 'toml',
|
|
112
|
+
commandFormat: 'toml', // Unique: Gemini uses TOML instead of Markdown
|
|
109
113
|
},
|
|
110
114
|
},
|
|
111
|
-
|
|
115
|
+
codex: {
|
|
112
116
|
label: 'Codex CLI',
|
|
113
|
-
description:
|
|
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',
|
|
120
|
-
agentsFile: '.codex/AGENTS.md',
|
|
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,
|
|
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:
|
|
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',
|
|
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,
|
|
162
|
+
hasSkills: true, // AGENTS.md provides 25 agents
|
|
157
163
|
hasCommands: true,
|
|
158
164
|
commandPrefix: '/',
|
|
159
165
|
},
|
|
160
166
|
},
|
|
161
|
-
|
|
167
|
+
windsurf: {
|
|
162
168
|
label: 'Windsurf IDE',
|
|
163
|
-
description:
|
|
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',
|
|
170
|
-
agentsFile: '.windsurf/AGENTS.md',
|
|
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,
|
|
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,
|
|
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
|
}
|