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