bmad-method 4.27.5 → 5.0.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 (274) hide show
  1. package/.bmad-core/agent-teams/team-all.yml +16 -0
  2. package/.bmad-core/agent-teams/team-fullstack.yml +26 -0
  3. package/.bmad-core/agent-teams/team-no-ui.yml +15 -0
  4. package/{bmad-core → .bmad-core}/agents/analyst.md +23 -30
  5. package/.bmad-core/agents/architect.md +66 -0
  6. package/.bmad-core/agents/bmad-master.md +104 -0
  7. package/.bmad-core/agents/bmad-orchestrator.md +81 -0
  8. package/.bmad-core/agents/dev.md +70 -0
  9. package/{bmad-core → .bmad-core}/agents/pm.md +24 -25
  10. package/{bmad-core → .bmad-core}/agents/po.md +24 -28
  11. package/.bmad-core/agents/qa.md +52 -0
  12. package/.bmad-core/agents/sm.md +55 -0
  13. package/.bmad-core/agents/ux-expert.md +66 -0
  14. package/{bmad-core → .bmad-core}/checklists/change-checklist.md +2 -2
  15. package/{bmad-core → .bmad-core}/checklists/story-draft-checklist.md +1 -1
  16. package/.bmad-core/data/bmad-kb.md +47 -0
  17. package/.bmad-core/schemas/agent-team-schema.yml +153 -0
  18. package/.bmad-core/tasks/advanced-elicitation.md +92 -0
  19. package/.bmad-core/tasks/brainstorming-techniques.md +238 -0
  20. package/.bmad-core/tasks/core-dump.md +74 -0
  21. package/{expansion-packs/bmad-creator-tools → .bmad-core}/tasks/create-agent.md +11 -9
  22. package/.bmad-core/tasks/create-doc.md +74 -0
  23. package/.bmad-core/tasks/create-expansion-pack.md +425 -0
  24. package/.bmad-core/tasks/create-next-story.md +206 -0
  25. package/.bmad-core/tasks/create-team.md +229 -0
  26. package/{bmad-core → .bmad-core}/tasks/doc-migration-task.md +9 -9
  27. package/{common → .bmad-core}/tasks/execute-checklist.md +6 -2
  28. package/.bmad-core/tasks/generate-ai-frontend-prompt.md +58 -0
  29. package/{bmad-core → .bmad-core}/tasks/index-docs.md +7 -3
  30. package/{bmad-core → .bmad-core}/tasks/shard-doc.md +7 -25
  31. package/.bmad-core/templates/agent-tmpl.md +58 -0
  32. package/.bmad-core/templates/architecture-tmpl.md +771 -0
  33. package/.bmad-core/templates/brownfield-architecture-tmpl.md +542 -0
  34. package/.bmad-core/templates/brownfield-prd-tmpl.md +240 -0
  35. package/.bmad-core/templates/competitor-analysis-tmpl.md +289 -0
  36. package/.bmad-core/templates/expansion-pack-plan-tmpl.md +91 -0
  37. package/.bmad-core/templates/front-end-architecture-tmpl.md +173 -0
  38. package/.bmad-core/templates/front-end-spec-tmpl.md +411 -0
  39. package/.bmad-core/templates/fullstack-architecture-tmpl.md +1016 -0
  40. package/.bmad-core/templates/market-research-tmpl.md +261 -0
  41. package/.bmad-core/templates/prd-tmpl.md +200 -0
  42. package/.bmad-core/templates/project-brief-tmpl.md +228 -0
  43. package/.bmad-core/templates/simple-project-prd-tmpl.md +461 -0
  44. package/.bmad-core/templates/story-tmpl.md +61 -0
  45. package/.bmad-core/templates/web-agent-startup-instructions-template.md +39 -0
  46. package/.bmad-core/utils/agent-switcher.ide.md +112 -0
  47. package/.bmad-core/utils/template-format.md +26 -0
  48. package/.bmad-core/utils/workflow-management.md +224 -0
  49. package/.bmad-core/web-bundles/agents/analyst.txt +1684 -0
  50. package/.bmad-core/web-bundles/agents/architect.txt +3584 -0
  51. package/.bmad-core/web-bundles/agents/bmad-master.txt +9491 -0
  52. package/.bmad-core/web-bundles/agents/bmad-orchestrator.txt +1466 -0
  53. package/{dist → .bmad-core/web-bundles}/agents/dev.txt +71 -179
  54. package/{dist → .bmad-core/web-bundles}/agents/pm.txt +1058 -624
  55. package/{dist → .bmad-core/web-bundles}/agents/po.txt +138 -337
  56. package/.bmad-core/web-bundles/agents/qa.txt +129 -0
  57. package/.bmad-core/web-bundles/agents/sm.txt +658 -0
  58. package/.bmad-core/web-bundles/agents/ux-expert.txt +1099 -0
  59. package/.bmad-core/web-bundles/teams/team-all.txt +10757 -0
  60. package/.bmad-core/web-bundles/teams/team-fullstack.txt +10109 -0
  61. package/.bmad-core/web-bundles/teams/team-no-ui.txt +8950 -0
  62. package/.bmad-core/workflows/brownfield-fullstack.yml +116 -0
  63. package/.bmad-core/workflows/brownfield-service.yml +117 -0
  64. package/.bmad-core/workflows/brownfield-ui.yml +127 -0
  65. package/{bmad-core/workflows/greenfield-fullstack.yaml → .bmad-core/workflows/greenfield-fullstack.yml} +77 -140
  66. package/.bmad-core/workflows/greenfield-service.yml +143 -0
  67. package/.bmad-core/workflows/greenfield-ui.yml +172 -0
  68. package/.claude/commands/analyst.md +63 -0
  69. package/.claude/commands/architect.md +70 -0
  70. package/.claude/commands/bmad-master.md +108 -0
  71. package/.claude/commands/bmad-orchestrator.md +85 -0
  72. package/.claude/commands/dev.md +74 -0
  73. package/.claude/commands/pm.md +63 -0
  74. package/.claude/commands/po.md +64 -0
  75. package/.claude/commands/qa.md +56 -0
  76. package/.claude/commands/sm.md +59 -0
  77. package/.claude/commands/ux-expert.md +70 -0
  78. package/.cursor/rules/analyst.mdc +77 -0
  79. package/.cursor/rules/architect.mdc +84 -0
  80. package/.cursor/rules/bmad-master.mdc +122 -0
  81. package/.cursor/rules/bmad-orchestrator.mdc +99 -0
  82. package/.cursor/rules/dev.mdc +88 -0
  83. package/.cursor/rules/pm.mdc +77 -0
  84. package/.cursor/rules/po.mdc +78 -0
  85. package/.cursor/rules/qa.mdc +70 -0
  86. package/.cursor/rules/sm.mdc +73 -0
  87. package/.cursor/rules/ux-expert.mdc +84 -0
  88. package/.roo/.roomodes +95 -0
  89. package/.roo/README.md +38 -0
  90. package/.vscode/extensions.json +6 -0
  91. package/.vscode/settings.json +75 -49
  92. package/.windsurf/rules/analyst.md +71 -0
  93. package/.windsurf/rules/architect.md +78 -0
  94. package/.windsurf/rules/bmad-master.md +116 -0
  95. package/.windsurf/rules/bmad-orchestrator.md +93 -0
  96. package/.windsurf/rules/dev.md +82 -0
  97. package/.windsurf/rules/pm.md +71 -0
  98. package/.windsurf/rules/po.md +72 -0
  99. package/.windsurf/rules/qa.md +64 -0
  100. package/.windsurf/rules/sm.md +67 -0
  101. package/.windsurf/rules/ux-expert.md +78 -0
  102. package/CHANGELOG.md +16 -452
  103. package/CONTRIBUTING.md +5 -168
  104. package/LICENSE +1 -1
  105. package/README.md +230 -77
  106. package/docs/bmad-workflow-guide.md +15 -19
  107. package/docs/claude-code-guide.md +119 -0
  108. package/docs/cursor-guide.md +127 -0
  109. package/docs/roo-code-guide.md +140 -0
  110. package/docs/sample-output/simple-fullstack-greenfield/prd.md +42 -0
  111. package/docs/versioning-and-releases.md +16 -8
  112. package/docs/versions.md +5 -4
  113. package/docs/windsurf-guide.md +127 -0
  114. package/expansion-packs/README.md +112 -2
  115. package/expansion-packs/{bmad-infrastructure-devops → infrastructure-devops}/README.md +9 -9
  116. package/expansion-packs/{bmad-infrastructure-devops → infrastructure-devops}/agents/infra-devops-platform.md +15 -15
  117. package/expansion-packs/{bmad-infrastructure-devops → infrastructure-devops}/checklists/infrastructure-checklist.md +1 -1
  118. package/expansion-packs/infrastructure-devops/manifest.yml +38 -0
  119. package/expansion-packs/{bmad-infrastructure-devops → infrastructure-devops}/tasks/review-infrastructure.md +4 -4
  120. package/expansion-packs/{bmad-infrastructure-devops → infrastructure-devops}/tasks/validate-infrastructure.md +4 -4
  121. package/expansion-packs/infrastructure-devops/templates/infrastructure-architecture-tmpl.md +415 -0
  122. package/expansion-packs/infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.md +0 -0
  123. package/package.json +11 -19
  124. package/tools/bmad-npx-wrapper.js +1 -1
  125. package/tools/builders/web-builder.js +28 -563
  126. package/tools/cli.js +22 -55
  127. package/tools/installer/README.md +53 -3
  128. package/tools/installer/bin/bmad.js +56 -294
  129. package/tools/installer/config/install.config.yml +139 -0
  130. package/tools/installer/lib/config-loader.js +34 -198
  131. package/tools/installer/lib/file-manager.js +5 -123
  132. package/tools/installer/lib/ide-setup.js +189 -545
  133. package/tools/installer/lib/installer.js +55 -1136
  134. package/tools/installer/package-lock.json +3 -3
  135. package/tools/installer/package.json +4 -4
  136. package/tools/installer/templates/claude-commands.md +7 -0
  137. package/tools/installer/templates/cursor-rules.md +22 -0
  138. package/tools/installer/templates/windsurf-rules.md +22 -0
  139. package/tools/lib/dependency-resolver.js +22 -22
  140. package/tools/upgraders/v3-to-v4-upgrader.js +43 -35
  141. package/tools/version-bump.js +1 -1
  142. package/tools/yaml-format.js +2 -2
  143. package/.github/FUNDING.yaml +0 -15
  144. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
  145. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -22
  146. package/.prettierignore +0 -21
  147. package/.prettierrc +0 -23
  148. package/bmad-core/agent-teams/team-all.yaml +0 -14
  149. package/bmad-core/agent-teams/team-fullstack.yaml +0 -18
  150. package/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
  151. package/bmad-core/agent-teams/team-no-ui.yaml +0 -13
  152. package/bmad-core/agents/architect.md +0 -63
  153. package/bmad-core/agents/bmad-master.md +0 -110
  154. package/bmad-core/agents/bmad-orchestrator.md +0 -140
  155. package/bmad-core/agents/dev.md +0 -57
  156. package/bmad-core/agents/qa.md +0 -55
  157. package/bmad-core/agents/sm.md +0 -46
  158. package/bmad-core/agents/ux-expert.md +0 -54
  159. package/bmad-core/core-config.yaml +0 -25
  160. package/bmad-core/data/bmad-kb.md +0 -803
  161. package/bmad-core/data/brainstorming-techniques.md +0 -36
  162. package/bmad-core/data/elicitation-methods.md +0 -134
  163. package/bmad-core/tasks/advanced-elicitation.md +0 -117
  164. package/bmad-core/tasks/create-brownfield-story.md +0 -355
  165. package/bmad-core/tasks/create-next-story.md +0 -114
  166. package/bmad-core/tasks/create-workflow-plan.md +0 -289
  167. package/bmad-core/tasks/document-project.md +0 -317
  168. package/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
  169. package/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
  170. package/bmad-core/tasks/kb-mode-interaction.md +0 -70
  171. package/bmad-core/tasks/review-story.md +0 -145
  172. package/bmad-core/tasks/update-workflow-plan.md +0 -248
  173. package/bmad-core/tasks/validate-next-story.md +0 -134
  174. package/bmad-core/templates/architecture-tmpl.yaml +0 -650
  175. package/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
  176. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
  177. package/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
  178. package/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -293
  179. package/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -206
  180. package/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
  181. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -805
  182. package/bmad-core/templates/market-research-tmpl.yaml +0 -252
  183. package/bmad-core/templates/prd-tmpl.yaml +0 -202
  184. package/bmad-core/templates/project-brief-tmpl.yaml +0 -221
  185. package/bmad-core/templates/story-tmpl.yaml +0 -137
  186. package/bmad-core/utils/plan-management.md +0 -219
  187. package/bmad-core/workflows/brownfield-fullstack.yaml +0 -297
  188. package/bmad-core/workflows/brownfield-service.yaml +0 -187
  189. package/bmad-core/workflows/brownfield-ui.yaml +0 -197
  190. package/bmad-core/workflows/greenfield-service.yaml +0 -206
  191. package/bmad-core/workflows/greenfield-ui.yaml +0 -235
  192. package/common/tasks/create-doc.md +0 -79
  193. package/common/utils/bmad-doc-template.md +0 -325
  194. package/common/utils/workflow-management.md +0 -69
  195. package/dist/agents/analyst.txt +0 -2849
  196. package/dist/agents/architect.txt +0 -3505
  197. package/dist/agents/bmad-master.txt +0 -9588
  198. package/dist/agents/bmad-orchestrator.txt +0 -2232
  199. package/dist/agents/qa.txt +0 -388
  200. package/dist/agents/sm.txt +0 -673
  201. package/dist/agents/ux-expert.txt +0 -987
  202. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +0 -2401
  203. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +0 -1635
  204. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +0 -825
  205. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -11730
  206. package/dist/expansion-packs/bmad-creator-tools/agents/bmad-the-creator.txt +0 -2023
  207. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +0 -2052
  208. package/dist/teams/team-all.txt +0 -11799
  209. package/dist/teams/team-fullstack.txt +0 -11129
  210. package/dist/teams/team-ide-minimal.txt +0 -4573
  211. package/dist/teams/team-no-ui.txt +0 -9684
  212. package/docs/GUIDING-PRINCIPLES.md +0 -91
  213. package/docs/agentic-tools/claude-code-guide.md +0 -19
  214. package/docs/agentic-tools/cline-guide.md +0 -16
  215. package/docs/agentic-tools/cursor-guide.md +0 -14
  216. package/docs/agentic-tools/gemini-cli-guide.md +0 -32
  217. package/docs/agentic-tools/github-copilot-guide.md +0 -42
  218. package/docs/agentic-tools/roo-code-guide.md +0 -15
  219. package/docs/agentic-tools/trae-guide.md +0 -14
  220. package/docs/agentic-tools/windsurf-guide.md +0 -14
  221. package/docs/core-architecture.md +0 -219
  222. package/docs/expansion-packs.md +0 -280
  223. package/docs/how-to-contribute-with-pull-requests.md +0 -158
  224. package/docs/template-markup-references.md +0 -86
  225. package/docs/user-guide.md +0 -1142
  226. package/docs/working-in-the-brownfield.md +0 -361
  227. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -13
  228. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -60
  229. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -68
  230. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -53
  231. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -201
  232. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -160
  233. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +0 -7
  234. package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -254
  235. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -651
  236. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -111
  237. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -216
  238. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -308
  239. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -613
  240. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -356
  241. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -343
  242. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -253
  243. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  244. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  245. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -175
  246. package/expansion-packs/bmad-creator-tools/README.md +0 -8
  247. package/expansion-packs/bmad-creator-tools/agents/bmad-the-creator.md +0 -55
  248. package/expansion-packs/bmad-creator-tools/config.yaml +0 -5
  249. package/expansion-packs/bmad-creator-tools/tasks/generate-expansion-pack.md +0 -1020
  250. package/expansion-packs/bmad-creator-tools/templates/agent-teams-tmpl.yaml +0 -178
  251. package/expansion-packs/bmad-creator-tools/templates/agent-tmpl.yaml +0 -154
  252. package/expansion-packs/bmad-creator-tools/templates/expansion-pack-plan-tmpl.yaml +0 -120
  253. package/expansion-packs/bmad-infrastructure-devops/config.yaml +0 -8
  254. package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -308
  255. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -424
  256. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -629
  257. package/tools/bump-all-versions.js +0 -107
  258. package/tools/bump-core-version.js +0 -57
  259. package/tools/bump-expansion-version.js +0 -78
  260. package/tools/installer/config/ide-agent-config.yaml +0 -58
  261. package/tools/installer/config/install.config.yaml +0 -91
  262. package/tools/lib/yaml-utils.js +0 -29
  263. package/tools/md-assets/web-agent-startup-instructions.md +0 -39
  264. package/tools/update-expansion-version.js +0 -54
  265. /package/{bmad-core → .bmad-core}/checklists/architect-checklist.md +0 -0
  266. /package/{bmad-core → .bmad-core}/checklists/pm-checklist.md +0 -0
  267. /package/{bmad-core → .bmad-core}/checklists/po-master-checklist.md +0 -0
  268. /package/{bmad-core → .bmad-core}/checklists/story-dod-checklist.md +0 -0
  269. /package/{bmad-core → .bmad-core}/data/technical-preferences.md +0 -0
  270. /package/{bmad-core → .bmad-core}/tasks/brownfield-create-epic.md +0 -0
  271. /package/{bmad-core → .bmad-core}/tasks/brownfield-create-story.md +0 -0
  272. /package/{bmad-core → .bmad-core}/tasks/correct-course.md +0 -0
  273. /package/{bmad-core → .bmad-core}/tasks/create-deep-research-prompt.md +0 -0
  274. /package/.github/workflows/{release.yaml → release.yml} +0 -0
