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.
- package/README.md +38 -1
- package/bin/musubi-init.js +97 -37
- package/bin/musubi.js +36 -14
- 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 +121 -53
- package/src/templates/agents/claude-code/skills/api-designer/SKILL.md +61 -11
- package/src/templates/agents/claude-code/skills/bug-hunter/SKILL.md +20 -2
- package/src/templates/agents/claude-code/skills/change-impact-analyzer/SKILL.md +53 -8
- package/src/templates/agents/claude-code/skills/cloud-architect/SKILL.md +72 -20
- package/src/templates/agents/claude-code/skills/code-reviewer/SKILL.md +55 -14
- package/src/templates/agents/claude-code/skills/constitution-enforcer/SKILL.md +52 -11
- package/src/templates/agents/claude-code/skills/database-administrator/SKILL.md +958 -653
- package/src/templates/agents/claude-code/skills/database-schema-designer/SKILL.md +72 -14
- package/src/templates/agents/claude-code/skills/devops-engineer/SKILL.md +25 -2
- package/src/templates/agents/claude-code/skills/orchestrator/SKILL.md +86 -63
- package/src/templates/agents/claude-code/skills/performance-optimizer/SKILL.md +17 -2
- package/src/templates/agents/claude-code/skills/project-manager/SKILL.md +44 -4
- package/src/templates/agents/claude-code/skills/quality-assurance/SKILL.md +46 -2
- package/src/templates/agents/claude-code/skills/release-coordinator/SKILL.md +74 -11
- package/src/templates/agents/claude-code/skills/requirements-analyst/SKILL.md +125 -19
- package/src/templates/agents/claude-code/skills/security-auditor/SKILL.md +45 -2
- package/src/templates/agents/claude-code/skills/site-reliability-engineer/SKILL.md +51 -14
- package/src/templates/agents/claude-code/skills/software-developer/SKILL.md +81 -35
- package/src/templates/agents/claude-code/skills/steering/SKILL.md +30 -4
- package/src/templates/agents/claude-code/skills/system-architect/SKILL.md +125 -39
- package/src/templates/agents/claude-code/skills/technical-writer/SKILL.md +27 -2
- package/src/templates/agents/claude-code/skills/test-engineer/SKILL.md +72 -38
- package/src/templates/agents/claude-code/skills/traceability-auditor/SKILL.md +32 -11
- package/src/templates/agents/claude-code/skills/ui-ux-designer/SKILL.md +214 -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,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.
|
|
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
|
-
{
|
|
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
|
|
@@ -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.
|
|
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: [
|
|
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
|
|
|
@@ -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 =
|
|
258
|
-
|
|
259
|
-
|
|
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 =
|
|
295
|
-
|
|
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
|
-
|
|
358
|
+
: `This project uses **MUSUBI** (Ultimate Specification Driven Development).
|
|
303
359
|
|
|
304
360
|
`;
|
|
305
361
|
|
|
306
|
-
const commandType =
|
|
307
|
-
|
|
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 {
|
|
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(
|
|
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')
|
|
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(
|
|
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
|
|
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(
|
|
230
|
+
console.log(chalk.green(' ✅ All requirements use EARS format'));
|
|
227
231
|
} else {
|
|
228
|
-
console.log(
|
|
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(
|
|
303
|
-
|
|
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(
|
|
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(
|
|
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
|
+
"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",
|
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
|
}
|