bmad-method 4.12.0 → 4.14.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 (41) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/CONTRIBUTING.md +128 -1
  3. package/GUIDING-PRINCIPLES.md +85 -0
  4. package/README.md +56 -6
  5. package/bmad-core/agents/analyst.md +3 -1
  6. package/bmad-core/agents/dev.md +3 -2
  7. package/bmad-core/agents/qa.md +15 -14
  8. package/bmad-core/data/bmad-kb.md +280 -19
  9. package/bmad-core/tasks/document-project.md +250 -322
  10. package/bmad-core/tasks/review-story.md +135 -0
  11. package/bmad-core/templates/story-tmpl.md +8 -0
  12. package/bmad-core/workflows/brownfield-fullstack.yml +36 -1
  13. package/bmad-core/workflows/brownfield-service.yml +36 -1
  14. package/bmad-core/workflows/brownfield-ui.yml +36 -1
  15. package/bmad-core/workflows/greenfield-fullstack.yml +36 -1
  16. package/bmad-core/workflows/greenfield-service.yml +36 -1
  17. package/bmad-core/workflows/greenfield-ui.yml +36 -1
  18. package/dist/agents/analyst.txt +227 -17
  19. package/dist/agents/bmad-master.txt +260 -24
  20. package/dist/agents/bmad-orchestrator.txt +227 -17
  21. package/dist/agents/dev.txt +6 -4
  22. package/dist/agents/pm.txt +25 -7
  23. package/dist/agents/po.txt +33 -7
  24. package/dist/agents/qa.txt +153 -14
  25. package/dist/agents/sm.txt +8 -0
  26. package/dist/expansion-packs/expansion-creator/agents/bmad-the-creator.txt +4 -12
  27. package/dist/teams/team-all.txt +635 -48
  28. package/dist/teams/team-fullstack.txt +476 -30
  29. package/dist/teams/team-ide-minimal.txt +419 -42
  30. package/dist/teams/team-no-ui.txt +332 -26
  31. package/docs/expansion-pack-ideas.md +121 -0
  32. package/docs/expansion-packs.md +265 -0
  33. package/docs/working-in-the-brownfield.md +362 -0
  34. package/expansion-packs/expansion-creator/tasks/create-agent.md +1 -1
  35. package/expansion-packs/expansion-creator/tasks/generate-expansion-pack.md +3 -11
  36. package/package.json +1 -1
  37. package/tools/installer/bin/bmad.js +12 -11
  38. package/tools/installer/config/install.config.yml +8 -3
  39. package/tools/installer/lib/ide-setup.js +71 -0
  40. package/tools/installer/package.json +1 -1
  41. package/tools/upgraders/v3-to-v4-upgrader.js +1 -0
@@ -50,7 +50,7 @@ program
50
50
  .option('-t, --team <team>', 'Install specific team with required agents and dependencies')
51
51
  .option('-x, --expansion-only', 'Install only expansion packs (no bmad-core)')
52
52
  .option('-d, --directory <path>', 'Installation directory (default: .bmad-core)')
53
- .option('-i, --ide <ide...>', 'Configure for specific IDE(s) - can specify multiple (cursor, claude-code, windsurf, roo, other)')
53
+ .option('-i, --ide <ide...>', 'Configure for specific IDE(s) - can specify multiple (cursor, claude-code, windsurf, roo, cline, other)')
54
54
  .option('-e, --expansion-packs <packs...>', 'Install specific expansion packs (can specify multiple)')
