bmad-method 4.32.0 → 4.33.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 (43) hide show
  1. package/CHANGELOG.md +15 -4
  2. package/README.md +10 -3
  3. package/bmad-core/agents/dev.md +9 -9
  4. package/bmad-core/checklists/architect-checklist.md +0 -5
  5. package/bmad-core/checklists/pm-checklist.md +0 -5
  6. package/bmad-core/checklists/po-master-checklist.md +0 -9
  7. package/bmad-core/checklists/story-dod-checklist.md +0 -7
  8. package/bmad-core/checklists/story-draft-checklist.md +0 -3
  9. package/bmad-core/data/bmad-kb.md +0 -7
  10. package/bmad-core/tasks/advanced-elicitation.md +0 -2
  11. package/bmad-core/tasks/create-brownfield-story.md +0 -9
  12. package/bmad-core/tasks/create-deep-research-prompt.md +0 -11
  13. package/bmad-core/tasks/document-project.md +0 -4
  14. package/bmad-core/tasks/index-docs.md +0 -5
  15. package/bmad-core/tasks/review-story.md +0 -8
  16. package/bmad-core/tasks/shard-doc.md +0 -2
  17. package/bmad-core/working-in-the-brownfield.md +2 -2
  18. package/common/tasks/execute-checklist.md +0 -7
  19. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +1 -1
  20. package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -4
  21. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -4
  22. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -1
  23. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -18
  24. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -5
  25. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -8
  26. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +1 -1
  27. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -7
  28. package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -4
  29. package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -1
  30. package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -10
  31. package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -18
  32. package/expansion-packs/bmad-infrastructure-devops/config.yaml +1 -1
  33. package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -3
  34. package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -1
  35. package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -1
  36. package/package.json +79 -79
  37. package/tools/bmad-npx-wrapper.js +5 -7
  38. package/tools/cli.js +0 -9
  39. package/tools/flattener/main.js +19 -8
  40. package/tools/installer/bin/bmad.js +14 -0
  41. package/tools/installer/lib/installer.js +28 -2
  42. package/tools/installer/package-lock.json +89 -89
  43. package/tools/installer/package.json +1 -1
@@ -247,17 +247,14 @@ A comprehensive 16-section checklist covering:
247
247
  ### Common Issues
248
248
 
249
249
  1. **Infrastructure Drift**
250
-
251
250
  - Solution: Implement drift detection in IaC pipelines
252
251
  - Prevention: Restrict manual changes, enforce GitOps
253
252
 
254
253
  2. **Cost Overruns**
255
-
256
254
  - Solution: Implement cost monitoring and alerts
257
255
  - Prevention: Resource tagging, budget limits
258
256
 
259
257
  3. **Performance Problems**
260
-
261
258
  - Solution: Review monitoring data, scale resources
262
259
  - Prevention: Load testing, capacity planning
263
260
 
@@ -32,7 +32,6 @@ To conduct a thorough review of existing infrastructure to identify improvement
32
32
  ### 3. Conduct Systematic Review
33
33
 
34
34
  - **If "Incremental Mode" was selected:**
35
-
36
35
  - For each section of the infrastructure checklist:
37
36
  - **a. Present Section Focus:** Explain what aspects of infrastructure this section reviews
38
37
  - **b. Work Through Items:** Examine each checklist item against current infrastructure
@@ -55,7 +55,6 @@ To comprehensively validate platform infrastructure changes against security, re
55
55
  ### 4. Execute Comprehensive Platform Validation Process
56
56
 
57
57
  - **If "Incremental Mode" was selected:**
58
-
59
58
  - For each section of the infrastructure checklist (Sections 1-16):
60
59
  - **a. Present Section Purpose:** Explain what this section validates and why it's important for platform operations
61
60
  - **b. Work Through Items:** Present each checklist item, guide the user through validation, and document compliance or gaps
