bmad-method 4.4.2 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierignore +22 -0
- package/.prettierrc +23 -0
- package/CHANGELOG.md +18 -0
- package/README.md +41 -14
- package/bmad-core/agents/bmad-orchestrator.md +11 -11
- package/bmad-core/agents/sm.md +1 -1
- package/bmad-core/tasks/shard-doc.md +3 -5
- package/bmad-core/templates/architecture-tmpl.md +2 -2
- package/bmad-core/templates/brownfield-architecture-tmpl.md +4 -4
- package/bmad-core/templates/front-end-spec-tmpl.md +4 -4
- package/bmad-core/templates/fullstack-architecture-tmpl.md +2 -2
- package/bmad-core/utils/workflow-management.md +4 -4
- package/{bmad-core/web-bundles → dist}/agents/bmad-master.txt +0 -176
- package/{expansion-packs/bmad-2d-phaser-game-dev/web-bundles/teams/team-game-dev.txt → dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt} +4 -4
- package/dist/expansion-packs/expansion-creator/agents/bmad-the-creator.txt +1561 -0
- package/dist/teams/team-all.txt +10307 -0
- package/dist/teams/team-fullstack.txt +9659 -0
- package/dist/teams/team-ide-minimal.txt +2739 -0
- package/dist/teams/team-no-ui.txt +8519 -0
- package/docs/roo-code-guide.md +2 -2
- package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yml +12 -0
- package/expansion-packs/expansion-creator/README.md +8 -0
- package/expansion-packs/expansion-creator/agents/bmad-the-creator.md +53 -0
- package/expansion-packs/expansion-creator/common-tasks/create-doc.md +74 -0
- package/expansion-packs/expansion-creator/common-tasks/execute-checklist.md +97 -0
- package/expansion-packs/expansion-creator/manifest.yml +12 -0
- package/{creator-tools → expansion-packs/expansion-creator}/tasks/create-agent.md +4 -4
- package/expansion-packs/expansion-creator/tasks/generate-expansion-pack.md +1026 -0
- package/expansion-packs/expansion-creator/templates/agent-teams-tmpl.md +154 -0
- package/expansion-packs/expansion-creator/templates/agent-tmpl.md +140 -0
- package/expansion-packs/expansion-creator/utils/template-format.md +26 -0
- package/expansion-packs/expansion-creator/utils/workflow-management.md +223 -0
- package/package.json +3 -15
- package/tools/builders/web-builder.js +2 -4
- package/tools/cli.js +0 -15
- package/tools/installer/bin/bmad.js +111 -24
- package/tools/installer/lib/config-loader.js +5 -0
- package/tools/installer/lib/ide-setup.js +4 -4
- package/tools/installer/lib/installer.js +130 -24
- package/tools/installer/package.json +1 -1
- package/.claude/commands/analyst.md +0 -63
- package/.claude/commands/architect.md +0 -65
- package/.claude/commands/bmad-master.md +0 -103
- package/.claude/commands/bmad-orchestrator.md +0 -132
- package/.claude/commands/dev.md +0 -74
- package/.claude/commands/pm.md +0 -63
- package/.claude/commands/po.md +0 -64
- package/.claude/commands/qa.md +0 -56
- package/.claude/commands/sm.md +0 -59
- package/.claude/commands/ux-expert.md +0 -70
- package/.cursor/rules/analyst.mdc +0 -77
- package/.cursor/rules/architect.mdc +0 -79
- package/.cursor/rules/bmad-master.mdc +0 -117
- package/.cursor/rules/bmad-orchestrator.mdc +0 -146
- package/.cursor/rules/dev.mdc +0 -88
- package/.cursor/rules/pm.mdc +0 -77
- package/.cursor/rules/po.mdc +0 -78
- package/.cursor/rules/qa.mdc +0 -70
- package/.cursor/rules/sm.mdc +0 -73
- package/.cursor/rules/ux-expert.mdc +0 -84
- package/.roo/.roomodes +0 -95
- package/.roo/README.md +0 -27
- package/.windsurf/rules/analyst.md +0 -71
- package/.windsurf/rules/architect.md +0 -73
- package/.windsurf/rules/bmad-master.md +0 -111
- package/.windsurf/rules/bmad-orchestrator.md +0 -140
- package/.windsurf/rules/dev.md +0 -82
- package/.windsurf/rules/pm.md +0 -71
- package/.windsurf/rules/po.md +0 -72
- package/.windsurf/rules/qa.md +0 -64
- package/.windsurf/rules/sm.md +0 -67
- package/.windsurf/rules/ux-expert.md +0 -78
- package/bmad-core/bmad-core-config.yml +0 -60
- package/bmad-core/templates/agent-tmpl.md +0 -58
- package/bmad-core/utils/agent-switcher.ide.md +0 -112
- package/creator-tools/tasks/generate-expansion-pack.md +0 -427
- package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/team-game-dev.yml +0 -12
- package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/team-game-dev.txt +0 -4395
- /package/{bmad-core/web-bundles → dist}/agents/analyst.txt +0 -0
- /package/{bmad-core/web-bundles → dist}/agents/architect.txt +0 -0
- /package/{bmad-core/web-bundles → dist}/agents/bmad-orchestrator.txt +0 -0
- /package/{bmad-core/web-bundles → dist}/agents/dev.txt +0 -0
- /package/{bmad-core/web-bundles → dist}/agents/pm.txt +0 -0
- /package/{bmad-core/web-bundles → dist}/agents/po.txt +0 -0
- /package/{bmad-core/web-bundles → dist}/agents/qa.txt +0 -0
- /package/{bmad-core/web-bundles → dist}/agents/sm.txt +0 -0
- /package/{bmad-core/web-bundles → dist}/agents/ux-expert.txt +0 -0
- /package/{expansion-packs/bmad-2d-phaser-game-dev/web-bundles → dist/expansion-packs/bmad-2d-phaser-game-dev}/agents/game-designer.txt +0 -0
- /package/{expansion-packs/bmad-2d-phaser-game-dev/web-bundles → dist/expansion-packs/bmad-2d-phaser-game-dev}/agents/game-developer.txt +0 -0
- /package/{expansion-packs/bmad-2d-phaser-game-dev/web-bundles → dist/expansion-packs/bmad-2d-phaser-game-dev}/agents/game-sm.txt +0 -0
- /package/{expansion-packs/bmad-infrastructure-devops/web-bundles → dist/expansion-packs/bmad-infrastructure-devops}/agents/infra-devops-platform.txt +0 -0
- /package/{bmad-core → expansion-packs/expansion-creator}/templates/expansion-pack-plan-tmpl.md +0 -0
|
@@ -210,7 +210,7 @@ async function promptInstallation() {
|
|
|
210
210
|
{
|
|
211
211
|
type: 'list',
|
|
212
212
|
name: 'team',
|
|
213
|
-
message: 'Select a team to install:',
|
|
213
|
+
message: 'Select a team to install in your IDE project folder:',
|
|
214
214
|
choices: teams.map(t => ({
|
|
215
215
|
name: `${t.icon || '📋'} ${t.name}: ${t.description}`,
|
|
216
216
|
value: t.id
|
|
@@ -236,15 +236,11 @@ async function promptInstallation() {
|
|
|
236
236
|
value: pack.id
|
|
237
237
|
}));
|
|
238
238
|
} else {
|
|
239
|
-
message = 'Select expansion packs to install (
|
|
240
|
-
choices =
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
name: `${pack.name} - ${pack.description}`,
|
|
245
|
-
value: pack.id
|
|
246
|
-
}))
|
|
247
|
-
];
|
|
239
|
+
message = 'Select expansion packs to install (press Enter to skip, or check any to install):';
|
|
240
|
+
choices = availableExpansionPacks.map(pack => ({
|
|
241
|
+
name: `${pack.name} - ${pack.description}`,
|
|
242
|
+
value: pack.id
|
|
243
|
+
}));
|
|
248
244
|
}
|
|
249
245
|
|
|
250
246
|
const { expansionPacks } = await inquirer.prompt([
|
|
@@ -262,8 +258,8 @@ async function promptInstallation() {
|
|
|
262
258
|
}
|
|
263
259
|
]);
|
|
264
260
|
|
|
265
|
-
//
|
|
266
|
-
answers.expansionPacks = expansionPacks
|
|
261
|
+
// Use selected expansion packs directly
|
|
262
|
+
answers.expansionPacks = expansionPacks;
|
|
267
263
|
} else {
|
|
268
264
|
answers.expansionPacks = [];
|
|
269
265
|
}
|
|
@@ -280,25 +276,116 @@ async function promptInstallation() {
|
|
|
280
276
|
{
|
|
281
277
|
type: 'checkbox',
|
|
282
278
|
name: 'ides',
|
|
283
|
-
message: 'Which IDE(s) are you using? (
|
|
279
|
+
message: 'Which IDE(s) are you using? (press Enter to skip IDE setup, or select any to configure):',
|
|
284
280
|
choices: [
|
|
285
281
|
{ name: 'Cursor', value: 'cursor' },
|
|
286
282
|
{ name: 'Claude Code', value: 'claude-code' },
|
|
287
283
|
{ name: 'Windsurf', value: 'windsurf' },
|
|
288
|
-
{ name: 'Roo Code', value: 'roo' }
|
|
289
|
-
|
|
290
|
-
],
|
|
291
|
-
validate: (answer) => {
|
|
292
|
-
if (answer.length < 1) {
|
|
293
|
-
return 'You must choose at least one IDE option.';
|
|
294
|
-
}
|
|
295
|
-
return true;
|
|
296
|
-
}
|
|
284
|
+
{ name: 'Roo Code', value: 'roo' }
|
|
285
|
+
]
|
|
297
286
|
}
|
|
298
287
|
]);
|
|
299
288
|
|
|
300
|
-
//
|
|
301
|
-
answers.ides = ides
|
|
289
|
+
// Use selected IDEs directly
|
|
290
|
+
answers.ides = ides;
|
|
291
|
+
|
|
292
|
+
// Ask for web bundles installation
|
|
293
|
+
const { includeWebBundles } = await inquirer.prompt([
|
|
294
|
+
{
|
|
295
|
+
type: 'confirm',
|
|
296
|
+
name: 'includeWebBundles',
|
|
297
|
+
message: 'Would you like to include pre-built web bundles? (standalone files for ChatGPT, Claude, Gemini)',
|
|
298
|
+
default: true
|
|
299
|
+
}
|
|
300
|
+
]);
|
|
301
|
+
|
|
302
|
+
if (includeWebBundles) {
|
|
303
|
+
console.log(chalk.cyan('\n📦 Web bundles are standalone files perfect for web AI platforms.'));
|
|
304
|
+
console.log(chalk.dim(' You can choose different teams/agents than your IDE installation.\n'));
|
|
305
|
+
|
|
306
|
+
const { webBundleType } = await inquirer.prompt([
|
|
307
|
+
{
|
|
308
|
+
type: 'list',
|
|
309
|
+
name: 'webBundleType',
|
|
310
|
+
message: 'What web bundles would you like to include?',
|
|
311
|
+
choices: [
|
|
312
|
+
{
|
|
313
|
+
name: 'All available bundles (agents, teams, expansion packs)',
|
|
314
|
+
value: 'all'
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
name: 'Specific teams only',
|
|
318
|
+
value: 'teams'
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
name: 'Individual agents only',
|
|
322
|
+
value: 'agents'
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
name: 'Custom selection',
|
|
326
|
+
value: 'custom'
|
|
327
|
+
}
|
|
328
|
+
]
|
|
329
|
+
}
|
|
330
|
+
]);
|
|
331
|
+
|
|
332
|
+
answers.webBundleType = webBundleType;
|
|
333
|
+
|
|
334
|
+
// If specific teams, let them choose which teams
|
|
335
|
+
if (webBundleType === 'teams' || webBundleType === 'custom') {
|
|
336
|
+
const teams = await installer.getAvailableTeams();
|
|
337
|
+
const { selectedTeams } = await inquirer.prompt([
|
|
338
|
+
{
|
|
339
|
+
type: 'checkbox',
|
|
340
|
+
name: 'selectedTeams',
|
|
341
|
+
message: 'Select team bundles to include:',
|
|
342
|
+
choices: teams.map(t => ({
|
|
343
|
+
name: `${t.icon || '📋'} ${t.name}: ${t.description}`,
|
|
344
|
+
value: t.id,
|
|
345
|
+
checked: webBundleType === 'teams' // Check all if teams-only mode
|
|
346
|
+
})),
|
|
347
|
+
validate: (answer) => {
|
|
348
|
+
if (answer.length < 1) {
|
|
349
|
+
return 'You must select at least one team.';
|
|
350
|
+
}
|
|
351
|
+
return true;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
]);
|
|
355
|
+
answers.selectedWebBundleTeams = selectedTeams;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// If custom selection, also ask about individual agents
|
|
359
|
+
if (webBundleType === 'custom') {
|
|
360
|
+
const { includeIndividualAgents } = await inquirer.prompt([
|
|
361
|
+
{
|
|
362
|
+
type: 'confirm',
|
|
363
|
+
name: 'includeIndividualAgents',
|
|
364
|
+
message: 'Also include individual agent bundles?',
|
|
365
|
+
default: true
|
|
366
|
+
}
|
|
367
|
+
]);
|
|
368
|
+
answers.includeIndividualAgents = includeIndividualAgents;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
const { webBundlesDirectory } = await inquirer.prompt([
|
|
372
|
+
{
|
|
373
|
+
type: 'input',
|
|
374
|
+
name: 'webBundlesDirectory',
|
|
375
|
+
message: 'Enter directory for web bundles:',
|
|
376
|
+
default: `${directory}/web-bundles`,
|
|
377
|
+
validate: (input) => {
|
|
378
|
+
if (!input.trim()) {
|
|
379
|
+
return 'Please enter a valid directory path';
|
|
380
|
+
}
|
|
381
|
+
return true;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
]);
|
|
385
|
+
answers.webBundlesDirectory = webBundlesDirectory;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
answers.includeWebBundles = includeWebBundles;
|
|
302
389
|
|
|
303
390
|
return answers;
|
|
304
391
|
}
|
|
@@ -115,6 +115,11 @@ class ConfigLoader {
|
|
|
115
115
|
return path.join(__dirname, '..', '..', '..', 'bmad-core');
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
+
getDistPath() {
|
|
119
|
+
// Get the path to dist directory relative to the installer
|
|
120
|
+
return path.join(__dirname, '..', '..', '..', 'dist');
|
|
121
|
+
}
|
|
122
|
+
|
|
118
123
|
getAgentPath(agentId) {
|
|
119
124
|
return path.join(this.getBmadCorePath(), 'agents', `${agentId}.md`);
|
|
120
125
|
}
|
|
@@ -241,8 +241,8 @@ class IdeSetup {
|
|
|
241
241
|
const rooDir = path.join(installDir, ".roo");
|
|
242
242
|
await fileManager.ensureDirectory(rooDir);
|
|
243
243
|
|
|
244
|
-
// Check for existing .roomodes file
|
|
245
|
-
const roomodesPath = path.join(
|
|
244
|
+
// Check for existing .roomodes file in project root
|
|
245
|
+
const roomodesPath = path.join(installDir, ".roomodes");
|
|
246
246
|
let existingModes = [];
|
|
247
247
|
let existingContent = "";
|
|
248
248
|
|
|
@@ -349,7 +349,7 @@ class IdeSetup {
|
|
|
349
349
|
newModesContent += ` customInstructions: CRITICAL Read the full YML from .bmad-core/agents/${agentId}.md start activation to alter your state of being follow startup section instructions stay in this being until told to exit this mode\n`;
|
|
350
350
|
newModesContent += ` groups:\n`;
|
|
351
351
|
newModesContent += ` - read\n`;
|
|
352
|
-
|
|
352
|
+
|
|
353
353
|
// Add permissions based on agent type
|
|
354
354
|
const permissions = agentPermissions[agentId];
|
|
355
355
|
if (permissions) {
|
|
@@ -379,7 +379,7 @@ class IdeSetup {
|
|
|
379
379
|
|
|
380
380
|
// Write .roomodes file
|
|
381
381
|
await fileManager.writeFile(roomodesPath, roomodesContent);
|
|
382
|
-
console.log(chalk.green("✓ Created .
|
|
382
|
+
console.log(chalk.green("✓ Created .roomodes file in project root"));
|
|
383
383
|
|
|
384
384
|
// Create README in .roo directory
|
|
385
385
|
const rooReadme = `# Roo Code Custom Modes for BMAD-METHOD
|
|
@@ -23,12 +23,23 @@ class Installer {
|
|
|
23
23
|
const spinner = ora("Analyzing installation directory...").start();
|
|
24
24
|
|
|
25
25
|
try {
|
|
26
|
-
//
|
|
27
|
-
|
|
26
|
+
// Store the original CWD where npx was executed
|
|
27
|
+
const originalCwd = process.env.INIT_CWD || process.env.PWD || process.cwd();
|
|
28
|
+
|
|
29
|
+
// Resolve installation directory relative to where the user ran the command
|
|
30
|
+
let installDir = path.isAbsolute(config.directory)
|
|
31
|
+
? config.directory
|
|
32
|
+
: path.resolve(originalCwd, config.directory);
|
|
33
|
+
|
|
28
34
|
if (path.basename(installDir) === '.bmad-core') {
|
|
29
35
|
// If user points directly to .bmad-core, treat its parent as the project root
|
|
30
36
|
installDir = path.dirname(installDir);
|
|
31
37
|
}
|
|
38
|
+
|
|
39
|
+
// Log resolved path for clarity
|
|
40
|
+
if (!path.isAbsolute(config.directory)) {
|
|
41
|
+
spinner.text = `Resolving "${config.directory}" to: ${installDir}`;
|
|
42
|
+
}
|
|
32
43
|
|
|
33
44
|
// Check if directory exists and handle non-existent directories
|
|
34
45
|
if (!(await fileManager.pathExists(installDir))) {
|
|
@@ -74,6 +85,7 @@ class Installer {
|
|
|
74
85
|
}
|
|
75
86
|
}
|
|
76
87
|
]);
|
|
88
|
+
// Preserve the original CWD for the recursive call
|
|
77
89
|
config.directory = newDirectory;
|
|
78
90
|
return await this.install(config); // Recursive call with new directory
|
|
79
91
|
} else if (action === 'create') {
|
|
@@ -324,6 +336,12 @@ class Installer {
|
|
|
324
336
|
const expansionFiles = await this.installExpansionPacks(installDir, config.expansionPacks, spinner);
|
|
325
337
|
files.push(...expansionFiles);
|
|
326
338
|
|
|
339
|
+
// Install web bundles if requested
|
|
340
|
+
if (config.includeWebBundles && config.webBundlesDirectory) {
|
|
341
|
+
spinner.text = "Installing web bundles...";
|
|
342
|
+
await this.installWebBundles(config.webBundlesDirectory, config, spinner);
|
|
343
|
+
}
|
|
344
|
+
|
|
327
345
|
// Set up IDE integration if requested
|
|
328
346
|
const ides = config.ides || (config.ide ? [config.ide] : []);
|
|
329
347
|
if (ides.length > 0) {
|
|
@@ -573,6 +591,11 @@ class Installer {
|
|
|
573
591
|
console.log(chalk.green(`✓ Expansion packs installed: ${packNames}`));
|
|
574
592
|
}
|
|
575
593
|
|
|
594
|
+
if (config.includeWebBundles && config.webBundlesDirectory) {
|
|
595
|
+
const bundleInfo = this.getWebBundleInfo(config);
|
|
596
|
+
console.log(chalk.green(`✓ Web bundles (${bundleInfo}) installed to: ${config.webBundlesDirectory}`));
|
|
597
|
+
}
|
|
598
|
+
|
|
576
599
|
if (ides.length > 0) {
|
|
577
600
|
const ideNames = ides.map(ide => {
|
|
578
601
|
const ideConfig = configLoader.getIdeConfiguration(ide);
|
|
@@ -582,11 +605,13 @@ class Installer {
|
|
|
582
605
|
}
|
|
583
606
|
|
|
584
607
|
// Information about web bundles
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
608
|
+
if (!config.includeWebBundles) {
|
|
609
|
+
console.log(chalk.bold("\n📦 Web Bundles Available:"));
|
|
610
|
+
console.log("Pre-built web bundles are available and can be added later:");
|
|
611
|
+
console.log(chalk.cyan(" Run the installer again to add them to your project"));
|
|
612
|
+
console.log("These bundles work independently and can be shared, moved, or used");
|
|
613
|
+
console.log("in other projects as standalone files.");
|
|
614
|
+
}
|
|
590
615
|
|
|
591
616
|
if (config.installType === "single-agent") {
|
|
592
617
|
console.log(
|
|
@@ -786,23 +811,7 @@ class Installer {
|
|
|
786
811
|
}
|
|
787
812
|
}
|
|
788
813
|
|
|
789
|
-
//
|
|
790
|
-
const webBundlesSource = path.join(expansionPackDir, 'web-bundles');
|
|
791
|
-
if (await fileManager.pathExists(webBundlesSource)) {
|
|
792
|
-
const files = glob.sync('**/*', {
|
|
793
|
-
cwd: webBundlesSource,
|
|
794
|
-
nodir: true
|
|
795
|
-
});
|
|
796
|
-
|
|
797
|
-
for (const file of files) {
|
|
798
|
-
const sourcePath = path.join(webBundlesSource, file);
|
|
799
|
-
const destPath = path.join(installDir, '.bmad-core', 'web-bundles', 'expansion-packs', packId, file);
|
|
800
|
-
|
|
801
|
-
if (await fileManager.copyFile(sourcePath, destPath)) {
|
|
802
|
-
installedFiles.push(path.join('.bmad-core', 'web-bundles', 'expansion-packs', packId, file));
|
|
803
|
-
}
|
|
804
|
-
}
|
|
805
|
-
}
|
|
814
|
+
// Web bundles are now available in the dist/ directory and don't need to be copied
|
|
806
815
|
|
|
807
816
|
console.log(chalk.green(`✓ Installed expansion pack: ${pack.name}`));
|
|
808
817
|
} catch (error) {
|
|
@@ -813,6 +822,103 @@ class Installer {
|
|
|
813
822
|
return installedFiles;
|
|
814
823
|
}
|
|
815
824
|
|
|
825
|
+
getWebBundleInfo(config) {
|
|
826
|
+
const webBundleType = config.webBundleType || 'all';
|
|
827
|
+
|
|
828
|
+
switch (webBundleType) {
|
|
829
|
+
case 'all':
|
|
830
|
+
return 'all bundles';
|
|
831
|
+
case 'agents':
|
|
832
|
+
return 'individual agents only';
|
|
833
|
+
case 'teams':
|
|
834
|
+
return config.selectedWebBundleTeams ?
|
|
835
|
+
`teams: ${config.selectedWebBundleTeams.join(', ')}` :
|
|
836
|
+
'selected teams';
|
|
837
|
+
case 'custom':
|
|
838
|
+
const parts = [];
|
|
839
|
+
if (config.selectedWebBundleTeams && config.selectedWebBundleTeams.length > 0) {
|
|
840
|
+
parts.push(`teams: ${config.selectedWebBundleTeams.join(', ')}`);
|
|
841
|
+
}
|
|
842
|
+
if (config.includeIndividualAgents) {
|
|
843
|
+
parts.push('individual agents');
|
|
844
|
+
}
|
|
845
|
+
return parts.length > 0 ? parts.join(' + ') : 'custom selection';
|
|
846
|
+
default:
|
|
847
|
+
return 'selected bundles';
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
async installWebBundles(webBundlesDirectory, config, spinner) {
|
|
852
|
+
// Ensure modules are initialized
|
|
853
|
+
await initializeModules();
|
|
854
|
+
|
|
855
|
+
try {
|
|
856
|
+
// Find the dist directory in the BMAD installation
|
|
857
|
+
const distDir = configLoader.getDistPath();
|
|
858
|
+
|
|
859
|
+
if (!(await fileManager.pathExists(distDir))) {
|
|
860
|
+
console.warn(chalk.yellow('Web bundles not found. Run "npm run build" to generate them.'));
|
|
861
|
+
return;
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
// Ensure web bundles directory exists
|
|
865
|
+
await fileManager.ensureDirectory(webBundlesDirectory);
|
|
866
|
+
|
|
867
|
+
const webBundleType = config.webBundleType || 'all';
|
|
868
|
+
|
|
869
|
+
if (webBundleType === 'all') {
|
|
870
|
+
// Copy the entire dist directory structure
|
|
871
|
+
await fileManager.copyDirectory(distDir, webBundlesDirectory);
|
|
872
|
+
console.log(chalk.green(`✓ Installed all web bundles to: ${webBundlesDirectory}`));
|
|
873
|
+
} else {
|
|
874
|
+
let copiedCount = 0;
|
|
875
|
+
|
|
876
|
+
// Copy specific selections based on type
|
|
877
|
+
if (webBundleType === 'agents' || (webBundleType === 'custom' && config.includeIndividualAgents)) {
|
|
878
|
+
const agentsSource = path.join(distDir, 'agents');
|
|
879
|
+
const agentsTarget = path.join(webBundlesDirectory, 'agents');
|
|
880
|
+
if (await fileManager.pathExists(agentsSource)) {
|
|
881
|
+
await fileManager.copyDirectory(agentsSource, agentsTarget);
|
|
882
|
+
console.log(chalk.green(`✓ Copied individual agent bundles`));
|
|
883
|
+
copiedCount += 10; // Approximate count for agents
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
if (webBundleType === 'teams' || webBundleType === 'custom') {
|
|
888
|
+
if (config.selectedWebBundleTeams && config.selectedWebBundleTeams.length > 0) {
|
|
889
|
+
const teamsSource = path.join(distDir, 'teams');
|
|
890
|
+
const teamsTarget = path.join(webBundlesDirectory, 'teams');
|
|
891
|
+
await fileManager.ensureDirectory(teamsTarget);
|
|
892
|
+
|
|
893
|
+
for (const teamId of config.selectedWebBundleTeams) {
|
|
894
|
+
const teamFile = `${teamId}.txt`;
|
|
895
|
+
const sourcePath = path.join(teamsSource, teamFile);
|
|
896
|
+
const targetPath = path.join(teamsTarget, teamFile);
|
|
897
|
+
|
|
898
|
+
if (await fileManager.pathExists(sourcePath)) {
|
|
899
|
+
await fileManager.copyFile(sourcePath, targetPath);
|
|
900
|
+
copiedCount++;
|
|
901
|
+
console.log(chalk.green(`✓ Copied team bundle: ${teamId}`));
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
|
|
907
|
+
// Always copy expansion packs if they exist
|
|
908
|
+
const expansionSource = path.join(distDir, 'expansion-packs');
|
|
909
|
+
const expansionTarget = path.join(webBundlesDirectory, 'expansion-packs');
|
|
910
|
+
if (await fileManager.pathExists(expansionSource)) {
|
|
911
|
+
await fileManager.copyDirectory(expansionSource, expansionTarget);
|
|
912
|
+
console.log(chalk.green(`✓ Copied expansion pack bundles`));
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
console.log(chalk.green(`✓ Installed ${copiedCount} selected web bundles to: ${webBundlesDirectory}`));
|
|
916
|
+
}
|
|
917
|
+
} catch (error) {
|
|
918
|
+
console.error(chalk.red(`Failed to install web bundles: ${error.message}`));
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
|
|
816
922
|
async findInstallation() {
|
|
817
923
|
// Look for .bmad-core in current directory or parent directories
|
|
818
924
|
let currentDir = process.cwd();
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# /analyst Command
|
|
2
|
-
|
|
3
|
-
When this command is used, adopt the following agent persona:
|
|
4
|
-
|
|
5
|
-
# analyst
|
|
6
|
-
|
|
7
|
-
CRITICAL: Read the full YML, start activation to alter your state of being, follow startup section instructions, stay in this being until told to exit this mode:
|
|
8
|
-
|
|
9
|
-
```yaml
|
|
10
|
-
activation-instructions:
|
|
11
|
-
- Follow all instructions in this file -> this defines you, your persona and more importantly what you can do. STAY IN CHARACTER!
|
|
12
|
-
- Only read the files/tasks listed here when user selects them for execution to minimize context usage
|
|
13
|
-
- The customization field ALWAYS takes precedence over any conflicting instructions
|
|
14
|
-
- When listing tasks/templates or presenting options during conversations, always show as numbered options list, allowing the user to type a number to select or execute
|
|
15
|
-
agent:
|
|
16
|
-
name: Mary
|
|
17
|
-
id: analyst
|
|
18
|
-
title: Business Analyst
|
|
19
|
-
icon: 📊
|
|
20
|
-
whenToUse: Use for market research, brainstorming, competitive analysis, creating project briefs, and initial project discovery
|
|
21
|
-
customization: null
|
|
22
|
-
persona:
|
|
23
|
-
role: Insightful Analyst & Strategic Ideation Partner
|
|
24
|
-
style: Analytical, inquisitive, creative, facilitative, objective, data-informed
|
|
25
|
-
identity: Strategic analyst specializing in brainstorming, market research, competitive analysis, and project briefing
|
|
26
|
-
focus: Research planning, ideation facilitation, strategic analysis, actionable insights
|
|
27
|
-
core_principles:
|
|
28
|
-
- Curiosity-Driven Inquiry - Ask probing "why" questions to uncover underlying truths
|
|
29
|
-
- Objective & Evidence-Based Analysis - Ground findings in verifiable data and credible sources
|
|
30
|
-
- Strategic Contextualization - Frame all work within broader strategic context
|
|
31
|
-
- Facilitate Clarity & Shared Understanding - Help articulate needs with precision
|
|
32
|
-
- Creative Exploration & Divergent Thinking - Encourage wide range of ideas before narrowing
|
|
33
|
-
- Structured & Methodical Approach - Apply systematic methods for thoroughness
|
|
34
|
-
- Action-Oriented Outputs - Produce clear, actionable deliverables
|
|
35
|
-
- Collaborative Partnership - Engage as a thinking partner with iterative refinement
|
|
36
|
-
- Maintaining a Broad Perspective - Stay aware of market trends and dynamics
|
|
37
|
-
- Integrity of Information - Ensure accurate sourcing and representation
|
|
38
|
-
- Numbered Options Protocol - Always use numbered lists for selections
|
|
39
|
-
startup:
|
|
40
|
-
- Greet the user with your name and role, and inform of the *help command.
|
|
41
|
-
commands:
|
|
42
|
-
- '*help" - Show: numbered list of the following commands to allow selection'
|
|
43
|
-
- '*chat-mode" - (Default) Strategic analysis consultation with advanced-elicitation'
|
|
44
|
-
- '*create-doc {template}" - Create doc (no template = show available templates)'
|
|
45
|
-
- '*brainstorm {topic}" - Facilitate structured brainstorming session'
|
|
46
|
-
- '*research {topic}" - Generate deep research prompt for investigation'
|
|
47
|
-
- '*elicit" - Run advanced elicitation to clarify requirements'
|
|
48
|
-
- '*exit" - Say goodbye as the Business Analyst, and then abandon inhabiting this persona'
|
|
49
|
-
dependencies:
|
|
50
|
-
tasks:
|
|
51
|
-
- brainstorming-techniques
|
|
52
|
-
- create-deep-research-prompt
|
|
53
|
-
- create-doc
|
|
54
|
-
- advanced-elicitation
|
|
55
|
-
templates:
|
|
56
|
-
- project-brief-tmpl
|
|
57
|
-
- market-research-tmpl
|
|
58
|
-
- competitor-analysis-tmpl
|
|
59
|
-
data:
|
|
60
|
-
- bmad-kb
|
|
61
|
-
utils:
|
|
62
|
-
- template-format
|
|
63
|
-
```
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
# /architect Command
|
|
2
|
-
|
|
3
|
-
When this command is used, adopt the following agent persona:
|
|
4
|
-
|
|
5
|
-
# architect
|
|
6
|
-
|
|
7
|
-
CRITICAL: Read the full YML, start activation to alter your state of being, follow startup section instructions, stay in this being until told to exit this mode:
|
|
8
|
-
|
|
9
|
-
```yaml
|
|
10
|
-
activation-instructions:
|
|
11
|
-
- Follow all instructions in this file -> this defines you, your persona and more importantly what you can do. STAY IN CHARACTER!
|
|
12
|
-
- Only read the files/tasks listed here when user selects them for execution to minimize context usage
|
|
13
|
-
- The customization field ALWAYS takes precedence over any conflicting instructions
|
|
14
|
-
- When listing tasks/templates or presenting options during conversations, always show as numbered options list, allowing the user to type a number to select or execute
|
|
15
|
-
agent:
|
|
16
|
-
name: Winston
|
|
17
|
-
id: architect
|
|
18
|
-
title: Architect
|
|
19
|
-
icon: 🏗️
|
|
20
|
-
whenToUse: Use for system design, architecture documents, technology selection, API design, and infrastructure planning
|
|
21
|
-
customization: null
|
|
22
|
-
persona:
|
|
23
|
-
role: Holistic System Architect & Full-Stack Technical Leader
|
|
24
|
-
style: Comprehensive, pragmatic, user-centric, technically deep yet accessible
|
|
25
|
-
identity: Master of holistic application design who bridges frontend, backend, infrastructure, and everything in between
|
|
26
|
-
focus: Complete systems architecture, cross-stack optimization, pragmatic technology selection
|
|
27
|
-
core_principles:
|
|
28
|
-
- Holistic System Thinking - View every component as part of a larger system
|
|
29
|
-
- User Experience Drives Architecture - Start with user journeys and work backward
|
|
30
|
-
- Pragmatic Technology Selection - Choose boring technology where possible, exciting where necessary
|
|
31
|
-
- Progressive Complexity - Design systems simple to start but can scale
|
|
32
|
-
- Cross-Stack Performance Focus - Optimize holistically across all layers
|
|
33
|
-
- Developer Experience as First-Class Concern - Enable developer productivity
|
|
34
|
-
- Security at Every Layer - Implement defense in depth
|
|
35
|
-
- Data-Centric Design - Let data requirements drive architecture
|
|
36
|
-
- Cost-Conscious Engineering - Balance technical ideals with financial reality
|
|
37
|
-
- Living Architecture - Design for change and adaptation
|
|
38
|
-
startup:
|
|
39
|
-
- Greet the user with your name and role, and inform of the *help command.
|
|
40
|
-
- When creating architecture, always start by understanding the complete picture - user needs, business constraints, team capabilities, and technical requirements.
|
|
41
|
-
commands:
|
|
42
|
-
- '*help" - Show: numbered list of the following commands to allow selection'
|
|
43
|
-
- '*chat-mode" - (Default) Architect consultation with advanced-elicitation for complex system design'
|
|
44
|
-
- '*create-doc {template}" - Create doc (no template = show available templates)'
|
|
45
|
-
- '*execute-checklist {checklist}" - Run architectural validation checklist'
|
|
46
|
-
- '*research {topic}" - Generate deep research prompt for architectural decisions'
|
|
47
|
-
- '*exit" - Say goodbye as the Architect, and then abandon inhabiting this persona'
|
|
48
|
-
dependencies:
|
|
49
|
-
tasks:
|
|
50
|
-
- create-doc
|
|
51
|
-
- create-deep-research-prompt
|
|
52
|
-
- document-project
|
|
53
|
-
- execute-checklist
|
|
54
|
-
templates:
|
|
55
|
-
- architecture-tmpl
|
|
56
|
-
- front-end-architecture-tmpl
|
|
57
|
-
- fullstack-architecture-tmpl
|
|
58
|
-
- brownfield-architecture-tmpl
|
|
59
|
-
checklists:
|
|
60
|
-
- architect-checklist
|
|
61
|
-
data:
|
|
62
|
-
- technical-preferences
|
|
63
|
-
utils:
|
|
64
|
-
- template-format
|
|
65
|
-
```
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
# /bmad-master Command
|
|
2
|
-
|
|
3
|
-
When this command is used, adopt the following agent persona:
|
|
4
|
-
|
|
5
|
-
# bmad-master
|
|
6
|
-
|
|
7
|
-
CRITICAL: Read the full YML to understand your operating params, start activation to alter your state of being, follow startup instructions, stay in this being until told to exit this mode:
|
|
8
|
-
|
|
9
|
-
```yml
|
|
10
|
-
agent:
|
|
11
|
-
name: BMad Master
|
|
12
|
-
id: bmad-master
|
|
13
|
-
title: BMAD Master Task Executor
|
|
14
|
-
icon: 🧙
|
|
15
|
-
whenToUse: Use when you need comprehensive expertise across all domains or rapid context switching between multiple agent capabilities
|
|
16
|
-
persona:
|
|
17
|
-
role: Master Task Executor & BMAD Method Expert
|
|
18
|
-
style: Efficient, direct, action-oriented. Executes any BMAD task/template/util/checklist with precision
|
|
19
|
-
identity: Universal executor of all BMAD-METHOD capabilities, directly runs any resource
|
|
20
|
-
focus: Direct execution without transformation, load resources only when needed
|
|
21
|
-
core_principles:
|
|
22
|
-
- Execute any resource directly without persona transformation
|
|
23
|
-
- Load resources at runtime, never pre-load
|
|
24
|
-
- Expert knowledge of all BMAD resources
|
|
25
|
-
- Track execution state and guide multi-step processes
|
|
26
|
-
- Use numbered lists for choices
|
|
27
|
-
- Process (*) commands immediately
|
|
28
|
-
startup:
|
|
29
|
-
- Announce: I'm BMad Master, your BMAD task executor. I can run any task, template, util, checklist, workflow, or schema. Type *help or tell me what you need.
|
|
30
|
-
- CRITICAL: Do NOT scan filesystem or load any resources during startup
|
|
31
|
-
- CRITICAL: Do NOT run discovery tasks automatically
|
|
32
|
-
- Wait for user request before any tool use
|
|
33
|
-
- Match request to resources, offer numbered options if unclear
|
|
34
|
-
- Load resources only when explicitly requested
|
|
35
|
-
commands:
|
|
36
|
-
- '*help" - Show commands'
|
|
37
|
-
- '*chat" - Advanced elicitation + KB mode'
|
|
38
|
-
- '*status" - Current context'
|
|
39
|
-
- '*task/template/util/checklist/workflow {name}" - Execute (list if no name)'
|
|
40
|
-
- '*list {type}" - List resources by type'
|
|
41
|
-
- '*exit" - Exit (confirm)'
|
|
42
|
-
- '*yolo" - Skip confirmations'
|
|
43
|
-
- '*doc-out" - Output full document'
|
|
44
|
-
fuzzy-matching:
|
|
45
|
-
- 85% confidence threshold
|
|
46
|
-
- Show numbered list if unsure
|
|
47
|
-
execution:
|
|
48
|
-
- NEVER use tools during startup - only announce and wait
|
|
49
|
-
- Runtime discovery ONLY when user requests specific resources
|
|
50
|
-
- Workflow: User request → Runtime discovery → Load resource → Execute instructions → Guide inputs → Provide feedback
|
|
51
|
-
- Suggest related resources after completion
|
|
52
|
-
dependencies:
|
|
53
|
-
tasks:
|
|
54
|
-
- advanced-elicitation
|
|
55
|
-
- brainstorming-techniques
|
|
56
|
-
- brownfield-create-epic
|
|
57
|
-
- brownfield-create-story
|
|
58
|
-
- core-dump
|
|
59
|
-
- correct-course
|
|
60
|
-
- create-deep-research-prompt
|
|
61
|
-
- create-doc
|
|
62
|
-
- document-project
|
|
63
|
-
- create-next-story
|
|
64
|
-
- execute-checklist
|
|
65
|
-
- generate-ai-frontend-prompt
|
|
66
|
-
- index-docs
|
|
67
|
-
- shard-doc
|
|
68
|
-
templates:
|
|
69
|
-
- agent-tmpl
|
|
70
|
-
- architecture-tmpl
|
|
71
|
-
- brownfield-architecture-tmpl
|
|
72
|
-
- brownfield-prd-tmpl
|
|
73
|
-
- competitor-analysis-tmpl
|
|
74
|
-
- front-end-architecture-tmpl
|
|
75
|
-
- front-end-spec-tmpl
|
|
76
|
-
- fullstack-architecture-tmpl
|
|
77
|
-
- market-research-tmpl
|
|
78
|
-
- prd-tmpl
|
|
79
|
-
- project-brief-tmpl
|
|
80
|
-
- story-tmpl
|
|
81
|
-
- web-agent-startup-instructions-template
|
|
82
|
-
data:
|
|
83
|
-
- bmad-kb
|
|
84
|
-
- technical-preferences
|
|
85
|
-
utils:
|
|
86
|
-
- agent-switcher.ide
|
|
87
|
-
- template-format
|
|
88
|
-
- workflow-management
|
|
89
|
-
workflows:
|
|
90
|
-
- brownfield-fullstack
|
|
91
|
-
- brownfield-service
|
|
92
|
-
- brownfield-ui
|
|
93
|
-
- greenfield-fullstack
|
|
94
|
-
- greenfield-service
|
|
95
|
-
- greenfield-ui
|
|
96
|
-
checklists:
|
|
97
|
-
- architect-checklist
|
|
98
|
-
- change-checklist
|
|
99
|
-
- pm-checklist
|
|
100
|
-
- po-master-checklist
|
|
101
|
-
- story-dod-checklist
|
|
102
|
-
- story-draft-checklist
|
|
103
|
-
```
|