55
55
  .action(async (options) => {
56
56
  try {
@@ -67,7 +67,7 @@ program
67
67
  if (options.agent) installType = 'single-agent';
68
68
  else if (options.team) installType = 'team';
69
69
  else if (options.expansionOnly) installType = 'expansion-only';
70
-
70
+
71
71
  const config = {
72
72
  installType,
73
73
  agent: options.agent,
@@ -164,13 +164,13 @@ async function promptInstallation() {
164
164
  // Check if this is an existing v4 installation
165
165
  const installDir = path.resolve(answers.directory);
166
166
  const state = await installer.detectInstallationState(installDir);
167
-
167
+
168
168
  if (state.type === 'v4_existing') {
169
169
  console.log(chalk.yellow('\nšŸ” Found existing BMAD v4 installation'));
170
170
  console.log(` Directory: ${installDir}`);
171
171
  console.log(` Version: ${state.manifest?.version || 'Unknown'}`);
172
172
  console.log(` Installed: ${state.manifest?.installed_at ? new Date(state.manifest.installed_at).toLocaleDateString() : 'Unknown'}`);
173
-
173
+
174
174
  const { shouldUpdate } = await inquirer.prompt([
175
175
  {
176
176
  type: 'confirm',
@@ -179,7 +179,7 @@ async function promptInstallation() {
179
179
  default: true
180
180
  }
181
181
  ]);
182
-
182
+
183
183
  if (shouldUpdate) {
184
184
  // Skip other prompts and go directly to update
185
185
  answers.installType = 'update';
@@ -256,11 +256,11 @@ async function promptInstallation() {
256
256
  if (installType === 'full' || installType === 'team' || installType === 'expansion-only') {
257
257
  try {
258
258
  const availableExpansionPacks = await installer.getAvailableExpansionPacks();
259
-
259
+
260
260
  if (availableExpansionPacks.length > 0) {
261
261
  let choices;
262
262
  let message;
263
-
263
+
264
264
  if (installType === 'expansion-only') {
265
265
  message = 'Select expansion packs to install (required):'
266
266
  choices = availableExpansionPacks.map(pack => ({
@@ -274,7 +274,7 @@ async function promptInstallation() {
274
274
  value: pack.id
275
275
  }));
276
276
  }
277
-
277
+
278
278
  const { expansionPacks } = await inquirer.prompt([
279
279
  {
280
280
  type: 'checkbox',
@@ -289,7 +289,7 @@ async function promptInstallation() {
289
289
  } : undefined
290
290
  }
291
291
  ]);
292
-
292
+
293
293
  // Use selected expansion packs directly
294
294
  answers.expansionPacks = expansionPacks;
295
295
  } else {
@@ -313,11 +313,12 @@ async function promptInstallation() {
313
313
  { name: 'Cursor', value: 'cursor' },
314
314
  { name: 'Claude Code', value: 'claude-code' },
315
315
  { name: 'Windsurf', value: 'windsurf' },
316
- { name: 'Roo Code', value: 'roo' }
316
+ { name: 'Roo Code', value: 'roo' },
317
+ { name: 'Cline', value: 'cline' }
317
318
  ]
318
319
  }
319
320
  ]);
320
-
321
+
321
322
  // Use selected IDEs directly
322
323
  answers.ides = ides;
323
324
 
@@ -92,10 +92,15 @@ ide-configurations:
92
92
  # 3. The AI will adopt that agent's full personality and capabilities
93
93
  cline:
94
94
  name: Cline
95
- format: unknown
95
+ rule-dir: .clinerules/
96
+ format: multi-file
97
+ command-suffix: .md
96
98
  instructions: |
97
- # Cline configuration coming soon
98
- # Manual setup: Copy IDE agent files to your Cline configuration
99
+ # To use BMAD agents in Cline:
100
+ # 1. Open the Cline chat panel in VS Code
101
+ # 2. Type @agent-name (e.g., "@dev", "@pm", "@architect")
102
+ # 3. The agent will adopt that persona for the conversation
103
+ # 4. Rules are stored in .clinerules/ directory in your project
99
104
  available-agents:
100
105
  - id: analyst
101
106
  name: Business Analyst
@@ -31,6 +31,8 @@ class IdeSetup {
31
31
  return this.setupWindsurf(installDir, selectedAgent);
32
32
  case "roo":
33
33
  return this.setupRoo(installDir, selectedAgent);
34
+ case "cline":
35
+ return this.setupCline(installDir, selectedAgent);
34
36
  default:
35
37
  console.log(chalk.yellow(`\nIDE ${ide} not yet supported`));
36
38
  return false;
@@ -340,6 +342,75 @@ class IdeSetup {
340
342
 
341
343
  return true;
342
344
  }
345
+
346
+ async setupCline(installDir, selectedAgent) {
347
+ const clineRulesDir = path.join(installDir, ".clinerules");
348
+ const agents = selectedAgent ? [selectedAgent] : await this.getAllAgentIds(installDir);
349
+
350
+ await fileManager.ensureDirectory(clineRulesDir);
351
+
352
+ // Define agent order for numeric prefixes
353
+ const agentOrder = {
354
+ 'bmad-master': 1,
355
+ 'bmad-orchestrator': 2,
356
+ 'pm': 3,
357
+ 'analyst': 4,
358
+ 'architect': 5,
359
+ 'po': 6,
360
+ 'sm': 7,
361
+ 'dev': 8,
362
+ 'qa': 9,
363
+ 'ux-expert': 10
364
+ };
365
+
366
+ for (const agentId of agents) {
367
+ // Check if .bmad-core is a subdirectory (full install) or if agents are in root (single agent install)
368
+ let agentPath = path.join(installDir, ".bmad-core", "agents", `${agentId}.md`);
369
+ if (!(await fileManager.pathExists(agentPath))) {
370
+ agentPath = path.join(installDir, "agents", `${agentId}.md`);
371
+ }
372
+
373
+ if (await fileManager.pathExists(agentPath)) {
374
+ const agentContent = await fileManager.readFile(agentPath);
375
+
376
+ // Get numeric prefix for ordering
377
+ const order = agentOrder[agentId] || 99;
378
+ const prefix = order.toString().padStart(2, '0');
379
+ const mdPath = path.join(clineRulesDir, `${prefix}-${agentId}.md`);
380
+
381
+ // Create MD content for Cline (focused on project standards and role)
382
+ let mdContent = `# ${this.getAgentTitle(agentId)} Agent\n\n`;
383
+ mdContent += `This rule defines the ${this.getAgentTitle(agentId)} persona and project standards.\n\n`;
384
+ mdContent += "## Role Definition\n\n";
385
+ mdContent +=
386
+ "When the user types `@" + agentId + "`, adopt this persona and follow these guidelines:\n\n";
387
+ mdContent += "```yml\n";
388
+ // Extract just the YAML content from the agent file
389
+ const yamlMatch = agentContent.match(/```ya?ml\n([\s\S]*?)```/);
390
+ if (yamlMatch) {
391
+ mdContent += yamlMatch[1].trim();
392
+ } else {
393
+ // If no YAML found, include the whole content minus the header
394
+ mdContent += agentContent.replace(/^#.*$/m, "").trim();
395
+ }
396
+ mdContent += "\n```\n\n";
397
+ mdContent += "## Project Standards\n\n";
398
+ mdContent += `- Always maintain consistency with project documentation in .bmad-core/\n`;
399
+ mdContent += `- Follow the agent's specific guidelines and constraints\n`;
400
+ mdContent += `- Update relevant project files when making changes\n`;
401
+ mdContent += `- Reference the complete agent definition in [.bmad-core/agents/${agentId}.md](.bmad-core/agents/${agentId}.md)\n\n`;
402
+ mdContent += "## Usage\n\n";
403
+ mdContent += `Type \`@${agentId}\` to activate this ${this.getAgentTitle(agentId)} persona.\n`;
404
+
405
+ await fileManager.writeFile(mdPath, mdContent);
406
+ console.log(chalk.green(`āœ“ Created rule: ${prefix}-${agentId}.md`));
407
+ }
408
+ }
409
+
410
+ console.log(chalk.green(`\nāœ“ Created Cline rules in ${clineRulesDir}`));
411
+
412
+ return true;
413
+ }
343
414
  }
344
415
 
345
416
  module.exports = new IdeSetup();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bmad-method",
3
- "version": "4.12.0",
3
+ "version": "4.14.0",
4
4
  "description": "BMAD Method installer - AI-powered Agile development framework",
5
5
  "main": "lib/installer.js",
6
6
  "bin": {
@@ -561,6 +561,7 @@ class V3ToV4Upgrader {
561
561
  "claude-code": "Commands created in .claude/commands/",
562
562
  windsurf: "Rules created in .windsurf/rules/",
563
563
  roo: "Custom modes created in .roomodes",
564
+ cline: "Rules created in .clinerules/",
564
565
  };
565
566
 
566
567
  // Setup each selected IDE