package/package.json CHANGED
@@ -1,81 +1,81 @@
1
1
  {
2
- "name": "bmad-method",
3
- "version": "4.32.0",
4
- "description": "Breakthrough Method of Agile AI-driven Development",
5
- "main": "tools/cli.js",
6
- "bin": {
7
- "bmad": "tools/bmad-npx-wrapper.js",
8
- "bmad-method": "tools/bmad-npx-wrapper.js"
9
- },
10
- "scripts": {
11
- "build": "node tools/cli.js build",
12
- "build:agents": "node tools/cli.js build --agents-only",
13
- "build:teams": "node tools/cli.js build --teams-only",
14
- "list:agents": "node tools/cli.js list:agents",
15
- "validate": "node tools/cli.js validate",
16
- "flatten": "node tools/flattener/main.js",
17
- "install:bmad": "node tools/installer/bin/bmad.js install",
18
- "format": "prettier --write \"**/*.md\"",
19
- "version:patch": "node tools/version-bump.js patch",
20
- "version:minor": "node tools/version-bump.js minor",
21
- "version:major": "node tools/version-bump.js major",
22
- "version:expansion": "node tools/bump-expansion-version.js",
23
- "version:expansion:set": "node tools/update-expansion-version.js",
24
- "version:all": "node tools/bump-all-versions.js",
25
- "version:all:minor": "node tools/bump-all-versions.js minor",
26
- "version:all:major": "node tools/bump-all-versions.js major",
27
- "version:all:patch": "node tools/bump-all-versions.js patch",
28
- "version:expansion:all": "node tools/bump-all-versions.js",
29
- "version:expansion:all:minor": "node tools/bump-all-versions.js minor",
30
- "version:expansion:all:major": "node tools/bump-all-versions.js major",
31
- "version:expansion:all:patch": "node tools/bump-all-versions.js patch",
32
- "release": "semantic-release",
33
- "release:test": "semantic-release --dry-run --no-ci || echo 'Config test complete - authentication errors are expected locally'",
34
- "prepare": "husky"
35
- },
36
- "dependencies": {
37
- "@kayvan/markdown-tree-parser": "^1.5.0",
38
- "bmad-method": "^4.30.3",
39
- "chalk": "^4.1.2",
40
- "commander": "^14.0.0",
41
- "fs-extra": "^11.3.0",
42
- "glob": "^11.0.3",
43
- "inquirer": "^8.2.6",
44
- "js-yaml": "^4.1.0",
45
- "minimatch": "^10.0.3",
46
- "ora": "^5.4.1"
47
- },
48
- "keywords": [
49
- "agile",
50
- "ai",
51
- "orchestrator",
52
- "development",
53
- "methodology",
54
- "agents",
55
- "bmad"
56
- ],
57
- "author": "Brian (BMad) Madison",
58
- "license": "MIT",
59
- "repository": {
60
- "type": "git",
61
- "url": "git+https://github.com/bmadcode/BMAD-METHOD.git"
62
- },
63
- "engines": {
64
- "node": ">=20.0.0"
65
- },
66
- "devDependencies": {
67
- "@semantic-release/changelog": "^6.0.3",
68
- "@semantic-release/git": "^10.0.1",
69
- "husky": "^9.1.7",
70
- "jest": "^30.0.4",
71
- "lint-staged": "^16.1.1",
72
- "prettier": "^3.5.3",
73
- "semantic-release": "^22.0.0",
74
- "yaml-lint": "^1.7.0"
75
- },
76
- "lint-staged": {
77
- "**/*.md": [
78
- "prettier --write"
79
- ]
80
- }
2
+ "name": "bmad-method",
3
+ "version": "4.33.1",
4
+ "description": "Breakthrough Method of Agile AI-driven Development",
5
+ "main": "tools/cli.js",
6
+ "bin": {
7
+ "bmad": "tools/bmad-npx-wrapper.js",
8
+ "bmad-method": "tools/bmad-npx-wrapper.js"
9
+ },
10
+ "scripts": {
11
+ "build": "node tools/cli.js build",
12
+ "build:agents": "node tools/cli.js build --agents-only",
13
+ "build:teams": "node tools/cli.js build --teams-only",
14
+ "list:agents": "node tools/cli.js list:agents",
15
+ "validate": "node tools/cli.js validate",
16
+ "flatten": "node tools/flattener/main.js",
17
+ "install:bmad": "node tools/installer/bin/bmad.js install",
18
+ "format": "prettier --write \"**/*.md\"",
19
+ "version:patch": "node tools/version-bump.js patch",
20
+ "version:minor": "node tools/version-bump.js minor",
21
+ "version:major": "node tools/version-bump.js major",
22
+ "version:expansion": "node tools/bump-expansion-version.js",
23
+ "version:expansion:set": "node tools/update-expansion-version.js",
24
+ "version:all": "node tools/bump-all-versions.js",
25
+ "version:all:minor": "node tools/bump-all-versions.js minor",
26
+ "version:all:major": "node tools/bump-all-versions.js major",
27
+ "version:all:patch": "node tools/bump-all-versions.js patch",
28
+ "version:expansion:all": "node tools/bump-all-versions.js",
29
+ "version:expansion:all:minor": "node tools/bump-all-versions.js minor",
30
+ "version:expansion:all:major": "node tools/bump-all-versions.js major",
31
+ "version:expansion:all:patch": "node tools/bump-all-versions.js patch",
32
+ "release": "semantic-release",
33
+ "release:test": "semantic-release --dry-run --no-ci || echo 'Config test complete - authentication errors are expected locally'",
34
+ "prepare": "husky"
35
+ },
36
+ "dependencies": {
37
+ "@kayvan/markdown-tree-parser": "^1.5.0",
38
+ "bmad-method": "^4.30.3",
39
+ "chalk": "^4.1.2",
40
+ "commander": "^14.0.0",
41
+ "fs-extra": "^11.3.0",
42
+ "glob": "^11.0.3",
43
+ "inquirer": "^8.2.6",
44
+ "js-yaml": "^4.1.0",
45
+ "minimatch": "^10.0.3",
46
+ "ora": "^5.4.1"
47
+ },
48
+ "keywords": [
49
+ "agile",
50
+ "ai",
51
+ "orchestrator",
52
+ "development",
53
+ "methodology",
54
+ "agents",
55
+ "bmad"
56
+ ],
57
+ "author": "Brian (BMad) Madison",
58
+ "license": "MIT",
59
+ "repository": {
60
+ "type": "git",
61
+ "url": "git+https://github.com/bmadcode/BMAD-METHOD.git"
62
+ },
63
+ "engines": {
64
+ "node": ">=20.0.0"
65
+ },
66
+ "devDependencies": {
67
+ "@semantic-release/changelog": "^6.0.3",
68
+ "@semantic-release/git": "^10.0.1",
69
+ "husky": "^9.1.7",
70
+ "jest": "^30.0.4",
71
+ "lint-staged": "^16.1.1",
72
+ "prettier": "^3.5.3",
73
+ "semantic-release": "^22.0.0",
74
+ "yaml-lint": "^1.7.0"
75
+ },
76
+ "lint-staged": {
77
+ "**/*.md": [
78
+ "prettier --write"
79
+ ]
80
+ }
81
81
  }
