bmad-method 4.17.0 → 4.19.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/.claude/commands/bmad-master.md +0 -1
- package/CHANGELOG.md +20 -0
- package/bmad-core/core-config.yml +0 -1
- package/{bmad-core → common}/tasks/create-doc.md +2 -2
- package/{expansion-packs/expansion-creator/common-tasks → common/tasks}/execute-checklist.md +2 -6
- package/common/utils/workflow-management.md +69 -0
- package/dist/agents/analyst.txt +2 -2
- package/dist/agents/architect.txt +4 -8
- package/dist/agents/bmad-master.txt +35 -270
- package/dist/agents/bmad-orchestrator.txt +33 -187
- package/dist/agents/dev.txt +2 -6
- package/dist/agents/pm.txt +4 -8
- package/dist/agents/po.txt +2 -6
- package/dist/agents/sm.txt +2 -6
- package/dist/agents/ux-expert.txt +4 -8
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +4 -8
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +2 -6
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +2 -6
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +35 -193
- package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +2 -2
- package/dist/expansion-packs/expansion-creator/agents/bmad-the-creator.txt +5 -5
- package/dist/teams/team-all.txt +35 -193
- package/dist/teams/team-fullstack.txt +35 -193
- package/dist/teams/team-ide-minimal.txt +35 -193
- package/dist/teams/team-no-ui.txt +35 -193
- package/docs/working-in-the-brownfield.md +2 -2
- package/expansion-packs/bmad-2d-phaser-game-dev/config.yml +5 -0
- package/expansion-packs/bmad-creator-tools/config.yml +5 -0
- package/expansion-packs/{expansion-creator → bmad-creator-tools}/tasks/generate-expansion-pack.md +5 -5
- package/expansion-packs/bmad-infrastructure-devops/config.yml +5 -0
- package/package.json +1 -1
- package/test-ide-paths.js +41 -0
- package/tools/builders/web-builder.js +60 -19
- package/tools/installer/config/ide-agent-config.yml +58 -0
- package/tools/installer/config/install.config.yml +0 -85
- package/tools/installer/lib/config-loader.js +89 -41
- package/tools/installer/lib/file-manager.js +1 -0
- package/tools/installer/lib/ide-setup.js +150 -116
- package/tools/installer/lib/installer.js +263 -9
- package/tools/installer/package.json +1 -1
- package/tools/lib/dependency-resolver.js +15 -0
- package/bmad-core/tasks/core-dump.md +0 -74
- package/bmad-core/tasks/execute-checklist.md +0 -97
- package/bmad-core/utils/file-resolution-context.md +0 -10
- package/bmad-core/utils/workflow-management.md +0 -223
- package/expansion-packs/bmad-2d-phaser-game-dev/manifest.yml +0 -45
- package/expansion-packs/bmad-infrastructure-devops/manifest.yml +0 -23
- package/expansion-packs/bmad-infrastructure-devops/tasks/create-doc.md +0 -74
- package/expansion-packs/expansion-creator/common-tasks/create-doc.md +0 -74
- package/expansion-packs/expansion-creator/manifest.yml +0 -12
- package/expansion-packs/expansion-creator/utils/template-format.md +0 -26
- package/expansion-packs/expansion-creator/utils/workflow-management.md +0 -223
- /package/{bmad-core → common}/utils/template-format.md +0 -0
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/README.md +0 -0
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/agents/bmad-the-creator.md +0 -0
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/tasks/create-agent.md +0 -0
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/templates/agent-teams-tmpl.md +0 -0
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/templates/agent-tmpl.md +0 -0
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/templates/expansion-pack-plan-tmpl.md +0 -0
- /package/{bmad-core/utils → tools/md-assets}/web-agent-startup-instructions.md +0 -0
|
@@ -225,6 +225,10 @@ class Installer {
|
|
|
225
225
|
const sourceDir = configLoader.getBmadCorePath();
|
|
226
226
|
const bmadCoreDestDir = path.join(installDir, ".bmad-core");
|
|
227
227
|
await fileManager.copyDirectory(sourceDir, bmadCoreDestDir);
|
|
228
|
+
|
|
229
|
+
// Copy common/ items to .bmad-core
|
|
230
|
+
spinner.text = "Copying common utilities...";
|
|
231
|
+
await this.copyCommonItems(installDir, ".bmad-core", spinner);
|
|
228
232
|
|
|
229
233
|
// Get list of all files for manifest
|
|
230
234
|
const glob = require("glob");
|
|
@@ -283,6 +287,11 @@ class Installer {
|
|
|
283
287
|
}
|
|
284
288
|
}
|
|
285
289
|
}
|
|
290
|
+
|
|
291
|
+
// Copy common/ items to .bmad-core
|
|
292
|
+
spinner.text = "Copying common utilities...";
|
|
293
|
+
const commonFiles = await this.copyCommonItems(installDir, ".bmad-core", spinner);
|
|
294
|
+
files.push(...commonFiles);
|
|
286
295
|
} else if (config.installType === "team") {
|
|
287
296
|
// Team installation
|
|
288
297
|
spinner.text = `Installing ${config.team} team...`;
|
|
@@ -313,6 +322,11 @@ class Installer {
|
|
|
313
322
|
}
|
|
314
323
|
}
|
|
315
324
|
}
|
|
325
|
+
|
|
326
|
+
// Copy common/ items to .bmad-core
|
|
327
|
+
spinner.text = "Copying common utilities...";
|
|
328
|
+
const commonFiles = await this.copyCommonItems(installDir, ".bmad-core", spinner);
|
|
329
|
+
files.push(...commonFiles);
|
|
316
330
|
} else if (config.installType === "expansion-only") {
|
|
317
331
|
// Expansion-only installation - create minimal .bmad-core structure
|
|
318
332
|
spinner.text = "Creating minimal .bmad-core structure for expansion packs...";
|
|
@@ -341,6 +355,10 @@ class Installer {
|
|
|
341
355
|
);
|
|
342
356
|
files.push(...copiedFiles.map(f => `.bmad-core/${f}`));
|
|
343
357
|
}
|
|
358
|
+
|
|
359
|
+
// Copy common/ items to .bmad-core
|
|
360
|
+
spinner.text = "Copying common utilities...";
|
|
361
|
+
await this.copyCommonItems(installDir, ".bmad-core", spinner);
|
|
344
362
|
}
|
|
345
363
|
|
|
346
364
|
// Install expansion packs if requested
|
|
@@ -607,8 +625,10 @@ class Installer {
|
|
|
607
625
|
console.log(chalk.green("✓ .bmad-core framework installed with all agents and workflows"));
|
|
608
626
|
|
|
609
627
|
if (config.expansionPacks && config.expansionPacks.length > 0) {
|
|
610
|
-
|
|
611
|
-
|
|
628
|
+
console.log(chalk.green(`✓ Expansion packs installed:`));
|
|
629
|
+
for (const packId of config.expansionPacks) {
|
|
630
|
+
console.log(chalk.green(` - ${packId} → .${packId}/`));
|
|
631
|
+
}
|
|
612
632
|
}
|
|
613
633
|
|
|
614
634
|
if (config.includeWebBundles && config.webBundlesDirectory) {
|
|
@@ -797,9 +817,13 @@ class Installer {
|
|
|
797
817
|
continue;
|
|
798
818
|
}
|
|
799
819
|
|
|
800
|
-
const expansionPackDir =
|
|
820
|
+
const expansionPackDir = pack.packPath;
|
|
801
821
|
|
|
802
|
-
//
|
|
822
|
+
// Create dedicated dot folder for this expansion pack
|
|
823
|
+
const expansionDotFolder = path.join(installDir, `.${packId}`);
|
|
824
|
+
await fileManager.ensureDirectory(expansionDotFolder);
|
|
825
|
+
|
|
826
|
+
// Define the folders to copy from expansion packs
|
|
803
827
|
const foldersToSync = [
|
|
804
828
|
'agents',
|
|
805
829
|
'agent-teams',
|
|
@@ -824,21 +848,47 @@ class Installer {
|
|
|
824
848
|
nodir: true
|
|
825
849
|
});
|
|
826
850
|
|
|
827
|
-
// Copy each file to the
|
|
851
|
+
// Copy each file to the expansion pack's dot folder
|
|
828
852
|
for (const file of files) {
|
|
829
853
|
const sourcePath = path.join(sourceFolder, file);
|
|
830
|
-
const destPath = path.join(
|
|
854
|
+
const destPath = path.join(expansionDotFolder, folder, file);
|
|
831
855
|
|
|
832
856
|
if (await fileManager.copyFile(sourcePath, destPath)) {
|
|
833
|
-
installedFiles.push(path.join(
|
|
857
|
+
installedFiles.push(path.join(`.${packId}`, folder, file));
|
|
834
858
|
}
|
|
835
859
|
}
|
|
836
860
|
}
|
|
837
861
|
}
|
|
838
862
|
|
|
839
|
-
//
|
|
863
|
+
// Copy config.yml
|
|
864
|
+
const configPath = path.join(expansionPackDir, 'config.yml');
|
|
865
|
+
if (await fileManager.pathExists(configPath)) {
|
|
866
|
+
const configDestPath = path.join(expansionDotFolder, 'config.yml');
|
|
867
|
+
if (await fileManager.copyFile(configPath, configDestPath)) {
|
|
868
|
+
installedFiles.push(path.join(`.${packId}`, 'config.yml'));
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
// Copy README if it exists
|
|
873
|
+
const readmePath = path.join(expansionPackDir, 'README.md');
|
|
874
|
+
if (await fileManager.pathExists(readmePath)) {
|
|
875
|
+
const readmeDestPath = path.join(expansionDotFolder, 'README.md');
|
|
876
|
+
if (await fileManager.copyFile(readmePath, readmeDestPath)) {
|
|
877
|
+
installedFiles.push(path.join(`.${packId}`, 'README.md'));
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
// Copy common/ items to expansion pack folder
|
|
882
|
+
spinner.text = `Copying common utilities to ${packId}...`;
|
|
883
|
+
await this.copyCommonItems(installDir, `.${packId}`, spinner);
|
|
884
|
+
|
|
885
|
+
// Check and resolve core dependencies
|
|
886
|
+
await this.resolveExpansionPackCoreDependencies(installDir, expansionDotFolder, packId, spinner);
|
|
887
|
+
|
|
888
|
+
// Check and resolve core agents referenced by teams
|
|
889
|
+
await this.resolveExpansionPackCoreAgents(installDir, expansionDotFolder, packId, spinner);
|
|
840
890
|
|
|
841
|
-
console.log(chalk.green(`✓ Installed expansion pack: ${pack.name}`));
|
|
891
|
+
console.log(chalk.green(`✓ Installed expansion pack: ${pack.name} to ${`.${packId}`}`));
|
|
842
892
|
} catch (error) {
|
|
843
893
|
console.error(chalk.red(`Failed to install expansion pack ${packId}: ${error.message}`));
|
|
844
894
|
}
|
|
@@ -847,6 +897,168 @@ class Installer {
|
|
|
847
897
|
return installedFiles;
|
|
848
898
|
}
|
|
849
899
|
|
|
900
|
+
async resolveExpansionPackCoreDependencies(installDir, expansionDotFolder, packId, spinner) {
|
|
901
|
+
const glob = require('glob');
|
|
902
|
+
const yaml = require('yaml');
|
|
903
|
+
const fs = require('fs').promises;
|
|
904
|
+
|
|
905
|
+
// Find all agent files in the expansion pack
|
|
906
|
+
const agentFiles = glob.sync('agents/*.md', {
|
|
907
|
+
cwd: expansionDotFolder
|
|
908
|
+
});
|
|
909
|
+
|
|
910
|
+
for (const agentFile of agentFiles) {
|
|
911
|
+
const agentPath = path.join(expansionDotFolder, agentFile);
|
|
912
|
+
const agentContent = await fs.readFile(agentPath, 'utf8');
|
|
913
|
+
|
|
914
|
+
// Extract YAML frontmatter to check dependencies
|
|
915
|
+
const yamlMatch = agentContent.match(/```yaml\n([\s\S]*?)```/);
|
|
916
|
+
if (yamlMatch) {
|
|
917
|
+
try {
|
|
918
|
+
const agentConfig = yaml.parse(yamlMatch[1]);
|
|
919
|
+
const dependencies = agentConfig.dependencies || {};
|
|
920
|
+
|
|
921
|
+
// Check for core dependencies (those that don't exist in the expansion pack)
|
|
922
|
+
for (const depType of ['tasks', 'templates', 'checklists', 'workflows', 'utils', 'data']) {
|
|
923
|
+
const deps = dependencies[depType] || [];
|
|
924
|
+
|
|
925
|
+
for (const dep of deps) {
|
|
926
|
+
const depFileName = dep.endsWith('.md') ? dep : `${dep}.md`;
|
|
927
|
+
const expansionDepPath = path.join(expansionDotFolder, depType, depFileName);
|
|
928
|
+
|
|
929
|
+
// Check if dependency exists in expansion pack
|
|
930
|
+
if (!(await fileManager.pathExists(expansionDepPath))) {
|
|
931
|
+
// Try to find it in core
|
|
932
|
+
const coreDepPath = path.join(configLoader.getBmadCorePath(), depType, depFileName);
|
|
933
|
+
|
|
934
|
+
if (await fileManager.pathExists(coreDepPath)) {
|
|
935
|
+
spinner.text = `Copying core dependency ${dep} for ${packId}...`;
|
|
936
|
+
|
|
937
|
+
// Copy from core to expansion pack dot folder
|
|
938
|
+
const destPath = path.join(expansionDotFolder, depType, depFileName);
|
|
939
|
+
await fileManager.copyFile(coreDepPath, destPath);
|
|
940
|
+
|
|
941
|
+
console.log(chalk.dim(` Added core dependency: ${depType}/${depFileName}`));
|
|
942
|
+
} else {
|
|
943
|
+
console.warn(chalk.yellow(` Warning: Dependency ${depType}/${dep} not found in core or expansion pack`));
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
} catch (error) {
|
|
949
|
+
console.warn(chalk.yellow(` Warning: Could not parse agent dependencies: ${error.message}`));
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
async resolveExpansionPackCoreAgents(installDir, expansionDotFolder, packId, spinner) {
|
|
956
|
+
const glob = require('glob');
|
|
957
|
+
const yaml = require('yaml');
|
|
958
|
+
const fs = require('fs').promises;
|
|
959
|
+
|
|
960
|
+
// Find all team files in the expansion pack
|
|
961
|
+
const teamFiles = glob.sync('agent-teams/*.yml', {
|
|
962
|
+
cwd: expansionDotFolder
|
|
963
|
+
});
|
|
964
|
+
|
|
965
|
+
// Also get existing agents in the expansion pack
|
|
966
|
+
const existingAgents = new Set();
|
|
967
|
+
const agentFiles = glob.sync('agents/*.md', {
|
|
968
|
+
cwd: expansionDotFolder
|
|
969
|
+
});
|
|
970
|
+
for (const agentFile of agentFiles) {
|
|
971
|
+
const agentName = path.basename(agentFile, '.md');
|
|
972
|
+
existingAgents.add(agentName);
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
// Process each team file
|
|
976
|
+
for (const teamFile of teamFiles) {
|
|
977
|
+
const teamPath = path.join(expansionDotFolder, teamFile);
|
|
978
|
+
const teamContent = await fs.readFile(teamPath, 'utf8');
|
|
979
|
+
|
|
980
|
+
try {
|
|
981
|
+
const teamConfig = yaml.parse(teamContent);
|
|
982
|
+
const agents = teamConfig.agents || [];
|
|
983
|
+
|
|
984
|
+
// Add bmad-orchestrator if not present (required for all teams)
|
|
985
|
+
if (!agents.includes('bmad-orchestrator')) {
|
|
986
|
+
agents.unshift('bmad-orchestrator');
|
|
987
|
+
}
|
|
988
|
+
|
|
989
|
+
// Check each agent in the team
|
|
990
|
+
for (const agentId of agents) {
|
|
991
|
+
if (!existingAgents.has(agentId)) {
|
|
992
|
+
// Agent not in expansion pack, try to get from core
|
|
993
|
+
const coreAgentPath = path.join(configLoader.getBmadCorePath(), 'agents', `${agentId}.md`);
|
|
994
|
+
|
|
995
|
+
if (await fileManager.pathExists(coreAgentPath)) {
|
|
996
|
+
spinner.text = `Copying core agent ${agentId} for ${packId}...`;
|
|
997
|
+
|
|
998
|
+
// Copy agent file
|
|
999
|
+
const destPath = path.join(expansionDotFolder, 'agents', `${agentId}.md`);
|
|
1000
|
+
await fileManager.copyFile(coreAgentPath, destPath);
|
|
1001
|
+
existingAgents.add(agentId);
|
|
1002
|
+
|
|
1003
|
+
console.log(chalk.dim(` Added core agent: ${agentId}`));
|
|
1004
|
+
|
|
1005
|
+
// Now resolve this agent's dependencies too
|
|
1006
|
+
const agentContent = await fs.readFile(coreAgentPath, 'utf8');
|
|
1007
|
+
const yamlMatch = agentContent.match(/```ya?ml\n([\s\S]*?)```/);
|
|
1008
|
+
|
|
1009
|
+
if (yamlMatch) {
|
|
1010
|
+
try {
|
|
1011
|
+
// Clean up the YAML to handle command descriptions
|
|
1012
|
+
let yamlContent = yamlMatch[1];
|
|
1013
|
+
yamlContent = yamlContent.replace(/^(\s*-)(\s*"[^"]+")(\s*-\s*.*)$/gm, '$1$2');
|
|
1014
|
+
|
|
1015
|
+
const agentConfig = yaml.parse(yamlContent);
|
|
1016
|
+
const dependencies = agentConfig.dependencies || {};
|
|
1017
|
+
|
|
1018
|
+
// Copy all dependencies for this agent
|
|
1019
|
+
for (const depType of ['tasks', 'templates', 'checklists', 'workflows', 'utils', 'data']) {
|
|
1020
|
+
const deps = dependencies[depType] || [];
|
|
1021
|
+
|
|
1022
|
+
for (const dep of deps) {
|
|
1023
|
+
const depFileName = dep.endsWith('.md') || dep.endsWith('.yml') ? dep : `${dep}.md`;
|
|
1024
|
+
const expansionDepPath = path.join(expansionDotFolder, depType, depFileName);
|
|
1025
|
+
|
|
1026
|
+
// Check if dependency exists in expansion pack
|
|
1027
|
+
if (!(await fileManager.pathExists(expansionDepPath))) {
|
|
1028
|
+
// Try to find it in core
|
|
1029
|
+
const coreDepPath = path.join(configLoader.getBmadCorePath(), depType, depFileName);
|
|
1030
|
+
|
|
1031
|
+
if (await fileManager.pathExists(coreDepPath)) {
|
|
1032
|
+
const destDepPath = path.join(expansionDotFolder, depType, depFileName);
|
|
1033
|
+
await fileManager.copyFile(coreDepPath, destDepPath);
|
|
1034
|
+
console.log(chalk.dim(` Added agent dependency: ${depType}/${depFileName}`));
|
|
1035
|
+
} else {
|
|
1036
|
+
// Try common folder
|
|
1037
|
+
const commonDepPath = path.join(this.rootDir, 'common', depType, depFileName);
|
|
1038
|
+
if (await fileManager.pathExists(commonDepPath)) {
|
|
1039
|
+
const destDepPath = path.join(expansionDotFolder, depType, depFileName);
|
|
1040
|
+
await fileManager.copyFile(commonDepPath, destDepPath);
|
|
1041
|
+
console.log(chalk.dim(` Added agent dependency from common: ${depType}/${depFileName}`));
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
}
|
|
1047
|
+
} catch (error) {
|
|
1048
|
+
console.warn(chalk.yellow(` Warning: Could not parse agent ${agentId} dependencies: ${error.message}`));
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
} else {
|
|
1052
|
+
console.warn(chalk.yellow(` Warning: Core agent ${agentId} not found for team ${path.basename(teamFile, '.yml')}`));
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
} catch (error) {
|
|
1057
|
+
console.warn(chalk.yellow(` Warning: Could not parse team file ${teamFile}: ${error.message}`));
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
|
|
850
1062
|
getWebBundleInfo(config) {
|
|
851
1063
|
const webBundleType = config.webBundleType || 'all';
|
|
852
1064
|
|
|
@@ -944,6 +1156,48 @@ class Installer {
|
|
|
944
1156
|
}
|
|
945
1157
|
}
|
|
946
1158
|
|
|
1159
|
+
async copyCommonItems(installDir, targetSubdir, spinner) {
|
|
1160
|
+
const glob = require('glob');
|
|
1161
|
+
const fs = require('fs').promises;
|
|
1162
|
+
const sourceBase = path.dirname(path.dirname(path.dirname(path.dirname(__filename)))); // Go up to project root
|
|
1163
|
+
const commonPath = path.join(sourceBase, 'common');
|
|
1164
|
+
const targetPath = path.join(installDir, targetSubdir);
|
|
1165
|
+
const copiedFiles = [];
|
|
1166
|
+
|
|
1167
|
+
// Check if common/ exists
|
|
1168
|
+
if (!(await fileManager.pathExists(commonPath))) {
|
|
1169
|
+
console.warn(chalk.yellow('Warning: common/ folder not found'));
|
|
1170
|
+
return copiedFiles;
|
|
1171
|
+
}
|
|
1172
|
+
|
|
1173
|
+
// Copy all items from common/ to target
|
|
1174
|
+
const commonItems = glob.sync('**/*', {
|
|
1175
|
+
cwd: commonPath,
|
|
1176
|
+
nodir: true
|
|
1177
|
+
});
|
|
1178
|
+
|
|
1179
|
+
for (const item of commonItems) {
|
|
1180
|
+
const sourcePath = path.join(commonPath, item);
|
|
1181
|
+
const destPath = path.join(targetPath, item);
|
|
1182
|
+
|
|
1183
|
+
// Read the file content
|
|
1184
|
+
const content = await fs.readFile(sourcePath, 'utf8');
|
|
1185
|
+
|
|
1186
|
+
// Replace {root} with the target subdirectory
|
|
1187
|
+
const updatedContent = content.replace(/\{root\}/g, targetSubdir);
|
|
1188
|
+
|
|
1189
|
+
// Ensure directory exists
|
|
1190
|
+
await fileManager.ensureDirectory(path.dirname(destPath));
|
|
1191
|
+
|
|
1192
|
+
// Write the updated content
|
|
1193
|
+
await fs.writeFile(destPath, updatedContent, 'utf8');
|
|
1194
|
+
copiedFiles.push(path.join(targetSubdir, item));
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
console.log(chalk.dim(` Added ${commonItems.length} common utilities`));
|
|
1198
|
+
return copiedFiles;
|
|
1199
|
+
}
|
|
1200
|
+
|
|
947
1201
|
async findInstallation() {
|
|
948
1202
|
// Look for .bmad-core in current directory or parent directories
|
|
949
1203
|
let currentDir = process.cwd();
|
|
@@ -6,6 +6,7 @@ class DependencyResolver {
|
|
|
6
6
|
constructor(rootDir) {
|
|
7
7
|
this.rootDir = rootDir;
|
|
8
8
|
this.bmadCore = path.join(rootDir, 'bmad-core');
|
|
9
|
+
this.common = path.join(rootDir, 'common');
|
|
9
10
|
this.cache = new Map();
|
|
10
11
|
}
|
|
11
12
|
|
|
@@ -123,6 +124,7 @@ class DependencyResolver {
|
|
|
123
124
|
let content = null;
|
|
124
125
|
let filePath = null;
|
|
125
126
|
|
|
127
|
+
// First try bmad-core
|
|
126
128
|
for (const ext of extensions) {
|
|
127
129
|
try {
|
|
128
130
|
filePath = path.join(this.bmadCore, type, `${id}${ext}`);
|
|
@@ -132,6 +134,19 @@ class DependencyResolver {
|
|
|
132
134
|
// Try next extension
|
|
133
135
|
}
|
|
134
136
|
}
|
|
137
|
+
|
|
138
|
+
// If not found in bmad-core, try common folder
|
|
139
|
+
if (!content) {
|
|
140
|
+
for (const ext of extensions) {
|
|
141
|
+
try {
|
|
142
|
+
filePath = path.join(this.common, type, `${id}${ext}`);
|
|
143
|
+
content = await fs.readFile(filePath, 'utf8');
|
|
144
|
+
break;
|
|
145
|
+
} catch (e) {
|
|
146
|
+
// Try next extension
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
135
150
|
|
|
136
151
|
if (!content) {
|
|
137
152
|
console.warn(`Resource not found: ${type}/${id}`);
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# Core Dump Task
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
|
|
5
|
-
To create a concise memory recording file (`.ai/core-dump-n.md`) that captures the essential context of the current agent session, enabling seamless continuation of work in future agent sessions. This task ensures persistent context across agent conversations while maintaining minimal token usage for efficient context loading.
|
|
6
|
-
|
|
7
|
-
## Inputs for this Task
|
|
8
|
-
|
|
9
|
-
- Current session conversation history and accomplishments
|
|
10
|
-
- Files created, modified, or deleted during the session
|
|
11
|
-
- Key decisions made and procedures followed
|
|
12
|
-
- Current project state and next logical steps
|
|
13
|
-
- User requests and agent responses that shaped the session
|
|
14
|
-
|
|
15
|
-
## Task Execution Instructions
|
|
16
|
-
|
|
17
|
-
### 0. Check Existing Core Dump
|
|
18
|
-
|
|
19
|
-
Before proceeding, check if `.ai/core-dump.md` already exists:
|
|
20
|
-
|
|
21
|
-
- If file exists, ask user: "Core dump file exists. Should I: 1. Overwrite, 2. Update, 3. Append or 4. Create new?"
|
|
22
|
-
- **Overwrite**: Replace entire file with new content
|
|
23
|
-
- **Update**: Merge new session info with existing content, updating relevant sections
|
|
24
|
-
- **Append**: Add new session as a separate entry while preserving existing content
|
|
25
|
-
- **Create New**: Create a new file, appending the next possible -# to the file, such as core-dump-3.md if 1 and 2 already exist.
|
|
26
|
-
- If file doesn't exist, proceed with creation of `core-dump-1.md`
|
|
27
|
-
|
|
28
|
-
### 1. Analyze Session Context
|
|
29
|
-
|
|
30
|
-
- Review the entire conversation to identify key accomplishments
|
|
31
|
-
- Note any specific tasks, procedures, or workflows that were executed
|
|
32
|
-
- Identify important decisions made or problems solved
|
|
33
|
-
- Capture the user's working style and preferences observed during the session
|
|
34
|
-
|
|
35
|
-
### 2. Document What Was Accomplished
|
|
36
|
-
|
|
37
|
-
- **Primary Actions**: List the main tasks completed concisely
|
|
38
|
-
- **Story Progress**: For story work, use format "Tasks Complete: 1-6, 8. Next Task Pending: 7, 9"
|
|
39
|
-
- **Problem Solving**: Document any challenges encountered and how they were resolved
|
|
40
|
-
- **User Communications**: Summarize key user requests, preferences, and discussion points
|
|
41
|
-
|
|
42
|
-
### 3. Record File System Changes (Concise Format)
|
|
43
|
-
|
|
44
|
-
- **Files Created**: `filename.ext` (brief purpose/size)
|
|
45
|
-
- **Files Modified**: `filename.ext` (what changed)
|
|
46
|
-
- **Files Deleted**: `filename.ext` (why removed)
|
|
47
|
-
- Focus on essential details, avoid verbose descriptions
|
|
48
|
-
|
|
49
|
-
### 4. Capture Current Project State
|
|
50
|
-
|
|
51
|
-
- **Project Progress**: Where the project stands after this session
|
|
52
|
-
- **Current Issues**: Any blockers or problems that need resolution
|
|
53
|
-
- **Next Logical Steps**: What would be the natural next actions to take
|
|
54
|
-
|
|
55
|
-
### 5. Create/Update Core Dump File
|
|
56
|
-
|
|
57
|
-
Based on user's choice from step 0, handle the file accordingly:
|
|
58
|
-
|
|
59
|
-
### 6. Optimize for Minimal Context
|
|
60
|
-
|
|
61
|
-
- Keep descriptions concise but informative
|
|
62
|
-
- Use abbreviated formats where possible (file sizes, task numbers)
|
|
63
|
-
- Focus on actionable information rather than detailed explanations
|
|
64
|
-
- Avoid redundant information that can be found in project documentation
|
|
65
|
-
- Prioritize information that would be lost without this recording
|
|
66
|
-
- Ensure the file can be quickly scanned and understood
|
|
67
|
-
|
|
68
|
-
### 7. Validate Completeness
|
|
69
|
-
|
|
70
|
-
- Verify all significant session activities are captured
|
|
71
|
-
- Ensure a future agent could understand the current state
|
|
72
|
-
- Check that file changes are accurately recorded
|
|
73
|
-
- Confirm next steps are clear and actionable
|
|
74
|
-
- Verify user communication style and preferences are noted
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
# Checklist Validation Task
|
|
2
|
-
|
|
3
|
-
This task provides instructions for validating documentation against checklists. The agent MUST follow these instructions to ensure thorough and systematic validation of documents.
|
|
4
|
-
|
|
5
|
-
## Context
|
|
6
|
-
|
|
7
|
-
The BMAD Method uses various checklists to ensure quality and completeness of different artifacts. Each checklist contains embedded prompts and instructions to guide the LLM through thorough validation and advanced elicitation. The checklists automatically identify their required artifacts and guide the validation process.
|
|
8
|
-
|
|
9
|
-
## Available Checklists
|
|
10
|
-
|
|
11
|
-
If the user asks or does not specify a specific checklist, list the checklists available to the agent persona. If the task is being run not with a specific agent, tell the user to check the bmad-core/checklists folder to select the appropriate one to run.
|
|
12
|
-
|
|
13
|
-
## Instructions
|
|
14
|
-
|
|
15
|
-
1. **Initial Assessment**
|
|
16
|
-
|
|
17
|
-
- If user or the task being run provides a checklist name:
|
|
18
|
-
- Try fuzzy matching (e.g. "architecture checklist" -> "architect-checklist")
|
|
19
|
-
- If multiple matches found, ask user to clarify
|
|
20
|
-
- Load the appropriate checklist from bmad-core/checklists/
|
|
21
|
-
- If no checklist specified:
|
|
22
|
-
- Ask the user which checklist they want to use
|
|
23
|
-
- Present the available options from the files in the checklists folder
|
|
24
|
-
- Confirm if they want to work through the checklist:
|
|
25
|
-
- Section by section (interactive mode - very time consuming)
|
|
26
|
-
- All at once (YOLO mode - recommended for checklists, there will be a summary of sections at the end to discuss)
|
|
27
|
-
|
|
28
|
-
2. **Document and Artifact Gathering**
|
|
29
|
-
|
|
30
|
-
- Each checklist will specify its required documents/artifacts at the beginning
|
|
31
|
-
- Follow the checklist's specific instructions for what to gather, generally a file can be resolved in the docs folder, if not or unsure, halt and ask or confirm with the user.
|
|
32
|
-
|
|
33
|
-
3. **Checklist Processing**
|
|
34
|
-
|
|
35
|
-
If in interactive mode:
|
|
36
|
-
|
|
37
|
-
- Work through each section of the checklist one at a time
|
|
38
|
-
- For each section:
|
|
39
|
-
- Review all items in the section following instructions for that section embedded in the checklist
|
|
40
|
-
- Check each item against the relevant documentation or artifacts as appropriate
|
|
41
|
-
- Present summary of findings for that section, highlighting warnings, errors and non applicable items (rationale for non-applicability).
|
|
42
|
-
- Get user confirmation before proceeding to next section or if any thing major do we need to halt and take corrective action
|
|
43
|
-
|
|
44
|
-
If in YOLO mode:
|
|
45
|
-
|
|
46
|
-
- Process all sections at once
|
|
47
|
-
- Create a comprehensive report of all findings
|
|
48
|
-
- Present the complete analysis to the user
|
|
49
|
-
|
|
50
|
-
4. **Validation Approach**
|
|
51
|
-
|
|
52
|
-
For each checklist item:
|
|
53
|
-
|
|
54
|
-
- Read and understand the requirement
|
|
55
|
-
- Look for evidence in the documentation that satisfies the requirement
|
|
56
|
-
- Consider both explicit mentions and implicit coverage
|
|
57
|
-
- Aside from this, follow all checklist llm instructions
|
|
58
|
-
- Mark items as:
|
|
59
|
-
- ✅ PASS: Requirement clearly met
|
|
60
|
-
- ❌ FAIL: Requirement not met or insufficient coverage
|
|
61
|
-
- ⚠️ PARTIAL: Some aspects covered but needs improvement
|
|
62
|
-
- N/A: Not applicable to this case
|
|
63
|
-
|
|
64
|
-
5. **Section Analysis**
|
|
65
|
-
|
|
66
|
-
For each section:
|
|
67
|
-
|
|
68
|
-
- think step by step to calculate pass rate
|
|
69
|
-
- Identify common themes in failed items
|
|
70
|
-
- Provide specific recommendations for improvement
|
|
71
|
-
- In interactive mode, discuss findings with user
|
|
72
|
-
- Document any user decisions or explanations
|
|
73
|
-
|
|
74
|
-
6. **Final Report**
|
|
75
|
-
|
|
76
|
-
Prepare a summary that includes:
|
|
77
|
-
|
|
78
|
-
- Overall checklist completion status
|
|
79
|
-
- Pass rates by section
|
|
80
|
-
- List of failed items with context
|
|
81
|
-
- Specific recommendations for improvement
|
|
82
|
-
- Any sections or items marked as N/A with justification
|
|
83
|
-
|
|
84
|
-
## Checklist Execution Methodology
|
|
85
|
-
|
|
86
|
-
Each checklist now contains embedded LLM prompts and instructions that will:
|
|
87
|
-
|
|
88
|
-
1. **Guide thorough thinking** - Prompts ensure deep analysis of each section
|
|
89
|
-
2. **Request specific artifacts** - Clear instructions on what documents/access is needed
|
|
90
|
-
3. **Provide contextual guidance** - Section-specific prompts for better validation
|
|
91
|
-
4. **Generate comprehensive reports** - Final summary with detailed findings
|
|
92
|
-
|
|
93
|
-
The LLM will:
|
|
94
|
-
|
|
95
|
-
- Execute the complete checklist validation
|
|
96
|
-
- Present a final report with pass/fail rates and key findings
|
|
97
|
-
- Offer to provide detailed analysis of any section, especially those with warnings or failures
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# File Resolution Context
|
|
2
|
-
|
|
3
|
-
Update the installer/upgrader so that when agents are added to a project (under Add these two lines to any agent's `activation-instructions` for ide installation:
|
|
4
|
-
|
|
5
|
-
```yaml
|
|
6
|
-
- IDE-FILE-RESOLUTION: Dependencies map to files as {root}/{type}/{name}.md where root=".bmad-core", type=folder (tasks/templates/checklists/utils), name=dependency name.
|
|
7
|
-
- REQUEST-RESOLUTION: Match user requests to your commands/dependencies flexibly (e.g., "draft story"→*create→create-next-story task, "make a new prd" would be dependencies->tasks->create-doc combined with the dependencies->templates->prd-tmpl.md), or ask for clarification if ambiguous.
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
and add `root: .bmad-core` as the first root yml property.
|