bmad-method 5.1.3 → 6.0.0-alpha.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 (948) hide show
  1. package/.claude/commands/bmad/bmb/agents/bmad-builder.md +70 -0
  2. package/.claude/commands/bmad/bmb/workflows/README.md +67 -0
  3. package/.claude/commands/bmad/bmb/workflows/audit-workflow.md +15 -0
  4. package/.claude/commands/bmad/bmb/workflows/convert-legacy.md +15 -0
  5. package/.claude/commands/bmad/bmb/workflows/create-agent.md +15 -0
  6. package/.claude/commands/bmad/bmb/workflows/create-module.md +15 -0
  7. package/.claude/commands/bmad/bmb/workflows/create-workflow.md +15 -0
  8. package/.claude/commands/bmad/bmb/workflows/edit-agent.md +15 -0
  9. package/.claude/commands/bmad/bmb/workflows/edit-module.md +15 -0
  10. package/.claude/commands/bmad/bmb/workflows/edit-workflow.md +15 -0
  11. package/.claude/commands/bmad/bmb/workflows/module-brief.md +15 -0
  12. package/.claude/commands/bmad/bmb/workflows/redoc.md +15 -0
  13. package/.claude/commands/bmad/bmd/agents/cli-chief.md +108 -0
  14. package/.claude/commands/bmad/bmd/agents/doc-keeper.md +115 -0
  15. package/.claude/commands/bmad/bmd/agents/release-chief.md +109 -0
  16. package/.claude/commands/bmad/core/agents/bmad-master.md +71 -0
  17. package/.claude/commands/bmad/core/tasks/index-docs.md +9 -0
  18. package/.claude/commands/bmad/core/tools/shard-doc.md +9 -0
  19. package/.claude/commands/bmad/core/workflows/README.md +27 -0
  20. package/.claude/commands/bmad/core/workflows/brainstorming.md +15 -0
  21. package/.claude/commands/bmad/core/workflows/party-mode.md +15 -0
  22. package/.claude/hooks/bmad-tts-injector.sh +415 -0
  23. package/.claude/hooks/bmad-voice-manager.sh +511 -0
  24. package/.claude/hooks/check-output-style.sh +112 -0
  25. package/.claude/hooks/download-extra-voices.sh +244 -0
  26. package/.claude/hooks/github-star-reminder.sh +154 -0
  27. package/.claude/hooks/language-manager.sh +392 -0
  28. package/.claude/hooks/learn-manager.sh +475 -0
  29. package/.claude/hooks/personality-manager.sh +438 -0
  30. package/.claude/hooks/piper-download-voices.sh +165 -0
  31. package/.claude/hooks/piper-installer.sh +178 -0
  32. package/.claude/hooks/piper-multispeaker-registry.sh +165 -0
  33. package/.claude/hooks/piper-voice-manager.sh +293 -0
  34. package/.claude/hooks/play-tts-elevenlabs.sh +404 -0
  35. package/.claude/hooks/play-tts-piper.sh +338 -0
  36. package/.claude/hooks/play-tts.sh +100 -0
  37. package/.claude/hooks/provider-commands.sh +540 -0
  38. package/.claude/hooks/provider-manager.sh +298 -0
  39. package/.claude/hooks/replay-target-audio.sh +95 -0
  40. package/.claude/hooks/sentiment-manager.sh +201 -0
  41. package/.claude/hooks/speed-manager.sh +291 -0
  42. package/.claude/hooks/voice-manager.sh +594 -0
  43. package/.claude/hooks/voices-config.sh +70 -0
  44. package/.claude/settings.local.json +41 -0
  45. package/.github/FUNDING.yaml +2 -2
  46. package/.github/ISSUE_TEMPLATE/config.yaml +5 -0
  47. package/.github/ISSUE_TEMPLATE/idea_submission.md +109 -0
  48. package/.github/workflows/discord.yaml +1 -10
  49. package/.github/workflows/{format-check.yaml → lint.yaml} +22 -3
  50. package/.github/workflows/manual-release.yaml +2 -2
  51. package/.nvmrc +1 -0
  52. package/.prettierignore +2 -0
  53. package/.vscode/settings.json +34 -9
  54. package/CHANGELOG.md +214 -574
  55. package/CONTRIBUTING.md +131 -60
  56. package/LICENSE +6 -1
  57. package/README.md +188 -148
  58. package/bmad/_cfg/agent-manifest.csv +7 -0
  59. package/bmad/_cfg/agents/bmb-bmad-builder.customize.yaml +42 -0
  60. package/bmad/_cfg/agents/bmd-cli-chief.customize.yaml +32 -0
  61. package/bmad/_cfg/agents/bmd-doc-keeper.customize.yaml +42 -0
  62. package/bmad/_cfg/agents/bmd-release-chief.customize.yaml +42 -0
  63. package/bmad/_cfg/agents/core-bmad-master.customize.yaml +42 -0
  64. package/bmad/_cfg/files-manifest.csv +83 -0
  65. package/bmad/_cfg/manifest.yaml +12 -0
  66. package/bmad/_cfg/task-manifest.csv +5 -0
  67. package/bmad/_cfg/tool-manifest.csv +2 -0
  68. package/bmad/_cfg/workflow-manifest.csv +15 -0
  69. package/bmad/bmb/README.md +132 -0
  70. package/bmad/bmb/agents/bmad-builder.md +70 -0
  71. package/bmad/bmb/config.yaml +14 -0
  72. package/bmad/bmb/workflows/audit-workflow/checklist.md +143 -0
  73. package/bmad/bmb/workflows/audit-workflow/instructions.md +341 -0
  74. package/bmad/bmb/workflows/audit-workflow/template.md +118 -0
  75. package/bmad/bmb/workflows/audit-workflow/workflow.yaml +23 -0
  76. package/bmad/bmb/workflows/audit-workflow/workflow.yaml.bak +21 -0
  77. package/bmad/bmb/workflows/convert-legacy/README.md +262 -0
  78. package/bmad/bmb/workflows/convert-legacy/checklist.md +205 -0
  79. package/bmad/bmb/workflows/convert-legacy/instructions.md +377 -0
  80. package/bmad/bmb/workflows/convert-legacy/workflow.yaml +32 -0
  81. package/bmad/bmb/workflows/create-agent/README.md +320 -0
  82. package/bmad/bmb/workflows/create-agent/agent-architecture.md +419 -0
  83. package/bmad/bmb/workflows/create-agent/agent-architecture.md.bak +412 -0
  84. package/bmad/bmb/workflows/create-agent/agent-command-patterns.md +759 -0
  85. package/bmad/bmb/workflows/create-agent/agent-command-patterns.md.bak +759 -0
  86. package/bmad/bmb/workflows/create-agent/agent-types.md +292 -0
  87. package/bmad/bmb/workflows/create-agent/brainstorm-context.md +174 -0
  88. package/bmad/bmb/workflows/create-agent/checklist.md +62 -0
  89. package/bmad/bmb/workflows/create-agent/communication-styles.md +202 -0
  90. package/bmad/bmb/workflows/create-agent/instructions.md +430 -0
  91. package/bmad/bmb/workflows/create-agent/workflow.yaml +37 -0
  92. package/bmad/bmb/workflows/create-module/README.md +220 -0
  93. package/bmad/bmb/workflows/create-module/README.md.bak +218 -0
  94. package/bmad/bmb/workflows/create-module/brainstorm-context.md +137 -0
  95. package/bmad/bmb/workflows/create-module/checklist.md +244 -0
  96. package/bmad/bmb/workflows/create-module/checklist.md.bak +245 -0
  97. package/bmad/bmb/workflows/create-module/installer-templates/install-config.yaml +92 -0
  98. package/bmad/bmb/workflows/create-module/installer-templates/installer.js +231 -0
  99. package/bmad/bmb/workflows/create-module/installer-templates/installer.js.bak +231 -0
  100. package/bmad/bmb/workflows/create-module/instructions.md +581 -0
  101. package/bmad/bmb/workflows/create-module/instructions.md.bak +521 -0
  102. package/bmad/bmb/workflows/create-module/module-structure.md +366 -0
  103. package/bmad/bmb/workflows/create-module/module-structure.md.bak +310 -0
  104. package/bmad/bmb/workflows/create-module/workflow.yaml +42 -0
  105. package/bmad/bmb/workflows/create-module/workflow.yaml.bak +40 -0
  106. package/bmad/bmb/workflows/create-workflow/README.md +277 -0
  107. package/bmad/bmb/workflows/create-workflow/brainstorm-context.md +197 -0
  108. package/bmad/bmb/workflows/create-workflow/checklist.md +94 -0
  109. package/bmad/bmb/workflows/create-workflow/instructions.md +716 -0
  110. package/bmad/bmb/workflows/create-workflow/workflow-creation-guide.md +1150 -0
  111. package/bmad/bmb/workflows/create-workflow/workflow-template/checklist.md +24 -0
  112. package/bmad/bmb/workflows/create-workflow/workflow-template/instructions.md +13 -0
  113. package/bmad/bmb/workflows/create-workflow/workflow-template/template.md +9 -0
  114. package/bmad/bmb/workflows/create-workflow/workflow-template/workflow.yaml +39 -0
  115. package/bmad/bmb/workflows/create-workflow/workflow-template/workflow.yaml.bak +39 -0
  116. package/bmad/bmb/workflows/create-workflow/workflow.yaml +40 -0
  117. package/bmad/bmb/workflows/create-workflow/workflow.yaml.bak +38 -0
  118. package/bmad/bmb/workflows/edit-agent/README.md +112 -0
  119. package/bmad/bmb/workflows/edit-agent/checklist.md +112 -0
  120. package/bmad/bmb/workflows/edit-agent/instructions.md +290 -0
  121. package/bmad/bmb/workflows/edit-agent/workflow.yaml +33 -0
  122. package/bmad/bmb/workflows/edit-module/README.md +187 -0
  123. package/bmad/bmb/workflows/edit-module/checklist.md +165 -0
  124. package/bmad/bmb/workflows/edit-module/instructions.md +339 -0
  125. package/bmad/bmb/workflows/edit-module/workflow.yaml +34 -0
  126. package/bmad/bmb/workflows/edit-workflow/README.md +119 -0
  127. package/bmad/bmb/workflows/edit-workflow/checklist.md +70 -0
  128. package/bmad/bmb/workflows/edit-workflow/instructions.md +342 -0
  129. package/bmad/bmb/workflows/edit-workflow/workflow.yaml +27 -0
  130. package/bmad/bmb/workflows/edit-workflow/workflow.yaml.bak +25 -0
  131. package/bmad/bmb/workflows/module-brief/README.md +264 -0
  132. package/bmad/bmb/workflows/module-brief/checklist.md +116 -0
  133. package/bmad/bmb/workflows/module-brief/instructions.md +267 -0
  134. package/bmad/bmb/workflows/module-brief/template.md +275 -0
  135. package/bmad/bmb/workflows/module-brief/workflow.yaml +29 -0
  136. package/bmad/bmb/workflows/module-brief/workflow.yaml.bak +27 -0
  137. package/bmad/bmb/workflows/redoc/README.md +87 -0
  138. package/bmad/bmb/workflows/redoc/checklist.md +99 -0
  139. package/bmad/bmb/workflows/redoc/instructions.md +265 -0
  140. package/bmad/bmb/workflows/redoc/workflow.yaml +32 -0
  141. package/bmad/bmb/workflows/redoc/workflow.yaml.bak +31 -0
  142. package/bmad/bmd/README.md +193 -0
  143. package/bmad/bmd/README.md.bak +193 -0
  144. package/bmad/bmd/agents/cli-chief-sidecar/instructions.md +102 -0
  145. package/bmad/bmd/agents/cli-chief-sidecar/instructions.md.bak +102 -0
  146. package/bmad/bmd/agents/cli-chief-sidecar/knowledge/README.md +68 -0
  147. package/bmad/bmd/agents/cli-chief-sidecar/knowledge/README.md.bak +68 -0
  148. package/bmad/bmd/agents/cli-chief-sidecar/knowledge/cli-reference.md +123 -0
  149. package/bmad/bmd/agents/cli-chief-sidecar/knowledge/cli-reference.md.bak +123 -0
  150. package/bmad/bmd/agents/cli-chief-sidecar/memories.md +53 -0
  151. package/bmad/bmd/agents/cli-chief-sidecar/memories.md.bak +53 -0
  152. package/bmad/bmd/agents/cli-chief.md +108 -0
  153. package/bmad/bmd/agents/cli-chief.md.bak +108 -0
  154. package/bmad/bmd/agents/doc-keeper-sidecar/instructions.md +177 -0
  155. package/bmad/bmd/agents/doc-keeper-sidecar/instructions.md.bak +177 -0
  156. package/bmad/bmd/agents/doc-keeper-sidecar/knowledge/README.md +81 -0
  157. package/bmad/bmd/agents/doc-keeper-sidecar/knowledge/README.md.bak +81 -0
  158. package/bmad/bmd/agents/doc-keeper-sidecar/memories.md +88 -0
  159. package/bmad/bmd/agents/doc-keeper-sidecar/memories.md.bak +88 -0
  160. package/bmad/bmd/agents/doc-keeper.md +115 -0
  161. package/bmad/bmd/agents/doc-keeper.md.bak +115 -0
  162. package/bmad/bmd/agents/release-chief-sidecar/instructions.md +164 -0
  163. package/bmad/bmd/agents/release-chief-sidecar/instructions.md.bak +164 -0
  164. package/bmad/bmd/agents/release-chief-sidecar/knowledge/README.md +82 -0
  165. package/bmad/bmd/agents/release-chief-sidecar/knowledge/README.md.bak +82 -0
  166. package/bmad/bmd/agents/release-chief-sidecar/memories.md +73 -0
  167. package/bmad/bmd/agents/release-chief-sidecar/memories.md.bak +73 -0
  168. package/bmad/bmd/agents/release-chief.md +109 -0
  169. package/bmad/bmd/agents/release-chief.md.bak +109 -0
  170. package/bmad/bmd/config.yaml +10 -0
  171. package/bmad/core/agents/bmad-master.md +71 -0
  172. package/bmad/core/agents/bmad-web-orchestrator.agent.xml +122 -0
  173. package/bmad/core/config.yaml +9 -0
  174. package/bmad/core/tasks/adv-elicit-methods.csv +39 -0
  175. package/bmad/core/tasks/adv-elicit.xml +104 -0
  176. package/bmad/core/tasks/index-docs.xml +65 -0
  177. package/bmad/core/tasks/validate-workflow.xml +89 -0
  178. package/bmad/core/tasks/workflow.xml +174 -0
  179. package/bmad/core/tools/shard-doc.xml +100 -0
  180. package/bmad/core/workflows/brainstorming/README.md +271 -0
  181. package/bmad/core/workflows/brainstorming/brain-methods.csv +36 -0
  182. package/bmad/core/workflows/brainstorming/instructions.md +314 -0
  183. package/bmad/core/workflows/brainstorming/template.md +102 -0
  184. package/bmad/core/workflows/brainstorming/workflow.yaml +43 -0
  185. package/bmad/core/workflows/party-mode/instructions.md +188 -0
  186. package/bmad/core/workflows/party-mode/workflow.yaml +23 -0
  187. package/bmad/docs/claude-code-instructions.md +25 -0
  188. package/bmad/docs/codex-instructions.md +21 -0
  189. package/bmd/README.md +193 -0
  190. package/bmd/agents/cli-chief-sidecar/instructions.md +102 -0
  191. package/bmd/agents/cli-chief-sidecar/knowledge/README.md +68 -0
  192. package/bmd/agents/cli-chief-sidecar/knowledge/cli-reference.md +123 -0
  193. package/bmd/agents/cli-chief-sidecar/memories.md +53 -0
  194. package/bmd/agents/cli-chief.agent.yaml +126 -0
  195. package/bmd/agents/doc-keeper-sidecar/instructions.md +177 -0
  196. package/bmd/agents/doc-keeper-sidecar/knowledge/README.md +81 -0
  197. package/bmd/agents/doc-keeper-sidecar/memories.md +88 -0
  198. package/bmd/agents/doc-keeper.agent.yaml +137 -0
  199. package/bmd/agents/release-chief-sidecar/instructions.md +164 -0
  200. package/bmd/agents/release-chief-sidecar/knowledge/README.md +82 -0
  201. package/bmd/agents/release-chief-sidecar/memories.md +73 -0
  202. package/bmd/agents/release-chief.agent.yaml +127 -0
  203. package/bmd/bmad-custom-module-installer-plan.md +1176 -0
  204. package/bmd/config.yaml +12 -0
  205. package/docs/bmad-brownfield-guide.md +1260 -0
  206. package/docs/conversion-report-shard-doc-2025-10-26.md +188 -0
  207. package/docs/ide-info/auggie.md +31 -0
  208. package/docs/ide-info/claude-code.md +25 -0
  209. package/docs/ide-info/cline.md +31 -0
  210. package/docs/ide-info/codex.md +21 -0
  211. package/docs/ide-info/crush.md +30 -0
  212. package/docs/ide-info/cursor.md +25 -0
  213. package/docs/ide-info/gemini.md +25 -0
  214. package/docs/ide-info/github-copilot.md +26 -0
  215. package/docs/ide-info/iflow.md +33 -0
  216. package/docs/ide-info/kilo.md +24 -0
  217. package/docs/ide-info/opencode.md +24 -0
  218. package/docs/ide-info/qwen.md +25 -0
  219. package/docs/ide-info/roo.md +27 -0
  220. package/docs/ide-info/trae.md +25 -0
  221. package/docs/ide-info/windsurf.md +22 -0
  222. package/docs/installers-bundlers/ide-injections.md +186 -0
  223. package/docs/installers-bundlers/installers-modules-platforms-reference.md +327 -0
  224. package/docs/installers-bundlers/web-bundler-usage.md +54 -0
  225. package/docs/v4-to-v6-upgrade.md +225 -0
  226. package/eslint.config.mjs +21 -9
  227. package/package.json +32 -36
  228. package/prettier.config.mjs +1 -1
  229. package/src/core/_module-installer/install-config.yaml +28 -0
  230. package/src/core/_module-installer/installer.js +68 -0
  231. package/src/core/agents/bmad-master.agent.yaml +39 -0
  232. package/src/core/agents/bmad-web-orchestrator.agent.xml +122 -0
  233. package/src/core/tasks/adv-elicit-methods.csv +39 -0
  234. package/src/core/tasks/adv-elicit.xml +104 -0
  235. package/src/core/tasks/index-docs.xml +65 -0
  236. package/src/core/tasks/validate-workflow.xml +89 -0
  237. package/src/core/tasks/workflow.xml +166 -0
  238. package/src/core/tools/shard-doc.xml +100 -0
  239. package/src/core/workflows/brainstorming/README.md +271 -0
  240. package/src/core/workflows/brainstorming/brain-methods.csv +36 -0
  241. package/src/core/workflows/brainstorming/instructions.md +314 -0
  242. package/src/core/workflows/brainstorming/template.md +102 -0
  243. package/src/core/workflows/brainstorming/workflow.yaml +43 -0
  244. package/src/core/workflows/party-mode/instructions.md +188 -0
  245. package/src/core/workflows/party-mode/workflow.yaml +23 -0
  246. package/src/modules/bmb/README.md +132 -0
  247. package/src/modules/bmb/_module-installer/install-config.yaml +26 -0
  248. package/src/modules/bmb/agents/bmad-builder.agent.yaml +58 -0
  249. package/src/modules/bmb/workflows/audit-workflow/checklist.md +143 -0
  250. package/src/modules/bmb/workflows/audit-workflow/instructions.md +341 -0
  251. package/src/modules/bmb/workflows/audit-workflow/template.md +118 -0
  252. package/src/modules/bmb/workflows/audit-workflow/workflow.yaml +25 -0
  253. package/src/modules/bmb/workflows/convert-legacy/README.md +262 -0
  254. package/src/modules/bmb/workflows/convert-legacy/checklist.md +205 -0
  255. package/src/modules/bmb/workflows/convert-legacy/instructions.md +377 -0
  256. package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +34 -0
  257. package/src/modules/bmb/workflows/create-agent/README.md +320 -0
  258. package/src/modules/bmb/workflows/create-agent/agent-architecture.md +419 -0
  259. package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +759 -0
  260. package/src/modules/bmb/workflows/create-agent/agent-types.md +292 -0
  261. package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +174 -0
  262. package/src/modules/bmb/workflows/create-agent/checklist.md +62 -0
  263. package/src/modules/bmb/workflows/create-agent/communication-styles.md +202 -0
  264. package/src/modules/bmb/workflows/create-agent/instructions.md +430 -0
  265. package/src/modules/bmb/workflows/create-agent/workflow.yaml +49 -0
  266. package/src/modules/bmb/workflows/create-module/README.md +220 -0
  267. package/src/modules/bmb/workflows/create-module/brainstorm-context.md +137 -0
  268. package/src/modules/bmb/workflows/create-module/checklist.md +244 -0
  269. package/src/modules/bmb/workflows/create-module/installer-templates/install-config.yaml +92 -0
  270. package/src/modules/bmb/workflows/create-module/installer-templates/installer.js +231 -0
  271. package/src/modules/bmb/workflows/create-module/instructions.md +581 -0
  272. package/src/modules/bmb/workflows/create-module/module-structure.md +366 -0
  273. package/src/modules/bmb/workflows/create-module/workflow.yaml +44 -0
  274. package/src/modules/bmb/workflows/create-workflow/README.md +277 -0
  275. package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +197 -0
  276. package/src/modules/bmb/workflows/create-workflow/checklist.md +94 -0
  277. package/src/modules/bmb/workflows/create-workflow/instructions.md +716 -0
  278. package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +1150 -0
  279. package/src/modules/bmb/workflows/create-workflow/workflow-template/checklist.md +24 -0
  280. package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +13 -0
  281. package/src/modules/bmb/workflows/create-workflow/workflow-template/template.md +9 -0
  282. package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +65 -0
  283. package/src/modules/bmb/workflows/create-workflow/workflow.yaml +42 -0
  284. package/src/modules/bmb/workflows/edit-agent/README.md +112 -0
  285. package/src/modules/bmb/workflows/edit-agent/checklist.md +112 -0
  286. package/src/modules/bmb/workflows/edit-agent/instructions.md +290 -0
  287. package/src/modules/bmb/workflows/edit-agent/workflow.yaml +35 -0
  288. package/src/modules/bmb/workflows/edit-module/README.md +187 -0
  289. package/src/modules/bmb/workflows/edit-module/checklist.md +165 -0
  290. package/src/modules/bmb/workflows/edit-module/instructions.md +339 -0
  291. package/src/modules/bmb/workflows/edit-module/workflow.yaml +36 -0
  292. package/src/modules/bmb/workflows/edit-workflow/README.md +119 -0
  293. package/src/modules/bmb/workflows/edit-workflow/checklist.md +70 -0
  294. package/src/modules/bmb/workflows/edit-workflow/instructions.md +342 -0
  295. package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +29 -0
  296. package/src/modules/bmb/workflows/module-brief/README.md +264 -0
  297. package/src/modules/bmb/workflows/module-brief/checklist.md +116 -0
  298. package/src/modules/bmb/workflows/module-brief/instructions.md +267 -0
  299. package/src/modules/bmb/workflows/module-brief/template.md +275 -0
  300. package/src/modules/bmb/workflows/module-brief/workflow.yaml +31 -0
  301. package/src/modules/bmb/workflows/redoc/README.md +87 -0
  302. package/src/modules/bmb/workflows/redoc/checklist.md +99 -0
  303. package/src/modules/bmb/workflows/redoc/instructions.md +265 -0
  304. package/src/modules/bmb/workflows/redoc/workflow.yaml +34 -0
  305. package/src/modules/bmm/README.md +141 -0
  306. package/src/modules/bmm/_module-installer/assets/bmm-kb.md +1 -0
  307. package/src/modules/bmm/_module-installer/assets/technical-decisions.md +30 -0
  308. package/src/modules/bmm/_module-installer/install-config.yaml +74 -0
  309. package/src/modules/bmm/_module-installer/installer.js +131 -0
  310. package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +35 -0
  311. package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +32 -0
  312. package/src/modules/bmm/agents/analyst.agent.yaml +43 -0
  313. package/src/modules/bmm/agents/architect.agent.yaml +41 -0
  314. package/src/modules/bmm/agents/dev.agent.yaml +43 -0
  315. package/src/modules/bmm/agents/game-architect.agent.yaml +35 -0
  316. package/src/modules/bmm/agents/game-designer.agent.yaml +47 -0
  317. package/src/modules/bmm/agents/game-dev.agent.yaml +39 -0
  318. package/src/modules/bmm/agents/pm.agent.yaml +50 -0
  319. package/src/modules/bmm/agents/sm.agent.yaml +67 -0
  320. package/src/modules/bmm/agents/tea.agent.yaml +59 -0
  321. package/src/modules/bmm/agents/ux-designer.agent.yaml +33 -0
  322. package/src/modules/bmm/sub-modules/claude-code/config.yaml +5 -0
  323. package/src/modules/bmm/sub-modules/claude-code/injections.yaml +242 -0
  324. package/src/modules/bmm/sub-modules/claude-code/readme.md +87 -0
  325. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-analysis/api-documenter.md +102 -0
  326. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-analysis/codebase-analyzer.md +82 -0
  327. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-analysis/data-analyst.md +101 -0
  328. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-analysis/pattern-detector.md +84 -0
  329. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/dependency-mapper.md +83 -0
  330. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/epic-optimizer.md +81 -0
  331. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/requirements-analyst.md +61 -0
  332. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/technical-decisions-curator.md +168 -0
  333. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/trend-spotter.md +115 -0
  334. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/user-journey-mapper.md +123 -0
  335. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/user-researcher.md +72 -0
  336. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-research/market-researcher.md +51 -0
  337. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-research/tech-debt-auditor.md +106 -0
  338. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-review/document-reviewer.md +102 -0
  339. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-review/technical-evaluator.md +68 -0
  340. package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-review/test-coverage-analyzer.md +108 -0
  341. package/src/modules/bmm/tasks/daily-standup.xml +85 -0
  342. package/src/modules/bmm/tasks/retrospective.xml +104 -0
  343. package/src/modules/bmm/teams/team-fullstack.yaml +11 -0
  344. package/src/modules/bmm/teams/team-gamedev.yaml +14 -0
  345. package/src/modules/bmm/testarch/README.md +311 -0
  346. package/src/modules/bmm/testarch/knowledge/ci-burn-in.md +675 -0
  347. package/src/modules/bmm/testarch/knowledge/component-tdd.md +486 -0
  348. package/src/modules/bmm/testarch/knowledge/contract-testing.md +957 -0
  349. package/src/modules/bmm/testarch/knowledge/data-factories.md +500 -0
  350. package/src/modules/bmm/testarch/knowledge/email-auth.md +721 -0
  351. package/src/modules/bmm/testarch/knowledge/error-handling.md +725 -0
  352. package/src/modules/bmm/testarch/knowledge/feature-flags.md +750 -0
  353. package/src/modules/bmm/testarch/knowledge/fixture-architecture.md +401 -0
  354. package/src/modules/bmm/testarch/knowledge/network-first.md +486 -0
  355. package/src/modules/bmm/testarch/knowledge/nfr-criteria.md +670 -0
  356. package/src/modules/bmm/testarch/knowledge/playwright-config.md +730 -0
  357. package/src/modules/bmm/testarch/knowledge/probability-impact.md +601 -0
  358. package/src/modules/bmm/testarch/knowledge/risk-governance.md +615 -0
  359. package/src/modules/bmm/testarch/knowledge/selective-testing.md +732 -0
  360. package/src/modules/bmm/testarch/knowledge/selector-resilience.md +527 -0
  361. package/src/modules/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
  362. package/src/modules/bmm/testarch/knowledge/test-levels-framework.md +473 -0
  363. package/src/modules/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
  364. package/src/modules/bmm/testarch/knowledge/test-quality.md +664 -0
  365. package/src/modules/bmm/testarch/knowledge/timing-debugging.md +372 -0
  366. package/src/modules/bmm/testarch/knowledge/visual-debugging.md +524 -0
  367. package/src/modules/bmm/testarch/tea-index.csv +22 -0
  368. package/src/modules/bmm/workflows/1-analysis/brainstorm-game/README.md +38 -0
  369. package/src/modules/bmm/workflows/1-analysis/brainstorm-game/game-brain-methods.csv +26 -0
  370. package/src/modules/bmm/workflows/1-analysis/brainstorm-game/game-context.md +115 -0
  371. package/src/modules/bmm/workflows/1-analysis/brainstorm-game/instructions.md +109 -0
  372. package/src/modules/bmm/workflows/1-analysis/brainstorm-game/workflow.yaml +41 -0
  373. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/README.md +29 -0
  374. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +91 -0
  375. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +25 -0
  376. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +39 -0
  377. package/src/modules/bmm/workflows/1-analysis/game-brief/README.md +221 -0
  378. package/src/modules/bmm/workflows/1-analysis/game-brief/checklist.md +128 -0
  379. package/src/modules/bmm/workflows/1-analysis/game-brief/instructions.md +357 -0
  380. package/src/modules/bmm/workflows/1-analysis/game-brief/template.md +205 -0
  381. package/src/modules/bmm/workflows/1-analysis/game-brief/workflow.yaml +44 -0
  382. package/src/modules/bmm/workflows/1-analysis/product-brief/README.md +180 -0
  383. package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +115 -0
  384. package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +321 -0
  385. package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +165 -0
  386. package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +43 -0
  387. package/src/modules/bmm/workflows/1-analysis/research/README.md +454 -0
  388. package/src/modules/bmm/workflows/1-analysis/research/checklist.md +202 -0
  389. package/src/modules/bmm/workflows/1-analysis/research/claude-code/injections.yaml +114 -0
  390. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-competitor-analyzer.md +259 -0
  391. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-data-analyst.md +190 -0
  392. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-market-researcher.md +337 -0
  393. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-trend-spotter.md +107 -0
  394. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-user-researcher.md +329 -0
  395. package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +433 -0
  396. package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +613 -0
  397. package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +125 -0
  398. package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +501 -0
  399. package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +94 -0
  400. package/src/modules/bmm/workflows/1-analysis/research/template-market.md +311 -0
  401. package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +210 -0
  402. package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +49 -0
  403. package/src/modules/bmm/workflows/2-plan-workflows/README.md +258 -0
  404. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/checklist.md +310 -0
  405. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/instructions.md +1283 -0
  406. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +145 -0
  407. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +42 -0
  408. package/src/modules/bmm/workflows/2-plan-workflows/gdd/README.md +222 -0
  409. package/src/modules/bmm/workflows/2-plan-workflows/gdd/checklist.md +148 -0
  410. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/action-platformer.md +45 -0
  411. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/adventure.md +84 -0
  412. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/card-game.md +76 -0
  413. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/fighting.md +89 -0
  414. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/horror.md +86 -0
  415. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/idle-incremental.md +78 -0
  416. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/metroidvania.md +87 -0
  417. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/moba.md +74 -0
  418. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/party-game.md +79 -0
  419. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/puzzle.md +58 -0
  420. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/racing.md +88 -0
  421. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/rhythm.md +79 -0
  422. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/roguelike.md +69 -0
  423. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/rpg.md +70 -0
  424. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/sandbox.md +79 -0
  425. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/shooter.md +62 -0
  426. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/simulation.md +73 -0
  427. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/sports.md +75 -0
  428. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/strategy.md +71 -0
  429. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/survival.md +79 -0
  430. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/text-based.md +91 -0
  431. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/tower-defense.md +79 -0
  432. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/turn-based-tactics.md +88 -0
  433. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types/visual-novel.md +89 -0
  434. package/src/modules/bmm/workflows/2-plan-workflows/gdd/game-types.csv +25 -0
  435. package/src/modules/bmm/workflows/2-plan-workflows/gdd/gdd-template.md +153 -0
  436. package/src/modules/bmm/workflows/2-plan-workflows/gdd/instructions-gdd.md +475 -0
  437. package/src/modules/bmm/workflows/2-plan-workflows/gdd/workflow.yaml +67 -0
  438. package/src/modules/bmm/workflows/2-plan-workflows/narrative/checklist.md +139 -0
  439. package/src/modules/bmm/workflows/2-plan-workflows/narrative/instructions-narrative.md +557 -0
  440. package/src/modules/bmm/workflows/2-plan-workflows/narrative/narrative-template.md +195 -0
  441. package/src/modules/bmm/workflows/2-plan-workflows/narrative/workflow.yaml +38 -0
  442. package/src/modules/bmm/workflows/2-plan-workflows/prd/checklist.md +117 -0
  443. package/src/modules/bmm/workflows/2-plan-workflows/prd/epics-template.md +63 -0
  444. package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +449 -0
  445. package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +62 -0
  446. package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +46 -0
  447. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +107 -0
  448. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +11 -0
  449. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-level0-story.md +167 -0
  450. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-level1-stories.md +278 -0
  451. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +269 -0
  452. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/tech-spec-template.md +55 -0
  453. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/user-story-template.md +56 -0
  454. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +52 -0
  455. package/src/modules/bmm/workflows/3-solutioning/README.md +1 -0
  456. package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-patterns.yaml +347 -0
  457. package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-template.md +103 -0
  458. package/src/modules/bmm/workflows/3-solutioning/architecture/checklist.md +244 -0
  459. package/src/modules/bmm/workflows/3-solutioning/architecture/decision-catalog.yaml +222 -0
  460. package/src/modules/bmm/workflows/3-solutioning/architecture/instructions.md +703 -0
  461. package/src/modules/bmm/workflows/3-solutioning/architecture/pattern-categories.csv +13 -0
  462. package/src/modules/bmm/workflows/3-solutioning/architecture/readme.md +318 -0
  463. package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +54 -0
  464. package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/README.md +177 -0
  465. package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/checklist.md +175 -0
  466. package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/instructions.md +273 -0
  467. package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/template.md +146 -0
  468. package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/validation-criteria.yaml +189 -0
  469. package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/workflow.yaml +40 -0
  470. package/src/modules/bmm/workflows/4-implementation/README.md +221 -0
  471. package/src/modules/bmm/workflows/4-implementation/code-review/README.md +69 -0
  472. package/src/modules/bmm/workflows/4-implementation/code-review/backlog_template.md +12 -0
  473. package/src/modules/bmm/workflows/4-implementation/code-review/checklist.md +22 -0
  474. package/src/modules/bmm/workflows/4-implementation/code-review/instructions.md +391 -0
  475. package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +56 -0
  476. package/src/modules/bmm/workflows/4-implementation/correct-course/README.md +73 -0
  477. package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +279 -0
  478. package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +201 -0
  479. package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +45 -0
  480. package/src/modules/bmm/workflows/4-implementation/create-story/README.md +129 -0
  481. package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +240 -0
  482. package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +252 -0
  483. package/src/modules/bmm/workflows/4-implementation/create-story/template.md +51 -0
  484. package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +49 -0
  485. package/src/modules/bmm/workflows/4-implementation/dev-story/AUDIT-REPORT.md +367 -0
  486. package/src/modules/bmm/workflows/4-implementation/dev-story/README.md +206 -0
  487. package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +38 -0
  488. package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +262 -0
  489. package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +28 -0
  490. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/README.md +195 -0
  491. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/checklist.md +17 -0
  492. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/instructions.md +160 -0
  493. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/template.md +76 -0
  494. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/workflow.yaml +34 -0
  495. package/src/modules/bmm/workflows/4-implementation/retrospective/README.md +77 -0
  496. package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +479 -0
  497. package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +45 -0
  498. package/src/modules/bmm/workflows/4-implementation/sprint-planning/README.md +156 -0
  499. package/src/modules/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
  500. package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +221 -0
  501. package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
  502. package/src/modules/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +41 -0
  503. package/src/modules/bmm/workflows/4-implementation/story-context/README.md +234 -0
  504. package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +16 -0
  505. package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +34 -0
  506. package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +201 -0
  507. package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +32 -0
  508. package/src/modules/bmm/workflows/4-implementation/story-done/instructions.md +111 -0
  509. package/src/modules/bmm/workflows/4-implementation/story-done/workflow.yaml +27 -0
  510. package/src/modules/bmm/workflows/4-implementation/story-ready/instructions.md +117 -0
  511. package/src/modules/bmm/workflows/4-implementation/story-ready/workflow.yaml +27 -0
  512. package/src/modules/bmm/workflows/README.md +577 -0
  513. package/src/modules/bmm/workflows/document-project/README.md +444 -0
  514. package/src/modules/bmm/workflows/document-project/checklist.md +245 -0
  515. package/src/modules/bmm/workflows/document-project/documentation-requirements.csv +12 -0
  516. package/src/modules/bmm/workflows/document-project/instructions.md +222 -0
  517. package/src/modules/bmm/workflows/document-project/templates/README.md +38 -0
  518. package/src/modules/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
  519. package/src/modules/bmm/workflows/document-project/templates/index-template.md +169 -0
  520. package/src/modules/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
  521. package/src/modules/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
  522. package/src/modules/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
  523. package/src/modules/bmm/workflows/document-project/workflow.yaml +36 -0
  524. package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
  525. package/src/modules/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
  526. package/src/modules/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
  527. package/src/modules/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
  528. package/src/modules/bmm/workflows/testarch/README.md +26 -0
  529. package/src/modules/bmm/workflows/testarch/atdd/README.md +672 -0
  530. package/src/modules/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
  531. package/src/modules/bmm/workflows/testarch/atdd/checklist.md +373 -0
  532. package/src/modules/bmm/workflows/testarch/atdd/instructions.md +785 -0
  533. package/src/modules/bmm/workflows/testarch/atdd/workflow.yaml +54 -0
  534. package/src/modules/bmm/workflows/testarch/automate/README.md +869 -0
  535. package/src/modules/bmm/workflows/testarch/automate/checklist.md +580 -0
  536. package/src/modules/bmm/workflows/testarch/automate/instructions.md +1303 -0
  537. package/src/modules/bmm/workflows/testarch/automate/workflow.yaml +63 -0
  538. package/src/modules/bmm/workflows/testarch/ci/README.md +493 -0
  539. package/src/modules/bmm/workflows/testarch/ci/checklist.md +246 -0
  540. package/src/modules/bmm/workflows/testarch/ci/github-actions-template.yaml +165 -0
  541. package/src/modules/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +128 -0
  542. package/src/modules/bmm/workflows/testarch/ci/instructions.md +517 -0
  543. package/src/modules/bmm/workflows/testarch/ci/workflow.yaml +55 -0
  544. package/src/modules/bmm/workflows/testarch/framework/README.md +340 -0
  545. package/src/modules/bmm/workflows/testarch/framework/checklist.md +321 -0
  546. package/src/modules/bmm/workflows/testarch/framework/instructions.md +455 -0
  547. package/src/modules/bmm/workflows/testarch/framework/workflow.yaml +55 -0
  548. package/src/modules/bmm/workflows/testarch/nfr-assess/README.md +469 -0
  549. package/src/modules/bmm/workflows/testarch/nfr-assess/checklist.md +405 -0
  550. package/src/modules/bmm/workflows/testarch/nfr-assess/instructions.md +722 -0
  551. package/src/modules/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +443 -0
  552. package/src/modules/bmm/workflows/testarch/nfr-assess/workflow.yaml +58 -0
  553. package/src/modules/bmm/workflows/testarch/test-design/README.md +493 -0
  554. package/src/modules/bmm/workflows/testarch/test-design/checklist.md +234 -0
  555. package/src/modules/bmm/workflows/testarch/test-design/instructions.md +621 -0
  556. package/src/modules/bmm/workflows/testarch/test-design/test-design-template.md +285 -0
  557. package/src/modules/bmm/workflows/testarch/test-design/workflow.yaml +54 -0
  558. package/src/modules/bmm/workflows/testarch/test-review/README.md +775 -0
  559. package/src/modules/bmm/workflows/testarch/test-review/checklist.md +470 -0
  560. package/src/modules/bmm/workflows/testarch/test-review/instructions.md +608 -0
  561. package/src/modules/bmm/workflows/testarch/test-review/test-review-template.md +388 -0
  562. package/src/modules/bmm/workflows/testarch/test-review/workflow.yaml +55 -0
  563. package/src/modules/bmm/workflows/testarch/trace/README.md +802 -0
  564. package/src/modules/bmm/workflows/testarch/trace/checklist.md +654 -0
  565. package/src/modules/bmm/workflows/testarch/trace/instructions.md +1045 -0
  566. package/src/modules/bmm/workflows/testarch/trace/trace-template.md +673 -0
  567. package/src/modules/bmm/workflows/testarch/trace/workflow.yaml +68 -0
  568. package/src/modules/bmm/workflows/workflow-status/README.md +241 -0
  569. package/src/modules/bmm/workflows/workflow-status/init/instructions.md +297 -0
  570. package/src/modules/bmm/workflows/workflow-status/init/workflow.yaml +28 -0
  571. package/src/modules/bmm/workflows/workflow-status/instructions.md +324 -0
  572. package/src/modules/bmm/workflows/workflow-status/paths/brownfield-level-0.yaml +54 -0
  573. package/src/modules/bmm/workflows/workflow-status/paths/brownfield-level-1.yaml +58 -0
  574. package/src/modules/bmm/workflows/workflow-status/paths/brownfield-level-2.yaml +76 -0
  575. package/src/modules/bmm/workflows/workflow-status/paths/brownfield-level-3.yaml +95 -0
  576. package/src/modules/bmm/workflows/workflow-status/paths/brownfield-level-4.yaml +88 -0
  577. package/src/modules/bmm/workflows/workflow-status/paths/game-design.yaml +75 -0
  578. package/src/modules/bmm/workflows/workflow-status/paths/greenfield-level-0.yaml +45 -0
  579. package/src/modules/bmm/workflows/workflow-status/paths/greenfield-level-1.yaml +49 -0
  580. package/src/modules/bmm/workflows/workflow-status/paths/greenfield-level-2.yaml +78 -0
  581. package/src/modules/bmm/workflows/workflow-status/paths/greenfield-level-3.yaml +73 -0
  582. package/src/modules/bmm/workflows/workflow-status/paths/greenfield-level-4.yaml +75 -0
  583. package/src/modules/bmm/workflows/workflow-status/project-levels.yaml +59 -0
  584. package/src/modules/bmm/workflows/workflow-status/workflow-status-template.md +30 -0
  585. package/src/modules/bmm/workflows/workflow-status/workflow.yaml +30 -0
  586. package/src/modules/cis/_module-installer/install-config.yaml +14 -0
  587. package/src/modules/cis/_module-installer/installer.js +92 -0
  588. package/src/modules/cis/agents/README.md +104 -0
  589. package/src/modules/cis/agents/brainstorming-coach.agent.yaml +23 -0
  590. package/src/modules/cis/agents/creative-problem-solver.agent.yaml +23 -0
  591. package/src/modules/cis/agents/design-thinking-coach.agent.yaml +23 -0
  592. package/src/modules/cis/agents/innovation-strategist.agent.yaml +23 -0
  593. package/src/modules/cis/agents/storyteller.agent.yaml +23 -0
  594. package/src/modules/cis/readme.md +86 -0
  595. package/src/modules/cis/teams/creative-squad.yaml +6 -0
  596. package/src/modules/cis/workflows/README.md +67 -0
  597. package/src/modules/cis/workflows/design-thinking/README.md +56 -0
  598. package/src/modules/cis/workflows/design-thinking/design-methods.csv +31 -0
  599. package/src/modules/cis/workflows/design-thinking/instructions.md +200 -0
  600. package/src/modules/cis/workflows/design-thinking/template.md +111 -0
  601. package/src/modules/cis/workflows/design-thinking/workflow.yaml +43 -0
  602. package/src/modules/cis/workflows/innovation-strategy/README.md +56 -0
  603. package/src/modules/cis/workflows/innovation-strategy/innovation-frameworks.csv +31 -0
  604. package/src/modules/cis/workflows/innovation-strategy/instructions.md +274 -0
  605. package/src/modules/cis/workflows/innovation-strategy/template.md +189 -0
  606. package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +43 -0
  607. package/src/modules/cis/workflows/problem-solving/README.md +56 -0
  608. package/src/modules/cis/workflows/problem-solving/instructions.md +250 -0
  609. package/src/modules/cis/workflows/problem-solving/solving-methods.csv +31 -0
  610. package/src/modules/cis/workflows/problem-solving/template.md +165 -0
  611. package/src/modules/cis/workflows/problem-solving/workflow.yaml +43 -0
  612. package/src/modules/cis/workflows/storytelling/README.md +58 -0
  613. package/src/modules/cis/workflows/storytelling/instructions.md +283 -0
  614. package/src/modules/cis/workflows/storytelling/story-types.csv +26 -0
  615. package/src/modules/cis/workflows/storytelling/template.md +113 -0
  616. package/src/modules/cis/workflows/storytelling/workflow.yaml +43 -0
  617. package/src/utility/models/agent-activation-ide.xml +51 -0
  618. package/src/utility/models/agent-activation-web.xml +60 -0
  619. package/src/utility/models/agent-config-template.md +23 -0
  620. package/src/utility/models/agent-in-team-activation.xml +3 -0
  621. package/src/utility/models/fragments/activation-rules.xml +8 -0
  622. package/src/utility/models/fragments/activation-steps.xml +15 -0
  623. package/src/utility/models/fragments/handler-action.xml +4 -0
  624. package/src/utility/models/fragments/handler-data.xml +5 -0
  625. package/src/utility/models/fragments/handler-exec.xml +5 -0
  626. package/src/utility/models/fragments/handler-tmpl.xml +5 -0
  627. package/src/utility/models/fragments/handler-validate-workflow.xml +7 -0
  628. package/src/utility/models/fragments/handler-workflow.xml +9 -0
  629. package/src/utility/models/fragments/menu-handlers.xml +6 -0
  630. package/src/utility/models/fragments/web-bundle-activation-steps.xml +32 -0
  631. package/src/utility/templates/agent.customize.template.yaml +42 -0
  632. package/test/README.md +295 -0
  633. package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +26 -0
  634. package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +29 -0
  635. package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +21 -0
  636. package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +19 -0
  637. package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +24 -0
  638. package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +23 -0
  639. package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +24 -0
  640. package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +30 -0
  641. package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +24 -0
  642. package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +24 -0
  643. package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +24 -0
  644. package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +24 -0
  645. package/test/fixtures/agent-schema/invalid/metadata/core-agent-with-module.agent.yaml +26 -0
  646. package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
  647. package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
  648. package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +26 -0
  649. package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
  650. package/test/fixtures/agent-schema/invalid/metadata/module-agent-missing-module.agent.yaml +25 -0
  651. package/test/fixtures/agent-schema/invalid/metadata/wrong-module-value.agent.yaml +26 -0
  652. package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +23 -0
  653. package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +26 -0
  654. package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +26 -0
  655. package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +23 -0
  656. package/test/fixtures/agent-schema/invalid/persona/principles-as-string.agent.yaml +23 -0
  657. package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +28 -0
  658. package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +30 -0
  659. package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +27 -0
  660. package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +27 -0
  661. package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
  662. package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +27 -0
  663. package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
  664. package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
  665. package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
  666. package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +23 -0
  667. package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +21 -0
  668. package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +26 -0
  669. package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +30 -0
  670. package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +21 -0
  671. package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +39 -0
  672. package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +23 -0
  673. package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +33 -0
  674. package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +23 -0
  675. package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +23 -0
  676. package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +23 -0
  677. package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +23 -0
  678. package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +23 -0
  679. package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +21 -0
  680. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +27 -0
  681. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +29 -0
  682. package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +23 -0
  683. package/test/test-agent-schema.js +387 -0
  684. package/test/test-cli-integration.sh +159 -0
  685. package/test/unit-test-schema.js +133 -0
  686. package/tools/bmad-npx-wrapper.js +100 -13
  687. package/tools/cli/README.md +590 -0
  688. package/tools/cli/bmad-cli.js +40 -0
  689. package/tools/cli/bundlers/bundle-web.js +179 -0
  690. package/tools/cli/bundlers/test-analyst.js +28 -0
  691. package/tools/cli/bundlers/test-bundler.js +118 -0
  692. package/tools/cli/bundlers/web-bundler.js +1479 -0
  693. package/tools/cli/commands/build.js +458 -0
  694. package/tools/cli/commands/install.js +82 -0
  695. package/tools/cli/commands/list.js +28 -0
  696. package/tools/cli/commands/status.js +47 -0
  697. package/tools/cli/commands/uninstall.js +44 -0
  698. package/tools/cli/commands/update.js +28 -0
  699. package/tools/cli/installers/lib/core/config-collector.js +590 -0
  700. package/tools/cli/installers/lib/core/dependency-resolver.js +725 -0
  701. package/tools/cli/installers/lib/core/detector.js +274 -0
  702. package/tools/cli/installers/lib/core/ide-config-manager.js +152 -0
  703. package/tools/cli/installers/lib/core/installer.js +2095 -0
  704. package/tools/cli/installers/lib/core/manifest-generator.js +776 -0
  705. package/tools/cli/installers/lib/core/manifest.js +536 -0
  706. package/tools/cli/installers/lib/ide/_base-ide.js +572 -0
  707. package/tools/cli/installers/lib/ide/auggie.js +336 -0
  708. package/tools/cli/installers/lib/ide/claude-code.js +449 -0
  709. package/tools/cli/installers/lib/ide/cline.js +223 -0
  710. package/tools/cli/installers/lib/ide/codex.js +234 -0
  711. package/tools/cli/installers/lib/ide/crush.js +276 -0
  712. package/tools/cli/installers/lib/ide/cursor.js +292 -0
  713. package/tools/cli/installers/lib/ide/gemini.js +156 -0
  714. package/tools/cli/installers/lib/ide/github-copilot.js +290 -0
  715. package/tools/cli/installers/lib/ide/iflow.js +142 -0
  716. package/tools/cli/installers/lib/ide/kilo.js +171 -0
  717. package/tools/cli/installers/lib/ide/manager.js +194 -0
  718. package/tools/cli/installers/lib/ide/opencode.js +213 -0
  719. package/tools/cli/installers/lib/ide/qwen.js +290 -0
  720. package/tools/cli/installers/lib/ide/roo.js +288 -0
  721. package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +143 -0
  722. package/tools/cli/installers/lib/ide/shared/module-injections.js +133 -0
  723. package/tools/cli/installers/lib/ide/task-tool-command-generator.js +119 -0
  724. package/tools/cli/installers/lib/ide/trae.js +278 -0
  725. package/tools/cli/installers/lib/ide/windsurf.js +201 -0
  726. package/tools/cli/installers/lib/ide/workflow-command-generator.js +235 -0
  727. package/tools/cli/installers/lib/ide/workflow-command-template.md +15 -0
  728. package/tools/cli/installers/lib/modules/manager.js +568 -0
  729. package/tools/cli/lib/activation-builder.js +168 -0
  730. package/tools/cli/lib/agent-analyzer.js +81 -0
  731. package/tools/cli/lib/agent-party-generator.js +206 -0
  732. package/tools/cli/lib/cli-utils.js +208 -0
  733. package/tools/cli/lib/config.js +210 -0
  734. package/tools/cli/lib/file-ops.js +204 -0
  735. package/tools/cli/lib/platform-codes.js +116 -0
  736. package/tools/cli/lib/project-root.js +71 -0
  737. package/tools/cli/lib/replace-project-root.js +239 -0
  738. package/tools/cli/lib/ui.js +591 -0
  739. package/tools/cli/lib/xml-handler.js +228 -0
  740. package/tools/cli/lib/xml-to-markdown.js +82 -0
  741. package/tools/{yaml-format.js → cli/lib/yaml-format.js} +3 -10
  742. package/tools/cli/lib/yaml-xml-builder.js +439 -0
  743. package/tools/cli/regenerate-manifests.js +28 -0
  744. package/tools/cli/test-yaml-builder.js +43 -0
  745. package/tools/flattener/ignoreRules.js +2 -6
  746. package/tools/flattener/main.js +31 -121
  747. package/tools/flattener/projectRoot.js +3 -8
  748. package/tools/flattener/stats.helpers.js +8 -35
  749. package/tools/flattener/stats.js +1 -6
  750. package/tools/flattener/test-matrix.js +1 -5
  751. package/tools/format-workflow-md.js +263 -0
  752. package/tools/platform-codes.yaml +133 -0
  753. package/tools/schema/agent.js +231 -0
  754. package/tools/validate-agent-schema.js +110 -0
  755. package/tools/validate-bundles.js +87 -0
  756. package/v6-open-items.md +23 -0
  757. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -22
  758. package/bmad-core/agent-teams/team-all.yaml +0 -14
  759. package/bmad-core/agent-teams/team-fullstack.yaml +0 -18
  760. package/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
  761. package/bmad-core/agent-teams/team-no-ui.yaml +0 -13
  762. package/bmad-core/agents/analyst.md +0 -81
  763. package/bmad-core/agents/architect.md +0 -83
  764. package/bmad-core/agents/bmad-master.md +0 -107
  765. package/bmad-core/agents/bmad-orchestrator.md +0 -149
  766. package/bmad-core/agents/dev.md +0 -75
  767. package/bmad-core/agents/pm.md +0 -81
  768. package/bmad-core/agents/po.md +0 -76
  769. package/bmad-core/agents/qa.md +0 -88
  770. package/bmad-core/agents/sm.md +0 -62
  771. package/bmad-core/agents/ux-expert.md +0 -66
  772. package/bmad-core/checklists/architect-checklist.md +0 -438
  773. package/bmad-core/checklists/change-checklist.md +0 -182
  774. package/bmad-core/checklists/pm-checklist.md +0 -370
  775. package/bmad-core/checklists/po-master-checklist.md +0 -432
  776. package/bmad-core/checklists/story-dod-checklist.md +0 -94
  777. package/bmad-core/checklists/story-draft-checklist.md +0 -153
  778. package/bmad-core/core-config.yaml +0 -20
  779. package/bmad-core/data/bmad-kb.md +0 -806
  780. package/bmad-core/data/brainstorming-techniques.md +0 -36
  781. package/bmad-core/data/elicitation-methods.md +0 -154
  782. package/bmad-core/data/technical-preferences.md +0 -3
  783. package/bmad-core/data/test-levels-framework.md +0 -146
  784. package/bmad-core/data/test-priorities-matrix.md +0 -172
  785. package/bmad-core/tasks/advanced-elicitation.md +0 -117
  786. package/bmad-core/tasks/brownfield-create-epic.md +0 -160
  787. package/bmad-core/tasks/brownfield-create-story.md +0 -147
  788. package/bmad-core/tasks/correct-course.md +0 -70
  789. package/bmad-core/tasks/create-brownfield-story.md +0 -312
  790. package/bmad-core/tasks/create-deep-research-prompt.md +0 -278
  791. package/bmad-core/tasks/create-next-story.md +0 -112
  792. package/bmad-core/tasks/document-project.md +0 -343
  793. package/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
  794. package/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
  795. package/bmad-core/tasks/index-docs.md +0 -173
  796. package/bmad-core/tasks/kb-mode-interaction.md +0 -75
  797. package/bmad-core/tasks/nfr-assess.md +0 -343
  798. package/bmad-core/tasks/qa-gate.md +0 -159
  799. package/bmad-core/tasks/review-story.md +0 -314
  800. package/bmad-core/tasks/risk-profile.md +0 -353
  801. package/bmad-core/tasks/shard-doc.md +0 -185
  802. package/bmad-core/tasks/test-design.md +0 -174
  803. package/bmad-core/tasks/trace-requirements.md +0 -264
  804. package/bmad-core/tasks/validate-next-story.md +0 -134
  805. package/bmad-core/templates/architecture-tmpl.yaml +0 -650
  806. package/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
  807. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
  808. package/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
  809. package/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -306
  810. package/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -218
  811. package/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
  812. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -823
  813. package/bmad-core/templates/market-research-tmpl.yaml +0 -252
  814. package/bmad-core/templates/prd-tmpl.yaml +0 -202
  815. package/bmad-core/templates/project-brief-tmpl.yaml +0 -221
  816. package/bmad-core/templates/qa-gate-tmpl.yaml +0 -102
  817. package/bmad-core/templates/story-tmpl.yaml +0 -137
  818. package/bmad-core/workflows/brownfield-fullstack.yaml +0 -297
  819. package/bmad-core/workflows/brownfield-service.yaml +0 -187
  820. package/bmad-core/workflows/brownfield-ui.yaml +0 -197
  821. package/bmad-core/workflows/greenfield-fullstack.yaml +0 -240
  822. package/bmad-core/workflows/greenfield-service.yaml +0 -206
  823. package/bmad-core/workflows/greenfield-ui.yaml +0 -235
  824. package/common/tasks/create-doc.md +0 -101
  825. package/common/tasks/execute-checklist.md +0 -86
  826. package/common/utils/bmad-doc-template.md +0 -325
  827. package/common/utils/workflow-management.md +0 -69
  828. package/dist/agents/analyst.txt +0 -2889
  829. package/dist/agents/architect.txt +0 -3552
  830. package/dist/agents/bmad-master.txt +0 -8769
  831. package/dist/agents/bmad-orchestrator.txt +0 -1513
  832. package/dist/agents/dev.txt +0 -414
  833. package/dist/agents/pm.txt +0 -2204
  834. package/dist/agents/po.txt +0 -1346
  835. package/dist/agents/qa.txt +0 -1987
  836. package/dist/agents/sm.txt +0 -658
  837. package/dist/agents/ux-expert.txt +0 -694
  838. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +0 -2371
  839. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +0 -1620
  840. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +0 -815
  841. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -10952
  842. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +0 -4012
  843. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +0 -3698
  844. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -450
  845. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +0 -973
  846. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -15376
  847. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +0 -2075
  848. package/dist/teams/team-all.txt +0 -12682
  849. package/dist/teams/team-fullstack.txt +0 -10421
  850. package/dist/teams/team-ide-minimal.txt +0 -5103
  851. package/dist/teams/team-no-ui.txt +0 -8980
  852. package/docs/GUIDING-PRINCIPLES.md +0 -91
  853. package/docs/core-architecture.md +0 -219
  854. package/docs/enhanced-ide-development-workflow.md +0 -248
  855. package/docs/expansion-packs.md +0 -280
  856. package/docs/how-to-contribute-with-pull-requests.md +0 -158
  857. package/docs/user-guide.md +0 -504
  858. package/docs/versioning-and-releases.md +0 -147
  859. package/docs/versions.md +0 -48
  860. package/docs/working-in-the-brownfield.md +0 -597
  861. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +0 -102
  862. 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
  863. 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
  864. 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
  865. 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
  866. 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
  867. 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
  868. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +0 -109
  869. package/expansion-packs/README.md +0 -3
  870. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -13
  871. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -71
  872. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -78
  873. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -64
  874. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -201
  875. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -160
  876. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +0 -8
  877. package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -250
  878. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -647
  879. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -110
  880. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -216
  881. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -290
  882. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -613
  883. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -356
  884. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -343
  885. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -253
  886. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  887. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  888. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -175
  889. package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +0 -14
  890. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +0 -80
  891. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +0 -77
  892. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +0 -78
  893. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +0 -65
  894. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -391
  895. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +0 -203
  896. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +0 -201
  897. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -124
  898. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +0 -6
  899. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -769
  900. package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -586
  901. package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -110
  902. package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -141
  903. package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +0 -184
  904. package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -290
  905. package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +0 -200
  906. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +0 -1030
  907. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +0 -356
  908. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +0 -705
  909. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +0 -256
  910. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  911. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  912. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +0 -175
  913. package/expansion-packs/bmad-infrastructure-devops/README.md +0 -147
  914. package/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +0 -71
  915. package/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +0 -484
  916. package/expansion-packs/bmad-infrastructure-devops/config.yaml +0 -9
  917. package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -305
  918. package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -159
  919. package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -153
  920. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -424
  921. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -629
  922. package/release_notes.md +0 -33
  923. package/tools/builders/web-builder.js +0 -675
  924. package/tools/bump-all-versions.js +0 -115
  925. package/tools/bump-expansion-version.js +0 -90
  926. package/tools/cli.js +0 -152
  927. package/tools/installer/README.md +0 -8
  928. package/tools/installer/bin/bmad.js +0 -585
  929. package/tools/installer/config/ide-agent-config.yaml +0 -58
  930. package/tools/installer/config/install.config.yaml +0 -123
  931. package/tools/installer/lib/config-loader.js +0 -257
  932. package/tools/installer/lib/file-manager.js +0 -389
  933. package/tools/installer/lib/ide-base-setup.js +0 -228
  934. package/tools/installer/lib/ide-setup.js +0 -1441
  935. package/tools/installer/lib/installer.js +0 -1995
  936. package/tools/installer/lib/memory-profiler.js +0 -225
  937. package/tools/installer/lib/module-manager.js +0 -114
  938. package/tools/installer/lib/resource-locator.js +0 -308
  939. package/tools/installer/package.json +0 -44
  940. package/tools/lib/dependency-resolver.js +0 -175
  941. package/tools/lib/yaml-utils.js +0 -29
  942. package/tools/md-assets/web-agent-startup-instructions.md +0 -39
  943. package/tools/preview-release-notes.js +0 -66
  944. package/tools/shared/bannerArt.js +0 -105
  945. package/tools/sync-installer-version.js +0 -32
  946. package/tools/update-expansion-version.js +0 -53
  947. package/tools/upgraders/v3-to-v4-upgrader.js +0 -672
  948. package/tools/version-bump.js +0 -94
