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.
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +128 -1
- package/GUIDING-PRINCIPLES.md +85 -0
- package/README.md +56 -6
- package/bmad-core/agents/analyst.md +3 -1
- package/bmad-core/agents/dev.md +3 -2
- package/bmad-core/agents/qa.md +15 -14
- package/bmad-core/data/bmad-kb.md +280 -19
- package/bmad-core/tasks/document-project.md +250 -322
- package/bmad-core/tasks/review-story.md +135 -0
- package/bmad-core/templates/story-tmpl.md +8 -0
- package/bmad-core/workflows/brownfield-fullstack.yml +36 -1
- package/bmad-core/workflows/brownfield-service.yml +36 -1
- package/bmad-core/workflows/brownfield-ui.yml +36 -1
- package/bmad-core/workflows/greenfield-fullstack.yml +36 -1
- package/bmad-core/workflows/greenfield-service.yml +36 -1
- package/bmad-core/workflows/greenfield-ui.yml +36 -1
- package/dist/agents/analyst.txt +227 -17
- package/dist/agents/bmad-master.txt +260 -24
- package/dist/agents/bmad-orchestrator.txt +227 -17
- package/dist/agents/dev.txt +6 -4
- package/dist/agents/pm.txt +25 -7
- package/dist/agents/po.txt +33 -7
- package/dist/agents/qa.txt +153 -14
- package/dist/agents/sm.txt +8 -0
- package/dist/expansion-packs/expansion-creator/agents/bmad-the-creator.txt +4 -12
- package/dist/teams/team-all.txt +635 -48
- package/dist/teams/team-fullstack.txt +476 -30
- package/dist/teams/team-ide-minimal.txt +419 -42
- package/dist/teams/team-no-ui.txt +332 -26
- package/docs/expansion-pack-ideas.md +121 -0
- package/docs/expansion-packs.md +265 -0
- package/docs/working-in-the-brownfield.md +362 -0
- package/expansion-packs/expansion-creator/tasks/create-agent.md +1 -1
- package/expansion-packs/expansion-creator/tasks/generate-expansion-pack.md +3 -11
- package/package.json +1 -1
- package/tools/installer/bin/bmad.js +12 -11
- package/tools/installer/config/install.config.yml +8 -3
- package/tools/installer/lib/ide-setup.js +71 -0
- package/tools/installer/package.json +1 -1
- 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
|
-
|
|
95
|
+
rule-dir: .clinerules/
|
|
96
|
+
format: multi-file
|
|
97
|
+
command-suffix: .md
|
|
96
98
|
instructions: |
|
|
97
|
-
#
|
|
98
|
-
#
|
|
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();
|
|
@@ -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
|