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,281 @@
1
+
2
+ /**
3
+ * Workflow Migration Script
4
+ *
5
+ * Updates workflow.yaml files to support the multi-scope system.
6
+ * Primarily updates test_dir and other path variables to use scope-aware paths.
7
+ *
8
+ * Usage:
9
+ * node migrate-workflows.js [--dry-run] [--verbose]
10
+ *
11
+ * Options:
12
+ * --dry-run Show what would be changed without making changes
13
+ * --verbose Show detailed output
14
+ */
15
+
16
+ const fs = require('fs-extra');
17
+ const path = require('node:path');
18
+ const yaml = require('yaml');
19
+ const chalk = require('chalk');
20
+
21
+ // Configuration
22
+ const SRC_PATH = path.resolve(__dirname, '../../../src');
23
+ const WORKFLOW_PATTERN = '**/workflow.yaml';
24
+
25
+ // Path mappings for migration
26
+ const PATH_MIGRATIONS = [
27
+ // Test directory migrations
28
+ {
29
+ pattern: /\{output_folder\}\/tests/g,
30
+ replacement: '{scope_tests}',
31
+ description: 'test directory to scope_tests'
32
+ },
33
+ {
34
+ pattern: /\{config_source:implementation_artifacts\}\/tests/g,
35
+ replacement: '{config_source:scope_tests}',
36
+ description: 'implementation_artifacts tests to scope_tests'
37
+ },
38
+ // Planning artifacts
39
+ {
40
+ pattern: /\{output_folder\}\/planning-artifacts/g,
41
+ replacement: '{config_source:planning_artifacts}',
42
+ description: 'output_folder planning to config_source'
43
+ },
44
+ // Implementation artifacts
45
+ {
46
+ pattern: /\{output_folder\}\/implementation-artifacts/g,
47
+ replacement: '{config_source:implementation_artifacts}',
48
+ description: 'output_folder implementation to config_source'
49
+ }
50
+ ];
51
+
52
+ // Variables that indicate scope requirement
53
+ const SCOPE_INDICATORS = [
54
+ '{scope}',
55
+ '{scope_path}',
56
+ '{scope_tests}',
57
+ '{scope_planning}',
58
+ '{scope_implementation}'
59
+ ];
60
+
61
+ /**
62
+ * Find all workflow.yaml files
63
+ */
64
+ async function findWorkflowFiles(basePath) {
65
+ const files = [];
66
+
67
+ async function walk(dir) {
68
+ const entries = await fs.readdir(dir, { withFileTypes: true });
69
+
70
+ for (const entry of entries) {
71
+ const fullPath = path.join(dir, entry.name);
72
+
73
+ if (entry.isDirectory()) {
74
+ // Skip node_modules and hidden directories
75
+ if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {
76
+ await walk(fullPath);
77
+ }
78
+ } else if (entry.name === 'workflow.yaml') {
79
+ files.push(fullPath);
80
+ }
81
+ }
82
+ }
83
+
84
+ await walk(basePath);
85
+ return files;
86
+ }
87
+
88
+ /**
89
+ * Check if a workflow already uses scope variables
90
+ */
91
+ function usesScope(content) {
92
+ return SCOPE_INDICATORS.some(indicator => content.includes(indicator));
93
+ }
94
+
95
+ /**
96
+ * Analyze a workflow file and suggest migrations
97
+ */
98
+ function analyzeWorkflow(content, filePath) {
99
+ const analysis = {
100
+ filePath,
101
+ needsMigration: false,
102
+ alreadyScoped: false,
103
+ suggestions: [],
104
+ currentVariables: []
105
+ };
106
+
107
+ // Check if already uses scope
108
+ if (usesScope(content)) {
109
+ analysis.alreadyScoped = true;
110
+ return analysis;
111
+ }
112
+
113
+ // Find variables that might need migration
114
+ const variablePattern = /\{[^}]+\}/g;
115
+ const matches = content.match(variablePattern) || [];
116
+ analysis.currentVariables = [...new Set(matches)];
117
+
118
+ // Check each migration pattern
119
+ for (const migration of PATH_MIGRATIONS) {
120
+ if (migration.pattern.test(content)) {
121
+ analysis.needsMigration = true;
122
+ analysis.suggestions.push({
123
+ description: migration.description,
124
+ pattern: migration.pattern.toString(),
125
+ replacement: migration.replacement
126
+ });
127
+ }
128
+ }
129
+
130
+ // Check for test_dir variable
131
+ if (content.includes('test_dir:') || content.includes('test_dir:')) {
132
+ analysis.needsMigration = true;
133
+ analysis.suggestions.push({
134
+ description: 'Has test_dir variable - may need scope_tests',
135
+ pattern: 'test_dir',
136
+ replacement: 'scope_tests via config_source'
137
+ });
138
+ }
139
+
140
+ return analysis;
141
+ }
142
+
143
+ /**
144
+ * Apply migrations to workflow content
145
+ */
146
+ function migrateWorkflow(content) {
147
+ let migrated = content;
148
+ let changes = [];
149
+
150
+ for (const migration of PATH_MIGRATIONS) {
151
+ if (migration.pattern.test(migrated)) {
152
+ migrated = migrated.replace(migration.pattern, migration.replacement);
153
+ changes.push(migration.description);
154
+ }
155
+ }
156
+
157
+ return { content: migrated, changes };
158
+ }
159
+
160
+ /**
161
+ * Add scope_required marker to workflow
162
+ */
163
+ function addScopeMarker(content) {
164
+ try {
165
+ const parsed = yaml.parse(content);
166
+
167
+ // Add scope_required if not present
168
+ if (!parsed.scope_required) {
169
+ parsed.scope_required = false; // Default to false for backward compatibility
170
+ }
171
+
172
+ return yaml.stringify(parsed, { lineWidth: 120 });
173
+ } catch {
174
+ // If YAML parsing fails, return original
175
+ return content;
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Main migration function
181
+ */
182
+ async function main() {
183
+ const args = new Set(process.argv.slice(2));
184
+ const dryRun = args.has('--dry-run');
185
+ const verbose = args.has('--verbose');
186
+
187
+ console.log(chalk.bold('\nWorkflow Migration Script'));
188
+ console.log(chalk.dim('Updating workflow.yaml files for multi-scope support\n'));
189
+
190
+ if (dryRun) {
191
+ console.log(chalk.yellow('DRY RUN MODE - No changes will be made\n'));
192
+ }
193
+
194
+ // Find all workflow files
195
+ console.log(chalk.blue('Scanning for workflow.yaml files...'));
196
+ const files = await findWorkflowFiles(SRC_PATH);
197
+ console.log(chalk.green(`Found ${files.length} workflow.yaml files\n`));
198
+
199
+ // Analysis results
200
+ const results = {
201
+ analyzed: 0,
202
+ alreadyScoped: 0,
203
+ migrated: 0,
204
+ noChanges: 0,
205
+ errors: []
206
+ };
207
+
208
+ // Process each file
209
+ for (const filePath of files) {
210
+ const relativePath = path.relative(SRC_PATH, filePath);
211
+ results.analyzed++;
212
+
213
+ try {
214
+ const content = await fs.readFile(filePath, 'utf8');
215
+ const analysis = analyzeWorkflow(content, filePath);
216
+
217
+ if (analysis.alreadyScoped) {
218
+ results.alreadyScoped++;
219
+ if (verbose) {
220
+ console.log(chalk.dim(` ○ ${relativePath} - already scope-aware`));
221
+ }
222
+ continue;
223
+ }
224
+
225
+ if (!analysis.needsMigration) {
226
+ results.noChanges++;
227
+ if (verbose) {
228
+ console.log(chalk.dim(` ○ ${relativePath} - no changes needed`));
229
+ }
230
+ continue;
231
+ }
232
+
233
+ // Apply migration
234
+ const { content: migrated, changes } = migrateWorkflow(content);
235
+
236
+ if (changes.length > 0) {
237
+ console.log(chalk.cyan(` ● ${relativePath}`));
238
+ for (const change of changes) {
239
+ console.log(chalk.dim(` → ${change}`));
240
+ }
241
+
242
+ if (!dryRun) {
243
+ await fs.writeFile(filePath, migrated, 'utf8');
244
+ }
245
+ results.migrated++;
246
+ } else {
247
+ results.noChanges++;
248
+ }
249
+
250
+ } catch (error) {
251
+ results.errors.push({ file: relativePath, error: error.message });
252
+ console.log(chalk.red(` ✗ ${relativePath} - Error: ${error.message}`));
253
+ }
254
+ }
255
+
256
+ // Print summary
257
+ console.log(chalk.bold('\n─────────────────────────────────────'));
258
+ console.log(chalk.bold('Summary'));
259
+ console.log(chalk.dim('─────────────────────────────────────'));
260
+ console.log(` Files analyzed: ${results.analyzed}`);
261
+ console.log(` Already scope-aware: ${results.alreadyScoped}`);
262
+ console.log(` Migrated: ${results.migrated}`);
263
+ console.log(` No changes needed: ${results.noChanges}`);
264
+ if (results.errors.length > 0) {
265
+ console.log(chalk.red(` Errors: ${results.errors.length}`));
266
+ }
267
+ console.log();
268
+
269
+ if (dryRun && results.migrated > 0) {
270
+ console.log(chalk.yellow('Run without --dry-run to apply changes\n'));
271
+ }
272
+
273
+ // Exit with error code if there were errors
274
+ process.exit(results.errors.length > 0 ? 1 : 0);
275
+ }
276
+
277
+ // Run
278
+ main().catch(error => {
279
+ console.error(chalk.red('Fatal error:'), error.message);
280
+ process.exit(1);
281
+ });
@@ -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
+
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Fix Documentation Links
3
+ *
4
+ * Converts relative markdown links to repo-relative paths with .md extension.
5
+ * This ensures links work both in GitHub and on the Astro/Starlight site
6
+ * (the rehype plugin transforms /docs/path/file.md → /path/file/ at build time).
7
+ *
8
+ * - ./file.md → /docs/current/path/file.md
9
+ * - ../other/file.md → /docs/resolved/path/file.md
10
+ * - /path/file/ → /docs/path/file.md (or /docs/path/file/index.md if it's a directory)
11
+ *
12
+ * Usage:
13
+ * node tools/fix-doc-links.js # Dry run (shows what would change)
14
+ * node tools/fix-doc-links.js --write # Actually write changes
15
+ */
16
+
17
+ const fs = require('node:fs');
18
+ const path = require('node:path');
19
+
20
+ const DOCS_ROOT = path.resolve(__dirname, '../docs');
21
+ const DRY_RUN = !process.argv.includes('--write');
22
+
23
+ // Regex to match markdown links:
24
+ // - [text](path.md) or [text](path.md#anchor) - existing .md links
25
+ // - [text](/path/to/page/) or [text](/path/to/page/#anchor) - site-relative links to convert
26
+ const MARKDOWN_LINK_REGEX = /\[([^\]]*)\]\(([^)]+(?:\.md|\/))(?:#[^)]*)?(?:\?[^)]*)?\)/g;
27
+ // Simpler approach: match all markdown links and filter in the handler
28
+ const ALL_MARKDOWN_LINKS_REGEX = /\[([^\]]*)\]\(([^)]+)\)/g;
29
+
30
+ /**
31
+ * Get all markdown files in docs directory, excluding _* directories/files
32
+ */
33
+ function getMarkdownFiles(dir) {
34
+ const files = [];
35
+
36
+ function walk(currentDir) {
37
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
38
+
39
+ for (const entry of entries) {
40
+ const fullPath = path.join(currentDir, entry.name);
41
+
42
+ // Skip underscore-prefixed entries
43
+ if (entry.name.startsWith('_')) {
44
+ continue;
45
+ }
46
+
47
+ if (entry.isDirectory()) {
48
+ walk(fullPath);
49
+ } else if (entry.isFile() && entry.name.endsWith('.md')) {
50
+ files.push(fullPath);
51
+ }
52
+ }
53
+ }
54
+
55
+ walk(dir);
56
+ return files;
57
+ }
58
+
59
+ /**
60
+ * Convert a markdown link href to repo-relative path with .md extension
61
+ *
62
+ * @param {string} href - The original href (e.g., "./file.md", "/path/to/page/", "/path/to/page/#anchor")
63
+ * @param {string} currentFilePath - Absolute path to the file containing this link
64
+ * @returns {string|null} - Repo-relative path (e.g., "/docs/path/to/file.md"), or null if shouldn't be converted
65
+ */
66
+ function convertToRepoRelative(href, currentFilePath) {
67
+ // Skip external links
68
+ if (href.includes('://') || href.startsWith('mailto:') || href.startsWith('tel:')) {
69
+ return null;
70
+ }
71
+
72
+ // Skip anchor-only links
73
+ if (href.startsWith('#')) {
74
+ return null;
75
+ }
76
+
77
+ // Extract anchor and query string if present
78
+ let anchor = '';
79
+ let query = '';
80
+ let pathPortion = href;
81
+
82
+ const hashIndex = href.indexOf('#');
83
+ const queryIndex = href.indexOf('?');
84
+
85
+ if (hashIndex !== -1 || queryIndex !== -1) {
86
+ const firstDelimiter = Math.min(hashIndex === -1 ? Infinity : hashIndex, queryIndex === -1 ? Infinity : queryIndex);
87
+ pathPortion = href.slice(0, Math.max(0, firstDelimiter));
88
+
89
+ const suffix = href.slice(Math.max(0, firstDelimiter));
90
+ const anchorInSuffix = suffix.indexOf('#');
91
+
92
+ if (suffix.startsWith('?')) {
93
+ if (anchorInSuffix === -1) {
94
+ query = suffix;
95
+ } else {
96
+ query = suffix.slice(0, Math.max(0, anchorInSuffix));
97
+ anchor = suffix.slice(Math.max(0, anchorInSuffix));
98
+ }
99
+ } else {
100
+ anchor = suffix;
101
+ }
102
+ }
103
+
104
+ // Skip non-documentation links (images, external assets, etc.)
105
+ const ext = path.extname(pathPortion).toLowerCase();
106
+ if (
107
+ ext &&
108
+ ext !== '.md' &&
109
+ !['.md'].includes(ext) && // Has an extension that's not .md - skip unless it's a trailing slash path
110
+ !pathPortion.endsWith('/')
111
+ ) {
112
+ return null;
113
+ }
114
+
115
+ // Check if original path ends with / (directory reference) BEFORE path.join normalizes it
116
+ const isDirectoryPath = pathPortion.endsWith('/');
117
+
118
+ let absolutePath;
119
+
120
+ if (pathPortion.startsWith('/docs/')) {
121
+ // Already repo-relative with /docs/ prefix
122
+ absolutePath = path.join(path.dirname(DOCS_ROOT), pathPortion);
123
+ } else if (pathPortion.startsWith('/')) {
124
+ // Site-relative (e.g., /tutorials/getting-started/) - resolve from docs root
125
+ absolutePath = path.join(DOCS_ROOT, pathPortion);
126
+ } else {
127
+ // Relative path (./, ../, or bare filename) - resolve from current file's directory
128
+ const currentDir = path.dirname(currentFilePath);
129
+ absolutePath = path.resolve(currentDir, pathPortion);
130
+ }
131
+
132
+ // Convert to repo-relative path (with /docs/ prefix)
133
+ let repoRelative = '/docs/' + path.relative(DOCS_ROOT, absolutePath);
134
+
135
+ // Normalize path separators for Windows
136
+ repoRelative = repoRelative.split(path.sep).join('/');
137
+
138
+ // If original path was a directory reference (ended with /), check for index.md or file.md
139
+ if (isDirectoryPath) {
140
+ const relativeDir = repoRelative.slice(6); // Remove '/docs/'
141
+
142
+ // Handle root path case (relativeDir is empty or just '.')
143
+ const normalizedDir = relativeDir === '' || relativeDir === '.' ? '' : relativeDir;
144
+ const indexPath = path.join(DOCS_ROOT, normalizedDir, 'index.md');
145
+ const filePath = normalizedDir ? path.join(DOCS_ROOT, normalizedDir + '.md') : null;
146
+
147
+ if (fs.existsSync(indexPath)) {
148
+ // Avoid double slash when repoRelative is '/docs/' (root case)
149
+ repoRelative = repoRelative.endsWith('/') ? repoRelative + 'index.md' : repoRelative + '/index.md';
150
+ } else if (filePath && fs.existsSync(filePath)) {
151
+ repoRelative = repoRelative + '.md';
152
+ } else {
153
+ // Neither exists - default to index.md and let validation catch it
154
+ repoRelative = repoRelative.endsWith('/') ? repoRelative + 'index.md' : repoRelative + '/index.md';
155
+ }
156
+ } else if (!repoRelative.endsWith('.md')) {
157
+ // Path doesn't end with .md - add .md
158
+ repoRelative = repoRelative + '.md';
159
+ }
160
+
161
+ return repoRelative + query + anchor;
162
+ }
163
+
164
+ /**
165
+ * Process a single markdown file, skipping links inside fenced code blocks
166
+ *
167
+ * @param {string} filePath - Absolute path to the file
168
+ * @returns {Object} - { changed: boolean, original: string, updated: string, changes: Array }
169
+ */
170
+ function processFile(filePath) {
171
+ const original = fs.readFileSync(filePath, 'utf-8');
172
+ const changes = [];
173
+
174
+ // Extract fenced code blocks and replace with placeholders
175
+ const codeBlocks = [];
176
+ const CODE_PLACEHOLDER = '\u0000CODE_BLOCK_';
177
+
178
+ let contentWithPlaceholders = original.replaceAll(/```[\s\S]*?```/g, (match) => {
179
+ const index = codeBlocks.length;
180
+ codeBlocks.push(match);
181
+ return `${CODE_PLACEHOLDER}${index}\u0000`;
182
+ });
183
+
184
+ // Process links only in non-code-block content
185
+ contentWithPlaceholders = contentWithPlaceholders.replaceAll(ALL_MARKDOWN_LINKS_REGEX, (match, linkText, href) => {
186
+ const newHref = convertToRepoRelative(href, filePath);
187
+
188
+ // Skip if conversion returned null (external link, anchor, etc.)
189
+ if (newHref === null) {
190
+ return match;
191
+ }
192
+
193
+ // Only record as change if actually different
194
+ if (newHref !== href) {
195
+ changes.push({ from: href, to: newHref });
196
+ return `[${linkText}](${newHref})`;
197
+ }
198
+
199
+ return match;
200
+ });
201
+
202
+ // Restore code blocks
203
+ const updated = contentWithPlaceholders.replaceAll(
204
+ new RegExp(`${CODE_PLACEHOLDER}(\\d+)\u0000`, 'g'),
205
+ (match, index) => codeBlocks[parseInt(index, 10)],
206
+ );
207
+
208
+ return {
209
+ changed: changes.length > 0,
210
+ original,
211
+ updated,
212
+ changes,
213
+ };
214
+ }
215
+
216
+ /**
217
+ * Validate that a repo-relative link points to an existing file
218
+ */
219
+ function validateLink(repoRelativePath) {
220
+ // Strip anchor/query
221
+ const checkPath = repoRelativePath.split('#')[0].split('?')[0];
222
+
223
+ // Remove /docs/ prefix to get path relative to DOCS_ROOT
224
+ const relativePath = checkPath.startsWith('/docs/') ? checkPath.slice(6) : checkPath.slice(1);
225
+
226
+ return fs.existsSync(path.join(DOCS_ROOT, relativePath));
227
+ }
228
+
229
+ // Main execution
230
+ console.log(`\nScanning docs in: ${DOCS_ROOT}`);
231
+ console.log(`Mode: ${DRY_RUN ? 'DRY RUN (use --write to apply changes)' : 'WRITE MODE'}\n`);
232
+
233
+ const files = getMarkdownFiles(DOCS_ROOT);
234
+ console.log(`Found ${files.length} markdown files (excluding _* paths)\n`);
235
+
236
+ let totalChanges = 0;
237
+ let filesChanged = 0;
238
+ const brokenLinks = [];
239
+
240
+ for (const filePath of files) {
241
+ const relativePath = path.relative(DOCS_ROOT, filePath);
242
+ const result = processFile(filePath);
243
+
244
+ if (result.changed) {
245
+ filesChanged++;
246
+ totalChanges += result.changes.length;
247
+
248
+ console.log(`\n${relativePath}`);
249
+ for (const change of result.changes) {
250
+ const isValid = validateLink(change.to);
251
+ const status = isValid ? ' ' : '! ';
252
+
253
+ console.log(`${status} ${change.from}`);
254
+ console.log(` -> ${change.to}`);
255
+
256
+ if (!isValid) {
257
+ brokenLinks.push({
258
+ file: relativePath,
259
+ link: change.to,
260
+ original: change.from,
261
+ });
262
+ }
263
+ }
264
+
265
+ if (!DRY_RUN) {
266
+ fs.writeFileSync(filePath, result.updated, 'utf-8');
267
+ }
268
+ }
269
+ }
270
+
271
+ console.log(`\n${'─'.repeat(60)}`);
272
+ console.log(`\nSummary:`);
273
+ console.log(` Files scanned: ${files.length}`);
274
+ console.log(` Files with changes: ${filesChanged}`);
275
+ console.log(` Total link updates: ${totalChanges}`);
276
+
277
+ if (brokenLinks.length > 0) {
278
+ console.log(`\n! Potential broken links (${brokenLinks.length}):`);
279
+ for (const bl of brokenLinks) {
280
+ console.log(` ${bl.file}: ${bl.link}`);
281
+ }
282
+ }
283
+
284
+ if (DRY_RUN && totalChanges > 0) {
285
+ console.log(`\nRun with --write to apply these changes`);
286
+ }
287
+
288
+ console.log('');