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.
- package/CONTRIBUTING.md +2 -9
- package/README.md +0 -98
- package/bmad-core/agents/bmad-master.md +6 -6
- package/bmad-core/data/bmad-kb.md +1 -0
- package/bmad-core/tasks/validate-next-story.md +1 -1
- package/bmad-core/templates/brownfield-architecture-tmpl.yaml +5 -5
- package/dist/agents/analyst.txt +1 -0
- package/dist/agents/architect.txt +5 -5
- package/dist/agents/bmad-master.txt +12 -11
- package/dist/agents/bmad-orchestrator.txt +1 -0
- package/dist/agents/dev.txt +1 -1
- package/dist/agents/po.txt +1 -1
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +1 -1
- package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +1 -1
- package/dist/expansion-packs/bmad-godot-game-dev/agents/bmad-orchestrator.txt +1513 -0
- package/dist/expansion-packs/bmad-godot-game-dev/agents/game-analyst.txt +3190 -0
- package/dist/expansion-packs/bmad-godot-game-dev/agents/game-architect.txt +4499 -0
- package/dist/expansion-packs/bmad-godot-game-dev/agents/game-designer.txt +3925 -0
- package/dist/expansion-packs/bmad-godot-game-dev/agents/game-developer.txt +666 -0
- package/dist/expansion-packs/bmad-godot-game-dev/agents/game-pm.txt +2381 -0
- package/dist/expansion-packs/bmad-godot-game-dev/agents/game-po.txt +1612 -0
- package/dist/expansion-packs/bmad-godot-game-dev/agents/game-qa.txt +1745 -0
- package/dist/expansion-packs/bmad-godot-game-dev/agents/game-sm.txt +1208 -0
- package/dist/expansion-packs/bmad-godot-game-dev/agents/game-ux-expert.txt +958 -0
- package/dist/expansion-packs/bmad-godot-game-dev/teams/godot-game-team.txt +27721 -0
- package/dist/teams/team-all.txt +7 -6
- package/dist/teams/team-fullstack.txt +7 -6
- package/dist/teams/team-ide-minimal.txt +2 -1
- package/dist/teams/team-no-ui.txt +7 -6
- package/docs/GUIDING-PRINCIPLES.md +3 -3
- package/docs/expansion-packs.md +3 -83
- package/docs/flattener.md +91 -0
- package/docs/versions.md +1 -1
- package/docs/working-in-the-brownfield.md +15 -6
- package/expansion-packs/bmad-godot-game-dev/README.md +244 -0
- package/expansion-packs/bmad-godot-game-dev/agent-teams/godot-game-team.yaml +18 -0
- package/expansion-packs/bmad-godot-game-dev/agents/bmad-orchestrator.md +147 -0
- package/expansion-packs/bmad-godot-game-dev/agents/game-analyst.md +84 -0
- package/expansion-packs/bmad-godot-game-dev/agents/game-architect.md +146 -0
- package/expansion-packs/bmad-godot-game-dev/agents/game-designer.md +78 -0
- package/expansion-packs/bmad-godot-game-dev/agents/game-developer.md +124 -0
- package/expansion-packs/bmad-godot-game-dev/agents/game-pm.md +82 -0
- package/expansion-packs/bmad-godot-game-dev/agents/game-po.md +115 -0
- package/expansion-packs/bmad-godot-game-dev/agents/game-qa.md +160 -0
- package/expansion-packs/bmad-godot-game-dev/agents/game-sm.md +66 -0
- package/expansion-packs/bmad-godot-game-dev/agents/game-ux-expert.md +75 -0
- package/expansion-packs/bmad-godot-game-dev/checklists/game-architect-checklist.md +377 -0
- package/expansion-packs/bmad-godot-game-dev/checklists/game-change-checklist.md +250 -0
- package/expansion-packs/bmad-godot-game-dev/checklists/game-design-checklist.md +225 -0
- package/expansion-packs/bmad-godot-game-dev/checklists/game-po-checklist.md +448 -0
- package/expansion-packs/bmad-godot-game-dev/checklists/game-story-dod-checklist.md +202 -0
- package/expansion-packs/bmad-godot-game-dev/config.yaml +30 -0
- package/expansion-packs/bmad-godot-game-dev/data/bmad-kb.md +811 -0
- package/expansion-packs/bmad-godot-game-dev/data/brainstorming-techniques.md +36 -0
- package/expansion-packs/bmad-godot-game-dev/data/development-guidelines.md +893 -0
- package/expansion-packs/bmad-godot-game-dev/data/elicitation-methods.md +156 -0
- package/expansion-packs/bmad-godot-game-dev/data/technical-preferences.md +3 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/advanced-elicitation.md +110 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/apply-qa-fixes.md +224 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/brownfield-create-epic.md +162 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/brownfield-create-story.md +149 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/correct-course-game.md +159 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/create-deep-research-prompt.md +278 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/create-doc.md +103 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/create-game-story.md +202 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/document-project.md +343 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/execute-checklist.md +88 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/facilitate-brainstorming-session.md +136 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/game-brownfield-create-epic.md +160 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/game-brownfield-create-story.md +147 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/game-design-brainstorming.md +290 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/game-risk-profile.md +368 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/game-test-design.md +219 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/generate-ai-frontend-prompt.md +51 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/kb-mode-interaction.md +77 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/review-game-story.md +364 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/shard-doc.md +187 -0
- package/expansion-packs/bmad-godot-game-dev/tasks/validate-game-story.md +208 -0
- package/expansion-packs/bmad-godot-game-dev/templates/brainstorming-output-tmpl.yaml +156 -0
- package/expansion-packs/bmad-godot-game-dev/templates/brownfield-prd-tmpl.yaml +281 -0
- package/expansion-packs/bmad-godot-game-dev/templates/competitor-analysis-tmpl.yaml +306 -0
- package/expansion-packs/bmad-godot-game-dev/templates/game-architecture-tmpl.yaml +1111 -0
- package/expansion-packs/bmad-godot-game-dev/templates/game-brief-tmpl.yaml +356 -0
- package/expansion-packs/bmad-godot-game-dev/templates/game-design-doc-tmpl.yaml +724 -0
- package/expansion-packs/bmad-godot-game-dev/templates/game-prd-tmpl.yaml +209 -0
- package/expansion-packs/bmad-godot-game-dev/templates/game-qa-gate-tmpl.yaml +186 -0
- package/expansion-packs/bmad-godot-game-dev/templates/game-story-tmpl.yaml +406 -0
- package/expansion-packs/bmad-godot-game-dev/templates/game-ui-spec-tmpl.yaml +601 -0
- package/expansion-packs/bmad-godot-game-dev/templates/level-design-doc-tmpl.yaml +620 -0
- package/expansion-packs/bmad-godot-game-dev/templates/market-research-tmpl.yaml +418 -0
- package/expansion-packs/bmad-godot-game-dev/utils/bmad-doc-template.md +327 -0
- package/expansion-packs/bmad-godot-game-dev/utils/workflow-management.md +71 -0
- package/expansion-packs/bmad-godot-game-dev/workflows/game-dev-greenfield.yaml +245 -0
- package/expansion-packs/bmad-godot-game-dev/workflows/game-prototype.yaml +213 -0
- package/package.json +1 -1
- package/release_notes.md +19 -2
- package/tools/flattener/ignoreRules.js +2 -0
- package/tools/installer/bin/bmad.js +37 -1
- package/tools/installer/config/install.config.yaml +35 -7
- package/tools/installer/lib/ide-setup.js +285 -80
- package/tools/installer/lib/installer.js +6 -1
- package/tools/installer/package.json +1 -1
- package/tools/upgraders/v3-to-v4-upgrader.js +1 -0
- package/test.md +0 -1
- /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
|
|
1210
|
-
const
|
|
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
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
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
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
}
|
|
1238
|
-
|
|
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
|
-
|
|
1244
|
-
|
|
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
|
-
|
|
1251
|
-
|
|
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
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
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
|
-
|
|
1259
|
-
|
|
1371
|
+
@{${relativeAgentPath}}
|
|
1372
|
+
"""`;
|
|
1260
1373
|
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
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
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
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
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
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
|
-
|
|
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
|
}
|
|
@@ -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
|
|
File without changes
|