bmad-method 5.1.2 → 6.0.0-alpha.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 (579) hide show
  1. package/.github/FUNDING.yaml +2 -2
  2. package/.github/ISSUE_TEMPLATE/config.yaml +1 -0
  3. package/.github/ISSUE_TEMPLATE/idea_submission.md +109 -0
  4. package/.github/workflows/discord.yaml +1 -10
  5. package/.github/workflows/format-check.yaml +3 -2
  6. package/.github/workflows/manual-release.yaml +2 -2
  7. package/.nvmrc +1 -0
  8. package/.vscode/settings.json +34 -9
  9. package/CHANGELOG.md +211 -577
  10. package/CONTRIBUTING.md +130 -60
  11. package/LICENSE +6 -1
  12. package/docs/codebase-flattener.md +19 -0
  13. package/docs/ide-info/auggie.md +31 -0
  14. package/docs/ide-info/claude-code.md +25 -0
  15. package/docs/ide-info/cline.md +31 -0
  16. package/docs/ide-info/codex.md +32 -0
  17. package/docs/ide-info/crush.md +30 -0
  18. package/docs/ide-info/cursor.md +25 -0
  19. package/docs/ide-info/gemini.md +25 -0
  20. package/docs/ide-info/github-copilot.md +26 -0
  21. package/docs/ide-info/iflow.md +33 -0
  22. package/docs/ide-info/kilo.md +24 -0
  23. package/docs/ide-info/qwen.md +25 -0
  24. package/docs/ide-info/roo.md +27 -0
  25. package/docs/ide-info/trae.md +25 -0
  26. package/docs/ide-info/windsurf.md +22 -0
  27. package/docs/installers-bundlers/ide-injections.md +196 -0
  28. package/docs/installers-bundlers/installers-modules-platforms-reference.md +355 -0
  29. package/docs/installers-bundlers/web-bundler-usage.md +54 -0
  30. package/eslint.config.mjs +17 -7
  31. package/package.json +26 -35
  32. package/prettier.config.mjs +1 -1
  33. package/readme.md +216 -0
  34. package/src/core/_module-installer/install-menu-config.yaml +24 -0
  35. package/src/core/_module-installer/installer.js +68 -0
  36. package/src/core/agents/bmad-master.md +27 -0
  37. package/src/core/agents/bmad-web-orchestrator.md +71 -0
  38. package/src/core/tasks/adv-elicit-methods.csv +39 -0
  39. package/src/core/tasks/adv-elicit.md +109 -0
  40. package/src/core/tasks/index-docs.md +69 -0
  41. package/src/core/tasks/shard-doc.md +57 -0
  42. package/src/core/tasks/validate-workflow.md +92 -0
  43. package/src/core/tasks/workflow.md +141 -0
  44. package/src/core/workflows/bmad-init/instructions.md +79 -0
  45. package/src/core/workflows/bmad-init/workflow.yaml +24 -0
  46. package/src/core/workflows/party-mode/instructions.md +181 -0
  47. package/src/core/workflows/party-mode/workflow.yaml +24 -0
  48. package/src/modules/bmb/_module-installer/install-menu-config.yaml +16 -0
  49. package/src/modules/bmb/agents/bmad-builder.md +30 -0
  50. package/src/modules/bmb/workflows/convert-legacy/README.md +262 -0
  51. package/src/modules/bmb/workflows/convert-legacy/checklist.md +204 -0
  52. package/src/modules/bmb/workflows/convert-legacy/instructions.md +328 -0
  53. package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +35 -0
  54. package/src/modules/bmb/workflows/create-agent/README.md +268 -0
  55. package/src/modules/bmb/workflows/create-agent/agent-architecture.md +412 -0
  56. package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +757 -0
  57. package/src/modules/bmb/workflows/create-agent/agent-types.md +177 -0
  58. package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +174 -0
  59. package/src/modules/bmb/workflows/create-agent/checklist.md +134 -0
  60. package/src/modules/bmb/workflows/create-agent/communication-styles.md +240 -0
  61. package/src/modules/bmb/workflows/create-agent/instructions.md +340 -0
  62. package/src/modules/bmb/workflows/create-agent/workflow.yaml +39 -0
  63. package/src/modules/bmb/workflows/create-module/README.md +218 -0
  64. package/src/modules/bmb/workflows/create-module/brainstorm-context.md +137 -0
  65. package/src/modules/bmb/workflows/create-module/checklist.md +245 -0
  66. package/src/modules/bmb/workflows/create-module/installer-templates/install-module-config.yaml +132 -0
  67. package/src/modules/bmb/workflows/create-module/installer-templates/installer.js +231 -0
  68. package/src/modules/bmb/workflows/create-module/instructions.md +509 -0
  69. package/src/modules/bmb/workflows/create-module/module-structure.md +310 -0
  70. package/src/modules/bmb/workflows/create-module/workflow.yaml +47 -0
  71. package/src/modules/bmb/workflows/create-workflow/README.md +216 -0
  72. package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +197 -0
  73. package/src/modules/bmb/workflows/create-workflow/checklist.md +72 -0
  74. package/src/modules/bmb/workflows/create-workflow/instructions.md +267 -0
  75. package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +456 -0
  76. package/src/modules/bmb/workflows/create-workflow/workflow-template/checklist.md +24 -0
  77. package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +12 -0
  78. package/src/modules/bmb/workflows/create-workflow/workflow-template/template.md +9 -0
  79. package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +35 -0
  80. package/src/modules/bmb/workflows/create-workflow/workflow.yaml +42 -0
  81. package/src/modules/bmb/workflows/edit-workflow/README.md +63 -0
  82. package/src/modules/bmb/workflows/edit-workflow/checklist.md +70 -0
  83. package/src/modules/bmb/workflows/edit-workflow/instructions.md +170 -0
  84. package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +34 -0
  85. package/src/modules/bmb/workflows/module-brief/README.md +264 -0
  86. package/src/modules/bmb/workflows/module-brief/checklist.md +116 -0
  87. package/src/modules/bmb/workflows/module-brief/instructions.md +265 -0
  88. package/src/modules/bmb/workflows/module-brief/template.md +275 -0
  89. package/src/modules/bmb/workflows/module-brief/workflow.yaml +30 -0
  90. package/src/modules/bmb/workflows/redoc/README.md +87 -0
  91. package/src/modules/bmb/workflows/redoc/checklist.md +99 -0
  92. package/src/modules/bmb/workflows/redoc/instructions.md +255 -0
  93. package/src/modules/bmb/workflows/redoc/workflow.yaml +33 -0
  94. package/src/modules/bmm/_module-installer/assets/bmm-kb.md +1 -0
  95. package/src/modules/bmm/_module-installer/assets/technical-decisions-template.md +30 -0
  96. package/src/modules/bmm/_module-installer/install-menu-config.yaml +49 -0
  97. package/src/modules/bmm/_module-installer/installer.js +131 -0
  98. package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +35 -0
  99. package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +32 -0
  100. package/src/modules/bmm/agents/analyst.md +26 -0
  101. package/src/modules/bmm/agents/architect.md +29 -0
  102. package/src/modules/bmm/agents/dev.md +61 -0
  103. package/src/modules/bmm/agents/game-architect.md +26 -0
  104. package/src/modules/bmm/agents/game-designer.md +27 -0
  105. package/src/modules/bmm/agents/game-dev.md +28 -0
  106. package/src/modules/bmm/agents/pm.md +26 -0
  107. package/src/modules/bmm/agents/po.md +25 -0
  108. package/src/modules/bmm/agents/sm.md +29 -0
  109. package/src/modules/bmm/agents/tea.md +32 -0
  110. package/src/modules/bmm/agents/ux-expert.md +24 -0
  111. package/src/modules/bmm/sub-modules/claude-code/config.yaml +5 -0
  112. package/src/modules/bmm/sub-modules/claude-code/injections.yaml +242 -0
  113. package/src/modules/bmm/sub-modules/claude-code/readme.md +87 -0
  114. package/src/modules/bmm/sub-modules/claude-code/sub-agents/api-documenter.md +85 -0
  115. package/src/modules/bmm/sub-modules/claude-code/sub-agents/codebase-analyzer.md +64 -0
  116. package/src/modules/bmm/sub-modules/claude-code/sub-agents/data-analyst.md +84 -0
  117. package/src/modules/bmm/sub-modules/claude-code/sub-agents/dependency-mapper.md +67 -0
  118. package/src/modules/bmm/sub-modules/claude-code/sub-agents/document-reviewer.md +85 -0
  119. package/src/modules/bmm/sub-modules/claude-code/sub-agents/epic-optimizer.md +66 -0
  120. package/src/modules/bmm/sub-modules/claude-code/sub-agents/market-researcher.md +34 -0
  121. package/src/modules/bmm/sub-modules/claude-code/sub-agents/pattern-detector.md +67 -0
  122. package/src/modules/bmm/sub-modules/claude-code/sub-agents/requirements-analyst.md +61 -0
  123. package/src/modules/bmm/sub-modules/claude-code/sub-agents/tech-debt-auditor.md +89 -0
  124. package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-decisions-curator.md +146 -0
  125. package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-evaluator.md +51 -0
  126. package/src/modules/bmm/sub-modules/claude-code/sub-agents/test-coverage-analyzer.md +91 -0
  127. package/src/modules/bmm/sub-modules/claude-code/sub-agents/trend-spotter.md +99 -0
  128. package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-journey-mapper.md +101 -0
  129. package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-researcher.md +56 -0
  130. package/src/modules/bmm/tasks/daily-standup.md +91 -0
  131. package/src/modules/bmm/tasks/retrospective.md +110 -0
  132. package/src/modules/bmm/teams/team-all.yaml +7 -0
  133. package/src/modules/bmm/teams/team-dev.yaml +14 -0
  134. package/src/modules/bmm/teams/team-gamedev.yaml +9 -0
  135. package/src/modules/bmm/testarch/atdd.md +40 -0
  136. package/src/modules/bmm/testarch/automate.md +38 -0
  137. package/src/modules/bmm/testarch/ci.md +39 -0
  138. package/src/modules/bmm/testarch/framework.md +41 -0
  139. package/src/modules/bmm/testarch/nfr-assess.md +38 -0
  140. package/src/modules/bmm/testarch/risk-profile.md +38 -0
  141. package/src/modules/bmm/testarch/tea-commands.csv +11 -0
  142. package/src/modules/bmm/testarch/tea-gate.md +38 -0
  143. package/src/modules/bmm/testarch/tea-knowledge.md +275 -0
  144. package/src/modules/bmm/testarch/test-design.md +39 -0
  145. package/{bmad-core/data → src/modules/bmm/testarch}/test-levels-framework.md +2 -0
  146. package/{bmad-core/data → src/modules/bmm/testarch}/test-priorities-matrix.md +2 -0
  147. package/src/modules/bmm/testarch/trace-requirements.md +38 -0
  148. package/src/modules/bmm/workflows/1-analysis/brainstorm-game/game-brain-methods.csv +26 -0
  149. package/src/modules/bmm/workflows/1-analysis/brainstorm-game/game-context.md +115 -0
  150. package/src/modules/bmm/workflows/1-analysis/brainstorm-game/instructions.md +47 -0
  151. package/src/modules/bmm/workflows/1-analysis/brainstorm-game/workflow.yaml +22 -0
  152. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +38 -0
  153. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +25 -0
  154. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +21 -0
  155. package/src/modules/bmm/workflows/1-analysis/game-brief/README.md +221 -0
  156. package/src/modules/bmm/workflows/1-analysis/game-brief/checklist.md +128 -0
  157. package/src/modules/bmm/workflows/1-analysis/game-brief/instructions.md +517 -0
  158. package/src/modules/bmm/workflows/1-analysis/game-brief/template.md +205 -0
  159. package/src/modules/bmm/workflows/1-analysis/game-brief/workflow.yaml +34 -0
  160. package/src/modules/bmm/workflows/1-analysis/product-brief/README.md +180 -0
  161. package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +115 -0
  162. package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +353 -0
  163. package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +165 -0
  164. package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +33 -0
  165. package/src/modules/bmm/workflows/1-analysis/research/README.md +454 -0
  166. package/src/modules/bmm/workflows/1-analysis/research/checklist.md +202 -0
  167. package/src/modules/bmm/workflows/1-analysis/research/claude-code/injections.yaml +114 -0
  168. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-competitor-analyzer.md +259 -0
  169. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-data-analyst.md +190 -0
  170. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-market-researcher.md +337 -0
  171. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-trend-spotter.md +107 -0
  172. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-user-researcher.md +329 -0
  173. package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +370 -0
  174. package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +553 -0
  175. package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +91 -0
  176. package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +442 -0
  177. package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +94 -0
  178. package/src/modules/bmm/workflows/1-analysis/research/template-market.md +311 -0
  179. package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +210 -0
  180. package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +149 -0
  181. package/src/modules/bmm/workflows/2-plan/README.md +203 -0
  182. package/src/modules/bmm/workflows/2-plan/checklist.md +369 -0
  183. package/src/modules/bmm/workflows/2-plan/gdd/README.md +222 -0
  184. package/src/modules/bmm/workflows/2-plan/gdd/game-types/action-platformer.md +45 -0
  185. package/src/modules/bmm/workflows/2-plan/gdd/game-types/adventure.md +84 -0
  186. package/src/modules/bmm/workflows/2-plan/gdd/game-types/card-game.md +76 -0
  187. package/src/modules/bmm/workflows/2-plan/gdd/game-types/fighting.md +89 -0
  188. package/src/modules/bmm/workflows/2-plan/gdd/game-types/horror.md +86 -0
  189. package/src/modules/bmm/workflows/2-plan/gdd/game-types/idle-incremental.md +78 -0
  190. package/src/modules/bmm/workflows/2-plan/gdd/game-types/metroidvania.md +87 -0
  191. package/src/modules/bmm/workflows/2-plan/gdd/game-types/moba.md +74 -0
  192. package/src/modules/bmm/workflows/2-plan/gdd/game-types/party-game.md +79 -0
  193. package/src/modules/bmm/workflows/2-plan/gdd/game-types/puzzle.md +58 -0
  194. package/src/modules/bmm/workflows/2-plan/gdd/game-types/racing.md +88 -0
  195. package/src/modules/bmm/workflows/2-plan/gdd/game-types/rhythm.md +79 -0
  196. package/src/modules/bmm/workflows/2-plan/gdd/game-types/roguelike.md +69 -0
  197. package/src/modules/bmm/workflows/2-plan/gdd/game-types/rpg.md +70 -0
  198. package/src/modules/bmm/workflows/2-plan/gdd/game-types/sandbox.md +79 -0
  199. package/src/modules/bmm/workflows/2-plan/gdd/game-types/shooter.md +62 -0
  200. package/src/modules/bmm/workflows/2-plan/gdd/game-types/simulation.md +73 -0
  201. package/src/modules/bmm/workflows/2-plan/gdd/game-types/sports.md +75 -0
  202. package/src/modules/bmm/workflows/2-plan/gdd/game-types/strategy.md +71 -0
  203. package/src/modules/bmm/workflows/2-plan/gdd/game-types/survival.md +79 -0
  204. package/src/modules/bmm/workflows/2-plan/gdd/game-types/text-based.md +91 -0
  205. package/src/modules/bmm/workflows/2-plan/gdd/game-types/tower-defense.md +79 -0
  206. package/src/modules/bmm/workflows/2-plan/gdd/game-types/turn-based-tactics.md +88 -0
  207. package/src/modules/bmm/workflows/2-plan/gdd/game-types/visual-novel.md +89 -0
  208. package/src/modules/bmm/workflows/2-plan/gdd/game-types.csv +25 -0
  209. package/src/modules/bmm/workflows/2-plan/gdd/gdd-template.md +159 -0
  210. package/src/modules/bmm/workflows/2-plan/gdd/instructions-gdd.md +480 -0
  211. package/src/modules/bmm/workflows/2-plan/instructions-router.md +222 -0
  212. package/src/modules/bmm/workflows/2-plan/narrative/instructions-narrative.md +517 -0
  213. package/src/modules/bmm/workflows/2-plan/narrative/narrative-template.md +195 -0
  214. package/src/modules/bmm/workflows/2-plan/prd/analysis-template.md +53 -0
  215. package/src/modules/bmm/workflows/2-plan/prd/epics-template.md +18 -0
  216. package/src/modules/bmm/workflows/2-plan/prd/instructions-lg.md +267 -0
  217. package/src/modules/bmm/workflows/2-plan/prd/instructions-med.md +251 -0
  218. package/src/modules/bmm/workflows/2-plan/prd/prd-template.md +73 -0
  219. package/src/modules/bmm/workflows/2-plan/tech-spec/instructions-sm.md +137 -0
  220. package/src/modules/bmm/workflows/2-plan/tech-spec/tech-spec-template.md +59 -0
  221. package/src/modules/bmm/workflows/2-plan/ux/instructions-ux.md +360 -0
  222. package/src/modules/bmm/workflows/2-plan/ux/ux-spec-template.md +162 -0
  223. package/src/modules/bmm/workflows/2-plan/workflow.yaml +60 -0
  224. package/src/modules/bmm/workflows/3-solutioning/ADR-template.md +74 -0
  225. package/src/modules/bmm/workflows/3-solutioning/README.md +565 -0
  226. package/src/modules/bmm/workflows/3-solutioning/checklist.md +170 -0
  227. package/src/modules/bmm/workflows/3-solutioning/instructions.md +661 -0
  228. package/src/modules/bmm/workflows/3-solutioning/project-types/backend-questions.md +490 -0
  229. package/src/modules/bmm/workflows/3-solutioning/project-types/cli-questions.md +337 -0
  230. package/src/modules/bmm/workflows/3-solutioning/project-types/data-questions.md +472 -0
  231. package/src/modules/bmm/workflows/3-solutioning/project-types/desktop-questions.md +299 -0
  232. package/src/modules/bmm/workflows/3-solutioning/project-types/embedded-questions.md +118 -0
  233. package/src/modules/bmm/workflows/3-solutioning/project-types/extension-questions.md +374 -0
  234. package/src/modules/bmm/workflows/3-solutioning/project-types/game-questions.md +133 -0
  235. package/src/modules/bmm/workflows/3-solutioning/project-types/infra-questions.md +484 -0
  236. package/src/modules/bmm/workflows/3-solutioning/project-types/library-questions.md +146 -0
  237. package/src/modules/bmm/workflows/3-solutioning/project-types/mobile-questions.md +110 -0
  238. package/src/modules/bmm/workflows/3-solutioning/project-types/project-types.csv +12 -0
  239. package/src/modules/bmm/workflows/3-solutioning/project-types/web-questions.md +136 -0
  240. package/src/modules/bmm/workflows/3-solutioning/tech-spec/README.md +195 -0
  241. package/src/modules/bmm/workflows/3-solutioning/tech-spec/checklist.md +17 -0
  242. package/src/modules/bmm/workflows/3-solutioning/tech-spec/instructions.md +73 -0
  243. package/src/modules/bmm/workflows/3-solutioning/tech-spec/template.md +76 -0
  244. package/src/modules/bmm/workflows/3-solutioning/tech-spec/workflow.yaml +51 -0
  245. package/src/modules/bmm/workflows/3-solutioning/templates/backend-service-architecture.md +66 -0
  246. package/src/modules/bmm/workflows/3-solutioning/templates/cli-tool-architecture.md +66 -0
  247. package/src/modules/bmm/workflows/3-solutioning/templates/data-pipeline-architecture.md +66 -0
  248. package/src/modules/bmm/workflows/3-solutioning/templates/desktop-app-architecture.md +66 -0
  249. package/src/modules/bmm/workflows/3-solutioning/templates/embedded-firmware-architecture.md +66 -0
  250. package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-architecture.md +244 -0
  251. package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-godot-guide.md +428 -0
  252. package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-unity-guide.md +333 -0
  253. package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-web-guide.md +528 -0
  254. package/src/modules/bmm/workflows/3-solutioning/templates/infrastructure-architecture.md +66 -0
  255. package/src/modules/bmm/workflows/3-solutioning/templates/library-package-architecture.md +66 -0
  256. package/src/modules/bmm/workflows/3-solutioning/templates/mobile-app-architecture.md +66 -0
  257. package/src/modules/bmm/workflows/3-solutioning/templates/registry.csv +172 -0
  258. package/src/modules/bmm/workflows/3-solutioning/templates/web-api-architecture.md +66 -0
  259. package/src/modules/bmm/workflows/3-solutioning/templates/web-fullstack-architecture.md +277 -0
  260. package/src/modules/bmm/workflows/3-solutioning/workflow.yaml +65 -0
  261. package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +279 -0
  262. package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +190 -0
  263. package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +35 -0
  264. package/src/modules/bmm/workflows/4-implementation/create-story/README.md +42 -0
  265. package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +39 -0
  266. package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +81 -0
  267. package/src/modules/bmm/workflows/4-implementation/create-story/template.md +57 -0
  268. package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +72 -0
  269. package/src/modules/bmm/workflows/4-implementation/dev-story/README.md +84 -0
  270. package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +38 -0
  271. package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +87 -0
  272. package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +53 -0
  273. package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +391 -0
  274. package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +41 -0
  275. package/src/modules/bmm/workflows/4-implementation/review-story/README.md +72 -0
  276. package/src/modules/bmm/workflows/4-implementation/review-story/backlog_template.md +12 -0
  277. package/src/modules/bmm/workflows/4-implementation/review-story/checklist.md +22 -0
  278. package/src/modules/bmm/workflows/4-implementation/review-story/instructions.md +176 -0
  279. package/src/modules/bmm/workflows/4-implementation/review-story/workflow.yaml +99 -0
  280. package/src/modules/bmm/workflows/4-implementation/story-context/README.md +234 -0
  281. package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +16 -0
  282. package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +34 -0
  283. package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +76 -0
  284. package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +56 -0
  285. package/src/modules/cis/_module-installer/install-menu-config.yaml +14 -0
  286. package/src/modules/cis/_module-installer/installer.js +92 -0
  287. package/src/modules/cis/agents/README.md +104 -0
  288. package/src/modules/cis/agents/brainstorming-coach.md +24 -0
  289. package/src/modules/cis/agents/creative-problem-solver.md +24 -0
  290. package/src/modules/cis/agents/design-thinking-coach.md +24 -0
  291. package/src/modules/cis/agents/innovation-strategist.md +24 -0
  292. package/src/modules/cis/agents/storyteller.md +24 -0
  293. package/src/modules/cis/readme.md +86 -0
  294. package/src/modules/cis/teams/creative-squad.yaml +6 -0
  295. package/src/modules/cis/workflows/README.md +67 -0
  296. package/src/modules/cis/workflows/brainstorming/README.md +271 -0
  297. package/src/modules/cis/workflows/brainstorming/brain-methods.csv +36 -0
  298. package/src/modules/cis/workflows/brainstorming/instructions.md +310 -0
  299. package/src/modules/cis/workflows/brainstorming/template.md +102 -0
  300. package/src/modules/cis/workflows/brainstorming/workflow.yaml +30 -0
  301. package/src/modules/cis/workflows/design-thinking/README.md +56 -0
  302. package/src/modules/cis/workflows/design-thinking/design-methods.csv +31 -0
  303. package/src/modules/cis/workflows/design-thinking/instructions.md +200 -0
  304. package/src/modules/cis/workflows/design-thinking/template.md +111 -0
  305. package/src/modules/cis/workflows/design-thinking/workflow.yaml +29 -0
  306. package/src/modules/cis/workflows/innovation-strategy/README.md +56 -0
  307. package/src/modules/cis/workflows/innovation-strategy/innovation-frameworks.csv +31 -0
  308. package/src/modules/cis/workflows/innovation-strategy/instructions.md +274 -0
  309. package/src/modules/cis/workflows/innovation-strategy/template.md +189 -0
  310. package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +29 -0
  311. package/src/modules/cis/workflows/problem-solving/README.md +56 -0
  312. package/src/modules/cis/workflows/problem-solving/instructions.md +250 -0
  313. package/src/modules/cis/workflows/problem-solving/solving-methods.csv +31 -0
  314. package/src/modules/cis/workflows/problem-solving/template.md +165 -0
  315. package/src/modules/cis/workflows/problem-solving/workflow.yaml +29 -0
  316. package/src/modules/cis/workflows/storytelling/README.md +58 -0
  317. package/src/modules/cis/workflows/storytelling/instructions.md +275 -0
  318. package/src/modules/cis/workflows/storytelling/story-types.csv +26 -0
  319. package/src/modules/cis/workflows/storytelling/template.md +113 -0
  320. package/src/modules/cis/workflows/storytelling/workflow.yaml +29 -0
  321. package/src/utility/models/agent-activation-ide.xml +51 -0
  322. package/src/utility/models/agent-config-template.md +23 -0
  323. package/tools/cli/bmad-cli.js +42 -0
  324. package/tools/cli/bundlers/bundle-web.js +157 -0
  325. package/tools/cli/bundlers/test-analyst.js +28 -0
  326. package/tools/cli/bundlers/test-bundler.js +118 -0
  327. package/tools/cli/bundlers/web-bundler.js +880 -0
  328. package/tools/cli/commands/install.js +41 -0
  329. package/tools/cli/commands/list.js +28 -0
  330. package/tools/cli/commands/status.js +47 -0
  331. package/tools/cli/commands/uninstall.js +44 -0
  332. package/tools/cli/commands/update.js +28 -0
  333. package/tools/cli/installers/lib/core/config-collector.js +383 -0
  334. package/tools/cli/installers/lib/core/dependency-resolver.js +721 -0
  335. package/tools/cli/installers/lib/core/detector.js +208 -0
  336. package/tools/cli/installers/lib/core/installer.js +1070 -0
  337. package/tools/cli/installers/lib/core/manifest-generator.js +385 -0
  338. package/tools/cli/installers/lib/core/manifest.js +484 -0
  339. package/tools/cli/installers/lib/ide/_base-ide.js +281 -0
  340. package/tools/cli/installers/lib/ide/auggie.js +271 -0
  341. package/tools/cli/installers/lib/ide/claude-code.js +625 -0
  342. package/tools/cli/installers/lib/ide/cline.js +301 -0
  343. package/tools/cli/installers/lib/ide/codex.js +267 -0
  344. package/tools/cli/installers/lib/ide/crush.js +204 -0
  345. package/tools/cli/installers/lib/ide/cursor.js +224 -0
  346. package/tools/cli/installers/lib/ide/gemini.js +160 -0
  347. package/tools/cli/installers/lib/ide/github-copilot.js +289 -0
  348. package/tools/cli/installers/lib/ide/iflow.js +142 -0
  349. package/tools/cli/installers/lib/ide/kilo.js +171 -0
  350. package/tools/cli/installers/lib/ide/manager.js +203 -0
  351. package/tools/cli/installers/lib/ide/qwen.js +188 -0
  352. package/tools/cli/installers/lib/ide/roo.js +288 -0
  353. package/tools/cli/installers/lib/ide/trae.js +182 -0
  354. package/tools/cli/installers/lib/ide/windsurf.js +149 -0
  355. package/tools/cli/installers/lib/ide/workflow-command-generator.js +162 -0
  356. package/tools/cli/installers/lib/ide/workflow-command-template.md +11 -0
  357. package/tools/cli/installers/lib/modules/manager.js +452 -0
  358. package/tools/cli/lib/agent-party-generator.js +206 -0
  359. package/tools/cli/lib/cli-utils.js +208 -0
  360. package/tools/cli/lib/config.js +210 -0
  361. package/tools/cli/lib/file-ops.js +204 -0
  362. package/tools/cli/lib/platform-codes.js +116 -0
  363. package/tools/cli/lib/project-root.js +71 -0
  364. package/tools/cli/lib/replace-project-root.js +239 -0
  365. package/tools/cli/lib/ui.js +516 -0
  366. package/tools/cli/lib/xml-handler.js +183 -0
  367. package/tools/cli/lib/xml-to-markdown.js +82 -0
  368. package/tools/{yaml-format.js → cli/lib/yaml-format.js} +3 -10
  369. package/tools/cli/regenerate-manifests.js +28 -0
  370. package/tools/flattener/ignoreRules.js +2 -6
  371. package/tools/flattener/main.js +31 -121
  372. package/tools/flattener/projectRoot.js +3 -8
  373. package/tools/flattener/stats.helpers.js +8 -35
  374. package/tools/flattener/stats.js +1 -6
  375. package/tools/flattener/test-matrix.js +1 -5
  376. package/tools/platform-codes.yaml +127 -0
  377. package/tools/test-agents/captain-kirk-commander.md +110 -0
  378. package/tools/test-agents/data-operations-android.md +123 -0
  379. package/tools/test-agents/geordi-chief-engineer.md +135 -0
  380. package/tools/test-agents/isabella-martinez-ethicist.md +109 -0
  381. package/tools/test-agents/marcus-thompson-security.md +109 -0
  382. package/tools/test-agents/maya-patel-pragmatist.md +82 -0
  383. package/tools/test-agents/picard-diplomat-captain.md +134 -0
  384. package/tools/test-agents/spock-science-officer.md +124 -0
  385. package/tools/test-agents/william-smithers-technocrat.md +71 -0
  386. package/tools/test-agents/zara-chen-designer.md +94 -0
  387. package/tools/validate-bundles.js +87 -0
  388. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -22
  389. package/README.md +0 -221
  390. package/bmad-core/agent-teams/team-all.yaml +0 -14
  391. package/bmad-core/agent-teams/team-fullstack.yaml +0 -18
  392. package/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
  393. package/bmad-core/agent-teams/team-no-ui.yaml +0 -13
  394. package/bmad-core/agents/analyst.md +0 -81
  395. package/bmad-core/agents/architect.md +0 -83
  396. package/bmad-core/agents/bmad-master.md +0 -107
  397. package/bmad-core/agents/bmad-orchestrator.md +0 -149
  398. package/bmad-core/agents/dev.md +0 -75
  399. package/bmad-core/agents/pm.md +0 -81
  400. package/bmad-core/agents/po.md +0 -76
  401. package/bmad-core/agents/qa.md +0 -88
  402. package/bmad-core/agents/sm.md +0 -62
  403. package/bmad-core/agents/ux-expert.md +0 -66
  404. package/bmad-core/checklists/architect-checklist.md +0 -438
  405. package/bmad-core/checklists/change-checklist.md +0 -182
  406. package/bmad-core/checklists/pm-checklist.md +0 -370
  407. package/bmad-core/checklists/po-master-checklist.md +0 -432
  408. package/bmad-core/checklists/story-dod-checklist.md +0 -94
  409. package/bmad-core/checklists/story-draft-checklist.md +0 -153
  410. package/bmad-core/core-config.yaml +0 -20
  411. package/bmad-core/data/bmad-kb.md +0 -806
  412. package/bmad-core/data/brainstorming-techniques.md +0 -36
  413. package/bmad-core/data/elicitation-methods.md +0 -154
  414. package/bmad-core/data/technical-preferences.md +0 -3
  415. package/bmad-core/tasks/advanced-elicitation.md +0 -117
  416. package/bmad-core/tasks/brownfield-create-epic.md +0 -160
  417. package/bmad-core/tasks/brownfield-create-story.md +0 -147
  418. package/bmad-core/tasks/correct-course.md +0 -70
  419. package/bmad-core/tasks/create-brownfield-story.md +0 -312
  420. package/bmad-core/tasks/create-deep-research-prompt.md +0 -278
  421. package/bmad-core/tasks/create-next-story.md +0 -112
  422. package/bmad-core/tasks/document-project.md +0 -343
  423. package/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
  424. package/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
  425. package/bmad-core/tasks/index-docs.md +0 -173
  426. package/bmad-core/tasks/kb-mode-interaction.md +0 -75
  427. package/bmad-core/tasks/nfr-assess.md +0 -343
  428. package/bmad-core/tasks/qa-gate.md +0 -159
  429. package/bmad-core/tasks/review-story.md +0 -314
  430. package/bmad-core/tasks/risk-profile.md +0 -353
  431. package/bmad-core/tasks/shard-doc.md +0 -185
  432. package/bmad-core/tasks/test-design.md +0 -174
  433. package/bmad-core/tasks/trace-requirements.md +0 -264
  434. package/bmad-core/tasks/validate-next-story.md +0 -134
  435. package/bmad-core/templates/architecture-tmpl.yaml +0 -650
  436. package/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
  437. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
  438. package/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
  439. package/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -306
  440. package/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -218
  441. package/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
  442. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -823
  443. package/bmad-core/templates/market-research-tmpl.yaml +0 -252
  444. package/bmad-core/templates/prd-tmpl.yaml +0 -202
  445. package/bmad-core/templates/project-brief-tmpl.yaml +0 -221
  446. package/bmad-core/templates/qa-gate-tmpl.yaml +0 -102
  447. package/bmad-core/templates/story-tmpl.yaml +0 -137
  448. package/bmad-core/workflows/brownfield-fullstack.yaml +0 -297
  449. package/bmad-core/workflows/brownfield-service.yaml +0 -187
  450. package/bmad-core/workflows/brownfield-ui.yaml +0 -197
  451. package/bmad-core/workflows/greenfield-fullstack.yaml +0 -240
  452. package/bmad-core/workflows/greenfield-service.yaml +0 -206
  453. package/bmad-core/workflows/greenfield-ui.yaml +0 -235
  454. package/common/tasks/create-doc.md +0 -101
  455. package/common/tasks/execute-checklist.md +0 -86
  456. package/common/utils/bmad-doc-template.md +0 -325
  457. package/common/utils/workflow-management.md +0 -69
  458. package/dist/agents/analyst.txt +0 -2889
  459. package/dist/agents/architect.txt +0 -3552
  460. package/dist/agents/bmad-master.txt +0 -8769
  461. package/dist/agents/bmad-orchestrator.txt +0 -1513
  462. package/dist/agents/dev.txt +0 -414
  463. package/dist/agents/pm.txt +0 -2204
  464. package/dist/agents/po.txt +0 -1346
  465. package/dist/agents/qa.txt +0 -1987
  466. package/dist/agents/sm.txt +0 -658
  467. package/dist/agents/ux-expert.txt +0 -694
  468. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +0 -2371
  469. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +0 -1620
  470. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +0 -815
  471. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -10952
  472. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +0 -4012
  473. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +0 -3698
  474. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -450
  475. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +0 -973
  476. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -15376
  477. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +0 -2075
  478. package/dist/teams/team-all.txt +0 -12682
  479. package/dist/teams/team-fullstack.txt +0 -10421
  480. package/dist/teams/team-ide-minimal.txt +0 -5103
  481. package/dist/teams/team-no-ui.txt +0 -8980
  482. package/docs/GUIDING-PRINCIPLES.md +0 -91
  483. package/docs/core-architecture.md +0 -219
  484. package/docs/enhanced-ide-development-workflow.md +0 -248
  485. package/docs/expansion-packs.md +0 -280
  486. package/docs/how-to-contribute-with-pull-requests.md +0 -158
  487. package/docs/user-guide.md +0 -504
  488. package/docs/versioning-and-releases.md +0 -147
  489. package/docs/versions.md +0 -48
  490. package/docs/working-in-the-brownfield.md +0 -597
  491. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +0 -102
  492. 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 +0 -13
  493. 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 +0 -13
  494. 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 +0 -25
  495. 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 +0 -34
  496. 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 +0 -70
  497. 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 +0 -26
  498. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +0 -109
  499. package/expansion-packs/README.md +0 -3
  500. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -13
  501. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -71
  502. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -78
  503. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -64
  504. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -201
  505. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -160
  506. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +0 -8
  507. package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -250
  508. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -647
  509. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -110
  510. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -216
  511. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -290
  512. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -613
  513. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -356
  514. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -343
  515. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -253
  516. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  517. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  518. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -175
  519. package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +0 -14
  520. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +0 -80
  521. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +0 -77
  522. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +0 -78
  523. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +0 -65
  524. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -391
  525. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +0 -203
  526. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +0 -201
  527. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -124
  528. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +0 -6
  529. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -769
  530. package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -586
  531. package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -110
  532. package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -141
  533. package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +0 -184
  534. package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -290
  535. package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +0 -200
  536. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +0 -1030
  537. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +0 -356
  538. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +0 -705
  539. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +0 -256
  540. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  541. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  542. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +0 -175
  543. package/expansion-packs/bmad-infrastructure-devops/README.md +0 -147
  544. package/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +0 -71
  545. package/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +0 -484
  546. package/expansion-packs/bmad-infrastructure-devops/config.yaml +0 -9
  547. package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -305
  548. package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -159
  549. package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -153
  550. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -424
  551. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -629
  552. package/release_notes.md +0 -32
  553. package/tools/bmad-npx-wrapper.js +0 -39
  554. package/tools/builders/web-builder.js +0 -675
  555. package/tools/bump-all-versions.js +0 -115
  556. package/tools/bump-expansion-version.js +0 -90
  557. package/tools/cli.js +0 -152
  558. package/tools/installer/README.md +0 -8
  559. package/tools/installer/bin/bmad.js +0 -585
  560. package/tools/installer/config/ide-agent-config.yaml +0 -58
  561. package/tools/installer/config/install.config.yaml +0 -123
  562. package/tools/installer/lib/config-loader.js +0 -257
  563. package/tools/installer/lib/file-manager.js +0 -389
  564. package/tools/installer/lib/ide-base-setup.js +0 -228
  565. package/tools/installer/lib/ide-setup.js +0 -1441
  566. package/tools/installer/lib/installer.js +0 -1995
  567. package/tools/installer/lib/memory-profiler.js +0 -225
  568. package/tools/installer/lib/module-manager.js +0 -114
  569. package/tools/installer/lib/resource-locator.js +0 -308
  570. package/tools/installer/package.json +0 -44
  571. package/tools/lib/dependency-resolver.js +0 -175
  572. package/tools/lib/yaml-utils.js +0 -29
  573. package/tools/md-assets/web-agent-startup-instructions.md +0 -39
  574. package/tools/preview-release-notes.js +0 -66
  575. package/tools/shared/bannerArt.js +0 -105
  576. package/tools/sync-installer-version.js +0 -32
  577. package/tools/update-expansion-version.js +0 -53
  578. package/tools/upgraders/v3-to-v4-upgrader.js +0 -672
  579. package/tools/version-bump.js +0 -94
