bmad-method 4.4.1 → 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.
Files changed (96) hide show
  1. package/.prettierignore +22 -0
  2. package/.prettierrc +23 -0
  3. package/CHANGELOG.md +26 -2
  4. package/README.md +46 -39
  5. package/bmad-core/agent-teams/team-all.yml +1 -1
  6. package/bmad-core/agent-teams/team-fullstack.yml +1 -1
  7. package/bmad-core/agent-teams/team-ide-minimal.yml +10 -0
  8. package/bmad-core/agent-teams/team-no-ui.yml +1 -1
  9. package/bmad-core/agents/bmad-orchestrator.md +11 -11
  10. package/bmad-core/agents/sm.md +1 -1
  11. package/bmad-core/tasks/shard-doc.md +3 -5
  12. package/bmad-core/templates/architecture-tmpl.md +2 -2
  13. package/bmad-core/templates/brownfield-architecture-tmpl.md +4 -4
  14. package/bmad-core/templates/front-end-spec-tmpl.md +4 -4
  15. package/bmad-core/templates/fullstack-architecture-tmpl.md +2 -2
  16. package/bmad-core/utils/workflow-management.md +4 -4
  17. package/{bmad-core/web-bundles → dist}/agents/bmad-master.txt +0 -176
  18. 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
  19. package/dist/expansion-packs/expansion-creator/agents/bmad-the-creator.txt +1561 -0
  20. package/dist/teams/team-all.txt +10307 -0
  21. package/dist/teams/team-fullstack.txt +9659 -0
  22. package/dist/teams/team-ide-minimal.txt +2739 -0
  23. package/dist/teams/team-no-ui.txt +8519 -0
  24. package/docs/roo-code-guide.md +2 -2
  25. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yml +12 -0
  26. package/expansion-packs/expansion-creator/README.md +8 -0
  27. package/expansion-packs/expansion-creator/agents/bmad-the-creator.md +53 -0
  28. package/expansion-packs/expansion-creator/common-tasks/create-doc.md +74 -0
  29. package/expansion-packs/expansion-creator/common-tasks/execute-checklist.md +97 -0
  30. package/expansion-packs/expansion-creator/manifest.yml +12 -0
  31. package/{creator-tools → expansion-packs/expansion-creator}/tasks/create-agent.md +4 -4
  32. package/expansion-packs/expansion-creator/tasks/generate-expansion-pack.md +1026 -0
  33. package/expansion-packs/expansion-creator/templates/agent-teams-tmpl.md +154 -0
  34. package/expansion-packs/expansion-creator/templates/agent-tmpl.md +140 -0
  35. package/expansion-packs/expansion-creator/utils/template-format.md +26 -0
  36. package/expansion-packs/expansion-creator/utils/workflow-management.md +223 -0
  37. package/package.json +3 -15
  38. package/tools/builders/web-builder.js +2 -4
  39. package/tools/cli.js +0 -15
  40. package/tools/installer/bin/bmad.js +167 -27
  41. package/tools/installer/lib/config-loader.js +82 -4
  42. package/tools/installer/lib/ide-setup.js +4 -4
  43. package/tools/installer/lib/installer.js +198 -29
  44. package/tools/installer/package.json +1 -1
  45. package/.claude/commands/analyst.md +0 -63
  46. package/.claude/commands/architect.md +0 -65
  47. package/.claude/commands/bmad-master.md +0 -103
  48. package/.claude/commands/bmad-orchestrator.md +0 -132
  49. package/.claude/commands/dev.md +0 -74
  50. package/.claude/commands/pm.md +0 -63
  51. package/.claude/commands/po.md +0 -64
  52. package/.claude/commands/qa.md +0 -56
  53. package/.claude/commands/sm.md +0 -59
  54. package/.claude/commands/ux-expert.md +0 -70
  55. package/.cursor/rules/analyst.mdc +0 -77
  56. package/.cursor/rules/architect.mdc +0 -79
  57. package/.cursor/rules/bmad-master.mdc +0 -117
  58. package/.cursor/rules/bmad-orchestrator.mdc +0 -146
  59. package/.cursor/rules/dev.mdc +0 -88
  60. package/.cursor/rules/pm.mdc +0 -77
  61. package/.cursor/rules/po.mdc +0 -78
  62. package/.cursor/rules/qa.mdc +0 -70
  63. package/.cursor/rules/sm.mdc +0 -73
  64. package/.cursor/rules/ux-expert.mdc +0 -84
  65. package/.roo/.roomodes +0 -95
  66. package/.roo/README.md +0 -27
  67. package/.windsurf/rules/analyst.md +0 -71
  68. package/.windsurf/rules/architect.md +0 -73
  69. package/.windsurf/rules/bmad-master.md +0 -111
  70. package/.windsurf/rules/bmad-orchestrator.md +0 -140
  71. package/.windsurf/rules/dev.md +0 -82
  72. package/.windsurf/rules/pm.md +0 -71
  73. package/.windsurf/rules/po.md +0 -72
  74. package/.windsurf/rules/qa.md +0 -64
  75. package/.windsurf/rules/sm.md +0 -67
  76. package/.windsurf/rules/ux-expert.md +0 -78
  77. package/bmad-core/bmad-core-config.yml +0 -60
  78. package/bmad-core/templates/agent-tmpl.md +0 -58
  79. package/bmad-core/utils/agent-switcher.ide.md +0 -112
  80. package/creator-tools/tasks/generate-expansion-pack.md +0 -427
  81. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/team-game-dev.yml +0 -12
  82. package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/team-game-dev.txt +0 -4395
  83. /package/{bmad-core/web-bundles → dist}/agents/analyst.txt +0 -0
  84. /package/{bmad-core/web-bundles → dist}/agents/architect.txt +0 -0
  85. /package/{bmad-core/web-bundles → dist}/agents/bmad-orchestrator.txt +0 -0
  86. /package/{bmad-core/web-bundles → dist}/agents/dev.txt +0 -0
  87. /package/{bmad-core/web-bundles → dist}/agents/pm.txt +0 -0
  88. /package/{bmad-core/web-bundles → dist}/agents/po.txt +0 -0
  89. /package/{bmad-core/web-bundles → dist}/agents/qa.txt +0 -0
  90. /package/{bmad-core/web-bundles → dist}/agents/sm.txt +0 -0
  91. /package/{bmad-core/web-bundles → dist}/agents/ux-expert.txt +0 -0
  92. /package/{expansion-packs/bmad-2d-phaser-game-dev/web-bundles → dist/expansion-packs/bmad-2d-phaser-game-dev}/agents/game-designer.txt +0 -0
  93. /package/{expansion-packs/bmad-2d-phaser-game-dev/web-bundles → dist/expansion-packs/bmad-2d-phaser-game-dev}/agents/game-developer.txt +0 -0
  94. /package/{expansion-packs/bmad-2d-phaser-game-dev/web-bundles → dist/expansion-packs/bmad-2d-phaser-game-dev}/agents/game-sm.txt +0 -0
  95. /package/{expansion-packs/bmad-infrastructure-devops/web-bundles → dist/expansion-packs/bmad-infrastructure-devops}/agents/infra-devops-platform.txt +0 -0
  96. /package/{bmad-core → expansion-packs/expansion-creator}/templates/expansion-pack-plan-tmpl.md +0 -0