@@ -0,0 +1,1479 @@
1
+ const path = require('node:path');
2
+ const fs = require('fs-extra');
3
+ const chalk = require('chalk');
4
+ const yaml = require('js-yaml');
5
+ const { DependencyResolver } = require('../installers/lib/core/dependency-resolver');
6
+ const { XmlHandler } = require('../lib/xml-handler');
7
+ const { YamlXmlBuilder } = require('../lib/yaml-xml-builder');
8
+ const { AgentPartyGenerator } = require('../lib/agent-party-generator');
9
+ const xml2js = require('xml2js');
10
+ const { getProjectRoot, getSourcePath, getModulePath } = require('../lib/project-root');
11
+
12
+ class WebBundler {
13
+ constructor(sourceDir = null, outputDir = 'web-bundles') {
14
+ this.sourceDir = sourceDir || getSourcePath();
15
+ this.outputDir = path.isAbsolute(outputDir) ? outputDir : path.join(getProjectRoot(), outputDir);
16
+ this.modulesPath = getSourcePath('modules');
17
+ this.utilityPath = getSourcePath('utility');
18
+
19
+ this.dependencyResolver = new DependencyResolver();
20
+ this.xmlHandler = new XmlHandler();
21
+ this.yamlBuilder = new YamlXmlBuilder();
22
+
23
+ // Cache for resolved dependencies to avoid duplicates
24
+ this.dependencyCache = new Map();
25
+
26
+ // Discovered agents and teams for manifest generation
27
+ this.discoveredAgents = [];
28
+ this.discoveredTeams = [];
29
+
30
+ // Temporary directory for generated manifests
31
+ this.tempDir = path.join(process.cwd(), '.bundler-temp');
32
+ this.tempManifestDir = path.join(this.tempDir, 'bmad', '_cfg');
33
+
34
+ // Bundle statistics
35
+ this.stats = {
36
+ totalAgents: 0,
37
+ bundledAgents: 0,
38
+ skippedAgents: 0,
39
+ failedAgents: 0,
40
+ invalidXml: 0,
41
+ warnings: [],
42
+ };
43
+ }
44
+
45
+ /**
46
+ * Main entry point to bundle all modules
47
+ */
48
+ async bundleAll() {
49
+ console.log(chalk.cyan.bold('═══════════════════════════════════════════════'));
50
+ console.log(chalk.cyan.bold(' 🚀 Web Bundle Generation'));
51
+ console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
52
+
53
+ try {
54
+ // Pre-discover all modules to generate complete manifests
55
+ const modules = await this.discoverModules();
56
+ for (const module of modules) {
57
+ await this.preDiscoverModule(module);
58
+ }
59
+
60
+ // Create temporary manifest files
61
+ await this.createTempManifests();
62
+
63
+ // Process all modules
64
+ for (const module of modules) {
65
+ await this.bundleModule(module);
66
+ }
67
+
68
+ // Display summary
69
+ this.displaySummary();
70
+ } finally {
71
+ // Clean up temp files
72
+ await this.cleanupTempFiles();
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Bundle a specific module
78
+ */
79
+ async bundleModule(moduleName) {
80
+ const modulePath = path.join(this.modulesPath, moduleName);
81
+
82
+ if (!(await fs.pathExists(modulePath))) {
83
+ console.log(chalk.yellow(`Module ${moduleName} not found`));
84
+ return { module: moduleName, agents: [], teams: [] };
85
+ }
86
+
87
+ console.log(chalk.bold(`\n📦 Bundling module: ${moduleName}`));
88
+
89
+ const results = {
90
+ module: moduleName,
91
+ agents: [],
92
+ teams: [],
93
+ };
94
+
95
+ // Pre-discover all agents and teams for manifest generation
96
+ await this.preDiscoverModule(moduleName);
97
+
98
+ // Ensure temp manifests exist (might not exist if called directly)
99
+ if (!(await fs.pathExists(this.tempManifestDir))) {
100
+ await this.createTempManifests();
101
+ }
102
+
103
+ // Process agents
104
+ const agents = await this.discoverAgents(modulePath);
105
+ for (const agent of agents) {
106
+ try {
107
+ await this.bundleAgent(moduleName, agent, false); // false = don't track again
108
+ results.agents.push(agent);
109
+ } catch (error) {
110
+ console.error(` Failed to bundle agent ${agent}:`, error.message);
111
+ }
112
+ }
113
+
114
+ // Process teams
115
+ const teams = await this.discoverTeams(modulePath);
116
+ for (const team of teams) {
117
+ try {
118
+ await this.bundleTeam(moduleName, team);
119
+ results.teams.push(team);
120
+ } catch (error) {
121
+ console.error(` Failed to bundle team ${team}:`, error.message);
122
+ }
123
+ }
124
+
125
+ return results;
126
+ }
127
+
128
+ /**
129
+ * Bundle a single agent
130
+ */
131
+ async bundleAgent(moduleName, agentFile, shouldTrack = true) {
132
+ const agentName = agentFile.endsWith('.agent.yaml') ? path.basename(agentFile, '.agent.yaml') : path.basename(agentFile, '.md');
133
+ this.stats.totalAgents++;
134
+
135
+ console.log(chalk.dim(` → Processing: ${agentName}`));
136
+
137
+ const agentPath = path.join(this.modulesPath, moduleName, 'agents', agentFile);
138
+
139
+ // Check if agent file exists
140
+ if (!(await fs.pathExists(agentPath))) {
141
+ this.stats.failedAgents++;
142
+ console.log(chalk.red(` ✗ Agent file not found`));
143
+ throw new Error(`Agent file not found: ${agentPath}`);
144
+ }
145
+
146
+ let content;
147
+ let agentXml;
148
+
149
+ // Handle YAML agents - build in-memory to XML
150
+ if (agentFile.endsWith('.agent.yaml')) {
151
+ // Build agent from YAML (no customize file for web bundles)
152
+ const xmlContent = await this.yamlBuilder.buildFromYaml(agentPath, null, {
153
+ includeMetadata: false, // Don't include build metadata in web bundles
154
+ forWebBundle: true, // Use web-specific activation fragments
155
+ });
156
+
157
+ content = xmlContent;
158
+ agentXml = this.extractAgentXml(xmlContent);
159
+ } else {
160
+ // Legacy MD format - read and extract XML
161
+ content = await fs.readFile(agentPath, 'utf8');
162
+ agentXml = this.extractAgentXml(content);
163
+ }
164
+
165
+ if (!agentXml) {
166
+ this.stats.failedAgents++;
167
+ console.log(chalk.red(` ✗ No agent XML found in ${agentFile}`));
168
+ return;
169
+ }
170
+
171
+ // Check if agent has bundle="false" attribute
172
+ if (this.shouldSkipBundling(agentXml)) {
173
+ this.stats.skippedAgents++;
174
+ console.log(chalk.gray(` ⊘ Skipped (bundle="false")`));
175
+ return;
176
+ }
177
+
178
+ // Process {project-root} references in agent XML
179
+ agentXml = this.processProjectRootReferences(agentXml);
180
+
181
+ // Track for manifest generation BEFORE generating manifests (if not pre-discovered)
182
+ if (shouldTrack) {
183
+ const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
184
+ if (agentDetails) {
185
+ this.discoveredAgents.push(agentDetails);
186
+ }
187
+ }
188
+
189
+ // Resolve dependencies with warning tracking
190
+ const dependencyWarnings = [];
191
+ const { dependencies, skippedWorkflows } = await this.resolveAgentDependencies(agentXml, moduleName, dependencyWarnings);
192
+
193
+ if (dependencyWarnings.length > 0) {
194
+ this.stats.warnings.push({ agent: agentName, warnings: dependencyWarnings });
195
+ }
196
+
197
+ // Remove commands for skipped workflows from agent XML
198
+ if (skippedWorkflows.length > 0) {
199
+ agentXml = this.removeSkippedWorkflowCommands(agentXml, skippedWorkflows);
200
+ }
201
+
202
+ // Build the bundle (no manifests for individual agents)
203
+ const bundle = this.buildAgentBundle(agentXml, dependencies);
204
+
205
+ // Validate XML
206
+ const isValid = await this.validateXml(bundle);
207
+ if (!isValid) {
208
+ this.stats.invalidXml++;
209
+ console.log(chalk.red(` ⚠ Invalid XML generated!`));
210
+ }
211
+
212
+ // Write bundle to output
213
+ const outputPath = path.join(this.outputDir, moduleName, 'agents', `${agentName}.xml`);
214
+ await fs.ensureDir(path.dirname(outputPath));
215
+ await fs.writeFile(outputPath, bundle, 'utf8');
216
+
217
+ this.stats.bundledAgents++;
218
+ const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
219
+ console.log(` ${statusIcon} Bundled: ${agentName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
220
+ }
221
+
222
+ /**
223
+ * Bundle a team - includes orchestrator and all agents with their dependencies
224
+ */
225
+ async bundleTeam(moduleName, teamFile) {
226
+ const teamName = path.basename(teamFile, path.extname(teamFile));
227
+ console.log(chalk.dim(` → Processing team: ${teamName}`));
228
+
229
+ const teamPath = path.join(this.modulesPath, moduleName, 'teams', teamFile);
230
+
231
+ // Check if team file exists
232
+ if (!(await fs.pathExists(teamPath))) {
233
+ console.log(chalk.red(` ✗ Team file not found`));
234
+ throw new Error(`Team file not found: ${teamPath}`);
235
+ }
236
+
237
+ // Read and parse team YAML
238
+ const teamContent = await fs.readFile(teamPath, 'utf8');
239
+ const teamConfig = yaml.load(teamContent);
240
+
241
+ if (!teamConfig || !teamConfig.bundle) {
242
+ console.log(chalk.red(` ✗ Invalid team configuration`));
243
+ return;
244
+ }
245
+
246
+ // Start building the team bundle
247
+ const dependencies = new Map();
248
+ const processed = new Set();
249
+ const allAgentXmls = [];
250
+ const warnings = [];
251
+
252
+ // 1. First, always add the bmad-web-orchestrator (XML file only, no transformation needed)
253
+ const orchestratorXmlPath = path.join(this.sourceDir, 'core', 'agents', 'bmad-web-orchestrator.agent.xml');
254
+
255
+ if (await fs.pathExists(orchestratorXmlPath)) {
256
+ // Read the XML file directly - no transformation needed
257
+ const xmlContent = await fs.readFile(orchestratorXmlPath, 'utf8');
258
+ let orchestratorXml = xmlContent.trim();
259
+
260
+ // Process {project-root} references
261
+ orchestratorXml = this.processProjectRootReferences(orchestratorXml);
262
+
263
+ // Inject help/exit menu items only (orchestrator has its own activation)
264
+ orchestratorXml = this.injectHelpExitMenuItems(orchestratorXml);
265
+
266
+ // Resolve orchestrator dependencies
267
+ const { dependencies: orchDeps } = await this.resolveAgentDependencies(orchestratorXml, 'core', warnings);
268
+
269
+ // Merge orchestrator dependencies
270
+ for (const [id, content] of orchDeps) {
271
+ if (!dependencies.has(id)) {
272
+ dependencies.set(id, content);
273
+ }
274
+ }
275
+
276
+ // Add orchestrator XML first
277
+ allAgentXmls.push(orchestratorXml);
278
+ console.log(chalk.gray(` + Added orchestrator: bmad-web-orchestrator`));
279
+ } else {
280
+ console.log(chalk.yellow(` ⚠ Orchestrator not found at: ${orchestratorXmlPath}`));
281
+ }
282
+
283
+ // 2. Determine which agents to include
284
+ let agentsToBundle = [];
285
+
286
+ if (teamConfig.agents === '*' || (Array.isArray(teamConfig.agents) && teamConfig.agents.includes('*'))) {
287
+ // Include all agents from the module
288
+ const agentsPath = path.join(this.modulesPath, moduleName, 'agents');
289
+ if (await fs.pathExists(agentsPath)) {
290
+ const agentFiles = await fs.readdir(agentsPath);
291
+ agentsToBundle = agentFiles
292
+ .filter((file) => file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme')))
293
+ .map((file) => file.replace(/\.(agent\.yaml|md)$/, ''));
294
+ }
295
+ } else if (Array.isArray(teamConfig.agents)) {
296
+ // Include specific agents listed
297
+ agentsToBundle = teamConfig.agents;
298
+ } else {
299
+ console.log(chalk.yellow(` ⚠ No agents specified in team configuration`));
300
+ }
301
+
302
+ // 3. Process each agent and their dependencies
303
+ for (const agentName of agentsToBundle) {
304
+ // Try YAML first, then MD
305
+ let agentPath = path.join(this.modulesPath, moduleName, 'agents', `${agentName}.agent.yaml`);
306
+ let isYaml = await fs.pathExists(agentPath);
307
+
308
+ if (!isYaml) {
309
+ agentPath = path.join(this.modulesPath, moduleName, 'agents', `${agentName}.md`);
310
+ if (!(await fs.pathExists(agentPath))) {
311
+ console.log(chalk.yellow(` ⚠ Agent not found: ${agentName}`));
312
+ continue;
313
+ }
314
+ }
315
+
316
+ let agentXml;
317
+
318
+ if (isYaml) {
319
+ // Build YAML agent in-memory - skip activation for team agents (orchestrator handles it)
320
+ const xmlContent = await this.yamlBuilder.buildFromYaml(agentPath, null, {
321
+ includeMetadata: false,
322
+ skipActivation: true, // Skip activation for team agents
323
+ });
324
+ agentXml = this.extractAgentXml(xmlContent);
325
+ } else {
326
+ // Read legacy MD agent
327
+ const agentContent = await fs.readFile(agentPath, 'utf8');
328
+ agentXml = this.extractAgentXml(agentContent);
329
+ }
330
+
331
+ if (!agentXml) {
332
+ console.log(chalk.yellow(` ⚠ No XML found in agent: ${agentName}`));
333
+ continue;
334
+ }
335
+
336
+ // Skip agents with bundle="false"
337
+ if (this.shouldSkipBundling(agentXml)) {
338
+ console.log(chalk.gray(` ⊘ Skipped agent (bundle="false"): ${agentName}`));
339
+ continue;
340
+ }
341
+
342
+ // Process {project-root} references
343
+ agentXml = this.processProjectRootReferences(agentXml);
344
+
345
+ // Resolve agent dependencies
346
+ const agentWarnings = [];
347
+ const { dependencies: agentDeps, skippedWorkflows } = await this.resolveAgentDependencies(agentXml, moduleName, agentWarnings);
348
+
349
+ if (agentWarnings.length > 0) {
350
+ warnings.push({ agent: agentName, warnings: agentWarnings });
351
+ }
352
+
353
+ // Remove commands for skipped workflows from agent XML
354
+ if (skippedWorkflows.length > 0) {
355
+ agentXml = this.removeSkippedWorkflowCommands(agentXml, skippedWorkflows);
356
+ }
357
+
358
+ // Merge agent dependencies (deduplicate)
359
+ for (const [id, content] of agentDeps) {
360
+ if (!dependencies.has(id)) {
361
+ dependencies.set(id, content);
362
+ }
363
+ }
364
+
365
+ // Skip web activation injection for team agents - orchestrator handles everything
366
+ // Only inject help/exit menu items if missing
367
+ agentXml = this.injectHelpExitMenuItems(agentXml);
368
+
369
+ // Add agent XML to the collection
370
+ allAgentXmls.push(agentXml);
371
+ console.log(chalk.gray(` + Added agent: ${agentName}`));
372
+ }
373
+
374
+ // 4. Build the team bundle XML
375
+ const bundle = this.buildTeamBundle(teamConfig.bundle, allAgentXmls, dependencies);
376
+
377
+ // 5. Validate XML
378
+ const isValid = await this.validateXml(bundle);
379
+ if (!isValid) {
380
+ console.log(chalk.red(` ⚠ Invalid XML generated for team!`));
381
+ }
382
+
383
+ // 6. Write bundle to output
384
+ const outputPath = path.join(this.outputDir, moduleName, 'teams', `${teamName}.xml`);
385
+ await fs.ensureDir(path.dirname(outputPath));
386
+ await fs.writeFile(outputPath, bundle, 'utf8');
387
+
388
+ const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
389
+ console.log(` ${statusIcon} Bundled team: ${teamName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
390
+
391
+ // Track warnings
392
+ if (warnings.length > 0) {
393
+ this.stats.warnings.push(...warnings);
394
+ }
395
+ }
396
+
397
+ /**
398
+ * Build the final team bundle XML
399
+ */
400
+ buildTeamBundle(teamMetadata, agentXmls, dependencies) {
401
+ const parts = ['<?xml version="1.0" encoding="UTF-8"?>', '<team-bundle>', ' <!-- Agent Definitions -->', ' <agents>'];
402
+
403
+ for (const agentXml of agentXmls) {
404
+ // Indent each agent XML properly (add 4 spaces to each line)
405
+ const indentedAgent = agentXml
406
+ .split('\n')
407
+ .map((line) => ' ' + line)
408
+ .join('\n');
409
+ parts.push(indentedAgent);
410
+ }
411
+
412
+ parts.push(' </agents>');
413
+
414
+ // Add all dependencies
415
+ if (dependencies && dependencies.size > 0) {
416
+ parts.push('', ' <!-- Shared Dependencies -->', ' <dependencies>');
417
+
418
+ for (const [id, content] of dependencies) {
419
+ // All dependencies are now consistently wrapped in <file> elements
420
+ // Indent properly (add 4 spaces to each line)
421
+ const indentedContent = content
422
+ .split('\n')
423
+ .map((line) => ' ' + line)
424
+ .join('\n');
425
+ parts.push(indentedContent);
426
+ }
427
+
428
+ parts.push(' </dependencies>');
429
+ }
430
+
431
+ parts.push('</team-bundle>');
432
+
433
+ return parts.join('\n');
434
+ }
435
+
436
+ /**
437
+ * Pre-discover all agents and teams in a module for manifest generation
438
+ */
439
+ async preDiscoverModule(moduleName) {
440
+ const modulePath = path.join(this.modulesPath, moduleName);
441
+
442
+ // Clear any previously discovered agents for this module
443
+ this.discoveredAgents = this.discoveredAgents.filter((a) => a.module !== moduleName);
444
+
445
+ // Discover agents
446
+ const agentsPath = path.join(modulePath, 'agents');
447
+ if (await fs.pathExists(agentsPath)) {
448
+ const files = await fs.readdir(agentsPath);
449
+ for (const file of files) {
450
+ if (file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme'))) {
451
+ const agentPath = path.join(agentsPath, file);
452
+ let content;
453
+
454
+ if (file.endsWith('.agent.yaml')) {
455
+ // Build YAML agent in-memory
456
+ content = await this.yamlBuilder.buildFromYaml(agentPath, null, {
457
+ includeMetadata: false,
458
+ });
459
+ } else {
460
+ // Read legacy MD agent
461
+ content = await fs.readFile(agentPath, 'utf8');
462
+ }
463
+
464
+ const agentXml = this.extractAgentXml(content);
465
+
466
+ if (agentXml) {
467
+ // Skip agents with bundle="false"
468
+ if (this.shouldSkipBundling(agentXml)) {
469
+ continue;
470
+ }
471
+
472
+ const agentName = file.endsWith('.agent.yaml') ? path.basename(file, '.agent.yaml') : path.basename(file, '.md');
473
+ // Use the shared generator to extract agent details (pass full content)
474
+ const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
475
+ if (agentDetails) {
476
+ this.discoveredAgents.push(agentDetails);
477
+ }
478
+ }
479
+ }
480
+ }
481
+ }
482
+
483
+ // TODO: Discover teams when implemented
484
+ }
485
+
486
+ /**
487
+ * Extract agent XML from markdown content
488
+ */
489
+ extractAgentXml(content) {
490
+ // Try 4 backticks first (can contain 3 backtick blocks inside)
491
+ let match = content.match(/````xml\s*([\s\S]*?)````/);
492
+ if (!match) {
493
+ // Fall back to 3 backticks if no 4-backtick block found
494
+ match = content.match(/```xml\s*([\s\S]*?)```/);
495
+ }
496
+
497
+ if (match) {
498
+ const xmlContent = match[1];
499
+ const agentMatch = xmlContent.match(/<agent[^>]*>[\s\S]*?<\/agent>/);
500
+ return agentMatch ? agentMatch[0] : null;
501
+ }
502
+
503
+ // Fall back to direct extraction
504
+ match = content.match(/<agent[^>]*>[\s\S]*?<\/agent>/);
505
+ return match ? match[0] : null;
506
+ }
507
+
508
+ /**
509
+ * Resolve all dependencies for an agent
510
+ */
511
+ async resolveAgentDependencies(agentXml, moduleName, warnings = []) {
512
+ const dependencies = new Map();
513
+ const processed = new Set();
514
+ const skippedWorkflows = [];
515
+
516
+ // Extract file references from agent XML
517
+ const { refs, workflowRefs } = this.extractFileReferences(agentXml);
518
+
519
+ // Process regular file references
520
+ for (const ref of refs) {
521
+ await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
522
+ }
523
+
524
+ // Process workflow references with special handling
525
+ for (const workflowRef of workflowRefs) {
526
+ const result = await this.processWorkflowDependency(workflowRef, dependencies, processed, moduleName, warnings);
527
+ if (result && result.skipped) {
528
+ skippedWorkflows.push(workflowRef);
529
+ }
530
+ }
531
+
532
+ return { dependencies, skippedWorkflows };
533
+ }
534
+
535
+ /**
536
+ * Extract file references from agent XML
537
+ */
538
+ extractFileReferences(xml) {
539
+ const refs = new Set();
540
+ const workflowRefs = new Set();
541
+
542
+ // Match various file reference patterns
543
+ const patterns = [
544
+ /exec="([^"]+)"/g, // Command exec paths
545
+ /tmpl="([^"]+)"/g, // Template paths
546
+ /data="([^"]+)"/g, // Data file paths
547
+ /file="([^"]+)"/g, // Generic file refs
548
+ /src="([^"]+)"/g, // Source paths
549
+ /system-prompts="([^"]+)"/g,
550
+ /tools="([^"]+)"/g,
551
+ /knowledge="([^"]+)"/g,
552
+ /{project-root}\/([^"'\s<>]+)/g,
553
+ ];
554
+
555
+ for (const pattern of patterns) {
556
+ let match;
557
+ while ((match = pattern.exec(xml)) !== null) {
558
+ let filePath = match[1];
559
+ // Remove {project-root} prefix if present
560
+ filePath = filePath.replace(/^{project-root}\//, '');
561
+
562
+ // Skip obvious placeholder/example paths
563
+ if (filePath && !filePath.includes('path/to/') && !filePath.includes('example')) {
564
+ refs.add(filePath);
565
+ }
566
+ }
567
+ }
568
+
569
+ // Extract workflow references - both 'workflow' and 'run-workflow' attributes
570
+ const workflowPatterns = [
571
+ /workflow="([^"]+)"/g, // Menu items with workflow attribute
572
+ /run-workflow="([^"]+)"/g, // Commands with run-workflow attribute
573
+ /validate-workflow="([^"]+)"/g, // Validation workflow references
574
+ ];
575
+
576
+ for (const pattern of workflowPatterns) {
577
+ let match;
578
+ while ((match = pattern.exec(xml)) !== null) {
579
+ let workflowPath = match[1];
580
+ workflowPath = workflowPath.replace(/^{project-root}\//, '');
581
+
582
+ // Skip obvious placeholder/example paths
583
+ if (workflowPath && workflowPath.endsWith('.yaml') && !workflowPath.includes('path/to/') && !workflowPath.includes('example')) {
584
+ workflowRefs.add(workflowPath);
585
+ }
586
+ }
587
+ }
588
+
589
+ return { refs: [...refs], workflowRefs: [...workflowRefs] };
590
+ }
591
+
592
+ /**
593
+ * Remove commands from agent XML that reference skipped workflows
594
+ */
595
+ removeSkippedWorkflowCommands(agentXml, skippedWorkflows) {
596
+ let modifiedXml = agentXml;
597
+
598
+ // For each skipped workflow, find and remove the corresponding <c> command
599
+ for (const workflowPath of skippedWorkflows) {
600
+ // Match: <c cmd="..." run-workflow="workflowPath">...</c>
601
+ // Need to escape special regex characters in the path
602
+ const escapedPath = workflowPath.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
603
+
604
+ // Pattern to match the command line with this workflow
605
+ const pattern = new RegExp(`\\s*<c\\s+cmd="[^"]*"\\s+run-workflow="[^"]*${escapedPath}"[^>]*>.*?</c>\\s*`, 'gs');
606
+
607
+ modifiedXml = modifiedXml.replace(pattern, '');
608
+ }
609
+
610
+ return modifiedXml;
611
+ }
612
+
613
+ /**
614
+ * Process a file dependency recursively
615
+ */
616
+ async processFileDependency(filePath, dependencies, processed, moduleName, warnings = []) {
617
+ // Skip if already processed
618
+ if (processed.has(filePath)) {
619
+ return;
620
+ }
621
+ processed.add(filePath);
622
+
623
+ // Skip agent-manifest.csv manifest for web bundles (agents are already bundled)
624
+ if (filePath === 'bmad/_cfg/agent-manifest.csv' || filePath.endsWith('/agent-manifest.csv')) {
625
+ return;
626
+ }
627
+
628
+ // Handle wildcard patterns
629
+ if (filePath.includes('*')) {
630
+ await this.processWildcardDependency(filePath, dependencies, processed, moduleName, warnings);
631
+ return;
632
+ }
633
+
634
+ // Resolve actual file path
635
+ const actualPath = this.resolveFilePath(filePath, moduleName);
636
+
637
+ if (!actualPath || !(await fs.pathExists(actualPath))) {
638
+ warnings.push(filePath);
639
+ return;
640
+ }
641
+
642
+ // Read file content
643
+ let content = await fs.readFile(actualPath, 'utf8');
644
+
645
+ // Process {project-root} references
646
+ content = this.processProjectRootReferences(content);
647
+
648
+ // Extract dependencies from frontmatter if present
649
+ const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
650
+ if (frontmatterMatch) {
651
+ const frontmatter = frontmatterMatch[1];
652
+ // Look for dependencies in frontmatter
653
+ const depMatch = frontmatter.match(/dependencies:\s*\[(.*?)\]/);
654
+ if (depMatch) {
655
+ const deps = depMatch[1].match(/['"]([^'"]+)['"]/g);
656
+ if (deps) {
657
+ for (const dep of deps) {
658
+ const depPath = dep.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
659
+ if (depPath && !processed.has(depPath)) {
660
+ await this.processFileDependency(depPath, dependencies, processed, moduleName, warnings);
661
+ }
662
+ }
663
+ }
664
+ }
665
+ // Look for template references
666
+ const templateMatch = frontmatter.match(/template:\s*\[(.*?)\]/);
667
+ if (templateMatch) {
668
+ const templates = templateMatch[1].match(/['"]([^'"]+)['"]/g);
669
+ if (templates) {
670
+ for (const template of templates) {
671
+ const templatePath = template.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
672
+ if (templatePath && !processed.has(templatePath)) {
673
+ await this.processFileDependency(templatePath, dependencies, processed, moduleName, warnings);
674
+ }
675
+ }
676
+ }
677
+ }
678
+ }
679
+
680
+ // Extract XML from markdown if applicable
681
+ const ext = path.extname(actualPath).toLowerCase();
682
+ let processedContent = content;
683
+
684
+ switch (ext) {
685
+ case '.md': {
686
+ // Try to extract XML from markdown - handle both 3 and 4 backtick blocks
687
+ // First try 4 backticks (which can contain 3 backtick blocks inside)
688
+ let xmlMatches = [...content.matchAll(/````xml\s*([\s\S]*?)````/g)];
689
+
690
+ // If no 4-backtick blocks, try 3 backticks
691
+ if (xmlMatches.length === 0) {
692
+ xmlMatches = [...content.matchAll(/```xml\s*([\s\S]*?)```/g)];
693
+ }
694
+
695
+ const xmlBlocks = [];
696
+
697
+ for (const match of xmlMatches) {
698
+ if (match[1]) {
699
+ xmlBlocks.push(match[1].trim());
700
+ }
701
+ }
702
+
703
+ if (xmlBlocks.length > 0) {
704
+ // For XML content, just include it directly (it's already valid XML)
705
+ processedContent = xmlBlocks.join('\n\n');
706
+ } else {
707
+ // No XML blocks found, skip non-XML markdown files
708
+ return;
709
+ }
710
+
711
+ break;
712
+ }
713
+ case '.csv': {
714
+ // CSV files need special handling - convert to XML file-index
715
+ const lines = content.split('\n').filter((line) => line.trim());
716
+ if (lines.length === 0) return;
717
+
718
+ const headers = lines[0].split(',').map((h) => h.trim());
719
+ const rows = lines.slice(1);
720
+
721
+ const indexParts = [`<file-index id="${filePath}">`];
722
+ indexParts.push(' <items>');
723
+
724
+ // Track files referenced in CSV for additional bundling
725
+ const referencedFiles = new Set();
726
+
727
+ for (const row of rows) {
728
+ const values = row.split(',').map((v) => v.trim());
729
+ if (values.every((v) => !v)) continue;
730
+
731
+ indexParts.push(' <item>');
732
+ for (const [i, header] of headers.entries()) {
733
+ const value = values[i] || '';
734
+ const tagName = header.toLowerCase().replaceAll(/[^a-z0-9]/g, '_');
735
+ indexParts.push(` <${tagName}>${value}</${tagName}>`);
736
+
737
+ // Track referenced files
738
+ if (header.toLowerCase().includes('file') && value.endsWith('.md')) {
739
+ // Build path relative to CSV location
740
+ const csvDir = path.dirname(actualPath);
741
+ const refPath = path.join(csvDir, value);
742
+ if (fs.existsSync(refPath)) {
743
+ const refId = filePath.replace('index.csv', value);
744
+ referencedFiles.add(refId);
745
+ }
746
+ }
747
+ }
748
+ indexParts.push(' </item>');
749
+ }
750
+
751
+ indexParts.push(' </items>', '</file-index>');
752
+
753
+ // Store the XML version wrapped in a file element
754
+ const csvXml = indexParts.join('\n');
755
+ const wrappedCsv = `<file id="${filePath}" type="xml">\n${csvXml}\n</file>`;
756
+ dependencies.set(filePath, wrappedCsv);
757
+
758
+ // Process referenced files from CSV
759
+ for (const refId of referencedFiles) {
760
+ if (!processed.has(refId)) {
761
+ await this.processFileDependency(refId, dependencies, processed, moduleName, warnings);
762
+ }
763
+ }
764
+
765
+ return;
766
+ }
767
+ case '.xml': {
768
+ // XML files can be included directly
769
+ processedContent = content;
770
+ break;
771
+ }
772
+ default: {
773
+ // For other non-XML file types, skip them
774
+ return;
775
+ }
776
+ }
777
+
778
+ // Determine file type for wrapping
779
+ let fileType = 'text';
780
+ if (ext === '.xml' || (ext === '.md' && processedContent.trim().startsWith('<'))) {
781
+ fileType = 'xml';
782
+ } else
783
+ switch (ext) {
784
+ case '.yaml':
785
+ case '.yml': {
786
+ fileType = 'yaml';
787
+
788
+ break;
789
+ }
790
+ case '.json': {
791
+ fileType = 'json';
792
+
793
+ break;
794
+ }
795
+ case '.md': {
796
+ fileType = 'md';
797
+
798
+ break;
799
+ }
800
+ // No default
801
+ }
802
+
803
+ // Wrap content in file element and store
804
+ const wrappedContent = this.wrapContentInXml(processedContent, filePath, fileType);
805
+ dependencies.set(filePath, wrappedContent);
806
+
807
+ // Recursively scan for more dependencies
808
+ const { refs: nestedRefs } = this.extractFileReferences(processedContent);
809
+ for (const ref of nestedRefs) {
810
+ await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
811
+ }
812
+ }
813
+
814
+ /**
815
+ * Process a workflow YAML file and its bundle files
816
+ */
817
+ async processWorkflowDependency(workflowPath, dependencies, processed, moduleName, warnings = []) {
818
+ // Skip if already processed
819
+ if (processed.has(workflowPath)) {
820
+ return { skipped: false };
821
+ }
822
+ processed.add(workflowPath);
823
+
824
+ // Resolve actual file path
825
+ const actualPath = this.resolveFilePath(workflowPath, moduleName);
826
+
827
+ if (!actualPath || !(await fs.pathExists(actualPath))) {
828
+ warnings.push(workflowPath);
829
+ return { skipped: true };
830
+ }
831
+
832
+ // Read and parse YAML file
833
+ const yamlContent = await fs.readFile(actualPath, 'utf8');
834
+ let workflowConfig;
835
+
836
+ try {
837
+ workflowConfig = yaml.load(yamlContent);
838
+ } catch (error) {
839
+ warnings.push(`${workflowPath} (invalid YAML: ${error.message})`);
840
+ return { skipped: true };
841
+ }
842
+
843
+ // Check if web_bundle is explicitly set to false
844
+ if (workflowConfig.web_bundle === false) {
845
+ // Mark this workflow as skipped so we can remove the command from agent
846
+ return { skipped: true, workflowPath };
847
+ }
848
+
849
+ // Create YAML content with only web_bundle section (flattened)
850
+ let bundleYamlContent;
851
+ if (workflowConfig.web_bundle && typeof workflowConfig.web_bundle === 'object') {
852
+ // Only include the web_bundle content, flattened to root level
853
+ bundleYamlContent = yaml.dump(workflowConfig.web_bundle);
854
+ } else {
855
+ // If no web_bundle section, include full YAML
856
+ bundleYamlContent = yamlContent;
857
+ }
858
+
859
+ // Include the YAML file with only web_bundle content, wrapped in XML
860
+ const yamlId = workflowPath.replace(/^{project-root}\//, '');
861
+ const wrappedYaml = this.wrapContentInXml(bundleYamlContent, yamlId, 'yaml');
862
+ dependencies.set(yamlId, wrappedYaml);
863
+
864
+ // Always include core workflow task when processing workflows
865
+ await this.includeCoreWorkflowFiles(dependencies, processed, moduleName, warnings);
866
+
867
+ // Check if advanced elicitation is enabled
868
+ if (workflowConfig.web_bundle && workflowConfig.web_bundle.use_advanced_elicitation) {
869
+ await this.includeAdvancedElicitationFiles(dependencies, processed, moduleName, warnings);
870
+ }
871
+
872
+ // Process web_bundle_files if they exist
873
+ if (workflowConfig.web_bundle && workflowConfig.web_bundle.web_bundle_files) {
874
+ const bundleFiles = workflowConfig.web_bundle.web_bundle_files;
875
+
876
+ for (const bundleFilePath of bundleFiles) {
877
+ if (processed.has(bundleFilePath)) {
878
+ continue;
879
+ }
880
+
881
+ const bundleActualPath = this.resolveFilePath(bundleFilePath, moduleName);
882
+
883
+ if (!bundleActualPath || !(await fs.pathExists(bundleActualPath))) {
884
+ warnings.push(bundleFilePath);
885
+ continue;
886
+ }
887
+
888
+ // Check if this is another workflow.yaml file - if so, recursively process it
889
+ if (bundleFilePath.endsWith('workflow.yaml')) {
890
+ // Recursively process this workflow and its dependencies
891
+ await this.processWorkflowDependency(bundleFilePath, dependencies, processed, moduleName, warnings);
892
+ } else {
893
+ // Regular file - process normally
894
+ processed.add(bundleFilePath);
895
+
896
+ // Read the file content
897
+ const fileContent = await fs.readFile(bundleActualPath, 'utf8');
898
+ const fileExt = path.extname(bundleActualPath).toLowerCase().replace('.', '');
899
+
900
+ // Wrap in XML with proper escaping
901
+ const wrappedContent = this.wrapContentInXml(fileContent, bundleFilePath, fileExt);
902
+ dependencies.set(bundleFilePath, wrappedContent);
903
+ }
904
+ }
905
+ }
906
+
907
+ return { skipped: false };
908
+ }
909
+
910
+ /**
911
+ * Include core workflow task files
912
+ */
913
+ async includeCoreWorkflowFiles(dependencies, processed, moduleName, warnings = []) {
914
+ const coreWorkflowPath = 'bmad/core/tasks/workflow.xml';
915
+
916
+ if (processed.has(coreWorkflowPath)) {
917
+ return;
918
+ }
919
+ processed.add(coreWorkflowPath);
920
+
921
+ const actualPath = this.resolveFilePath(coreWorkflowPath, moduleName);
922
+
923
+ if (!actualPath || !(await fs.pathExists(actualPath))) {
924
+ warnings.push(coreWorkflowPath);
925
+ return;
926
+ }
927
+
928
+ const fileContent = await fs.readFile(actualPath, 'utf8');
929
+ const wrappedContent = this.wrapContentInXml(fileContent, coreWorkflowPath, 'xml');
930
+ dependencies.set(coreWorkflowPath, wrappedContent);
931
+ }
932
+
933
+ /**
934
+ * Include advanced elicitation files
935
+ */
936
+ async includeAdvancedElicitationFiles(dependencies, processed, moduleName, warnings = []) {
937
+ const elicitationFiles = ['bmad/core/tasks/adv-elicit.xml', 'bmad/core/tasks/adv-elicit-methods.csv'];
938
+
939
+ for (const filePath of elicitationFiles) {
940
+ if (processed.has(filePath)) {
941
+ continue;
942
+ }
943
+ processed.add(filePath);
944
+
945
+ const actualPath = this.resolveFilePath(filePath, moduleName);
946
+
947
+ if (!actualPath || !(await fs.pathExists(actualPath))) {
948
+ warnings.push(filePath);
949
+ continue;
950
+ }
951
+
952
+ const fileContent = await fs.readFile(actualPath, 'utf8');
953
+ const fileExt = path.extname(actualPath).toLowerCase().replace('.', '');
954
+ const wrappedContent = this.wrapContentInXml(fileContent, filePath, fileExt);
955
+ dependencies.set(filePath, wrappedContent);
956
+ }
957
+ }
958
+
959
+ /**
960
+ * Wrap file content in XML with proper escaping
961
+ */
962
+ wrapContentInXml(content, id, type = 'text') {
963
+ // For XML files, include directly without CDATA (they're already valid XML)
964
+ if (type === 'xml') {
965
+ // XML files can be included directly as they're already well-formed
966
+ // Just wrap in a file element
967
+ return `<file id="${id}" type="${type}">\n${content}\n</file>`;
968
+ }
969
+
970
+ // For all other file types, use CDATA to preserve content exactly
971
+ // Escape any ]]> sequences in the content by splitting CDATA sections
972
+ // Replace ]]> with ]]]]><![CDATA[> to properly escape it within CDATA
973
+ const escapedContent = content.replaceAll(']]>', ']]]]><![CDATA[>');
974
+
975
+ // Use CDATA to preserve content exactly as-is, including special characters
976
+ return `<file id="${id}" type="${type}"><![CDATA[${escapedContent}]]></file>`;
977
+ }
978
+
979
+ /**
980
+ * Process wildcard dependency patterns
981
+ */
982
+ async processWildcardDependency(pattern, dependencies, processed, moduleName, warnings = []) {
983
+ // Remove {project-root} prefix
984
+ pattern = pattern.replace(/^{project-root}\//, '');
985
+
986
+ // Get directory and file pattern
987
+ const lastSlash = pattern.lastIndexOf('/');
988
+ const dirPath = pattern.slice(0, Math.max(0, lastSlash));
989
+ const filePattern = pattern.slice(Math.max(0, lastSlash + 1));
990
+
991
+ // Resolve directory path without checking file existence
992
+ let dir;
993
+ if (dirPath.startsWith('bmad/')) {
994
+ // Remove bmad/ prefix
995
+ const actualPath = dirPath.replace(/^bmad\//, '');
996
+
997
+ // Try different path mappings for directories
998
+ const possibleDirs = [
999
+ // Try as module path: bmad/cis/... -> src/modules/cis/...
1000
+ path.join(this.sourceDir, 'modules', actualPath),
1001
+ // Try as direct path: bmad/core/... -> src/core/...
1002
+ path.join(this.sourceDir, actualPath),
1003
+ ];
1004
+
1005
+ for (const testDir of possibleDirs) {
1006
+ if (fs.existsSync(testDir)) {
1007
+ dir = testDir;
1008
+ break;
1009
+ }
1010
+ }
1011
+ }
1012
+
1013
+ if (!dir) {
1014
+ warnings.push(`${pattern} (could not resolve directory)`);
1015
+ return;
1016
+ }
1017
+ if (!(await fs.pathExists(dir))) {
1018
+ warnings.push(pattern);
1019
+ return;
1020
+ }
1021
+
1022
+ // Read directory and match files
1023
+ const files = await fs.readdir(dir);
1024
+ let matchedFiles = [];
1025
+
1026
+ if (filePattern === '*.*') {
1027
+ matchedFiles = files;
1028
+ } else if (filePattern.startsWith('*.')) {
1029
+ const ext = filePattern.slice(1);
1030
+ matchedFiles = files.filter((f) => f.endsWith(ext));
1031
+ } else {
1032
+ // Simple glob matching
1033
+ const regex = new RegExp('^' + filePattern.replace('*', '.*') + '$');
1034
+ matchedFiles = files.filter((f) => regex.test(f));
1035
+ }
1036
+
1037
+ // Process each matched file
1038
+ for (const file of matchedFiles) {
1039
+ const fullPath = dirPath + '/' + file;
1040
+ if (!processed.has(fullPath)) {
1041
+ await this.processFileDependency(fullPath, dependencies, processed, moduleName, warnings);
1042
+ }
1043
+ }
1044
+ }
1045
+
1046
+ /**
1047
+ * Resolve file path relative to project
1048
+ */
1049
+ resolveFilePath(filePath, moduleName) {
1050
+ // Remove {project-root} prefix
1051
+ filePath = filePath.replace(/^{project-root}\//, '');
1052
+
1053
+ // Check temp directory first for _cfg files
1054
+ if (filePath.startsWith('bmad/_cfg/')) {
1055
+ const filename = filePath.split('/').pop();
1056
+ const tempPath = path.join(this.tempManifestDir, filename);
1057
+ if (fs.existsSync(tempPath)) {
1058
+ return tempPath;
1059
+ }
1060
+ }
1061
+
1062
+ // Handle different path patterns for bmad files
1063
+ // bmad/cis/tasks/brain-session.md -> src/modules/cis/tasks/brain-session.md
1064
+ // bmad/core/tasks/create-doc.md -> src/core/tasks/create-doc.md
1065
+ // bmad/bmm/templates/brief.md -> src/modules/bmm/templates/brief.md
1066
+
1067
+ let actualPath = filePath;
1068
+
1069
+ if (filePath.startsWith('bmad/')) {
1070
+ // Remove bmad/ prefix
1071
+ actualPath = filePath.replace(/^bmad\//, '');
1072
+
1073
+ // Check if it's a module-specific file (cis, bmm, etc) or core file
1074
+ const parts = actualPath.split('/');
1075
+ const firstPart = parts[0];
1076
+
1077
+ // Try different path mappings
1078
+ const possiblePaths = [
1079
+ // Try in temp directory first
1080
+ path.join(this.tempDir, filePath),
1081
+ // Try as module path: bmad/cis/... -> src/modules/cis/...
1082
+ path.join(this.sourceDir, 'modules', actualPath),
1083
+ // Try as direct path: bmad/core/... -> src/core/...
1084
+ path.join(this.sourceDir, actualPath),
1085
+ // Try without any prefix in src
1086
+ path.join(this.sourceDir, parts.slice(1).join('/')),
1087
+ // Try in project root
1088
+ path.join(this.sourceDir, '..', actualPath),
1089
+ // Try original with bmad
1090
+ path.join(this.sourceDir, '..', filePath),
1091
+ ];
1092
+
1093
+ for (const testPath of possiblePaths) {
1094
+ if (fs.existsSync(testPath)) {
1095
+ return testPath;
1096
+ }
1097
+ }
1098
+ }
1099
+
1100
+ // Try standard paths for non-bmad files
1101
+ const basePaths = [
1102
+ this.sourceDir, // src directory
1103
+ path.join(this.modulesPath, moduleName), // Current module
1104
+ path.join(this.sourceDir, '..'), // Project root
1105
+ ];
1106
+
1107
+ for (const basePath of basePaths) {
1108
+ const fullPath = path.join(basePath, actualPath);
1109
+ if (fs.existsSync(fullPath)) {
1110
+ return fullPath;
1111
+ }
1112
+ }
1113
+
1114
+ return null;
1115
+ }
1116
+
1117
+ /**
1118
+ * Process and remove {project-root} references
1119
+ */
1120
+ processProjectRootReferences(content) {
1121
+ // Remove {project-root}/ prefix (with slash)
1122
+ content = content.replaceAll('{project-root}/', '');
1123
+ // Also remove {project-root} without slash
1124
+ content = content.replaceAll('{project-root}', '');
1125
+ return content;
1126
+ }
1127
+
1128
+ /**
1129
+ * Escape special XML characters in text content
1130
+ */
1131
+ escapeXmlText(text) {
1132
+ return text
1133
+ .replaceAll('&', '&amp;')
1134
+ .replaceAll('<', '&lt;')
1135
+ .replaceAll('>', '&gt;')
1136
+ .replaceAll('"', '&quot;')
1137
+ .replaceAll("'", '&apos;');
1138
+ }
1139
+
1140
+ /**
1141
+ * Escape XML content while preserving XML tags
1142
+ */
1143
+ escapeXmlContent(content) {
1144
+ const tagPattern = /<([^>]+)>/g;
1145
+ const parts = [];
1146
+ let lastIndex = 0;
1147
+ let match;
1148
+
1149
+ while ((match = tagPattern.exec(content)) !== null) {
1150
+ if (match.index > lastIndex) {
1151
+ parts.push(this.escapeXmlText(content.slice(lastIndex, match.index)));
1152
+ }
1153
+ parts.push('<' + match[1] + '>');
1154
+ lastIndex = match.index + match[0].length;
1155
+ }
1156
+
1157
+ if (lastIndex < content.length) {
1158
+ parts.push(this.escapeXmlText(content.slice(lastIndex)));
1159
+ }
1160
+
1161
+ return parts.join('');
1162
+ }
1163
+
1164
+ /**
1165
+ * Inject help and exit menu items into agent XML
1166
+ */
1167
+ injectHelpExitMenuItems(agentXml) {
1168
+ // Check if menu already has help and exit
1169
+ const hasHelp = agentXml.includes('cmd="*help"') || agentXml.includes('trigger="*help"');
1170
+ const hasExit = agentXml.includes('cmd="*exit"') || agentXml.includes('trigger="*exit"');
1171
+
1172
+ if (hasHelp && hasExit) {
1173
+ return agentXml; // Already has both, skip injection
1174
+ }
1175
+
1176
+ // Find the menu section
1177
+ const menuMatch = agentXml.match(/(<menu>[\s\S]*?<\/menu>)/);
1178
+ if (!menuMatch) {
1179
+ return agentXml; // No menu found, skip injection
1180
+ }
1181
+
1182
+ const menuContent = menuMatch[1];
1183
+ const menuClosingMatch = menuContent.match(/(\s*)<\/menu>/);
1184
+ if (!menuClosingMatch) {
1185
+ return agentXml;
1186
+ }
1187
+
1188
+ const indent = menuClosingMatch[1];
1189
+ const menuItems = [];
1190
+
1191
+ if (!hasHelp) {
1192
+ menuItems.push(`${indent}<item cmd="*help">Show numbered menu</item>`);
1193
+ }
1194
+
1195
+ if (!hasExit) {
1196
+ menuItems.push(`${indent}<item cmd="*exit">Exit with confirmation</item>`);
1197
+ }
1198
+
1199
+ if (menuItems.length === 0) {
1200
+ return agentXml;
1201
+ }
1202
+
1203
+ // Inject menu items before closing </menu> tag
1204
+ const newMenuContent = menuContent.replace(/(\s*)<\/menu>/, `\n${menuItems.join('\n')}\n${indent}</menu>`);
1205
+ return agentXml.replace(menuContent, newMenuContent);
1206
+ }
1207
+
1208
+ /**
1209
+ * Inject web activation instructions into agent XML
1210
+ */
1211
+ injectWebActivation(agentXml) {
1212
+ // First, always inject help/exit menu items
1213
+ agentXml = this.injectHelpExitMenuItems(agentXml);
1214
+
1215
+ // Load the web activation template
1216
+ const activationPath = path.join(this.sourceDir, 'utility', 'models', 'agent-activation-web.xml');
1217
+
1218
+ if (!fs.existsSync(activationPath)) {
1219
+ console.warn(chalk.yellow('Warning: agent-activation-web.xml not found, skipping activation injection'));
1220
+ return agentXml;
1221
+ }
1222
+
1223
+ const activationXml = fs.readFileSync(activationPath, 'utf8');
1224
+
1225
+ // For web bundles, ALWAYS replace existing activation with web activation
1226
+ // This is because fragment-based activation assumes filesystem access which won't work in web bundles
1227
+ const hasActivation = agentXml.includes('<activation');
1228
+
1229
+ if (hasActivation) {
1230
+ // Replace existing activation block with web activation
1231
+ const injectedXml = agentXml.replace(/<activation[^>]*>[\s\S]*?<\/activation>/, activationXml);
1232
+ return injectedXml;
1233
+ }
1234
+
1235
+ // Check for critical-actions block (legacy)
1236
+ const hasCriticalActions = agentXml.includes('<critical-actions');
1237
+
1238
+ if (hasCriticalActions) {
1239
+ // Replace critical-actions block with activation
1240
+ const injectedXml = agentXml.replace(/<critical-actions>[\s\S]*?<\/critical-actions>/, activationXml);
1241
+ return injectedXml;
1242
+ }
1243
+
1244
+ // If no critical-actions, inject before closing </agent> tag
1245
+ const closingTagMatch = agentXml.match(/(\s*)<\/agent>/);
1246
+ if (!closingTagMatch) {
1247
+ console.warn(chalk.yellow('Warning: Could not find </agent> tag for activation injection'));
1248
+ return agentXml;
1249
+ }
1250
+
1251
+ // Inject the activation block before the closing </agent> tag
1252
+ // Properly indent each line of the activation XML
1253
+ const indent = closingTagMatch[1];
1254
+ const indentedActivation = activationXml
1255
+ .split('\n')
1256
+ .map((line) => (line.trim() ? indent + line : ''))
1257
+ .join('\n');
1258
+
1259
+ const injectedXml = agentXml.replace(/(\s*)<\/agent>/, `\n${indentedActivation}\n${indent}</agent>`);
1260
+
1261
+ return injectedXml;
1262
+ }
1263
+
1264
+ /**
1265
+ * Build the final agent bundle XML
1266
+ */
1267
+ buildAgentBundle(agentXml, dependencies) {
1268
+ // Web activation is now handled by fragments during YAML building
1269
+ // agentXml = this.injectWebActivation(agentXml);
1270
+
1271
+ const parts = [
1272
+ '<?xml version="1.0" encoding="UTF-8"?>',
1273
+ '<agent-bundle>',
1274
+ ' <!-- Agent Definition -->',
1275
+ ' ' + agentXml.replaceAll('\n', '\n '),
1276
+ ];
1277
+
1278
+ // Add dependencies (all are now consistently wrapped in <file> elements)
1279
+ if (dependencies && dependencies.size > 0) {
1280
+ parts.push('\n <!-- Dependencies -->');
1281
+ for (const [id, content] of dependencies) {
1282
+ // All dependencies are now wrapped in <file> elements
1283
+ // Indent properly
1284
+ const indentedContent = content
1285
+ .split('\n')
1286
+ .map((line) => ' ' + line)
1287
+ .join('\n');
1288
+ parts.push(indentedContent);
1289
+ }
1290
+ }
1291
+
1292
+ parts.push('</agent-bundle>');
1293
+
1294
+ return parts.join('\n');
1295
+ }
1296
+
1297
+ /**
1298
+ * Discover all modules
1299
+ */
1300
+ async discoverModules() {
1301
+ const modules = [];
1302
+
1303
+ if (!(await fs.pathExists(this.modulesPath))) {
1304
+ console.log(chalk.yellow('No modules directory found'));
1305
+ return modules;
1306
+ }
1307
+
1308
+ const entries = await fs.readdir(this.modulesPath, { withFileTypes: true });
1309
+
1310
+ for (const entry of entries) {
1311
+ if (entry.isDirectory()) {
1312
+ modules.push(entry.name);
1313
+ }
1314
+ }
1315
+
1316
+ return modules;
1317
+ }
1318
+
1319
+ /**
1320
+ * Discover agents in a module
1321
+ */
1322
+ async discoverAgents(modulePath) {
1323
+ const agents = [];
1324
+ const agentsPath = path.join(modulePath, 'agents');
1325
+
1326
+ if (!(await fs.pathExists(agentsPath))) {
1327
+ return agents;
1328
+ }
1329
+
1330
+ const files = await fs.readdir(agentsPath);
1331
+
1332
+ for (const file of files) {
1333
+ // Look for .agent.yaml files (new format) or .md files (legacy format)
1334
+ if (file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme'))) {
1335
+ agents.push(file);
1336
+ }
1337
+ }
1338
+
1339
+ return agents;
1340
+ }
1341
+
1342
+ /**
1343
+ * Discover all teams in a module
1344
+ */
1345
+ async discoverTeams(modulePath) {
1346
+ const teams = [];
1347
+ const teamsPath = path.join(modulePath, 'teams');
1348
+
1349
+ if (!(await fs.pathExists(teamsPath))) {
1350
+ return teams;
1351
+ }
1352
+
1353
+ const files = await fs.readdir(teamsPath);
1354
+
1355
+ for (const file of files) {
1356
+ if (file.endsWith('.yaml') || file.endsWith('.yml')) {
1357
+ teams.push(file);
1358
+ }
1359
+ }
1360
+
1361
+ return teams;
1362
+ }
1363
+
1364
+ /**
1365
+ * Extract agent name from XML
1366
+ */
1367
+ getAgentName(xml) {
1368
+ const match = xml.match(/<agent[^>]*name="([^"]+)"/);
1369
+ return match ? match[1] : 'Unknown';
1370
+ }
1371
+
1372
+ /**
1373
+ * Extract agent description from XML
1374
+ */
1375
+ getAgentDescription(xml) {
1376
+ const match = xml.match(/<description>([^<]+)<\/description>/);
1377
+ return match ? match[1] : '';
1378
+ }
1379
+
1380
+ /**
1381
+ * Check if agent should be skipped for bundling
1382
+ */
1383
+ shouldSkipBundling(xml) {
1384
+ // Check for bundle="false" attribute in the agent tag
1385
+ const match = xml.match(/<agent[^>]*bundle="false"[^>]*>/);
1386
+ return match !== null;
1387
+ }
1388
+
1389
+ /**
1390
+ * Create temporary manifest files
1391
+ */
1392
+ async createTempManifests() {
1393
+ // Ensure temp directory exists
1394
+ await fs.ensureDir(this.tempManifestDir);
1395
+
1396
+ // Generate agent-manifest.csv using shared generator
1397
+ const agentPartyPath = path.join(this.tempManifestDir, 'agent-manifest.csv');
1398
+ await AgentPartyGenerator.writeAgentParty(agentPartyPath, this.discoveredAgents, { forWeb: true });
1399
+
1400
+ console.log(chalk.dim(' ✓ Created temporary manifest files'));
1401
+ }
1402
+
1403
+ /**
1404
+ * Clean up temporary files
1405
+ */
1406
+ async cleanupTempFiles() {
1407
+ if (await fs.pathExists(this.tempDir)) {
1408
+ await fs.remove(this.tempDir);
1409
+ console.log(chalk.dim('\n✓ Cleaned up temporary files'));
1410
+ }
1411
+ }
1412
+
1413
+ /**
1414
+ * Validate XML content
1415
+ */
1416
+ async validateXml(xmlContent) {
1417
+ try {
1418
+ await xml2js.parseStringPromise(xmlContent, {
1419
+ strict: true,
1420
+ explicitArray: false,
1421
+ });
1422
+ return true;
1423
+ } catch {
1424
+ return false;
1425
+ }
1426
+ }
1427
+
1428
+ /**
1429
+ * Display summary statistics
1430
+ */
1431
+ displaySummary() {
1432
+ console.log(chalk.cyan.bold('\n═══════════════════════════════════════════════'));
1433
+ console.log(chalk.cyan.bold(' SUMMARY'));
1434
+ console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
1435
+
1436
+ console.log(chalk.bold('Bundle Statistics:'));
1437
+ console.log(` Total agents found: ${this.stats.totalAgents}`);
1438
+ console.log(` Successfully bundled: ${chalk.green(this.stats.bundledAgents)}`);
1439
+ console.log(` Skipped (bundle=false): ${chalk.gray(this.stats.skippedAgents)}`);
1440
+
1441
+ if (this.stats.failedAgents > 0) {
1442
+ console.log(` Failed to bundle: ${chalk.red(this.stats.failedAgents)}`);
1443
+ }
1444
+
1445
+ if (this.stats.invalidXml > 0) {
1446
+ console.log(` Invalid XML bundles: ${chalk.yellow(this.stats.invalidXml)}`);
1447
+ }
1448
+
1449
+ // Display warnings summary
1450
+ if (this.stats.warnings.length > 0) {
1451
+ console.log(chalk.yellow('\n⚠ Missing Dependencies by Agent:'));
1452
+
1453
+ // Group and display warnings by agent
1454
+ for (const agentWarning of this.stats.warnings) {
1455
+ if (agentWarning && agentWarning.warnings && agentWarning.warnings.length > 0) {
1456
+ console.log(chalk.bold(`\n ${agentWarning.agent}:`));
1457
+ // Display unique warnings for this agent
1458
+ const uniqueWarnings = [...new Set(agentWarning.warnings)];
1459
+ for (const warning of uniqueWarnings) {
1460
+ console.log(chalk.dim(` • ${warning}`));
1461
+ }
1462
+ }
1463
+ }
1464
+ }
1465
+
1466
+ // Final status
1467
+ if (this.stats.invalidXml > 0) {
1468
+ console.log(chalk.yellow('\n⚠ Some bundles have invalid XML. Please review the output.'));
1469
+ } else if (this.stats.failedAgents > 0) {
1470
+ console.log(chalk.yellow('\n⚠ Some agents failed to bundle. Please review the errors.'));
1471
+ } else {
1472
+ console.log(chalk.green('\n✨ All bundles generated successfully!'));
1473
+ }
1474
+
1475
+ console.log(chalk.cyan.bold('\n═══════════════════════════════════════════════\n'));
1476
+ }
1477
+ }
1478
+
1479
+ module.exports = { WebBundler };