@@ -1,94 +1,16 @@
1
- const fs = require("node:fs").promises;
2
- const path = require("node:path");
3
- const DependencyResolver = require("../lib/dependency-resolver");
4
- const yamlUtils = require("../lib/yaml-utils");
1
+ const fs = require('node:fs').promises;
2
+ const path = require('node:path');
3
+ const DependencyResolver = require('../lib/dependency-resolver');
5
4
 
6
5
  class WebBuilder {
7
6
  constructor(options = {}) {
8
7
  this.rootDir = options.rootDir || process.cwd();
9
- this.outputDirs = options.outputDirs || [path.join(this.rootDir, "dist")];
8
+ this.outputDirs = options.outputDirs || [
9
+ path.join(this.rootDir, 'dist'),
10
+ path.join(this.rootDir, '.bmad-core', 'web-bundles')
11
+ ];
10
12
  this.resolver = new DependencyResolver(this.rootDir);
11
- this.templatePath = path.join(
12
- this.rootDir,
13
- "tools",
14
- "md-assets",
15
- "web-agent-startup-instructions.md"
16
- );
17
- }
18
-
19
- parseYaml(content) {
20
- const yaml = require("js-yaml");
21
- return yaml.load(content);
22
- }
23
-
24
- convertToWebPath(filePath, bundleRoot = 'bmad-core') {
25
- // Convert absolute paths to web bundle paths with dot prefix
26
- // All resources get installed under the bundle root, so use that path
27
- const relativePath = path.relative(this.rootDir, filePath);
28
- const pathParts = relativePath.split(path.sep);
29
-
30
- let resourcePath;
31
- if (pathParts[0] === 'expansion-packs') {
32
- // For expansion packs, remove 'expansion-packs/packname' and use the rest
33
- resourcePath = pathParts.slice(2).join('/');
34
- } else {
35
- // For bmad-core, common, etc., remove the first part
36
- resourcePath = pathParts.slice(1).join('/');
37
- }
38
-
39
- return `.${bundleRoot}/${resourcePath}`;
40
- }
41
-
42
- generateWebInstructions(bundleType, packName = null) {
43
- // Generate dynamic web instructions based on bundle type
44
- const rootExample = packName ? `.${packName}` : '.bmad-core';
45
- const examplePath = packName ? `.${packName}/folder/filename.md` : '.bmad-core/folder/filename.md';
46
- const personasExample = packName ? `.${packName}/personas/analyst.md` : '.bmad-core/personas/analyst.md';
47
- const tasksExample = packName ? `.${packName}/tasks/create-story.md` : '.bmad-core/tasks/create-story.md';
48
- const utilsExample = packName ? `.${packName}/utils/template-format.md` : '.bmad-core/utils/template-format.md';
49
- const tasksRef = packName ? `.${packName}/tasks/create-story.md` : '.bmad-core/tasks/create-story.md';
50
-
51
- return `# Web Agent Bundle Instructions
52
-
53
- You are now operating as a specialized AI agent from the BMad-Method framework. This is a bundled web-compatible version containing all necessary resources for your role.
54
-
55
- ## Important Instructions
56
-
57
- 1. **Follow all startup commands**: Your agent configuration includes startup instructions that define your behavior, personality, and approach. These MUST be followed exactly.
58
-
59
- 2. **Resource Navigation**: This bundle contains all resources you need. Resources are marked with tags like:
60
-
61
- - \`==================== START: ${examplePath} ====================\`
62
- - \`==================== END: ${examplePath} ====================\`
63
-
64
- When you need to reference a resource mentioned in your instructions:
65
-
66
- - Look for the corresponding START/END tags
67
- - The format is always the full path with dot prefix (e.g., \`${personasExample}\`, \`${tasksExample}\`)
68
- - If a section is specified (e.g., \`{root}/tasks/create-story.md#section-name\`), navigate to that section within the file
69
-
70
- **Understanding YAML References**: In the agent configuration, resources are referenced in the dependencies section. For example:
71
-
72
- \`\`\`yaml
73
- dependencies:
74
- utils:
75
- - template-format
76
- tasks:
77
- - create-story
78
- \`\`\`
79
-
80
- These references map directly to bundle sections:
81
-
82
- - \`utils: template-format\` → Look for \`==================== START: ${utilsExample} ====================\`
83
- - \`tasks: create-story\` → Look for \`==================== START: ${tasksRef} ====================\`
84
-
85
- 3. **Execution Context**: You are operating in a web environment. All your capabilities and knowledge are contained within this bundle. Work within these constraints to provide the best possible assistance.
86
-
87
- 4. **Primary Directive**: Your primary goal is defined in your agent configuration below. Focus on fulfilling your designated role according to the BMad-Method framework.
88
-
89
- ---
90
-
91
- `;
13
+ this.templatePath = path.join(this.rootDir, '.bmad-core', 'templates', 'web-agent-startup-instructions-template.md');
92
14
  }
93
15
 
94
16
  async cleanOutputDirs() {
@@ -112,10 +34,10 @@ These references map directly to bundle sections:
112
34
 
113
35
  // Write to all output directories
114
36
  for (const outputDir of this.outputDirs) {
115
- const outputPath = path.join(outputDir, "agents");
37
+ const outputPath = path.join(outputDir, 'agents');
116
38
  await fs.mkdir(outputPath, { recursive: true });
117
39
  const outputFile = path.join(outputPath, `${agentId}.txt`);
118
- await fs.writeFile(outputFile, bundle, "utf8");
40
+ await fs.writeFile(outputFile, bundle, 'utf8');
119
41
  }
120
42
  }
121
43
 
@@ -131,10 +53,10 @@ These references map directly to bundle sections:
131
53
 
132
54
  // Write to all output directories
133
55
  for (const outputDir of this.outputDirs) {
134
- const outputPath = path.join(outputDir, "teams");
56
+ const outputPath = path.join(outputDir, 'teams');
135
57
  await fs.mkdir(outputPath, { recursive: true });
136
58
  const outputFile = path.join(outputPath, `${teamId}.txt`);
137
- await fs.writeFile(outputFile, bundle, "utf8");
59
+ await fs.writeFile(outputFile, bundle, 'utf8');
138
60
  }
139
61
  }
