mdan-cli 2.5.0 → 2.5.2

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 (706) hide show
  1. package/.augment/code_review_guidelines.yaml +271 -0
  2. package/.claude/skills/bmad-os-audit-file-refs/SKILL.md +6 -0
  3. package/.claude/skills/bmad-os-audit-file-refs/prompts/instructions.md +59 -0
  4. package/.claude/skills/bmad-os-changelog-social/SKILL.md +177 -0
  5. package/.claude/skills/bmad-os-changelog-social/examples/discord-example.md +53 -0
  6. package/.claude/skills/bmad-os-changelog-social/examples/linkedin-example.md +49 -0
  7. package/.claude/skills/bmad-os-changelog-social/examples/twitter-example.md +55 -0
  8. package/.claude/skills/bmad-os-diataxis-style-fix/SKILL.md +6 -0
  9. package/.claude/skills/bmad-os-diataxis-style-fix/prompts/instructions.md +229 -0
  10. package/.claude/skills/bmad-os-draft-changelog/SKILL.md +6 -0
  11. package/.claude/skills/bmad-os-draft-changelog/prompts/instructions.md +82 -0
  12. package/.claude/skills/bmad-os-gh-triage/SKILL.md +6 -0
  13. package/.claude/skills/bmad-os-gh-triage/prompts/agent-prompt.md +60 -0
  14. package/.claude/skills/bmad-os-gh-triage/prompts/instructions.md +74 -0
  15. package/.claude/skills/bmad-os-release-module/SKILL.md +6 -0
  16. package/.claude/skills/bmad-os-release-module/prompts/instructions.md +53 -0
  17. package/.claude/skills/bmad-os-review-pr/SKILL.md +6 -0
  18. package/.claude/skills/bmad-os-review-pr/prompts/instructions.md +231 -0
  19. package/.claude/skills/bmad-os-root-cause-analysis/SKILL.md +12 -0
  20. package/.claude/skills/bmad-os-root-cause-analysis/prompts/instructions.md +74 -0
  21. package/.coderabbit.yaml +85 -0
  22. package/.github/CODE_OF_CONDUCT.md +128 -0
  23. package/.github/FUNDING.yaml +15 -0
  24. package/.github/ISSUE_TEMPLATE/bug-report.yaml +124 -0
  25. package/.github/ISSUE_TEMPLATE/config.yaml +8 -0
  26. package/.github/ISSUE_TEMPLATE/documentation.yaml +55 -0
  27. package/.github/ISSUE_TEMPLATE/feature-request.md +22 -0
  28. package/.github/ISSUE_TEMPLATE/issue.md +32 -0
  29. package/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  30. package/.github/scripts/discord-helpers.sh +34 -0
  31. package/.github/workflows/coderabbit-review.yaml +22 -0
  32. package/.github/workflows/discord.yaml +90 -0
  33. package/.github/workflows/docs.yaml +64 -0
  34. package/.github/workflows/quality.yaml +116 -0
  35. package/.husky/pre-commit +20 -0
  36. package/.markdownlint-cli2.yaml +41 -0
  37. package/.nvmrc +1 -0
  38. package/.prettierignore +12 -0
  39. package/.vscode/settings.json +96 -0
  40. package/AGENTS.md +227 -165
  41. package/AGENTS_LIST.md +946 -0
  42. package/ARCHITECTURE.md +590 -0
  43. package/CHANGELOG.md +1770 -0
  44. package/CNAME +1 -0
  45. package/CONTRIBUTING.md +512 -0
  46. package/CONTRIBUTORS.md +32 -0
  47. package/INSTALL.md +246 -0
  48. package/LICENSE +30 -0
  49. package/README.md +133 -194
  50. package/RELEASE_NOTES.md +246 -0
  51. package/SECURITY.md +85 -0
  52. package/TRADEMARK.md +55 -0
  53. package/USAGE.md +368 -0
  54. package/Wordmark.png +0 -0
  55. package/app/__init__.py +5 -0
  56. package/app/cis/agents/__init__.py +31 -0
  57. package/app/cis/agents/brainstorming-coach/__init__.py +3 -0
  58. package/app/cis/agents/brainstorming-coach/agent.py +162 -0
  59. package/app/cis/agents/brainstorming-coach/prompt.yaml +53 -0
  60. package/app/cis/agents/creative-problem-solver/__init__.py +3 -0
  61. package/app/cis/agents/creative-problem-solver/agent.py +233 -0
  62. package/app/cis/agents/creative-problem-solver/prompt.yaml +74 -0
  63. package/app/cis/agents/design-thinking-coach/__init__.py +3 -0
  64. package/app/cis/agents/design-thinking-coach/agent.py +241 -0
  65. package/app/cis/agents/design-thinking-coach/prompt.yaml +77 -0
  66. package/app/cis/agents/innovation-strategist/__init__.py +3 -0
  67. package/app/cis/agents/innovation-strategist/agent.py +271 -0
  68. package/app/cis/agents/innovation-strategist/prompt.yaml +70 -0
  69. package/app/cis/agents/presentation-master/__init__.py +3 -0
  70. package/app/cis/agents/presentation-master/agent.py +420 -0
  71. package/app/cis/agents/presentation-master/prompt.yaml +62 -0
  72. package/app/cis/agents/storyteller/__init__.py +3 -0
  73. package/app/cis/agents/storyteller/agent.py +303 -0
  74. package/app/cis/agents/storyteller/prompt.yaml +99 -0
  75. package/app/core/__init__.py +5 -0
  76. package/app/core/agents/__init__.py +5 -0
  77. package/app/core/agents/mdan-master/__init__.py +7 -0
  78. package/app/core/agents/mdan-master/agent.py +302 -0
  79. package/app/core/agents/mdan-master/prompt.yaml +105 -0
  80. package/app/mmb/agents/__init__.py +24 -0
  81. package/app/mmb/agents/agent-builder/__init__.py +5 -0
  82. package/app/mmb/agents/agent-builder/agent.py +261 -0
  83. package/app/mmb/agents/agent-builder/prompt.yaml +48 -0
  84. package/app/mmb/agents/module-builder/__init__.py +5 -0
  85. package/app/mmb/agents/module-builder/agent.py +299 -0
  86. package/app/mmb/agents/module-builder/prompt.yaml +50 -0
  87. package/app/mmb/agents/workflow-builder/__init__.py +5 -0
  88. package/app/mmb/agents/workflow-builder/agent.py +318 -0
  89. package/app/mmb/agents/workflow-builder/prompt.yaml +52 -0
  90. package/app/mmm/agents/__init__.py +48 -0
  91. package/app/mmm/agents/analyst/__init__.py +7 -0
  92. package/app/mmm/agents/analyst/agent.py +384 -0
  93. package/app/mmm/agents/analyst/prompt.yaml +62 -0
  94. package/app/mmm/agents/architect/__init__.py +7 -0
  95. package/app/mmm/agents/architect/agent.py +300 -0
  96. package/app/mmm/agents/architect/prompt.yaml +66 -0
  97. package/app/mmm/agents/dev/__init__.py +7 -0
  98. package/app/mmm/agents/dev/agent.py +285 -0
  99. package/app/mmm/agents/dev/prompt.yaml +62 -0
  100. package/app/mmm/agents/pm/__init__.py +7 -0
  101. package/app/mmm/agents/pm/agent.py +417 -0
  102. package/app/mmm/agents/pm/prompt.yaml +64 -0
  103. package/app/mmm/agents/qa/__init__.py +7 -0
  104. package/app/mmm/agents/qa/agent.py +267 -0
  105. package/app/mmm/agents/qa/prompt.yaml +67 -0
  106. package/app/mmm/agents/quick-flow-solo-dev/__init__.py +7 -0
  107. package/app/mmm/agents/quick-flow-solo-dev/agent.py +319 -0
  108. package/app/mmm/agents/quick-flow-solo-dev/prompt.yaml +60 -0
  109. package/app/mmm/agents/sm/__init__.py +7 -0
  110. package/app/mmm/agents/sm/agent.py +357 -0
  111. package/app/mmm/agents/sm/prompt.yaml +61 -0
  112. package/app/mmm/agents/tech-writer/__init__.py +7 -0
  113. package/app/mmm/agents/tech-writer/agent.py +420 -0
  114. package/app/mmm/agents/tech-writer/prompt.yaml +70 -0
  115. package/app/mmm/agents/ux-designer/__init__.py +14 -0
  116. package/app/mmm/agents/ux-designer/agent.py +412 -0
  117. package/app/mmm/agents/ux-designer/prompt.yaml +37 -0
  118. package/app/packs/__init__.py +32 -0
  119. package/app/packs/db-optimization/__init__.py +13 -0
  120. package/app/packs/db-optimization/agents/__init__.py +11 -0
  121. package/app/packs/db-optimization/agents/db-performance-analyst/__init__.py +5 -0
  122. package/app/packs/db-optimization/agents/db-performance-analyst/agent.py +559 -0
  123. package/app/packs/db-optimization/agents/db-performance-analyst/prompt.yaml +63 -0
  124. package/app/packs/db-optimization/agents/indexing-specialist/__init__.py +5 -0
  125. package/app/packs/db-optimization/agents/indexing-specialist/agent.py +713 -0
  126. package/app/packs/db-optimization/agents/indexing-specialist/prompt.yaml +92 -0
  127. package/app/packs/db-optimization/agents/query-optimizer/__init__.py +5 -0
  128. package/app/packs/db-optimization/agents/query-optimizer/agent.py +566 -0
  129. package/app/packs/db-optimization/agents/query-optimizer/prompt.yaml +74 -0
  130. package/app/packs/devops-azure/__init__.py +13 -0
  131. package/app/packs/devops-azure/agents/__init__.py +11 -0
  132. package/app/packs/devops-azure/agents/azure-specialist/__init__.py +5 -0
  133. package/app/packs/devops-azure/agents/azure-specialist/agent.py +584 -0
  134. package/app/packs/devops-azure/agents/azure-specialist/prompt.yaml +301 -0
  135. package/app/packs/devops-azure/agents/cicd-architect/__init__.py +5 -0
  136. package/app/packs/devops-azure/agents/cicd-architect/agent.py +665 -0
  137. package/app/packs/devops-azure/agents/cicd-architect/prompt.yaml +409 -0
  138. package/app/packs/devops-azure/agents/devops-engineer/__init__.py +5 -0
  139. package/app/packs/devops-azure/agents/devops-engineer/agent.py +545 -0
  140. package/app/packs/devops-azure/agents/devops-engineer/prompt.yaml +263 -0
  141. package/app/packs/fintech/__init__.py +13 -0
  142. package/app/packs/fintech/agents/__init__.py +11 -0
  143. package/app/packs/fintech/agents/compliance-officer/__init__.py +5 -0
  144. package/app/packs/fintech/agents/compliance-officer/agent.py +449 -0
  145. package/app/packs/fintech/agents/compliance-officer/prompt.yaml +135 -0
  146. package/app/packs/fintech/agents/financial-analyst/__init__.py +5 -0
  147. package/app/packs/fintech/agents/financial-analyst/agent.py +392 -0
  148. package/app/packs/fintech/agents/financial-analyst/prompt.yaml +143 -0
  149. package/app/packs/fintech/agents/risk-manager/__init__.py +5 -0
  150. package/app/packs/fintech/agents/risk-manager/agent.py +664 -0
  151. package/app/packs/fintech/agents/risk-manager/prompt.yaml +240 -0
  152. package/app/tea/agents/tea/__init__.py +9 -0
  153. package/app/tea/agents/tea/agent.py +689 -0
  154. package/app/tea/agents/tea/prompt.yaml +100 -0
  155. package/banner-bmad-method.png +0 -0
  156. package/docs/404.md +9 -0
  157. package/docs/_STYLE_GUIDE.md +370 -0
  158. package/docs/explanation/advanced-elicitation.md +49 -0
  159. package/docs/explanation/adversarial-review.md +59 -0
  160. package/docs/explanation/brainstorming.md +33 -0
  161. package/docs/explanation/established-projects-faq.md +50 -0
  162. package/docs/explanation/party-mode.md +59 -0
  163. package/docs/explanation/preventing-agent-conflicts.md +112 -0
  164. package/docs/explanation/project-context.md +157 -0
  165. package/docs/explanation/quick-flow.md +73 -0
  166. package/docs/explanation/why-solutioning-matters.md +77 -0
  167. package/docs/how-to/customize-bmad.md +172 -0
  168. package/docs/how-to/established-projects.md +117 -0
  169. package/docs/how-to/get-answers-about-bmad.md +134 -0
  170. package/docs/how-to/install-bmad.md +97 -0
  171. package/docs/how-to/non-interactive-installation.md +171 -0
  172. package/docs/how-to/project-context.md +136 -0
  173. package/docs/how-to/quick-fixes.md +123 -0
  174. package/docs/how-to/shard-large-documents.md +78 -0
  175. package/docs/how-to/upgrade-to-v6.md +97 -0
  176. package/docs/index.md +59 -0
  177. package/docs/reference/agents.md +28 -0
  178. package/docs/reference/commands.md +151 -0
  179. package/docs/reference/modules.md +76 -0
  180. package/docs/reference/testing.md +106 -0
  181. package/docs/reference/workflow-map.md +89 -0
  182. package/docs/roadmap.mdx +136 -0
  183. package/docs/tutorials/getting-started.md +286 -0
  184. package/eslint.config.mjs +141 -0
  185. package/package.json +106 -37
  186. package/prettier.config.mjs +32 -0
  187. package/prompts/cis/brainstorming-coach.yaml +53 -0
  188. package/prompts/cis/creative-problem-solver.yaml +74 -0
  189. package/prompts/cis/design-thinking-coach.yaml +77 -0
  190. package/prompts/cis/innovation-strategist.yaml +70 -0
  191. package/prompts/cis/presentation-master.yaml +62 -0
  192. package/prompts/cis/storyteller.yaml +99 -0
  193. package/prompts/core/mdan-master.yaml +105 -0
  194. package/prompts/mmb/agent-builder.yaml +48 -0
  195. package/prompts/mmb/module-builder.yaml +50 -0
  196. package/prompts/mmb/workflow-builder.yaml +52 -0
  197. package/prompts/mmm/analyst.yaml +62 -0
  198. package/prompts/mmm/architect.yaml +66 -0
  199. package/prompts/mmm/dev.yaml +62 -0
  200. package/prompts/mmm/pm.yaml +64 -0
  201. package/prompts/mmm/qa.yaml +67 -0
  202. package/prompts/mmm/quick-flow-solo-dev.yaml +60 -0
  203. package/prompts/mmm/sm.yaml +61 -0
  204. package/prompts/mmm/tech-writer.yaml +70 -0
  205. package/prompts/mmm/ux-designer.yaml +33 -0
  206. package/prompts/packs/db-optimization/db-performance-analyst.yaml +63 -0
  207. package/prompts/packs/db-optimization/indexing-specialist.yaml +92 -0
  208. package/prompts/packs/db-optimization/query-optimizer.yaml +74 -0
  209. package/prompts/packs/devops-azure/azure-specialist.yaml +301 -0
  210. package/prompts/packs/devops-azure/cicd-architect.yaml +409 -0
  211. package/prompts/packs/devops-azure/devops-engineer.yaml +263 -0
  212. package/prompts/packs/fintech/compliance-officer.yaml +135 -0
  213. package/prompts/packs/fintech/financial-analyst.yaml +143 -0
  214. package/prompts/packs/fintech/risk-manager.yaml +240 -0
  215. package/prompts/tea/tea.yaml +100 -0
  216. package/prompts.json +237 -0
  217. package/src/bmm/agents/analyst.agent.yaml +43 -0
  218. package/src/bmm/agents/architect.agent.yaml +29 -0
  219. package/src/bmm/agents/dev.agent.yaml +38 -0
  220. package/src/bmm/agents/pm.agent.yaml +44 -0
  221. package/src/bmm/agents/qa.agent.yaml +58 -0
  222. package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
  223. package/src/bmm/agents/sm.agent.yaml +37 -0
  224. package/src/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
  225. package/src/bmm/agents/tech-writer/tech-writer.agent.yaml +46 -0
  226. package/src/bmm/agents/ux-designer.agent.yaml +27 -0
  227. package/src/bmm/data/project-context-template.md +26 -0
  228. package/src/bmm/module-help.csv +31 -0
  229. package/src/bmm/module.yaml +50 -0
  230. package/src/bmm/teams/default-party.csv +20 -0
  231. package/src/bmm/teams/team-fullstack.yaml +12 -0
  232. package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
  233. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
  234. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
  235. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
  236. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
  237. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
  238. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
  239. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -0
  240. package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +57 -0
  241. package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
  242. package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
  243. package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
  244. package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
  245. package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
  246. package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +444 -0
  247. package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
  248. package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
  249. package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
  250. package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
  251. package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
  252. package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +476 -0
  253. package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
  254. package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
  255. package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
  256. package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
  257. package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
  258. package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +233 -0
  259. package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +487 -0
  260. package/src/bmm/workflows/1-analysis/research/workflow-domain-research.md +54 -0
  261. package/src/bmm/workflows/1-analysis/research/workflow-market-research.md +54 -0
  262. package/src/bmm/workflows/1-analysis/research/workflow-technical-research.md +54 -0
  263. package/src/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +15 -0
  264. package/src/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
  265. package/src/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
  266. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +191 -0
  267. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +152 -0
  268. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +224 -0
  269. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +154 -0
  270. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +170 -0
  271. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +226 -0
  272. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +213 -0
  273. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +207 -0
  274. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +226 -0
  275. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +237 -0
  276. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +228 -0
  277. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +231 -0
  278. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +242 -0
  279. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +217 -0
  280. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +124 -0
  281. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +247 -0
  282. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
  283. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +249 -0
  284. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +253 -0
  285. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +168 -0
  286. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +226 -0
  287. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -0
  288. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -0
  289. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -0
  290. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
  291. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -0
  292. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -0
  293. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
  294. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
  295. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -0
  296. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -0
  297. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
  298. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -0
  299. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +231 -0
  300. package/src/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -0
  301. package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md +63 -0
  302. package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md +65 -0
  303. package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +63 -0
  304. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
  305. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
  306. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
  307. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
  308. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
  309. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
  310. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
  311. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
  312. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
  313. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
  314. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
  315. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
  316. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
  317. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
  318. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -0
  319. package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
  320. package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +42 -0
  321. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +184 -0
  322. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +172 -0
  323. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +173 -0
  324. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +133 -0
  325. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +245 -0
  326. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +129 -0
  327. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
  328. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +54 -0
  329. package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
  330. package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +13 -0
  331. package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
  332. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
  333. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +173 -0
  334. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
  335. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +329 -0
  336. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
  337. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
  338. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
  339. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
  340. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -0
  341. package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +49 -0
  342. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
  343. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
  344. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
  345. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -0
  346. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
  347. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -0
  348. package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
  349. package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
  350. package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +43 -0
  351. package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
  352. package/src/bmm/workflows/4-implementation/correct-course/instructions.md +207 -0
  353. package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +53 -0
  354. package/src/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
  355. package/src/bmm/workflows/4-implementation/create-story/instructions.xml +346 -0
  356. package/src/bmm/workflows/4-implementation/create-story/template.md +49 -0
  357. package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +52 -0
  358. package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
  359. package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
  360. package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +20 -0
  361. package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1444 -0
  362. package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +52 -0
  363. package/src/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
  364. package/src/bmm/workflows/4-implementation/sprint-planning/instructions.md +226 -0
  365. package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
  366. package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +47 -0
  367. package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +230 -0
  368. package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +25 -0
  369. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +174 -0
  370. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +118 -0
  371. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +111 -0
  372. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +111 -0
  373. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +104 -0
  374. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +146 -0
  375. package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
  376. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +189 -0
  377. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +143 -0
  378. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +126 -0
  379. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +200 -0
  380. package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
  381. package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
  382. package/src/bmm/workflows/document-project/checklist.md +245 -0
  383. package/src/bmm/workflows/document-project/documentation-requirements.csv +12 -0
  384. package/src/bmm/workflows/document-project/instructions.md +130 -0
  385. package/src/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
  386. package/src/bmm/workflows/document-project/templates/index-template.md +169 -0
  387. package/src/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
  388. package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
  389. package/src/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
  390. package/src/bmm/workflows/document-project/workflow.yaml +22 -0
  391. package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
  392. package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
  393. package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
  394. package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
  395. package/src/bmm/workflows/generate-project-context/project-context-template.md +21 -0
  396. package/src/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -0
  397. package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -0
  398. package/src/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -0
  399. package/src/bmm/workflows/generate-project-context/workflow.md +49 -0
  400. package/src/bmm/workflows/qa-generate-e2e-tests/checklist.md +33 -0
  401. package/src/bmm/workflows/qa-generate-e2e-tests/instructions.md +110 -0
  402. package/src/bmm/workflows/qa-generate-e2e-tests/workflow.yaml +42 -0
  403. package/src/core/agents/bmad-master.agent.yaml +30 -0
  404. package/src/core/module-help.csv +9 -0
  405. package/src/core/module.yaml +25 -0
  406. package/src/core/tasks/editorial-review-prose.xml +102 -0
  407. package/src/core/tasks/editorial-review-structure.xml +208 -0
  408. package/src/core/tasks/help.md +86 -0
  409. package/src/core/tasks/index-docs.xml +65 -0
  410. package/src/core/tasks/review-adversarial-general.xml +49 -0
  411. package/src/core/tasks/shard-doc.xml +108 -0
  412. package/src/core/tasks/workflow.xml +235 -0
  413. package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
  414. package/src/core/workflows/advanced-elicitation/workflow.xml +118 -0
  415. package/src/core/workflows/brainstorming/brain-methods.csv +62 -0
  416. package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
  417. package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
  418. package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
  419. package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
  420. package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
  421. package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
  422. package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
  423. package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
  424. package/src/core/workflows/brainstorming/template.md +15 -0
  425. package/src/core/workflows/brainstorming/workflow.md +58 -0
  426. package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
  427. package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
  428. package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +168 -0
  429. package/src/core/workflows/party-mode/workflow.md +194 -0
  430. package/src/utility/agent-components/activation-rules.txt +6 -0
  431. package/src/utility/agent-components/activation-steps.txt +14 -0
  432. package/src/utility/agent-components/agent-command-header.md +1 -0
  433. package/src/utility/agent-components/agent.customize.template.yaml +41 -0
  434. package/src/utility/agent-components/handler-action.txt +4 -0
  435. package/src/utility/agent-components/handler-data.txt +5 -0
  436. package/src/utility/agent-components/handler-exec.txt +6 -0
  437. package/src/utility/agent-components/handler-multi.txt +14 -0
  438. package/src/utility/agent-components/handler-tmpl.txt +5 -0
  439. package/src/utility/agent-components/handler-validate-workflow.txt +7 -0
  440. package/src/utility/agent-components/handler-workflow.txt +10 -0
  441. package/src/utility/agent-components/menu-handlers.txt +6 -0
  442. package/test/README.md +295 -0
  443. package/test/adversarial-review-tests/README.md +56 -0
  444. package/test/adversarial-review-tests/sample-content.md +46 -0
  445. package/test/adversarial-review-tests/test-cases.yaml +103 -0
  446. package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +27 -0
  447. package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +30 -0
  448. package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +22 -0
  449. package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +20 -0
  450. package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +25 -0
  451. package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +24 -0
  452. package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +25 -0
  453. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -0
  454. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -0
  455. package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +31 -0
  456. package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +25 -0
  457. package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +25 -0
  458. package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +25 -0
  459. package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +25 -0
  460. package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
  461. package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
  462. package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +27 -0
  463. package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
  464. package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +24 -0
  465. package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +27 -0
  466. package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +27 -0
  467. package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +24 -0
  468. package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +29 -0
  469. package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +31 -0
  470. package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +28 -0
  471. package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +28 -0
  472. package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
  473. package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +28 -0
  474. package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
  475. package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
  476. package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
  477. package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +24 -0
  478. package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +22 -0
  479. package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +27 -0
  480. package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +31 -0
  481. package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +22 -0
  482. package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +38 -0
  483. package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +24 -0
  484. package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -0
  485. package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +34 -0
  486. package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -0
  487. package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +24 -0
  488. package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +24 -0
  489. package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +24 -0
  490. package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -0
  491. package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -0
  492. package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +24 -0
  493. package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +24 -0
  494. package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +22 -0
  495. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +28 -0
  496. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +30 -0
  497. package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +24 -0
  498. package/test/fixtures/file-refs-csv/invalid/all-empty-workflow.csv +3 -0
  499. package/test/fixtures/file-refs-csv/invalid/empty-data.csv +1 -0
  500. package/test/fixtures/file-refs-csv/invalid/no-workflow-column.csv +3 -0
  501. package/test/fixtures/file-refs-csv/invalid/unresolvable-vars.csv +3 -0
  502. package/test/fixtures/file-refs-csv/valid/bmm-style.csv +3 -0
  503. package/test/fixtures/file-refs-csv/valid/core-style.csv +3 -0
  504. package/test/fixtures/file-refs-csv/valid/minimal.csv +2 -0
  505. package/test/test-agent-schema.js +387 -0
  506. package/test/test-cli-integration.sh +159 -0
  507. package/test/test-file-refs-csv.js +133 -0
  508. package/test/test-installation-components.js +212 -0
  509. package/test/test-rehype-plugins.mjs +1050 -0
  510. package/test/unit-test-schema.js +133 -0
  511. package/tests/run_all_tests.py +80 -0
  512. package/tests/scenarios/cis/brainstorming-coach.test.py +150 -0
  513. package/tests/scenarios/cis/creative-problem-solver.test.py +167 -0
  514. package/tests/scenarios/cis/design-thinking-coach.test.py +177 -0
  515. package/tests/scenarios/cis/innovation-strategist.test.py +191 -0
  516. package/tests/scenarios/cis/presentation-master.test.py +240 -0
  517. package/tests/scenarios/cis/storyteller.test.py +324 -0
  518. package/tests/scenarios/core/mdan-master.test.py +281 -0
  519. package/tests/scenarios/mmb/agent-builder.test.py +124 -0
  520. package/tests/scenarios/mmb/module-builder.test.py +124 -0
  521. package/tests/scenarios/mmb/workflow-builder.test.py +124 -0
  522. package/tests/scenarios/mmm/analyst.test.py +138 -0
  523. package/tests/scenarios/mmm/architect.test.py +138 -0
  524. package/tests/scenarios/mmm/dev.test.py +138 -0
  525. package/tests/scenarios/mmm/pm.test.py +138 -0
  526. package/tests/scenarios/mmm/qa.test.py +138 -0
  527. package/tests/scenarios/mmm/quick-flow-solo-dev.test.py +138 -0
  528. package/tests/scenarios/mmm/sm.test.py +138 -0
  529. package/tests/scenarios/mmm/tech-writer.test.py +138 -0
  530. package/tests/scenarios/mmm/ux-designer.test.py +294 -0
  531. package/tests/scenarios/packs/db-optimization/db-performance-analyst.test.py +108 -0
  532. package/tests/scenarios/packs/db-optimization/indexing-specialist.test.py +108 -0
  533. package/tests/scenarios/packs/db-optimization/query-optimizer.test.py +106 -0
  534. package/tests/scenarios/packs/devops-azure/azure-specialist.test.py +125 -0
  535. package/tests/scenarios/packs/devops-azure/cicd-architect.test.py +122 -0
  536. package/tests/scenarios/packs/devops-azure/devops-engineer.test.py +128 -0
  537. package/tests/scenarios/packs/fintech/compliance-officer.test.py +165 -0
  538. package/tests/scenarios/packs/fintech/financial-analyst.test.py +184 -0
  539. package/tests/scenarios/packs/fintech/risk-manager.test.py +171 -0
  540. package/tests/scenarios/tea/tea.test.py +346 -0
  541. package/tests/simple_cis_test.py +285 -0
  542. package/tests/simple_db_optimization_test.py +199 -0
  543. package/tests/simple_devops_test.py +193 -0
  544. package/tests/simple_fintech_test.py +205 -0
  545. package/tests/simple_mmb_test.py +103 -0
  546. package/tests/simple_mmm_test.py +159 -0
  547. package/tests/simple_tea_test.py +80 -0
  548. package/tests/simple_test.py +111 -0
  549. package/tests/simple_ux_designer_test.py +144 -0
  550. package/tests/validate_yaml.py +86 -0
  551. package/tools/bmad-npx-wrapper.js +38 -0
  552. package/tools/build-docs.mjs +463 -0
  553. package/tools/cli/README.md +60 -0
  554. package/tools/cli/bmad-cli.js +106 -0
  555. package/tools/cli/commands/install.js +87 -0
  556. package/tools/cli/commands/status.js +65 -0
  557. package/tools/cli/commands/uninstall.js +167 -0
  558. package/tools/cli/external-official-modules.yaml +53 -0
  559. package/tools/cli/installers/install-messages.yaml +39 -0
  560. package/tools/cli/installers/lib/core/config-collector.js +1285 -0
  561. package/tools/cli/installers/lib/core/custom-module-cache.js +260 -0
  562. package/tools/cli/installers/lib/core/dependency-resolver.js +743 -0
  563. package/tools/cli/installers/lib/core/detector.js +223 -0
  564. package/tools/cli/installers/lib/core/ide-config-manager.js +157 -0
  565. package/tools/cli/installers/lib/core/installer.js +3162 -0
  566. package/tools/cli/installers/lib/core/manifest-generator.js +1081 -0
  567. package/tools/cli/installers/lib/core/manifest.js +1038 -0
  568. package/tools/cli/installers/lib/custom/handler.js +358 -0
  569. package/tools/cli/installers/lib/ide/_base-ide.js +665 -0
  570. package/tools/cli/installers/lib/ide/_config-driven.js +634 -0
  571. package/tools/cli/installers/lib/ide/codex.js +440 -0
  572. package/tools/cli/installers/lib/ide/github-copilot.js +699 -0
  573. package/tools/cli/installers/lib/ide/kilo.js +269 -0
  574. package/tools/cli/installers/lib/ide/manager.js +342 -0
  575. package/tools/cli/installers/lib/ide/platform-codes.js +100 -0
  576. package/tools/cli/installers/lib/ide/platform-codes.yaml +243 -0
  577. package/tools/cli/installers/lib/ide/rovodev.js +257 -0
  578. package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +180 -0
  579. package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +174 -0
  580. package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
  581. package/tools/cli/installers/lib/ide/shared/path-utils.js +299 -0
  582. package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +366 -0
  583. package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +318 -0
  584. package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
  585. package/tools/cli/installers/lib/ide/templates/combined/antigravity.md +8 -0
  586. package/tools/cli/installers/lib/ide/templates/combined/default-agent.md +15 -0
  587. package/tools/cli/installers/lib/ide/templates/combined/default-task.md +10 -0
  588. package/tools/cli/installers/lib/ide/templates/combined/default-tool.md +10 -0
  589. package/tools/cli/installers/lib/ide/templates/combined/default-workflow-yaml.md +14 -0
  590. package/tools/cli/installers/lib/ide/templates/combined/default-workflow.md +6 -0
  591. package/tools/cli/installers/lib/ide/templates/combined/gemini-agent.toml +14 -0
  592. package/tools/cli/installers/lib/ide/templates/combined/gemini-task.toml +11 -0
  593. package/tools/cli/installers/lib/ide/templates/combined/gemini-tool.toml +11 -0
  594. package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow-yaml.toml +16 -0
  595. package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow.toml +14 -0
  596. package/tools/cli/installers/lib/ide/templates/combined/kiro-agent.md +16 -0
  597. package/tools/cli/installers/lib/ide/templates/combined/kiro-task.md +9 -0
  598. package/tools/cli/installers/lib/ide/templates/combined/kiro-tool.md +9 -0
  599. package/tools/cli/installers/lib/ide/templates/combined/kiro-workflow-yaml.md +15 -0
  600. package/tools/cli/installers/lib/ide/templates/combined/kiro-workflow.md +7 -0
  601. package/tools/cli/installers/lib/ide/templates/combined/opencode-agent.md +15 -0
  602. package/tools/cli/installers/lib/ide/templates/combined/opencode-task.md +13 -0
  603. package/tools/cli/installers/lib/ide/templates/combined/opencode-tool.md +13 -0
  604. package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow-yaml.md +16 -0
  605. package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow.md +16 -0
  606. package/tools/cli/installers/lib/ide/templates/combined/rovodev.md +9 -0
  607. package/tools/cli/installers/lib/ide/templates/combined/trae.md +9 -0
  608. package/tools/cli/installers/lib/ide/templates/combined/windsurf-workflow.md +10 -0
  609. package/tools/cli/installers/lib/ide/templates/split/.gitkeep +0 -0
  610. package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +13 -0
  611. package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
  612. package/tools/cli/installers/lib/message-loader.js +83 -0
  613. package/tools/cli/installers/lib/modules/external-manager.js +136 -0
  614. package/tools/cli/installers/lib/modules/manager.js +1498 -0
  615. package/tools/cli/lib/activation-builder.js +165 -0
  616. package/tools/cli/lib/agent/compiler.js +525 -0
  617. package/tools/cli/lib/agent/installer.js +680 -0
  618. package/tools/cli/lib/agent/template-engine.js +152 -0
  619. package/tools/cli/lib/agent-analyzer.js +109 -0
  620. package/tools/cli/lib/agent-party-generator.js +194 -0
  621. package/tools/cli/lib/cli-utils.js +182 -0
  622. package/tools/cli/lib/config.js +213 -0
  623. package/tools/cli/lib/file-ops.js +204 -0
  624. package/tools/cli/lib/platform-codes.js +116 -0
  625. package/tools/cli/lib/project-root.js +77 -0
  626. package/tools/cli/lib/prompts.js +809 -0
  627. package/tools/cli/lib/ui.js +1936 -0
  628. package/tools/cli/lib/xml-handler.js +177 -0
  629. package/tools/cli/lib/xml-to-markdown.js +82 -0
  630. package/tools/cli/lib/yaml-format.js +245 -0
  631. package/tools/cli/lib/yaml-xml-builder.js +587 -0
  632. package/tools/docs/_prompt-external-modules-page.md +59 -0
  633. package/tools/docs/fix-refs.md +91 -0
  634. package/tools/fix-doc-links.js +285 -0
  635. package/tools/format-workflow-md.js +263 -0
  636. package/tools/lib/xml-utils.js +13 -0
  637. package/tools/migrate-custom-module-paths.js +124 -0
  638. package/tools/platform-codes.yaml +157 -0
  639. package/tools/schema/agent.js +491 -0
  640. package/tools/validate-agent-schema.js +110 -0
  641. package/tools/validate-doc-links.js +407 -0
  642. package/tools/validate-file-refs.js +554 -0
  643. package/tools/validate-svg-changes.sh +356 -0
  644. package/website/README.md +75 -0
  645. package/website/astro.config.mjs +136 -0
  646. package/website/public/favicon.ico +0 -0
  647. package/website/public/img/bmad-dark.png +0 -0
  648. package/website/public/img/bmad-light.png +0 -0
  649. package/website/public/workflow-map-diagram.html +361 -0
  650. package/website/src/components/Banner.astro +62 -0
  651. package/website/src/components/Header.astro +96 -0
  652. package/website/src/components/MobileMenuFooter.astro +33 -0
  653. package/website/src/content/config.ts +6 -0
  654. package/website/src/lib/site-url.mjs +25 -0
  655. package/website/src/pages/404.astro +11 -0
  656. package/website/src/pages/robots.txt.ts +48 -0
  657. package/website/src/rehype-base-paths.js +112 -0
  658. package/website/src/rehype-markdown-links.js +119 -0
  659. package/website/src/styles/custom.css +805 -0
  660. package/.mcp.json +0 -46
  661. package/agents/AGENTS-REGISTRY.md +0 -215
  662. package/agents/architect.md +0 -160
  663. package/agents/dev.md +0 -166
  664. package/agents/devops.md +0 -230
  665. package/agents/doc.md +0 -189
  666. package/agents/learn.md +0 -377
  667. package/agents/product.md +0 -124
  668. package/agents/security.md +0 -168
  669. package/agents/test.md +0 -209
  670. package/agents/ux.md +0 -207
  671. package/cli/mdan.js +0 -628
  672. package/cli/mdan.py +0 -316
  673. package/cli/mdan.sh +0 -724
  674. package/cli/postinstall.js +0 -4
  675. package/core/orchestrator.md +0 -238
  676. package/core/universal-envelope.md +0 -160
  677. package/install.sh +0 -91
  678. package/integrations/all-integrations.md +0 -300
  679. package/integrations/claude.md +0 -46
  680. package/integrations/cursor.md +0 -74
  681. package/integrations/mcp.md +0 -153
  682. package/integrations/windsurf.md +0 -48
  683. package/memory/MDAN-STATE.template.json +0 -44
  684. package/memory/MEMORY-SYSTEM.md +0 -197
  685. package/phases/01-discover.md +0 -136
  686. package/phases/02-design.md +0 -147
  687. package/phases/03-build.md +0 -113
  688. package/phases/04-verify.md +0 -107
  689. package/phases/05-ship.md +0 -156
  690. package/skills/find-skills/skill.md +0 -133
  691. package/templates/ARCHITECTURE.md +0 -186
  692. package/templates/CHANGELOG.md +0 -41
  693. package/templates/MDAN-KNOWLEDGE.md +0 -73
  694. package/templates/PRD.md +0 -120
  695. package/templates/SECURITY-REVIEW.md +0 -99
  696. package/templates/TEST-PLAN.md +0 -97
  697. package/templates/prompts/README.md +0 -108
  698. package/templates/prompts/dev-agent.yaml +0 -85
  699. package/templates/prompts/orchestrator.yaml +0 -97
  700. package/templates/prompts.json +0 -81
  701. package/templates/tests/evaluations/README.md +0 -80
  702. package/templates/tests/evaluations/classification_eval.md +0 -136
  703. package/templates/tests/evaluations/rag_eval.md +0 -116
  704. package/templates/tests/scenarios/README.md +0 -62
  705. package/templates/tests/scenarios/basic_authentication.test.md +0 -82
  706. package/templates/tests/scenarios/user_registration.test.md +0 -107
