bmad-method 4.42.1 → 4.43.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/CONTRIBUTING.md +2 -9
  2. package/README.md +0 -98
  3. package/bmad-core/agents/bmad-master.md +6 -6
  4. package/bmad-core/data/bmad-kb.md +1 -0
  5. package/bmad-core/tasks/validate-next-story.md +1 -1
  6. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +5 -5
  7. package/dist/agents/analyst.txt +1 -0
  8. package/dist/agents/architect.txt +5 -5
  9. package/dist/agents/bmad-master.txt +12 -11
  10. package/dist/agents/bmad-orchestrator.txt +1 -0
  11. package/dist/agents/dev.txt +1 -1
  12. package/dist/agents/po.txt +1 -1
  13. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +1 -1
  14. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +1 -1
  15. package/dist/expansion-packs/bmad-godot-game-dev/agents/bmad-orchestrator.txt +1513 -0
  16. package/dist/expansion-packs/bmad-godot-game-dev/agents/game-analyst.txt +3190 -0
  17. package/dist/expansion-packs/bmad-godot-game-dev/agents/game-architect.txt +4499 -0
  18. package/dist/expansion-packs/bmad-godot-game-dev/agents/game-designer.txt +3925 -0
  19. package/dist/expansion-packs/bmad-godot-game-dev/agents/game-developer.txt +666 -0
  20. package/dist/expansion-packs/bmad-godot-game-dev/agents/game-pm.txt +2381 -0
  21. package/dist/expansion-packs/bmad-godot-game-dev/agents/game-po.txt +1612 -0
  22. package/dist/expansion-packs/bmad-godot-game-dev/agents/game-qa.txt +1745 -0
  23. package/dist/expansion-packs/bmad-godot-game-dev/agents/game-sm.txt +1208 -0
  24. package/dist/expansion-packs/bmad-godot-game-dev/agents/game-ux-expert.txt +958 -0
  25. package/dist/expansion-packs/bmad-godot-game-dev/teams/godot-game-team.txt +27721 -0
  26. package/dist/teams/team-all.txt +7 -6
  27. package/dist/teams/team-fullstack.txt +7 -6
  28. package/dist/teams/team-ide-minimal.txt +2 -1
  29. package/dist/teams/team-no-ui.txt +7 -6
  30. package/docs/GUIDING-PRINCIPLES.md +3 -3
  31. package/docs/expansion-packs.md +3 -83
  32. package/docs/flattener.md +91 -0
  33. package/docs/versions.md +1 -1
  34. package/docs/working-in-the-brownfield.md +15 -6
  35. package/expansion-packs/bmad-godot-game-dev/README.md +244 -0
  36. package/expansion-packs/bmad-godot-game-dev/agent-teams/godot-game-team.yaml +18 -0
  37. package/expansion-packs/bmad-godot-game-dev/agents/bmad-orchestrator.md +147 -0
  38. package/expansion-packs/bmad-godot-game-dev/agents/game-analyst.md +84 -0
  39. package/expansion-packs/bmad-godot-game-dev/agents/game-architect.md +146 -0
  40. package/expansion-packs/bmad-godot-game-dev/agents/game-designer.md +78 -0
  41. package/expansion-packs/bmad-godot-game-dev/agents/game-developer.md +124 -0
  42. package/expansion-packs/bmad-godot-game-dev/agents/game-pm.md +82 -0
  43. package/expansion-packs/bmad-godot-game-dev/agents/game-po.md +115 -0
  44. package/expansion-packs/bmad-godot-game-dev/agents/game-qa.md +160 -0
  45. package/expansion-packs/bmad-godot-game-dev/agents/game-sm.md +66 -0
  46. package/expansion-packs/bmad-godot-game-dev/agents/game-ux-expert.md +75 -0
  47. package/expansion-packs/bmad-godot-game-dev/checklists/game-architect-checklist.md +377 -0
  48. package/expansion-packs/bmad-godot-game-dev/checklists/game-change-checklist.md +250 -0
  49. package/expansion-packs/bmad-godot-game-dev/checklists/game-design-checklist.md +225 -0
  50. package/expansion-packs/bmad-godot-game-dev/checklists/game-po-checklist.md +448 -0
  51. package/expansion-packs/bmad-godot-game-dev/checklists/game-story-dod-checklist.md +202 -0
  52. package/expansion-packs/bmad-godot-game-dev/config.yaml +30 -0
  53. package/expansion-packs/bmad-godot-game-dev/data/bmad-kb.md +811 -0
  54. package/expansion-packs/bmad-godot-game-dev/data/brainstorming-techniques.md +36 -0
  55. package/expansion-packs/bmad-godot-game-dev/data/development-guidelines.md +893 -0
  56. package/expansion-packs/bmad-godot-game-dev/data/elicitation-methods.md +156 -0
  57. package/expansion-packs/bmad-godot-game-dev/data/technical-preferences.md +3 -0
  58. package/expansion-packs/bmad-godot-game-dev/tasks/advanced-elicitation.md +110 -0
  59. package/expansion-packs/bmad-godot-game-dev/tasks/apply-qa-fixes.md +224 -0
  60. package/expansion-packs/bmad-godot-game-dev/tasks/brownfield-create-epic.md +162 -0
  61. package/expansion-packs/bmad-godot-game-dev/tasks/brownfield-create-story.md +149 -0
  62. package/expansion-packs/bmad-godot-game-dev/tasks/correct-course-game.md +159 -0
  63. package/expansion-packs/bmad-godot-game-dev/tasks/create-deep-research-prompt.md +278 -0
  64. package/expansion-packs/bmad-godot-game-dev/tasks/create-doc.md +103 -0
  65. package/expansion-packs/bmad-godot-game-dev/tasks/create-game-story.md +202 -0
  66. package/expansion-packs/bmad-godot-game-dev/tasks/document-project.md +343 -0
  67. package/expansion-packs/bmad-godot-game-dev/tasks/execute-checklist.md +88 -0
  68. package/expansion-packs/bmad-godot-game-dev/tasks/facilitate-brainstorming-session.md +136 -0
  69. package/expansion-packs/bmad-godot-game-dev/tasks/game-brownfield-create-epic.md +160 -0
  70. package/expansion-packs/bmad-godot-game-dev/tasks/game-brownfield-create-story.md +147 -0
  71. package/expansion-packs/bmad-godot-game-dev/tasks/game-design-brainstorming.md +290 -0
  72. package/expansion-packs/bmad-godot-game-dev/tasks/game-risk-profile.md +368 -0
  73. package/expansion-packs/bmad-godot-game-dev/tasks/game-test-design.md +219 -0
  74. package/expansion-packs/bmad-godot-game-dev/tasks/generate-ai-frontend-prompt.md +51 -0
  75. package/expansion-packs/bmad-godot-game-dev/tasks/kb-mode-interaction.md +77 -0
  76. package/expansion-packs/bmad-godot-game-dev/tasks/review-game-story.md +364 -0
  77. package/expansion-packs/bmad-godot-game-dev/tasks/shard-doc.md +187 -0
  78. package/expansion-packs/bmad-godot-game-dev/tasks/validate-game-story.md +208 -0
  79. package/expansion-packs/bmad-godot-game-dev/templates/brainstorming-output-tmpl.yaml +156 -0
  80. package/expansion-packs/bmad-godot-game-dev/templates/brownfield-prd-tmpl.yaml +281 -0
  81. package/expansion-packs/bmad-godot-game-dev/templates/competitor-analysis-tmpl.yaml +306 -0
  82. package/expansion-packs/bmad-godot-game-dev/templates/game-architecture-tmpl.yaml +1111 -0
  83. package/expansion-packs/bmad-godot-game-dev/templates/game-brief-tmpl.yaml +356 -0
  84. package/expansion-packs/bmad-godot-game-dev/templates/game-design-doc-tmpl.yaml +724 -0
  85. package/expansion-packs/bmad-godot-game-dev/templates/game-prd-tmpl.yaml +209 -0
  86. package/expansion-packs/bmad-godot-game-dev/templates/game-qa-gate-tmpl.yaml +186 -0
  87. package/expansion-packs/bmad-godot-game-dev/templates/game-story-tmpl.yaml +406 -0
  88. package/expansion-packs/bmad-godot-game-dev/templates/game-ui-spec-tmpl.yaml +601 -0
  89. package/expansion-packs/bmad-godot-game-dev/templates/level-design-doc-tmpl.yaml +620 -0
  90. package/expansion-packs/bmad-godot-game-dev/templates/market-research-tmpl.yaml +418 -0
  91. package/expansion-packs/bmad-godot-game-dev/utils/bmad-doc-template.md +327 -0
  92. package/expansion-packs/bmad-godot-game-dev/utils/workflow-management.md +71 -0
  93. package/expansion-packs/bmad-godot-game-dev/workflows/game-dev-greenfield.yaml +245 -0
  94. package/expansion-packs/bmad-godot-game-dev/workflows/game-prototype.yaml +213 -0
  95. package/package.json +1 -1
  96. package/release_notes.md +19 -2
  97. package/tools/flattener/ignoreRules.js +2 -0
  98. package/tools/installer/bin/bmad.js +37 -1
  99. package/tools/installer/config/install.config.yaml +35 -7
  100. package/tools/installer/lib/ide-setup.js +285 -80
  101. package/tools/installer/lib/installer.js +6 -1
  102. package/tools/installer/package.json +1 -1
  103. package/tools/upgraders/v3-to-v4-upgrader.js +1 -0
  104. package/test.md +0 -1
  105. /package/{implement-fork-friendly-ci.sh → tools/implement-fork-friendly-ci.sh} +0 -0