140
62
 
@@ -143,126 +65,55 @@ These references map directly to bundle sections:
143
65
 
144
66
  async buildAgentBundle(agentId) {
145
67
  const dependencies = await this.resolver.resolveAgentDependencies(agentId);
146
- const template = this.generateWebInstructions('agent');
68
+ const template = await fs.readFile(this.templatePath, 'utf8');
147
69
 
148
70
  const sections = [template];
149
71
 
150
72
  // Add agent configuration
151
- const agentPath = this.convertToWebPath(dependencies.agent.path, 'bmad-core');
152
- sections.push(this.formatSection(agentPath, dependencies.agent.content, 'bmad-core'));
73
+ sections.push(this.formatSection(dependencies.agent.path, dependencies.agent.content));
153
74
 
154
75
  // Add all dependencies
155
76
  for (const resource of dependencies.resources) {
156
- const resourcePath = this.convertToWebPath(resource.path, 'bmad-core');
157
- sections.push(this.formatSection(resourcePath, resource.content, 'bmad-core'));
77
+ sections.push(this.formatSection(resource.path, resource.content));
158
78
  }
159
79
 
160
- return sections.join("\n");
80
+ return sections.join('\n');
161
81
  }
162
82
 
163
83
  async buildTeamBundle(teamId) {
164
84
  const dependencies = await this.resolver.resolveTeamDependencies(teamId);
165
- const template = this.generateWebInstructions('team');
85
+ const template = await fs.readFile(this.templatePath, 'utf8');
166
86
 
167
87
  const sections = [template];
168
88
 
169
89
  // Add team configuration
170
- const teamPath = this.convertToWebPath(dependencies.team.path, 'bmad-core');
171
- sections.push(this.formatSection(teamPath, dependencies.team.content, 'bmad-core'));
90
+ sections.push(this.formatSection(dependencies.team.path, dependencies.team.content));
172
91
 
173
92
  // Add all agents
174
93
  for (const agent of dependencies.agents) {
175
- const agentPath = this.convertToWebPath(agent.path, 'bmad-core');
176
- sections.push(this.formatSection(agentPath, agent.content, 'bmad-core'));
94
+ sections.push(this.formatSection(agent.path, agent.content));
177
95
  }
178
96
 
179
97
  // Add all deduplicated resources
180
98
  for (const resource of dependencies.resources) {
181
- const resourcePath = this.convertToWebPath(resource.path, 'bmad-core');
182
- sections.push(this.formatSection(resourcePath, resource.content, 'bmad-core'));
99
+ sections.push(this.formatSection(resource.path, resource.content));
183
100
  }
184
101
 
185
- return sections.join("\n");
186
- }
187
-
188
- processAgentContent(content) {
189
- // First, replace content before YAML with the template
190
- const yamlContent = yamlUtils.extractYamlFromAgent(content);
191
- if (!yamlContent) return content;
192
-
193
- const yamlMatch = content.match(/```ya?ml\n([\s\S]*?)\n```/);
194
- if (!yamlMatch) return content;
195
-
196
- const yamlStartIndex = content.indexOf(yamlMatch[0]);
197
- const yamlEndIndex = yamlStartIndex + yamlMatch[0].length;
198
-
199
- // Parse YAML and remove root and IDE-FILE-RESOLUTION properties
200
- try {
201
- const yaml = require("js-yaml");
202
- const parsed = yaml.load(yamlContent);
203
-
204
- // Remove the properties if they exist at root level
205
- delete parsed.root;
206
- delete parsed["IDE-FILE-RESOLUTION"];
207
- delete parsed["REQUEST-RESOLUTION"];
208
-
209
- // Also remove from activation-instructions if they exist
210
- if (parsed["activation-instructions"] && Array.isArray(parsed["activation-instructions"])) {
211
- parsed["activation-instructions"] = parsed["activation-instructions"].filter(
212
- (instruction) => {
213
- return (
214
- typeof instruction === 'string' &&
215
- !instruction.startsWith("IDE-FILE-RESOLUTION:") &&
216
- !instruction.startsWith("REQUEST-RESOLUTION:")
217
- );
218
- }
219
- );
220
- }
221
-
222
- // Reconstruct the YAML
223
- const cleanedYaml = yaml.dump(parsed, { lineWidth: -1 });
224
-
225
- // Get the agent name from the YAML for the header
226
- const agentName = parsed.agent?.id || "agent";
227
-
228
- // Build the new content with just the agent header and YAML
229
- const newHeader = `# ${agentName}\n\nCRITICAL: Read the full YAML, start activation to alter your state of being, follow startup section instructions, stay in this being until told to exit this mode:\n\n`;
230
- const afterYaml = content.substring(yamlEndIndex);
231
-
232
- return newHeader + "```yaml\n" + cleanedYaml.trim() + "\n```" + afterYaml;
233
- } catch (error) {
234
- console.warn("Failed to process agent YAML:", error.message);
235
- // If parsing fails, return original content
236
- return content;
237
- }
102
+ return sections.join('\n');
238
103
  }
