observer-ggboy-bmad-method 6.0.0-alpha.23

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 (604) hide show
  1. package/.coderabbit.yaml +40 -0
  2. package/.github/CODE_OF_CONDUCT.md +128 -0
  3. package/.github/FUNDING.yaml +15 -0
  4. package/.github/ISSUE_TEMPLATE/config.yaml +8 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  6. package/.github/ISSUE_TEMPLATE/issue.md +32 -0
  7. package/.github/scripts/discord-helpers.sh +34 -0
  8. package/.github/workflows/bundle-latest.yaml +330 -0
  9. package/.github/workflows/discord.yaml +90 -0
  10. package/.github/workflows/docs.yaml +63 -0
  11. package/.github/workflows/manual-release.yaml +190 -0
  12. package/.github/workflows/quality.yaml +115 -0
  13. package/.health-status.json +7 -0
  14. package/.husky/pre-commit +20 -0
  15. package/.markdownlint-cli2.yaml +41 -0
  16. package/.nvmrc +1 -0
  17. package/.prettierignore +9 -0
  18. package/.vscode/settings.json +97 -0
  19. package/CHANGELOG.md +1394 -0
  20. package/CNAME +1 -0
  21. package/CONTRIBUTING.md +167 -0
  22. package/CONTRIBUTORS.md +32 -0
  23. package/LICENSE +30 -0
  24. package/README.md +100 -0
  25. package/SECURITY.md +85 -0
  26. package/TRADEMARK.md +55 -0
  27. package/Wordmark.png +0 -0
  28. package/banner-bmad-method.png +0 -0
  29. package/bmad-method-6.0.0-alpha.23.tgz +0 -0
  30. package/docs/404.md +9 -0
  31. package/docs/_README_WORKFLOW_DIAGRAMS.md +40 -0
  32. package/docs/_STYLE_GUIDE.md +367 -0
  33. package/docs/_archive/customize-workflows.md +30 -0
  34. package/docs/_archive/getting-started-bmadv4.md +247 -0
  35. package/docs/_archive/vendor-workflows.md +52 -0
  36. package/docs/downloads.md +72 -0
  37. package/docs/explanation/agents/barry-quick-flow.md +328 -0
  38. package/docs/explanation/agents/index.md +19 -0
  39. package/docs/explanation/architecture/four-phases.md +107 -0
  40. package/docs/explanation/architecture/preventing-agent-conflicts.md +111 -0
  41. package/docs/explanation/architecture/why-solutioning-matters.md +75 -0
  42. package/docs/explanation/bmm/index.md +131 -0
  43. package/docs/explanation/core/index.md +18 -0
  44. package/docs/explanation/core-concepts/agent-roles.md +179 -0
  45. package/docs/explanation/core-concepts/index.md +35 -0
  46. package/docs/explanation/core-concepts/what-are-agents.md +97 -0
  47. package/docs/explanation/core-concepts/what-are-modules.md +85 -0
  48. package/docs/explanation/core-concepts/what-are-workflows.md +204 -0
  49. package/docs/explanation/faq/brownfield-faq.md +73 -0
  50. package/docs/explanation/faq/getting-started-faq.md +67 -0
  51. package/docs/explanation/faq/implementation-faq.md +52 -0
  52. package/docs/explanation/faq/index.md +16 -0
  53. package/docs/explanation/faq/levels-and-tracks-faq.md +52 -0
  54. package/docs/explanation/faq/planning-faq.md +41 -0
  55. package/docs/explanation/faq/tools-faq.md +277 -0
  56. package/docs/explanation/faq/workflows-faq.md +61 -0
  57. package/docs/explanation/features/advanced-elicitation.md +95 -0
  58. package/docs/explanation/features/brainstorming-techniques.md +92 -0
  59. package/docs/explanation/features/party-mode.md +95 -0
  60. package/docs/explanation/features/quick-flow.md +149 -0
  61. package/docs/explanation/features/tea-overview.md +410 -0
  62. package/docs/explanation/features/web-bundles.md +34 -0
  63. package/docs/explanation/philosophy/facilitation-over-generation.md +333 -0
  64. package/docs/explanation/philosophy/testing-as-engineering.md +112 -0
  65. package/docs/explanation/tea/engagement-models.md +710 -0
  66. package/docs/explanation/tea/fixture-architecture.md +457 -0
  67. package/docs/explanation/tea/knowledge-base-system.md +554 -0
  68. package/docs/explanation/tea/network-first-patterns.md +853 -0
  69. package/docs/explanation/tea/risk-based-testing.md +586 -0
  70. package/docs/explanation/tea/test-quality-standards.md +907 -0
  71. package/docs/how-to/brownfield/add-feature-to-existing.md +74 -0
  72. package/docs/how-to/brownfield/document-existing-project.md +66 -0
  73. package/docs/how-to/brownfield/index.md +84 -0
  74. package/docs/how-to/brownfield/quick-fix-in-brownfield.md +77 -0
  75. package/docs/how-to/brownfield/use-tea-for-enterprise.md +525 -0
  76. package/docs/how-to/brownfield/use-tea-with-existing-tests.md +577 -0
  77. package/docs/how-to/customization/customize-agents.md +212 -0
  78. package/docs/how-to/customization/enable-tea-mcp-enhancements.md +424 -0
  79. package/docs/how-to/customization/index.md +23 -0
  80. package/docs/how-to/customization/integrate-playwright-utils.md +813 -0
  81. package/docs/how-to/customization/shard-large-documents.md +101 -0
  82. package/docs/how-to/get-answers-about-bmad.md +102 -0
  83. package/docs/how-to/installation/index.md +12 -0
  84. package/docs/how-to/installation/install-bmad.md +111 -0
  85. package/docs/how-to/installation/install-custom-modules.md +118 -0
  86. package/docs/how-to/installation/upgrade-to-v6.md +131 -0
  87. package/docs/how-to/workflows/bmgd-quick-flow.md +156 -0
  88. package/docs/how-to/workflows/conduct-research.md +97 -0
  89. package/docs/how-to/workflows/create-architecture.md +119 -0
  90. package/docs/how-to/workflows/create-epics-and-stories.md +109 -0
  91. package/docs/how-to/workflows/create-prd.md +91 -0
  92. package/docs/how-to/workflows/create-product-brief.md +94 -0
  93. package/docs/how-to/workflows/create-story.md +102 -0
  94. package/docs/how-to/workflows/create-ux-design.md +100 -0
  95. package/docs/how-to/workflows/implement-story.md +97 -0
  96. package/docs/how-to/workflows/quick-spec.md +122 -0
  97. package/docs/how-to/workflows/run-atdd.md +436 -0
  98. package/docs/how-to/workflows/run-automate.md +653 -0
  99. package/docs/how-to/workflows/run-brainstorming-session.md +73 -0
  100. package/docs/how-to/workflows/run-code-review.md +89 -0
  101. package/docs/how-to/workflows/run-implementation-readiness.md +125 -0
  102. package/docs/how-to/workflows/run-nfr-assess.md +679 -0
  103. package/docs/how-to/workflows/run-sprint-planning.md +94 -0
  104. package/docs/how-to/workflows/run-test-design.md +135 -0
  105. package/docs/how-to/workflows/run-test-review.md +605 -0
  106. package/docs/how-to/workflows/run-trace.md +883 -0
  107. package/docs/how-to/workflows/setup-ci.md +712 -0
  108. package/docs/how-to/workflows/setup-party-mode.md +89 -0
  109. package/docs/how-to/workflows/setup-test-framework.md +98 -0
  110. package/docs/index.md +63 -0
  111. package/docs/reference/agents/index.md +109 -0
  112. package/docs/reference/configuration/core-tasks.md +67 -0
  113. package/docs/reference/configuration/global-config.md +28 -0
  114. package/docs/reference/glossary/index.md +159 -0
  115. package/docs/reference/tea/commands.md +276 -0
  116. package/docs/reference/tea/configuration.md +678 -0
  117. package/docs/reference/tea/knowledge-base.md +340 -0
  118. package/docs/reference/workflows/core-workflows.md +32 -0
  119. package/docs/reference/workflows/document-project.md +73 -0
  120. package/docs/reference/workflows/index.md +12 -0
  121. package/docs/tutorials/getting-started/getting-started-bmadv6.md +246 -0
  122. package/docs/tutorials/getting-started/images/workflow-method-greenfield.excalidraw +5034 -0
  123. package/docs/tutorials/getting-started/images/workflow-method-greenfield.svg +4 -0
  124. package/docs/tutorials/getting-started/images/workflow-overview.jpg +0 -0
  125. package/docs/tutorials/getting-started/tea-lite-quickstart.md +444 -0
  126. package/docs/tutorials/getting-started/workflow-overview.jpg +0 -0
  127. package/eslint.config.mjs +152 -0
  128. package/package.json +117 -0
  129. package/prettier.config.mjs +32 -0
  130. package/src/bmm/_module-installer/installer.js +48 -0
  131. package/src/bmm/_module-installer/platform-specifics/claude-code.js +35 -0
  132. package/src/bmm/_module-installer/platform-specifics/windsurf.js +32 -0
  133. package/src/bmm/agents/analyst.agent.yaml +36 -0
  134. package/src/bmm/agents/architect.agent.yaml +28 -0
  135. package/src/bmm/agents/dev.agent.yaml +38 -0
  136. package/src/bmm/agents/pm.agent.yaml +46 -0
  137. package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
  138. package/src/bmm/agents/sm.agent.yaml +36 -0
  139. package/src/bmm/agents/tea.agent.yaml +63 -0
  140. package/src/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
  141. package/src/bmm/agents/tech-writer/tech-writer.agent.yaml +45 -0
  142. package/src/bmm/agents/ux-designer.agent.yaml +26 -0
  143. package/src/bmm/data/project-context-template.md +26 -0
  144. package/src/bmm/module-help.csv +32 -0
  145. package/src/bmm/module.yaml +44 -0
  146. package/src/bmm/sub-modules/claude-code/config.yaml +4 -0
  147. package/src/bmm/sub-modules/claude-code/injections.yaml +242 -0
  148. package/src/bmm/sub-modules/claude-code/readme.md +87 -0
  149. package/src/bmm/teams/default-party.csv +21 -0
  150. package/src/bmm/teams/team-fullstack.yaml +12 -0
  151. package/src/bmm/testarch/knowledge/adr-quality-readiness-checklist.md +350 -0
  152. package/src/bmm/testarch/knowledge/api-request.md +442 -0
  153. package/src/bmm/testarch/knowledge/api-testing-patterns.md +843 -0
  154. package/src/bmm/testarch/knowledge/auth-session.md +552 -0
  155. package/src/bmm/testarch/knowledge/burn-in.md +273 -0
  156. package/src/bmm/testarch/knowledge/ci-burn-in.md +675 -0
  157. package/src/bmm/testarch/knowledge/component-tdd.md +486 -0
  158. package/src/bmm/testarch/knowledge/contract-testing.md +957 -0
  159. package/src/bmm/testarch/knowledge/data-factories.md +500 -0
  160. package/src/bmm/testarch/knowledge/email-auth.md +721 -0
  161. package/src/bmm/testarch/knowledge/error-handling.md +725 -0
  162. package/src/bmm/testarch/knowledge/feature-flags.md +750 -0
  163. package/src/bmm/testarch/knowledge/file-utils.md +463 -0
  164. package/src/bmm/testarch/knowledge/fixture-architecture.md +401 -0
  165. package/src/bmm/testarch/knowledge/fixtures-composition.md +382 -0
  166. package/src/bmm/testarch/knowledge/intercept-network-call.md +430 -0
  167. package/src/bmm/testarch/knowledge/log.md +429 -0
  168. package/src/bmm/testarch/knowledge/network-error-monitor.md +405 -0
  169. package/src/bmm/testarch/knowledge/network-first.md +486 -0
  170. package/src/bmm/testarch/knowledge/network-recorder.md +527 -0
  171. package/src/bmm/testarch/knowledge/nfr-criteria.md +670 -0
  172. package/src/bmm/testarch/knowledge/overview.md +286 -0
  173. package/src/bmm/testarch/knowledge/playwright-config.md +730 -0
  174. package/src/bmm/testarch/knowledge/probability-impact.md +601 -0
  175. package/src/bmm/testarch/knowledge/recurse.md +421 -0
  176. package/src/bmm/testarch/knowledge/risk-governance.md +615 -0
  177. package/src/bmm/testarch/knowledge/selective-testing.md +732 -0
  178. package/src/bmm/testarch/knowledge/selector-resilience.md +527 -0
  179. package/src/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
  180. package/src/bmm/testarch/knowledge/test-levels-framework.md +473 -0
  181. package/src/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
  182. package/src/bmm/testarch/knowledge/test-quality.md +664 -0
  183. package/src/bmm/testarch/knowledge/timing-debugging.md +372 -0
  184. package/src/bmm/testarch/knowledge/visual-debugging.md +524 -0
  185. package/src/bmm/testarch/tea-index.csv +35 -0
  186. package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
  187. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
  188. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
  189. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
  190. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
  191. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
  192. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
  193. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -0
  194. package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +58 -0
  195. package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
  196. package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
  197. package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
  198. package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
  199. package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
  200. package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -0
  201. package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
  202. package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
  203. package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +200 -0
  204. package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
  205. package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
  206. package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
  207. package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -0
  208. package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
  209. package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
  210. package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
  211. package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
  212. package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
  213. package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +239 -0
  214. package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -0
  215. package/src/bmm/workflows/1-analysis/research/workflow.md +173 -0
  216. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
  217. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
  218. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
  219. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
  220. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
  221. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
  222. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
  223. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
  224. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
  225. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
  226. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
  227. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
  228. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
  229. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
  230. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -0
  231. package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
  232. package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +43 -0
  233. package/src/bmm/workflows/2-plan-workflows/prd/data/domain-complexity.csv +13 -0
  234. package/src/bmm/workflows/2-plan-workflows/prd/data/prd-purpose.md +197 -0
  235. package/src/bmm/workflows/2-plan-workflows/prd/data/project-types.csv +11 -0
  236. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-01-init.md +191 -0
  237. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-01b-continue.md +153 -0
  238. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-02-discovery.md +224 -0
  239. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-03-success.md +226 -0
  240. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-04-journeys.md +213 -0
  241. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-05-domain.md +207 -0
  242. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-06-innovation.md +226 -0
  243. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-07-project-type.md +237 -0
  244. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-08-scoping.md +228 -0
  245. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-09-functional.md +231 -0
  246. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-10-nonfunctional.md +242 -0
  247. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-11-polish.md +217 -0
  248. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-12-complete.md +124 -0
  249. package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01-discovery.md +247 -0
  250. package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
  251. package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-02-review.md +249 -0
  252. package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-03-edit.md +253 -0
  253. package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-04-complete.md +168 -0
  254. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-01-discovery.md +218 -0
  255. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02-format-detection.md +191 -0
  256. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02b-parity-check.md +209 -0
  257. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-03-density-validation.md +174 -0
  258. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
  259. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-05-measurability-validation.md +228 -0
  260. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-06-traceability-validation.md +217 -0
  261. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
  262. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
  263. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-09-project-type-validation.md +263 -0
  264. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-10-smart-validation.md +209 -0
  265. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
  266. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-12-completeness-validation.md +242 -0
  267. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-13-report-complete.md +231 -0
  268. package/src/bmm/workflows/2-plan-workflows/prd/templates/prd-template.md +10 -0
  269. package/src/bmm/workflows/2-plan-workflows/prd/validation-report-prd-workflow.md +433 -0
  270. package/src/bmm/workflows/2-plan-workflows/prd/workflow.md +150 -0
  271. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +190 -0
  272. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +178 -0
  273. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
  274. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +139 -0
  275. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
  276. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +135 -0
  277. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
  278. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +55 -0
  279. package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
  280. package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +11 -0
  281. package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
  282. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
  283. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -0
  284. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
  285. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -0
  286. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
  287. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
  288. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
  289. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
  290. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -0
  291. package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +50 -0
  292. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
  293. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
  294. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
  295. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -0
  296. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
  297. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +59 -0
  298. package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
  299. package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
  300. package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +51 -0
  301. package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
  302. package/src/bmm/workflows/4-implementation/correct-course/instructions.md +206 -0
  303. package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +60 -0
  304. package/src/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
  305. package/src/bmm/workflows/4-implementation/create-story/instructions.xml +345 -0
  306. package/src/bmm/workflows/4-implementation/create-story/template.md +49 -0
  307. package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +61 -0
  308. package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
  309. package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
  310. package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +27 -0
  311. package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1443 -0
  312. package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +58 -0
  313. package/src/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
  314. package/src/bmm/workflows/4-implementation/sprint-planning/instructions.md +225 -0
  315. package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
  316. package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +54 -0
  317. package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +229 -0
  318. package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +36 -0
  319. package/src/bmm/workflows/bmad-quick-flow/quick-dev/data/project-levels.yaml +59 -0
  320. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +156 -0
  321. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +120 -0
  322. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +113 -0
  323. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +113 -0
  324. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +106 -0
  325. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +140 -0
  326. package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
  327. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +189 -0
  328. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +144 -0
  329. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +128 -0
  330. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +191 -0
  331. package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
  332. package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
  333. package/src/bmm/workflows/document-project/checklist.md +245 -0
  334. package/src/bmm/workflows/document-project/documentation-requirements.csv +12 -0
  335. package/src/bmm/workflows/document-project/instructions.md +221 -0
  336. package/src/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
  337. package/src/bmm/workflows/document-project/templates/index-template.md +169 -0
  338. package/src/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
  339. package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
  340. package/src/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
  341. package/src/bmm/workflows/document-project/workflow.yaml +30 -0
  342. package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
  343. package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
  344. package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
  345. package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
  346. package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +90 -0
  347. package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +127 -0
  348. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +39 -0
  349. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +130 -0
  350. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +27 -0
  351. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +43 -0
  352. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +141 -0
  353. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +27 -0
  354. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +49 -0
  355. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +241 -0
  356. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +27 -0
  357. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +38 -0
  358. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +133 -0
  359. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +27 -0
  360. package/src/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
  361. package/src/bmm/workflows/testarch/atdd/checklist.md +374 -0
  362. package/src/bmm/workflows/testarch/atdd/instructions.md +806 -0
  363. package/src/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
  364. package/src/bmm/workflows/testarch/automate/checklist.md +582 -0
  365. package/src/bmm/workflows/testarch/automate/instructions.md +1324 -0
  366. package/src/bmm/workflows/testarch/automate/workflow.yaml +54 -0
  367. package/src/bmm/workflows/testarch/ci/checklist.md +247 -0
  368. package/src/bmm/workflows/testarch/ci/github-actions-template.yaml +198 -0
  369. package/src/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +149 -0
  370. package/src/bmm/workflows/testarch/ci/instructions.md +536 -0
  371. package/src/bmm/workflows/testarch/ci/workflow.yaml +47 -0
  372. package/src/bmm/workflows/testarch/framework/checklist.md +320 -0
  373. package/src/bmm/workflows/testarch/framework/instructions.md +481 -0
  374. package/src/bmm/workflows/testarch/framework/workflow.yaml +49 -0
  375. package/src/bmm/workflows/testarch/nfr-assess/checklist.md +407 -0
  376. package/src/bmm/workflows/testarch/nfr-assess/instructions.md +726 -0
  377. package/src/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +461 -0
  378. package/src/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
  379. package/src/bmm/workflows/testarch/test-design/checklist.md +407 -0
  380. package/src/bmm/workflows/testarch/test-design/instructions.md +1158 -0
  381. package/src/bmm/workflows/testarch/test-design/test-design-architecture-template.md +213 -0
  382. package/src/bmm/workflows/testarch/test-design/test-design-qa-template.md +286 -0
  383. package/src/bmm/workflows/testarch/test-design/test-design-template.md +294 -0
  384. package/src/bmm/workflows/testarch/test-design/workflow.yaml +71 -0
  385. package/src/bmm/workflows/testarch/test-review/checklist.md +472 -0
  386. package/src/bmm/workflows/testarch/test-review/instructions.md +628 -0
  387. package/src/bmm/workflows/testarch/test-review/test-review-template.md +390 -0
  388. package/src/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
  389. package/src/bmm/workflows/testarch/trace/checklist.md +642 -0
  390. package/src/bmm/workflows/testarch/trace/instructions.md +1030 -0
  391. package/src/bmm/workflows/testarch/trace/trace-template.md +675 -0
  392. package/src/bmm/workflows/testarch/trace/workflow.yaml +57 -0
  393. package/src/core/_module-installer/installer.js +60 -0
  394. package/src/core/agents/bmad-master.agent.yaml +29 -0
  395. package/src/core/module-help.csv +9 -0
  396. package/src/core/module.yaml +25 -0
  397. package/src/core/resources/excalidraw/README.md +160 -0
  398. package/src/core/resources/excalidraw/excalidraw-helpers.md +127 -0
  399. package/src/core/resources/excalidraw/library-loader.md +50 -0
  400. package/src/core/resources/excalidraw/validate-json-instructions.md +79 -0
  401. package/src/core/tasks/editorial-review-prose.xml +100 -0
  402. package/src/core/tasks/editorial-review-structure.xml +209 -0
  403. package/src/core/tasks/help.md +62 -0
  404. package/src/core/tasks/index-docs.xml +65 -0
  405. package/src/core/tasks/review-adversarial-general.xml +48 -0
  406. package/src/core/tasks/shard-doc.xml +109 -0
  407. package/src/core/tasks/workflow.xml +235 -0
  408. package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
  409. package/src/core/workflows/advanced-elicitation/workflow.xml +117 -0
  410. package/src/core/workflows/brainstorming/brain-methods.csv +62 -0
  411. package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
  412. package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
  413. package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
  414. package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
  415. package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
  416. package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
  417. package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
  418. package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
  419. package/src/core/workflows/brainstorming/template.md +15 -0
  420. package/src/core/workflows/brainstorming/workflow.md +58 -0
  421. package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
  422. package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
  423. package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +157 -0
  424. package/src/core/workflows/party-mode/workflow.md +194 -0
  425. package/src/utility/agent-components/activation-rules.txt +6 -0
  426. package/src/utility/agent-components/activation-steps.txt +14 -0
  427. package/src/utility/agent-components/agent-command-header.md +1 -0
  428. package/src/utility/agent-components/agent.customize.template.yaml +41 -0
  429. package/src/utility/agent-components/handler-action.txt +4 -0
  430. package/src/utility/agent-components/handler-data.txt +5 -0
  431. package/src/utility/agent-components/handler-exec.txt +6 -0
  432. package/src/utility/agent-components/handler-multi.txt +14 -0
  433. package/src/utility/agent-components/handler-tmpl.txt +5 -0
  434. package/src/utility/agent-components/handler-validate-workflow.txt +7 -0
  435. package/src/utility/agent-components/handler-workflow.txt +10 -0
  436. package/src/utility/agent-components/menu-handlers.txt +6 -0
  437. package/test/README.md +295 -0
  438. package/test/adversarial-review-tests/README.md +56 -0
  439. package/test/adversarial-review-tests/sample-content.md +46 -0
  440. package/test/adversarial-review-tests/test-cases.yaml +103 -0
  441. package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +27 -0
  442. package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +30 -0
  443. package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +22 -0
  444. package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +20 -0
  445. package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +25 -0
  446. package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +24 -0
  447. package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +25 -0
  448. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -0
  449. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -0
  450. package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +31 -0
  451. package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +25 -0
  452. package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +25 -0
  453. package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +25 -0
  454. package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +25 -0
  455. package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
  456. package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
  457. package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +27 -0
  458. package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
  459. package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +24 -0
  460. package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +27 -0
  461. package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +27 -0
  462. package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +24 -0
  463. package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +29 -0
  464. package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +31 -0
  465. package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +28 -0
  466. package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +28 -0
  467. package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
  468. package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +28 -0
  469. package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
  470. package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
  471. package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
  472. package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +24 -0
  473. package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +22 -0
  474. package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +27 -0
  475. package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +31 -0
  476. package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +22 -0
  477. package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +38 -0
  478. package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +24 -0
  479. package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -0
  480. package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +34 -0
  481. package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -0
  482. package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +24 -0
  483. package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +24 -0
  484. package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +24 -0
  485. package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -0
  486. package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -0
  487. package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +24 -0
  488. package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +24 -0
  489. package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +22 -0
  490. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +28 -0
  491. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +30 -0
  492. package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +24 -0
  493. package/test/test-agent-schema.js +387 -0
  494. package/test/test-cli-integration.sh +159 -0
  495. package/test/test-installation-components.js +214 -0
  496. package/test/unit-test-schema.js +133 -0
  497. package/tools/bmad-npx-wrapper.js +38 -0
  498. package/tools/build-docs.js +577 -0
  499. package/tools/cli/README.md +7 -0
  500. package/tools/cli/bmad-cli.js +58 -0
  501. package/tools/cli/commands/install.js +87 -0
  502. package/tools/cli/commands/status.js +65 -0
  503. package/tools/cli/external-official-modules.yaml +56 -0
  504. package/tools/cli/installers/install-messages.yaml +58 -0
  505. package/tools/cli/installers/lib/core/config-collector.js +1079 -0
  506. package/tools/cli/installers/lib/core/custom-module-cache.js +259 -0
  507. package/tools/cli/installers/lib/core/dependency-resolver.js +739 -0
  508. package/tools/cli/installers/lib/core/detector.js +223 -0
  509. package/tools/cli/installers/lib/core/ide-config-manager.js +156 -0
  510. package/tools/cli/installers/lib/core/installer.js +2826 -0
  511. package/tools/cli/installers/lib/core/manifest-generator.js +1054 -0
  512. package/tools/cli/installers/lib/core/manifest.js +1036 -0
  513. package/tools/cli/installers/lib/custom/handler.js +363 -0
  514. package/tools/cli/installers/lib/ide/STANDARDIZATION_PLAN.md +208 -0
  515. package/tools/cli/installers/lib/ide/_base-ide.js +655 -0
  516. package/tools/cli/installers/lib/ide/antigravity.js +474 -0
  517. package/tools/cli/installers/lib/ide/auggie.js +244 -0
  518. package/tools/cli/installers/lib/ide/claude-code.js +506 -0
  519. package/tools/cli/installers/lib/ide/cline.js +272 -0
  520. package/tools/cli/installers/lib/ide/codex.js +412 -0
  521. package/tools/cli/installers/lib/ide/crush.js +149 -0
  522. package/tools/cli/installers/lib/ide/cursor.js +160 -0
  523. package/tools/cli/installers/lib/ide/gemini.js +301 -0
  524. package/tools/cli/installers/lib/ide/github-copilot.js +383 -0
  525. package/tools/cli/installers/lib/ide/iflow.js +191 -0
  526. package/tools/cli/installers/lib/ide/kilo.js +250 -0
  527. package/tools/cli/installers/lib/ide/kiro-cli.js +326 -0
  528. package/tools/cli/installers/lib/ide/manager.js +244 -0
  529. package/tools/cli/installers/lib/ide/opencode.js +257 -0
  530. package/tools/cli/installers/lib/ide/qwen.js +372 -0
  531. package/tools/cli/installers/lib/ide/roo.js +273 -0
  532. package/tools/cli/installers/lib/ide/rovo-dev.js +290 -0
  533. package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +165 -0
  534. package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +158 -0
  535. package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
  536. package/tools/cli/installers/lib/ide/shared/path-utils.js +165 -0
  537. package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +268 -0
  538. package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +293 -0
  539. package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
  540. package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +14 -0
  541. package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +12 -0
  542. package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +13 -0
  543. package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
  544. package/tools/cli/installers/lib/ide/trae.js +313 -0
  545. package/tools/cli/installers/lib/ide/windsurf.js +258 -0
  546. package/tools/cli/installers/lib/message-loader.js +85 -0
  547. package/tools/cli/installers/lib/modules/external-manager.js +135 -0
  548. package/tools/cli/installers/lib/modules/manager.js +1375 -0
  549. package/tools/cli/lib/activation-builder.js +163 -0
  550. package/tools/cli/lib/agent/compiler.js +522 -0
  551. package/tools/cli/lib/agent/installer.js +716 -0
  552. package/tools/cli/lib/agent/template-engine.js +152 -0
  553. package/tools/cli/lib/agent-analyzer.js +109 -0
  554. package/tools/cli/lib/agent-party-generator.js +194 -0
  555. package/tools/cli/lib/cli-utils.js +227 -0
  556. package/tools/cli/lib/config.js +213 -0
  557. package/tools/cli/lib/file-ops.js +204 -0
  558. package/tools/cli/lib/platform-codes.js +116 -0
  559. package/tools/cli/lib/project-root.js +77 -0
  560. package/tools/cli/lib/prompts.js +433 -0
  561. package/tools/cli/lib/ui.js +1716 -0
  562. package/tools/cli/lib/xml-handler.js +177 -0
  563. package/tools/cli/lib/xml-to-markdown.js +82 -0
  564. package/tools/cli/lib/yaml-format.js +245 -0
  565. package/tools/cli/lib/yaml-xml-builder.js +587 -0
  566. package/tools/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
  567. package/tools/docs/index.md +2 -0
  568. package/tools/fix-doc-links.js +288 -0
  569. package/tools/flattener/aggregate.js +76 -0
  570. package/tools/flattener/binary.js +80 -0
  571. package/tools/flattener/discovery.js +71 -0
  572. package/tools/flattener/files.js +35 -0
  573. package/tools/flattener/ignoreRules.js +172 -0
  574. package/tools/flattener/main.js +483 -0
  575. package/tools/flattener/projectRoot.js +201 -0
  576. package/tools/flattener/prompts.js +44 -0
  577. package/tools/flattener/stats.helpers.js +368 -0
  578. package/tools/flattener/stats.js +75 -0
  579. package/tools/flattener/test-matrix.js +409 -0
  580. package/tools/flattener/xml.js +82 -0
  581. package/tools/format-workflow-md.js +263 -0
  582. package/tools/lib/xml-utils.js +13 -0
  583. package/tools/maintainer/review-pr-README.md +55 -0
  584. package/tools/maintainer/review-pr.md +242 -0
  585. package/tools/migrate-custom-module-paths.js +124 -0
  586. package/tools/platform-codes.yaml +157 -0
  587. package/tools/schema/agent.js +491 -0
  588. package/tools/validate-agent-schema.js +110 -0
  589. package/tools/validate-doc-links.js +363 -0
  590. package/tools/validate-svg-changes.sh +356 -0
  591. package/website/README.md +76 -0
  592. package/website/astro.config.mjs +228 -0
  593. package/website/public/favicon.ico +0 -0
  594. package/website/public/img/bmad-dark.png +0 -0
  595. package/website/public/img/bmad-light.png +0 -0
  596. package/website/public/img/logo.svg +4 -0
  597. package/website/public/robots.txt +37 -0
  598. package/website/src/components/Banner.astro +59 -0
  599. package/website/src/components/Header.astro +121 -0
  600. package/website/src/components/MobileMenuFooter.astro +53 -0
  601. package/website/src/content/config.ts +6 -0
  602. package/website/src/lib/site-url.js +25 -0
  603. package/website/src/rehype-markdown-links.js +102 -0
  604. package/website/src/styles/custom.css +485 -0