@@ -0,0 +1,880 @@
1
+ const path = require('node:path');
2
+ const fs = require('fs-extra');
3
+ const chalk = require('chalk');
4
+ const { DependencyResolver } = require('../installers/lib/core/dependency-resolver');
5
+ const { XmlHandler } = require('../lib/xml-handler');
6
+ const { AgentPartyGenerator } = require('../lib/agent-party-generator');
7
+ const xml2js = require('xml2js');
8
+ const { getProjectRoot, getSourcePath, getModulePath } = require('../lib/project-root');
9
+
10
+ class WebBundler {
11
+ constructor(sourceDir = null, outputDir = 'web-bundles') {
12
+ this.sourceDir = sourceDir || getSourcePath();
13
+ this.outputDir = path.isAbsolute(outputDir) ? outputDir : path.join(getProjectRoot(), outputDir);
14
+ this.modulesPath = getSourcePath('modules');
15
+ this.utilityPath = getSourcePath('utility');
16
+
17
+ this.dependencyResolver = new DependencyResolver();
18
+ this.xmlHandler = new XmlHandler();
19
+
20
+ // Cache for resolved dependencies to avoid duplicates
21
+ this.dependencyCache = new Map();
22
+
23
+ // Discovered agents and teams for manifest generation
24
+ this.discoveredAgents = [];
25
+ this.discoveredTeams = [];
26
+
27
+ // Temporary directory for generated manifests
28
+ this.tempDir = path.join(process.cwd(), '.bundler-temp');
29
+ this.tempManifestDir = path.join(this.tempDir, 'bmad', '_cfg');
30
+
31
+ // Bundle statistics
32
+ this.stats = {
33
+ totalAgents: 0,
34
+ bundledAgents: 0,
35
+ skippedAgents: 0,
36
+ failedAgents: 0,
37
+ invalidXml: 0,
38
+ warnings: [],
39
+ };
40
+ }
41
+
42
+ /**
43
+ * Main entry point to bundle all modules
44
+ */
45
+ async bundleAll() {
46
+ console.log(chalk.cyan.bold('═══════════════════════════════════════════════'));
47
+ console.log(chalk.cyan.bold(' 🚀 Web Bundle Generation'));
48
+ console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
49
+
50
+ try {
51
+ // Pre-discover all modules to generate complete manifests
52
+ const modules = await this.discoverModules();
53
+ for (const module of modules) {
54
+ await this.preDiscoverModule(module);
55
+ }
56
+
57
+ // Create temporary manifest files
58
+ await this.createTempManifests();
59
+
60
+ // Process all modules
61
+ for (const module of modules) {
62
+ await this.bundleModule(module);
63
+ }
64
+
65
+ // Display summary
66
+ this.displaySummary();
67
+ } finally {
68
+ // Clean up temp files
69
+ await this.cleanupTempFiles();
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Bundle a specific module
75
+ */
76
+ async bundleModule(moduleName) {
77
+ const modulePath = path.join(this.modulesPath, moduleName);
78
+
79
+ if (!(await fs.pathExists(modulePath))) {
80
+ console.log(chalk.yellow(`Module ${moduleName} not found`));
81
+ return { module: moduleName, agents: [], teams: [] };
82
+ }
83
+
84
+ console.log(chalk.bold(`\n📦 Bundling module: ${moduleName}`));
85
+
86
+ const results = {
87
+ module: moduleName,
88
+ agents: [],
89
+ teams: [],
90
+ };
91
+
92
+ // Pre-discover all agents and teams for manifest generation
93
+ await this.preDiscoverModule(moduleName);
94
+
95
+ // Ensure temp manifests exist (might not exist if called directly)
96
+ if (!(await fs.pathExists(this.tempManifestDir))) {
97
+ await this.createTempManifests();
98
+ }
99
+
100
+ // Process agents
101
+ const agents = await this.discoverAgents(modulePath);
102
+ for (const agent of agents) {
103
+ try {
104
+ await this.bundleAgent(moduleName, agent, false); // false = don't track again
105
+ results.agents.push(agent);
106
+ } catch (error) {
107
+ console.error(` Failed to bundle agent ${agent}:`, error.message);
108
+ }
109
+ }
110
+
111
+ // Process teams (Phase 4 - to be implemented)
112
+ // const teams = await this.discoverTeams(modulePath);
113
+ // for (const team of teams) {
114
+ // try {
115
+ // await this.bundleTeam(moduleName, team);
116
+ // results.teams.push(team);
117
+ // } catch (error) {
118
+ // console.error(` Failed to bundle team ${team}:`, error.message);
119
+ // }
120
+ // }
121
+
122
+ return results;
123
+ }
124
+
125
+ /**
126
+ * Bundle a single agent
127
+ */
128
+ async bundleAgent(moduleName, agentFile, shouldTrack = true) {
129
+ const agentName = path.basename(agentFile, '.md');
130
+ this.stats.totalAgents++;
131
+
132
+ console.log(chalk.dim(` → Processing: ${agentName}`));
133
+
134
+ const agentPath = path.join(this.modulesPath, moduleName, 'agents', agentFile);
135
+
136
+ // Check if agent file exists
137
+ if (!(await fs.pathExists(agentPath))) {
138
+ this.stats.failedAgents++;
139
+ console.log(chalk.red(` ✗ Agent file not found`));
140
+ throw new Error(`Agent file not found: ${agentPath}`);
141
+ }
142
+
143
+ // Read agent file
144
+ const content = await fs.readFile(agentPath, 'utf8');
145
+
146
+ // Extract agent XML from markdown
147
+ let agentXml = this.extractAgentXml(content);
148
+
149
+ if (!agentXml) {
150
+ this.stats.failedAgents++;
151
+ console.log(chalk.red(` ✗ No agent XML found in ${agentFile}`));
152
+ return;
153
+ }
154
+
155
+ // Check if agent has bundle="false" attribute
156
+ if (this.shouldSkipBundling(agentXml)) {
157
+ this.stats.skippedAgents++;
158
+ console.log(chalk.gray(` ⊘ Skipped (bundle="false")`));
159
+ return;
160
+ }
161
+
162
+ // Process {project-root} references in agent XML
163
+ agentXml = this.processProjectRootReferences(agentXml);
164
+
165
+ // Track for manifest generation BEFORE generating manifests (if not pre-discovered)
166
+ if (shouldTrack) {
167
+ const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
168
+ if (agentDetails) {
169
+ this.discoveredAgents.push(agentDetails);
170
+ }
171
+ }
172
+
173
+ // Resolve dependencies with warning tracking
174
+ const dependencyWarnings = [];
175
+ const dependencies = await this.resolveAgentDependencies(agentXml, moduleName, dependencyWarnings);
176
+
177
+ if (dependencyWarnings.length > 0) {
178
+ this.stats.warnings.push({ agent: agentName, warnings: dependencyWarnings });
179
+ }
180
+
181
+ // Build the bundle (no manifests for individual agents)
182
+ const bundle = this.buildAgentBundle(agentXml, dependencies);
183
+
184
+ // Validate XML
185
+ const isValid = await this.validateXml(bundle);
186
+ if (!isValid) {
187
+ this.stats.invalidXml++;
188
+ console.log(chalk.red(` ⚠ Invalid XML generated!`));
189
+ }
190
+
191
+ // Write bundle to output
192
+ const outputPath = path.join(this.outputDir, moduleName, 'agents', `${agentName}.xml`);
193
+ await fs.ensureDir(path.dirname(outputPath));
194
+ await fs.writeFile(outputPath, bundle, 'utf8');
195
+
196
+ this.stats.bundledAgents++;
197
+ const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
198
+ console.log(` ${statusIcon} Bundled: ${agentName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
199
+ }
200
+
201
+ /**
202
+ * Pre-discover all agents and teams in a module for manifest generation
203
+ */
204
+ async preDiscoverModule(moduleName) {
205
+ const modulePath = path.join(this.modulesPath, moduleName);
206
+
207
+ // Clear any previously discovered agents for this module
208
+ this.discoveredAgents = this.discoveredAgents.filter((a) => a.module !== moduleName);
209
+
210
+ // Discover agents
211
+ const agentsPath = path.join(modulePath, 'agents');
212
+ if (await fs.pathExists(agentsPath)) {
213
+ const files = await fs.readdir(agentsPath);
214
+ for (const file of files) {
215
+ if (file.endsWith('.md')) {
216
+ const agentPath = path.join(agentsPath, file);
217
+ const content = await fs.readFile(agentPath, 'utf8');
218
+ const agentXml = this.extractAgentXml(content);
219
+
220
+ if (agentXml) {
221
+ // Skip agents with bundle="false"
222
+ if (this.shouldSkipBundling(agentXml)) {
223
+ continue;
224
+ }
225
+
226
+ const agentName = path.basename(file, '.md');
227
+ // Use the shared generator to extract agent details (pass full content)
228
+ const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
229
+ if (agentDetails) {
230
+ this.discoveredAgents.push(agentDetails);
231
+ }
232
+ }
233
+ }
234
+ }
235
+ }
236
+
237
+ // TODO: Discover teams when implemented
238
+ }
239
+
240
+ /**
241
+ * Extract agent XML from markdown content
242
+ */
243
+ extractAgentXml(content) {
244
+ // Try 4 backticks first (can contain 3 backtick blocks inside)
245
+ let match = content.match(/````xml\s*([\s\S]*?)````/);
246
+ if (!match) {
247
+ // Fall back to 3 backticks if no 4-backtick block found
248
+ match = content.match(/```xml\s*([\s\S]*?)```/);
249
+ }
250
+
251
+ if (match) {
252
+ const xmlContent = match[1];
253
+ const agentMatch = xmlContent.match(/<agent[^>]*>[\s\S]*?<\/agent>/);
254
+ return agentMatch ? agentMatch[0] : null;
255
+ }
256
+
257
+ // Fall back to direct extraction
258
+ match = content.match(/<agent[^>]*>[\s\S]*?<\/agent>/);
259
+ return match ? match[0] : null;
260
+ }
261
+
262
+ /**
263
+ * Resolve all dependencies for an agent
264
+ */
265
+ async resolveAgentDependencies(agentXml, moduleName, warnings = []) {
266
+ const dependencies = new Map();
267
+ const processed = new Set();
268
+
269
+ // Extract file references from agent XML
270
+ const fileRefs = this.extractFileReferences(agentXml);
271
+
272
+ // Process each file reference
273
+ for (const ref of fileRefs) {
274
+ await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
275
+ }
276
+
277
+ return dependencies;
278
+ }
279
+
280
+ /**
281
+ * Extract file references from agent XML
282
+ */
283
+ extractFileReferences(xml) {
284
+ const refs = new Set();
285
+
286
+ // Match various file reference patterns
287
+ const patterns = [
288
+ /exec="([^"]+)"/g, // Command exec paths
289
+ /tmpl="([^"]+)"/g, // Template paths
290
+ /data="([^"]+)"/g, // Data file paths
291
+ /file="([^"]+)"/g, // Generic file refs
292
+ /src="([^"]+)"/g, // Source paths
293
+ /system-prompts="([^"]+)"/g,
294
+ /tools="([^"]+)"/g,
295
+ /workflows="([^"]+)"/g,
296
+ /knowledge="([^"]+)"/g,
297
+ /{project-root}\/([^"'\s<>]+)/g,
298
+ ];
299
+
300
+ for (const pattern of patterns) {
301
+ let match;
302
+ while ((match = pattern.exec(xml)) !== null) {
303
+ let filePath = match[1];
304
+ // Remove {project-root} prefix if present
305
+ filePath = filePath.replace(/^{project-root}\//, '');
306
+ if (filePath) {
307
+ refs.add(filePath);
308
+ }
309
+ }
310
+ }
311
+
312
+ return [...refs];
313
+ }
314
+
315
+ /**
316
+ * Process a file dependency recursively
317
+ */
318
+ async processFileDependency(filePath, dependencies, processed, moduleName, warnings = []) {
319
+ // Skip if already processed
320
+ if (processed.has(filePath)) {
321
+ return;
322
+ }
323
+ processed.add(filePath);
324
+
325
+ // Handle wildcard patterns
326
+ if (filePath.includes('*')) {
327
+ await this.processWildcardDependency(filePath, dependencies, processed, moduleName, warnings);
328
+ return;
329
+ }
330
+
331
+ // Resolve actual file path
332
+ const actualPath = this.resolveFilePath(filePath, moduleName);
333
+
334
+ if (!actualPath || !(await fs.pathExists(actualPath))) {
335
+ warnings.push(filePath);
336
+ return;
337
+ }
338
+
339
+ // Read file content
340
+ let content = await fs.readFile(actualPath, 'utf8');
341
+
342
+ // Process {project-root} references
343
+ content = this.processProjectRootReferences(content);
344
+
345
+ // Extract dependencies from frontmatter if present
346
+ const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
347
+ if (frontmatterMatch) {
348
+ const frontmatter = frontmatterMatch[1];
349
+ // Look for dependencies in frontmatter
350
+ const depMatch = frontmatter.match(/dependencies:\s*\[(.*?)\]/);
351
+ if (depMatch) {
352
+ const deps = depMatch[1].match(/['"]([^'"]+)['"]/g);
353
+ if (deps) {
354
+ for (const dep of deps) {
355
+ const depPath = dep.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
356
+ if (depPath && !processed.has(depPath)) {
357
+ await this.processFileDependency(depPath, dependencies, processed, moduleName, warnings);
358
+ }
359
+ }
360
+ }
361
+ }
362
+ // Look for template references
363
+ const templateMatch = frontmatter.match(/template:\s*\[(.*?)\]/);
364
+ if (templateMatch) {
365
+ const templates = templateMatch[1].match(/['"]([^'"]+)['"]/g);
366
+ if (templates) {
367
+ for (const template of templates) {
368
+ const templatePath = template.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
369
+ if (templatePath && !processed.has(templatePath)) {
370
+ await this.processFileDependency(templatePath, dependencies, processed, moduleName, warnings);
371
+ }
372
+ }
373
+ }
374
+ }
375
+ }
376
+
377
+ // Extract XML from markdown if applicable
378
+ const ext = path.extname(actualPath).toLowerCase();
379
+ let processedContent = content;
380
+
381
+ switch (ext) {
382
+ case '.md': {
383
+ // Try to extract XML from markdown - handle both 3 and 4 backtick blocks
384
+ // First try 4 backticks (which can contain 3 backtick blocks inside)
385
+ let xmlMatches = [...content.matchAll(/````xml\s*([\s\S]*?)````/g)];
386
+
387
+ // If no 4-backtick blocks, try 3 backticks
388
+ if (xmlMatches.length === 0) {
389
+ xmlMatches = [...content.matchAll(/```xml\s*([\s\S]*?)```/g)];
390
+ }
391
+
392
+ const xmlBlocks = [];
393
+
394
+ for (const match of xmlMatches) {
395
+ if (match[1]) {
396
+ xmlBlocks.push(match[1].trim());
397
+ }
398
+ }
399
+
400
+ if (xmlBlocks.length > 0) {
401
+ // For XML content, just include it directly (it's already valid XML)
402
+ processedContent = xmlBlocks.join('\n\n');
403
+ } else {
404
+ // No XML blocks found, skip non-XML markdown files
405
+ return;
406
+ }
407
+
408
+ break;
409
+ }
410
+ case '.csv': {
411
+ // CSV files need special handling - convert to XML file-index
412
+ const lines = content.split('\n').filter((line) => line.trim());
413
+ if (lines.length === 0) return;
414
+
415
+ const headers = lines[0].split(',').map((h) => h.trim());
416
+ const rows = lines.slice(1);
417
+
418
+ const indexParts = [`<file-index id="${filePath}">`];
419
+ indexParts.push(' <items>');
420
+
421
+ // Track files referenced in CSV for additional bundling
422
+ const referencedFiles = new Set();
423
+
424
+ for (const row of rows) {
425
+ const values = row.split(',').map((v) => v.trim());
426
+ if (values.every((v) => !v)) continue;
427
+
428
+ indexParts.push(' <item>');
429
+ for (const [i, header] of headers.entries()) {
430
+ const value = values[i] || '';
431
+ const tagName = header.toLowerCase().replaceAll(/[^a-z0-9]/g, '_');
432
+ indexParts.push(` <${tagName}>${value}</${tagName}>`);
433
+
434
+ // Track referenced files
435
+ if (header.toLowerCase().includes('file') && value.endsWith('.md')) {
436
+ // Build path relative to CSV location
437
+ const csvDir = path.dirname(actualPath);
438
+ const refPath = path.join(csvDir, value);
439
+ if (fs.existsSync(refPath)) {
440
+ const refId = filePath.replace('index.csv', value);
441
+ referencedFiles.add(refId);
442
+ }
443
+ }
444
+ }
445
+ indexParts.push(' </item>');
446
+ }
447
+
448
+ indexParts.push(' </items>', '</file-index>');
449
+
450
+ // Store the XML version
451
+ dependencies.set(filePath, indexParts.join('\n'));
452
+
453
+ // Process referenced files from CSV
454
+ for (const refId of referencedFiles) {
455
+ if (!processed.has(refId)) {
456
+ await this.processFileDependency(refId, dependencies, processed, moduleName, warnings);
457
+ }
458
+ }
459
+
460
+ return;
461
+ }
462
+ case '.xml': {
463
+ // XML files can be included directly
464
+ processedContent = content;
465
+ break;
466
+ }
467
+ default: {
468
+ // For other non-XML file types, skip them
469
+ return;
470
+ }
471
+ }
472
+
473
+ // Store the processed content
474
+ dependencies.set(filePath, processedContent);
475
+
476
+ // Recursively scan for more dependencies
477
+ const nestedRefs = this.extractFileReferences(processedContent);
478
+ for (const ref of nestedRefs) {
479
+ await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
480
+ }
481
+ }
482
+
483
+ /**
484
+ * Process wildcard dependency patterns
485
+ */
486
+ async processWildcardDependency(pattern, dependencies, processed, moduleName, warnings = []) {
487
+ // Remove {project-root} prefix
488
+ pattern = pattern.replace(/^{project-root}\//, '');
489
+
490
+ // Get directory and file pattern
491
+ const lastSlash = pattern.lastIndexOf('/');
492
+ const dirPath = pattern.slice(0, Math.max(0, lastSlash));
493
+ const filePattern = pattern.slice(Math.max(0, lastSlash + 1));
494
+
495
+ // Resolve directory path without checking file existence
496
+ let dir;
497
+ if (dirPath.startsWith('bmad/')) {
498
+ // Remove bmad/ prefix
499
+ const actualPath = dirPath.replace(/^bmad\//, '');
500
+
501
+ // Try different path mappings for directories
502
+ const possibleDirs = [
503
+ // Try as module path: bmad/cis/... -> src/modules/cis/...
504
+ path.join(this.sourceDir, 'modules', actualPath),
505
+ // Try as direct path: bmad/core/... -> src/core/...
506
+ path.join(this.sourceDir, actualPath),
507
+ ];
508
+
509
+ for (const testDir of possibleDirs) {
510
+ if (fs.existsSync(testDir)) {
511
+ dir = testDir;
512
+ break;
513
+ }
514
+ }
515
+ }
516
+
517
+ if (!dir) {
518
+ warnings.push(`${pattern} (could not resolve directory)`);
519
+ return;
520
+ }
521
+ if (!(await fs.pathExists(dir))) {
522
+ warnings.push(pattern);
523
+ return;
524
+ }
525
+
526
+ // Read directory and match files
527
+ const files = await fs.readdir(dir);
528
+ let matchedFiles = [];
529
+
530
+ if (filePattern === '*.*') {
531
+ matchedFiles = files;
532
+ } else if (filePattern.startsWith('*.')) {
533
+ const ext = filePattern.slice(1);
534
+ matchedFiles = files.filter((f) => f.endsWith(ext));
535
+ } else {
536
+ // Simple glob matching
537
+ const regex = new RegExp('^' + filePattern.replace('*', '.*') + '$');
538
+ matchedFiles = files.filter((f) => regex.test(f));
539
+ }
540
+
541
+ // Process each matched file
542
+ for (const file of matchedFiles) {
543
+ const fullPath = dirPath + '/' + file;
544
+ if (!processed.has(fullPath)) {
545
+ await this.processFileDependency(fullPath, dependencies, processed, moduleName, warnings);
546
+ }
547
+ }
548
+ }
549
+
550
+ /**
551
+ * Resolve file path relative to project
552
+ */
553
+ resolveFilePath(filePath, moduleName) {
554
+ // Remove {project-root} prefix
555
+ filePath = filePath.replace(/^{project-root}\//, '');
556
+
557
+ // Check temp directory first for _cfg files
558
+ if (filePath.startsWith('bmad/_cfg/')) {
559
+ const filename = filePath.split('/').pop();
560
+ const tempPath = path.join(this.tempManifestDir, filename);
561
+ if (fs.existsSync(tempPath)) {
562
+ return tempPath;
563
+ }
564
+ }
565
+
566
+ // Handle different path patterns for bmad files
567
+ // bmad/cis/tasks/brain-session.md -> src/modules/cis/tasks/brain-session.md
568
+ // bmad/core/tasks/create-doc.md -> src/core/tasks/create-doc.md
569
+ // bmad/bmm/templates/brief.md -> src/modules/bmm/templates/brief.md
570
+
571
+ let actualPath = filePath;
572
+
573
+ if (filePath.startsWith('bmad/')) {
574
+ // Remove bmad/ prefix
575
+ actualPath = filePath.replace(/^bmad\//, '');
576
+
577
+ // Check if it's a module-specific file (cis, bmm, etc) or core file
578
+ const parts = actualPath.split('/');
579
+ const firstPart = parts[0];
580
+
581
+ // Try different path mappings
582
+ const possiblePaths = [
583
+ // Try in temp directory first
584
+ path.join(this.tempDir, filePath),
585
+ // Try as module path: bmad/cis/... -> src/modules/cis/...
586
+ path.join(this.sourceDir, 'modules', actualPath),
587
+ // Try as direct path: bmad/core/... -> src/core/...
588
+ path.join(this.sourceDir, actualPath),
589
+ // Try without any prefix in src
590
+ path.join(this.sourceDir, parts.slice(1).join('/')),
591
+ // Try in project root
592
+ path.join(this.sourceDir, '..', actualPath),
593
+ // Try original with bmad
594
+ path.join(this.sourceDir, '..', filePath),
595
+ ];
596
+
597
+ for (const testPath of possiblePaths) {
598
+ if (fs.existsSync(testPath)) {
599
+ return testPath;
600
+ }
601
+ }
602
+ }
603
+
604
+ // Try standard paths for non-bmad files
605
+ const basePaths = [
606
+ this.sourceDir, // src directory
607
+ path.join(this.modulesPath, moduleName), // Current module
608
+ path.join(this.sourceDir, '..'), // Project root
609
+ ];
610
+
611
+ for (const basePath of basePaths) {
612
+ const fullPath = path.join(basePath, actualPath);
613
+ if (fs.existsSync(fullPath)) {
614
+ return fullPath;
615
+ }
616
+ }
617
+
618
+ return null;
619
+ }
620
+
621
+ /**
622
+ * Process and remove {project-root} references
623
+ */
624
+ processProjectRootReferences(content) {
625
+ // Remove {project-root}/ prefix (with slash)
626
+ content = content.replaceAll('{project-root}/', '');
627
+ // Also remove {project-root} without slash
628
+ content = content.replaceAll('{project-root}', '');
629
+ return content;
630
+ }
631
+
632
+ /**
633
+ * Escape special XML characters in text content
634
+ */
635
+ escapeXmlText(text) {
636
+ return text
637
+ .replaceAll('&', '&amp;')
638
+ .replaceAll('<', '&lt;')
639
+ .replaceAll('>', '&gt;')
640
+ .replaceAll('"', '&quot;')
641
+ .replaceAll("'", '&apos;');
642
+ }
643
+
644
+ /**
645
+ * Escape XML content while preserving XML tags
646
+ */
647
+ escapeXmlContent(content) {
648
+ const tagPattern = /<([^>]+)>/g;
649
+ const parts = [];
650
+ let lastIndex = 0;
651
+ let match;
652
+
653
+ while ((match = tagPattern.exec(content)) !== null) {
654
+ if (match.index > lastIndex) {
655
+ parts.push(this.escapeXmlText(content.slice(lastIndex, match.index)));
656
+ }
657
+ parts.push('<' + match[1] + '>');
658
+ lastIndex = match.index + match[0].length;
659
+ }
660
+
661
+ if (lastIndex < content.length) {
662
+ parts.push(this.escapeXmlText(content.slice(lastIndex)));
663
+ }
664
+
665
+ return parts.join('');
666
+ }
667
+
668
+ /**
669
+ * Build the final agent bundle XML
670
+ */
671
+ buildAgentBundle(agentXml, dependencies) {
672
+ const parts = [
673
+ '<?xml version="1.0" encoding="UTF-8"?>',
674
+ '<agent-bundle>',
675
+ ' <!-- Agent Definition -->',
676
+ ' ' + agentXml.replaceAll('\n', '\n '),
677
+ ];
678
+
679
+ // Add dependencies without wrapper tags
680
+ if (dependencies && dependencies.size > 0) {
681
+ parts.push('\n <!-- Dependencies -->');
682
+ for (const [id, content] of dependencies) {
683
+ // Escape XML content while preserving tags
684
+ const escapedContent = this.escapeXmlContent(content);
685
+ // Indent properly
686
+ const indentedContent = escapedContent
687
+ .split('\n')
688
+ .map((line) => ' ' + line)
689
+ .join('\n');
690
+ parts.push(indentedContent);
691
+ }
692
+ }
693
+
694
+ parts.push('</agent-bundle>');
695
+
696
+ return parts.join('\n');
697
+ }
698
+
699
+ /**
700
+ * Discover all modules
701
+ */
702
+ async discoverModules() {
703
+ const modules = [];
704
+
705
+ if (!(await fs.pathExists(this.modulesPath))) {
706
+ console.log(chalk.yellow('No modules directory found'));
707
+ return modules;
708
+ }
709
+
710
+ const entries = await fs.readdir(this.modulesPath, { withFileTypes: true });
711
+
712
+ for (const entry of entries) {
713
+ if (entry.isDirectory()) {
714
+ modules.push(entry.name);
715
+ }
716
+ }
717
+
718
+ return modules;
719
+ }
720
+
721
+ /**
722
+ * Discover agents in a module
723
+ */
724
+ async discoverAgents(modulePath) {
725
+ const agents = [];
726
+ const agentsPath = path.join(modulePath, 'agents');
727
+
728
+ if (!(await fs.pathExists(agentsPath))) {
729
+ return agents;
730
+ }
731
+
732
+ const files = await fs.readdir(agentsPath);
733
+
734
+ for (const file of files) {
735
+ if (file.endsWith('.md')) {
736
+ agents.push(file);
737
+ }
738
+ }
739
+
740
+ return agents;
741
+ }
742
+
743
+ /**
744
+ * Discover all teams in a module
745
+ */
746
+ async discoverTeams(modulePath) {
747
+ const teams = [];
748
+ const teamsPath = path.join(modulePath, 'teams');
749
+
750
+ if (!(await fs.pathExists(teamsPath))) {
751
+ return teams;
752
+ }
753
+
754
+ const files = await fs.readdir(teamsPath);
755
+
756
+ for (const file of files) {
757
+ if (file.endsWith('.md')) {
758
+ teams.push(file);
759
+ }
760
+ }
761
+
762
+ return teams;
763
+ }
764
+
765
+ /**
766
+ * Extract agent name from XML
767
+ */
768
+ getAgentName(xml) {
769
+ const match = xml.match(/<agent[^>]*name="([^"]+)"/);
770
+ return match ? match[1] : 'Unknown';
771
+ }
772
+
773
+ /**
774
+ * Extract agent description from XML
775
+ */
776
+ getAgentDescription(xml) {
777
+ const match = xml.match(/<description>([^<]+)<\/description>/);
778
+ return match ? match[1] : '';
779
+ }
780
+
781
+ /**
782
+ * Check if agent should be skipped for bundling
783
+ */
784
+ shouldSkipBundling(xml) {
785
+ // Check for bundle="false" attribute in the agent tag
786
+ const match = xml.match(/<agent[^>]*bundle="false"[^>]*>/);
787
+ return match !== null;
788
+ }
789
+
790
+ /**
791
+ * Create temporary manifest files
792
+ */
793
+ async createTempManifests() {
794
+ // Ensure temp directory exists
795
+ await fs.ensureDir(this.tempManifestDir);
796
+
797
+ // Generate agent-party.xml using shared generator
798
+ const agentPartyPath = path.join(this.tempManifestDir, 'agent-party.xml');
799
+ await AgentPartyGenerator.writeAgentParty(agentPartyPath, this.discoveredAgents, { forWeb: true });
800
+
801
+ console.log(chalk.dim(' ✓ Created temporary manifest files'));
802
+ }
803
+
804
+ /**
805
+ * Clean up temporary files
806
+ */
807
+ async cleanupTempFiles() {
808
+ if (await fs.pathExists(this.tempDir)) {
809
+ await fs.remove(this.tempDir);
810
+ console.log(chalk.dim('\n✓ Cleaned up temporary files'));
811
+ }
812
+ }
813
+
814
+ /**
815
+ * Validate XML content
816
+ */
817
+ async validateXml(xmlContent) {
818
+ try {
819
+ await xml2js.parseStringPromise(xmlContent, {
820
+ strict: true,
821
+ explicitArray: false,
822
+ });
823
+ return true;
824
+ } catch {
825
+ return false;
826
+ }
827
+ }
828
+
829
+ /**
830
+ * Display summary statistics
831
+ */
832
+ displaySummary() {
833
+ console.log(chalk.cyan.bold('\n═══════════════════════════════════════════════'));
834
+ console.log(chalk.cyan.bold(' SUMMARY'));
835
+ console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
836
+
837
+ console.log(chalk.bold('Bundle Statistics:'));
838
+ console.log(` Total agents found: ${this.stats.totalAgents}`);
839
+ console.log(` Successfully bundled: ${chalk.green(this.stats.bundledAgents)}`);
840
+ console.log(` Skipped (bundle=false): ${chalk.gray(this.stats.skippedAgents)}`);
841
+
842
+ if (this.stats.failedAgents > 0) {
843
+ console.log(` Failed to bundle: ${chalk.red(this.stats.failedAgents)}`);
844
+ }
845
+
846
+ if (this.stats.invalidXml > 0) {
847
+ console.log(` Invalid XML bundles: ${chalk.yellow(this.stats.invalidXml)}`);
848
+ }
849
+
850
+ // Display warnings summary
851
+ if (this.stats.warnings.length > 0) {
852
+ console.log(chalk.yellow('\n⚠ Missing Dependencies by Agent:'));
853
+
854
+ // Group and display warnings by agent
855
+ for (const agentWarning of this.stats.warnings) {
856
+ if (agentWarning.warnings.length > 0) {
857
+ console.log(chalk.bold(`\n ${agentWarning.agent}:`));
858
+ // Display unique warnings for this agent
859
+ const uniqueWarnings = [...new Set(agentWarning.warnings)];
860
+ for (const warning of uniqueWarnings) {
861
+ console.log(chalk.dim(` • ${warning}`));
862
+ }
863
+ }
864
+ }
865
+ }
866
+
867
+ // Final status
868
+ if (this.stats.invalidXml > 0) {
869
+ console.log(chalk.yellow('\n⚠ Some bundles have invalid XML. Please review the output.'));
870
+ } else if (this.stats.failedAgents > 0) {
871
+ console.log(chalk.yellow('\n⚠ Some agents failed to bundle. Please review the errors.'));
872
+ } else {
873
+ console.log(chalk.green('\n✨ All bundles generated successfully!'));
874
+ }
875
+
876
+ console.log(chalk.cyan.bold('\n═══════════════════════════════════════════════\n'));
877
+ }
878
+ }
879
+
880
+ module.exports = { WebBundler };