@@ -0,0 +1,91 @@
1
+ ---
2
+ title: Fix Documentation References
3
+ description: Corrects workflow, agent, and command references in BMad documentation
4
+ ---
5
+
6
+ # Fix Documentation References
7
+
8
+ ## Scope
9
+
10
+ Fix reference patterns ONLY. Do not modify links, formatting, structure, or other content.
11
+
12
+ ## Purpose
13
+
14
+ Fix incorrect references to workflows, agents, and commands in BMad documentation files.
15
+
16
+ ## Step 1: Establish Target Audience
17
+
18
+ Before fixing references, determine who the document is for:
19
+
20
+ | Audience | Indicators | Style |
21
+ |----------|------------|-------|
22
+ | **Newbies** | tutorials/, getting-started, installation/, "What You'll Learn" | Keep "workflow", include platform hints |
23
+ | **Experienced** | reference/, explanation/ | Drop "workflow", no platform hints |
24
+ | **How-To** | how-to/ | **Ask** — depends on the task |
25
+
26
+ **How-To guides require judgment**: Don't assume experienced. Ask: "Does this task require prior BMad knowledge?" Early-journey tasks (first PRD, first sprint) are newbie docs. Customization and advanced features are experienced.
27
+
28
+ **If unclear**: Ask the user "Who is the target audience for this document — new users learning BMad, or experienced users who know the system?"
29
+
30
+ This determines whether helper words like "workflow" and platform hints are helpful context or just noise.
31
+
32
+ ## Reference Patterns to Fix
33
+
34
+ ### Always Wrong
35
+
36
+ | Pattern | Example | Problem |
37
+ |---------|---------|---------|
38
+ | `*workflow` | `*prd` | Obsolete menu shortcut notation |
39
+ | `/workflow` | `/workflow-init` | Platform-specific slash command |
40
+ | `bmad_bmm_*` | `bmad_bmm_workflow-init` | Internal slash command name, platform-specific |
41
+
42
+ ### Correct Format
43
+
44
+ Use backticks with plain workflow name:
45
+ - **Wrong**: Run `/workflow-init`
46
+ - **Wrong**: Run `*prd`
47
+
48
+ **When to say "workflow"**:
49
+ - **Newbie docs** (getting-started): "Run the `prd` workflow" — helps them learn what it is
50
+ - **Other docs**: "Run `prd`" — they already know, so "workflow" is noise
51
+
52
+ **Platform hint**: Only in newbie docs, and only on the **first** workflow mention:
53
+ - First mention: Run the `help` workflow (`/bmad-help` on most platforms)
54
+ - Subsequent mentions: Run `prd` — no hint, no "workflow" needed after they've seen the pattern
55
+
56
+ In experienced docs, the hint is always noise — just use the workflow name.
57
+
58
+ ### Workflow Name Changes
59
+
60
+ | Old Name | New Name | Notes |
61
+ |----------|----------|-------|
62
+ | `workflow-init` | `bmad-help` | DEPRECATED - help system replaces initialization |
63
+ | `workflow-status` | `bmad-help` | DEPRECATED - help system replaces status checking |
64
+
65
+ ### The Help System
66
+
67
+ The `bmad-help` workflow is the modern replacement for both `workflow-init` and `workflow-status`:
68
+ - **Universal**: Works regardless of workflow state or module
69
+ - **Contextual**: Infers completion from artifacts and conversation
70
+ - **Adaptive**: Guides users through workflows based on phase ordering
71
+ - **Anytime**: Can be run at any point, no pre-initialization needed
72
+
73
+ Users can run `bmad-help` to get guidance on what to do next. It detects:
74
+ - What workflows have been completed (by checking for output artifacts)
75
+ - What module is active
76
+ - What the next recommended/required step is
77
+
78
+ ## Lessons Learned
79
+
80
+ 1. **Platform-agnostic**: Docs should never include platform-specific invocation patterns (slashes, prefixes)
81
+ 2. **Backtick the name**: Use backticks around workflow names: `workflow-name`
82
+ 3. **Simple names**: Just the workflow name, no `bmad_bmm_` prefix, no `/` prefix
83
+
84
+ ## Self-Check
85
+
86
+ Before finishing, verify you ONLY changed reference patterns:
87
+
88
+ - [ ] Did I change any hyperlinks? **If yes, revert.**
89
+ - [ ] Did I change any formatting (horizontal rules, whitespace, structure)? **If yes, revert.**
90
+ - [ ] Did I remove or add any sections? **If yes, revert.**
91
+ - [ ] Did I modify anything not matching the patterns in "Reference Patterns to Fix"? **If yes, revert.**
@@ -0,0 +1,285 @@
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
+ // Match all markdown links; filtering (external, anchors, assets) happens in convertToRepoRelative.
24
+ // This intentionally matches broadly so the handler can make context-aware decisions.
25
+ const ALL_MARKDOWN_LINKS_REGEX = /\[([^\]]*)\]\(([^)]+)\)/g;
26
+
27
+ /**
28
+ * Get all markdown files in docs directory, excluding _* directories/files
29
+ */
30
+ function getMarkdownFiles(dir) {
31
+ const files = [];
32
+
33
+ function walk(currentDir) {
34
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
35
+
36
+ for (const entry of entries) {
37
+ const fullPath = path.join(currentDir, entry.name);
38
+
39
+ // Skip underscore-prefixed entries
40
+ if (entry.name.startsWith('_')) {
41
+ continue;
42
+ }
43
+
44
+ if (entry.isDirectory()) {
45
+ walk(fullPath);
46
+ } else if (entry.isFile() && entry.name.endsWith('.md')) {
47
+ files.push(fullPath);
48
+ }
49
+ }
50
+ }
51
+
52
+ walk(dir);
53
+ return files;
54
+ }
55
+
56
+ /**
57
+ * Convert a markdown link href to repo-relative path with .md extension
58
+ *
59
+ * @param {string} href - The original href (e.g., "./file.md", "/path/to/page/", "/path/to/page/#anchor")
60
+ * @param {string} currentFilePath - Absolute path to the file containing this link
61
+ * @returns {string|null} - Repo-relative path (e.g., "/docs/path/to/file.md"), or null if shouldn't be converted
62
+ */
63
+ function convertToRepoRelative(href, currentFilePath) {
64
+ // Skip external links (including protocol-relative URLs like //cdn.example.com)
65
+ if (href.includes('://') || href.startsWith('//') || href.startsWith('mailto:') || href.startsWith('tel:')) {
66
+ return null;
67
+ }
68
+
69
+ // Skip anchor-only links
70
+ if (href.startsWith('#')) {
71
+ return null;
72
+ }
73
+
74
+ // Extract anchor and query string if present
75
+ let anchor = '';
76
+ let query = '';
77
+ let pathPortion = href;
78
+
79
+ const hashIndex = href.indexOf('#');
80
+ const queryIndex = href.indexOf('?');
81
+
82
+ if (hashIndex !== -1 || queryIndex !== -1) {
83
+ const firstDelimiter = Math.min(hashIndex === -1 ? Infinity : hashIndex, queryIndex === -1 ? Infinity : queryIndex);
84
+ pathPortion = href.slice(0, Math.max(0, firstDelimiter));
85
+
86
+ const suffix = href.slice(Math.max(0, firstDelimiter));
87
+ const anchorInSuffix = suffix.indexOf('#');
88
+
89
+ if (suffix.startsWith('?')) {
90
+ if (anchorInSuffix === -1) {
91
+ query = suffix;
92
+ } else {
93
+ query = suffix.slice(0, Math.max(0, anchorInSuffix));
94
+ anchor = suffix.slice(Math.max(0, anchorInSuffix));
95
+ }
96
+ } else {
97
+ anchor = suffix;
98
+ }
99
+ }
100
+
101
+ // Skip non-documentation links (images, external assets, etc.)
102
+ const ext = path.extname(pathPortion).toLowerCase();
103
+ if (
104
+ ext &&
105
+ ext !== '.md' &&
106
+ !['.md'].includes(ext) && // Has an extension that's not .md - skip unless it's a trailing slash path
107
+ !pathPortion.endsWith('/')
108
+ ) {
109
+ return null;
110
+ }
111
+
112
+ // Check if original path ends with / (directory reference) BEFORE path.join normalizes it
113
+ const isDirectoryPath = pathPortion.endsWith('/');
114
+
115
+ let absolutePath;
116
+
117
+ if (pathPortion.startsWith('/docs/')) {
118
+ // Already repo-relative with /docs/ prefix
119
+ absolutePath = path.join(path.dirname(DOCS_ROOT), pathPortion);
120
+ } else if (pathPortion.startsWith('/')) {
121
+ // Site-relative (e.g., /tutorials/getting-started/) - resolve from docs root
122
+ absolutePath = path.join(DOCS_ROOT, pathPortion);
123
+ } else {
124
+ // Relative path (./, ../, or bare filename) - resolve from current file's directory
125
+ const currentDir = path.dirname(currentFilePath);
126
+ absolutePath = path.resolve(currentDir, pathPortion);
127
+ }
128
+
129
+ // Convert to repo-relative path (with /docs/ prefix)
130
+ let repoRelative = '/docs/' + path.relative(DOCS_ROOT, absolutePath);
131
+
132
+ // Normalize path separators for Windows
133
+ repoRelative = repoRelative.split(path.sep).join('/');
134
+
135
+ // If original path was a directory reference (ended with /), check for index.md or file.md
136
+ if (isDirectoryPath) {
137
+ const relativeDir = repoRelative.slice(6); // Remove '/docs/'
138
+
139
+ // Handle root path case (relativeDir is empty or just '.')
140
+ const normalizedDir = relativeDir === '' || relativeDir === '.' ? '' : relativeDir;
141
+ const indexPath = path.join(DOCS_ROOT, normalizedDir, 'index.md');
142
+ const filePath = normalizedDir ? path.join(DOCS_ROOT, normalizedDir + '.md') : null;
143
+
144
+ if (fs.existsSync(indexPath)) {
145
+ // Avoid double slash when repoRelative is '/docs/' (root case)
146
+ repoRelative = repoRelative.endsWith('/') ? repoRelative + 'index.md' : repoRelative + '/index.md';
147
+ } else if (filePath && fs.existsSync(filePath)) {
148
+ repoRelative = repoRelative + '.md';
149
+ } else {
150
+ // Neither exists - default to index.md and let validation catch it
151
+ repoRelative = repoRelative.endsWith('/') ? repoRelative + 'index.md' : repoRelative + '/index.md';
152
+ }
153
+ } else if (!repoRelative.endsWith('.md')) {
154
+ // Path doesn't end with .md - add .md
155
+ repoRelative = repoRelative + '.md';
156
+ }
157
+
158
+ return repoRelative + query + anchor;
159
+ }
160
+
161
+ /**
162
+ * Process a single markdown file, skipping links inside fenced code blocks
163
+ *
164
+ * @param {string} filePath - Absolute path to the file
165
+ * @returns {Object} - { changed: boolean, original: string, updated: string, changes: Array }
166
+ */
167
+ function processFile(filePath) {
168
+ const original = fs.readFileSync(filePath, 'utf-8');
169
+ const changes = [];
170
+
171
+ // Extract fenced code blocks and replace with placeholders
172
+ const codeBlocks = [];
173
+ const CODE_PLACEHOLDER = '\u0000CODE_BLOCK_';
174
+
175
+ let contentWithPlaceholders = original.replaceAll(/```[\s\S]*?```/g, (match) => {
176
+ const index = codeBlocks.length;
177
+ codeBlocks.push(match);
178
+ return `${CODE_PLACEHOLDER}${index}\u0000`;
179
+ });
180
+
181
+ // Process links only in non-code-block content
182
+ contentWithPlaceholders = contentWithPlaceholders.replaceAll(ALL_MARKDOWN_LINKS_REGEX, (match, linkText, href) => {
183
+ const newHref = convertToRepoRelative(href, filePath);
184
+
185
+ // Skip if conversion returned null (external link, anchor, etc.)
186
+ if (newHref === null) {
187
+ return match;
188
+ }
189
+
190
+ // Only record as change if actually different
191
+ if (newHref !== href) {
192
+ changes.push({ from: href, to: newHref });
193
+ return `[${linkText}](${newHref})`;
194
+ }
195
+
196
+ return match;
197
+ });
198
+
199
+ // Restore code blocks
200
+ const updated = contentWithPlaceholders.replaceAll(
201
+ new RegExp(`${CODE_PLACEHOLDER}(\\d+)\u0000`, 'g'),
202
+ (match, index) => codeBlocks[parseInt(index, 10)],
203
+ );
204
+
205
+ return {
206
+ changed: changes.length > 0,
207
+ original,
208
+ updated,
209
+ changes,
210
+ };
211
+ }
212
+
213
+ /**
214
+ * Validate that a repo-relative link points to an existing file
215
+ */
216
+ function validateLink(repoRelativePath) {
217
+ // Strip anchor/query
218
+ const checkPath = repoRelativePath.split('#')[0].split('?')[0];
219
+
220
+ // Remove /docs/ prefix to get path relative to DOCS_ROOT
221
+ const relativePath = checkPath.startsWith('/docs/') ? checkPath.slice(6) : checkPath.slice(1);
222
+
223
+ return fs.existsSync(path.join(DOCS_ROOT, relativePath));
224
+ }
225
+
226
+ // Main execution
227
+ console.log(`\nScanning docs in: ${DOCS_ROOT}`);
228
+ console.log(`Mode: ${DRY_RUN ? 'DRY RUN (use --write to apply changes)' : 'WRITE MODE'}\n`);
229
+
230
+ const files = getMarkdownFiles(DOCS_ROOT);
231
+ console.log(`Found ${files.length} markdown files (excluding _* paths)\n`);
232
+
233
+ let totalChanges = 0;
234
+ let filesChanged = 0;
235
+ const brokenLinks = [];
236
+
237
+ for (const filePath of files) {
238
+ const relativePath = path.relative(DOCS_ROOT, filePath);
239
+ const result = processFile(filePath);
240
+
241
+ if (result.changed) {
242
+ filesChanged++;
243
+ totalChanges += result.changes.length;
244
+
245
+ console.log(`\n${relativePath}`);
246
+ for (const change of result.changes) {
247
+ const isValid = validateLink(change.to);
248
+ const status = isValid ? ' ' : '! ';
249
+
250
+ console.log(`${status} ${change.from}`);
251
+ console.log(` -> ${change.to}`);
252
+
253
+ if (!isValid) {
254
+ brokenLinks.push({
255
+ file: relativePath,
256
+ link: change.to,
257
+ original: change.from,
258
+ });
259
+ }
260
+ }
261
+
262
+ if (!DRY_RUN) {
263
+ fs.writeFileSync(filePath, result.updated, 'utf-8');
264
+ }
265
+ }
266
+ }
267
+
268
+ console.log(`\n${'─'.repeat(60)}`);
269
+ console.log(`\nSummary:`);
270
+ console.log(` Files scanned: ${files.length}`);
271
+ console.log(` Files with changes: ${filesChanged}`);
272
+ console.log(` Total link updates: ${totalChanges}`);
273
+
274
+ if (brokenLinks.length > 0) {
275
+ console.log(`\n! Potential broken links (${brokenLinks.length}):`);
276
+ for (const bl of brokenLinks) {
277
+ console.log(` ${bl.file}: ${bl.link}`);
278
+ }
279
+ }
280
+
281
+ if (DRY_RUN && totalChanges > 0) {
282
+ console.log(`\nRun with --write to apply these changes`);
283
+ }
284
+
285
+ console.log('');
@@ -0,0 +1,263 @@
1
+ /**
2
+ * BMAD Workflow Markdown Formatter
3
+ *
4
+ * Formats mixed markdown + XML workflow instruction files with:
5
+ * - 2-space XML indentation
6
+ * - Preserved markdown content
7
+ * - Proper tag nesting
8
+ * - Consistent formatting
9
+ */
10
+
11
+ const fs = require('node:fs');
12
+ const path = require('node:path');
13
+
14
+ class WorkflowFormatter {
15
+ constructor(options = {}) {
16
+ this.indentSize = options.indentSize || 2;
17
+ this.preserveMarkdown = options.preserveMarkdown !== false;
18
+ this.verbose = options.verbose || false;
19
+ }
20
+
21
+ /**
22
+ * Format a workflow markdown file
23
+ */
24
+ format(filePath) {
25
+ if (this.verbose) {
26
+ console.log(`Formatting: ${filePath}`);
27
+ }
28
+
29
+ const content = fs.readFileSync(filePath, 'utf8');
30
+ const formatted = this.formatContent(content);
31
+
32
+ // Only write if content changed
33
+ if (content === formatted) {
34
+ if (this.verbose) {
35
+ console.log(`- No changes: ${filePath}`);
36
+ }
37
+ return false;
38
+ } else {
39
+ fs.writeFileSync(filePath, formatted, 'utf8');
40
+ if (this.verbose) {
41
+ console.log(`✓ Formatted: ${filePath}`);
42
+ }
43
+ return true;
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Format content string with stateful indentation tracking
49
+ */
50
+ formatContent(content) {
51
+ const lines = content.split('\n');
52
+ const formatted = [];
53
+ let indentLevel = 0;
54
+ let inCodeBlock = false;
55
+ let checkBlockDepth = 0; // Track nested check blocks
56
+
57
+ for (let i = 0; i < lines.length; i++) {
58
+ const line = lines[i];
59
+ const trimmed = line.trim();
60
+
61
+ // Track code blocks (don't format inside them)
62
+ if (trimmed.startsWith('```')) {
63
+ if (inCodeBlock) {
64
+ inCodeBlock = false;
65
+ } else {
66
+ inCodeBlock = true;
67
+ }
68
+ formatted.push(line);
69
+ continue;
70
+ }
71
+
72
+ // Don't format inside code blocks
73
+ if (inCodeBlock) {
74
+ formatted.push(line);
75
+ continue;
76
+ }
77
+
78
+ // Handle XML tags
79
+ if (this.isXMLLine(trimmed)) {
80
+ const result = this.formatXMLLine(trimmed, indentLevel, checkBlockDepth, i, lines);
81
+ formatted.push(result.line);
82
+ indentLevel = result.nextIndent;
83
+ checkBlockDepth = result.nextCheckDepth;
84
+ } else if (trimmed === '') {
85
+ // Preserve blank lines
86
+ formatted.push('');
87
+ } else {
88
+ // Markdown content - preserve as-is but maintain current indent if inside XML
89
+ formatted.push(line);
90
+ }
91
+ }
92
+
93
+ return formatted.join('\n');
94
+ }
95
+
96
+ /**
97
+ * Check if line contains XML tag
98
+ */
99
+ isXMLLine(line) {
100
+ return /^<[a-zA-Z-]+(\s|>|\/)/.test(line) || /^<\/[a-zA-Z-]+>/.test(line);
101
+ }
102
+
103
+ /**
104
+ * Format a single XML line with context awareness
105
+ */
106
+ formatXMLLine(line, currentIndent, checkDepth, lineIndex, allLines) {
107
+ const trimmed = line.trim();
108
+ let indent = currentIndent;
109
+ let nextIndent = currentIndent;
110
+ let nextCheckDepth = checkDepth;
111
+
112
+ // Get the tag name
113
+ const tagMatch = trimmed.match(/^<\/?([a-zA-Z-]+)/);
114
+ const tagName = tagMatch ? tagMatch[1] : '';
115
+
116
+ // Closing tag - decrease indent before this line
117
+ if (trimmed.startsWith('</')) {
118
+ indent = Math.max(0, currentIndent - 1);
119
+ nextIndent = indent;
120
+
121
+ // If closing a step, reset check depth
122
+ if (tagName === 'step' || tagName === 'workflow') {
123
+ nextCheckDepth = 0;
124
+ }
125
+ }
126
+ // Self-closing tags (opens and closes on same line)
127
+ // EXCEPT <check> tags which create logical blocks
128
+ else if (this.isSelfClosingTag(trimmed) && tagName !== 'check') {
129
+ // These don't change indent level
130
+ indent = currentIndent;
131
+ nextIndent = currentIndent;
132
+ }
133
+ // Opening tags
134
+ else if (trimmed.startsWith('<')) {
135
+ // Check if this is a <check> tag - these create logical blocks
136
+ if (tagName === 'check') {
137
+ indent = currentIndent;
138
+ // Check tags increase indent for following content
139
+ nextIndent = currentIndent + 1;
140
+ nextCheckDepth = checkDepth + 1;
141
+ }
142
+ // <action> tags inside check blocks stay at current indent
143
+ else if (tagName === 'action' && checkDepth > 0) {
144
+ indent = currentIndent;
145
+ nextIndent = currentIndent; // Don't increase further
146
+ }
147
+ // Other tags close check blocks and return to structural level
148
+ else if (checkDepth > 0) {
149
+ // Close all check blocks - return to base structural level
150
+ indent = Math.max(0, currentIndent - checkDepth);
151
+ nextIndent = indent + 1;
152
+ nextCheckDepth = 0;
153
+ }
154
+ // Regular opening tags (no check blocks active)
155
+ else {
156
+ indent = currentIndent;
157
+ nextIndent = currentIndent + 1;
158
+ }
159
+ }
160
+
161
+ const indentStr = ' '.repeat(indent * this.indentSize);
162
+ return {
163
+ line: indentStr + trimmed,
164
+ nextIndent: nextIndent,
165
+ nextCheckDepth: nextCheckDepth,
166
+ };
167
+ }
168
+
169
+ /**
170
+ * Check if tag opens and closes on same line
171
+ */
172
+ isSelfClosingTag(line) {
173
+ // Self-closing with />
174
+ if (line.endsWith('/>')) {
175
+ return true;
176
+ }
177
+ // Opens and closes on same line: <tag>content</tag>
178
+ const match = line.match(/^<([a-zA-Z-]+)(\s[^>]*)?>.*<\/\1>$/);
179
+ return match !== null;
180
+ }
181
+
182
+ /**
183
+ * Check if tag is a block-level structural tag
184
+ */
185
+ isBlockLevelTag(tagName) {
186
+ return ['step', 'workflow', 'check'].includes(tagName);
187
+ }
188
+ }
189
+
190
+ /**
191
+ * CLI Entry Point
192
+ */
193
+ function main() {
194
+ const args = process.argv.slice(2);
195
+
196
+ if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
197
+ console.log(`
198
+ BMAD Workflow Markdown Formatter
199
+
200
+ Usage:
201
+ node format-workflow-md.js <file-pattern> [options]
202
+
203
+ Options:
204
+ --verbose, -v Verbose output
205
+ --check, -c Check formatting without writing (exit 1 if changes needed)
206
+ --help, -h Show this help
207
+
208
+ Examples:
209
+ node format-workflow-md.js src/**/instructions.md
210
+ node format-workflow-md.js "src/modules/bmb/**/*.md" --verbose
211
+ node format-workflow-md.js file.md --check
212
+ `);
213
+ process.exit(0);
214
+ }
215
+
216
+ const verbose = args.includes('--verbose') || args.includes('-v');
217
+ const check = args.includes('--check') || args.includes('-c');
218
+
219
+ // Remove flags from args
220
+ const files = args.filter((arg) => !arg.startsWith('-'));
221
+
222
+ const formatter = new WorkflowFormatter({ verbose });
223
+ let hasChanges = false;
224
+ let formattedCount = 0;
225
+
226
+ // Process files
227
+ for (const pattern of files) {
228
+ // For now, treat as direct file path
229
+ // TODO: Add glob support for patterns
230
+ if (fs.existsSync(pattern)) {
231
+ const stat = fs.statSync(pattern);
232
+ if (stat.isFile()) {
233
+ const changed = formatter.format(pattern);
234
+ if (changed) {
235
+ hasChanges = true;
236
+ formattedCount++;
237
+ }
238
+ } else if (stat.isDirectory()) {
239
+ console.error(`Error: ${pattern} is a directory. Please specify file paths.`);
240
+ }
241
+ } else {
242
+ console.error(`Error: File not found: ${pattern}`);
243
+ }
244
+ }
245
+
246
+ if (verbose || formattedCount > 0) {
247
+ console.log(`\nFormatted ${formattedCount} file(s)`);
248
+ }
249
+
250
+ if (check && hasChanges) {
251
+ console.error('\n❌ Some files need formatting. Run without --check to format.');
252
+ process.exit(1);
253
+ }
254
+
255
+ process.exit(0);
256
+ }
257
+
258
+ // Run if called directly
259
+ if (require.main === module) {
260
+ main();
261
+ }
262
+
263
+ module.exports = { WorkflowFormatter };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Escape XML special characters in a string
3
+ * @param {string} text - The text to escape
4
+ * @returns {string} The escaped text
5
+ */
6
+ function escapeXml(text) {
7
+ if (!text) return '';
8
+ return text.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&apos;');
9
+ }
10
+
11
+ module.exports = {
12
+ escapeXml,
13
+ };