@@ -47,6 +47,9 @@ class IdeSetup extends BaseIdeSetup {
47
47
  case 'claude-code': {
48
48
  return this.setupClaudeCode(installDir, selectedAgent);
49
49
  }
50
+ case 'iflow-cli': {
51
+ return this.setupIFlowCli(installDir, selectedAgent);
52
+ }
50
53
  case 'crush': {
51
54
  return this.setupCrush(installDir, selectedAgent);
52
55
  }
@@ -74,6 +77,9 @@ class IdeSetup extends BaseIdeSetup {
74
77
  case 'qwen-code': {
75
78
  return this.setupQwenCode(installDir, selectedAgent);
76
79
  }
80
+ case 'auggie-cli': {
81
+ return this.setupAuggieCLI(installDir, selectedAgent, spinner, preConfiguredSettings);
82
+ }
77
83
  case 'codex': {
78
84
  return this.setupCodex(installDir, selectedAgent, { webEnabled: false });
79
85
  }
@@ -450,6 +456,134 @@ class IdeSetup extends BaseIdeSetup {
450
456
  console.log(chalk.dim(` - Tasks in: ${tasksDir}`));
451
457
  }
452
458
 
459
+ async setupIFlowCli(installDir, selectedAgent) {
460
+ // Setup bmad-core commands
461
+ const coreSlashPrefix = await this.getCoreSlashPrefix(installDir);
462
+ const coreAgents = selectedAgent ? [selectedAgent] : await this.getCoreAgentIds(installDir);
463
+ const coreTasks = await this.getCoreTaskIds(installDir);
464
+ await this.setupIFlowCliForPackage(
465
+ installDir,
466
+ 'core',
467
+ coreSlashPrefix,
468
+ coreAgents,
469
+ coreTasks,
470
+ '.bmad-core',
471
+ );
472
+
473
+ // Setup expansion pack commands
474
+ const expansionPacks = await this.getInstalledExpansionPacks(installDir);
475
+ for (const packInfo of expansionPacks) {
476
+ const packSlashPrefix = await this.getExpansionPackSlashPrefix(packInfo.path);
477
+ const packAgents = await this.getExpansionPackAgents(packInfo.path);
478
+ const packTasks = await this.getExpansionPackTasks(packInfo.path);
479
+
480
+ if (packAgents.length > 0 || packTasks.length > 0) {
481
+ // Use the actual directory name where the expansion pack is installed
482
+ const rootPath = path.relative(installDir, packInfo.path);
483
+ await this.setupIFlowCliForPackage(
484
+ installDir,
485
+ packInfo.name,
486
+ packSlashPrefix,
487
+ packAgents,
488
+ packTasks,
489
+ rootPath,
490
+ );
491
+ }
492
+ }
493
+
494
+ return true;
495
+ }
496
+
497
+ async setupIFlowCliForPackage(installDir, packageName, slashPrefix, agentIds, taskIds, rootPath) {
498
+ const commandsBaseDir = path.join(installDir, '.iflow', 'commands', slashPrefix);
499
+ const agentsDir = path.join(commandsBaseDir, 'agents');
500
+ const tasksDir = path.join(commandsBaseDir, 'tasks');
501
+
502
+ // Ensure directories exist
503
+ await fileManager.ensureDirectory(agentsDir);
504
+ await fileManager.ensureDirectory(tasksDir);
505
+
506
+ // Setup agents
507
+ for (const agentId of agentIds) {
508
+ // Find the agent file - for expansion packs, prefer the expansion pack version
509
+ let agentPath;
510
+ if (packageName === 'core') {
511
+ // For core, use the normal search
512
+ agentPath = await this.findAgentPath(agentId, installDir);
513
+ } else {
514
+ // For expansion packs, first try to find the agent in the expansion pack directory
515
+ const expansionPackPath = path.join(installDir, rootPath, 'agents', `${agentId}.md`);
516
+ if (await fileManager.pathExists(expansionPackPath)) {
517
+ agentPath = expansionPackPath;
518
+ } else {
519
+ // Fall back to core if not found in expansion pack
520
+ agentPath = await this.findAgentPath(agentId, installDir);
521
+ }
522
+ }
523
+
524
+ const commandPath = path.join(agentsDir, `${agentId}.md`);
525
+
526
+ if (agentPath) {
527
+ // Create command file with agent content
528
+ let agentContent = await fileManager.readFile(agentPath);
529
+
530
+ // Replace {root} placeholder with the appropriate root path for this context
531
+ agentContent = agentContent.replaceAll('{root}', rootPath);
532
+
533
+ // Add command header
534
+ let commandContent = `# /${agentId} Command\n\n`;
535
+ commandContent += `When this command is used, adopt the following agent persona:\n\n`;
536
+ commandContent += agentContent;
537
+
538
+ await fileManager.writeFile(commandPath, commandContent);
539
+ console.log(chalk.green(`✓ Created agent command: /${agentId}`));
540
+ }
541
+ }
542
+
543
+ // Setup tasks
544
+ for (const taskId of taskIds) {
545
+ // Find the task file - for expansion packs, prefer the expansion pack version
546
+ let taskPath;
547
+ if (packageName === 'core') {
548
+ // For core, use the normal search
549
+ taskPath = await this.findTaskPath(taskId, installDir);
550
+ } else {
551
+ // For expansion packs, first try to find the task in the expansion pack directory
552
+ const expansionPackPath = path.join(installDir, rootPath, 'tasks', `${taskId}.md`);
553
+ if (await fileManager.pathExists(expansionPackPath)) {
554
+ taskPath = expansionPackPath;
555
+ } else {
556
+ // Fall back to core if not found in expansion pack
557
+ taskPath = await this.findTaskPath(taskId, installDir);
558
+ }
559
+ }
560
+
561
+ const commandPath = path.join(tasksDir, `${taskId}.md`);
562
+
563
+ if (taskPath) {
564
+ // Create command file with task content
565
+ let taskContent = await fileManager.readFile(taskPath);
566
+
567
+ // Replace {root} placeholder with the appropriate root path for this context
568
+ taskContent = taskContent.replaceAll('{root}', rootPath);
569
+
570
+ // Add command header
571
+ let commandContent = `# /${taskId} Task\n\n`;
572
+ commandContent += `When this command is used, execute the following task:\n\n`;
573
+ commandContent += taskContent;
574
+
575
+ await fileManager.writeFile(commandPath, commandContent);
576
+ console.log(chalk.green(`✓ Created task command: /${taskId}`));
577
+ }
578
+ }
579
+
580
+ console.log(
581
+ chalk.green(`\n✓ Created iFlow CLI commands for ${packageName} in ${commandsBaseDir}`),
582
+ );
583
+ console.log(chalk.dim(` - Agents in: ${agentsDir}`));
584
+ console.log(chalk.dim(` - Tasks in: ${tasksDir}`));
585
+ }
586
+
453
587
  async setupCrushForPackage(installDir, packageName, slashPrefix, agentIds, taskIds, rootPath) {
454
588
  const commandsBaseDir = path.join(installDir, '.crush', 'commands', slashPrefix);
455
589
  const agentsDir = path.join(commandsBaseDir, 'agents');
@@ -687,6 +821,7 @@ class IdeSetup extends BaseIdeSetup {
687
821
 
688
822
  async getCoreTaskIds(installDir) {
689
823
  const allTaskIds = [];
824
+ const glob = require('glob');
690
825
 
691
826
  // Check core tasks in .bmad-core or root only
692
827
  let tasksDir = path.join(installDir, '.bmad-core', 'tasks');
@@ -695,7 +830,6 @@ class IdeSetup extends BaseIdeSetup {
695
830
  }
696
831
 
697
832
  if (await fileManager.pathExists(tasksDir)) {
698
- const glob = require('glob');
699
833
  const taskFiles = glob.sync('*.md', { cwd: tasksDir });
700
834
  allTaskIds.push(...taskFiles.map((file) => path.basename(file, '.md')));
701
835
  }
@@ -703,6 +837,7 @@ class IdeSetup extends BaseIdeSetup {
703
837
  // Check common tasks
704
838
  const commonTasksDir = path.join(installDir, 'common', 'tasks');
705
839
  if (await fileManager.pathExists(commonTasksDir)) {
840
+ const glob = require('glob');
706
841
  const commonTaskFiles = glob.sync('*.md', { cwd: commonTasksDir });
707
842
  allTaskIds.push(...commonTaskFiles.map((file) => path.basename(file, '.md')));
708
843
  }
@@ -1205,97 +1340,77 @@ class IdeSetup extends BaseIdeSetup {
1205
1340
  return true;
1206
1341
  }
1207
1342
 
1208
- async setupGeminiCli(installDir) {
1209
- const geminiDir = path.join(installDir, '.gemini');
1210
- const bmadMethodDir = path.join(geminiDir, 'bmad-method');
1211
- await fileManager.ensureDirectory(bmadMethodDir);
1212
-
1213
- // Update logic for existing settings.json
1214
- const settingsPath = path.join(geminiDir, 'settings.json');
1215
- if (await fileManager.pathExists(settingsPath)) {
1216
- try {
1217
- const settingsContent = await fileManager.readFile(settingsPath);
1218
- const settings = JSON.parse(settingsContent);
1219
- let updated = false;
1343
+ async setupGeminiCli(installDir, selectedAgent) {
1344
+ const ideConfig = await configLoader.getIdeConfiguration('gemini');
1345
+ const bmadCommandsDir = path.join(installDir, ideConfig['rule-dir']);
1220
1346
 
1221
- // Handle contextFileName property
1222
- if (settings.contextFileName && Array.isArray(settings.contextFileName)) {
1223
- const originalLength = settings.contextFileName.length;
1224
- settings.contextFileName = settings.contextFileName.filter(
1225
- (fileName) => !fileName.startsWith('agents/'),
1226
- );
1227
- if (settings.contextFileName.length !== originalLength) {
1228
- updated = true;
1229
- }
1230
- }
1347
+ const agentCommandsDir = path.join(bmadCommandsDir, 'agents');
1348
+ const taskCommandsDir = path.join(bmadCommandsDir, 'tasks');
1349
+ await fileManager.ensureDirectory(agentCommandsDir);
1350
+ await fileManager.ensureDirectory(taskCommandsDir);
1231
1351
 
1232
- if (updated) {
1233
- await fileManager.writeFile(settingsPath, JSON.stringify(settings, null, 2));
1234
- console.log(
1235
- chalk.green('✓ Updated .gemini/settings.json - removed agent file references'),
1236
- );
1237
- }
1238
- } catch (error) {
1239
- console.warn(chalk.yellow('Could not update .gemini/settings.json'), error);
1352
+ // Process Agents
1353
+ const agents = selectedAgent ? [selectedAgent] : await this.getAllAgentIds(installDir);
1354
+ for (const agentId of agents) {
1355
+ const agentPath = await this.findAgentPath(agentId, installDir);
1356
+ if (!agentPath) {
1357
+ console.log(chalk.yellow(`✗ Agent file not found for ${agentId}, skipping.`));
1358
+ continue;
1240
1359
  }
1241
- }
1242
1360
 
1243
- // Remove old agents directory
1244
- const agentsDir = path.join(geminiDir, 'agents');
1245
- if (await fileManager.pathExists(agentsDir)) {
1246
- await fileManager.removeDirectory(agentsDir);
1247
- console.log(chalk.green('✓ Removed old .gemini/agents directory'));
1248
- }
1361
+ const agentTitle = await this.getAgentTitle(agentId, installDir);
1362
+ const commandPath = path.join(agentCommandsDir, `${agentId}.toml`);
1249
1363
 
1250
- // Get all available agents
1251
- const agents = await this.getAllAgentIds(installDir);
1252
- let concatenatedContent = '';
1364
+ // Get relative path from installDir to agent file for @{file} reference
1365
+ const relativeAgentPath = path.relative(installDir, agentPath).replaceAll('\\', '/');
1253
1366
 
1254
- for (const agentId of agents) {
1255
- // Find the source agent file
1256
- const agentPath = await this.findAgentPath(agentId, installDir);
1367
+ const tomlContent = `description = "Activates the ${agentTitle} agent from the BMad Method."
1368
+ prompt = """
1369
+ CRITICAL: You are now the BMad '${agentTitle}' agent. Adopt its persona, follow its instructions, and use its capabilities. The full agent definition is below.
1257
1370
 
1258
- if (agentPath) {
1259
- const agentContent = await fileManager.readFile(agentPath);
1371
+ @{${relativeAgentPath}}
1372
+ """`;
1260
1373
 
1261
- // Create properly formatted agent rule content (similar to trae)
1262
- let agentRuleContent = `# ${agentId.toUpperCase()} Agent Rule\n\n`;
1263
- agentRuleContent += `This rule is triggered when the user types \`*${agentId}\` and activates the ${await this.getAgentTitle(
1264
- agentId,
1265
- installDir,
1266
- )} agent persona.\n\n`;
1267
- agentRuleContent += '## Agent Activation\n\n';
1268
- agentRuleContent +=
1269
- 'CRITICAL: Read the full YAML, start activation to alter your state of being, follow startup section instructions, stay in this being until told to exit this mode:\n\n';
1270
- agentRuleContent += '```yaml\n';
1271
- // Extract just the YAML content from the agent file
1272
- const yamlContent = extractYamlFromAgent(agentContent);
1273
- if (yamlContent) {
1274
- agentRuleContent += yamlContent;
1275
- } else {
1276
- // If no YAML found, include the whole content minus the header
1277
- agentRuleContent += agentContent.replace(/^#.*$/m, '').trim();
1278
- }
1279
- agentRuleContent += '\n```\n\n';
1280
- agentRuleContent += '## File Reference\n\n';
1281
- const relativePath = path.relative(installDir, agentPath).replaceAll('\\', '/');
1282
- agentRuleContent += `The complete agent definition is available in [${relativePath}](${relativePath}).\n\n`;
1283
- agentRuleContent += '## Usage\n\n';
1284
- agentRuleContent += `When the user types \`*${agentId}\`, activate this ${await this.getAgentTitle(
1285
- agentId,
1286
- installDir,
1287
- )} persona and follow all instructions defined in the YAML configuration above.\n`;
1374
+ await fileManager.writeFile(commandPath, tomlContent);
1375
+ console.log(chalk.green(`✓ Created agent command: /bmad:agents:${agentId}`));
1376
+ }
1288
1377
 
1289
- // Add to concatenated content with separator
1290
- concatenatedContent += agentRuleContent + '\n\n---\n\n';
1291
- console.log(chalk.green(`✓ Added context for @${agentId}`));
1378
+ // Process Tasks
1379
+ const tasks = await this.getAllTaskIds(installDir);
1380
+ for (const taskId of tasks) {
1381
+ const taskPath = await this.findTaskPath(taskId, installDir);
1382
+ if (!taskPath) {
1383
+ console.log(chalk.yellow(`✗ Task file not found for ${taskId}, skipping.`));
1384
+ continue;
1292
1385
  }
1386
+
1387
+ const taskTitle = taskId
1388
+ .split('-')
1389
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
1390
+ .join(' ');
1391
+ const commandPath = path.join(taskCommandsDir, `${taskId}.toml`);
1392
+
1393
+ // Get relative path from installDir to task file for @{file} reference
1394
+ const relativeTaskPath = path.relative(installDir, taskPath).replaceAll('\\', '/');
1395
+
1396
+ const tomlContent = `description = "Executes the BMad Task: ${taskTitle}"
1397
+ prompt = """
1398
+ CRITICAL: You are to execute the BMad Task defined below.
1399
+
1400
+ @{${relativeTaskPath}}
1401
+ """`;
1402
+
1403
+ await fileManager.writeFile(commandPath, tomlContent);
1404
+ console.log(chalk.green(`✓ Created task command: /bmad:tasks:${taskId}`));
1293
1405
  }
1294
1406
 
1295
- // Write the concatenated content to GEMINI.md
1296
- const geminiMdPath = path.join(bmadMethodDir, 'GEMINI.md');
1297
- await fileManager.writeFile(geminiMdPath, concatenatedContent);
1298
- console.log(chalk.green(`\n✓ Created GEMINI.md in ${bmadMethodDir}`));
1407
+ console.log(
1408
+ chalk.green(`
1409
+ Created Gemini CLI extension in ${bmadCommandsDir}`),
1410
+ );
1411
+ console.log(
1412
+ chalk.dim('You can now use commands like /bmad:agents:dev or /bmad:tasks:create-doc.'),
1413
+ );
1299
1414
 
1300
1415
  return true;
1301
1416
  }
@@ -1611,6 +1726,96 @@ tools: ['changes', 'codebase', 'fetch', 'findTestFiles', 'githubRepo', 'problems
1611
1726
  console.log(chalk.dim(''));
1612
1727
  console.log(chalk.dim('You can modify these settings anytime in .vscode/settings.json'));
1613
1728
  }
1729
+
1730
+ async setupAuggieCLI(installDir, selectedAgent, spinner = null, preConfiguredSettings = null) {
1731
+ const os = require('node:os');
1732
+ const inquirer = require('inquirer');
1733
+ const agents = selectedAgent ? [selectedAgent] : await this.getAllAgentIds(installDir);
1734
+
1735
+ // Get the IDE configuration to access location options
1736
+ const ideConfig = await configLoader.getIdeConfiguration('auggie-cli');
1737
+ const locations = ideConfig.locations;
1738
+
1739
+ // Use pre-configured settings if provided, otherwise prompt
1740
+ let selectedLocations;
1741
+ if (preConfiguredSettings && preConfiguredSettings.selectedLocations) {
1742
+ selectedLocations = preConfiguredSettings.selectedLocations;
1743
+ console.log(
1744
+ chalk.dim(
1745
+ `Using pre-configured Auggie CLI (Augment Code) locations: ${selectedLocations.join(', ')}`,
1746
+ ),
1747
+ );
1748
+ } else {
1749
+ // Pause spinner during location selection to avoid UI conflicts
1750
+ let spinnerWasActive = false;
1751
+ if (spinner && spinner.isSpinning) {
1752
+ spinner.stop();
1753
+ spinnerWasActive = true;
1754
+ }
1755
+
1756
+ // Clear any previous output and add spacing to avoid conflicts with loaders
1757
+ console.log('\n'.repeat(2));
1758
+ console.log(chalk.blue('📍 Auggie CLI Location Configuration'));
1759
+ console.log(chalk.dim('Choose where to install BMad agents for Auggie CLI access.'));
1760
+ console.log(''); // Add extra spacing
1761
+
1762
+ const response = await inquirer.prompt([
1763
+ {
1764
+ type: 'checkbox',
1765
+ name: 'selectedLocations',
1766
+ message: 'Select Auggie CLI command locations:',
1767
+ choices: Object.entries(locations).map(([key, location]) => ({
1768
+ name: `${location.name}: ${location.description}`,
1769
+ value: key,
1770
+ })),
1771
+ validate: (selected) => {
1772
+ if (selected.length === 0) {
1773
+ return 'Please select at least one location';
1774
+ }
1775
+ return true;
1776
+ },
1777
+ },
1778
+ ]);
1779
+ selectedLocations = response.selectedLocations;
1780
+
1781
+ // Restart spinner if it was active before prompts
1782
+ if (spinner && spinnerWasActive) {
1783
+ spinner.start();
1784
+ }
1785
+ }
1786
+
1787
+ // Install to each selected location
1788
+ for (const locationKey of selectedLocations) {
1789
+ const location = locations[locationKey];
1790
+ let commandsDir = location['rule-dir'];
1791
+
1792
+ // Handle tilde expansion for user directory
1793
+ if (commandsDir.startsWith('~/')) {
1794
+ commandsDir = path.join(os.homedir(), commandsDir.slice(2));
1795
+ } else if (commandsDir.startsWith('./')) {
1796
+ commandsDir = path.join(installDir, commandsDir.slice(2));
1797
+ }
1798
+
1799
+ await fileManager.ensureDirectory(commandsDir);
1800
+
1801
+ for (const agentId of agents) {
1802
+ // Find the agent file
1803
+ const agentPath = await this.findAgentPath(agentId, installDir);
1804
+
1805
+ if (agentPath) {
1806
+ const agentContent = await fileManager.readFile(agentPath);
1807
+ const mdPath = path.join(commandsDir, `${agentId}.md`);
1808
+ await fileManager.writeFile(mdPath, agentContent);
1809
+ console.log(chalk.green(`✓ Created command: ${agentId}.md in ${location.name}`));
1810
+ }
1811
+ }
1812
+
1813
+ console.log(chalk.green(`\n✓ Created Auggie CLI commands in ${commandsDir}`));
1814
+ console.log(chalk.dim(` Location: ${location.name} - ${location.description}`));
1815
+ }
1816
+
1817
+ return true;
1818
+ }
1614
1819
  }
1615
1820
 
1616
1821
  module.exports = new IdeSetup();
@@ -408,7 +408,12 @@ class Installer {
408
408
  if (ides.length > 0) {
409
409
  for (const ide of ides) {
410
410
  spinner.text = `Setting up ${ide} integration...`;
411
- const preConfiguredSettings = ide === 'github-copilot' ? config.githubCopilotConfig : null;
411
+ let preConfiguredSettings = null;
412
+ if (ide === 'github-copilot') {
413
+ preConfiguredSettings = config.githubCopilotConfig;
414
+ } else if (ide === 'auggie-cli') {
415
+ preConfiguredSettings = config.augmentCodeConfig;
416
+ }
412
417
  await ideSetup.setup(ide, installDir, config.agent, spinner, preConfiguredSettings);
413
418
  }
414
419
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bmad-method",
3
- "version": "4.42.1",
3
+ "version": "4.43.1",
4
4
  "description": "BMad Method installer - AI-powered Agile development framework",
5
5
  "keywords": [
6
6
  "bmad",
@@ -492,6 +492,7 @@ class V3ToV4Upgrader {
492
492
  const ideMessages = {
493
493
  cursor: 'Rules created in .cursor/rules/bmad/',
494
494
  'claude-code': 'Commands created in .claude/commands/BMad/',
495
+ 'iflow-cli': 'Commands created in .iflow/commands/BMad/',
495
496
  windsurf: 'Rules created in .windsurf/workflows/',
496
497
  trae: 'Rules created in.trae/rules/',
497
498
  roo: 'Custom modes created in .roomodes',
package/test.md DELETED
@@ -1 +0,0 @@
1
- # Test