bmad-method 6.0.0-alpha.0 → 6.0.0-alpha.10

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 (704) hide show
  1. package/.github/ISSUE_TEMPLATE/config.yaml +4 -0
  2. package/.github/ISSUE_TEMPLATE/idea_submission.md +3 -3
  3. package/.github/workflows/bundle-latest.yaml +277 -0
  4. package/.github/workflows/manual-release.yaml +64 -17
  5. package/.github/workflows/quality.yaml +78 -0
  6. package/.husky/pre-commit +4 -0
  7. package/.prettierignore +6 -0
  8. package/.vscode/settings.json +3 -1
  9. package/CHANGELOG.md +1211 -2
  10. package/CONTRIBUTING.md +2 -13
  11. package/README.md +442 -0
  12. package/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
  13. package/docs/agent-customization-guide.md +208 -0
  14. package/docs/document-sharding-guide.md +449 -0
  15. package/docs/ide-info/auggie.md +2 -2
  16. package/docs/ide-info/claude-code.md +4 -4
  17. package/docs/ide-info/codex.md +9 -20
  18. package/docs/ide-info/crush.md +1 -1
  19. package/docs/ide-info/cursor.md +7 -7
  20. package/docs/ide-info/iflow.md +3 -3
  21. package/docs/ide-info/opencode.md +24 -0
  22. package/docs/index.md +227 -0
  23. package/docs/installers-bundlers/ide-injections.md +2 -12
  24. package/docs/installers-bundlers/installers-modules-platforms-reference.md +100 -67
  25. package/docs/v4-to-v6-upgrade.md +227 -0
  26. package/docs/web-bundles-gemini-gpt-guide.md +473 -0
  27. package/eslint.config.mjs +6 -2
  28. package/package.json +13 -6
  29. package/src/core/_module-installer/install-config.yaml +35 -0
  30. package/src/core/_module-installer/installer.js +1 -9
  31. package/src/core/agents/bmad-master.agent.yaml +39 -0
  32. package/src/core/agents/bmad-web-orchestrator.agent.xml +113 -0
  33. package/src/core/tasks/advanced-elicitation-methods.csv +21 -0
  34. package/src/core/tasks/{adv-elicit.md → advanced-elicitation.xml} +11 -14
  35. package/src/core/tasks/{index-docs.md → index-docs.xml} +6 -10
  36. package/src/core/tasks/{validate-workflow.md → validate-workflow.xml} +4 -7
  37. package/src/core/tasks/workflow.xml +270 -0
  38. package/src/core/tools/shard-doc.xml +109 -0
  39. package/src/{modules/cis → core}/workflows/brainstorming/README.md +8 -18
  40. package/src/{modules/cis → core}/workflows/brainstorming/instructions.md +29 -24
  41. package/src/{modules/cis → core}/workflows/brainstorming/template.md +6 -2
  42. package/src/{modules/cis → core}/workflows/brainstorming/workflow.yaml +17 -9
  43. package/src/core/workflows/party-mode/instructions.md +27 -25
  44. package/src/core/workflows/party-mode/workflow.yaml +14 -10
  45. package/src/modules/bmb/README.md +194 -0
  46. package/src/modules/bmb/_module-installer/install-config.yaml +31 -0
  47. package/src/modules/bmb/agents/bmad-builder.agent.yaml +57 -0
  48. package/src/modules/bmb/workflows/audit-workflow/checklist.md +142 -0
  49. package/src/modules/bmb/workflows/audit-workflow/instructions.md +341 -0
  50. package/src/modules/bmb/workflows/audit-workflow/template.md +118 -0
  51. package/src/modules/bmb/workflows/audit-workflow/workflow.yaml +25 -0
  52. package/src/modules/bmb/workflows/convert-legacy/README.md +34 -34
  53. package/src/modules/bmb/workflows/convert-legacy/checklist.md +22 -21
  54. package/src/modules/bmb/workflows/convert-legacy/instructions.md +135 -86
  55. package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +10 -15
  56. package/src/modules/bmb/workflows/create-agent/README.md +144 -209
  57. package/src/modules/bmb/workflows/create-agent/agent-architecture.md +68 -65
  58. package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +174 -172
  59. package/src/modules/bmb/workflows/create-agent/agent-types.md +139 -24
  60. package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +4 -4
  61. package/src/modules/bmb/workflows/create-agent/checklist.md +30 -102
  62. package/src/modules/bmb/workflows/create-agent/communication-styles.md +22 -60
  63. package/src/modules/bmb/workflows/create-agent/instructions.md +339 -221
  64. package/src/modules/bmb/workflows/create-agent/workflow.yaml +28 -19
  65. package/src/modules/bmb/workflows/create-module/README.md +164 -153
  66. package/src/modules/bmb/workflows/create-module/brainstorm-context.md +1 -1
  67. package/src/modules/bmb/workflows/create-module/checklist.md +21 -31
  68. package/src/modules/bmb/workflows/create-module/installer-templates/install-config.yaml +92 -0
  69. package/src/modules/bmb/workflows/create-module/installer-templates/installer.js +1 -1
  70. package/src/modules/bmb/workflows/create-module/instructions.md +306 -238
  71. package/src/modules/bmb/workflows/create-module/module-structure.md +135 -45
  72. package/src/modules/bmb/workflows/create-module/workflow.yaml +32 -27
  73. package/src/modules/bmb/workflows/create-workflow/README.md +70 -9
  74. package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +4 -4
  75. package/src/modules/bmb/workflows/create-workflow/checklist.md +22 -0
  76. package/src/modules/bmb/workflows/create-workflow/instructions.md +505 -47
  77. package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +939 -68
  78. package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +6 -3
  79. package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +31 -5
  80. package/src/modules/bmb/workflows/create-workflow/workflow.yaml +16 -17
  81. package/src/modules/bmb/workflows/edit-agent/README.md +112 -0
  82. package/src/modules/bmb/workflows/edit-agent/checklist.md +112 -0
  83. package/src/modules/bmb/workflows/edit-agent/instructions.md +290 -0
  84. package/src/modules/bmb/workflows/edit-agent/workflow.yaml +33 -0
  85. package/src/modules/bmb/workflows/edit-module/README.md +187 -0
  86. package/src/modules/bmb/workflows/edit-module/checklist.md +165 -0
  87. package/src/modules/bmb/workflows/edit-module/instructions.md +341 -0
  88. package/src/modules/bmb/workflows/edit-module/workflow.yaml +34 -0
  89. package/src/modules/bmb/workflows/edit-workflow/README.md +58 -2
  90. package/src/modules/bmb/workflows/edit-workflow/instructions.md +290 -118
  91. package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +9 -16
  92. package/src/modules/bmb/workflows/module-brief/README.md +17 -17
  93. package/src/modules/bmb/workflows/module-brief/checklist.md +6 -6
  94. package/src/modules/bmb/workflows/module-brief/instructions.md +10 -7
  95. package/src/modules/bmb/workflows/module-brief/template.md +9 -9
  96. package/src/modules/bmb/workflows/module-brief/workflow.yaml +16 -10
  97. package/src/modules/bmb/workflows/redoc/README.md +5 -5
  98. package/src/modules/bmb/workflows/redoc/checklist.md +2 -2
  99. package/src/modules/bmb/workflows/redoc/instructions.md +20 -10
  100. package/src/modules/bmb/workflows/redoc/workflow.yaml +6 -5
  101. package/src/modules/bmgd/README.md +208 -0
  102. package/src/modules/bmgd/_module-installer/install-config.yaml +54 -0
  103. package/src/modules/bmgd/agents/game-architect.agent.yaml +33 -0
  104. package/src/modules/bmgd/agents/game-designer.agent.yaml +40 -0
  105. package/src/modules/bmgd/agents/game-dev.agent.yaml +40 -0
  106. package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +75 -0
  107. package/src/modules/bmgd/teams/default-party.csv +10 -0
  108. package/src/modules/bmgd/teams/team-gamedev.yaml +18 -0
  109. package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-context.md +3 -3
  110. package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/instructions.md +130 -0
  111. package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.yaml +41 -0
  112. package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/checklist.md +2 -2
  113. package/src/modules/bmgd/workflows/1-preproduction/game-brief/instructions.md +373 -0
  114. package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/template.md +2 -2
  115. package/src/modules/bmgd/workflows/1-preproduction/game-brief/workflow.yaml +36 -0
  116. package/src/modules/bmgd/workflows/2-design/gdd/checklist.md +148 -0
  117. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/action-platformer.md +1 -1
  118. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/adventure.md +1 -1
  119. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/card-game.md +2 -2
  120. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/fighting.md +1 -1
  121. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/horror.md +2 -2
  122. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/idle-incremental.md +1 -1
  123. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/moba.md +4 -4
  124. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/party-game.md +1 -1
  125. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/racing.md +3 -3
  126. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/rhythm.md +1 -1
  127. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/roguelike.md +2 -2
  128. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/rpg.md +3 -3
  129. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/sandbox.md +4 -4
  130. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/shooter.md +3 -3
  131. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/simulation.md +3 -3
  132. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/sports.md +3 -3
  133. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/strategy.md +3 -3
  134. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/survival.md +2 -2
  135. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/text-based.md +3 -3
  136. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/tower-defense.md +5 -5
  137. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/turn-based-tactics.md +4 -4
  138. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/visual-novel.md +1 -1
  139. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/gdd-template.md +6 -12
  140. package/src/modules/bmgd/workflows/2-design/gdd/instructions-gdd.md +502 -0
  141. package/src/modules/bmgd/workflows/2-design/gdd/workflow.yaml +81 -0
  142. package/src/modules/bmgd/workflows/2-design/narrative/checklist.md +139 -0
  143. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/narrative/instructions-narrative.md +99 -12
  144. package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/narrative/narrative-template.md +8 -8
  145. package/src/modules/bmgd/workflows/2-design/narrative/workflow.yaml +32 -0
  146. package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-patterns.yaml +321 -0
  147. package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-template.md +103 -0
  148. package/src/modules/bmgd/workflows/3-technical/game-architecture/checklist.md +240 -0
  149. package/src/modules/bmgd/workflows/3-technical/game-architecture/decision-catalog.yaml +222 -0
  150. package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +701 -0
  151. package/src/modules/bmgd/workflows/3-technical/game-architecture/pattern-categories.csv +13 -0
  152. package/src/modules/bmgd/workflows/3-technical/game-architecture/workflow.yaml +69 -0
  153. package/src/modules/bmgd/workflows/4-production/code-review/instructions.md +398 -0
  154. package/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml +61 -0
  155. package/src/modules/bmgd/workflows/4-production/correct-course/checklist.md +279 -0
  156. package/src/modules/bmgd/workflows/4-production/correct-course/instructions.md +206 -0
  157. package/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml +58 -0
  158. package/src/modules/bmgd/workflows/4-production/create-story/checklist.md +240 -0
  159. package/src/modules/bmgd/workflows/4-production/create-story/instructions.md +256 -0
  160. package/src/modules/bmgd/workflows/4-production/create-story/template.md +51 -0
  161. package/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml +74 -0
  162. package/src/modules/bmgd/workflows/4-production/dev-story/checklist.md +38 -0
  163. package/src/modules/bmgd/workflows/4-production/dev-story/instructions.md +267 -0
  164. package/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml +58 -0
  165. package/src/modules/{bmm/workflows/3-solutioning/tech-spec → bmgd/workflows/4-production/epic-tech-context}/checklist.md +1 -1
  166. package/src/modules/bmgd/workflows/4-production/epic-tech-context/instructions.md +164 -0
  167. package/src/modules/{bmm/workflows/3-solutioning/tech-spec → bmgd/workflows/4-production/epic-tech-context}/template.md +1 -1
  168. package/src/modules/bmgd/workflows/4-production/epic-tech-context/workflow.yaml +58 -0
  169. package/src/modules/bmgd/workflows/4-production/retrospective/instructions.md +1443 -0
  170. package/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml +57 -0
  171. package/src/modules/bmgd/workflows/4-production/sprint-planning/checklist.md +33 -0
  172. package/src/modules/bmgd/workflows/4-production/sprint-planning/instructions.md +234 -0
  173. package/src/modules/bmgd/workflows/4-production/sprint-planning/sprint-status-template.yaml +55 -0
  174. package/src/modules/bmgd/workflows/4-production/sprint-planning/workflow.yaml +51 -0
  175. package/src/modules/bmgd/workflows/4-production/story-context/checklist.md +16 -0
  176. package/src/modules/bmgd/workflows/4-production/story-context/context-template.xml +34 -0
  177. package/src/modules/bmgd/workflows/4-production/story-context/instructions.md +209 -0
  178. package/src/modules/bmgd/workflows/4-production/story-context/workflow.yaml +63 -0
  179. package/src/modules/bmgd/workflows/4-production/story-done/instructions.md +111 -0
  180. package/src/modules/bmgd/workflows/4-production/story-done/workflow.yaml +28 -0
  181. package/src/modules/bmgd/workflows/4-production/story-ready/instructions.md +117 -0
  182. package/src/modules/bmgd/workflows/4-production/story-ready/workflow.yaml +25 -0
  183. package/src/modules/bmm/README.md +128 -0
  184. package/src/modules/bmm/_module-installer/install-config.yaml +60 -0
  185. package/src/modules/bmm/_module-installer/installer.js +3 -3
  186. package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +1 -1
  187. package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +1 -1
  188. package/src/modules/bmm/agents/analyst.agent.yaml +49 -0
  189. package/src/modules/bmm/agents/architect.agent.yaml +42 -0
  190. package/src/modules/bmm/agents/dev.agent.yaml +40 -0
  191. package/src/modules/bmm/agents/frame-expert.agent.yaml +42 -0
  192. package/src/modules/bmm/agents/pm.agent.yaml +64 -0
  193. package/src/modules/bmm/agents/sm.agent.yaml +73 -0
  194. package/src/modules/bmm/agents/tea.agent.yaml +67 -0
  195. package/src/modules/bmm/agents/tech-writer.agent.yaml +68 -0
  196. package/src/modules/bmm/agents/ux-designer.agent.yaml +39 -0
  197. package/src/modules/bmm/docs/README.md +236 -0
  198. package/src/modules/bmm/docs/agents-guide.md +1058 -0
  199. package/src/modules/bmm/docs/brownfield-guide.md +762 -0
  200. package/src/modules/bmm/docs/enterprise-agentic-development.md +686 -0
  201. package/src/modules/bmm/docs/faq.md +588 -0
  202. package/src/modules/bmm/docs/glossary.md +320 -0
  203. package/src/modules/bmm/docs/party-mode.md +224 -0
  204. package/src/modules/bmm/docs/quick-spec-flow.md +652 -0
  205. package/src/modules/bmm/docs/quick-start.md +376 -0
  206. package/src/modules/bmm/docs/scale-adaptive-system.md +612 -0
  207. package/src/modules/bmm/docs/test-architecture.md +396 -0
  208. package/src/modules/bmm/docs/workflow-architecture-reference.md +366 -0
  209. package/src/modules/bmm/docs/workflow-document-project-reference.md +489 -0
  210. package/src/modules/bmm/docs/workflows-analysis.md +370 -0
  211. package/src/modules/bmm/docs/workflows-implementation.md +286 -0
  212. package/src/modules/bmm/docs/workflows-planning.md +612 -0
  213. package/src/modules/bmm/docs/workflows-solutioning.md +554 -0
  214. package/src/modules/bmm/teams/default-party.csv +20 -0
  215. package/src/modules/bmm/teams/team-fullstack.yaml +13 -0
  216. package/src/modules/bmm/testarch/knowledge/ci-burn-in.md +675 -0
  217. package/src/modules/bmm/testarch/knowledge/component-tdd.md +486 -0
  218. package/src/modules/bmm/testarch/knowledge/contract-testing.md +957 -0
  219. package/src/modules/bmm/testarch/knowledge/data-factories.md +500 -0
  220. package/src/modules/bmm/testarch/knowledge/email-auth.md +721 -0
  221. package/src/modules/bmm/testarch/knowledge/error-handling.md +725 -0
  222. package/src/modules/bmm/testarch/knowledge/feature-flags.md +750 -0
  223. package/src/modules/bmm/testarch/knowledge/fixture-architecture.md +401 -0
  224. package/src/modules/bmm/testarch/knowledge/network-first.md +486 -0
  225. package/src/modules/bmm/testarch/knowledge/nfr-criteria.md +670 -0
  226. package/src/modules/bmm/testarch/knowledge/playwright-config.md +730 -0
  227. package/src/modules/bmm/testarch/knowledge/probability-impact.md +601 -0
  228. package/src/modules/bmm/testarch/knowledge/risk-governance.md +615 -0
  229. package/src/modules/bmm/testarch/knowledge/selective-testing.md +732 -0
  230. package/src/modules/bmm/testarch/knowledge/selector-resilience.md +527 -0
  231. package/src/modules/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
  232. package/src/modules/bmm/testarch/knowledge/test-levels-framework.md +473 -0
  233. package/src/modules/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
  234. package/src/modules/bmm/testarch/knowledge/test-quality.md +664 -0
  235. package/src/modules/bmm/testarch/knowledge/timing-debugging.md +372 -0
  236. package/src/modules/bmm/testarch/knowledge/visual-debugging.md +524 -0
  237. package/src/modules/bmm/testarch/tea-index.csv +22 -0
  238. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +82 -8
  239. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +4 -4
  240. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +23 -5
  241. package/src/modules/bmm/workflows/1-analysis/domain-research/instructions.md +425 -0
  242. package/src/modules/bmm/workflows/1-analysis/domain-research/template.md +180 -0
  243. package/src/modules/bmm/workflows/1-analysis/domain-research/workflow.yaml +56 -0
  244. package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +2 -2
  245. package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +418 -247
  246. package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +93 -77
  247. package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +42 -14
  248. package/src/modules/bmm/workflows/1-analysis/research/checklist-deep-prompt.md +144 -0
  249. package/src/modules/bmm/workflows/1-analysis/research/checklist-technical.md +249 -0
  250. package/src/modules/bmm/workflows/1-analysis/research/checklist.md +156 -59
  251. package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +115 -47
  252. package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +236 -114
  253. package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +109 -66
  254. package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +147 -55
  255. package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +1 -1
  256. package/src/modules/bmm/workflows/1-analysis/research/template-market.md +38 -2
  257. package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +36 -1
  258. package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +36 -123
  259. package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/epics-template.md +80 -0
  260. package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/instructions.md +616 -0
  261. package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/workflow.yaml +63 -0
  262. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/checklist.md +310 -0
  263. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/instructions.md +1308 -0
  264. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +145 -0
  265. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +93 -0
  266. package/src/modules/bmm/workflows/2-plan-workflows/prd/checklist.md +346 -0
  267. package/src/modules/bmm/workflows/2-plan-workflows/prd/domain-complexity.csv +13 -0
  268. package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +703 -0
  269. package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +204 -0
  270. package/src/modules/bmm/workflows/2-plan-workflows/prd/project-types.csv +11 -0
  271. package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +78 -0
  272. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +217 -0
  273. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +74 -0
  274. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-generate-stories.md +436 -0
  275. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +980 -0
  276. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/tech-spec-template.md +181 -0
  277. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/user-story-template.md +90 -0
  278. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +60 -0
  279. package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-patterns.yaml +321 -0
  280. package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-template.md +103 -0
  281. package/src/modules/bmm/workflows/3-solutioning/architecture/checklist.md +240 -0
  282. package/src/modules/bmm/workflows/3-solutioning/architecture/decision-catalog.yaml +222 -0
  283. package/src/modules/bmm/workflows/3-solutioning/architecture/instructions.md +768 -0
  284. package/src/modules/bmm/workflows/3-solutioning/architecture/pattern-categories.csv +13 -0
  285. package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +100 -0
  286. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/checklist.md +169 -0
  287. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/instructions.md +332 -0
  288. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/template.md +146 -0
  289. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.yaml +64 -0
  290. package/src/modules/bmm/workflows/4-implementation/code-review/backlog_template.md +12 -0
  291. package/src/modules/bmm/workflows/4-implementation/code-review/checklist.md +22 -0
  292. package/src/modules/bmm/workflows/4-implementation/code-review/instructions.md +398 -0
  293. package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +61 -0
  294. package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +6 -6
  295. package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +70 -54
  296. package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +44 -21
  297. package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +240 -39
  298. package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +203 -28
  299. package/src/modules/bmm/workflows/4-implementation/create-story/template.md +2 -8
  300. package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +43 -42
  301. package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +1 -1
  302. package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +220 -40
  303. package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +43 -38
  304. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/checklist.md +17 -0
  305. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/instructions.md +164 -0
  306. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/template.md +76 -0
  307. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/workflow.yaml +58 -0
  308. package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +1280 -228
  309. package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +41 -25
  310. package/src/modules/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
  311. package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +234 -0
  312. package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
  313. package/src/modules/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +51 -0
  314. package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +1 -1
  315. package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +1 -1
  316. package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +155 -22
  317. package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +43 -36
  318. package/src/modules/bmm/workflows/4-implementation/story-done/instructions.md +111 -0
  319. package/src/modules/bmm/workflows/4-implementation/story-done/workflow.yaml +28 -0
  320. package/src/modules/bmm/workflows/4-implementation/story-ready/instructions.md +117 -0
  321. package/src/modules/bmm/workflows/4-implementation/story-ready/workflow.yaml +25 -0
  322. package/src/modules/bmm/workflows/document-project/checklist.md +245 -0
  323. package/src/modules/bmm/workflows/document-project/documentation-requirements.csv +12 -0
  324. package/src/modules/bmm/workflows/document-project/instructions.md +222 -0
  325. package/src/modules/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
  326. package/src/modules/bmm/workflows/document-project/templates/index-template.md +169 -0
  327. package/src/modules/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
  328. package/src/modules/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
  329. package/src/modules/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
  330. package/src/modules/bmm/workflows/document-project/workflow.yaml +31 -0
  331. package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
  332. package/src/modules/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
  333. package/src/modules/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
  334. package/src/modules/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
  335. package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-helpers.md +127 -0
  336. package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-library.json +90 -0
  337. package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-templates.yaml +127 -0
  338. package/src/modules/bmm/workflows/frame-expert/_shared/validate-json-instructions.md +79 -0
  339. package/src/modules/bmm/workflows/frame-expert/create-dataflow/checklist.md +39 -0
  340. package/src/modules/bmm/workflows/frame-expert/create-dataflow/instructions.md +131 -0
  341. package/src/modules/bmm/workflows/frame-expert/create-dataflow/workflow.yaml +24 -0
  342. package/src/modules/bmm/workflows/frame-expert/create-diagram/checklist.md +43 -0
  343. package/src/modules/bmm/workflows/frame-expert/create-diagram/instructions.md +142 -0
  344. package/src/modules/bmm/workflows/frame-expert/create-diagram/workflow.yaml +25 -0
  345. package/src/modules/bmm/workflows/frame-expert/create-flowchart/checklist.md +49 -0
  346. package/src/modules/bmm/workflows/frame-expert/create-flowchart/instructions.md +242 -0
  347. package/src/modules/bmm/workflows/frame-expert/create-flowchart/workflow.yaml +28 -0
  348. package/src/modules/bmm/workflows/frame-expert/create-wireframe/checklist.md +38 -0
  349. package/src/modules/bmm/workflows/frame-expert/create-wireframe/instructions.md +133 -0
  350. package/src/modules/bmm/workflows/frame-expert/create-wireframe/workflow.yaml +24 -0
  351. package/src/modules/bmm/workflows/techdoc/documentation-standards.md +262 -0
  352. package/src/modules/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
  353. package/src/modules/bmm/workflows/testarch/atdd/checklist.md +373 -0
  354. package/src/modules/bmm/workflows/testarch/atdd/instructions.md +785 -0
  355. package/src/modules/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
  356. package/src/modules/bmm/workflows/testarch/automate/checklist.md +580 -0
  357. package/src/modules/bmm/workflows/testarch/automate/instructions.md +1303 -0
  358. package/src/modules/bmm/workflows/testarch/automate/workflow.yaml +54 -0
  359. package/src/modules/bmm/workflows/testarch/ci/checklist.md +246 -0
  360. package/src/modules/bmm/workflows/testarch/ci/github-actions-template.yaml +165 -0
  361. package/src/modules/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +128 -0
  362. package/src/modules/bmm/workflows/testarch/ci/instructions.md +517 -0
  363. package/src/modules/bmm/workflows/testarch/ci/workflow.yaml +47 -0
  364. package/src/modules/bmm/workflows/testarch/framework/checklist.md +321 -0
  365. package/src/modules/bmm/workflows/testarch/framework/instructions.md +455 -0
  366. package/src/modules/bmm/workflows/testarch/framework/workflow.yaml +49 -0
  367. package/src/modules/bmm/workflows/testarch/nfr-assess/checklist.md +405 -0
  368. package/src/modules/bmm/workflows/testarch/nfr-assess/instructions.md +722 -0
  369. package/src/modules/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +443 -0
  370. package/src/modules/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
  371. package/src/modules/bmm/workflows/testarch/test-design/checklist.md +234 -0
  372. package/src/modules/bmm/workflows/testarch/test-design/instructions.md +782 -0
  373. package/src/modules/bmm/workflows/testarch/test-design/test-design-template.md +285 -0
  374. package/src/modules/bmm/workflows/testarch/test-design/workflow.yaml +50 -0
  375. package/src/modules/bmm/workflows/testarch/test-review/checklist.md +470 -0
  376. package/src/modules/bmm/workflows/testarch/test-review/instructions.md +608 -0
  377. package/src/modules/bmm/workflows/testarch/test-review/test-review-template.md +388 -0
  378. package/src/modules/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
  379. package/src/modules/bmm/workflows/testarch/trace/checklist.md +654 -0
  380. package/src/modules/bmm/workflows/testarch/trace/instructions.md +1045 -0
  381. package/src/modules/bmm/workflows/testarch/trace/trace-template.md +673 -0
  382. package/src/modules/bmm/workflows/testarch/trace/workflow.yaml +57 -0
  383. package/src/modules/bmm/workflows/workflow-status/init/instructions.md +334 -0
  384. package/src/modules/bmm/workflows/workflow-status/init/workflow.yaml +29 -0
  385. package/src/modules/bmm/workflows/workflow-status/instructions.md +388 -0
  386. package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +138 -0
  387. package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +126 -0
  388. package/src/modules/bmm/workflows/workflow-status/paths/game-design.yaml +52 -0
  389. package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +122 -0
  390. package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +113 -0
  391. package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-brownfield.yaml +58 -0
  392. package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-greenfield.yaml +47 -0
  393. package/src/modules/bmm/workflows/workflow-status/project-levels.yaml +59 -0
  394. package/src/modules/bmm/workflows/workflow-status/workflow-status-template.yaml +24 -0
  395. package/src/modules/bmm/workflows/workflow-status/workflow.yaml +30 -0
  396. package/src/modules/cis/README.md +153 -0
  397. package/src/modules/cis/_module-installer/{install-menu-config.yaml → install-config.yaml} +6 -4
  398. package/src/modules/cis/_module-installer/installer.js +1 -1
  399. package/src/modules/cis/agents/README.md +1 -1
  400. package/src/modules/cis/agents/brainstorming-coach.agent.yaml +28 -0
  401. package/src/modules/cis/agents/creative-problem-solver.agent.yaml +28 -0
  402. package/src/modules/cis/agents/design-thinking-coach.agent.yaml +28 -0
  403. package/src/modules/cis/agents/innovation-strategist.agent.yaml +28 -0
  404. package/src/modules/cis/agents/storyteller.agent.yaml +28 -0
  405. package/src/modules/cis/teams/creative-squad.yaml +1 -0
  406. package/src/modules/cis/teams/default-party.csv +11 -0
  407. package/src/modules/cis/workflows/README.md +102 -30
  408. package/src/modules/cis/workflows/design-thinking/design-methods.csv +1 -1
  409. package/src/modules/cis/workflows/design-thinking/instructions.md +4 -2
  410. package/src/modules/cis/workflows/design-thinking/workflow.yaml +16 -7
  411. package/src/modules/cis/workflows/innovation-strategy/innovation-frameworks.csv +2 -2
  412. package/src/modules/cis/workflows/innovation-strategy/instructions.md +7 -5
  413. package/src/modules/cis/workflows/innovation-strategy/template.md +6 -6
  414. package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +16 -7
  415. package/src/modules/cis/workflows/problem-solving/instructions.md +4 -2
  416. package/src/modules/cis/workflows/problem-solving/solving-methods.csv +6 -6
  417. package/src/modules/cis/workflows/problem-solving/template.md +3 -3
  418. package/src/modules/cis/workflows/problem-solving/workflow.yaml +16 -7
  419. package/src/modules/cis/workflows/storytelling/instructions.md +48 -30
  420. package/src/modules/cis/workflows/storytelling/template.md +2 -2
  421. package/src/modules/cis/workflows/storytelling/workflow.yaml +16 -7
  422. package/src/utility/models/action-command-header.md +0 -0
  423. package/src/utility/models/agent-activation-ide.xml +4 -4
  424. package/src/utility/models/agent-activation-web.xml +60 -0
  425. package/src/utility/models/agent-command-header.md +1 -0
  426. package/src/utility/models/agent-in-team-activation.xml +3 -0
  427. package/src/utility/models/fragments/activation-rules.xml +8 -0
  428. package/src/utility/models/fragments/activation-steps.xml +16 -0
  429. package/src/utility/models/fragments/handler-action.xml +4 -0
  430. package/src/utility/models/fragments/handler-data.xml +5 -0
  431. package/src/utility/models/fragments/handler-exec.xml +5 -0
  432. package/src/utility/models/fragments/handler-tmpl.xml +5 -0
  433. package/src/utility/models/fragments/handler-validate-workflow.xml +7 -0
  434. package/src/utility/models/fragments/handler-workflow.xml +9 -0
  435. package/src/utility/models/fragments/menu-handlers.xml +6 -0
  436. package/src/utility/models/fragments/web-bundle-activation-steps.xml +32 -0
  437. package/src/utility/templates/agent.customize.template.yaml +42 -0
  438. package/test/README.md +295 -0
  439. package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +26 -0
  440. package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +29 -0
  441. package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +21 -0
  442. package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +19 -0
  443. package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +24 -0
  444. package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +23 -0
  445. package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +24 -0
  446. package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +30 -0
  447. package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +24 -0
  448. package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +24 -0
  449. package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +24 -0
  450. package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +24 -0
  451. package/test/fixtures/agent-schema/invalid/metadata/core-agent-with-module.agent.yaml +26 -0
  452. package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
  453. package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
  454. package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +26 -0
  455. package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
  456. package/test/fixtures/agent-schema/invalid/metadata/module-agent-missing-module.agent.yaml +25 -0
  457. package/test/fixtures/agent-schema/invalid/metadata/wrong-module-value.agent.yaml +26 -0
  458. package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +23 -0
  459. package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +26 -0
  460. package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +26 -0
  461. package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +23 -0
  462. package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +28 -0
  463. package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +30 -0
  464. package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +27 -0
  465. package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +27 -0
  466. package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
  467. package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +27 -0
  468. package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
  469. package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
  470. package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
  471. package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +23 -0
  472. package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +21 -0
  473. package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +26 -0
  474. package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +30 -0
  475. package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +21 -0
  476. package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +39 -0
  477. package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +23 -0
  478. package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +33 -0
  479. package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +23 -0
  480. package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +23 -0
  481. package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +23 -0
  482. package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +23 -0
  483. package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +23 -0
  484. package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +21 -0
  485. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +27 -0
  486. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +29 -0
  487. package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +23 -0
  488. package/test/test-agent-schema.js +387 -0
  489. package/test/test-cli-integration.sh +159 -0
  490. package/test/test-installation-components.js +214 -0
  491. package/test/unit-test-schema.js +133 -0
  492. package/tools/bmad-npx-wrapper.js +38 -0
  493. package/tools/cli/README.md +608 -0
  494. package/tools/cli/bmad-cli.js +0 -2
  495. package/tools/cli/bundlers/bundle-web.js +24 -2
  496. package/tools/cli/bundlers/test-bundler.js +1 -1
  497. package/tools/cli/bundlers/web-bundler.js +944 -49
  498. package/tools/cli/commands/build.js +458 -0
  499. package/tools/cli/commands/install.js +46 -8
  500. package/tools/cli/installers/lib/core/config-collector.js +490 -43
  501. package/tools/cli/installers/lib/core/dependency-resolver.js +5 -1
  502. package/tools/cli/installers/lib/core/detector.js +134 -13
  503. package/tools/cli/installers/lib/core/ide-config-manager.js +154 -0
  504. package/tools/cli/installers/lib/core/installer.js +1365 -167
  505. package/tools/cli/installers/lib/core/manifest-generator.js +388 -81
  506. package/tools/cli/installers/lib/core/manifest.js +100 -44
  507. package/tools/cli/installers/lib/ide/_base-ide.js +368 -23
  508. package/tools/cli/installers/lib/ide/auggie.js +100 -192
  509. package/tools/cli/installers/lib/ide/claude-code.js +167 -321
  510. package/tools/cli/installers/lib/ide/cline.js +146 -227
  511. package/tools/cli/installers/lib/ide/codex.js +138 -202
  512. package/tools/cli/installers/lib/ide/crush.js +108 -72
  513. package/tools/cli/installers/lib/ide/cursor.js +148 -20
  514. package/tools/cli/installers/lib/ide/gemini.js +109 -63
  515. package/tools/cli/installers/lib/ide/github-copilot.js +60 -47
  516. package/tools/cli/installers/lib/ide/iflow.js +13 -30
  517. package/tools/cli/installers/lib/ide/kilo.js +20 -16
  518. package/tools/cli/installers/lib/ide/manager.js +41 -35
  519. package/tools/cli/installers/lib/ide/opencode.js +212 -0
  520. package/tools/cli/installers/lib/ide/qwen.js +198 -68
  521. package/tools/cli/installers/lib/ide/roo.js +27 -62
  522. package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +90 -0
  523. package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +143 -0
  524. package/tools/cli/installers/lib/ide/shared/module-injections.js +133 -0
  525. package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +119 -0
  526. package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +237 -0
  527. package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
  528. package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +14 -0
  529. package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +12 -0
  530. package/tools/cli/installers/lib/ide/{workflow-command-template.md → templates/workflow-command-template.md} +7 -5
  531. package/tools/cli/installers/lib/ide/trae.js +138 -54
  532. package/tools/cli/installers/lib/ide/windsurf.js +104 -42
  533. package/tools/cli/installers/lib/modules/manager.js +332 -10
  534. package/tools/cli/lib/activation-builder.js +168 -0
  535. package/tools/cli/lib/agent-analyzer.js +81 -0
  536. package/tools/cli/lib/agent-party-generator.js +3 -3
  537. package/tools/cli/lib/cli-utils.js +52 -50
  538. package/tools/cli/lib/config.js +3 -1
  539. package/tools/cli/lib/ui.js +106 -14
  540. package/tools/cli/lib/xml-handler.js +47 -1
  541. package/tools/cli/lib/yaml-format.js +2 -1
  542. package/tools/cli/lib/yaml-xml-builder.js +507 -0
  543. package/tools/cli/regenerate-manifests.js +1 -1
  544. package/tools/cli/test-yaml-builder.js +43 -0
  545. package/tools/format-workflow-md.js +263 -0
  546. package/tools/platform-codes.yaml +6 -0
  547. package/tools/schema/agent.js +240 -0
  548. package/tools/validate-agent-schema.js +110 -0
  549. package/v6-open-items.md +17 -0
  550. package/.github/workflows/format-check.yaml +0 -43
  551. package/docs/codebase-flattener.md +0 -19
  552. package/readme.md +0 -216
  553. package/src/core/_module-installer/install-menu-config.yaml +0 -24
  554. package/src/core/agents/bmad-master.md +0 -27
  555. package/src/core/agents/bmad-web-orchestrator.md +0 -71
  556. package/src/core/tasks/shard-doc.md +0 -57
  557. package/src/core/tasks/workflow.md +0 -141
  558. package/src/core/workflows/bmad-init/instructions.md +0 -79
  559. package/src/core/workflows/bmad-init/workflow.yaml +0 -24
  560. package/src/modules/bmb/_module-installer/install-menu-config.yaml +0 -16
  561. package/src/modules/bmb/agents/bmad-builder.md +0 -30
  562. package/src/modules/bmb/workflows/create-module/installer-templates/install-module-config.yaml +0 -132
  563. package/src/modules/bmm/_module-installer/install-menu-config.yaml +0 -49
  564. package/src/modules/bmm/agents/analyst.md +0 -26
  565. package/src/modules/bmm/agents/architect.md +0 -29
  566. package/src/modules/bmm/agents/dev.md +0 -61
  567. package/src/modules/bmm/agents/game-architect.md +0 -26
  568. package/src/modules/bmm/agents/game-designer.md +0 -27
  569. package/src/modules/bmm/agents/game-dev.md +0 -28
  570. package/src/modules/bmm/agents/pm.md +0 -26
  571. package/src/modules/bmm/agents/po.md +0 -25
  572. package/src/modules/bmm/agents/sm.md +0 -29
  573. package/src/modules/bmm/agents/tea.md +0 -32
  574. package/src/modules/bmm/agents/ux-expert.md +0 -24
  575. package/src/modules/bmm/sub-modules/claude-code/config.yaml +0 -5
  576. package/src/modules/bmm/sub-modules/claude-code/injections.yaml +0 -242
  577. package/src/modules/bmm/sub-modules/claude-code/readme.md +0 -87
  578. package/src/modules/bmm/sub-modules/claude-code/sub-agents/api-documenter.md +0 -85
  579. package/src/modules/bmm/sub-modules/claude-code/sub-agents/codebase-analyzer.md +0 -64
  580. package/src/modules/bmm/sub-modules/claude-code/sub-agents/data-analyst.md +0 -84
  581. package/src/modules/bmm/sub-modules/claude-code/sub-agents/dependency-mapper.md +0 -67
  582. package/src/modules/bmm/sub-modules/claude-code/sub-agents/document-reviewer.md +0 -85
  583. package/src/modules/bmm/sub-modules/claude-code/sub-agents/epic-optimizer.md +0 -66
  584. package/src/modules/bmm/sub-modules/claude-code/sub-agents/market-researcher.md +0 -34
  585. package/src/modules/bmm/sub-modules/claude-code/sub-agents/pattern-detector.md +0 -67
  586. package/src/modules/bmm/sub-modules/claude-code/sub-agents/requirements-analyst.md +0 -61
  587. package/src/modules/bmm/sub-modules/claude-code/sub-agents/tech-debt-auditor.md +0 -89
  588. package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-decisions-curator.md +0 -146
  589. package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-evaluator.md +0 -51
  590. package/src/modules/bmm/sub-modules/claude-code/sub-agents/test-coverage-analyzer.md +0 -91
  591. package/src/modules/bmm/sub-modules/claude-code/sub-agents/trend-spotter.md +0 -99
  592. package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-journey-mapper.md +0 -101
  593. package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-researcher.md +0 -56
  594. package/src/modules/bmm/tasks/daily-standup.md +0 -91
  595. package/src/modules/bmm/tasks/retrospective.md +0 -110
  596. package/src/modules/bmm/teams/team-all.yaml +0 -7
  597. package/src/modules/bmm/teams/team-dev.yaml +0 -14
  598. package/src/modules/bmm/teams/team-gamedev.yaml +0 -9
  599. package/src/modules/bmm/testarch/atdd.md +0 -40
  600. package/src/modules/bmm/testarch/automate.md +0 -38
  601. package/src/modules/bmm/testarch/ci.md +0 -39
  602. package/src/modules/bmm/testarch/framework.md +0 -41
  603. package/src/modules/bmm/testarch/nfr-assess.md +0 -38
  604. package/src/modules/bmm/testarch/risk-profile.md +0 -38
  605. package/src/modules/bmm/testarch/tea-commands.csv +0 -11
  606. package/src/modules/bmm/testarch/tea-gate.md +0 -38
  607. package/src/modules/bmm/testarch/tea-knowledge.md +0 -275
  608. package/src/modules/bmm/testarch/test-design.md +0 -39
  609. package/src/modules/bmm/testarch/test-levels-framework.md +0 -148
  610. package/src/modules/bmm/testarch/test-priorities-matrix.md +0 -174
  611. package/src/modules/bmm/testarch/trace-requirements.md +0 -38
  612. package/src/modules/bmm/workflows/1-analysis/brainstorm-game/instructions.md +0 -47
  613. package/src/modules/bmm/workflows/1-analysis/brainstorm-game/workflow.yaml +0 -22
  614. package/src/modules/bmm/workflows/1-analysis/game-brief/README.md +0 -221
  615. package/src/modules/bmm/workflows/1-analysis/game-brief/instructions.md +0 -517
  616. package/src/modules/bmm/workflows/1-analysis/game-brief/workflow.yaml +0 -34
  617. package/src/modules/bmm/workflows/1-analysis/product-brief/README.md +0 -180
  618. package/src/modules/bmm/workflows/1-analysis/research/README.md +0 -454
  619. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-competitor-analyzer.md +0 -259
  620. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-data-analyst.md +0 -190
  621. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-market-researcher.md +0 -337
  622. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-trend-spotter.md +0 -107
  623. package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-user-researcher.md +0 -329
  624. package/src/modules/bmm/workflows/2-plan/README.md +0 -203
  625. package/src/modules/bmm/workflows/2-plan/checklist.md +0 -369
  626. package/src/modules/bmm/workflows/2-plan/gdd/README.md +0 -222
  627. package/src/modules/bmm/workflows/2-plan/gdd/instructions-gdd.md +0 -480
  628. package/src/modules/bmm/workflows/2-plan/instructions-router.md +0 -222
  629. package/src/modules/bmm/workflows/2-plan/prd/analysis-template.md +0 -53
  630. package/src/modules/bmm/workflows/2-plan/prd/epics-template.md +0 -18
  631. package/src/modules/bmm/workflows/2-plan/prd/instructions-lg.md +0 -267
  632. package/src/modules/bmm/workflows/2-plan/prd/instructions-med.md +0 -251
  633. package/src/modules/bmm/workflows/2-plan/prd/prd-template.md +0 -73
  634. package/src/modules/bmm/workflows/2-plan/tech-spec/instructions-sm.md +0 -137
  635. package/src/modules/bmm/workflows/2-plan/tech-spec/tech-spec-template.md +0 -59
  636. package/src/modules/bmm/workflows/2-plan/ux/instructions-ux.md +0 -360
  637. package/src/modules/bmm/workflows/2-plan/ux/ux-spec-template.md +0 -162
  638. package/src/modules/bmm/workflows/2-plan/workflow.yaml +0 -60
  639. package/src/modules/bmm/workflows/3-solutioning/ADR-template.md +0 -74
  640. package/src/modules/bmm/workflows/3-solutioning/README.md +0 -565
  641. package/src/modules/bmm/workflows/3-solutioning/checklist.md +0 -170
  642. package/src/modules/bmm/workflows/3-solutioning/instructions.md +0 -661
  643. package/src/modules/bmm/workflows/3-solutioning/project-types/backend-questions.md +0 -490
  644. package/src/modules/bmm/workflows/3-solutioning/project-types/cli-questions.md +0 -337
  645. package/src/modules/bmm/workflows/3-solutioning/project-types/data-questions.md +0 -472
  646. package/src/modules/bmm/workflows/3-solutioning/project-types/desktop-questions.md +0 -299
  647. package/src/modules/bmm/workflows/3-solutioning/project-types/embedded-questions.md +0 -118
  648. package/src/modules/bmm/workflows/3-solutioning/project-types/extension-questions.md +0 -374
  649. package/src/modules/bmm/workflows/3-solutioning/project-types/game-questions.md +0 -133
  650. package/src/modules/bmm/workflows/3-solutioning/project-types/infra-questions.md +0 -484
  651. package/src/modules/bmm/workflows/3-solutioning/project-types/library-questions.md +0 -146
  652. package/src/modules/bmm/workflows/3-solutioning/project-types/mobile-questions.md +0 -110
  653. package/src/modules/bmm/workflows/3-solutioning/project-types/project-types.csv +0 -12
  654. package/src/modules/bmm/workflows/3-solutioning/project-types/web-questions.md +0 -136
  655. package/src/modules/bmm/workflows/3-solutioning/tech-spec/README.md +0 -195
  656. package/src/modules/bmm/workflows/3-solutioning/tech-spec/instructions.md +0 -73
  657. package/src/modules/bmm/workflows/3-solutioning/tech-spec/workflow.yaml +0 -51
  658. package/src/modules/bmm/workflows/3-solutioning/templates/backend-service-architecture.md +0 -66
  659. package/src/modules/bmm/workflows/3-solutioning/templates/cli-tool-architecture.md +0 -66
  660. package/src/modules/bmm/workflows/3-solutioning/templates/data-pipeline-architecture.md +0 -66
  661. package/src/modules/bmm/workflows/3-solutioning/templates/desktop-app-architecture.md +0 -66
  662. package/src/modules/bmm/workflows/3-solutioning/templates/embedded-firmware-architecture.md +0 -66
  663. package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-architecture.md +0 -244
  664. package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-godot-guide.md +0 -428
  665. package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-unity-guide.md +0 -333
  666. package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-web-guide.md +0 -528
  667. package/src/modules/bmm/workflows/3-solutioning/templates/infrastructure-architecture.md +0 -66
  668. package/src/modules/bmm/workflows/3-solutioning/templates/library-package-architecture.md +0 -66
  669. package/src/modules/bmm/workflows/3-solutioning/templates/mobile-app-architecture.md +0 -66
  670. package/src/modules/bmm/workflows/3-solutioning/templates/registry.csv +0 -172
  671. package/src/modules/bmm/workflows/3-solutioning/templates/web-api-architecture.md +0 -66
  672. package/src/modules/bmm/workflows/3-solutioning/templates/web-fullstack-architecture.md +0 -277
  673. package/src/modules/bmm/workflows/3-solutioning/workflow.yaml +0 -65
  674. package/src/modules/bmm/workflows/4-implementation/create-story/README.md +0 -42
  675. package/src/modules/bmm/workflows/4-implementation/dev-story/README.md +0 -84
  676. package/src/modules/bmm/workflows/4-implementation/review-story/README.md +0 -72
  677. package/src/modules/bmm/workflows/4-implementation/review-story/instructions.md +0 -176
  678. package/src/modules/bmm/workflows/4-implementation/review-story/workflow.yaml +0 -99
  679. package/src/modules/bmm/workflows/4-implementation/story-context/README.md +0 -234
  680. package/src/modules/cis/agents/brainstorming-coach.md +0 -24
  681. package/src/modules/cis/agents/creative-problem-solver.md +0 -24
  682. package/src/modules/cis/agents/design-thinking-coach.md +0 -24
  683. package/src/modules/cis/agents/innovation-strategist.md +0 -24
  684. package/src/modules/cis/agents/storyteller.md +0 -24
  685. package/src/modules/cis/readme.md +0 -86
  686. package/tools/cli/installers/lib/ide/workflow-command-generator.js +0 -162
  687. package/tools/test-agents/captain-kirk-commander.md +0 -110
  688. package/tools/test-agents/data-operations-android.md +0 -123
  689. package/tools/test-agents/geordi-chief-engineer.md +0 -135
  690. package/tools/test-agents/isabella-martinez-ethicist.md +0 -109
  691. package/tools/test-agents/marcus-thompson-security.md +0 -109
  692. package/tools/test-agents/maya-patel-pragmatist.md +0 -82
  693. package/tools/test-agents/picard-diplomat-captain.md +0 -134
  694. package/tools/test-agents/spock-science-officer.md +0 -124
  695. package/tools/test-agents/william-smithers-technocrat.md +0 -71
  696. package/tools/test-agents/zara-chen-designer.md +0 -94
  697. /package/src/{modules/cis → core}/workflows/brainstorming/brain-methods.csv +0 -0
  698. /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-brain-methods.csv +0 -0
  699. /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/metroidvania.md +0 -0
  700. /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/puzzle.md +0 -0
  701. /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types.csv +0 -0
  702. /package/src/modules/{bmm/workflows/4-implementation/review-story → bmgd/workflows/4-production/code-review}/backlog_template.md +0 -0
  703. /package/src/modules/{bmm/workflows/4-implementation/review-story → bmgd/workflows/4-production/code-review}/checklist.md +0 -0
  704. /package/src/modules/bmm/_module-installer/assets/{technical-decisions-template.md → technical-decisions.md} +0 -0
