bmad-fh 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 (626) hide show
  1. package/.coderabbit.yaml +40 -0
  2. package/.githooks/post-checkout +129 -0
  3. package/.githooks/pre-commit +63 -0
  4. package/.githooks/pre-push +135 -0
  5. package/.github/CODE_OF_CONDUCT.md +128 -0
  6. package/.github/FUNDING.yaml +15 -0
  7. package/.github/ISSUE_TEMPLATE/config.yaml +8 -0
  8. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  9. package/.github/ISSUE_TEMPLATE/issue.md +32 -0
  10. package/.github/scripts/discord-helpers.sh +34 -0
  11. package/.github/workflows/bundle-latest.yaml +330 -0
  12. package/.github/workflows/discord.yaml +90 -0
  13. package/.github/workflows/docs.yaml +63 -0
  14. package/.github/workflows/manual-release.yaml +190 -0
  15. package/.github/workflows/publish-multi-artifact.yaml +50 -0
  16. package/.github/workflows/quality.yaml +115 -0
  17. package/.husky/pre-commit +20 -0
  18. package/.markdownlint-cli2.yaml +41 -0
  19. package/.nvmrc +1 -0
  20. package/.prettierignore +9 -0
  21. package/.vscode/settings.json +97 -0
  22. package/CHANGELOG.md +1394 -0
  23. package/CNAME +1 -0
  24. package/CONTRIBUTING.md +306 -0
  25. package/CONTRIBUTORS.md +32 -0
  26. package/LICENSE +30 -0
  27. package/README.md +126 -0
  28. package/SECURITY.md +85 -0
  29. package/TRADEMARK.md +55 -0
  30. package/Wordmark.png +0 -0
  31. package/banner-bmad-method.png +0 -0
  32. package/docs/404.md +9 -0
  33. package/docs/_README_WORKFLOW_DIAGRAMS.md +40 -0
  34. package/docs/_STYLE_GUIDE.md +367 -0
  35. package/docs/_archive/customize-workflows.md +30 -0
  36. package/docs/_archive/getting-started-bmadv4.md +247 -0
  37. package/docs/_archive/vendor-workflows.md +52 -0
  38. package/docs/downloads.md +72 -0
  39. package/docs/explanation/agents/barry-quick-flow.md +328 -0
  40. package/docs/explanation/agents/index.md +19 -0
  41. package/docs/explanation/architecture/four-phases.md +107 -0
  42. package/docs/explanation/architecture/preventing-agent-conflicts.md +111 -0
  43. package/docs/explanation/architecture/why-solutioning-matters.md +75 -0
  44. package/docs/explanation/bmm/index.md +131 -0
  45. package/docs/explanation/core/index.md +18 -0
  46. package/docs/explanation/core-concepts/agent-roles.md +179 -0
  47. package/docs/explanation/core-concepts/index.md +35 -0
  48. package/docs/explanation/core-concepts/what-are-agents.md +97 -0
  49. package/docs/explanation/core-concepts/what-are-modules.md +85 -0
  50. package/docs/explanation/core-concepts/what-are-workflows.md +204 -0
  51. package/docs/explanation/faq/brownfield-faq.md +73 -0
  52. package/docs/explanation/faq/getting-started-faq.md +67 -0
  53. package/docs/explanation/faq/implementation-faq.md +52 -0
  54. package/docs/explanation/faq/index.md +16 -0
  55. package/docs/explanation/faq/levels-and-tracks-faq.md +52 -0
  56. package/docs/explanation/faq/planning-faq.md +41 -0
  57. package/docs/explanation/faq/tools-faq.md +277 -0
  58. package/docs/explanation/faq/workflows-faq.md +61 -0
  59. package/docs/explanation/features/advanced-elicitation.md +95 -0
  60. package/docs/explanation/features/brainstorming-techniques.md +92 -0
  61. package/docs/explanation/features/party-mode.md +95 -0
  62. package/docs/explanation/features/quick-flow.md +149 -0
  63. package/docs/explanation/features/tea-overview.md +410 -0
  64. package/docs/explanation/features/web-bundles.md +34 -0
  65. package/docs/explanation/philosophy/facilitation-over-generation.md +333 -0
  66. package/docs/explanation/philosophy/testing-as-engineering.md +112 -0
  67. package/docs/explanation/tea/engagement-models.md +710 -0
  68. package/docs/explanation/tea/fixture-architecture.md +457 -0
  69. package/docs/explanation/tea/knowledge-base-system.md +554 -0
  70. package/docs/explanation/tea/network-first-patterns.md +853 -0
  71. package/docs/explanation/tea/risk-based-testing.md +586 -0
  72. package/docs/explanation/tea/test-quality-standards.md +907 -0
  73. package/docs/how-to/brownfield/add-feature-to-existing.md +74 -0
  74. package/docs/how-to/brownfield/document-existing-project.md +66 -0
  75. package/docs/how-to/brownfield/index.md +84 -0
  76. package/docs/how-to/brownfield/quick-fix-in-brownfield.md +77 -0
  77. package/docs/how-to/brownfield/use-tea-for-enterprise.md +526 -0
  78. package/docs/how-to/brownfield/use-tea-with-existing-tests.md +577 -0
  79. package/docs/how-to/customization/customize-agents.md +212 -0
  80. package/docs/how-to/customization/enable-tea-mcp-enhancements.md +424 -0
  81. package/docs/how-to/customization/index.md +23 -0
  82. package/docs/how-to/customization/integrate-playwright-utils.md +813 -0
  83. package/docs/how-to/customization/shard-large-documents.md +101 -0
  84. package/docs/how-to/get-answers-about-bmad.md +102 -0
  85. package/docs/how-to/installation/index.md +12 -0
  86. package/docs/how-to/installation/install-bmad.md +111 -0
  87. package/docs/how-to/installation/install-custom-modules.md +118 -0
  88. package/docs/how-to/installation/upgrade-to-v6.md +131 -0
  89. package/docs/how-to/workflows/bmgd-quick-flow.md +156 -0
  90. package/docs/how-to/workflows/conduct-research.md +97 -0
  91. package/docs/how-to/workflows/create-architecture.md +119 -0
  92. package/docs/how-to/workflows/create-epics-and-stories.md +109 -0
  93. package/docs/how-to/workflows/create-prd.md +91 -0
  94. package/docs/how-to/workflows/create-product-brief.md +94 -0
  95. package/docs/how-to/workflows/create-story.md +102 -0
  96. package/docs/how-to/workflows/create-ux-design.md +100 -0
  97. package/docs/how-to/workflows/implement-story.md +97 -0
  98. package/docs/how-to/workflows/quick-spec.md +122 -0
  99. package/docs/how-to/workflows/run-atdd.md +436 -0
  100. package/docs/how-to/workflows/run-automate.md +653 -0
  101. package/docs/how-to/workflows/run-brainstorming-session.md +73 -0
  102. package/docs/how-to/workflows/run-code-review.md +89 -0
  103. package/docs/how-to/workflows/run-implementation-readiness.md +125 -0
  104. package/docs/how-to/workflows/run-nfr-assess.md +679 -0
  105. package/docs/how-to/workflows/run-sprint-planning.md +94 -0
  106. package/docs/how-to/workflows/run-test-design.md +98 -0
  107. package/docs/how-to/workflows/run-test-review.md +605 -0
  108. package/docs/how-to/workflows/run-trace.md +883 -0
  109. package/docs/how-to/workflows/setup-ci.md +712 -0
  110. package/docs/how-to/workflows/setup-party-mode.md +89 -0
  111. package/docs/how-to/workflows/setup-test-framework.md +98 -0
  112. package/docs/index.md +63 -0
  113. package/docs/migration-guide.md +365 -0
  114. package/docs/multi-scope-guide.md +379 -0
  115. package/docs/plans/multi-scope-parallel-artifacts-plan.md +695 -0
  116. package/docs/reference/agents/index.md +109 -0
  117. package/docs/reference/configuration/core-tasks.md +67 -0
  118. package/docs/reference/configuration/global-config.md +28 -0
  119. package/docs/reference/glossary/index.md +159 -0
  120. package/docs/reference/tea/commands.md +254 -0
  121. package/docs/reference/tea/configuration.md +678 -0
  122. package/docs/reference/tea/knowledge-base.md +340 -0
  123. package/docs/reference/workflows/core-workflows.md +32 -0
  124. package/docs/reference/workflows/document-project.md +73 -0
  125. package/docs/reference/workflows/index.md +12 -0
  126. package/docs/tutorials/getting-started/getting-started-bmadv6.md +246 -0
  127. package/docs/tutorials/getting-started/images/workflow-method-greenfield.excalidraw +5034 -0
  128. package/docs/tutorials/getting-started/images/workflow-method-greenfield.svg +4 -0
  129. package/docs/tutorials/getting-started/images/workflow-overview.jpg +0 -0
  130. package/docs/tutorials/getting-started/tea-lite-quickstart.md +444 -0
  131. package/docs/tutorials/getting-started/workflow-overview.jpg +0 -0
  132. package/eslint.config.mjs +152 -0
  133. package/package.json +117 -0
  134. package/prettier.config.mjs +32 -0
  135. package/src/bmm/_module-installer/installer.js +48 -0
  136. package/src/bmm/_module-installer/platform-specifics/claude-code.js +35 -0
  137. package/src/bmm/_module-installer/platform-specifics/windsurf.js +32 -0
  138. package/src/bmm/agents/analyst.agent.yaml +41 -0
  139. package/src/bmm/agents/architect.agent.yaml +33 -0
  140. package/src/bmm/agents/dev.agent.yaml +38 -0
  141. package/src/bmm/agents/pm.agent.yaml +51 -0
  142. package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
  143. package/src/bmm/agents/sm.agent.yaml +47 -0
  144. package/src/bmm/agents/tea.agent.yaml +68 -0
  145. package/src/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
  146. package/src/bmm/agents/tech-writer/tech-writer.agent.yaml +49 -0
  147. package/src/bmm/agents/ux-designer.agent.yaml +30 -0
  148. package/src/bmm/data/README.md +29 -0
  149. package/src/bmm/data/project-context-template.md +40 -0
  150. package/src/bmm/module.yaml +64 -0
  151. package/src/bmm/sub-modules/claude-code/config.yaml +4 -0
  152. package/src/bmm/sub-modules/claude-code/injections.yaml +242 -0
  153. package/src/bmm/sub-modules/claude-code/readme.md +87 -0
  154. package/src/bmm/teams/default-party.csv +21 -0
  155. package/src/bmm/teams/team-fullstack.yaml +12 -0
  156. package/src/bmm/testarch/knowledge/api-request.md +442 -0
  157. package/src/bmm/testarch/knowledge/api-testing-patterns.md +843 -0
  158. package/src/bmm/testarch/knowledge/auth-session.md +552 -0
  159. package/src/bmm/testarch/knowledge/burn-in.md +273 -0
  160. package/src/bmm/testarch/knowledge/ci-burn-in.md +675 -0
  161. package/src/bmm/testarch/knowledge/component-tdd.md +486 -0
  162. package/src/bmm/testarch/knowledge/contract-testing.md +957 -0
  163. package/src/bmm/testarch/knowledge/data-factories.md +500 -0
  164. package/src/bmm/testarch/knowledge/email-auth.md +721 -0
  165. package/src/bmm/testarch/knowledge/error-handling.md +725 -0
  166. package/src/bmm/testarch/knowledge/feature-flags.md +750 -0
  167. package/src/bmm/testarch/knowledge/file-utils.md +463 -0
  168. package/src/bmm/testarch/knowledge/fixture-architecture.md +401 -0
  169. package/src/bmm/testarch/knowledge/fixtures-composition.md +382 -0
  170. package/src/bmm/testarch/knowledge/intercept-network-call.md +430 -0
  171. package/src/bmm/testarch/knowledge/log.md +429 -0
  172. package/src/bmm/testarch/knowledge/network-error-monitor.md +405 -0
  173. package/src/bmm/testarch/knowledge/network-first.md +486 -0
  174. package/src/bmm/testarch/knowledge/network-recorder.md +527 -0
  175. package/src/bmm/testarch/knowledge/nfr-criteria.md +670 -0
  176. package/src/bmm/testarch/knowledge/overview.md +286 -0
  177. package/src/bmm/testarch/knowledge/playwright-config.md +730 -0
  178. package/src/bmm/testarch/knowledge/probability-impact.md +601 -0
  179. package/src/bmm/testarch/knowledge/recurse.md +421 -0
  180. package/src/bmm/testarch/knowledge/risk-governance.md +615 -0
  181. package/src/bmm/testarch/knowledge/selective-testing.md +732 -0
  182. package/src/bmm/testarch/knowledge/selector-resilience.md +527 -0
  183. package/src/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
  184. package/src/bmm/testarch/knowledge/test-levels-framework.md +473 -0
  185. package/src/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
  186. package/src/bmm/testarch/knowledge/test-quality.md +664 -0
  187. package/src/bmm/testarch/knowledge/timing-debugging.md +372 -0
  188. package/src/bmm/testarch/knowledge/visual-debugging.md +524 -0
  189. package/src/bmm/testarch/tea-index.csv +34 -0
  190. package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
  191. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
  192. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
  193. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
  194. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
  195. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
  196. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
  197. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +194 -0
  198. package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +58 -0
  199. package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
  200. package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
  201. package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
  202. package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
  203. package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
  204. package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -0
  205. package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
  206. package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
  207. package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +200 -0
  208. package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
  209. package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
  210. package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
  211. package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -0
  212. package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
  213. package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
  214. package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
  215. package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
  216. package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
  217. package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +239 -0
  218. package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -0
  219. package/src/bmm/workflows/1-analysis/research/workflow.md +173 -0
  220. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
  221. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
  222. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
  223. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
  224. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
  225. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
  226. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
  227. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
  228. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
  229. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
  230. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
  231. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
  232. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
  233. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
  234. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +228 -0
  235. package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
  236. package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +43 -0
  237. package/src/bmm/workflows/2-plan-workflows/prd/data/domain-complexity.csv +13 -0
  238. package/src/bmm/workflows/2-plan-workflows/prd/data/prd-purpose.md +197 -0
  239. package/src/bmm/workflows/2-plan-workflows/prd/data/project-types.csv +11 -0
  240. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-01-init.md +191 -0
  241. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-01b-continue.md +153 -0
  242. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-02-discovery.md +224 -0
  243. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-03-success.md +226 -0
  244. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-04-journeys.md +213 -0
  245. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-05-domain.md +207 -0
  246. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-06-innovation.md +226 -0
  247. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-07-project-type.md +237 -0
  248. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-08-scoping.md +228 -0
  249. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-09-functional.md +231 -0
  250. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-10-nonfunctional.md +242 -0
  251. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-11-polish.md +217 -0
  252. package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-12-complete.md +180 -0
  253. package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01-discovery.md +247 -0
  254. package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
  255. package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-02-review.md +249 -0
  256. package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-03-edit.md +253 -0
  257. package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-04-complete.md +168 -0
  258. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-01-discovery.md +218 -0
  259. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02-format-detection.md +191 -0
  260. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02b-parity-check.md +209 -0
  261. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-03-density-validation.md +174 -0
  262. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
  263. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-05-measurability-validation.md +228 -0
  264. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-06-traceability-validation.md +217 -0
  265. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
  266. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
  267. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-09-project-type-validation.md +263 -0
  268. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-10-smart-validation.md +209 -0
  269. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
  270. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-12-completeness-validation.md +242 -0
  271. package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-13-report-complete.md +232 -0
  272. package/src/bmm/workflows/2-plan-workflows/prd/templates/prd-template.md +10 -0
  273. package/src/bmm/workflows/2-plan-workflows/prd/validation-report-prd-workflow.md +433 -0
  274. package/src/bmm/workflows/2-plan-workflows/prd/workflow.md +150 -0
  275. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +190 -0
  276. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +178 -0
  277. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
  278. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +139 -0
  279. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
  280. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +133 -0
  281. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
  282. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +55 -0
  283. package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
  284. package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +11 -0
  285. package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
  286. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
  287. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -0
  288. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
  289. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -0
  290. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
  291. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
  292. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
  293. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
  294. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +352 -0
  295. package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +50 -0
  296. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
  297. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
  298. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
  299. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +145 -0
  300. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
  301. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +59 -0
  302. package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
  303. package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
  304. package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +51 -0
  305. package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
  306. package/src/bmm/workflows/4-implementation/correct-course/instructions.md +206 -0
  307. package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +60 -0
  308. package/src/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
  309. package/src/bmm/workflows/4-implementation/create-story/instructions.xml +345 -0
  310. package/src/bmm/workflows/4-implementation/create-story/template.md +49 -0
  311. package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +61 -0
  312. package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
  313. package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
  314. package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +27 -0
  315. package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1443 -0
  316. package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +58 -0
  317. package/src/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
  318. package/src/bmm/workflows/4-implementation/sprint-planning/instructions.md +225 -0
  319. package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
  320. package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +54 -0
  321. package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +229 -0
  322. package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +36 -0
  323. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +156 -0
  324. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +120 -0
  325. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +113 -0
  326. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +113 -0
  327. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +106 -0
  328. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +140 -0
  329. package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +52 -0
  330. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +189 -0
  331. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +144 -0
  332. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +128 -0
  333. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +191 -0
  334. package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
  335. package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
  336. package/src/bmm/workflows/document-project/checklist.md +245 -0
  337. package/src/bmm/workflows/document-project/documentation-requirements.csv +12 -0
  338. package/src/bmm/workflows/document-project/instructions.md +221 -0
  339. package/src/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
  340. package/src/bmm/workflows/document-project/templates/index-template.md +169 -0
  341. package/src/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
  342. package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
  343. package/src/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
  344. package/src/bmm/workflows/document-project/workflow.yaml +30 -0
  345. package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
  346. package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
  347. package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
  348. package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
  349. package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +90 -0
  350. package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +127 -0
  351. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +39 -0
  352. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +130 -0
  353. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +27 -0
  354. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +43 -0
  355. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +141 -0
  356. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +27 -0
  357. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +49 -0
  358. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +241 -0
  359. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +27 -0
  360. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +38 -0
  361. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +133 -0
  362. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +27 -0
  363. package/src/bmm/workflows/generate-project-context/project-context-template.md +21 -0
  364. package/src/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -0
  365. package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -0
  366. package/src/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -0
  367. package/src/bmm/workflows/generate-project-context/workflow.md +49 -0
  368. package/src/bmm/workflows/testarch/atdd/atdd-checklist-template.md +364 -0
  369. package/src/bmm/workflows/testarch/atdd/checklist.md +374 -0
  370. package/src/bmm/workflows/testarch/atdd/instructions.md +806 -0
  371. package/src/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
  372. package/src/bmm/workflows/testarch/automate/checklist.md +582 -0
  373. package/src/bmm/workflows/testarch/automate/instructions.md +1324 -0
  374. package/src/bmm/workflows/testarch/automate/workflow.yaml +54 -0
  375. package/src/bmm/workflows/testarch/ci/checklist.md +248 -0
  376. package/src/bmm/workflows/testarch/ci/github-actions-template.yaml +198 -0
  377. package/src/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +149 -0
  378. package/src/bmm/workflows/testarch/ci/instructions.md +536 -0
  379. package/src/bmm/workflows/testarch/ci/workflow.yaml +47 -0
  380. package/src/bmm/workflows/testarch/framework/checklist.md +321 -0
  381. package/src/bmm/workflows/testarch/framework/instructions.md +481 -0
  382. package/src/bmm/workflows/testarch/framework/workflow.yaml +49 -0
  383. package/src/bmm/workflows/testarch/nfr-assess/checklist.md +407 -0
  384. package/src/bmm/workflows/testarch/nfr-assess/instructions.md +722 -0
  385. package/src/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +445 -0
  386. package/src/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
  387. package/src/bmm/workflows/testarch/test-design/checklist.md +235 -0
  388. package/src/bmm/workflows/testarch/test-design/instructions.md +788 -0
  389. package/src/bmm/workflows/testarch/test-design/test-design-template.md +294 -0
  390. package/src/bmm/workflows/testarch/test-design/workflow.yaml +56 -0
  391. package/src/bmm/workflows/testarch/test-review/checklist.md +472 -0
  392. package/src/bmm/workflows/testarch/test-review/instructions.md +628 -0
  393. package/src/bmm/workflows/testarch/test-review/test-review-template.md +390 -0
  394. package/src/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
  395. package/src/bmm/workflows/testarch/trace/checklist.md +655 -0
  396. package/src/bmm/workflows/testarch/trace/instructions.md +1047 -0
  397. package/src/bmm/workflows/testarch/trace/trace-template.md +675 -0
  398. package/src/bmm/workflows/testarch/trace/workflow.yaml +57 -0
  399. package/src/bmm/workflows/workflow-status/init/instructions.md +346 -0
  400. package/src/bmm/workflows/workflow-status/init/workflow.yaml +30 -0
  401. package/src/bmm/workflows/workflow-status/instructions.md +397 -0
  402. package/src/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +103 -0
  403. package/src/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +100 -0
  404. package/src/bmm/workflows/workflow-status/paths/method-brownfield.yaml +103 -0
  405. package/src/bmm/workflows/workflow-status/paths/method-greenfield.yaml +100 -0
  406. package/src/bmm/workflows/workflow-status/project-levels.yaml +59 -0
  407. package/src/bmm/workflows/workflow-status/workflow-status-template.yaml +24 -0
  408. package/src/bmm/workflows/workflow-status/workflow.yaml +32 -0
  409. package/src/core/_module-installer/installer.js +60 -0
  410. package/src/core/agents/bmad-master.agent.yaml +30 -0
  411. package/src/core/lib/scope/artifact-resolver.js +298 -0
  412. package/src/core/lib/scope/event-logger.js +411 -0
  413. package/src/core/lib/scope/index.js +30 -0
  414. package/src/core/lib/scope/scope-context.js +307 -0
  415. package/src/core/lib/scope/scope-initializer.js +458 -0
  416. package/src/core/lib/scope/scope-manager.js +512 -0
  417. package/src/core/lib/scope/scope-migrator.js +442 -0
  418. package/src/core/lib/scope/scope-sync.js +489 -0
  419. package/src/core/lib/scope/scope-validator.js +299 -0
  420. package/src/core/lib/scope/state-lock.js +342 -0
  421. package/src/core/module.yaml +53 -0
  422. package/src/core/resources/excalidraw/README.md +160 -0
  423. package/src/core/resources/excalidraw/excalidraw-helpers.md +127 -0
  424. package/src/core/resources/excalidraw/library-loader.md +50 -0
  425. package/src/core/resources/excalidraw/validate-json-instructions.md +79 -0
  426. package/src/core/tasks/editorial-review-prose.xml +91 -0
  427. package/src/core/tasks/editorial-review-structure.xml +198 -0
  428. package/src/core/tasks/index-docs.xml +65 -0
  429. package/src/core/tasks/review-adversarial-general.xml +46 -0
  430. package/src/core/tasks/shard-doc.xml +109 -0
  431. package/src/core/tasks/workflow.xml +277 -0
  432. package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
  433. package/src/core/workflows/advanced-elicitation/workflow.xml +117 -0
  434. package/src/core/workflows/brainstorming/brain-methods.csv +62 -0
  435. package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
  436. package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
  437. package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
  438. package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
  439. package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
  440. package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
  441. package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
  442. package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
  443. package/src/core/workflows/brainstorming/template.md +15 -0
  444. package/src/core/workflows/brainstorming/workflow.md +58 -0
  445. package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
  446. package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
  447. package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +157 -0
  448. package/src/core/workflows/party-mode/workflow.md +194 -0
  449. package/src/utility/agent-components/activation-rules.txt +6 -0
  450. package/src/utility/agent-components/activation-steps.txt +28 -0
  451. package/src/utility/agent-components/agent-command-header.md +1 -0
  452. package/src/utility/agent-components/agent.customize.template.yaml +41 -0
  453. package/src/utility/agent-components/handler-action.txt +4 -0
  454. package/src/utility/agent-components/handler-data.txt +5 -0
  455. package/src/utility/agent-components/handler-exec.txt +19 -0
  456. package/src/utility/agent-components/handler-multi.txt +14 -0
  457. package/src/utility/agent-components/handler-tmpl.txt +5 -0
  458. package/src/utility/agent-components/handler-validate-workflow.txt +7 -0
  459. package/src/utility/agent-components/handler-workflow.txt +10 -0
  460. package/src/utility/agent-components/menu-handlers.txt +6 -0
  461. package/test/README.md +295 -0
  462. package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +27 -0
  463. package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +30 -0
  464. package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +22 -0
  465. package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +20 -0
  466. package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +25 -0
  467. package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +24 -0
  468. package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +25 -0
  469. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -0
  470. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -0
  471. package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +31 -0
  472. package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +25 -0
  473. package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +25 -0
  474. package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +25 -0
  475. package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +25 -0
  476. package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
  477. package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
  478. package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +27 -0
  479. package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
  480. package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +24 -0
  481. package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +27 -0
  482. package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +27 -0
  483. package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +24 -0
  484. package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +29 -0
  485. package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +31 -0
  486. package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +28 -0
  487. package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +28 -0
  488. package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
  489. package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +28 -0
  490. package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
  491. package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
  492. package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
  493. package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +24 -0
  494. package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +22 -0
  495. package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +27 -0
  496. package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +31 -0
  497. package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +22 -0
  498. package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +38 -0
  499. package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +24 -0
  500. package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -0
  501. package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +34 -0
  502. package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -0
  503. package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +24 -0
  504. package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +24 -0
  505. package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +24 -0
  506. package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -0
  507. package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -0
  508. package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +24 -0
  509. package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +24 -0
  510. package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +22 -0
  511. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +28 -0
  512. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +30 -0
  513. package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +24 -0
  514. package/test/test-agent-schema.js +387 -0
  515. package/test/test-cli-integration.sh +159 -0
  516. package/test/test-installation-components.js +214 -0
  517. package/test/test-scope-e2e.js +450 -0
  518. package/test/test-scope-system.js +787 -0
  519. package/test/unit-test-schema.js +133 -0
  520. package/tools/bmad-npx-wrapper.js +38 -0
  521. package/tools/build-docs.js +577 -0
  522. package/tools/cli/README.md +7 -0
  523. package/tools/cli/bmad-cli.js +58 -0
  524. package/tools/cli/commands/install.js +87 -0
  525. package/tools/cli/commands/scope.js +474 -0
  526. package/tools/cli/external-official-modules.yaml +41 -0
  527. package/tools/cli/installers/install-messages.yaml +58 -0
  528. package/tools/cli/installers/lib/core/config-collector.js +1079 -0
  529. package/tools/cli/installers/lib/core/custom-module-cache.js +259 -0
  530. package/tools/cli/installers/lib/core/dependency-resolver.js +739 -0
  531. package/tools/cli/installers/lib/core/detector.js +223 -0
  532. package/tools/cli/installers/lib/core/ide-config-manager.js +156 -0
  533. package/tools/cli/installers/lib/core/installer.js +2585 -0
  534. package/tools/cli/installers/lib/core/manifest-generator.js +963 -0
  535. package/tools/cli/installers/lib/core/manifest.js +590 -0
  536. package/tools/cli/installers/lib/custom/handler.js +363 -0
  537. package/tools/cli/installers/lib/ide/_base-ide.js +654 -0
  538. package/tools/cli/installers/lib/ide/antigravity.js +486 -0
  539. package/tools/cli/installers/lib/ide/auggie.js +244 -0
  540. package/tools/cli/installers/lib/ide/claude-code.js +487 -0
  541. package/tools/cli/installers/lib/ide/cline.js +269 -0
  542. package/tools/cli/installers/lib/ide/codex.js +375 -0
  543. package/tools/cli/installers/lib/ide/crush.js +300 -0
  544. package/tools/cli/installers/lib/ide/cursor.js +169 -0
  545. package/tools/cli/installers/lib/ide/gemini.js +301 -0
  546. package/tools/cli/installers/lib/ide/github-copilot.js +383 -0
  547. package/tools/cli/installers/lib/ide/iflow.js +191 -0
  548. package/tools/cli/installers/lib/ide/kilo.js +250 -0
  549. package/tools/cli/installers/lib/ide/kiro-cli.js +326 -0
  550. package/tools/cli/installers/lib/ide/manager.js +244 -0
  551. package/tools/cli/installers/lib/ide/opencode.js +257 -0
  552. package/tools/cli/installers/lib/ide/qwen.js +372 -0
  553. package/tools/cli/installers/lib/ide/roo.js +270 -0
  554. package/tools/cli/installers/lib/ide/rovo-dev.js +290 -0
  555. package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +96 -0
  556. package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +158 -0
  557. package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
  558. package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +119 -0
  559. package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +242 -0
  560. package/tools/cli/installers/lib/ide/templates/agent-command-template.md +29 -0
  561. package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +14 -0
  562. package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +12 -0
  563. package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +30 -0
  564. package/tools/cli/installers/lib/ide/templates/workflow-commander.md +45 -0
  565. package/tools/cli/installers/lib/ide/trae.js +313 -0
  566. package/tools/cli/installers/lib/ide/windsurf.js +258 -0
  567. package/tools/cli/installers/lib/message-loader.js +85 -0
  568. package/tools/cli/installers/lib/modules/external-manager.js +133 -0
  569. package/tools/cli/installers/lib/modules/manager.js +1362 -0
  570. package/tools/cli/lib/activation-builder.js +163 -0
  571. package/tools/cli/lib/agent/compiler.js +522 -0
  572. package/tools/cli/lib/agent/installer.js +716 -0
  573. package/tools/cli/lib/agent/template-engine.js +152 -0
  574. package/tools/cli/lib/agent-analyzer.js +109 -0
  575. package/tools/cli/lib/agent-party-generator.js +194 -0
  576. package/tools/cli/lib/cli-utils.js +227 -0
  577. package/tools/cli/lib/config.js +213 -0
  578. package/tools/cli/lib/file-ops.js +204 -0
  579. package/tools/cli/lib/platform-codes.js +116 -0
  580. package/tools/cli/lib/project-root.js +77 -0
  581. package/tools/cli/lib/prompts.js +433 -0
  582. package/tools/cli/lib/ui.js +1591 -0
  583. package/tools/cli/lib/xml-handler.js +177 -0
  584. package/tools/cli/lib/xml-to-markdown.js +82 -0
  585. package/tools/cli/lib/yaml-format.js +245 -0
  586. package/tools/cli/lib/yaml-xml-builder.js +587 -0
  587. package/tools/cli/scripts/migrate-workflows.js +281 -0
  588. package/tools/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
  589. package/tools/docs/index.md +2 -0
  590. package/tools/fix-doc-links.js +288 -0
  591. package/tools/flattener/aggregate.js +76 -0
  592. package/tools/flattener/binary.js +80 -0
  593. package/tools/flattener/discovery.js +71 -0
  594. package/tools/flattener/files.js +35 -0
  595. package/tools/flattener/ignoreRules.js +172 -0
  596. package/tools/flattener/main.js +483 -0
  597. package/tools/flattener/projectRoot.js +201 -0
  598. package/tools/flattener/prompts.js +44 -0
  599. package/tools/flattener/stats.helpers.js +368 -0
  600. package/tools/flattener/stats.js +75 -0
  601. package/tools/flattener/test-matrix.js +409 -0
  602. package/tools/flattener/xml.js +82 -0
  603. package/tools/format-workflow-md.js +263 -0
  604. package/tools/lib/xml-utils.js +13 -0
  605. package/tools/maintainer/review-pr-README.md +55 -0
  606. package/tools/maintainer/review-pr.md +242 -0
  607. package/tools/migrate-custom-module-paths.js +124 -0
  608. package/tools/platform-codes.yaml +157 -0
  609. package/tools/schema/agent.js +493 -0
  610. package/tools/validate-agent-schema.js +110 -0
  611. package/tools/validate-doc-links.js +363 -0
  612. package/tools/validate-svg-changes.sh +356 -0
  613. package/website/README.md +76 -0
  614. package/website/astro.config.mjs +228 -0
  615. package/website/public/favicon.ico +0 -0
  616. package/website/public/img/bmad-dark.png +0 -0
  617. package/website/public/img/bmad-light.png +0 -0
  618. package/website/public/img/logo.svg +4 -0
  619. package/website/public/robots.txt +37 -0
  620. package/website/src/components/Banner.astro +59 -0
  621. package/website/src/components/Header.astro +121 -0
  622. package/website/src/components/MobileMenuFooter.astro +53 -0
  623. package/website/src/content/config.ts +6 -0
  624. package/website/src/lib/site-url.js +25 -0
  625. package/website/src/rehype-markdown-links.js +102 -0
  626. package/website/src/styles/custom.css +485 -0