@@ -46,21 +46,29 @@ 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
52
  .option('-i, --ide <ide...>', 'Configure for specific IDE(s) - can specify multiple (cursor, claude-code, windsurf, roo, other)')
51
53
  .option('-e, --expansion-packs <packs...>', 'Install specific expansion packs (can specify multiple)')
52
54
  .action(async (options) => {
53
55
  try {
54
56
  await initializeModules();
55
- if (!options.full && !options.agent) {
57
+ if (!options.full && !options.agent && !options.team && !options.expansionOnly) {
56
58
  // Interactive mode
57
59
  const answers = await promptInstallation();
58
60
  await installer.install(answers);
59
61
  } else {
60
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
+
61
68
  const config = {
62
- installType: options.full ? 'full' : 'single-agent',
69
+ installType,
63
70
  agent: options.agent,
71
+ team: options.team,
64
72
  directory: options.directory || '.bmad-core',
65
73
  ides: (options.ide || []).filter(ide => ide !== 'other'),
66
74
  expansionPacks: options.expansionPacks || []
@@ -161,9 +169,17 @@ async function promptInstallation() {
161
169
  name: 'Complete installation (recommended) - All agents and tools',
162
170
  value: 'full'
163
171
  },
172
+ {
173
+ name: 'Team installation - Install a specific team with required agents',
174
+ value: 'team'
175
+ },
164
176
  {
165
177
  name: 'Single agent - Choose one agent to install',
166
178
  value: 'single-agent'
179
+ },
180
+ {
181
+ name: 'Expansion packs only - Install expansion packs without bmad-core',
182
+ value: 'expansion-only'
167
183
  }
168
184
  ]
169
185
  }
@@ -187,30 +203,63 @@ async function promptInstallation() {
187
203
  answers.agent = agent;
188
204
  }
189
205
 
190
- // Ask for expansion pack selection (only for full installation)
191
- if (installType === 'full') {
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 in your IDE project folder:',
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') {
192
225
  try {
193
226
  const availableExpansionPacks = await installer.getAvailableExpansionPacks();
194
227
 
195
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 (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
+ }));
244
+ }
245
+
196
246
  const { expansionPacks } = await inquirer.prompt([
197
247
  {
198
248
  type: 'checkbox',
199
249
  name: 'expansionPacks',
200
- message: 'Select expansion packs to install (optional):',
201
- choices: [
202
- { name: 'BMAD Core only (no expansion packs)', value: 'none', checked: true },
203
- new inquirer.Separator(' --- Expansion Packs ---'),
204
- ...availableExpansionPacks.map(pack => ({
205
- name: `${pack.name} - ${pack.description}`,
206
- value: pack.id
207
- }))
208
- ]
250
+ message,
251
+ choices,
252
+ validate: installType === 'expansion-only' ? (answer) => {
253
+ if (answer.length < 1) {
254
+ return 'You must select at least one expansion pack for expansion-only installation.';
255
+ }
256
+ return true;
257
+ } : undefined
209
258
  }
210
259
  ]);
211
260
 
212
- // Filter out 'none' selection and only include actual expansion packs
213
- answers.expansionPacks = expansionPacks.filter(pack => pack !== 'none');
261
+ // Use selected expansion packs directly
262
+ answers.expansionPacks = expansionPacks;
214
263
  } else {
215
264
  answers.expansionPacks = [];
216
265
  }
@@ -227,25 +276,116 @@ async function promptInstallation() {
227
276
  {
228
277
  type: 'checkbox',
229
278
  name: 'ides',
230
- message: 'Which IDE(s) are you using? (Select all that apply)',
279
+ message: 'Which IDE(s) are you using? (press Enter to skip IDE setup, or select any to configure):',
231
280
  choices: [
232
281
  { name: 'Cursor', value: 'cursor' },
233
282
  { name: 'Claude Code', value: 'claude-code' },
234
283
  { name: 'Windsurf', value: 'windsurf' },
235
- { name: 'Roo Code', value: 'roo' },
236
- { name: 'Other (skip IDE setup)', value: 'other' }
237
- ],
238
- validate: (answer) => {
239
- if (answer.length < 1) {
240
- return 'You must choose at least one IDE option.';
241
- }
242
- return true;
243
- }
284
+ { name: 'Roo Code', value: 'roo' }
285
+ ]
244
286
  }
245
287
  ]);