@@ -0,0 +1,587 @@
1
+ const yaml = require('yaml');
2
+ const fs = require('fs-extra');
3
+ const path = require('node:path');
4
+ const crypto = require('node:crypto');
5
+ const { AgentAnalyzer } = require('./agent-analyzer');
6
+ const { ActivationBuilder } = require('./activation-builder');
7
+ const { escapeXml } = require('../../lib/xml-utils');
8
+
9
+ /**
10
+ * Converts agent YAML files to XML format with smart activation injection
11
+ */
12
+ class YamlXmlBuilder {
13
+ constructor() {
14
+ this.analyzer = new AgentAnalyzer();
15
+ this.activationBuilder = new ActivationBuilder();
16
+ }
17
+
18
+ /**
19
+ * Deep merge two objects (for customize.yaml + agent.yaml)
20
+ * @param {Object} target - Target object
21
+ * @param {Object} source - Source object to merge in
22
+ * @returns {Object} Merged object
23
+ */
24
+ deepMerge(target, source) {
25
+ const output = { ...target };
26
+
27
+ if (this.isObject(target) && this.isObject(source)) {
28
+ for (const key of Object.keys(source)) {
29
+ if (this.isObject(source[key])) {
30
+ if (key in target) {
31
+ output[key] = this.deepMerge(target[key], source[key]);
32
+ } else {
33
+ output[key] = source[key];
34
+ }
35
+ } else if (Array.isArray(source[key])) {
36
+ // For arrays, append rather than replace (for commands)
37
+ if (Array.isArray(target[key])) {
38
+ output[key] = [...target[key], ...source[key]];
39
+ } else {
40
+ output[key] = source[key];
41
+ }
42
+ } else {
43
+ output[key] = source[key];
44
+ }
45
+ }
46
+ }
47
+
48
+ return output;
49
+ }
50
+
51
+ /**
52
+ * Check if value is an object
53
+ */
54
+ isObject(item) {
55
+ return item && typeof item === 'object' && !Array.isArray(item);
56
+ }
57
+
58
+ /**
59
+ * Load and merge agent YAML with customization
60
+ * @param {string} agentYamlPath - Path to base agent YAML
61
+ * @param {string} customizeYamlPath - Path to customize YAML (optional)
62
+ * @returns {Object} Merged agent configuration
63
+ */
64
+ async loadAndMergeAgent(agentYamlPath, customizeYamlPath = null) {
65
+ // Load base agent
66
+ const agentContent = await fs.readFile(agentYamlPath, 'utf8');
67
+ const agentYaml = yaml.parse(agentContent);
68
+
69
+ // Load customization if exists
70
+ let merged = agentYaml;
71
+ if (customizeYamlPath && (await fs.pathExists(customizeYamlPath))) {
72
+ const customizeContent = await fs.readFile(customizeYamlPath, 'utf8');
73
+ const customizeYaml = yaml.parse(customizeContent);
74
+
75
+ if (customizeYaml) {
76
+ // Special handling: persona fields are merged, but only non-empty values override
77
+ if (customizeYaml.persona) {
78
+ const basePersona = merged.agent.persona || {};
79
+ const customPersona = {};
80
+
81
+ // Only copy non-empty customize values
82
+ for (const [key, value] of Object.entries(customizeYaml.persona)) {
83
+ if (value !== '' && value !== null && !(Array.isArray(value) && value.length === 0)) {
84
+ customPersona[key] = value;
85
+ }
86
+ }
87
+
88
+ // Merge non-empty customize values over base
89
+ if (Object.keys(customPersona).length > 0) {
90
+ merged.agent.persona = { ...basePersona, ...customPersona };
91
+ }
92
+ }
93
+
94
+ // Merge metadata (only non-empty values)
95
+ if (customizeYaml.agent && customizeYaml.agent.metadata) {
96
+ const nonEmptyMetadata = {};
97
+ for (const [key, value] of Object.entries(customizeYaml.agent.metadata)) {
98
+ if (value !== '' && value !== null) {
99
+ nonEmptyMetadata[key] = value;
100
+ }
101
+ }
102
+ merged.agent.metadata = { ...merged.agent.metadata, ...nonEmptyMetadata };
103
+ }
104
+
105
+ // Append menu items (support both 'menu' and legacy 'commands')
106
+ const customMenuItems = customizeYaml.menu || customizeYaml.commands;
107
+ if (customMenuItems) {
108
+ // Determine if base uses 'menu' or 'commands'
109
+ if (merged.agent.menu) {
110
+ merged.agent.menu = [...merged.agent.menu, ...customMenuItems];
111
+ } else if (merged.agent.commands) {
112
+ merged.agent.commands = [...merged.agent.commands, ...customMenuItems];
113
+ } else {
114
+ // Default to 'menu' for new agents
115
+ merged.agent.menu = customMenuItems;
116
+ }
117
+ }
118
+
119
+ // Append critical actions
120
+ if (customizeYaml.critical_actions) {
121
+ merged.agent.critical_actions = [...(merged.agent.critical_actions || []), ...customizeYaml.critical_actions];
122
+ }
123
+
124
+ // Append prompts
125
+ if (customizeYaml.prompts) {
126
+ merged.agent.prompts = [...(merged.agent.prompts || []), ...customizeYaml.prompts];
127
+ }
128
+
129
+ // Append memories
130
+ if (customizeYaml.memories) {
131
+ merged.agent.memories = [...(merged.agent.memories || []), ...customizeYaml.memories];
132
+ }
133
+ }
134
+ }
135
+
136
+ return merged;
137
+ }
138
+
139
+ /**
140
+ * Convert agent YAML to XML
141
+ * @param {Object} agentYaml - Parsed agent YAML object
142
+ * @param {Object} buildMetadata - Metadata about the build (file paths, hashes, etc.)
143
+ * @returns {string} XML content
144
+ */
145
+ async convertToXml(agentYaml, buildMetadata = {}) {
146
+ const agent = agentYaml.agent;
147
+ const metadata = agent.metadata || {};
148
+
149
+ // Add module from buildMetadata if available
150
+ if (buildMetadata.module) {
151
+ metadata.module = buildMetadata.module;
152
+ }
153
+
154
+ // Analyze agent to determine needed handlers
155
+ const profile = this.analyzer.analyzeAgentObject(agentYaml);
156
+
157
+ // Build activation block only if not skipped
158
+ let activationBlock = '';
159
+ if (!buildMetadata.skipActivation) {
160
+ activationBlock = await this.activationBuilder.buildActivation(
161
+ profile,
162
+ metadata,
163
+ agent.critical_actions || [],
164
+ buildMetadata.forWebBundle || false, // Pass web bundle flag
165
+ );
166
+ }
167
+
168
+ // Start building XML
169
+ let xml = '';
170
+
171
+ if (buildMetadata.forWebBundle) {
172
+ // Web bundle: keep existing format
173
+ xml += '<!-- Powered by BMAD-CORE™ -->\n\n';
174
+ xml += `# ${metadata.title || 'Agent'}\n\n`;
175
+ } else {
176
+ // Installation: use YAML frontmatter + instruction
177
+ // Extract name from filename: "cli-chief.yaml" or "pm.agent.yaml" -> "cli chief" or "pm"
178
+ const filename = buildMetadata.sourceFile || 'agent.yaml';
179
+ let nameFromFile = path.basename(filename, path.extname(filename)); // Remove .yaml/.md extension
180
+ nameFromFile = nameFromFile.replace(/\.agent$/, ''); // Remove .agent suffix if present
181
+ nameFromFile = nameFromFile.replaceAll('-', ' '); // Replace dashes with spaces
182
+
183
+ xml += '---\n';
184
+ xml += `name: "${nameFromFile}"\n`;
185
+ xml += `description: "${metadata.title || 'BMAD Agent'}"\n`;
186
+ xml += '---\n\n';
187
+ xml +=
188
+ "You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command.\n\n";
189
+ }
190
+
191
+ xml += '```xml\n';
192
+
193
+ // Agent opening tag
194
+ const agentAttrs = [
195
+ `id="${metadata.id || ''}"`,
196
+ `name="${metadata.name || ''}"`,
197
+ `title="${metadata.title || ''}"`,
198
+ `icon="${metadata.icon || '🤖'}"`,
199
+ ];
200
+
201
+ // Add localskip attribute if present
202
+ if (metadata.localskip === true) {
203
+ agentAttrs.push('localskip="true"');
204
+ }
205
+
206
+ xml += `<agent ${agentAttrs.join(' ')}>\n`;
207
+
208
+ // Activation block (only if not skipped)
209
+ if (activationBlock) {
210
+ xml += activationBlock + '\n';
211
+ }
212
+
213
+ // Persona section
214
+ xml += this.buildPersonaXml(agent.persona);
215
+
216
+ // Memories section (if exists)
217
+ if (agent.memories) {
218
+ xml += this.buildMemoriesXml(agent.memories);
219
+ }
220
+
221
+ // Prompts section (if exists)
222
+ if (agent.prompts) {
223
+ xml += this.buildPromptsXml(agent.prompts);
224
+ }
225
+
226
+ // Menu section (support both 'menu' and legacy 'commands')
227
+ const menuItems = agent.menu || agent.commands || [];
228
+ xml += this.buildCommandsXml(menuItems, buildMetadata.forWebBundle);
229
+
230
+ xml += '</agent>\n';
231
+ xml += '```\n';
232
+
233
+ return xml;
234
+ }
235
+
236
+ /**
237
+ * Build persona XML section
238
+ */
239
+ buildPersonaXml(persona) {
240
+ if (!persona) return '';
241
+
242
+ let xml = ' <persona>\n';
243
+
244
+ if (persona.role) {
245
+ xml += ` <role>${escapeXml(persona.role)}</role>\n`;
246
+ }
247
+
248
+ if (persona.identity) {
249
+ xml += ` <identity>${escapeXml(persona.identity)}</identity>\n`;
250
+ }
251
+
252
+ if (persona.communication_style) {
253
+ xml += ` <communication_style>${escapeXml(persona.communication_style)}</communication_style>\n`;
254
+ }
255
+
256
+ if (persona.principles) {
257
+ // Principles can be array or string
258
+ let principlesText;
259
+ if (Array.isArray(persona.principles)) {
260
+ principlesText = persona.principles.join(' ');
261
+ } else {
262
+ principlesText = persona.principles;
263
+ }
264
+ xml += ` <principles>${escapeXml(principlesText)}</principles>\n`;
265
+ }
266
+
267
+ xml += ' </persona>\n';
268
+
269
+ return xml;
270
+ }
271
+
272
+ /**
273
+ * Build memories XML section
274
+ */
275
+ buildMemoriesXml(memories) {
276
+ if (!memories || memories.length === 0) return '';
277
+
278
+ let xml = ' <memories>\n';
279
+
280
+ for (const memory of memories) {
281
+ xml += ` <memory>${escapeXml(memory)}</memory>\n`;
282
+ }
283
+
284
+ xml += ' </memories>\n';
285
+
286
+ return xml;
287
+ }
288
+
289
+ /**
290
+ * Build prompts XML section
291
+ * Handles both array format and object/dictionary format
292
+ */
293
+ buildPromptsXml(prompts) {
294
+ if (!prompts) return '';
295
+
296
+ // Handle object/dictionary format: { promptId: 'content', ... }
297
+ // Convert to array format for processing
298
+ let promptsArray = prompts;
299
+ if (!Array.isArray(prompts)) {
300
+ // Check if it's an object with no length property (dictionary format)
301
+ if (typeof prompts === 'object' && prompts.length === undefined) {
302
+ promptsArray = Object.entries(prompts).map(([id, content]) => ({
303
+ id: id,
304
+ content: content,
305
+ }));
306
+ } else {
307
+ return ''; // Not a valid prompts format
308
+ }
309
+ }
310
+
311
+ if (promptsArray.length === 0) return '';
312
+
313
+ let xml = ' <prompts>\n';
314
+
315
+ for (const prompt of promptsArray) {
316
+ xml += ` <prompt id="${prompt.id || ''}">\n`;
317
+ xml += ` <content>\n`;
318
+ xml += `${escapeXml(prompt.content || '')}\n`;
319
+ xml += ` </content>\n`;
320
+ xml += ` </prompt>\n`;
321
+ }
322
+
323
+ xml += ' </prompts>\n';
324
+
325
+ return xml;
326
+ }
327
+
328
+ /**
329
+ * Build menu XML section (renamed from commands for clarity)
330
+ * Auto-injects *help and *exit, adds * prefix to all triggers
331
+ * Supports both legacy format and new multi format with nested handlers
332
+ * @param {Array} menuItems - Menu items from YAML
333
+ * @param {boolean} forWebBundle - Whether building for web bundle
334
+ */
335
+ buildCommandsXml(menuItems, forWebBundle = false) {
336
+ let xml = ' <menu>\n';
337
+
338
+ // Always inject menu display option first
339
+ xml += ` <item cmd="*menu">[M] Redisplay Menu Options</item>\n`;
340
+
341
+ // Add user-defined menu items with * prefix
342
+ if (menuItems && menuItems.length > 0) {
343
+ for (const item of menuItems) {
344
+ // Skip ide-only items when building for web bundles
345
+ if (forWebBundle && item['ide-only'] === true) {
346
+ continue;
347
+ }
348
+ // Skip web-only items when NOT building for web bundles (i.e., IDE/local installation)
349
+ if (!forWebBundle && item['web-only'] === true) {
350
+ continue;
351
+ }
352
+
353
+ // Handle multi format menu items with nested handlers
354
+ if (item.multi && item.triggers && Array.isArray(item.triggers)) {
355
+ xml += ` <item type="multi">${escapeXml(item.multi)}\n`;
356
+ xml += this.buildNestedHandlers(item.triggers);
357
+ xml += ` </item>\n`;
358
+ }
359
+ // Handle legacy format menu items
360
+ else if (item.trigger) {
361
+ // For legacy items, keep using cmd with *<trigger> format
362
+ let trigger = item.trigger || '';
363
+ if (!trigger.startsWith('*')) {
364
+ trigger = '*' + trigger;
365
+ }
366
+
367
+ const attrs = [`cmd="${trigger}"`];
368
+
369
+ // Add handler attributes
370
+ // If workflow-install exists, use its value for workflow attribute (vendoring)
371
+ // workflow-install is build-time metadata - tells installer where to copy workflows
372
+ // The final XML should only have workflow pointing to the install location
373
+ if (item['workflow-install']) {
374
+ attrs.push(`workflow="${item['workflow-install']}"`);
375
+ } else if (item.workflow) {
376
+ attrs.push(`workflow="${item.workflow}"`);
377
+ }
378
+
379
+ if (item['validate-workflow']) attrs.push(`validate-workflow="${item['validate-workflow']}"`);
380
+ if (item.exec) attrs.push(`exec="${item.exec}"`);
381
+ if (item.tmpl) attrs.push(`tmpl="${item.tmpl}"`);
382
+ if (item.data) attrs.push(`data="${item.data}"`);
383
+ if (item.action) attrs.push(`action="${item.action}"`);
384
+
385
+ xml += ` <item ${attrs.join(' ')}>${escapeXml(item.description || '')}</item>\n`;
386
+ }
387
+ }
388
+ }
389
+
390
+ // Always inject dismiss last
391
+ xml += ` <item cmd="*dismiss">[D] Dismiss Agent</item>\n`;
392
+
393
+ xml += ' </menu>\n';
394
+
395
+ return xml;
396
+ }
397
+
398
+ /**
399
+ * Build nested handlers for multi format menu items
400
+ * @param {Array} triggers - Triggers array from multi format
401
+ * @returns {string} Handler XML
402
+ */
403
+ buildNestedHandlers(triggers) {
404
+ let xml = '';
405
+
406
+ for (const triggerGroup of triggers) {
407
+ for (const [triggerName, execArray] of Object.entries(triggerGroup)) {
408
+ // Build trigger with * prefix
409
+ let trigger = triggerName.startsWith('*') ? triggerName : '*' + triggerName;
410
+
411
+ // Extract the relevant execution data
412
+ const execData = this.processExecArray(execArray);
413
+
414
+ // For nested handlers in multi items, we don't need cmd attribute
415
+ // The match attribute will handle fuzzy matching
416
+ const attrs = [`match="${escapeXml(execData.description || '')}"`];
417
+
418
+ // Add handler attributes based on exec data
419
+ if (execData.route) attrs.push(`exec="${execData.route}"`);
420
+ if (execData.workflow) attrs.push(`workflow="${execData.workflow}"`);
421
+ if (execData['validate-workflow']) attrs.push(`validate-workflow="${execData['validate-workflow']}"`);
422
+ if (execData.action) attrs.push(`action="${execData.action}"`);
423
+ if (execData.data) attrs.push(`data="${execData.data}"`);
424
+ if (execData.tmpl) attrs.push(`tmpl="${execData.tmpl}"`);
425
+ // Only add type if it's not 'exec' (exec is already implied by the exec attribute)
426
+ if (execData.type && execData.type !== 'exec') attrs.push(`type="${execData.type}"`);
427
+
428
+ xml += ` <handler ${attrs.join(' ')}></handler>\n`;
429
+ }
430
+ }
431
+
432
+ return xml;
433
+ }
434
+
435
+ /**
436
+ * Process the execution array from multi format triggers
437
+ * Extracts relevant data for XML attributes
438
+ * @param {Array} execArray - Array of execution objects
439
+ * @returns {Object} Processed execution data
440
+ */
441
+ processExecArray(execArray) {
442
+ const result = {
443
+ description: '',
444
+ route: null,
445
+ workflow: null,
446
+ data: null,
447
+ action: null,
448
+ type: null,
449
+ };
450
+
451
+ if (!Array.isArray(execArray)) {
452
+ return result;
453
+ }
454
+
455
+ for (const exec of execArray) {
456
+ if (exec.input) {
457
+ // Use input as description if no explicit description is provided
458
+ result.description = exec.input;
459
+ }
460
+
461
+ if (exec.route) {
462
+ // Determine if it's a workflow or exec based on file extension or context
463
+ if (exec.route.endsWith('.yaml') || exec.route.endsWith('.yml')) {
464
+ result.workflow = exec.route;
465
+ } else {
466
+ result.route = exec.route;
467
+ }
468
+ }
469
+
470
+ if (exec.data !== null && exec.data !== undefined) {
471
+ result.data = exec.data;
472
+ }
473
+
474
+ if (exec.action) {
475
+ result.action = exec.action;
476
+ }
477
+
478
+ if (exec.type) {
479
+ result.type = exec.type;
480
+ }
481
+ }
482
+
483
+ return result;
484
+ }
485
+
486
+ /**
487
+ * Calculate file hash for build tracking
488
+ */
489
+ async calculateFileHash(filePath) {
490
+ if (!(await fs.pathExists(filePath))) {
491
+ return null;
492
+ }
493
+
494
+ const content = await fs.readFile(filePath, 'utf8');
495
+ return crypto.createHash('md5').update(content).digest('hex').slice(0, 8);
496
+ }
497
+
498
+ /**
499
+ * Build agent XML from YAML files and return as string (for in-memory use)
500
+ * @param {string} agentYamlPath - Path to agent YAML
501
+ * @param {string} customizeYamlPath - Path to customize YAML (optional)
502
+ * @param {Object} options - Build options
503
+ * @returns {Promise<string>} XML content as string
504
+ */
505
+ async buildFromYaml(agentYamlPath, customizeYamlPath = null, options = {}) {
506
+ // Load and merge YAML files
507
+ const mergedAgent = await this.loadAndMergeAgent(agentYamlPath, customizeYamlPath);
508
+
509
+ // Calculate hashes for build tracking
510
+ const sourceHash = await this.calculateFileHash(agentYamlPath);
511
+ const customizeHash = customizeYamlPath ? await this.calculateFileHash(customizeYamlPath) : null;
512
+
513
+ // Extract module from path (e.g., /path/to/modules/bmm/agents/pm.yaml -> bmm)
514
+ // or /path/to/bmad/bmm/agents/pm.yaml -> bmm
515
+ // or /path/to/src/bmm/agents/pm.yaml -> bmm
516
+ let module = 'core'; // default to core
517
+ const pathParts = agentYamlPath.split(path.sep);
518
+
519
+ // Look for module indicators in the path
520
+ const modulesIndex = pathParts.indexOf('modules');
521
+ const bmadIndex = pathParts.indexOf('bmad');
522
+ const srcIndex = pathParts.indexOf('src');
523
+
524
+ if (modulesIndex !== -1 && pathParts[modulesIndex + 1]) {
525
+ // Path contains /modules/{module}/
526
+ module = pathParts[modulesIndex + 1];
527
+ } else if (bmadIndex !== -1 && pathParts[bmadIndex + 1]) {
528
+ // Path contains /bmad/{module}/
529
+ const potentialModule = pathParts[bmadIndex + 1];
530
+ // Check if it's a known module, not 'agents' or '_config'
531
+ if (['bmm', 'bmb', 'cis', 'core'].includes(potentialModule)) {
532
+ module = potentialModule;
533
+ }
534
+ } else if (srcIndex !== -1 && pathParts[srcIndex + 1]) {
535
+ // Path contains /src/{module}/ (bmm and core are directly under src/)
536
+ const potentialModule = pathParts[srcIndex + 1];
537
+ if (potentialModule === 'bmm' || potentialModule === 'core') {
538
+ module = potentialModule;
539
+ }
540
+ }
541
+
542
+ // Build metadata
543
+ const buildMetadata = {
544
+ sourceFile: path.basename(agentYamlPath),
545
+ sourceHash,
546
+ customizeFile: customizeYamlPath ? path.basename(customizeYamlPath) : null,
547
+ customizeHash,
548
+ builderVersion: '1.0.0',
549
+ includeMetadata: options.includeMetadata !== false,
550
+ skipActivation: options.skipActivation === true,
551
+ forWebBundle: options.forWebBundle === true,
552
+ module: module, // Add module to buildMetadata
553
+ };
554
+
555
+ // Convert to XML and return
556
+ return await this.convertToXml(mergedAgent, buildMetadata);
557
+ }
558
+
559
+ /**
560
+ * Build agent XML from YAML files
561
+ * @param {string} agentYamlPath - Path to agent YAML
562
+ * @param {string} customizeYamlPath - Path to customize YAML (optional)
563
+ * @param {string} outputPath - Path to write XML file
564
+ * @param {Object} options - Build options
565
+ */
566
+ async buildAgent(agentYamlPath, customizeYamlPath, outputPath, options = {}) {
567
+ // Use buildFromYaml to get XML content
568
+ const xml = await this.buildFromYaml(agentYamlPath, customizeYamlPath, options);
569
+
570
+ // Write output file
571
+ await fs.ensureDir(path.dirname(outputPath));
572
+ await fs.writeFile(outputPath, xml, 'utf8');
573
+
574
+ // Calculate hashes for return value
575
+ const sourceHash = await this.calculateFileHash(agentYamlPath);
576
+ const customizeHash = customizeYamlPath ? await this.calculateFileHash(customizeYamlPath) : null;
577
+
578
+ return {
579
+ success: true,
580
+ outputPath,
581
+ sourceHash,
582
+ customizeHash,
583
+ };
584
+ }
585
+ }
586
+
587
+ module.exports = { YamlXmlBuilder };
@@ -0,0 +1,95 @@
1
+ # Bundle Distribution Setup (For Maintainers)
2
+
3
+ **Audience:** BMAD maintainers setting up bundle auto-publishing
4
+
5
+ ---
6
+
7
+ ## One-Time Setup
8
+
9
+ Run these commands once to enable auto-publishing:
10
+
11
+ ```bash
12
+ # 1. Create bmad-bundles repo
13
+ gh repo create bmad-code-org/bmad-bundles --public --description "BMAD Web Bundles"
14
+
15
+ # 2. Ensure `main` exists (GitHub Pages API requires a source branch)
16
+ git clone git@github.com:bmad-code-org/bmad-bundles.git
17
+ cd bmad-bundles
18
+ printf '# bmad-bundles\n\nStatic bundles published from BMAD-METHOD.\n' > README.md
19
+ git add README.md
20
+ git commit -m "Initial commit"
21
+ git push origin main
22
+ cd -
23
+
24
+ # 3. Enable GitHub Pages (API replacement for removed --enable-pages flag)
25
+ gh api repos/bmad-code-org/bmad-bundles/pages --method POST -f source[branch]=main -f source[path]=/
26
+ # (Optional) confirm status
27
+ gh api repos/bmad-code-org/bmad-bundles/pages --jq '{status,source}'
28
+
29
+ # 4. Create GitHub PAT and add as secret
30
+ # Go to: https://github.com/settings/tokens/new
31
+ # Scopes: repo (full control)
32
+ # Name: bmad-bundles-ci
33
+ # Then add as secret:
34
+ gh secret set BUNDLES_PAT --repo bmad-code-org/BMAD-METHOD
35
+ # (paste PAT when prompted)
36
+ ```
37
+
38
+ If the Pages POST returns `409`, the site already exists. If it returns `422` about `main` missing, redo step 2 to push the initial commit.
39
+
40
+ **Done.** Bundles auto-publish on every main merge.
41
+
42
+ ---
43
+
44
+ ## How It Works
45
+
46
+ **On main merge:**
47
+
48
+ - `.github/workflows/bundle-latest.yaml` runs
49
+ - Publishes to: `https://bmad-code-org.github.io/bmad-bundles/`
50
+
51
+ **On release:**
52
+
53
+ - `npm run release:patch` runs `.github/workflows/manual-release.yaml`
54
+ - Attaches bundles to: `https://github.com/bmad-code-org/BMAD-METHOD/releases/latest`
55
+
56
+ ---
57
+
58
+ ## Testing
59
+
60
+ ```bash
61
+ # Test latest channel
62
+ git push origin main
63
+ # Wait 2 min, then: curl https://bmad-code-org.github.io/bmad-bundles/
64
+
65
+ # Test stable channel
66
+ npm run release:patch
67
+ # Check: gh release view
68
+ ```
69
+
70
+ ---
71
+
72
+ ## Troubleshooting
73
+
74
+ **"Permission denied" or auth errors**
75
+
76
+ ```bash
77
+ # Verify PAT secret exists
78
+ gh secret list --repo bmad-code-org/BMAD-METHOD | grep BUNDLES_PAT
79
+
80
+ # If missing, recreate PAT and add secret:
81
+ gh secret set BUNDLES_PAT --repo bmad-code-org/BMAD-METHOD
82
+ ```
83
+
84
+ **GitHub Pages not updating / need to re-check config**
85
+
86
+ ```bash
87
+ gh api repos/bmad-code-org/bmad-bundles/pages --jq '{status,source,html_url}'
88
+ ```
89
+
90
+ ---
91
+
92
+ ## Distribution URLs
93
+
94
+ **Stable:** `https://github.com/bmad-code-org/BMAD-METHOD/releases/latest`
95
+ **Latest:** `https://bmad-code-org.github.io/bmad-bundles/`
@@ -0,0 +1,2 @@
1
+ # Tool and Repo Maintainability Documentation
2
+