@@ -0,0 +1,963 @@
1
+ const path = require('node:path');
2
+ const fs = require('fs-extra');
3
+ const yaml = require('yaml');
4
+ const crypto = require('node:crypto');
5
+ const { getSourcePath, getModulePath } = require('../../../lib/project-root');
6
+
7
+ // Load package.json for version info
8
+ const packageJson = require('../../../../../package.json');
9
+
10
+ /**
11
+ * Generates manifest files for installed workflows, agents, and tasks
12
+ */
13
+ class ManifestGenerator {
14
+ constructor() {
15
+ this.workflows = [];
16
+ this.agents = [];
17
+ this.tasks = [];
18
+ this.tools = [];
19
+ this.modules = [];
20
+ this.files = [];
21
+ this.selectedIdes = [];
22
+ }
23
+
24
+ /**
25
+ * Generate all manifests for the installation
26
+ * @param {string} bmadDir - _bmad
27
+ * @param {Array} selectedModules - Selected modules for installation
28
+ * @param {Array} installedFiles - All installed files (optional, for hash tracking)
29
+ */
30
+ async generateManifests(bmadDir, selectedModules, installedFiles = [], options = {}) {
31
+ // Create _config directory if it doesn't exist
32
+ const cfgDir = path.join(bmadDir, '_config');
33
+ await fs.ensureDir(cfgDir);
34
+
35
+ // Store modules list (all modules including preserved ones)
36
+ const preservedModules = options.preservedModules || [];
37
+
38
+ // Scan the bmad directory to find all actually installed modules
39
+ const installedModules = await this.scanInstalledModules(bmadDir);
40
+
41
+ // Since custom modules are now installed the same way as regular modules,
42
+ // we don't need to exclude them from manifest generation
43
+ const allModules = [...new Set(['core', ...selectedModules, ...preservedModules, ...installedModules])];
44
+
45
+ this.modules = allModules;
46
+ this.updatedModules = allModules; // Include ALL modules (including custom) for scanning
47
+
48
+ // For CSV manifests, we need to include ALL modules that are installed
49
+ // preservedModules controls which modules stay as-is in the CSV (don't get rescanned)
50
+ // But all modules should be included in the final manifest
51
+ this.preservedModules = allModules; // Include ALL modules (including custom)
52
+ this.bmadDir = bmadDir;
53
+ this.bmadFolderName = path.basename(bmadDir); // Get the actual folder name (e.g., '_bmad' or 'bmad')
54
+ this.allInstalledFiles = installedFiles;
55
+
56
+ if (!Object.prototype.hasOwnProperty.call(options, 'ides')) {
57
+ throw new Error('ManifestGenerator requires `options.ides` to be provided – installer should supply the selected IDEs array.');
58
+ }
59
+
60
+ const resolvedIdes = options.ides ?? [];
61
+ if (!Array.isArray(resolvedIdes)) {
62
+ throw new TypeError('ManifestGenerator expected `options.ides` to be an array.');
63
+ }
64
+
65
+ // Filter out any undefined/null values from IDE list
66
+ this.selectedIdes = resolvedIdes.filter((ide) => ide && typeof ide === 'string');
67
+
68
+ // Collect workflow data
69
+ await this.collectWorkflows(selectedModules);
70
+
71
+ // Collect agent data - use updatedModules which includes all installed modules
72
+ await this.collectAgents(this.updatedModules);
73
+
74
+ // Collect task data
75
+ await this.collectTasks(this.updatedModules);
76
+
77
+ // Collect tool data
78
+ await this.collectTools(this.updatedModules);
79
+
80
+ // Write manifest files and collect their paths
81
+ const manifestFiles = [
82
+ await this.writeMainManifest(cfgDir),
83
+ await this.writeWorkflowManifest(cfgDir),
84
+ await this.writeAgentManifest(cfgDir),
85
+ await this.writeTaskManifest(cfgDir),
86
+ await this.writeToolManifest(cfgDir),
87
+ await this.writeFilesManifest(cfgDir),
88
+ ];
89
+
90
+ return {
91
+ workflows: this.workflows.length,
92
+ agents: this.agents.length,
93
+ tasks: this.tasks.length,
94
+ tools: this.tools.length,
95
+ files: this.files.length,
96
+ manifestFiles: manifestFiles,
97
+ };
98
+ }
99
+
100
+ /**
101
+ * Collect all workflows from core and selected modules
102
+ * Scans the INSTALLED bmad directory, not the source
103
+ */
104
+ async collectWorkflows(selectedModules) {
105
+ this.workflows = [];
106
+
107
+ // Use updatedModules which already includes deduplicated 'core' + selectedModules
108
+ for (const moduleName of this.updatedModules) {
109
+ const modulePath = path.join(this.bmadDir, moduleName);
110
+
111
+ if (await fs.pathExists(modulePath)) {
112
+ const moduleWorkflows = await this.getWorkflowsFromPath(modulePath, moduleName);
113
+ this.workflows.push(...moduleWorkflows);
114
+ }
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Recursively find and parse workflow.yaml and workflow.md files
120
+ */
121
+ async getWorkflowsFromPath(basePath, moduleName) {
122
+ const workflows = [];
123
+ const workflowsPath = path.join(basePath, 'workflows');
124
+ const debug = process.env.BMAD_DEBUG_MANIFEST === 'true';
125
+
126
+ if (debug) {
127
+ console.log(`[DEBUG] Scanning workflows in: ${workflowsPath}`);
128
+ }
129
+
130
+ if (!(await fs.pathExists(workflowsPath))) {
131
+ if (debug) {
132
+ console.log(`[DEBUG] Workflows path does not exist: ${workflowsPath}`);
133
+ }
134
+ return workflows;
135
+ }
136
+
137
+ // Recursively find workflow.yaml files
138
+ const findWorkflows = async (dir, relativePath = '') => {
139
+ const entries = await fs.readdir(dir, { withFileTypes: true });
140
+
141
+ for (const entry of entries) {
142
+ const fullPath = path.join(dir, entry.name);
143
+
144
+ if (entry.isDirectory()) {
145
+ // Recurse into subdirectories
146
+ const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
147
+ await findWorkflows(fullPath, newRelativePath);
148
+ } else if (entry.name === 'workflow.yaml' || entry.name === 'workflow.md') {
149
+ // Parse workflow file (both YAML and MD formats)
150
+ if (debug) {
151
+ console.log(`[DEBUG] Found workflow file: ${fullPath}`);
152
+ }
153
+ try {
154
+ // Read and normalize line endings (fix Windows CRLF issues)
155
+ const rawContent = await fs.readFile(fullPath, 'utf8');
156
+ const content = rawContent.replaceAll('\r\n', '\n').replaceAll('\r', '\n');
157
+
158
+ let workflow;
159
+ if (entry.name === 'workflow.yaml') {
160
+ // Parse YAML workflow
161
+ workflow = yaml.parse(content);
162
+ } else {
163
+ // Parse MD workflow with YAML frontmatter
164
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
165
+ if (!frontmatterMatch) {
166
+ if (debug) {
167
+ console.log(`[DEBUG] Skipped (no frontmatter): ${fullPath}`);
168
+ }
169
+ continue; // Skip MD files without frontmatter
170
+ }
171
+ workflow = yaml.parse(frontmatterMatch[1]);
172
+ }
173
+
174
+ if (debug) {
175
+ console.log(`[DEBUG] Parsed: name="${workflow.name}", description=${workflow.description ? 'OK' : 'MISSING'}`);
176
+ }
177
+
178
+ // Skip template workflows (those with placeholder values)
179
+ if (workflow.name && workflow.name.includes('{') && workflow.name.includes('}')) {
180
+ if (debug) {
181
+ console.log(`[DEBUG] Skipped (template placeholder): ${workflow.name}`);
182
+ }
183
+ continue;
184
+ }
185
+
186
+ // Skip workflows marked as non-standalone (reference/example workflows)
187
+ if (workflow.standalone === false) {
188
+ if (debug) {
189
+ console.log(`[DEBUG] Skipped (standalone=false): ${workflow.name}`);
190
+ }
191
+ continue;
192
+ }
193
+
194
+ if (workflow.name && workflow.description) {
195
+ // Build relative path for installation
196
+ const installPath =
197
+ moduleName === 'core'
198
+ ? `${this.bmadFolderName}/core/workflows/${relativePath}/${entry.name}`
199
+ : `${this.bmadFolderName}/${moduleName}/workflows/${relativePath}/${entry.name}`;
200
+
201
+ // Workflows with standalone: false are filtered out above
202
+ workflows.push({
203
+ name: workflow.name,
204
+ description: workflow.description.replaceAll('"', '""'), // Escape quotes for CSV
205
+ module: moduleName,
206
+ path: installPath,
207
+ });
208
+
209
+ // Add to files list
210
+ this.files.push({
211
+ type: 'workflow',
212
+ name: workflow.name,
213
+ module: moduleName,
214
+ path: installPath,
215
+ });
216
+
217
+ if (debug) {
218
+ console.log(`[DEBUG] ✓ Added workflow: ${workflow.name} (${moduleName})`);
219
+ }
220
+ } else {
221
+ if (debug) {
222
+ console.log(`[DEBUG] Skipped (missing name or description): ${fullPath}`);
223
+ }
224
+ }
225
+ } catch (error) {
226
+ console.warn(`Warning: Failed to parse workflow at ${fullPath}: ${error.message}`);
227
+ }
228
+ }
229
+ }
230
+ };
231
+
232
+ await findWorkflows(workflowsPath);
233
+
234
+ if (debug) {
235
+ console.log(`[DEBUG] Total workflows found in ${moduleName}: ${workflows.length}`);
236
+ }
237
+
238
+ return workflows;
239
+ }
240
+
241
+ /**
242
+ * Collect all agents from core and selected modules
243
+ * Scans the INSTALLED bmad directory, not the source
244
+ */
245
+ async collectAgents(selectedModules) {
246
+ this.agents = [];
247
+
248
+ // Use updatedModules which already includes deduplicated 'core' + selectedModules
249
+ for (const moduleName of this.updatedModules) {
250
+ const agentsPath = path.join(this.bmadDir, moduleName, 'agents');
251
+
252
+ if (await fs.pathExists(agentsPath)) {
253
+ const moduleAgents = await this.getAgentsFromDir(agentsPath, moduleName);
254
+ this.agents.push(...moduleAgents);
255
+ }
256
+ }
257
+
258
+ // Get standalone agents from bmad/agents/ directory
259
+ const standaloneAgentsDir = path.join(this.bmadDir, 'agents');
260
+ if (await fs.pathExists(standaloneAgentsDir)) {
261
+ const agentDirs = await fs.readdir(standaloneAgentsDir, { withFileTypes: true });
262
+
263
+ for (const agentDir of agentDirs) {
264
+ if (!agentDir.isDirectory()) continue;
265
+
266
+ const agentDirPath = path.join(standaloneAgentsDir, agentDir.name);
267
+ const standaloneAgents = await this.getAgentsFromDir(agentDirPath, 'standalone');
268
+ this.agents.push(...standaloneAgents);
269
+ }
270
+ }
271
+ }
272
+
273
+ /**
274
+ * Get agents from a directory recursively
275
+ * Only includes compiled .md files (not .agent.yaml source files)
276
+ */
277
+ async getAgentsFromDir(dirPath, moduleName, relativePath = '') {
278
+ const agents = [];
279
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
280
+
281
+ for (const entry of entries) {
282
+ const fullPath = path.join(dirPath, entry.name);
283
+
284
+ if (entry.isDirectory()) {
285
+ // Recurse into subdirectories
286
+ const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
287
+ const subDirAgents = await this.getAgentsFromDir(fullPath, moduleName, newRelativePath);
288
+ agents.push(...subDirAgents);
289
+ } else if (entry.name.endsWith('.md') && !entry.name.endsWith('.agent.yaml') && entry.name.toLowerCase() !== 'readme.md') {
290
+ const content = await fs.readFile(fullPath, 'utf8');
291
+
292
+ // Skip files that don't contain <agent> tag (e.g., README files)
293
+ if (!content.includes('<agent')) {
294
+ continue;
295
+ }
296
+
297
+ // Skip web-only agents
298
+ if (content.includes('localskip="true"')) {
299
+ continue;
300
+ }
301
+
302
+ // Extract agent metadata from the XML structure
303
+ const nameMatch = content.match(/name="([^"]+)"/);
304
+ const titleMatch = content.match(/title="([^"]+)"/);
305
+ const iconMatch = content.match(/icon="([^"]+)"/);
306
+
307
+ // Extract persona fields
308
+ const roleMatch = content.match(/<role>([^<]+)<\/role>/);
309
+ const identityMatch = content.match(/<identity>([\s\S]*?)<\/identity>/);
310
+ const styleMatch = content.match(/<communication_style>([\s\S]*?)<\/communication_style>/);
311
+ const principlesMatch = content.match(/<principles>([\s\S]*?)<\/principles>/);
312
+
313
+ // Build relative path for installation
314
+ const fileRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
315
+ const installPath =
316
+ moduleName === 'core'
317
+ ? `${this.bmadFolderName}/core/agents/${fileRelativePath}`
318
+ : `${this.bmadFolderName}/${moduleName}/agents/${fileRelativePath}`;
319
+
320
+ const agentName = entry.name.replace('.md', '');
321
+
322
+ // Helper function to clean and escape CSV content
323
+ const cleanForCSV = (text) => {
324
+ if (!text) return '';
325
+ return text
326
+ .trim()
327
+ .replaceAll(/\s+/g, ' ') // Normalize whitespace
328
+ .replaceAll('"', '""'); // Escape quotes for CSV
329
+ };
330
+
331
+ agents.push({
332
+ name: agentName,
333
+ displayName: nameMatch ? nameMatch[1] : agentName,
334
+ title: titleMatch ? titleMatch[1] : '',
335
+ icon: iconMatch ? iconMatch[1] : '',
336
+ role: roleMatch ? cleanForCSV(roleMatch[1]) : '',
337
+ identity: identityMatch ? cleanForCSV(identityMatch[1]) : '',
338
+ communicationStyle: styleMatch ? cleanForCSV(styleMatch[1]) : '',
339
+ principles: principlesMatch ? cleanForCSV(principlesMatch[1]) : '',
340
+ module: moduleName,
341
+ path: installPath,
342
+ });
343
+
344
+ // Add to files list
345
+ this.files.push({
346
+ type: 'agent',
347
+ name: agentName,
348
+ module: moduleName,
349
+ path: installPath,
350
+ });
351
+ }
352
+ }
353
+
354
+ return agents;
355
+ }
356
+
357
+ /**
358
+ * Collect all tasks from core and selected modules
359
+ * Scans the INSTALLED bmad directory, not the source
360
+ */
361
+ async collectTasks(selectedModules) {
362
+ this.tasks = [];
363
+
364
+ // Use updatedModules which already includes deduplicated 'core' + selectedModules
365
+ for (const moduleName of this.updatedModules) {
366
+ const tasksPath = path.join(this.bmadDir, moduleName, 'tasks');
367
+
368
+ if (await fs.pathExists(tasksPath)) {
369
+ const moduleTasks = await this.getTasksFromDir(tasksPath, moduleName);
370
+ this.tasks.push(...moduleTasks);
371
+ }
372
+ }
373
+ }
374
+
375
+ /**
376
+ * Get tasks from a directory
377
+ */
378
+ async getTasksFromDir(dirPath, moduleName) {
379
+ const tasks = [];
380
+ const files = await fs.readdir(dirPath);
381
+
382
+ for (const file of files) {
383
+ // Check for both .xml and .md files
384
+ if (file.endsWith('.xml') || file.endsWith('.md')) {
385
+ const filePath = path.join(dirPath, file);
386
+ const content = await fs.readFile(filePath, 'utf8');
387
+
388
+ // Extract task metadata from content if possible
389
+ const nameMatch = content.match(/name="([^"]+)"/);
390
+
391
+ // Try description attribute first, fall back to <objective> element
392
+ const descMatch = content.match(/description="([^"]+)"/);
393
+ const objMatch = content.match(/<objective>([^<]+)<\/objective>/);
394
+ const description = descMatch ? descMatch[1] : objMatch ? objMatch[1].trim() : '';
395
+
396
+ // Check for standalone attribute in <task> tag (default: false)
397
+ const standaloneMatch = content.match(/<task[^>]+standalone="true"/);
398
+ const standalone = !!standaloneMatch;
399
+
400
+ // Build relative path for installation
401
+ const installPath =
402
+ moduleName === 'core' ? `${this.bmadFolderName}/core/tasks/${file}` : `${this.bmadFolderName}/${moduleName}/tasks/${file}`;
403
+
404
+ const taskName = file.replace(/\.(xml|md)$/, '');
405
+ tasks.push({
406
+ name: taskName,
407
+ displayName: nameMatch ? nameMatch[1] : taskName,
408
+ description: description.replaceAll('"', '""'),
409
+ module: moduleName,
410
+ path: installPath,
411
+ standalone: standalone,
412
+ });
413
+
414
+ // Add to files list
415
+ this.files.push({
416
+ type: 'task',
417
+ name: taskName,
418
+ module: moduleName,
419
+ path: installPath,
420
+ });
421
+ }
422
+ }
423
+
424
+ return tasks;
425
+ }
426
+
427
+ /**
428
+ * Collect all tools from core and selected modules
429
+ * Scans the INSTALLED bmad directory, not the source
430
+ */
431
+ async collectTools(selectedModules) {
432
+ this.tools = [];
433
+
434
+ // Use updatedModules which already includes deduplicated 'core' + selectedModules
435
+ for (const moduleName of this.updatedModules) {
436
+ const toolsPath = path.join(this.bmadDir, moduleName, 'tools');
437
+
438
+ if (await fs.pathExists(toolsPath)) {
439
+ const moduleTools = await this.getToolsFromDir(toolsPath, moduleName);
440
+ this.tools.push(...moduleTools);
441
+ }
442
+ }
443
+ }
444
+
445
+ /**
446
+ * Get tools from a directory
447
+ */
448
+ async getToolsFromDir(dirPath, moduleName) {
449
+ const tools = [];
450
+ const files = await fs.readdir(dirPath);
451
+
452
+ for (const file of files) {
453
+ // Check for both .xml and .md files
454
+ if (file.endsWith('.xml') || file.endsWith('.md')) {
455
+ const filePath = path.join(dirPath, file);
456
+ const content = await fs.readFile(filePath, 'utf8');
457
+
458
+ // Extract tool metadata from content if possible
459
+ const nameMatch = content.match(/name="([^"]+)"/);
460
+
461
+ // Try description attribute first, fall back to <objective> element
462
+ const descMatch = content.match(/description="([^"]+)"/);
463
+ const objMatch = content.match(/<objective>([^<]+)<\/objective>/);
464
+ const description = descMatch ? descMatch[1] : objMatch ? objMatch[1].trim() : '';
465
+
466
+ // Check for standalone attribute in <tool> tag (default: false)
467
+ const standaloneMatch = content.match(/<tool[^>]+standalone="true"/);
468
+ const standalone = !!standaloneMatch;
469
+
470
+ // Build relative path for installation
471
+ const installPath =
472
+ moduleName === 'core' ? `${this.bmadFolderName}/core/tools/${file}` : `${this.bmadFolderName}/${moduleName}/tools/${file}`;
473
+
474
+ const toolName = file.replace(/\.(xml|md)$/, '');
475
+ tools.push({
476
+ name: toolName,
477
+ displayName: nameMatch ? nameMatch[1] : toolName,
478
+ description: description.replaceAll('"', '""'),
479
+ module: moduleName,
480
+ path: installPath,
481
+ standalone: standalone,
482
+ });
483
+
484
+ // Add to files list
485
+ this.files.push({
486
+ type: 'tool',
487
+ name: toolName,
488
+ module: moduleName,
489
+ path: installPath,
490
+ });
491
+ }
492
+ }
493
+
494
+ return tools;
495
+ }
496
+
497
+ /**
498
+ * Write main manifest as YAML with installation info only
499
+ * @returns {string} Path to the manifest file
500
+ */
501
+ async writeMainManifest(cfgDir) {
502
+ const manifestPath = path.join(cfgDir, 'manifest.yaml');
503
+
504
+ const manifest = {
505
+ installation: {
506
+ version: packageJson.version,
507
+ installDate: new Date().toISOString(),
508
+ lastUpdated: new Date().toISOString(),
509
+ },
510
+ modules: this.modules, // Include ALL modules (standard and custom)
511
+ ides: this.selectedIdes,
512
+ };
513
+
514
+ // Clean the manifest to remove any non-serializable values
515
+ const cleanManifest = structuredClone(manifest);
516
+
517
+ const yamlStr = yaml.stringify(cleanManifest, {
518
+ indent: 2,
519
+ lineWidth: 0,
520
+ sortKeys: false,
521
+ });
522
+
523
+ // Ensure POSIX-compliant final newline
524
+ const content = yamlStr.endsWith('\n') ? yamlStr : yamlStr + '\n';
525
+ await fs.writeFile(manifestPath, content);
526
+ return manifestPath;
527
+ }
528
+
529
+ /**
530
+ * Read existing CSV and preserve rows for modules NOT being updated
531
+ * @param {string} csvPath - Path to existing CSV file
532
+ * @param {number} moduleColumnIndex - Which column contains the module name (0-indexed)
533
+ * @param {Array<string>} expectedColumns - Expected column names in order
534
+ * @param {Object} defaultValues - Default values for missing columns
535
+ * @returns {Array} Preserved CSV rows (without header), upgraded to match expected columns
536
+ */
537
+ async getPreservedCsvRows(csvPath, moduleColumnIndex, expectedColumns, defaultValues = {}) {
538
+ if (!(await fs.pathExists(csvPath)) || this.preservedModules.length === 0) {
539
+ return [];
540
+ }
541
+
542
+ try {
543
+ const content = await fs.readFile(csvPath, 'utf8');
544
+ const lines = content.trim().split('\n');
545
+
546
+ if (lines.length < 2) {
547
+ return []; // No data rows
548
+ }
549
+
550
+ // Parse header to understand old schema
551
+ const header = lines[0];
552
+ const headerColumns = header.match(/(".*?"|[^",\s]+)(?=\s*,|\s*$)/g) || [];
553
+ const oldColumns = headerColumns.map((c) => c.replaceAll(/^"|"$/g, ''));
554
+
555
+ // Skip header row for data
556
+ const dataRows = lines.slice(1);
557
+ const preservedRows = [];
558
+
559
+ for (const row of dataRows) {
560
+ // Simple CSV parsing (handles quoted values)
561
+ const columns = row.match(/(".*?"|[^",\s]+)(?=\s*,|\s*$)/g) || [];
562
+ const cleanColumns = columns.map((c) => c.replaceAll(/^"|"$/g, ''));
563
+
564
+ const moduleValue = cleanColumns[moduleColumnIndex];
565
+
566
+ // Keep this row if it belongs to a preserved module
567
+ if (this.preservedModules.includes(moduleValue)) {
568
+ // Upgrade row to match expected schema
569
+ const upgradedRow = this.upgradeRowToSchema(cleanColumns, oldColumns, expectedColumns, defaultValues);
570
+ preservedRows.push(upgradedRow);
571
+ }
572
+ }
573
+
574
+ return preservedRows;
575
+ } catch (error) {
576
+ console.warn(`Warning: Failed to read existing CSV ${csvPath}:`, error.message);
577
+ return [];
578
+ }
579
+ }
580
+
581
+ /**
582
+ * Upgrade a CSV row from old schema to new schema
583
+ * @param {Array<string>} rowValues - Values from old row
584
+ * @param {Array<string>} oldColumns - Old column names
585
+ * @param {Array<string>} newColumns - New column names
586
+ * @param {Object} defaultValues - Default values for missing columns
587
+ * @returns {string} Upgraded CSV row
588
+ */
589
+ upgradeRowToSchema(rowValues, oldColumns, newColumns, defaultValues) {
590
+ const upgradedValues = [];
591
+
592
+ for (const newCol of newColumns) {
593
+ const oldIndex = oldColumns.indexOf(newCol);
594
+
595
+ if (oldIndex !== -1 && oldIndex < rowValues.length) {
596
+ // Column exists in old schema, use its value
597
+ upgradedValues.push(rowValues[oldIndex]);
598
+ } else if (defaultValues[newCol] === undefined) {
599
+ // Column missing, no default provided
600
+ upgradedValues.push('');
601
+ } else {
602
+ // Column missing, use default value
603
+ upgradedValues.push(defaultValues[newCol]);
604
+ }
605
+ }
606
+
607
+ // Properly quote values and join
608
+ return upgradedValues.map((v) => `"${v}"`).join(',');
609
+ }
610
+
611
+ /**
612
+ * Write workflow manifest CSV
613
+ * @returns {string} Path to the manifest file
614
+ */
615
+ async writeWorkflowManifest(cfgDir) {
616
+ const csvPath = path.join(cfgDir, 'workflow-manifest.csv');
617
+ const escapeCsv = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`;
618
+ const parseCsvLine = (line) => {
619
+ const columns = line.match(/(".*?"|[^",\s]+)(?=\s*,|\s*$)/g) || [];
620
+ return columns.map((c) => c.replaceAll(/^"|"$/g, ''));
621
+ };
622
+
623
+ // Read existing manifest to preserve entries
624
+ const existingEntries = new Map();
625
+ if (await fs.pathExists(csvPath)) {
626
+ const content = await fs.readFile(csvPath, 'utf8');
627
+ const lines = content.split('\n').filter((line) => line.trim());
628
+
629
+ // Skip header
630
+ for (let i = 1; i < lines.length; i++) {
631
+ const line = lines[i];
632
+ if (line) {
633
+ const parts = parseCsvLine(line);
634
+ if (parts.length >= 4) {
635
+ const [name, description, module, workflowPath] = parts;
636
+ existingEntries.set(`${module}:${name}`, {
637
+ name,
638
+ description,
639
+ module,
640
+ path: workflowPath,
641
+ });
642
+ }
643
+ }
644
+ }
645
+ }
646
+
647
+ // Create CSV header - standalone column removed, everything is canonicalized to 4 columns
648
+ let csv = 'name,description,module,path\n';
649
+
650
+ // Combine existing and new workflows
651
+ const allWorkflows = new Map();
652
+
653
+ // Add existing entries
654
+ for (const [key, value] of existingEntries) {
655
+ allWorkflows.set(key, value);
656
+ }
657
+
658
+ // Add/update new workflows
659
+ for (const workflow of this.workflows) {
660
+ const key = `${workflow.module}:${workflow.name}`;
661
+ allWorkflows.set(key, {
662
+ name: workflow.name,
663
+ description: workflow.description,
664
+ module: workflow.module,
665
+ path: workflow.path,
666
+ });
667
+ }
668
+
669
+ // Write all workflows
670
+ for (const [, value] of allWorkflows) {
671
+ const row = [escapeCsv(value.name), escapeCsv(value.description), escapeCsv(value.module), escapeCsv(value.path)].join(',');
672
+ csv += row + '\n';
673
+ }
674
+
675
+ await fs.writeFile(csvPath, csv);
676
+ return csvPath;
677
+ }
678
+
679
+ /**
680
+ * Write agent manifest CSV
681
+ * @returns {string} Path to the manifest file
682
+ */
683
+ async writeAgentManifest(cfgDir) {
684
+ const csvPath = path.join(cfgDir, 'agent-manifest.csv');
685
+
686
+ // Read existing manifest to preserve entries
687
+ const existingEntries = new Map();
688
+ if (await fs.pathExists(csvPath)) {
689
+ const content = await fs.readFile(csvPath, 'utf8');
690
+ const lines = content.split('\n').filter((line) => line.trim());
691
+
692
+ // Skip header
693
+ for (let i = 1; i < lines.length; i++) {
694
+ const line = lines[i];
695
+ if (line) {
696
+ // Parse CSV (simple parsing assuming no commas in quoted fields)
697
+ const parts = line.split('","');
698
+ if (parts.length >= 11) {
699
+ const name = parts[0].replace(/^"/, '');
700
+ const module = parts[8];
701
+ existingEntries.set(`${module}:${name}`, line);
702
+ }
703
+ }
704
+ }
705
+ }
706
+
707
+ // Create CSV header with persona fields
708
+ let csv = 'name,displayName,title,icon,role,identity,communicationStyle,principles,module,path\n';
709
+
710
+ // Combine existing and new agents, preferring new data for duplicates
711
+ const allAgents = new Map();
712
+
713
+ // Add existing entries
714
+ for (const [key, value] of existingEntries) {
715
+ allAgents.set(key, value);
716
+ }
717
+
718
+ // Add/update new agents
719
+ for (const agent of this.agents) {
720
+ const key = `${agent.module}:${agent.name}`;
721
+ allAgents.set(
722
+ key,
723
+ `"${agent.name}","${agent.displayName}","${agent.title}","${agent.icon}","${agent.role}","${agent.identity}","${agent.communicationStyle}","${agent.principles}","${agent.module}","${agent.path}"`,
724
+ );
725
+ }
726
+
727
+ // Write all agents
728
+ for (const [, value] of allAgents) {
729
+ csv += value + '\n';
730
+ }
731
+
732
+ await fs.writeFile(csvPath, csv);
733
+ return csvPath;
734
+ }
735
+
736
+ /**
737
+ * Write task manifest CSV
738
+ * @returns {string} Path to the manifest file
739
+ */
740
+ async writeTaskManifest(cfgDir) {
741
+ const csvPath = path.join(cfgDir, 'task-manifest.csv');
742
+
743
+ // Read existing manifest to preserve entries
744
+ const existingEntries = new Map();
745
+ if (await fs.pathExists(csvPath)) {
746
+ const content = await fs.readFile(csvPath, 'utf8');
747
+ const lines = content.split('\n').filter((line) => line.trim());
748
+
749
+ // Skip header
750
+ for (let i = 1; i < lines.length; i++) {
751
+ const line = lines[i];
752
+ if (line) {
753
+ // Parse CSV (simple parsing assuming no commas in quoted fields)
754
+ const parts = line.split('","');
755
+ if (parts.length >= 6) {
756
+ const name = parts[0].replace(/^"/, '');
757
+ const module = parts[3];
758
+ existingEntries.set(`${module}:${name}`, line);
759
+ }
760
+ }
761
+ }
762
+ }
763
+
764
+ // Create CSV header with standalone column
765
+ let csv = 'name,displayName,description,module,path,standalone\n';
766
+
767
+ // Combine existing and new tasks
768
+ const allTasks = new Map();
769
+
770
+ // Add existing entries
771
+ for (const [key, value] of existingEntries) {
772
+ allTasks.set(key, value);
773
+ }
774
+
775
+ // Add/update new tasks
776
+ for (const task of this.tasks) {
777
+ const key = `${task.module}:${task.name}`;
778
+ allTasks.set(key, `"${task.name}","${task.displayName}","${task.description}","${task.module}","${task.path}","${task.standalone}"`);
779
+ }
780
+
781
+ // Write all tasks
782
+ for (const [, value] of allTasks) {
783
+ csv += value + '\n';
784
+ }
785
+
786
+ await fs.writeFile(csvPath, csv);
787
+ return csvPath;
788
+ }
789
+
790
+ /**
791
+ * Write tool manifest CSV
792
+ * @returns {string} Path to the manifest file
793
+ */
794
+ async writeToolManifest(cfgDir) {
795
+ const csvPath = path.join(cfgDir, 'tool-manifest.csv');
796
+
797
+ // Read existing manifest to preserve entries
798
+ const existingEntries = new Map();
799
+ if (await fs.pathExists(csvPath)) {
800
+ const content = await fs.readFile(csvPath, 'utf8');
801
+ const lines = content.split('\n').filter((line) => line.trim());
802
+
803
+ // Skip header
804
+ for (let i = 1; i < lines.length; i++) {
805
+ const line = lines[i];
806
+ if (line) {
807
+ // Parse CSV (simple parsing assuming no commas in quoted fields)
808
+ const parts = line.split('","');
809
+ if (parts.length >= 6) {
810
+ const name = parts[0].replace(/^"/, '');
811
+ const module = parts[3];
812
+ existingEntries.set(`${module}:${name}`, line);
813
+ }
814
+ }
815
+ }
816
+ }
817
+
818
+ // Create CSV header with standalone column
819
+ let csv = 'name,displayName,description,module,path,standalone\n';
820
+
821
+ // Combine existing and new tools
822
+ const allTools = new Map();
823
+
824
+ // Add existing entries
825
+ for (const [key, value] of existingEntries) {
826
+ allTools.set(key, value);
827
+ }
828
+
829
+ // Add/update new tools
830
+ for (const tool of this.tools) {
831
+ const key = `${tool.module}:${tool.name}`;
832
+ allTools.set(key, `"${tool.name}","${tool.displayName}","${tool.description}","${tool.module}","${tool.path}","${tool.standalone}"`);
833
+ }
834
+
835
+ // Write all tools
836
+ for (const [, value] of allTools) {
837
+ csv += value + '\n';
838
+ }
839
+
840
+ await fs.writeFile(csvPath, csv);
841
+ return csvPath;
842
+ }
843
+
844
+ /**
845
+ * Write files manifest CSV
846
+ */
847
+ /**
848
+ * Calculate SHA256 hash of a file
849
+ * @param {string} filePath - Path to file
850
+ * @returns {string} SHA256 hash
851
+ */
852
+ async calculateFileHash(filePath) {
853
+ try {
854
+ const content = await fs.readFile(filePath);
855
+ return crypto.createHash('sha256').update(content).digest('hex');
856
+ } catch {
857
+ return '';
858
+ }
859
+ }
860
+
861
+ /**
862
+ * @returns {string} Path to the manifest file
863
+ */
864
+ async writeFilesManifest(cfgDir) {
865
+ const csvPath = path.join(cfgDir, 'files-manifest.csv');
866
+
867
+ // Create CSV header with hash column
868
+ let csv = 'type,name,module,path,hash\n';
869
+
870
+ // If we have ALL installed files, use those instead of just workflows/agents/tasks
871
+ const allFiles = [];
872
+ if (this.allInstalledFiles && this.allInstalledFiles.length > 0) {
873
+ // Process all installed files
874
+ for (const filePath of this.allInstalledFiles) {
875
+ // Store paths relative to bmadDir (no folder prefix)
876
+ const relativePath = filePath.replace(this.bmadDir, '').replaceAll('\\', '/').replace(/^\//, '');
877
+ const ext = path.extname(filePath).toLowerCase();
878
+ const fileName = path.basename(filePath, ext);
879
+
880
+ // Determine module from path (first directory component)
881
+ const pathParts = relativePath.split('/');
882
+ const module = pathParts.length > 0 ? pathParts[0] : 'unknown';
883
+
884
+ // Calculate hash
885
+ const hash = await this.calculateFileHash(filePath);
886
+
887
+ allFiles.push({
888
+ type: ext.slice(1) || 'file',
889
+ name: fileName,
890
+ module: module,
891
+ path: relativePath,
892
+ hash: hash,
893
+ });
894
+ }
895
+ } else {
896
+ // Fallback: use the collected workflows/agents/tasks
897
+ for (const file of this.files) {
898
+ // Strip the folder prefix if present (for consistency)
899
+ const relPath = file.path.replace(this.bmadFolderName + '/', '');
900
+ const filePath = path.join(this.bmadDir, relPath);
901
+ const hash = await this.calculateFileHash(filePath);
902
+ allFiles.push({
903
+ ...file,
904
+ path: relPath,
905
+ hash: hash,
906
+ });
907
+ }
908
+ }
909
+
910
+ // Sort files by module, then type, then name
911
+ allFiles.sort((a, b) => {
912
+ if (a.module !== b.module) return a.module.localeCompare(b.module);
913
+ if (a.type !== b.type) return a.type.localeCompare(b.type);
914
+ return a.name.localeCompare(b.name);
915
+ });
916
+
917
+ // Add all files
918
+ for (const file of allFiles) {
919
+ csv += `"${file.type}","${file.name}","${file.module}","${file.path}","${file.hash}"\n`;
920
+ }
921
+
922
+ await fs.writeFile(csvPath, csv);
923
+ return csvPath;
924
+ }
925
+
926
+ /**
927
+ * Scan the bmad directory to find all installed modules
928
+ * @param {string} bmadDir - Path to bmad directory
929
+ * @returns {Array} List of module names
930
+ */
931
+ async scanInstalledModules(bmadDir) {
932
+ const modules = [];
933
+
934
+ try {
935
+ const entries = await fs.readdir(bmadDir, { withFileTypes: true });
936
+
937
+ for (const entry of entries) {
938
+ // Skip if not a directory or is a special directory
939
+ if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === '_config') {
940
+ continue;
941
+ }
942
+
943
+ // Check if this looks like a module (has agents, workflows, or tasks directory)
944
+ const modulePath = path.join(bmadDir, entry.name);
945
+ const hasAgents = await fs.pathExists(path.join(modulePath, 'agents'));
946
+ const hasWorkflows = await fs.pathExists(path.join(modulePath, 'workflows'));
947
+ const hasTasks = await fs.pathExists(path.join(modulePath, 'tasks'));
948
+ const hasTools = await fs.pathExists(path.join(modulePath, 'tools'));
949
+
950
+ // If it has any of these directories, it's likely a module
951
+ if (hasAgents || hasWorkflows || hasTasks || hasTools) {
952
+ modules.push(entry.name);
953
+ }
954
+ }
955
+ } catch (error) {
956
+ console.warn(`Warning: Could not scan for installed modules: ${error.message}`);
957
+ }
958
+
959
+ return modules;
960
+ }
961
+ }
962
+
963
+ module.exports = { ManifestGenerator };