246
288
 
247
- // Filter out 'other' from the list and only include actual IDEs
248
- answers.ides = ides.filter(ide => ide !== 'other');
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;
249
389
 
250
390
  return answers;
251
391
  }
@@ -78,10 +78,7 @@ class ConfigLoader {
78
78
  // Convert to flat list of file paths
79
79
  const depPaths = [];
80
80
 
81
- // Add core files
82
- const config = await this.load();
83
- const coreFiles = config['agent-dependencies']?.['core-files'] || [];
84
- depPaths.push(...coreFiles);
81
+ // Core files and utilities are included automatically by DependencyResolver
85
82
 
86
83
  // Add agent file itself is already handled by installer
87
84
 
@@ -118,9 +115,90 @@ class ConfigLoader {
118
115
  return path.join(__dirname, '..', '..', '..', 'bmad-core');
119
116
  }
120
117
 
118
+ getDistPath() {
119
+ // Get the path to dist directory relative to the installer
120
+ return path.join(__dirname, '..', '..', '..', 'dist');
121
+ }
122
+
121
123
  getAgentPath(agentId) {
122
124
  return path.join(this.getBmadCorePath(), 'agents', `${agentId}.md`);
123
125
  }
126
+
127
+ async getAvailableTeams() {
128
+ const teamsDir = path.join(this.getBmadCorePath(), 'agent-teams');
129
+
130
+ try {
131
+ const entries = await fs.readdir(teamsDir, { withFileTypes: true });
132
+ const teams = [];
133
+
134
+ for (const entry of entries) {
135
+ if (entry.isFile() && entry.name.endsWith('.yml')) {
136
+ const teamPath = path.join(teamsDir, entry.name);
137
+
138
+ try {
139
+ const teamContent = await fs.readFile(teamPath, 'utf8');
140
+ const teamConfig = yaml.load(teamContent);
141
+
142
+ if (teamConfig.bundle) {
143
+ teams.push({
144
+ id: path.basename(entry.name, '.yml'),
145
+ name: teamConfig.bundle.name || entry.name,
146
+ description: teamConfig.bundle.description || 'Team configuration',
147
+ icon: teamConfig.bundle.icon || '📋'
148
+ });
149
+ }
150
+ } catch (error) {
151
+ console.warn(`Warning: Could not load team config ${entry.name}: ${error.message}`);
152
+ }
153
+ }
154
+ }
155
+
156
+ return teams;
157
+ } catch (error) {
158
+ console.warn(`Warning: Could not scan teams directory: ${error.message}`);
159
+ return [];
160
+ }
161
+ }
162
+
163
+ getTeamPath(teamId) {
164
+ return path.join(this.getBmadCorePath(), 'agent-teams', `${teamId}.yml`);
165
+ }
166
+
167
+ async getTeamDependencies(teamId) {
168
+ // Use DependencyResolver to dynamically parse team dependencies
169
+ const DependencyResolver = require('../../lib/dependency-resolver');
170
+ const resolver = new DependencyResolver(path.join(__dirname, '..', '..', '..'));
171
+
172
+ try {
173
+ const teamDeps = await resolver.resolveTeamDependencies(teamId);
174
+
175
+ // Convert to flat list of file paths
176
+ const depPaths = [];
177
+
178
+ // Add team config file
179
+ depPaths.push(`.bmad-core/agent-teams/${teamId}.yml`);
180
+
181
+ // Add all agents
182
+ for (const agent of teamDeps.agents) {
183
+ const filePath = `.bmad-core/agents/${agent.id}.md`;
184
+ if (!depPaths.includes(filePath)) {
185
+ depPaths.push(filePath);
186
+ }
187
+ }
188
+
189
+ // Add all resolved resources
190
+ for (const resource of teamDeps.resources) {
191
+ const filePath = `.bmad-core/${resource.type}/${resource.id}.${resource.type === 'workflows' ? 'yml' : 'md'}`;
192
+ if (!depPaths.includes(filePath)) {
193
+ depPaths.push(filePath);
194
+ }
195
+ }
196
+
197
+ return depPaths;
198
+ } catch (error) {
199
+ throw new Error(`Failed to resolve team dependencies for ${teamId}: ${error.message}`);
200
+ }
201
+ }
124
202
  }
125
203
 
126
204
  module.exports = new ConfigLoader();
@@ -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 inside .roo directory
245
- const roomodesPath = path.join(rooDir, ".roomodes");
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 .roo/.roomodes file"));
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