@@ -14,28 +14,26 @@ const isNpxExecution = __dirname.includes('_npx') || __dirname.includes('.npm');
14
14
 
15
15
  // If running via npx, we need to handle things differently
16
16
  if (isNpxExecution) {
17
- // The actual bmad.js is in installer/bin/ (relative to tools directory)
17
+ const args = process.argv.slice(2);
18
+
19
+ // Use the installer for all commands
18
20
  const bmadScriptPath = path.join(__dirname, 'installer', 'bin', 'bmad.js');
19
21
 
20
- // Verify the file exists
21
22
  if (!fs.existsSync(bmadScriptPath)) {
22
23
  console.error('Error: Could not find bmad.js at', bmadScriptPath);
23
24
  console.error('Current directory:', __dirname);
24
25
  process.exit(1);
25
26
  }
26
27
 
27
- // Execute with proper working directory
28
28
  try {
29
- execSync(`node "${bmadScriptPath}" ${process.argv.slice(2).join(' ')}`, {
29
+ execSync(`node "${bmadScriptPath}" ${args.join(' ')}`, {
30
30
  stdio: 'inherit',
31
31
  cwd: path.dirname(__dirname)
32
32
  });
33
33
  } catch (error) {
34
- // execSync will throw if the command exits with non-zero
35
- // But the stdio is inherited, so the error is already displayed
36
34
  process.exit(error.status || 1);
37
35
  }
38
36
  } else {
39
- // Local execution - just require the installer directly
37
+ // Local execution - use installer for all commands
40
38
  require('./installer/bin/bmad.js');
41
39
  }
package/tools/cli.js CHANGED
@@ -149,13 +149,4 @@ program
149
149
  });