@@ -1,8 +1,10 @@
1
1
  const path = require('node:path');
2
2
  const fs = require('fs-extra');
3
3
  const chalk = require('chalk');
4
+ const yaml = require('js-yaml');
4
5
  const { DependencyResolver } = require('../installers/lib/core/dependency-resolver');
5
6
  const { XmlHandler } = require('../lib/xml-handler');
7
+ const { YamlXmlBuilder } = require('../lib/yaml-xml-builder');
6
8
  const { AgentPartyGenerator } = require('../lib/agent-party-generator');
7
9
  const xml2js = require('xml2js');
8
10
  const { getProjectRoot, getSourcePath, getModulePath } = require('../lib/project-root');
@@ -16,6 +18,7 @@ class WebBundler {
16
18
 
17
19
  this.dependencyResolver = new DependencyResolver();
18
20
  this.xmlHandler = new XmlHandler();
21
+ this.yamlBuilder = new YamlXmlBuilder();
19
22
 
20
23
  // Cache for resolved dependencies to avoid duplicates
21
24
  this.dependencyCache = new Map();
@@ -48,8 +51,13 @@ class WebBundler {
48
51
  console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
49
52
 
50
53
  try {
51
- // Pre-discover all modules to generate complete manifests
54
+ // Vendor cross-module workflows FIRST
52
55
  const modules = await this.discoverModules();
56
+ for (const module of modules) {
57
+ await this.vendorCrossModuleWorkflows(module);
58
+ }
59
+
60
+ // Pre-discover all modules to generate complete manifests
53
61
  for (const module of modules) {
54
62
  await this.preDiscoverModule(module);
55
63
  }
@@ -89,6 +97,9 @@ class WebBundler {
89
97
  teams: [],
90
98
  };
91
99
 
100
+ // Vendor cross-module workflows first (if not already done by bundleAll)
101
+ await this.vendorCrossModuleWorkflows(moduleName);
102
+
92
103
  // Pre-discover all agents and teams for manifest generation
93
104
  await this.preDiscoverModule(moduleName);
94
105
 
@@ -108,16 +119,16 @@ class WebBundler {
108
119
  }
109
120
  }
110
121
 
111
- // Process teams (Phase 4 - to be implemented)
112
- // const teams = await this.discoverTeams(modulePath);
113
- // for (const team of teams) {
114
- // try {
115
- // await this.bundleTeam(moduleName, team);
116
- // results.teams.push(team);
117
- // } catch (error) {
118
- // console.error(` Failed to bundle team ${team}:`, error.message);
119
- // }
120
- // }
122
+ // Process teams
123
+ const teams = await this.discoverTeams(modulePath);
124
+ for (const team of teams) {
125
+ try {
126
+ await this.bundleTeam(moduleName, team);
127
+ results.teams.push(team);
128
+ } catch (error) {
129
+ console.error(` Failed to bundle team ${team}:`, error.message);
130
+ }
131
+ }
121
132
 
122
133
  return results;
123
134
  }
@@ -126,11 +137,14 @@ class WebBundler {
126
137
  * Bundle a single agent
127
138
  */
128
139
  async bundleAgent(moduleName, agentFile, shouldTrack = true) {
129
- const agentName = path.basename(agentFile, '.md');
140
+ const agentName = agentFile.endsWith('.agent.yaml') ? path.basename(agentFile, '.agent.yaml') : path.basename(agentFile, '.md');
130
141
  this.stats.totalAgents++;
131
142
 
132
143
  console.log(chalk.dim(` → Processing: ${agentName}`));
133
144
 
145
+ // Vendor cross-module workflows first (if not already done)
146
+ await this.vendorCrossModuleWorkflows(moduleName);
147
+
134
148
  const agentPath = path.join(this.modulesPath, moduleName, 'agents', agentFile);
135
149
 
136
150
  // Check if agent file exists
@@ -140,11 +154,34 @@ class WebBundler {
140
154
  throw new Error(`Agent file not found: ${agentPath}`);
141
155
  }
142
156
 
143
- // Read agent file
144
- const content = await fs.readFile(agentPath, 'utf8');
157
+ let content;
158
+ let agentXml;
145
159
 
146
- // Extract agent XML from markdown
147
- let agentXml = this.extractAgentXml(content);
160
+ // Handle YAML agents - build in-memory to XML
161
+ if (agentFile.endsWith('.agent.yaml')) {
162
+ // Check for webskip flag in YAML before building
163
+ const yamlContent = await fs.readFile(agentPath, 'utf8');
164
+ const agentYaml = yaml.load(yamlContent);
165
+
166
+ if (agentYaml?.agent?.webskip === true) {
167
+ this.stats.skippedAgents++;
168
+ console.log(chalk.gray(` ⊘ Skipped (webskip="true")`));
169
+ return;
170
+ }
171
+
172
+ // Build agent from YAML (no customize file for web bundles)
173
+ const xmlContent = await this.yamlBuilder.buildFromYaml(agentPath, null, {
174
+ includeMetadata: false, // Don't include build metadata in web bundles
175
+ forWebBundle: true, // Use web-specific activation fragments
176
+ });
177
+
178
+ content = xmlContent;
179
+ agentXml = this.extractAgentXml(xmlContent);
180
+ } else {
181
+ // Legacy MD format - read and extract XML
182
+ content = await fs.readFile(agentPath, 'utf8');
183
+ agentXml = this.extractAgentXml(content);
184
+ }
148
185
 
149
186
  if (!agentXml) {
150
187
  this.stats.failedAgents++;
@@ -172,12 +209,29 @@ class WebBundler {
172
209
 
173
210
  // Resolve dependencies with warning tracking
174
211
  const dependencyWarnings = [];
175
- const dependencies = await this.resolveAgentDependencies(agentXml, moduleName, dependencyWarnings);
212
+ const { dependencies, skippedWorkflows } = await this.resolveAgentDependencies(agentXml, moduleName, dependencyWarnings);
176
213
 
177
214
  if (dependencyWarnings.length > 0) {
178
215
  this.stats.warnings.push({ agent: agentName, warnings: dependencyWarnings });
179
216
  }
180
217
 
218
+ // Check for module's default-party.csv and include it as agent manifest
219
+ const defaultPartyPath = path.join(this.modulesPath, moduleName, 'teams', 'default-party.csv');
220
+ if (await fs.pathExists(defaultPartyPath)) {
221
+ const partyContent = await fs.readFile(defaultPartyPath, 'utf8');
222
+ // Process any placeholders in the CSV content
223
+ const processedPartyContent = this.processProjectRootReferences(partyContent);
224
+ // Wrap as text to preserve raw CSV format in CDATA
225
+ const wrappedParty = this.wrapContentInXml(processedPartyContent, 'bmad/_cfg/agent-manifest.csv', 'text');
226
+ dependencies.set('bmad/_cfg/agent-manifest.csv', wrappedParty);
227
+ console.log(chalk.gray(` + Added party manifest from module default-party.csv`));
228
+ }
229
+
230
+ // Remove commands for skipped workflows from agent XML
231
+ if (skippedWorkflows.length > 0) {
232
+ agentXml = this.removeSkippedWorkflowCommands(agentXml, skippedWorkflows);
233
+ }
234
+
181
235
  // Build the bundle (no manifests for individual agents)
182
236
  const bundle = this.buildAgentBundle(agentXml, dependencies);
183
237
 
@@ -188,16 +242,356 @@ class WebBundler {
188
242
  console.log(chalk.red(` ⚠ Invalid XML generated!`));
189
243
  }
190
244
 
245
+ // Format XML for readability
246
+ const formattedBundle = this.formatXml(bundle);
247
+
191
248
  // Write bundle to output
192
249
  const outputPath = path.join(this.outputDir, moduleName, 'agents', `${agentName}.xml`);
193
250
  await fs.ensureDir(path.dirname(outputPath));
194
- await fs.writeFile(outputPath, bundle, 'utf8');
251
+ await fs.writeFile(outputPath, formattedBundle, 'utf8');
195
252
 
196
253
  this.stats.bundledAgents++;
197
254
  const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
198
255
  console.log(` ${statusIcon} Bundled: ${agentName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
199
256
  }
200
257
 
258
+ /**
259
+ * Bundle a team - includes orchestrator and all agents with their dependencies
260
+ */
261
+ async bundleTeam(moduleName, teamFile) {
262
+ const teamName = path.basename(teamFile, path.extname(teamFile));
263
+ console.log(chalk.dim(` → Processing team: ${teamName}`));
264
+
265
+ const teamPath = path.join(this.modulesPath, moduleName, 'teams', teamFile);
266
+
267
+ // Check if team file exists
268
+ if (!(await fs.pathExists(teamPath))) {
269
+ console.log(chalk.red(` ✗ Team file not found`));
270
+ throw new Error(`Team file not found: ${teamPath}`);
271
+ }
272
+
273
+ // Read and parse team YAML
274
+ const teamContent = await fs.readFile(teamPath, 'utf8');
275
+ const teamConfig = yaml.load(teamContent);
276
+
277
+ if (!teamConfig || !teamConfig.bundle) {
278
+ console.log(chalk.red(` ✗ Invalid team configuration`));
279
+ return;
280
+ }
281
+
282
+ // Start building the team bundle
283
+ const dependencies = new Map();
284
+ const processed = new Set();
285
+ const allAgentXmls = [];
286
+ const warnings = [];
287
+
288
+ // Check if team has a party CSV file (agent manifest)
289
+ const hasPartyFile = teamConfig.party && teamConfig.party.endsWith('.csv');
290
+ if (hasPartyFile) {
291
+ // Load the party CSV and add it as bmad/_cfg/agent-manifest.csv
292
+ const partyPath = path.join(path.dirname(teamPath), teamConfig.party.replace(/^\.\//, ''));
293
+ if (await fs.pathExists(partyPath)) {
294
+ const partyContent = await fs.readFile(partyPath, 'utf8');
295
+ // Process any placeholders in the CSV content
296
+ const processedPartyContent = this.processProjectRootReferences(partyContent);
297
+ // Wrap as text/csv to preserve raw CSV format in CDATA
298
+ const wrappedParty = this.wrapContentInXml(processedPartyContent, 'bmad/_cfg/agent-manifest.csv', 'text');
299
+ dependencies.set('bmad/_cfg/agent-manifest.csv', wrappedParty);
300
+ console.log(chalk.gray(` + Added agent manifest from: ${teamConfig.party}`));
301
+ } else {
302
+ console.log(chalk.yellow(` ⚠ Party file not found: ${partyPath}`));
303
+ }
304
+ }
305
+
306
+ // 1. First, always add the bmad-web-orchestrator (XML file only, no transformation needed)
307
+ const orchestratorXmlPath = path.join(this.sourceDir, 'core', 'agents', 'bmad-web-orchestrator.agent.xml');
308
+
309
+ if (await fs.pathExists(orchestratorXmlPath)) {
310
+ // Read the XML file directly - no transformation needed
311
+ const xmlContent = await fs.readFile(orchestratorXmlPath, 'utf8');
312
+ let orchestratorXml = xmlContent.trim();
313
+
314
+ // Process {project-root} references
315
+ orchestratorXml = this.processProjectRootReferences(orchestratorXml);
316
+
317
+ // Inject help/exit menu items only (orchestrator has its own activation)
318
+ orchestratorXml = this.injectHelpExitMenuItems(orchestratorXml);
319
+
320
+ // Resolve orchestrator dependencies
321
+ const { dependencies: orchDeps } = await this.resolveAgentDependencies(orchestratorXml, 'core', warnings);
322
+
323
+ // Merge orchestrator dependencies
324
+ for (const [id, content] of orchDeps) {
325
+ if (!dependencies.has(id)) {
326
+ dependencies.set(id, content);
327
+ }
328
+ }
329
+
330
+ // Add orchestrator XML first
331
+ allAgentXmls.push(orchestratorXml);
332
+ console.log(chalk.gray(` + Added orchestrator: bmad-web-orchestrator`));
333
+ } else {
334
+ console.log(chalk.yellow(` ⚠ Orchestrator not found at: ${orchestratorXmlPath}`));
335
+ }
336
+
337
+ // 2. Determine which agents to include
338
+ let agentsToBundle = [];
339
+
340
+ if (teamConfig.agents === '*' || (Array.isArray(teamConfig.agents) && teamConfig.agents.includes('*'))) {
341
+ // Include all agents from the module
342
+ const agentsPath = path.join(this.modulesPath, moduleName, 'agents');
343
+ if (await fs.pathExists(agentsPath)) {
344
+ const agentFiles = await fs.readdir(agentsPath);
345
+ agentsToBundle = agentFiles
346
+ .filter((file) => file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme')))
347
+ .map((file) => file.replace(/\.(agent\.yaml|md)$/, ''));
348
+ }
349
+ } else if (Array.isArray(teamConfig.agents)) {
350
+ // Include specific agents listed
351
+ agentsToBundle = teamConfig.agents;
352
+ } else {
353
+ console.log(chalk.yellow(` ⚠ No agents specified in team configuration`));
354
+ }
355
+
356
+ // 3. Process each agent and their dependencies
357
+ for (const agentName of agentsToBundle) {
358
+ // Try YAML first, then MD
359
+ let agentPath = path.join(this.modulesPath, moduleName, 'agents', `${agentName}.agent.yaml`);
360
+ let isYaml = await fs.pathExists(agentPath);
361
+
362
+ if (!isYaml) {
363
+ agentPath = path.join(this.modulesPath, moduleName, 'agents', `${agentName}.md`);
364
+ if (!(await fs.pathExists(agentPath))) {
365
+ console.log(chalk.yellow(` ⚠ Agent not found: ${agentName}`));
366
+ continue;
367
+ }
368
+ }
369
+
370
+ let agentXml;
371
+
372
+ if (isYaml) {
373
+ // Check for webskip flag in YAML
374
+ const yamlContent = await fs.readFile(agentPath, 'utf8');
375
+ const agentYaml = yaml.load(yamlContent);
376
+
377
+ if (agentYaml?.agent?.webskip === true) {
378
+ console.log(chalk.gray(` ⊘ Skipped agent (webskip="true"): ${agentName}`));
379
+ continue;
380
+ }
381
+
382
+ // Build YAML agent in-memory - skip activation for team agents (orchestrator handles it)
383
+ const xmlContent = await this.yamlBuilder.buildFromYaml(agentPath, null, {
384
+ includeMetadata: false,
385
+ skipActivation: true, // Skip activation for team agents
386
+ });
387
+ agentXml = this.extractAgentXml(xmlContent);
388
+ } else {
389
+ // Read legacy MD agent
390
+ const agentContent = await fs.readFile(agentPath, 'utf8');
391
+ agentXml = this.extractAgentXml(agentContent);
392
+ }
393
+
394
+ if (!agentXml) {
395
+ console.log(chalk.yellow(` ⚠ No XML found in agent: ${agentName}`));
396
+ continue;
397
+ }
398
+
399
+ // Skip agents with bundle="false"
400
+ if (this.shouldSkipBundling(agentXml)) {
401
+ console.log(chalk.gray(` ⊘ Skipped agent (bundle="false"): ${agentName}`));
402
+ continue;
403
+ }
404
+
405
+ // Process {project-root} references
406
+ agentXml = this.processProjectRootReferences(agentXml);
407
+
408
+ // Resolve agent dependencies
409
+ const agentWarnings = [];
410
+ const { dependencies: agentDeps, skippedWorkflows } = await this.resolveAgentDependencies(agentXml, moduleName, agentWarnings);
411
+
412
+ if (agentWarnings.length > 0) {
413
+ warnings.push({ agent: agentName, warnings: agentWarnings });
414
+ }
415
+
416
+ // Remove commands for skipped workflows from agent XML
417
+ if (skippedWorkflows.length > 0) {
418
+ agentXml = this.removeSkippedWorkflowCommands(agentXml, skippedWorkflows);
419
+ }
420
+
421
+ // Merge agent dependencies (deduplicate)
422
+ for (const [id, content] of agentDeps) {
423
+ if (!dependencies.has(id)) {
424
+ dependencies.set(id, content);
425
+ }
426
+ }
427
+
428
+ // Skip web activation injection for team agents - orchestrator handles everything
429
+ // Only inject help/exit menu items if missing
430
+ agentXml = this.injectHelpExitMenuItems(agentXml);
431
+
432
+ // Add agent XML to the collection
433
+ allAgentXmls.push(agentXml);
434
+ console.log(chalk.gray(` + Added agent: ${agentName}`));
435
+ }
436
+
437
+ // 4. Build the team bundle XML
438
+ const bundle = this.buildTeamBundle(teamConfig.bundle, allAgentXmls, dependencies);
439
+
440
+ // 5. Validate XML
441
+ const isValid = await this.validateXml(bundle);
442
+ if (!isValid) {
443
+ console.log(chalk.red(` ⚠ Invalid XML generated for team!`));
444
+ }
445
+
446
+ // Format XML for readability
447
+ const formattedBundle = this.formatXml(bundle);
448
+
449
+ // 6. Write bundle to output
450
+ const outputPath = path.join(this.outputDir, moduleName, 'teams', `${teamName}.xml`);
451
+ await fs.ensureDir(path.dirname(outputPath));
452
+ await fs.writeFile(outputPath, formattedBundle, 'utf8');
453
+
454
+ const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
455
+ console.log(` ${statusIcon} Bundled team: ${teamName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
456
+
457
+ // Track warnings
458
+ if (warnings.length > 0) {
459
+ this.stats.warnings.push(...warnings);
460
+ }
461
+ }
462
+
463
+ /**
464
+ * Build the final team bundle XML
465
+ */
466
+ buildTeamBundle(teamMetadata, agentXmls, dependencies) {
467
+ const parts = ['<?xml version="1.0" encoding="UTF-8"?>', '<team-bundle>', ' <!-- Agent Definitions -->', ' <agents>'];
468
+
469
+ for (const agentXml of agentXmls) {
470
+ // Indent each agent XML properly (add 4 spaces to each line)
471
+ const indentedAgent = agentXml
472
+ .split('\n')
473
+ .map((line) => ' ' + line)
474
+ .join('\n');
475
+ parts.push(indentedAgent);
476
+ }
477
+
478
+ parts.push(' </agents>');
479
+
480
+ // Add all dependencies
481
+ if (dependencies && dependencies.size > 0) {
482
+ parts.push('', ' <!-- Shared Dependencies -->', ' <dependencies>');
483
+
484
+ for (const [id, content] of dependencies) {
485
+ // All dependencies are now consistently wrapped in <file> elements
486
+ // Indent properly (add 4 spaces to each line)
487
+ const indentedContent = content
488
+ .split('\n')
489
+ .map((line) => ' ' + line)
490
+ .join('\n');
491
+ parts.push(indentedContent);
492
+ }
493
+
494
+ parts.push(' </dependencies>');
495
+ }
496
+
497
+ parts.push('</team-bundle>');
498
+
499
+ return parts.join('\n');
500
+ }
501
+
502
+ /**
503
+ * Vendor cross-module workflows for a module
504
+ * Scans source agent YAML files for workflow-install attributes and copies workflows
505
+ */
506
+ async vendorCrossModuleWorkflows(moduleName) {
507
+ const modulePath = path.join(this.modulesPath, moduleName);
508
+ const agentsPath = path.join(modulePath, 'agents');
509
+
510
+ if (!(await fs.pathExists(agentsPath))) {
511
+ return;
512
+ }
513
+
514
+ // Find all agent YAML files
515
+ const files = await fs.readdir(agentsPath);
516
+ const yamlFiles = files.filter((f) => f.endsWith('.agent.yaml'));
517
+
518
+ for (const agentFile of yamlFiles) {
519
+ const agentPath = path.join(agentsPath, agentFile);
520
+ const agentYaml = yaml.load(await fs.readFile(agentPath, 'utf8'));
521
+
522
+ const menuItems = agentYaml?.agent?.menu || [];
523
+ const workflowInstallItems = menuItems.filter((item) => item['workflow-install']);
524
+
525
+ for (const item of workflowInstallItems) {
526
+ const sourceWorkflowPath = item.workflow;
527
+ const installWorkflowPath = item['workflow-install'];
528
+
529
+ if (!sourceWorkflowPath || !installWorkflowPath) {
530
+ continue;
531
+ }
532
+
533
+ // Parse paths to extract module and workflow location
534
+ // Support both {project-root}/bmad/... and {project-root}/{bmad_folder}/... patterns
535
+ const sourceMatch = sourceWorkflowPath.match(/\{project-root\}\/(?:\{bmad_folder\}|bmad)\/([^/]+)\/workflows\/(.+)/);
536
+ const installMatch = installWorkflowPath.match(/\{project-root\}\/(?:\{bmad_folder\}|bmad)\/([^/]+)\/workflows\/(.+)/);
537
+
538
+ if (!sourceMatch || !installMatch) {
539
+ continue;
540
+ }
541
+
542
+ const sourceModule = sourceMatch[1];
543
+ const sourceWorkflowRelPath = sourceMatch[2];
544
+ const installModule = installMatch[1];
545
+ const installWorkflowRelPath = installMatch[2];
546
+
547
+ // Build actual filesystem paths
548
+ const actualSourceWorkflowPath = path.join(this.modulesPath, sourceModule, 'workflows', sourceWorkflowRelPath);
549
+ const actualDestWorkflowPath = path.join(this.modulesPath, installModule, 'workflows', installWorkflowRelPath);
550
+
551
+ // Check if source workflow exists
552
+ if (!(await fs.pathExists(actualSourceWorkflowPath))) {
553
+ console.log(chalk.yellow(` ⚠ Source workflow not found for vendoring: ${sourceWorkflowPath}`));
554
+ continue;
555
+ }
556
+
557
+ // Check if destination already exists (skip if already vendored)
558
+ if (await fs.pathExists(actualDestWorkflowPath)) {
559
+ continue;
560
+ }
561
+
562
+ // Get workflow directory (workflow.yaml is in a directory with other files)
563
+ const sourceWorkflowDir = path.dirname(actualSourceWorkflowPath);
564
+ const destWorkflowDir = path.dirname(actualDestWorkflowPath);
565
+
566
+ // Copy entire workflow directory
567
+ await fs.copy(sourceWorkflowDir, destWorkflowDir, { overwrite: false });
568
+
569
+ // Update config_source in the vendored workflow.yaml
570
+ const workflowYamlPath = actualDestWorkflowPath;
571
+ if (await fs.pathExists(workflowYamlPath)) {
572
+ await this.updateWorkflowConfigSource(workflowYamlPath, installModule);
573
+ }
574
+
575
+ console.log(chalk.dim(` → Vendored workflow: ${sourceWorkflowRelPath} → ${installModule}/workflows/${installWorkflowRelPath}`));
576
+ }
577
+ }
578
+ }
579
+
580
+ /**
581
+ * Update config_source in a vendored workflow YAML file
582
+ */
583
+ async updateWorkflowConfigSource(workflowYamlPath, newModuleName) {
584
+ let yamlContent = await fs.readFile(workflowYamlPath, 'utf8');
585
+
586
+ // Replace config_source with new module reference
587
+ // Support both old format (bmad) and new format ({bmad_folder})
588
+ const configSourcePattern = /config_source:\s*["']?\{project-root\}\/(?:\{bmad_folder\}|bmad)\/[^/]+\/config\.yaml["']?/g;
589
+ const newConfigSource = `config_source: "{project-root}/{bmad_folder}/${newModuleName}/config.yaml"`;
590
+
591
+ const updatedYaml = yamlContent.replaceAll(configSourcePattern, newConfigSource);
592
+ await fs.writeFile(workflowYamlPath, updatedYaml, 'utf8');
593
+ }
594
+
201
595
  /**
202
596
  * Pre-discover all agents and teams in a module for manifest generation
203
597
  */
@@ -212,9 +606,28 @@ class WebBundler {
212
606
  if (await fs.pathExists(agentsPath)) {
213
607
  const files = await fs.readdir(agentsPath);
214
608
  for (const file of files) {
215
- if (file.endsWith('.md')) {
609
+ if (file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme'))) {
216
610
  const agentPath = path.join(agentsPath, file);
217
- const content = await fs.readFile(agentPath, 'utf8');
611
+ let content;
612
+
613
+ if (file.endsWith('.agent.yaml')) {
614
+ // Check for webskip flag in YAML
615
+ const yamlContent = await fs.readFile(agentPath, 'utf8');
616
+ const agentYaml = yaml.load(yamlContent);
617
+
618
+ if (agentYaml?.agent?.webskip === true) {
619
+ continue; // Skip this agent
620
+ }
621
+
622
+ // Build YAML agent in-memory
623
+ content = await this.yamlBuilder.buildFromYaml(agentPath, null, {
624
+ includeMetadata: false,
625
+ });
626
+ } else {
627
+ // Read legacy MD agent
628
+ content = await fs.readFile(agentPath, 'utf8');
629
+ }
630
+
218
631
  const agentXml = this.extractAgentXml(content);
219
632
 
220
633
  if (agentXml) {
@@ -223,7 +636,7 @@ class WebBundler {
223
636
  continue;
224
637
  }
225
638
 
226
- const agentName = path.basename(file, '.md');
639
+ const agentName = file.endsWith('.agent.yaml') ? path.basename(file, '.agent.yaml') : path.basename(file, '.md');
227
640
  // Use the shared generator to extract agent details (pass full content)
228
641
  const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
229
642
  if (agentDetails) {
@@ -265,16 +678,25 @@ class WebBundler {
265
678
  async resolveAgentDependencies(agentXml, moduleName, warnings = []) {
266
679
  const dependencies = new Map();
267
680
  const processed = new Set();
681
+ const skippedWorkflows = [];
268
682
 
269
683
  // Extract file references from agent XML
270
- const fileRefs = this.extractFileReferences(agentXml);
684
+ const { refs, workflowRefs } = this.extractFileReferences(agentXml);
271
685
 
272
- // Process each file reference
273
- for (const ref of fileRefs) {
686
+ // Process regular file references
687
+ for (const ref of refs) {
274
688
  await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
275
689
  }
276
690
 
277
- return dependencies;
691
+ // Process workflow references with special handling
692
+ for (const workflowRef of workflowRefs) {
693
+ const result = await this.processWorkflowDependency(workflowRef, dependencies, processed, moduleName, warnings);
694
+ if (result && result.skipped) {
695
+ skippedWorkflows.push(workflowRef);
696
+ }
697
+ }
698
+
699
+ return { dependencies, skippedWorkflows };
278
700
  }
279
701
 
280
702
  /**
@@ -282,6 +704,13 @@ class WebBundler {
282
704
  */
283
705
  extractFileReferences(xml) {
284
706
  const refs = new Set();
707
+ const workflowRefs = new Set();
708
+
709
+ // Remove agent id attribute to prevent it from being treated as a dependency
710
+ // The id attribute is just a metadata identifier, not a file reference
711
+ const xmlWithoutAgentId = xml.replace(/<agent[^>]*id="[^"]*"[^>]*>/, (match) => {
712
+ return match.replace(/\sid="[^"]*"/, '');
713
+ });
285
714
 
286
715
  // Match various file reference patterns
287
716
  const patterns = [
@@ -292,36 +721,109 @@ class WebBundler {
292
721
  /src="([^"]+)"/g, // Source paths
293
722
  /system-prompts="([^"]+)"/g,
294
723
  /tools="([^"]+)"/g,
295
- /workflows="([^"]+)"/g,
296
724
  /knowledge="([^"]+)"/g,
297
- /{project-root}\/([^"'\s<>]+)/g,
725
+ /{project-root}\/([^"'\s<>]+)/g, // Legacy {project-root} paths
726
+ /\bbmad\/([^"'\s<>]+)/g, // Direct bmad/ paths (after {bmad_folder} replacement)
298
727
  ];
299
728
 
300
729
  for (const pattern of patterns) {
301
730
  let match;
302
- while ((match = pattern.exec(xml)) !== null) {
731
+ // Use the XML with agent id removed for pattern matching
732
+ while ((match = pattern.exec(xmlWithoutAgentId)) !== null) {
303
733
  let filePath = match[1];
304
734
  // Remove {project-root} prefix if present
305
735
  filePath = filePath.replace(/^{project-root}\//, '');
306
- if (filePath) {
736
+ // Remove {bmad_folder} prefix if present (should be rare, mostly replaced already)
737
+ filePath = filePath.replace(/^{bmad_folder}\//, 'bmad/');
738
+
739
+ // For bmad/ pattern, prepend 'bmad/' since it was captured without it
740
+ if (pattern.source.includes(String.raw`\bbmad\/`)) {
741
+ filePath = 'bmad/' + filePath;
742
+ }
743
+
744
+ // Skip obvious placeholder/example paths
745
+ if (filePath && !filePath.includes('path/to/') && !filePath.includes('example') && !filePath.includes('...')) {
307
746
  refs.add(filePath);
308
747
  }
309
748
  }
310
749
  }
311
750
 
312
- return [...refs];
751
+ // Extract workflow references - both 'workflow' and 'run-workflow' attributes
752
+ const workflowPatterns = [
753
+ /workflow="([^"]+)"/g, // Menu items with workflow attribute
754
+ /run-workflow="([^"]+)"/g, // Commands with run-workflow attribute
755
+ /validate-workflow="([^"]+)"/g, // Validation workflow references
756
+ ];
757
+
758
+ for (const pattern of workflowPatterns) {
759
+ let match;
760
+ // Use original xml for workflow patterns (they don't conflict with agent id)
761
+ while ((match = pattern.exec(xml)) !== null) {
762
+ let workflowPath = match[1];
763
+ workflowPath = workflowPath.replace(/^{project-root}\//, '');
764
+ // Remove {bmad_folder} prefix if present and replace with bmad
765
+ workflowPath = workflowPath.replace(/^{bmad_folder}\//, 'bmad/');
766
+
767
+ // Skip obvious placeholder/example paths
768
+ if (workflowPath && workflowPath.endsWith('.yaml') && !workflowPath.includes('path/to/') && !workflowPath.includes('example')) {
769
+ workflowRefs.add(workflowPath);
770
+ }
771
+ }
772
+ }
773
+
774
+ return { refs: [...refs], workflowRefs: [...workflowRefs] };
775
+ }
776
+
777
+ /**
778
+ * Remove commands from agent XML that reference skipped workflows
779
+ */
780
+ removeSkippedWorkflowCommands(agentXml, skippedWorkflows) {
781
+ let modifiedXml = agentXml;
782
+
783
+ // For each skipped workflow, find and remove menu items and commands
784
+ for (const workflowPath of skippedWorkflows) {
785
+ // Need to escape special regex characters in the path
786
+ const escapedPath = workflowPath.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
787
+
788
+ // Pattern 1: Remove <item> tags with workflow attribute
789
+ // Match: <item cmd="..." workflow="workflowPath">...</item>
790
+ const itemWorkflowPattern = new RegExp(`\\s*<item\\s+[^>]*workflow="[^"]*${escapedPath}"[^>]*>.*?</item>\\s*`, 'gs');
791
+ modifiedXml = modifiedXml.replace(itemWorkflowPattern, '');
792
+
793
+ // Pattern 2: Remove <item> tags with run-workflow attribute
794
+ // Match: <item cmd="..." run-workflow="workflowPath">...</item>
795
+ const itemRunWorkflowPattern = new RegExp(`\\s*<item\\s+[^>]*run-workflow="[^"]*${escapedPath}"[^>]*>.*?</item>\\s*`, 'gs');
796
+ modifiedXml = modifiedXml.replace(itemRunWorkflowPattern, '');
797
+
798
+ // Pattern 3: Remove <c> tags with run-workflow attribute (legacy)
799
+ // Match: <c cmd="..." run-workflow="workflowPath">...</c>
800
+ const cPattern = new RegExp(`\\s*<c\\s+[^>]*run-workflow="[^"]*${escapedPath}"[^>]*>.*?</c>\\s*`, 'gs');
801
+ modifiedXml = modifiedXml.replace(cPattern, '');
802
+ }
803
+
804
+ return modifiedXml;
313
805
  }
314
806
 
315
807
  /**
316
808
  * Process a file dependency recursively
317
809
  */
318
810
  async processFileDependency(filePath, dependencies, processed, moduleName, warnings = []) {
811
+ // Skip workflow YAML files - they're handled by processWorkflowDependency
812
+ if (filePath.includes('/workflow') && filePath.endsWith('workflow.yaml')) {
813
+ return;
814
+ }
815
+
319
816
  // Skip if already processed
320
817
  if (processed.has(filePath)) {
321
818
  return;
322
819
  }
323
820
  processed.add(filePath);
324
821
 
822
+ // Skip agent-manifest.csv manifest for web bundles (agents are already bundled)
823
+ if (filePath === 'bmad/_cfg/agent-manifest.csv' || filePath.endsWith('/agent-manifest.csv')) {
824
+ return;
825
+ }
826
+
325
827
  // Handle wildcard patterns
326
828
  if (filePath.includes('*')) {
327
829
  await this.processWildcardDependency(filePath, dependencies, processed, moduleName, warnings);
@@ -336,6 +838,13 @@ class WebBundler {
336
838
  return;
337
839
  }
338
840
 
841
+ // Skip if it's a directory
842
+ const stats = await fs.stat(actualPath);
843
+ if (stats.isDirectory()) {
844
+ // Silently skip directories - they're not file dependencies
845
+ return;
846
+ }
847
+
339
848
  // Read file content
340
849
  let content = await fs.readFile(actualPath, 'utf8');
341
850
 
@@ -352,7 +861,8 @@ class WebBundler {
352
861
  const deps = depMatch[1].match(/['"]([^'"]+)['"]/g);
353
862
  if (deps) {
354
863
  for (const dep of deps) {
355
- const depPath = dep.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
864
+ let depPath = dep.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
865
+ depPath = depPath.replace(/^{bmad_folder}\//, 'bmad/');
356
866
  if (depPath && !processed.has(depPath)) {
357
867
  await this.processFileDependency(depPath, dependencies, processed, moduleName, warnings);
358
868
  }
@@ -365,7 +875,8 @@ class WebBundler {
365
875
  const templates = templateMatch[1].match(/['"]([^'"]+)['"]/g);
366
876
  if (templates) {
367
877
  for (const template of templates) {
368
- const templatePath = template.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
878
+ let templatePath = template.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
879
+ templatePath = templatePath.replace(/^{bmad_folder}\//, 'bmad/');
369
880
  if (templatePath && !processed.has(templatePath)) {
370
881
  await this.processFileDependency(templatePath, dependencies, processed, moduleName, warnings);
371
882
  }
@@ -447,8 +958,10 @@ class WebBundler {
447
958
 
448
959
  indexParts.push(' </items>', '</file-index>');
449
960
 
450
- // Store the XML version
451
- dependencies.set(filePath, indexParts.join('\n'));
961
+ // Store the XML version wrapped in a file element
962
+ const csvXml = indexParts.join('\n');
963
+ const wrappedCsv = `<file id="${filePath}" type="xml">\n${csvXml}\n</file>`;
964
+ dependencies.set(filePath, wrappedCsv);
452
965
 
453
966
  // Process referenced files from CSV
454
967
  for (const refId of referencedFiles) {
@@ -470,22 +983,232 @@ class WebBundler {
470
983
  }
471
984
  }
472
985
 
473
- // Store the processed content
474
- dependencies.set(filePath, processedContent);
986
+ // Determine file type for wrapping
987
+ let fileType = 'text';
988
+ if (ext === '.xml' || (ext === '.md' && processedContent.trim().startsWith('<'))) {
989
+ fileType = 'xml';
990
+ } else
991
+ switch (ext) {
992
+ case '.yaml':
993
+ case '.yml': {
994
+ fileType = 'yaml';
995
+
996
+ break;
997
+ }
998
+ case '.json': {
999
+ fileType = 'json';
1000
+
1001
+ break;
1002
+ }
1003
+ case '.md': {
1004
+ fileType = 'md';
1005
+
1006
+ break;
1007
+ }
1008
+ // No default
1009
+ }
1010
+
1011
+ // Wrap content in file element and store
1012
+ const wrappedContent = this.wrapContentInXml(processedContent, filePath, fileType);
1013
+ dependencies.set(filePath, wrappedContent);
475
1014
 
476
1015
  // Recursively scan for more dependencies
477
- const nestedRefs = this.extractFileReferences(processedContent);
1016
+ const { refs: nestedRefs } = this.extractFileReferences(processedContent);
478
1017
  for (const ref of nestedRefs) {
479
1018
  await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
480
1019
  }
481
1020
  }
482
1021
 
1022
+ /**
1023
+ * Process a workflow YAML file and its bundle files
1024
+ */
1025
+ async processWorkflowDependency(workflowPath, dependencies, processed, moduleName, warnings = []) {
1026
+ // Skip if already processed
1027
+ if (processed.has(workflowPath)) {
1028
+ return { skipped: false };
1029
+ }
1030
+ processed.add(workflowPath);
1031
+
1032
+ // Resolve actual file path
1033
+ const actualPath = this.resolveFilePath(workflowPath, moduleName);
1034
+
1035
+ if (!actualPath || !(await fs.pathExists(actualPath))) {
1036
+ warnings.push(workflowPath);
1037
+ return { skipped: true };
1038
+ }
1039
+
1040
+ // Read and parse YAML file
1041
+ const yamlContent = await fs.readFile(actualPath, 'utf8');
1042
+ let workflowConfig;
1043
+
1044
+ try {
1045
+ workflowConfig = yaml.load(yamlContent);
1046
+ } catch (error) {
1047
+ warnings.push(`${workflowPath} (invalid YAML: ${error.message})`);
1048
+ return { skipped: true };
1049
+ }
1050
+
1051
+ // Check if web_bundle is explicitly set to false
1052
+ if (workflowConfig.web_bundle === false) {
1053
+ // Mark this workflow as skipped so we can remove the command from agent
1054
+ return { skipped: true, workflowPath };
1055
+ }
1056
+
1057
+ // Create YAML content with only web_bundle section (flattened)
1058
+ let bundleYamlContent;
1059
+ if (workflowConfig.web_bundle && typeof workflowConfig.web_bundle === 'object') {
1060
+ // Only include the web_bundle content, flattened to root level
1061
+ bundleYamlContent = yaml.dump(workflowConfig.web_bundle);
1062
+ } else {
1063
+ // If no web_bundle section, include full YAML
1064
+ bundleYamlContent = yamlContent;
1065
+ }
1066
+
1067
+ // Process {project-root} and {bmad_folder} references in the YAML content
1068
+ bundleYamlContent = this.processProjectRootReferences(bundleYamlContent);
1069
+
1070
+ // Include the YAML file with only web_bundle content, wrapped in XML
1071
+ // Process the workflow path to create a clean ID
1072
+ let yamlId = workflowPath.replace(/^{project-root}\//, '');
1073
+ yamlId = yamlId.replace(/^{bmad_folder}\//, 'bmad/');
1074
+ const wrappedYaml = this.wrapContentInXml(bundleYamlContent, yamlId, 'yaml');
1075
+ dependencies.set(yamlId, wrappedYaml);
1076
+
1077
+ // Always include core workflow task when processing workflows
1078
+ await this.includeCoreWorkflowFiles(dependencies, processed, moduleName, warnings);
1079
+
1080
+ // Check if advanced elicitation is enabled
1081
+ if (workflowConfig.web_bundle && workflowConfig.web_bundle.use_advanced_elicitation) {
1082
+ await this.includeAdvancedElicitationFiles(dependencies, processed, moduleName, warnings);
1083
+ }
1084
+
1085
+ // Process web_bundle_files if they exist
1086
+ if (workflowConfig.web_bundle && workflowConfig.web_bundle.web_bundle_files) {
1087
+ const bundleFiles = workflowConfig.web_bundle.web_bundle_files;
1088
+
1089
+ for (const bundleFilePath of bundleFiles) {
1090
+ // Process the file path to create a clean ID for checking if already processed
1091
+ let cleanFilePath = bundleFilePath.replace(/^{project-root}\//, '');
1092
+ cleanFilePath = cleanFilePath.replace(/^{bmad_folder}\//, 'bmad/');
1093
+
1094
+ if (processed.has(cleanFilePath)) {
1095
+ continue;
1096
+ }
1097
+
1098
+ const bundleActualPath = this.resolveFilePath(bundleFilePath, moduleName);
1099
+
1100
+ if (!bundleActualPath || !(await fs.pathExists(bundleActualPath))) {
1101
+ // Use the cleaned path in warnings (with {bmad_folder} replaced)
1102
+ warnings.push(cleanFilePath);
1103
+ continue;
1104
+ }
1105
+
1106
+ // Check if this is another workflow.yaml file - if so, recursively process it
1107
+ if (bundleFilePath.endsWith('workflow.yaml')) {
1108
+ // Recursively process this workflow and its dependencies
1109
+ await this.processWorkflowDependency(bundleFilePath, dependencies, processed, moduleName, warnings);
1110
+ } else {
1111
+ // Regular file - process normally
1112
+ processed.add(cleanFilePath);
1113
+
1114
+ // Read the file content
1115
+ let fileContent = await fs.readFile(bundleActualPath, 'utf8');
1116
+ const fileExt = path.extname(bundleActualPath).toLowerCase().replace('.', '');
1117
+
1118
+ // Process {project-root} references before wrapping
1119
+ fileContent = this.processProjectRootReferences(fileContent);
1120
+
1121
+ // Wrap in XML with proper escaping
1122
+ const wrappedContent = this.wrapContentInXml(fileContent, cleanFilePath, fileExt);
1123
+ dependencies.set(cleanFilePath, wrappedContent);
1124
+ }
1125
+ }
1126
+ }
1127
+
1128
+ return { skipped: false };
1129
+ }
1130
+
1131
+ /**
1132
+ * Include core workflow task files
1133
+ */
1134
+ async includeCoreWorkflowFiles(dependencies, processed, moduleName, warnings = []) {
1135
+ const coreWorkflowPath = 'bmad/core/tasks/workflow.xml';
1136
+
1137
+ if (processed.has(coreWorkflowPath)) {
1138
+ return;
1139
+ }
1140
+ processed.add(coreWorkflowPath);
1141
+
1142
+ const actualPath = this.resolveFilePath(coreWorkflowPath, moduleName);
1143
+
1144
+ if (!actualPath || !(await fs.pathExists(actualPath))) {
1145
+ warnings.push(coreWorkflowPath);
1146
+ return;
1147
+ }
1148
+
1149
+ let fileContent = await fs.readFile(actualPath, 'utf8');
1150
+ // Process {project-root} and {bmad_folder} references
1151
+ fileContent = this.processProjectRootReferences(fileContent);
1152
+ const wrappedContent = this.wrapContentInXml(fileContent, coreWorkflowPath, 'xml');
1153
+ dependencies.set(coreWorkflowPath, wrappedContent);
1154
+ }
1155
+
1156
+ /**
1157
+ * Include advanced elicitation files
1158
+ */
1159
+ async includeAdvancedElicitationFiles(dependencies, processed, moduleName, warnings = []) {
1160
+ const elicitationFiles = ['bmad/core/tasks/advanced-elicitation.xml', 'bmad/core/tasks/advanced-elicitation-methods.csv'];
1161
+
1162
+ for (const filePath of elicitationFiles) {
1163
+ if (processed.has(filePath)) {
1164
+ continue;
1165
+ }
1166
+ processed.add(filePath);
1167
+
1168
+ const actualPath = this.resolveFilePath(filePath, moduleName);
1169
+
1170
+ if (!actualPath || !(await fs.pathExists(actualPath))) {
1171
+ warnings.push(filePath);
1172
+ continue;
1173
+ }
1174
+
1175
+ let fileContent = await fs.readFile(actualPath, 'utf8');
1176
+ // Process {project-root} and {bmad_folder} references
1177
+ fileContent = this.processProjectRootReferences(fileContent);
1178
+ const fileExt = path.extname(actualPath).toLowerCase().replace('.', '');
1179
+ const wrappedContent = this.wrapContentInXml(fileContent, filePath, fileExt);
1180
+ dependencies.set(filePath, wrappedContent);
1181
+ }
1182
+ }
1183
+
1184
+ /**
1185
+ * Wrap file content in XML with proper escaping
1186
+ */
1187
+ wrapContentInXml(content, id, type = 'text') {
1188
+ // For XML files, include directly without CDATA (they're already valid XML)
1189
+ if (type === 'xml') {
1190
+ // XML files can be included directly as they're already well-formed
1191
+ // Just wrap in a file element
1192
+ return `<file id="${id}" type="${type}">\n${content}\n</file>`;
1193
+ }
1194
+
1195
+ // For all other file types, use CDATA to preserve content exactly
1196
+ // Escape any ]]> sequences in the content by splitting CDATA sections
1197
+ // Replace ]]> with ]]]]><![CDATA[> to properly escape it within CDATA
1198
+ const escapedContent = content.replaceAll(']]>', ']]]]><![CDATA[>');
1199
+
1200
+ // Use CDATA to preserve content exactly as-is, including special characters
1201
+ return `<file id="${id}" type="${type}"><![CDATA[${escapedContent}]]></file>`;
1202
+ }
1203
+
483
1204
  /**
484
1205
  * Process wildcard dependency patterns
485
1206
  */
486
1207
  async processWildcardDependency(pattern, dependencies, processed, moduleName, warnings = []) {
487
1208
  // Remove {project-root} prefix
488
1209
  pattern = pattern.replace(/^{project-root}\//, '');
1210
+ // Replace {bmad_folder} with bmad
1211
+ pattern = pattern.replace(/^{bmad_folder}\//, 'bmad/');
489
1212
 
490
1213
  // Get directory and file pattern
491
1214
  const lastSlash = pattern.lastIndexOf('/');
@@ -553,6 +1276,9 @@ class WebBundler {
553
1276
  resolveFilePath(filePath, moduleName) {
554
1277
  // Remove {project-root} prefix
555
1278
  filePath = filePath.replace(/^{project-root}\//, '');
1279
+ // Replace {bmad_folder} with bmad
1280
+ filePath = filePath.replace(/^{bmad_folder}\//, 'bmad/');
1281
+ filePath = filePath.replace(/^{bmad_folder}$/, 'bmad');
556
1282
 
557
1283
  // Check temp directory first for _cfg files
558
1284
  if (filePath.startsWith('bmad/_cfg/')) {
@@ -619,13 +1345,15 @@ class WebBundler {
619
1345
  }
620
1346
 
621
1347
  /**
622
- * Process and remove {project-root} references
1348
+ * Process and remove {project-root} references and replace {bmad_folder} with bmad
623
1349
  */
624
1350
  processProjectRootReferences(content) {
625
1351
  // Remove {project-root}/ prefix (with slash)
626
1352
  content = content.replaceAll('{project-root}/', '');
627
1353
  // Also remove {project-root} without slash
628
1354
  content = content.replaceAll('{project-root}', '');
1355
+ // Replace {bmad_folder} with bmad
1356
+ content = content.replaceAll('{bmad_folder}', 'bmad');
629
1357
  return content;
630
1358
  }
631
1359
 
@@ -665,10 +1393,113 @@ class WebBundler {
665
1393
  return parts.join('');
666
1394
  }
667
1395
 
1396
+ /**
1397
+ * Inject help and exit menu items into agent XML
1398
+ */
1399
+ injectHelpExitMenuItems(agentXml) {
1400
+ // Check if menu already has help and exit
1401
+ const hasHelp = agentXml.includes('cmd="*help"') || agentXml.includes('trigger="*help"');
1402
+ const hasExit = agentXml.includes('cmd="*exit"') || agentXml.includes('trigger="*exit"');
1403
+
1404
+ if (hasHelp && hasExit) {
1405
+ return agentXml; // Already has both, skip injection
1406
+ }
1407
+
1408
+ // Find the menu section
1409
+ const menuMatch = agentXml.match(/(<menu>[\s\S]*?<\/menu>)/);
1410
+ if (!menuMatch) {
1411
+ return agentXml; // No menu found, skip injection
1412
+ }
1413
+
1414
+ const menuContent = menuMatch[1];
1415
+ const menuClosingMatch = menuContent.match(/(\s*)<\/menu>/);
1416
+ if (!menuClosingMatch) {
1417
+ return agentXml;
1418
+ }
1419
+
1420
+ const indent = menuClosingMatch[1];
1421
+ const menuItems = [];
1422
+
1423
+ if (!hasHelp) {
1424
+ menuItems.push(`${indent}<item cmd="*help">Show numbered menu</item>`);
1425
+ }
1426
+
1427
+ if (!hasExit) {
1428
+ menuItems.push(`${indent}<item cmd="*exit">Exit with confirmation</item>`);
1429
+ }
1430
+
1431
+ if (menuItems.length === 0) {
1432
+ return agentXml;
1433
+ }
1434
+
1435
+ // Inject menu items before closing </menu> tag
1436
+ const newMenuContent = menuContent.replace(/(\s*)<\/menu>/, `\n${menuItems.join('\n')}\n${indent}</menu>`);
1437
+ return agentXml.replace(menuContent, newMenuContent);
1438
+ }
1439
+
1440
+ /**
1441
+ * Inject web activation instructions into agent XML
1442
+ */
1443
+ injectWebActivation(agentXml) {
1444
+ // First, always inject help/exit menu items
1445
+ agentXml = this.injectHelpExitMenuItems(agentXml);
1446
+
1447
+ // Load the web activation template
1448
+ const activationPath = path.join(this.sourceDir, 'utility', 'models', 'agent-activation-web.xml');
1449
+
1450
+ if (!fs.existsSync(activationPath)) {
1451
+ console.warn(chalk.yellow('Warning: agent-activation-web.xml not found, skipping activation injection'));
1452
+ return agentXml;
1453
+ }
1454
+
1455
+ const activationXml = fs.readFileSync(activationPath, 'utf8');
1456
+
1457
+ // For web bundles, ALWAYS replace existing activation with web activation
1458
+ // This is because fragment-based activation assumes filesystem access which won't work in web bundles
1459
+ const hasActivation = agentXml.includes('<activation');
1460
+
1461
+ if (hasActivation) {
1462
+ // Replace existing activation block with web activation
1463
+ const injectedXml = agentXml.replace(/<activation[^>]*>[\s\S]*?<\/activation>/, activationXml);
1464
+ return injectedXml;
1465
+ }
1466
+
1467
+ // Check for critical-actions block (legacy)
1468
+ const hasCriticalActions = agentXml.includes('<critical-actions');
1469
+
1470
+ if (hasCriticalActions) {
1471
+ // Replace critical-actions block with activation
1472
+ const injectedXml = agentXml.replace(/<critical-actions>[\s\S]*?<\/critical-actions>/, activationXml);
1473
+ return injectedXml;
1474
+ }
1475
+
1476
+ // If no critical-actions, inject before closing </agent> tag
1477
+ const closingTagMatch = agentXml.match(/(\s*)<\/agent>/);
1478
+ if (!closingTagMatch) {
1479
+ console.warn(chalk.yellow('Warning: Could not find </agent> tag for activation injection'));
1480
+ return agentXml;
1481
+ }
1482
+
1483
+ // Inject the activation block before the closing </agent> tag
1484
+ // Properly indent each line of the activation XML
1485
+ const indent = closingTagMatch[1];
1486
+ const indentedActivation = activationXml
1487
+ .split('\n')
1488
+ .map((line) => (line.trim() ? indent + line : ''))
1489
+ .join('\n');
1490
+
1491
+ const injectedXml = agentXml.replace(/(\s*)<\/agent>/, `\n${indentedActivation}\n${indent}</agent>`);
1492
+
1493
+ return injectedXml;
1494
+ }
1495
+
668
1496
  /**
669
1497
  * Build the final agent bundle XML
670
1498
  */
671
1499
  buildAgentBundle(agentXml, dependencies) {
1500
+ // Web activation is now handled by fragments during YAML building
1501
+ // agentXml = this.injectWebActivation(agentXml);
1502
+
672
1503
  const parts = [
673
1504
  '<?xml version="1.0" encoding="UTF-8"?>',
674
1505
  '<agent-bundle>',
@@ -676,14 +1507,13 @@ class WebBundler {
676
1507
  ' ' + agentXml.replaceAll('\n', '\n '),
677
1508
  ];
678
1509
 
679
- // Add dependencies without wrapper tags
1510
+ // Add dependencies (all are now consistently wrapped in <file> elements)
680
1511
  if (dependencies && dependencies.size > 0) {
681
1512
  parts.push('\n <!-- Dependencies -->');
682
1513
  for (const [id, content] of dependencies) {
683
- // Escape XML content while preserving tags
684
- const escapedContent = this.escapeXmlContent(content);
1514
+ // All dependencies are now wrapped in <file> elements
685
1515
  // Indent properly
686
- const indentedContent = escapedContent
1516
+ const indentedContent = content
687
1517
  .split('\n')
688
1518
  .map((line) => ' ' + line)
689
1519
  .join('\n');
@@ -732,7 +1562,8 @@ class WebBundler {
732
1562
  const files = await fs.readdir(agentsPath);
733
1563
 
734
1564
  for (const file of files) {
735
- if (file.endsWith('.md')) {
1565
+ // Look for .agent.yaml files (new format) or .md files (legacy format)
1566
+ if (file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme'))) {
736
1567
  agents.push(file);
737
1568
  }
738
1569
  }
@@ -754,7 +1585,7 @@ class WebBundler {
754
1585
  const files = await fs.readdir(teamsPath);
755
1586
 
756
1587
  for (const file of files) {
757
- if (file.endsWith('.md')) {
1588
+ if (file.endsWith('.yaml') || file.endsWith('.yml')) {
758
1589
  teams.push(file);
759
1590
  }
760
1591
  }
@@ -794,8 +1625,8 @@ class WebBundler {
794
1625
  // Ensure temp directory exists
795
1626
  await fs.ensureDir(this.tempManifestDir);
796
1627
 
797
- // Generate agent-party.xml using shared generator
798
- const agentPartyPath = path.join(this.tempManifestDir, 'agent-party.xml');
1628
+ // Generate agent-manifest.csv using shared generator
1629
+ const agentPartyPath = path.join(this.tempManifestDir, 'agent-manifest.csv');
799
1630
  await AgentPartyGenerator.writeAgentParty(agentPartyPath, this.discoveredAgents, { forWeb: true });
800
1631
 
801
1632
  console.log(chalk.dim(' ✓ Created temporary manifest files'));
@@ -826,6 +1657,63 @@ class WebBundler {
826
1657
  }
827
1658
  }
828
1659
 
1660
+ /**
1661
+ * Format XML content for readability
1662
+ */
1663
+ formatXml(xml) {
1664
+ const TAB = ' '; // 2 spaces
1665
+ let result = '';
1666
+ let depth = 0;
1667
+
1668
+ // Split by tags while preserving them
1669
+ const parts = xml.split(/(<[^>]+>)/g);
1670
+
1671
+ for (let i = 0; i < parts.length; i++) {
1672
+ const part = parts[i];
1673
+ if (!part) continue;
1674
+
1675
+ if (part.startsWith('<?xml')) {
1676
+ // XML declaration - no indent
1677
+ result += part + '\n';
1678
+ } else if (part.startsWith('<!--')) {
1679
+ // Comment
1680
+ result += TAB.repeat(depth) + part + '\n';
1681
+ } else if (part.startsWith('</')) {
1682
+ // Closing tag - unindent first
1683
+ depth = Math.max(0, depth - 1);
1684
+ result += TAB.repeat(depth) + part + '\n';
1685
+ } else if (part.startsWith('<')) {
1686
+ // Opening or self-closing tag
1687
+ const isSelfClosing = part.endsWith('/>');
1688
+ const tagName = part.match(/<(\w+)/)?.[1];
1689
+
1690
+ // Check if next part is simple text content
1691
+ const nextPart = parts[i + 1];
1692
+ const hasSimpleContent = nextPart && !nextPart.startsWith('<') && nextPart.trim().length > 0 && nextPart.trim().length <= 100;
1693
+
1694
+ if (hasSimpleContent && parts[i + 2] && parts[i + 2] === `</${tagName}>`) {
1695
+ // Simple tag with inline content: <tag>content</tag>
1696
+ result += TAB.repeat(depth) + part + nextPart.trim() + parts[i + 2] + '\n';
1697
+ i += 2; // Skip content and closing tag
1698
+ } else {
1699
+ // Multi-line tag
1700
+ result += TAB.repeat(depth) + part + '\n';
1701
+ if (!isSelfClosing) {
1702
+ depth++;
1703
+ }
1704
+ }
1705
+ } else {
1706
+ // Text content between tags
1707
+ const trimmed = part.trim();
1708
+ if (trimmed) {
1709
+ result += TAB.repeat(depth) + trimmed + '\n';
1710
+ }
1711
+ }
1712
+ }
1713
+
1714
+ return result;
1715
+ }
1716
+
829
1717
  /**
830
1718
  * Display summary statistics
831
1719
  */
@@ -837,7 +1725,9 @@ class WebBundler {
837
1725
  console.log(chalk.bold('Bundle Statistics:'));
838
1726
  console.log(` Total agents found: ${this.stats.totalAgents}`);
839
1727
  console.log(` Successfully bundled: ${chalk.green(this.stats.bundledAgents)}`);
840
- console.log(` Skipped (bundle=false): ${chalk.gray(this.stats.skippedAgents)}`);
1728
+ if (this.stats.skippedAgents > 0) {
1729
+ console.log(` Skipped (webskip/bundle): ${chalk.gray(this.stats.skippedAgents)}`);
1730
+ }
841
1731
 
842
1732
  if (this.stats.failedAgents > 0) {
843
1733
  console.log(` Failed to bundle: ${chalk.red(this.stats.failedAgents)}`);
@@ -848,12 +1738,15 @@ class WebBundler {
848
1738
  }
849
1739
 
850
1740
  // Display warnings summary
851
- if (this.stats.warnings.length > 0) {
1741
+ // Check if there are actually any warnings with content
1742
+ const hasActualWarnings = this.stats.warnings.some((w) => w && w.warnings && w.warnings.length > 0);
1743
+
1744
+ if (hasActualWarnings) {
852
1745
  console.log(chalk.yellow('\n⚠ Missing Dependencies by Agent:'));
853
1746
 
854
1747
  // Group and display warnings by agent
855
1748
  for (const agentWarning of this.stats.warnings) {
856
- if (agentWarning.warnings.length > 0) {
1749
+ if (agentWarning && agentWarning.warnings && agentWarning.warnings.length > 0) {
857
1750
  console.log(chalk.bold(`\n ${agentWarning.agent}:`));
858
1751
  // Display unique warnings for this agent
859
1752
  const uniqueWarnings = [...new Set(agentWarning.warnings)];
@@ -862,6 +1755,8 @@ class WebBundler {
862
1755
  }
863
1756
  }
864
1757
  }
1758
+ } else {
1759
+ console.log(chalk.green('\n✓ No missing dependencies'));
865
1760
  }
866
1761
 
867
1762
  // Final status