239
104
 
240
- formatSection(path, content, bundleRoot = 'bmad-core') {
241
- const separator = "====================";
242
-
243
- // Process agent content if this is an agent file
244
- if (path.includes("/agents/")) {
245
- content = this.processAgentContent(content);
246
- }
247
-
248
- // Replace {root} references with the actual bundle root
249
- content = this.replaceRootReferences(content, bundleRoot);
250
-
105
+ formatSection(path, content) {
106
+ const separator = '====================';
251
107
  return [
252
108
  `${separator} START: ${path} ${separator}`,
253
109
  content.trim(),
254
110
  `${separator} END: ${path} ${separator}`,
255
- "",
256
- ].join("\n");
257
- }
258
-
259
- replaceRootReferences(content, bundleRoot) {
260
- // Replace {root} with the appropriate bundle root path
261
- return content.replace(/\{root\}/g, `.${bundleRoot}`);
111
+ ''
112
+ ].join('\n');
262
113
  }
263
114
 
264
115
  async validate() {
265
- console.log("Validating agent configurations...");
116
+ console.log('Validating agent configurations...');
266
117
  const agents = await this.resolver.listAgents();
267
118
  for (const agentId of agents) {
268
119
  try {
@@ -274,7 +125,7 @@ These references map directly to bundle sections:
274
125
  }
275
126
  }
276
127
 
277
- console.log("\nValidating team configurations...");
128
+ console.log('\nValidating team configurations...');
278
129
  const teams = await this.resolver.listTeams();
279
130
  for (const teamId of teams) {
280
131
  try {
@@ -287,395 +138,9 @@ These references map directly to bundle sections:
287
138
  }
288
139
  }
289
140
 
290
- async buildAllExpansionPacks(options = {}) {
291
- const expansionPacks = await this.listExpansionPacks();
292
-
293
- for (const packName of expansionPacks) {
294
- console.log(` Building expansion pack: ${packName}`);
295
- await this.buildExpansionPack(packName, options);
296
- }
297
-
298
- console.log(`Built ${expansionPacks.length} expansion pack bundles`);
299
- }
300
-
301
- async buildExpansionPack(packName, options = {}) {
302
- const packDir = path.join(this.rootDir, "expansion-packs", packName);
303
- const outputDirs = [path.join(this.rootDir, "dist", "expansion-packs", packName)];
304
-
305
- // Clean output directories if requested
306
- if (options.clean !== false) {
307
- for (const outputDir of outputDirs) {
308
- try {
309
- await fs.rm(outputDir, { recursive: true, force: true });
310
- } catch (error) {
311
- // Directory might not exist, that's fine
312
- }
313
- }
314
- }
315
-
316
- // Build individual agents first
317
- const agentsDir = path.join(packDir, "agents");
318
- try {
319
- const agentFiles = await fs.readdir(agentsDir);
320
- const agentMarkdownFiles = agentFiles.filter((f) => f.endsWith(".md"));
321
-
322
- if (agentMarkdownFiles.length > 0) {
323
- console.log(` Building individual agents for ${packName}:`);
324
-
325
- for (const agentFile of agentMarkdownFiles) {
326
- const agentName = agentFile.replace(".md", "");
327
- console.log(` - ${agentName}`);
328
-
329
- // Build individual agent bundle
330
- const bundle = await this.buildExpansionAgentBundle(packName, packDir, agentName);
331
-
332
- // Write to all output directories
333
- for (const outputDir of outputDirs) {
334
- const agentsOutputDir = path.join(outputDir, "agents");
335
- await fs.mkdir(agentsOutputDir, { recursive: true });
336
- const outputFile = path.join(agentsOutputDir, `${agentName}.txt`);
337
- await fs.writeFile(outputFile, bundle, "utf8");
338
- }
339
- }
340
- }
341
- } catch (error) {
342
- console.debug(` No agents directory found for ${packName}`);
343
- }
344
-
345
- // Build team bundle
346
- const agentTeamsDir = path.join(packDir, "agent-teams");
347
- try {
348
- const teamFiles = await fs.readdir(agentTeamsDir);
349
- const teamFile = teamFiles.find((f) => f.endsWith(".yaml"));
350
-
351
- if (teamFile) {
352
- console.log(` Building team bundle for ${packName}`);
353
- const teamConfigPath = path.join(agentTeamsDir, teamFile);
354
-
355
- // Build expansion pack as a team bundle
356
- const bundle = await this.buildExpansionTeamBundle(packName, packDir, teamConfigPath);
357
-
358
- // Write to all output directories
359
- for (const outputDir of outputDirs) {
360
- const teamsOutputDir = path.join(outputDir, "teams");
361
- await fs.mkdir(teamsOutputDir, { recursive: true });
362
- const outputFile = path.join(teamsOutputDir, teamFile.replace(".yaml", ".txt"));
363
- await fs.writeFile(outputFile, bundle, "utf8");
364
- console.log(` ✓ Created bundle: ${path.relative(this.rootDir, outputFile)}`);
365
- }
366
- } else {
367
- console.warn(` ⚠ No team configuration found in ${packName}/agent-teams/`);
368
- }
369
- } catch (error) {
370
- console.warn(` ⚠ No agent-teams directory found for ${packName}`);
371
- }
372
- }
373
-
374
- async buildExpansionAgentBundle(packName, packDir, agentName) {
375
- const template = this.generateWebInstructions('expansion-agent', packName);
376
- const sections = [template];
377
-
378
- // Add agent configuration
379
- const agentPath = path.join(packDir, "agents", `${agentName}.md`);
380
- const agentContent = await fs.readFile(agentPath, "utf8");
381
- const agentWebPath = this.convertToWebPath(agentPath, packName);
382
- sections.push(this.formatSection(agentWebPath, agentContent, packName));
383
-
384
- // Resolve and add agent dependencies
385
- const yamlContent = yamlUtils.extractYamlFromAgent(agentContent);
386
- if (yamlContent) {
387
- try {
388
- const yaml = require("js-yaml");
389
- const agentConfig = yaml.load(yamlContent);
390
-
391
- if (agentConfig.dependencies) {
392
- // Add resources, first try expansion pack, then core
393
- for (const [resourceType, resources] of Object.entries(agentConfig.dependencies)) {
394
- if (Array.isArray(resources)) {
395
- for (const resourceName of resources) {
396
- let found = false;
397
-
398
- // Try expansion pack first
399
- const resourcePath = path.join(packDir, resourceType, resourceName);
400
- try {
401
- const resourceContent = await fs.readFile(resourcePath, "utf8");
402
- const resourceWebPath = this.convertToWebPath(resourcePath, packName);
403
- sections.push(
404
- this.formatSection(resourceWebPath, resourceContent, packName)
405
- );
406
- found = true;
407
- } catch (error) {
408
- // Not in expansion pack, continue
409
- }
410
-
411
- // If not found in expansion pack, try core
412
- if (!found) {
413
- const corePath = path.join(
414
- this.rootDir,
415
- "bmad-core",
416
- resourceType,
417
- resourceName
418
- );
419
- try {
420
- const coreContent = await fs.readFile(corePath, "utf8");
421
- const coreWebPath = this.convertToWebPath(corePath, packName);
422
- sections.push(
423
- this.formatSection(coreWebPath, coreContent, packName)
424
- );
425
- found = true;
426
- } catch (error) {
427
- // Not in core either, continue
428
- }
429
- }
430
-
431
- // If not found in core, try common folder
432
- if (!found) {
433
- const commonPath = path.join(
434
- this.rootDir,
435
- "common",
436
- resourceType,
437
- resourceName
438
- );
439
- try {
440
- const commonContent = await fs.readFile(commonPath, "utf8");
441
- const commonWebPath = this.convertToWebPath(commonPath, packName);
442
- sections.push(
443
- this.formatSection(commonWebPath, commonContent, packName)
444
- );
445
- found = true;
446
- } catch (error) {
447
- // Not in common either, continue
448
- }
449
- }
450
-
451
- if (!found) {
452
- console.warn(
453
- ` ⚠ Dependency ${resourceType}#${resourceName} not found in expansion pack or core`
454
- );
455
- }
456
- }
457
- }
458
- }
459
- }
460
- } catch (error) {
461
- console.debug(`Failed to parse agent YAML for ${agentName}:`, error.message);
462
- }
463
- }
464
-
465
- return sections.join("\n");
466
- }
467
-
468
- async buildExpansionTeamBundle(packName, packDir, teamConfigPath) {
469
- const template = this.generateWebInstructions('expansion-team', packName);
470
-
471
- const sections = [template];
472
-
473
- // Add team configuration and parse to get agent list
474
- const teamContent = await fs.readFile(teamConfigPath, "utf8");
475
- const teamFileName = path.basename(teamConfigPath, ".yaml");
476
- const teamConfig = this.parseYaml(teamContent);
477
- const teamWebPath = this.convertToWebPath(teamConfigPath, packName);
478
- sections.push(this.formatSection(teamWebPath, teamContent, packName));
479
-
480
- // Get list of expansion pack agents
481
- const expansionAgents = new Set();
482
- const agentsDir = path.join(packDir, "agents");
483
- try {
484
- const agentFiles = await fs.readdir(agentsDir);
485
- for (const agentFile of agentFiles.filter((f) => f.endsWith(".md"))) {
486
- const agentName = agentFile.replace(".md", "");
487
- expansionAgents.add(agentName);
488
- }
489
- } catch (error) {
490
- console.warn(` ⚠ No agents directory found in ${packName}`);
491
- }
492
-
493
- // Build a map of all available expansion pack resources for override checking
494
- const expansionResources = new Map();
495
- const resourceDirs = ["templates", "tasks", "checklists", "workflows", "data"];
496
- for (const resourceDir of resourceDirs) {
497
- const resourcePath = path.join(packDir, resourceDir);
498
- try {
499
- const resourceFiles = await fs.readdir(resourcePath);
500
- for (const resourceFile of resourceFiles.filter(
501
- (f) => f.endsWith(".md") || f.endsWith(".yaml")
502
- )) {
503
- expansionResources.set(`${resourceDir}#${resourceFile}`, true);
504
- }
505
- } catch (error) {
506
- // Directory might not exist, that's fine
507
- }
508
- }
509
-
510
- // Process all agents listed in team configuration
511
- const agentsToProcess = teamConfig.agents || [];
512
-
513
- // Ensure bmad-orchestrator is always included for teams
514
- if (!agentsToProcess.includes("bmad-orchestrator")) {
515
- console.warn(` ⚠ Team ${teamFileName} missing bmad-orchestrator, adding automatically`);
516
- agentsToProcess.unshift("bmad-orchestrator");
517
- }
518
-
519
- // Track all dependencies from all agents (deduplicated)
520
- const allDependencies = new Map();
521
-
522
- for (const agentId of agentsToProcess) {
523
- if (expansionAgents.has(agentId)) {
524
- // Use expansion pack version (override)
525
- const agentPath = path.join(agentsDir, `${agentId}.md`);
526
- const agentContent = await fs.readFile(agentPath, "utf8");
527
- const expansionAgentWebPath = this.convertToWebPath(agentPath, packName);
528
- sections.push(this.formatSection(expansionAgentWebPath, agentContent, packName));
529
-
530
- // Parse and collect dependencies from expansion agent
531
- const agentYaml = agentContent.match(/```yaml\n([\s\S]*?)\n```/);
532
- if (agentYaml) {
533
- try {
534
- const agentConfig = this.parseYaml(agentYaml[1]);
535
- if (agentConfig.dependencies) {
536
- for (const [resourceType, resources] of Object.entries(agentConfig.dependencies)) {
537
- if (Array.isArray(resources)) {
538
- for (const resourceName of resources) {
539
- const key = `${resourceType}#${resourceName}`;
540
- if (!allDependencies.has(key)) {
541
- allDependencies.set(key, { type: resourceType, name: resourceName });
542
- }
543
- }
544
- }
545
- }
546
- }
547
- } catch (error) {
548
- console.debug(`Failed to parse agent YAML for ${agentId}:`, error.message);
549
- }
550
- }
551
- } else {
552
- // Use core BMad version
553
- try {
554
- const coreAgentPath = path.join(this.rootDir, "bmad-core", "agents", `${agentId}.md`);
555
- const coreAgentContent = await fs.readFile(coreAgentPath, "utf8");
556
- const coreAgentWebPath = this.convertToWebPath(coreAgentPath, packName);
557
- sections.push(this.formatSection(coreAgentWebPath, coreAgentContent, packName));
558
-
559
- // Parse and collect dependencies from core agent
560
- const yamlContent = yamlUtils.extractYamlFromAgent(coreAgentContent, true);
561
- if (yamlContent) {
562
- try {
563
- const agentConfig = this.parseYaml(yamlContent);
564
- if (agentConfig.dependencies) {
565
- for (const [resourceType, resources] of Object.entries(agentConfig.dependencies)) {
566
- if (Array.isArray(resources)) {
567
- for (const resourceName of resources) {
568
- const key = `${resourceType}#${resourceName}`;
569
- if (!allDependencies.has(key)) {
570
- allDependencies.set(key, { type: resourceType, name: resourceName });
571
- }
572
- }
573
- }
574
- }
575
- }
576
- } catch (error) {
577
- console.debug(`Failed to parse agent YAML for ${agentId}:`, error.message);
578
- }
579
- }
580
- } catch (error) {
581
- console.warn(` ⚠ Agent ${agentId} not found in core or expansion pack`);
582
- }
583
- }
584
- }
585
-
586
- // Add all collected dependencies from agents
587
- // Always prefer expansion pack versions if they exist
588
- for (const [key, dep] of allDependencies) {
589
- let found = false;
590
-
591
- // Always check expansion pack first, even if the dependency came from a core agent
592
- if (expansionResources.has(key)) {
593
- // We know it exists in expansion pack, find and load it
594
- const expansionPath = path.join(packDir, dep.type, dep.name);
595
- try {
596
- const content = await fs.readFile(expansionPath, "utf8");
597
- const expansionWebPath = this.convertToWebPath(expansionPath, packName);
598
- sections.push(this.formatSection(expansionWebPath, content, packName));
599
- console.log(` ✓ Using expansion override for ${key}`);
600
- found = true;
601
- } catch (error) {
602
- // Try next extension
603
- }
604
- }
605
-
606
- // If not found in expansion pack (or doesn't exist there), try core
607
- if (!found) {
608
- const corePath = path.join(this.rootDir, "bmad-core", dep.type, dep.name);
609
- try {
610
- const content = await fs.readFile(corePath, "utf8");
611
- const coreWebPath = this.convertToWebPath(corePath, packName);
612
- sections.push(this.formatSection(coreWebPath, content, packName));
613
- found = true;
614
- } catch (error) {
615
- // Not in core either, continue
616
- }
617
- }
618
-
619
- // If not found in core, try common folder
620
- if (!found) {
621
- const commonPath = path.join(this.rootDir, "common", dep.type, dep.name);
622
- try {
623
- const content = await fs.readFile(commonPath, "utf8");
624
- const commonWebPath = this.convertToWebPath(commonPath, packName);
625
- sections.push(this.formatSection(commonWebPath, content, packName));
626
- found = true;
627
- } catch (error) {
628
- // Not in common either, continue
629
- }
630
- }
631
-
632
- if (!found) {
633
- console.warn(` ⚠ Dependency ${key} not found in expansion pack or core`);
634
- }
635
- }
636
-
637
- // Add remaining expansion pack resources not already included as dependencies
638
- for (const resourceDir of resourceDirs) {
639
- const resourcePath = path.join(packDir, resourceDir);
640
- try {
641
- const resourceFiles = await fs.readdir(resourcePath);
642
- for (const resourceFile of resourceFiles.filter(
643
- (f) => f.endsWith(".md") || f.endsWith(".yaml")
644
- )) {
645
- const filePath = path.join(resourcePath, resourceFile);
646
- const fileContent = await fs.readFile(filePath, "utf8");
647
- const fileName = resourceFile.replace(/\.(md|yaml)$/, "");
648
-
649
- // Only add if not already included as a dependency
650
- const resourceKey = `${resourceDir}#${fileName}`;
651
- if (!allDependencies.has(resourceKey)) {
652
- const fullResourcePath = path.join(resourcePath, resourceFile);
653
- const resourceWebPath = this.convertToWebPath(fullResourcePath, packName);
654
- sections.push(this.formatSection(resourceWebPath, fileContent, packName));
655
- }
656
- }
657
- } catch (error) {
658
- // Directory might not exist, that's fine
659
- }
660
- }
661
-
662
- return sections.join("\n");
663
- }
664
-
665
- async listExpansionPacks() {
666
- const expansionPacksDir = path.join(this.rootDir, "expansion-packs");
667
- try {
668
- const entries = await fs.readdir(expansionPacksDir, { withFileTypes: true });
669
- return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
670
- } catch (error) {
671
- console.warn("No expansion-packs directory found");
672
- return [];
673
- }
674
- }
675
-
676
141
  listAgents() {
677
142
  return this.resolver.listAgents();
678
143
  }
679
144
  }
680
145
 
681
- module.exports = WebBuilder;
146
+ module.exports = WebBuilder;