150
150
  });
151
151
 
152
- program
153
- .command('flatten')
154
- .description('Flatten codebase to XML format')
155
- .option('-o, --output <path>', 'Output file path', 'flattened-codebase.xml')
156
- .action(async (options) => {
157
- const flattener = require('./flattener/main');
158
- await flattener.parseAsync(['flatten', '--output', options.output], { from: 'user' });
159
- });
160
-
161
152
  program.parse();
@@ -496,24 +496,35 @@ program
496
496
  .name('bmad-flatten')
497
497
  .description('BMad-Method codebase flattener tool')
498
498
  .version('1.0.0')
499
+ .option('-i, --input <path>', 'Input directory to flatten', process.cwd())
499
500
  .option('-o, --output <path>', 'Output file path', 'flattened-codebase.xml')
500
501
  .action(async (options) => {
501
- console.log(`Flattening codebase to: ${options.output}`);
502
+ const inputDir = path.resolve(options.input);
503
+ const outputPath = path.resolve(options.output);
504
+
505
+ console.log(`Flattening codebase from: ${inputDir}`);
506
+ console.log(`Output file: ${outputPath}`);
502
507
 
503
508
  try {
509
+ // Verify input directory exists
510
+ if (!await fs.pathExists(inputDir)) {
511
+ console.error(`āŒ Error: Input directory does not exist: ${inputDir}`);
512
+ process.exit(1);
513
+ }
514
+
504
515
  // Import ora dynamically
505
516
  const { default: ora } = await import('ora');
506
517
 
507
518
  // Start file discovery with spinner
508
519
  const discoverySpinner = ora('šŸ” Discovering files...').start();
509
- const files = await discoverFiles(process.cwd());
510
- const filteredFiles = await filterFiles(files, process.cwd());
520
+ const files = await discoverFiles(inputDir);
521
+ const filteredFiles = await filterFiles(files, inputDir);
511
522
  discoverySpinner.succeed(`šŸ“ Found ${filteredFiles.length} files to include`);
512
523
 
513
524
  // Process files with progress tracking
514
525
  console.log('Reading file contents');
515
526
  const processingSpinner = ora('šŸ“„ Processing files...').start();
516
- const aggregatedContent = await aggregateFileContents(filteredFiles, process.cwd(), processingSpinner);
527
+ const aggregatedContent = await aggregateFileContents(filteredFiles, inputDir, processingSpinner);
517
528
  processingSpinner.succeed(`āœ… Processed ${aggregatedContent.processedFiles}/${filteredFiles.length} files`);
518
529
 
519
530
  // Log processing results for test validation
@@ -528,17 +539,17 @@ program
528
539
 
529
540
  // Generate XML output using streaming
530
541
  const xmlSpinner = ora('šŸ”§ Generating XML output...').start();
531
- await generateXMLOutput(aggregatedContent, options.output);
542
+ await generateXMLOutput(aggregatedContent, outputPath);
532
543
  xmlSpinner.succeed('šŸ“ XML generation completed');
533
544
 
534
545
  // Calculate and display statistics
535
- const outputStats = await fs.stat(options.output);
546
+ const outputStats = await fs.stat(outputPath);
536
547
  const stats = calculateStatistics(aggregatedContent, outputStats.size);
537
548
 
538
549
  // Display completion summary
539
550
  console.log('\nšŸ“Š Completion Summary:');
540
- console.log(`āœ… Successfully processed ${filteredFiles.length} files into ${options.output}`);
541
- console.log(`šŸ“ Output file: ${path.resolve(options.output)}`);
551
+ console.log(`āœ… Successfully processed ${filteredFiles.length} files into ${path.basename(outputPath)}`);
552
+ console.log(`šŸ“ Output file: ${outputPath}`);
542
553
  console.log(`šŸ“ Total source size: ${stats.totalSize}`);
543
554
  console.log(`šŸ“„ Generated XML size: ${stats.xmlSize}`);
544
555
  console.log(`šŸ“ Total lines of code: ${stats.totalLines.toLocaleString()}`);
@@ -110,6 +110,20 @@ program
110
110
  }
111
111
  });
