bmad-method 4.4.0 → 4.4.2
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/.claude/commands/bmad-orchestrator.md +65 -6
- package/.cursor/rules/bmad-orchestrator.mdc +65 -6
- package/.roo/README.md +0 -11
- package/.windsurf/rules/bmad-orchestrator.md +65 -6
- package/CHANGELOG.md +15 -3
- package/README.md +6 -26
- package/{.bmad-core → bmad-core}/agent-teams/team-all.yml +2 -4
- package/bmad-core/agent-teams/team-fullstack.yml +18 -0
- package/bmad-core/agent-teams/team-ide-minimal.yml +10 -0
- package/{.bmad-core → bmad-core}/agent-teams/team-no-ui.yml +1 -3
- package/bmad-core/agents/bmad-orchestrator.md +128 -0
- package/{.bmad-core → bmad-core}/agents/qa.md +11 -17
- package/{.bmad-core → bmad-core}/agents/ux-expert.md +14 -20
- package/{.bmad-core → bmad-core}/tasks/shard-doc.md +5 -3
- package/{.bmad-core → bmad-core}/templates/architecture-tmpl.md +2 -2
- package/{.bmad-core → bmad-core}/templates/brownfield-architecture-tmpl.md +6 -6
- package/{.bmad-core → bmad-core}/templates/front-end-spec-tmpl.md +6 -6
- package/{.bmad-core → bmad-core}/utils/agent-switcher.ide.md +6 -6
- package/{.bmad-core → bmad-core}/utils/workflow-management.md +4 -4
- package/{.bmad-core → bmad-core}/web-bundles/agents/architect.txt +3 -3
- package/{.bmad-core → bmad-core}/web-bundles/agents/bmad-master.txt +10 -10
- package/{.bmad-core → bmad-core}/web-bundles/agents/bmad-orchestrator.txt +67 -8
- package/{.bmad-core → bmad-core}/web-bundles/agents/pm.txt +1 -1
- package/{.bmad-core → bmad-core}/web-bundles/agents/po.txt +1 -1
- package/{.bmad-core → bmad-core}/web-bundles/agents/qa.txt +11 -17
- package/{.bmad-core → bmad-core}/web-bundles/agents/ux-expert.txt +16 -22
- package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/team-game-dev.yml +12 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +58 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +66 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +51 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +201 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +160 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +254 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +631 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/manifest.yml +45 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +111 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +216 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +308 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.md +560 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.md +345 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.md +331 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.md +235 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.md +451 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/agents/game-designer.txt +1758 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/agents/game-developer.txt +1444 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/agents/game-sm.txt +674 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/team-game-dev.txt +4395 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/teams/team-game-dev.txt +4395 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yml +183 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yml +175 -0
- package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/README.md +5 -5
- package/expansion-packs/bmad-infrastructure-devops/manifest.yml +23 -0
- package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/templates/infrastructure-platform-from-arch-tmpl.md +0 -0
- package/expansion-packs/bmad-infrastructure-devops/web-bundles/agents/infra-devops-platform.txt +2021 -0
- package/package.json +3 -3
- package/tools/builders/web-builder.js +191 -2
- package/tools/cli.js +55 -7
- package/tools/installer/bin/bmad.js +120 -9
- package/tools/installer/config/install.config.yml +43 -43
- package/tools/installer/lib/config-loader.js +116 -6
- package/tools/installer/lib/installer.js +194 -5
- package/tools/installer/package-lock.json +3 -3
- package/tools/installer/package.json +2 -2
- package/tools/lib/dependency-resolver.js +1 -1
- package/.bmad-core/agent-teams/team-fullstack.yml +0 -26
- package/.bmad-core/agents/bmad-orchestrator.md +0 -69
- package/.bmad-core/web-bundles/teams/team-all.txt +0 -10262
- package/.bmad-core/web-bundles/teams/team-fullstack.txt +0 -9614
- package/.bmad-core/web-bundles/teams/team-no-ui.txt +0 -8462
- package/expansion-packs/infrastructure-devops/manifest.yml +0 -38
- /package/{.bmad-core → bmad-core}/agents/analyst.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/architect.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/bmad-master.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/dev.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/pm.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/po.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/sm.md +0 -0
- /package/{.bmad-core → bmad-core}/bmad-core-config.yml +0 -0
- /package/{.bmad-core → bmad-core}/checklists/architect-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/checklists/change-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/checklists/pm-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/checklists/po-master-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/checklists/story-dod-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/checklists/story-draft-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/data/bmad-kb.md +0 -0
- /package/{.bmad-core → bmad-core}/data/technical-preferences.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/advanced-elicitation.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/brainstorming-techniques.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/brownfield-create-epic.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/brownfield-create-story.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/core-dump.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/correct-course.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/create-deep-research-prompt.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/create-doc.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/create-next-story.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/doc-migration-task.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/document-project.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/execute-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/generate-ai-frontend-prompt.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/index-docs.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/agent-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/brownfield-prd-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/competitor-analysis-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/expansion-pack-plan-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/front-end-architecture-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/fullstack-architecture-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/market-research-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/prd-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/project-brief-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/simple-project-prd-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/story-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/web-agent-startup-instructions-template.md +0 -0
- /package/{.bmad-core → bmad-core}/utils/template-format.md +0 -0
- /package/{.bmad-core → bmad-core}/web-bundles/agents/analyst.txt +0 -0
- /package/{.bmad-core → bmad-core}/web-bundles/agents/dev.txt +0 -0
- /package/{.bmad-core → bmad-core}/web-bundles/agents/sm.txt +0 -0
- /package/{.bmad-core → bmad-core}/workflows/brownfield-fullstack.yml +0 -0
- /package/{.bmad-core → bmad-core}/workflows/brownfield-service.yml +0 -0
- /package/{.bmad-core → bmad-core}/workflows/brownfield-ui.yml +0 -0
- /package/{.bmad-core → bmad-core}/workflows/greenfield-fullstack.yml +0 -0
- /package/{.bmad-core → bmad-core}/workflows/greenfield-service.yml +0 -0
- /package/{.bmad-core → bmad-core}/workflows/greenfield-ui.yml +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/agents/infra-devops-platform.md +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/checklists/infrastructure-checklist.md +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/tasks/create-doc.md +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/tasks/review-infrastructure.md +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/tasks/validate-infrastructure.md +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/templates/infrastructure-architecture-tmpl.md +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bmad-method",
|
|
3
|
-
"version": "4.4.
|
|
3
|
+
"version": "4.4.2",
|
|
4
4
|
"description": "Breakthrough Method of Agile AI-driven Development",
|
|
5
5
|
"main": "tools/cli.js",
|
|
6
6
|
"bin": {
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"url": "git+https://github.com/bmadcode/BMAD-METHOD.git"
|
|
49
49
|
},
|
|
50
50
|
"engines": {
|
|
51
|
-
"node": ">=
|
|
51
|
+
"node": ">=20.0.0"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"husky": "^9.1.7",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
".roomodes": [
|
|
70
70
|
"node tools/yaml-format.js"
|
|
71
71
|
],
|
|
72
|
-
"
|
|
72
|
+
"bmad-core/**/*.yml": [
|
|
73
73
|
"node tools/yaml-format.js"
|
|
74
74
|
],
|
|
75
75
|
".github/**/*.yml": [
|
|
@@ -7,10 +7,10 @@ class WebBuilder {
|
|
|
7
7
|
this.rootDir = options.rootDir || process.cwd();
|
|
8
8
|
this.outputDirs = options.outputDirs || [
|
|
9
9
|
path.join(this.rootDir, 'dist'),
|
|
10
|
-
path.join(this.rootDir, '
|
|
10
|
+
path.join(this.rootDir, 'bmad-core', 'web-bundles')
|
|
11
11
|
];
|
|
12
12
|
this.resolver = new DependencyResolver(this.rootDir);
|
|
13
|
-
this.templatePath = path.join(this.rootDir, '
|
|
13
|
+
this.templatePath = path.join(this.rootDir, 'bmad-core', 'templates', 'web-agent-startup-instructions-template.md');
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
async cleanOutputDirs() {
|
|
@@ -138,6 +138,195 @@ class WebBuilder {
|
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
+
async buildAllExpansionPacks(options = {}) {
|
|
142
|
+
const expansionPacks = await this.listExpansionPacks();
|
|
143
|
+
|
|
144
|
+
for (const packName of expansionPacks) {
|
|
145
|
+
console.log(` Building expansion pack: ${packName}`);
|
|
146
|
+
await this.buildExpansionPack(packName, options);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
console.log(`Built ${expansionPacks.length} expansion pack bundles`);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async buildExpansionPack(packName, options = {}) {
|
|
153
|
+
const packDir = path.join(this.rootDir, 'expansion-packs', packName);
|
|
154
|
+
const outputDirs = [
|
|
155
|
+
path.join(packDir, 'web-bundles'),
|
|
156
|
+
path.join(this.rootDir, 'dist', 'expansion-packs', packName)
|
|
157
|
+
];
|
|
158
|
+
|
|
159
|
+
// Clean output directories if requested
|
|
160
|
+
if (options.clean !== false) {
|
|
161
|
+
for (const outputDir of outputDirs) {
|
|
162
|
+
try {
|
|
163
|
+
await fs.rm(outputDir, { recursive: true, force: true });
|
|
164
|
+
} catch (error) {
|
|
165
|
+
// Directory might not exist, that's fine
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Build individual agents first
|
|
171
|
+
const agentsDir = path.join(packDir, 'agents');
|
|
172
|
+
try {
|
|
173
|
+
const agentFiles = await fs.readdir(agentsDir);
|
|
174
|
+
const agentMarkdownFiles = agentFiles.filter(f => f.endsWith('.md'));
|
|
175
|
+
|
|
176
|
+
if (agentMarkdownFiles.length > 0) {
|
|
177
|
+
console.log(` Building individual agents for ${packName}:`);
|
|
178
|
+
|
|
179
|
+
for (const agentFile of agentMarkdownFiles) {
|
|
180
|
+
const agentName = agentFile.replace('.md', '');
|
|
181
|
+
console.log(` - ${agentName}`);
|
|
182
|
+
|
|
183
|
+
// Build individual agent bundle
|
|
184
|
+
const bundle = await this.buildExpansionAgentBundle(packName, packDir, agentName);
|
|
185
|
+
|
|
186
|
+
// Write to all output directories
|
|
187
|
+
for (const outputDir of outputDirs) {
|
|
188
|
+
const agentsOutputDir = path.join(outputDir, 'agents');
|
|
189
|
+
await fs.mkdir(agentsOutputDir, { recursive: true });
|
|
190
|
+
const outputFile = path.join(agentsOutputDir, `${agentName}.txt`);
|
|
191
|
+
await fs.writeFile(outputFile, bundle, 'utf8');
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
} catch (error) {
|
|
196
|
+
console.debug(` No agents directory found for ${packName}`);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Build team bundle
|
|
200
|
+
const agentTeamsDir = path.join(packDir, 'agent-teams');
|
|
201
|
+
try {
|
|
202
|
+
const teamFiles = await fs.readdir(agentTeamsDir);
|
|
203
|
+
const teamFile = teamFiles.find(f => f.startsWith('team-') && f.endsWith('.yml'));
|
|
204
|
+
|
|
205
|
+
if (teamFile) {
|
|
206
|
+
console.log(` Building team bundle for ${packName}`);
|
|
207
|
+
const teamConfigPath = path.join(agentTeamsDir, teamFile);
|
|
208
|
+
|
|
209
|
+
// Build expansion pack as a team bundle
|
|
210
|
+
const bundle = await this.buildExpansionTeamBundle(packName, packDir, teamConfigPath);
|
|
211
|
+
|
|
212
|
+
// Write to all output directories
|
|
213
|
+
for (const outputDir of outputDirs) {
|
|
214
|
+
const teamsOutputDir = path.join(outputDir, 'teams');
|
|
215
|
+
await fs.mkdir(teamsOutputDir, { recursive: true });
|
|
216
|
+
const outputFile = path.join(teamsOutputDir, teamFile.replace('.yml', '.txt'));
|
|
217
|
+
await fs.writeFile(outputFile, bundle, 'utf8');
|
|
218
|
+
console.log(` ✓ Created bundle: ${path.relative(this.rootDir, outputFile)}`);
|
|
219
|
+
}
|
|
220
|
+
} else {
|
|
221
|
+
console.warn(` ⚠ No team configuration found in ${packName}/agent-teams/`);
|
|
222
|
+
}
|
|
223
|
+
} catch (error) {
|
|
224
|
+
console.warn(` ⚠ No agent-teams directory found for ${packName}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
async buildExpansionAgentBundle(packName, packDir, agentName) {
|
|
229
|
+
const template = await fs.readFile(this.templatePath, 'utf8');
|
|
230
|
+
const sections = [template];
|
|
231
|
+
|
|
232
|
+
// Add agent configuration
|
|
233
|
+
const agentPath = path.join(packDir, 'agents', `${agentName}.md`);
|
|
234
|
+
const agentContent = await fs.readFile(agentPath, 'utf8');
|
|
235
|
+
sections.push(this.formatSection(`agents#${agentName}`, agentContent));
|
|
236
|
+
|
|
237
|
+
// Resolve and add agent dependencies from expansion pack
|
|
238
|
+
const agentYaml = agentContent.match(/```yaml\n([\s\S]*?)\n```/);
|
|
239
|
+
if (agentYaml) {
|
|
240
|
+
try {
|
|
241
|
+
const yaml = require('js-yaml');
|
|
242
|
+
const agentConfig = yaml.load(agentYaml[1]);
|
|
243
|
+
|
|
244
|
+
if (agentConfig.dependencies) {
|
|
245
|
+
// Add resources from expansion pack
|
|
246
|
+
for (const [resourceType, resources] of Object.entries(agentConfig.dependencies)) {
|
|
247
|
+
if (Array.isArray(resources)) {
|
|
248
|
+
for (const resourceName of resources) {
|
|
249
|
+
const resourcePath = path.join(packDir, resourceType, `${resourceName}.md`);
|
|
250
|
+
try {
|
|
251
|
+
const resourceContent = await fs.readFile(resourcePath, 'utf8');
|
|
252
|
+
sections.push(this.formatSection(`${resourceType}#${resourceName}`, resourceContent));
|
|
253
|
+
} catch (error) {
|
|
254
|
+
// Resource might not exist in expansion pack, that's ok
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
} catch (error) {
|
|
261
|
+
console.debug(`Failed to parse agent YAML for ${agentName}:`, error.message);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return sections.join('\n');
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async buildExpansionTeamBundle(packName, packDir, teamConfigPath) {
|
|
269
|
+
const template = await fs.readFile(this.templatePath, 'utf8');
|
|
270
|
+
|
|
271
|
+
const sections = [template];
|
|
272
|
+
|
|
273
|
+
// Add team configuration
|
|
274
|
+
const teamContent = await fs.readFile(teamConfigPath, 'utf8');
|
|
275
|
+
const teamFileName = path.basename(teamConfigPath, '.yml');
|
|
276
|
+
sections.push(this.formatSection(`agent-teams#${teamFileName}`, teamContent));
|
|
277
|
+
|
|
278
|
+
// Add bmad-orchestrator (required for all teams)
|
|
279
|
+
const orchestratorPath = path.join(this.rootDir, 'bmad-core', 'agents', 'bmad-orchestrator.md');
|
|
280
|
+
const orchestratorContent = await fs.readFile(orchestratorPath, 'utf8');
|
|
281
|
+
sections.push(this.formatSection('agents#bmad-orchestrator', orchestratorContent));
|
|
282
|
+
|
|
283
|
+
// Add expansion pack agents
|
|
284
|
+
const agentsDir = path.join(packDir, 'agents');
|
|
285
|
+
try {
|
|
286
|
+
const agentFiles = await fs.readdir(agentsDir);
|
|
287
|
+
for (const agentFile of agentFiles.filter(f => f.endsWith('.md'))) {
|
|
288
|
+
const agentPath = path.join(agentsDir, agentFile);
|
|
289
|
+
const agentContent = await fs.readFile(agentPath, 'utf8');
|
|
290
|
+
const agentName = agentFile.replace('.md', '');
|
|
291
|
+
sections.push(this.formatSection(`agents#${agentName}`, agentContent));
|
|
292
|
+
}
|
|
293
|
+
} catch (error) {
|
|
294
|
+
console.warn(` ⚠ No agents directory found in ${packName}`);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Add expansion pack resources (templates, tasks, checklists)
|
|
298
|
+
const resourceDirs = ['templates', 'tasks', 'checklists', 'workflows', 'data'];
|
|
299
|
+
for (const resourceDir of resourceDirs) {
|
|
300
|
+
const resourcePath = path.join(packDir, resourceDir);
|
|
301
|
+
try {
|
|
302
|
+
const resourceFiles = await fs.readdir(resourcePath);
|
|
303
|
+
for (const resourceFile of resourceFiles.filter(f => f.endsWith('.md') || f.endsWith('.yml'))) {
|
|
304
|
+
const filePath = path.join(resourcePath, resourceFile);
|
|
305
|
+
const fileContent = await fs.readFile(filePath, 'utf8');
|
|
306
|
+
const fileName = resourceFile.replace(/\.(md|yml)$/, '');
|
|
307
|
+
sections.push(this.formatSection(`${resourceDir}#${fileName}`, fileContent));
|
|
308
|
+
}
|
|
309
|
+
} catch (error) {
|
|
310
|
+
// Directory might not exist, that's fine
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
return sections.join('\n');
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
async listExpansionPacks() {
|
|
318
|
+
const expansionPacksDir = path.join(this.rootDir, 'expansion-packs');
|
|
319
|
+
try {
|
|
320
|
+
const entries = await fs.readdir(expansionPacksDir, { withFileTypes: true });
|
|
321
|
+
return entries
|
|
322
|
+
.filter(entry => entry.isDirectory())
|
|
323
|
+
.map(entry => entry.name);
|
|
324
|
+
} catch (error) {
|
|
325
|
+
console.warn('No expansion-packs directory found');
|
|
326
|
+
return [];
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
141
330
|
listAgents() {
|
|
142
331
|
return this.resolver.listAgents();
|
|
143
332
|
}
|
package/tools/cli.js
CHANGED
|
@@ -18,6 +18,8 @@ program
|
|
|
18
18
|
.description('Build web bundles for agents and teams')
|
|
19
19
|
.option('-a, --agents-only', 'Build only agent bundles')
|
|
20
20
|
.option('-t, --teams-only', 'Build only team bundles')
|
|
21
|
+
.option('-e, --expansions-only', 'Build only expansion pack bundles')
|
|
22
|
+
.option('--no-expansions', 'Skip building expansion packs')
|
|
21
23
|
.option('--no-clean', 'Skip cleaning output directories')
|
|
22
24
|
.action(async (options) => {
|
|
23
25
|
const builder = new WebBuilder({
|
|
@@ -30,14 +32,24 @@ program
|
|
|
30
32
|
await builder.cleanOutputDirs();
|
|
31
33
|
}
|
|
32
34
|
|
|
33
|
-
if (
|
|
34
|
-
console.log('Building
|
|
35
|
-
await builder.
|
|
36
|
-
}
|
|
35
|
+
if (options.expansionsOnly) {
|
|
36
|
+
console.log('Building expansion pack bundles...');
|
|
37
|
+
await builder.buildAllExpansionPacks({ clean: false });
|
|
38
|
+
} else {
|
|
39
|
+
if (!options.teamsOnly) {
|
|
40
|
+
console.log('Building agent bundles...');
|
|
41
|
+
await builder.buildAgents();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (!options.agentsOnly) {
|
|
45
|
+
console.log('Building team bundles...');
|
|
46
|
+
await builder.buildTeams();
|
|
47
|
+
}
|
|
37
48
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
49
|
+
if (!options.noExpansions) {
|
|
50
|
+
console.log('Building expansion pack bundles...');
|
|
51
|
+
await builder.buildAllExpansionPacks({ clean: false });
|
|
52
|
+
}
|
|
41
53
|
}
|
|
42
54
|
|
|
43
55
|
// Generate IDE configuration folders
|
|
@@ -62,6 +74,32 @@ program
|
|
|
62
74
|
}
|
|
63
75
|
});
|
|
64
76
|
|
|
77
|
+
program
|
|
78
|
+
.command('build:expansions')
|
|
79
|
+
.description('Build web bundles for all expansion packs')
|
|
80
|
+
.option('--expansion <name>', 'Build specific expansion pack only')
|
|
81
|
+
.option('--no-clean', 'Skip cleaning output directories')
|
|
82
|
+
.action(async (options) => {
|
|
83
|
+
const builder = new WebBuilder({
|
|
84
|
+
rootDir: process.cwd()
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
if (options.expansion) {
|
|
89
|
+
console.log(`Building expansion pack: ${options.expansion}`);
|
|
90
|
+
await builder.buildExpansionPack(options.expansion, { clean: options.clean });
|
|
91
|
+
} else {
|
|
92
|
+
console.log('Building all expansion packs...');
|
|
93
|
+
await builder.buildAllExpansionPacks({ clean: options.clean });
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
console.log('Expansion pack build completed successfully!');
|
|
97
|
+
} catch (error) {
|
|
98
|
+
console.error('Expansion pack build failed:', error.message);
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
65
103
|
program
|
|
66
104
|
.command('list:agents')
|
|
67
105
|
.description('List all available agents')
|
|
@@ -72,6 +110,16 @@ program
|
|
|
72
110
|
agents.forEach(agent => console.log(` - ${agent}`));
|
|
73
111
|
});
|
|
74
112
|
|
|
113
|
+
program
|
|
114
|
+
.command('list:expansions')
|
|
115
|
+
.description('List all available expansion packs')
|
|
116
|
+
.action(async () => {
|
|
117
|
+
const builder = new WebBuilder({ rootDir: process.cwd() });
|
|
118
|
+
const expansions = await builder.listExpansionPacks();
|
|
119
|
+
console.log('Available expansion packs:');
|
|
120
|
+
expansions.forEach(expansion => console.log(` - ${expansion}`));
|
|
121
|
+
});
|
|
122
|
+
|
|
75
123
|
program
|
|
76
124
|
.command('validate')
|
|
77
125
|
.description('Validate agent and team configurations')
|
|
@@ -46,22 +46,32 @@ program
|
|
|
46
46
|
.description('Install BMAD Method agents and tools')
|
|
47
47
|
.option('-f, --full', 'Install complete .bmad-core folder')
|
|
48
48
|
.option('-a, --agent <agent>', 'Install specific agent with dependencies')
|
|
49
|
+
.option('-t, --team <team>', 'Install specific team with required agents and dependencies')
|
|
50
|
+
.option('-x, --expansion-only', 'Install only expansion packs (no bmad-core)')
|
|
49
51
|
.option('-d, --directory <path>', 'Installation directory (default: .bmad-core)')
|
|
50
|
-
.option('-i, --ide <ide...>', 'Configure for specific IDE(s) - can specify multiple (cursor, claude-code, windsurf, roo)')
|
|
52
|
+
.option('-i, --ide <ide...>', 'Configure for specific IDE(s) - can specify multiple (cursor, claude-code, windsurf, roo, other)')
|
|
53
|
+
.option('-e, --expansion-packs <packs...>', 'Install specific expansion packs (can specify multiple)')
|
|
51
54
|
.action(async (options) => {
|
|
52
55
|
try {
|
|
53
56
|
await initializeModules();
|
|
54
|
-
if (!options.full && !options.agent) {
|
|
57
|
+
if (!options.full && !options.agent && !options.team && !options.expansionOnly) {
|
|
55
58
|
// Interactive mode
|
|
56
59
|
const answers = await promptInstallation();
|
|
57
60
|
await installer.install(answers);
|
|
58
61
|
} else {
|
|
59
62
|
// Direct mode
|
|
63
|
+
let installType = 'full';
|
|
64
|
+
if (options.agent) installType = 'single-agent';
|
|
65
|
+
else if (options.team) installType = 'team';
|
|
66
|
+
else if (options.expansionOnly) installType = 'expansion-only';
|
|
67
|
+
|
|
60
68
|
const config = {
|
|
61
|
-
installType
|
|
69
|
+
installType,
|
|
62
70
|
agent: options.agent,
|
|
71
|
+
team: options.team,
|
|
63
72
|
directory: options.directory || '.bmad-core',
|
|
64
|
-
ides: options.ide || []
|
|
73
|
+
ides: (options.ide || []).filter(ide => ide !== 'other'),
|
|
74
|
+
expansionPacks: options.expansionPacks || []
|
|
65
75
|
};
|
|
66
76
|
await installer.install(config);
|
|
67
77
|
}
|
|
@@ -100,6 +110,19 @@ program
|
|
|
100
110
|
}
|
|
101
111
|
});
|
|
102
112
|
|
|
113
|
+
program
|
|
114
|
+
.command('list:expansions')
|
|
115
|
+
.description('List available expansion packs')
|
|
116
|
+
.action(async () => {
|
|
117
|
+
try {
|
|
118
|
+
await installer.listExpansionPacks();
|
|
119
|
+
} catch (error) {
|
|
120
|
+
if (!chalk) await initializeModules();
|
|
121
|
+
console.error(chalk.red('Error:'), error.message);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
103
126
|
program
|
|
104
127
|
.command('status')
|
|
105
128
|
.description('Show installation status')
|
|
@@ -124,8 +147,13 @@ async function promptInstallation() {
|
|
|
124
147
|
{
|
|
125
148
|
type: 'input',
|
|
126
149
|
name: 'directory',
|
|
127
|
-
message: '
|
|
128
|
-
|
|
150
|
+
message: 'Enter the full path to your project directory where BMAD should be installed:',
|
|
151
|
+
validate: (input) => {
|
|
152
|
+
if (!input.trim()) {
|
|
153
|
+
return 'Please enter a valid project path';
|
|
154
|
+
}
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
129
157
|
}
|
|
130
158
|
]);
|
|
131
159
|
answers.directory = directory;
|
|
@@ -141,9 +169,17 @@ async function promptInstallation() {
|
|
|
141
169
|
name: 'Complete installation (recommended) - All agents and tools',
|
|
142
170
|
value: 'full'
|
|
143
171
|
},
|
|
172
|
+
{
|
|
173
|
+
name: 'Team installation - Install a specific team with required agents',
|
|
174
|
+
value: 'team'
|
|
175
|
+
},
|
|
144
176
|
{
|
|
145
177
|
name: 'Single agent - Choose one agent to install',
|
|
146
178
|
value: 'single-agent'
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
name: 'Expansion packs only - Install expansion packs without bmad-core',
|
|
182
|
+
value: 'expansion-only'
|
|
147
183
|
}
|
|
148
184
|
]
|
|
149
185
|
}
|
|
@@ -167,6 +203,78 @@ async function promptInstallation() {
|
|
|
167
203
|
answers.agent = agent;
|
|
168
204
|
}
|
|
169
205
|
|
|
206
|
+
// If team installation, ask which team
|
|
207
|
+
if (installType === 'team') {
|
|
208
|
+
const teams = await installer.getAvailableTeams();
|
|
209
|
+
const { team } = await inquirer.prompt([
|
|
210
|
+
{
|
|
211
|
+
type: 'list',
|
|
212
|
+
name: 'team',
|
|
213
|
+
message: 'Select a team to install:',
|
|
214
|
+
choices: teams.map(t => ({
|
|
215
|
+
name: `${t.icon || '📋'} ${t.name}: ${t.description}`,
|
|
216
|
+
value: t.id
|
|
217
|
+
}))
|
|
218
|
+
}
|
|
219
|
+
]);
|
|
220
|
+
answers.team = team;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Ask for expansion pack selection
|
|
224
|
+
if (installType === 'full' || installType === 'team' || installType === 'expansion-only') {
|
|
225
|
+
try {
|
|
226
|
+
const availableExpansionPacks = await installer.getAvailableExpansionPacks();
|
|
227
|
+
|
|
228
|
+
if (availableExpansionPacks.length > 0) {
|
|
229
|
+
let choices;
|
|
230
|
+
let message;
|
|
231
|
+
|
|
232
|
+
if (installType === 'expansion-only') {
|
|
233
|
+
message = 'Select expansion packs to install (required):'
|
|
234
|
+
choices = availableExpansionPacks.map(pack => ({
|
|
235
|
+
name: `${pack.name} - ${pack.description}`,
|
|
236
|
+
value: pack.id
|
|
237
|
+
}));
|
|
238
|
+
} else {
|
|
239
|
+
message = 'Select expansion packs to install (optional):';
|
|
240
|
+
choices = [
|
|
241
|
+
{ name: 'Skip expansion packs', value: 'none', checked: true },
|
|
242
|
+
new inquirer.Separator(' --- Expansion Packs ---'),
|
|
243
|
+
...availableExpansionPacks.map(pack => ({
|
|
244
|
+
name: `${pack.name} - ${pack.description}`,
|
|
245
|
+
value: pack.id
|
|
246
|
+
}))
|
|
247
|
+
];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const { expansionPacks } = await inquirer.prompt([
|
|
251
|
+
{
|
|
252
|
+
type: 'checkbox',
|
|
253
|
+
name: 'expansionPacks',
|
|
254
|
+
message,
|
|
255
|
+
choices,
|
|
256
|
+
validate: installType === 'expansion-only' ? (answer) => {
|
|
257
|
+
if (answer.length < 1) {
|
|
258
|
+
return 'You must select at least one expansion pack for expansion-only installation.';
|
|
259
|
+
}
|
|
260
|
+
return true;
|
|
261
|
+
} : undefined
|
|
262
|
+
}
|
|
263
|
+
]);
|
|
264
|
+
|
|
265
|
+
// Filter out 'none' selection and only include actual expansion packs
|
|
266
|
+
answers.expansionPacks = expansionPacks.filter(pack => pack !== 'none');
|
|
267
|
+
} else {
|
|
268
|
+
answers.expansionPacks = [];
|
|
269
|
+
}
|
|
270
|
+
} catch (error) {
|
|
271
|
+
console.warn(chalk.yellow('Warning: Could not load expansion packs. Continuing without them.'));
|
|
272
|
+
answers.expansionPacks = [];
|
|
273
|
+
}
|
|
274
|
+
} else {
|
|
275
|
+
answers.expansionPacks = [];
|
|
276
|
+
}
|
|
277
|
+
|
|
170
278
|
// Ask for IDE configuration
|
|
171
279
|
const { ides } = await inquirer.prompt([
|
|
172
280
|
{
|
|
@@ -177,17 +285,20 @@ async function promptInstallation() {
|
|
|
177
285
|
{ name: 'Cursor', value: 'cursor' },
|
|
178
286
|
{ name: 'Claude Code', value: 'claude-code' },
|
|
179
287
|
{ name: 'Windsurf', value: 'windsurf' },
|
|
180
|
-
{ name: 'Roo Code', value: 'roo' }
|
|
288
|
+
{ name: 'Roo Code', value: 'roo' },
|
|
289
|
+
{ name: 'Other (skip IDE setup)', value: 'other' }
|
|
181
290
|
],
|
|
182
291
|
validate: (answer) => {
|
|
183
292
|
if (answer.length < 1) {
|
|
184
|
-
return 'You must choose at least one IDE
|
|
293
|
+
return 'You must choose at least one IDE option.';
|
|
185
294
|
}
|
|
186
295
|
return true;
|
|
187
296
|
}
|
|
188
297
|
}
|
|
189
298
|
]);
|
|
190
|
-
|
|
299
|
+
|
|
300
|
+
// Filter out 'other' from the list and only include actual IDEs
|
|
301
|
+
answers.ides = ides.filter(ide => ide !== 'other');
|
|
191
302
|
|
|
192
303
|
return answers;
|
|
193
304
|
}
|
|
@@ -3,55 +3,55 @@ installation-options:
|
|
|
3
3
|
name: Complete BMAD Core
|
|
4
4
|
description: Copy the entire .bmad-core folder with all agents, templates, and tools
|
|
5
5
|
action: copy-folder
|
|
6
|
-
source:
|
|
6
|
+
source: bmad-core
|
|
7
7
|
single-agent:
|
|
8
8
|
name: Single Agent
|
|
9
9
|
description: Select and install a single agent with its dependencies
|
|
10
10
|
action: copy-agent
|
|
11
11
|
agent-dependencies:
|
|
12
12
|
core-files:
|
|
13
|
-
-
|
|
13
|
+
- bmad-core/utils/template-format.md
|
|
14
14
|
dev:
|
|
15
|
-
-
|
|
16
|
-
-
|
|
15
|
+
- bmad-core/templates/story-tmpl.md
|
|
16
|
+
- bmad-core/checklists/story-dod-checklist.md
|
|
17
17
|
pm:
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
18
|
+
- bmad-core/templates/prd-tmpl.md
|
|
19
|
+
- bmad-core/templates/brownfield-prd-tmpl.md
|
|
20
|
+
- bmad-core/checklists/pm-checklist.md
|
|
21
|
+
- bmad-core/checklists/change-checklist.md
|
|
22
|
+
- bmad-core/tasks/advanced-elicitation.md
|
|
23
|
+
- bmad-core/tasks/create-doc.md
|
|
24
|
+
- bmad-core/tasks/correct-course.md
|
|
25
|
+
- bmad-core/tasks/create-deep-research-prompt.md
|
|
26
|
+
- bmad-core/tasks/brownfield-create-epic.md
|
|
27
|
+
- bmad-core/tasks/brownfield-create-story.md
|
|
28
|
+
- bmad-core/tasks/execute-checklist.md
|
|
29
|
+
- bmad-core/tasks/shard-doc.md
|
|
30
30
|
architect:
|
|
31
|
-
-
|
|
32
|
-
-
|
|
31
|
+
- bmad-core/templates/architecture-tmpl.md
|
|
32
|
+
- bmad-core/checklists/architect-checklist.md
|
|
33
33
|
sm:
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
34
|
+
- bmad-core/templates/story-tmpl.md
|
|
35
|
+
- bmad-core/checklists/story-draft-checklist.md
|
|
36
|
+
- bmad-core/workflows/*.yml
|
|
37
37
|
po:
|
|
38
|
-
-
|
|
39
|
-
-
|
|
38
|
+
- bmad-core/checklists/po-master-checklist.md
|
|
39
|
+
- bmad-core/templates/acceptance-criteria-tmpl.md
|
|
40
40
|
analyst:
|
|
41
|
-
-
|
|
42
|
-
-
|
|
41
|
+
- bmad-core/templates/prd-tmpl.md
|
|
42
|
+
- bmad-core/tasks/advanced-elicitation.md
|
|
43
43
|
qa:
|
|
44
|
-
-
|
|
45
|
-
-
|
|
44
|
+
- bmad-core/checklists/story-dod-checklist.md
|
|
45
|
+
- bmad-core/templates/test-plan-tmpl.md
|
|
46
46
|
ux-expert:
|
|
47
|
-
-
|
|
47
|
+
- bmad-core/templates/ux-tmpl.md
|
|
48
48
|
bmad-master:
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
49
|
+
- bmad-core/templates/*.md
|
|
50
|
+
- bmad-core/tasks/*.md
|
|
51
|
+
- bmad-core/schemas/*.yml
|
|
52
52
|
bmad-orchestrator:
|
|
53
|
-
-
|
|
54
|
-
-
|
|
53
|
+
- bmad-core/agent-teams/*.yml
|
|
54
|
+
- bmad-core/workflows/*.yml
|
|
55
55
|
ide-configurations:
|
|
56
56
|
cursor:
|
|
57
57
|
name: Cursor
|
|
@@ -99,41 +99,41 @@ ide-configurations:
|
|
|
99
99
|
available-agents:
|
|
100
100
|
- id: analyst
|
|
101
101
|
name: Business Analyst
|
|
102
|
-
file:
|
|
102
|
+
file: bmad-core/agents/analyst.md
|
|
103
103
|
description: Requirements gathering and analysis
|
|
104
104
|
- id: pm
|
|
105
105
|
name: Product Manager
|
|
106
|
-
file:
|
|
106
|
+
file: bmad-core/agents/pm.md
|
|
107
107
|
description: Product strategy and roadmap planning
|
|
108
108
|
- id: architect
|
|
109
109
|
name: Solution Architect
|
|
110
|
-
file:
|
|
110
|
+
file: bmad-core/agents/architect.md
|
|
111
111
|
description: Technical design and architecture
|
|
112
112
|
- id: po
|
|
113
113
|
name: Product Owner
|
|
114
|
-
file:
|
|
114
|
+
file: bmad-core/agents/po.md
|
|
115
115
|
description: Backlog management and prioritization
|
|
116
116
|
- id: sm
|
|
117
117
|
name: Scrum Master
|
|
118
|
-
file:
|
|
118
|
+
file: bmad-core/agents/sm.md
|
|
119
119
|
description: Agile process and story creation
|
|
120
120
|
- id: dev
|
|
121
121
|
name: Developer
|
|
122
|
-
file:
|
|
122
|
+
file: bmad-core/agents/dev.md
|
|
123
123
|
description: Code implementation and testing
|
|
124
124
|
- id: qa
|
|
125
125
|
name: QA Engineer
|
|
126
|
-
file:
|
|
126
|
+
file: bmad-core/agents/qa.md
|
|
127
127
|
description: Quality assurance and testing
|
|
128
128
|
- id: ux-expert
|
|
129
129
|
name: UX Expert
|
|
130
|
-
file:
|
|
130
|
+
file: bmad-core/agents/ux-expert.md
|
|
131
131
|
description: User experience design
|
|
132
132
|
- id: bmad-master
|
|
133
133
|
name: BMAD Master
|
|
134
|
-
file:
|
|
134
|
+
file: bmad-core/agents/bmad-master.md
|
|
135
135
|
description: BMAD framework expert and guide
|
|
136
136
|
- id: bmad-orchestrator
|
|
137
137
|
name: BMAD Orchestrator
|
|
138
|
-
file:
|
|
138
|
+
file: bmad-core/agents/bmad-orchestrator.md
|
|
139
139
|
description: Multi-agent workflow coordinator
|