bmad-method 4.32.0 ā 4.33.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 +10 -5
- package/README.md +10 -3
- package/bmad-core/checklists/architect-checklist.md +0 -5
- package/bmad-core/checklists/pm-checklist.md +0 -5
- package/bmad-core/checklists/po-master-checklist.md +0 -9
- package/bmad-core/checklists/story-dod-checklist.md +0 -7
- package/bmad-core/checklists/story-draft-checklist.md +0 -3
- package/bmad-core/data/bmad-kb.md +0 -7
- package/bmad-core/tasks/advanced-elicitation.md +0 -2
- package/bmad-core/tasks/create-brownfield-story.md +0 -9
- package/bmad-core/tasks/create-deep-research-prompt.md +0 -11
- package/bmad-core/tasks/document-project.md +0 -4
- package/bmad-core/tasks/index-docs.md +0 -5
- package/bmad-core/tasks/review-story.md +0 -8
- package/bmad-core/tasks/shard-doc.md +0 -2
- package/bmad-core/working-in-the-brownfield.md +2 -2
- package/common/tasks/execute-checklist.md +0 -7
- package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +1 -1
- package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -4
- package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -4
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -1
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -18
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -5
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -8
- package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +1 -1
- package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -7
- package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -4
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -1
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -10
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -18
- package/expansion-packs/bmad-infrastructure-devops/config.yaml +1 -1
- package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -3
- package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -1
- package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -1
- package/package.json +79 -79
- package/tools/bmad-npx-wrapper.js +5 -7
- package/tools/cli.js +0 -9
- package/tools/flattener/main.js +19 -8
- package/tools/installer/bin/bmad.js +14 -0
- package/tools/installer/lib/installer.js +28 -2
- package/tools/installer/package-lock.json +89 -89
- package/tools/installer/package.json +1 -1
package/package.json
CHANGED
|
@@ -1,81 +1,81 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
2
|
+
"name": "bmad-method",
|
|
3
|
+
"version": "4.33.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
|
+
}
|
|
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
|
-
|
|
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}" ${
|
|
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 -
|
|
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();
|
package/tools/flattener/main.js
CHANGED
|
@@ -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
|
-
|
|
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(
|
|
510
|
-
const filteredFiles = await filterFiles(files,
|
|
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,
|
|
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,
|
|
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(
|
|
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 ${
|
|
541
|
-
console.log(`š Output file: ${
|
|
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();
|