112
112
 
113
+ program
114
+ .command('flatten')
115
+ .description('Flatten codebase to XML format')
116
+ .option('-i, --input <path>', 'Input directory to flatten', process.cwd())
117
+ .option('-o, --output <path>', 'Output file path', 'flattened-codebase.xml')
118
+ .action(async (options) => {
119
+ try {
120
+ await installer.flatten(options);
121
+ } catch (error) {
122
+ console.error(chalk.red('Flatten failed:'), error.message);
123
+ process.exit(1);
124
+ }
125
+ });
126
+
113
127
  async function promptInstallation() {
114
128
 
115
129
  // Display ASCII logo
@@ -497,7 +497,7 @@ class Installer {
497
497
  case "reinstall":
498
498
  // For reinstall, don't check for modifications - just overwrite
499
499
  return await this.performReinstall(config, installDir, spinner);
500
- case "expansions":
500
+ case "expansions": {
501
501
  // Ask which expansion packs to install
502
502
  const availableExpansionPacks = await resourceLocator.getExpansionPacks();
503
503
 
@@ -534,6 +534,7 @@ class Installer {
534
534
  console.log(chalk.green(` - ${packId} → .${packId}/`));
535
535
  }
536
536
  return;
537
+ }
537
538
  case "cancel":
538
539
  console.log("Installation cancelled.");
539
540
  return;
@@ -865,6 +866,8 @@ class Installer {
865
866
  }).join(", ");
866
867
  console.log(chalk.green(`āœ“ IDE rules and configurations set up for: ${ideNames}`));
867
868
  }
869
+
870
+
868
871
 
869
872
  // Information about web bundles
870
873
  if (!config.includeWebBundles) {
@@ -1428,7 +1431,7 @@ class Installer {
1428
1431
  return config.selectedWebBundleTeams ?
1429
1432
  `teams: ${config.selectedWebBundleTeams.join(', ')}` :
1430
1433
  'selected teams';
1431
- case 'custom':
1434
+ case 'custom': {
1432
1435
  const parts = [];
1433
1436
  if (config.selectedWebBundleTeams && config.selectedWebBundleTeams.length > 0) {
1434
1437
  parts.push(`teams: ${config.selectedWebBundleTeams.join(', ')}`);
@@ -1437,6 +1440,7 @@ class Installer {
1437
1440
  parts.push('individual agents');
1438
1441
  }
1439
1442
  return parts.length > 0 ? parts.join(' + ') : 'custom selection';
1443
+ }
1440
1444
  default:
1441
1445
  return 'selected bundles';
1442
1446
  }
@@ -1741,6 +1745,28 @@ class Installer {
1741
1745
 
1742
1746
  return null;
1743
1747
  }
1748
+
1749
+ async flatten(options) {
1750
+ const { spawn } = require('child_process');
1751
+ const flattenerPath = path.join(__dirname, '..', '..', 'flattener', 'main.js');
1752
+
1753
+ const args = [];
1754
+ if (options.input) {
1755
+ args.push('--input', options.input);
1756
+ }
1757
+ if (options.output) {
1758
+ args.push('--output', options.output);
1759
+ }
1760
+
1761
+ const child = spawn('node', [flattenerPath, ...args], {
1762
+ stdio: 'inherit',
1763
+ cwd: process.cwd()
1764
+ });
1765
+
1766
+ child.on('exit', (code) => {
1767
+ process.exit(code);
1768
+ });
1769
+ }
1744
1770
  }
1745
1771
 
1746
1772
  module.exports = new Installer();