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,1038 @@
1
+ const path = require('node:path');
2
+ const fs = require('fs-extra');
3
+ const crypto = require('node:crypto');
4
+ const { getProjectRoot } = require('../../../lib/project-root');
5
+ const prompts = require('../../../lib/prompts');
6
+
7
+ class Manifest {
8
+ /**
9
+ * Create a new manifest
10
+ * @param {string} bmadDir - Path to bmad directory
11
+ * @param {Object} data - Manifest data
12
+ * @param {Array} installedFiles - List of installed files (no longer used, files tracked in files-manifest.csv)
13
+ */
14
+ async create(bmadDir, data, installedFiles = []) {
15
+ const manifestPath = path.join(bmadDir, '_config', 'manifest.yaml');
16
+ const yaml = require('yaml');
17
+
18
+ // Ensure _config directory exists
19
+ await fs.ensureDir(path.dirname(manifestPath));
20
+
21
+ // Get the BMad version from package.json
22
+ const bmadVersion = data.version || require(path.join(process.cwd(), 'package.json')).version;
23
+
24
+ // Convert module list to new detailed format
25
+ const moduleDetails = [];
26
+ if (data.modules && Array.isArray(data.modules)) {
27
+ for (const moduleName of data.modules) {
28
+ // Core and BMM modules use the BMad version
29
+ const moduleVersion = moduleName === 'core' || moduleName === 'bmm' ? bmadVersion : null;
30
+ const now = data.installDate || new Date().toISOString();
31
+
32
+ moduleDetails.push({
33
+ name: moduleName,
34
+ version: moduleVersion,
35
+ installDate: now,
36
+ lastUpdated: now,
37
+ source: moduleName === 'core' || moduleName === 'bmm' ? 'built-in' : 'unknown',
38
+ });
39
+ }
40
+ }
41
+
42
+ // Structure the manifest data
43
+ const manifestData = {
44
+ installation: {
45
+ version: bmadVersion,
46
+ installDate: data.installDate || new Date().toISOString(),
47
+ lastUpdated: data.lastUpdated || new Date().toISOString(),
48
+ },
49
+ modules: moduleDetails,
50
+ ides: data.ides || [],
51
+ };
52
+
53
+ // Write YAML manifest
54
+ // Clean the manifest data to remove any non-serializable values
55
+ const cleanManifestData = structuredClone(manifestData);
56
+
57
+ const yamlContent = yaml.stringify(cleanManifestData, {
58
+ indent: 2,
59
+ lineWidth: 0,
60
+ sortKeys: false,
61
+ });
62
+
63
+ // Ensure POSIX-compliant final newline
64
+ const content = yamlContent.endsWith('\n') ? yamlContent : yamlContent + '\n';
65
+ await fs.writeFile(manifestPath, content, 'utf8');
66
+ return { success: true, path: manifestPath, filesTracked: 0 };
67
+ }
68
+
69
+ /**
70
+ * Read existing manifest
71
+ * @param {string} bmadDir - Path to bmad directory
72
+ * @returns {Object|null} Manifest data or null if not found
73
+ */
74
+ async read(bmadDir) {
75
+ const yamlPath = path.join(bmadDir, '_config', 'manifest.yaml');
76
+ const yaml = require('yaml');
77
+
78
+ if (await fs.pathExists(yamlPath)) {
79
+ try {
80
+ const content = await fs.readFile(yamlPath, 'utf8');
81
+ const manifestData = yaml.parse(content);
82
+
83
+ // Handle new detailed module format
84
+ const modules = manifestData.modules || [];
85
+
86
+ // For backward compatibility: if modules is an array of strings (old format),
87
+ // the calling code may need the array of names
88
+ const moduleNames = modules.map((m) => (typeof m === 'string' ? m : m.name));
89
+
90
+ // Check if we have the new detailed format
91
+ const hasDetailedModules = modules.length > 0 && typeof modules[0] === 'object';
92
+
93
+ // Flatten the structure for compatibility with existing code
94
+ return {
95
+ version: manifestData.installation?.version,
96
+ installDate: manifestData.installation?.installDate,
97
+ lastUpdated: manifestData.installation?.lastUpdated,
98
+ modules: moduleNames, // Simple array of module names for backward compatibility
99
+ modulesDetailed: hasDetailedModules ? modules : null, // New detailed format
100
+ customModules: manifestData.customModules || [], // Keep for backward compatibility
101
+ ides: manifestData.ides || [],
102
+ };
103
+ } catch (error) {
104
+ await prompts.log.error(`Failed to read YAML manifest: ${error.message}`);
105
+ }
106
+ }
107
+
108
+ return null;
109
+ }
110
+
111
+ /**
112
+ * Update existing manifest
113
+ * @param {string} bmadDir - Path to bmad directory
114
+ * @param {Object} updates - Fields to update
115
+ * @param {Array} installedFiles - Updated list of installed files
116
+ */
117
+ async update(bmadDir, updates, installedFiles = null) {
118
+ const yaml = require('yaml');
119
+ const manifest = (await this._readRaw(bmadDir)) || {
120
+ installation: {},
121
+ modules: [],
122
+ ides: [],
123
+ };
124
+
125
+ // Handle module updates
126
+ if (updates.modules) {
127
+ // If modules is being updated, we need to preserve detailed module info
128
+ const existingDetailed = manifest.modules || [];
129
+ const incomingNames = updates.modules;
130
+
131
+ // Build updated modules array
132
+ const updatedModules = [];
133
+ for (const name of incomingNames) {
134
+ const existing = existingDetailed.find((m) => m.name === name);
135
+ if (existing) {
136
+ // Preserve existing details, update lastUpdated if this module is being updated
137
+ updatedModules.push({
138
+ ...existing,
139
+ lastUpdated: new Date().toISOString(),
140
+ });
141
+ } else {
142
+ // New module - add with minimal details
143
+ updatedModules.push({
144
+ name,
145
+ version: null,
146
+ installDate: new Date().toISOString(),
147
+ lastUpdated: new Date().toISOString(),
148
+ source: 'unknown',
149
+ });
150
+ }
151
+ }
152
+
153
+ manifest.modules = updatedModules;
154
+ }
155
+
156
+ // Merge other updates
157
+ if (updates.version) {
158
+ manifest.installation.version = updates.version;
159
+ }
160
+ if (updates.installDate) {
161
+ manifest.installation.installDate = updates.installDate;
162
+ }
163
+ manifest.installation.lastUpdated = new Date().toISOString();
164
+
165
+ if (updates.ides) {
166
+ manifest.ides = updates.ides;
167
+ }
168
+
169
+ // Handle per-module version updates
170
+ if (updates.moduleVersions) {
171
+ for (const [moduleName, versionInfo] of Object.entries(updates.moduleVersions)) {
172
+ const moduleIndex = manifest.modules.findIndex((m) => m.name === moduleName);
173
+ if (moduleIndex !== -1) {
174
+ manifest.modules[moduleIndex] = {
175
+ ...manifest.modules[moduleIndex],
176
+ ...versionInfo,
177
+ lastUpdated: new Date().toISOString(),
178
+ };
179
+ }
180
+ }
181
+ }
182
+
183
+ // Handle adding a new module with version info
184
+ if (updates.addModule) {
185
+ const { name, version, source, npmPackage, repoUrl } = updates.addModule;
186
+ const existing = manifest.modules.find((m) => m.name === name);
187
+ if (!existing) {
188
+ manifest.modules.push({
189
+ name,
190
+ version: version || null,
191
+ installDate: new Date().toISOString(),
192
+ lastUpdated: new Date().toISOString(),
193
+ source: source || 'external',
194
+ npmPackage: npmPackage || null,
195
+ repoUrl: repoUrl || null,
196
+ });
197
+ }
198
+ }
199
+
200
+ const manifestPath = path.join(bmadDir, '_config', 'manifest.yaml');
201
+ await fs.ensureDir(path.dirname(manifestPath));
202
+
203
+ // Clean the manifest data to remove any non-serializable values
204
+ const cleanManifestData = structuredClone(manifest);
205
+
206
+ const yamlContent = yaml.stringify(cleanManifestData, {
207
+ indent: 2,
208
+ lineWidth: 0,
209
+ sortKeys: false,
210
+ });
211
+
212
+ // Ensure POSIX-compliant final newline
213
+ const content = yamlContent.endsWith('\n') ? yamlContent : yamlContent + '\n';
214
+ await fs.writeFile(manifestPath, content, 'utf8');
215
+
216
+ // Return the flattened format for compatibility
217
+ return this._flattenManifest(manifest);
218
+ }
219
+
220
+ /**
221
+ * Read raw manifest data without flattening
222
+ * @param {string} bmadDir - Path to bmad directory
223
+ * @returns {Object|null} Raw manifest data or null if not found
224
+ */
225
+ async _readRaw(bmadDir) {
226
+ const yamlPath = path.join(bmadDir, '_config', 'manifest.yaml');
227
+ const yaml = require('yaml');
228
+
229
+ if (await fs.pathExists(yamlPath)) {
230
+ try {
231
+ const content = await fs.readFile(yamlPath, 'utf8');
232
+ return yaml.parse(content);
233
+ } catch (error) {
234
+ await prompts.log.error(`Failed to read YAML manifest: ${error.message}`);
235
+ }
236
+ }
237
+
238
+ return null;
239
+ }
240
+
241
+ /**
242
+ * Flatten manifest for backward compatibility
243
+ * @param {Object} manifest - Raw manifest data
244
+ * @returns {Object} Flattened manifest
245
+ */
246
+ _flattenManifest(manifest) {
247
+ const modules = manifest.modules || [];
248
+ const moduleNames = modules.map((m) => (typeof m === 'string' ? m : m.name));
249
+ const hasDetailedModules = modules.length > 0 && typeof modules[0] === 'object';
250
+
251
+ return {
252
+ version: manifest.installation?.version,
253
+ installDate: manifest.installation?.installDate,
254
+ lastUpdated: manifest.installation?.lastUpdated,
255
+ modules: moduleNames,
256
+ modulesDetailed: hasDetailedModules ? modules : null,
257
+ customModules: manifest.customModules || [],
258
+ ides: manifest.ides || [],
259
+ };
260
+ }
261
+
262
+ /**
263
+ * Add a module to the manifest with optional version info
264
+ * If module already exists, update its version info
265
+ * @param {string} bmadDir - Path to bmad directory
266
+ * @param {string} moduleName - Module name to add
267
+ * @param {Object} options - Optional version info
268
+ */
269
+ async addModule(bmadDir, moduleName, options = {}) {
270
+ const manifest = await this._readRaw(bmadDir);
271
+ if (!manifest) {
272
+ throw new Error('No manifest found');
273
+ }
274
+
275
+ if (!manifest.modules) {
276
+ manifest.modules = [];
277
+ }
278
+
279
+ const existingIndex = manifest.modules.findIndex((m) => m.name === moduleName);
280
+
281
+ if (existingIndex === -1) {
282
+ // Module doesn't exist, add it
283
+ manifest.modules.push({
284
+ name: moduleName,
285
+ version: options.version || null,
286
+ installDate: new Date().toISOString(),
287
+ lastUpdated: new Date().toISOString(),
288
+ source: options.source || 'unknown',
289
+ npmPackage: options.npmPackage || null,
290
+ repoUrl: options.repoUrl || null,
291
+ });
292
+ } else {
293
+ // Module exists, update its version info
294
+ const existing = manifest.modules[existingIndex];
295
+ manifest.modules[existingIndex] = {
296
+ ...existing,
297
+ version: options.version === undefined ? existing.version : options.version,
298
+ source: options.source || existing.source,
299
+ npmPackage: options.npmPackage === undefined ? existing.npmPackage : options.npmPackage,
300
+ repoUrl: options.repoUrl === undefined ? existing.repoUrl : options.repoUrl,
301
+ lastUpdated: new Date().toISOString(),
302
+ };
303
+ }
304
+
305
+ await this._writeRaw(bmadDir, manifest);
306
+ }
307
+
308
+ /**
309
+ * Remove a module from the manifest
310
+ * @param {string} bmadDir - Path to bmad directory
311
+ * @param {string} moduleName - Module name to remove
312
+ */
313
+ async removeModule(bmadDir, moduleName) {
314
+ const manifest = await this._readRaw(bmadDir);
315
+ if (!manifest || !manifest.modules) {
316
+ return;
317
+ }
318
+
319
+ const index = manifest.modules.findIndex((m) => m.name === moduleName);
320
+ if (index !== -1) {
321
+ manifest.modules.splice(index, 1);
322
+ await this._writeRaw(bmadDir, manifest);
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Update a single module's version info
328
+ * @param {string} bmadDir - Path to bmad directory
329
+ * @param {string} moduleName - Module name
330
+ * @param {Object} versionInfo - Version info to update
331
+ */
332
+ async updateModuleVersion(bmadDir, moduleName, versionInfo) {
333
+ const manifest = await this._readRaw(bmadDir);
334
+ if (!manifest || !manifest.modules) {
335
+ return;
336
+ }
337
+
338
+ const index = manifest.modules.findIndex((m) => m.name === moduleName);
339
+ if (index !== -1) {
340
+ manifest.modules[index] = {
341
+ ...manifest.modules[index],
342
+ ...versionInfo,
343
+ lastUpdated: new Date().toISOString(),
344
+ };
345
+ await this._writeRaw(bmadDir, manifest);
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Get version info for a specific module
351
+ * @param {string} bmadDir - Path to bmad directory
352
+ * @param {string} moduleName - Module name
353
+ * @returns {Object|null} Module version info or null
354
+ */
355
+ async getModuleVersion(bmadDir, moduleName) {
356
+ const manifest = await this._readRaw(bmadDir);
357
+ if (!manifest || !manifest.modules) {
358
+ return null;
359
+ }
360
+
361
+ return manifest.modules.find((m) => m.name === moduleName) || null;
362
+ }
363
+
364
+ /**
365
+ * Get all modules with their version info
366
+ * @param {string} bmadDir - Path to bmad directory
367
+ * @returns {Array} Array of module info objects
368
+ */
369
+ async getAllModuleVersions(bmadDir) {
370
+ const manifest = await this._readRaw(bmadDir);
371
+ if (!manifest || !manifest.modules) {
372
+ return [];
373
+ }
374
+
375
+ return manifest.modules;
376
+ }
377
+
378
+ /**
379
+ * Write raw manifest data to file
380
+ * @param {string} bmadDir - Path to bmad directory
381
+ * @param {Object} manifestData - Raw manifest data to write
382
+ */
383
+ async _writeRaw(bmadDir, manifestData) {
384
+ const yaml = require('yaml');
385
+ const manifestPath = path.join(bmadDir, '_config', 'manifest.yaml');
386
+
387
+ await fs.ensureDir(path.dirname(manifestPath));
388
+
389
+ const cleanManifestData = structuredClone(manifestData);
390
+
391
+ const yamlContent = yaml.stringify(cleanManifestData, {
392
+ indent: 2,
393
+ lineWidth: 0,
394
+ sortKeys: false,
395
+ });
396
+
397
+ const content = yamlContent.endsWith('\n') ? yamlContent : yamlContent + '\n';
398
+ await fs.writeFile(manifestPath, content, 'utf8');
399
+ }
400
+
401
+ /**
402
+ * Add an IDE configuration to the manifest
403
+ * @param {string} bmadDir - Path to bmad directory
404
+ * @param {string} ideName - IDE name to add
405
+ */
406
+ async addIde(bmadDir, ideName) {
407
+ const manifest = await this.read(bmadDir);
408
+ if (!manifest) {
409
+ throw new Error('No manifest found');
410
+ }
411
+
412
+ if (!manifest.ides) {
413
+ manifest.ides = [];
414
+ }
415
+
416
+ if (!manifest.ides.includes(ideName)) {
417
+ manifest.ides.push(ideName);
418
+ await this.update(bmadDir, { ides: manifest.ides });
419
+ }
420
+ }
421
+
422
+ /**
423
+ * Calculate SHA256 hash of a file
424
+ * @param {string} filePath - Path to file
425
+ * @returns {string} SHA256 hash
426
+ */
427
+ async calculateFileHash(filePath) {
428
+ try {
429
+ const content = await fs.readFile(filePath);
430
+ return crypto.createHash('sha256').update(content).digest('hex');
431
+ } catch {
432
+ return null;
433
+ }
434
+ }
435
+
436
+ /**
437
+ * Parse installed files to extract metadata
438
+ * @param {Array} installedFiles - List of installed file paths
439
+ * @param {string} bmadDir - Path to bmad directory for relative paths
440
+ * @returns {Array} Array of file metadata objects
441
+ */
442
+ async parseInstalledFiles(installedFiles, bmadDir) {
443
+ const fileMetadata = [];
444
+
445
+ for (const filePath of installedFiles) {
446
+ const fileExt = path.extname(filePath).toLowerCase();
447
+ // Make path relative to parent of bmad directory, starting with 'bmad/'
448
+ const relativePath = 'bmad' + filePath.replace(bmadDir, '').replaceAll('\\', '/');
449
+
450
+ // Calculate file hash
451
+ const hash = await this.calculateFileHash(filePath);
452
+
453
+ // Handle markdown files - extract XML metadata if present
454
+ if (fileExt === '.md') {
455
+ try {
456
+ if (await fs.pathExists(filePath)) {
457
+ const content = await fs.readFile(filePath, 'utf8');
458
+ const metadata = this.extractXmlNodeAttributes(content, filePath, relativePath);
459
+
460
+ if (metadata) {
461
+ // Has XML metadata
462
+ metadata.hash = hash;
463
+ fileMetadata.push(metadata);
464
+ } else {
465
+ // No XML metadata - still track the file
466
+ fileMetadata.push({
467
+ file: relativePath,
468
+ type: 'md',
469
+ name: path.basename(filePath, fileExt),
470
+ title: null,
471
+ hash: hash,
472
+ });
473
+ }
474
+ }
475
+ } catch (error) {
476
+ await prompts.log.warn(`Could not parse ${filePath}: ${error.message}`);
477
+ }
478
+ }
479
+ // Handle other file types (CSV, JSON, YAML, etc.)
480
+ else {
481
+ fileMetadata.push({
482
+ file: relativePath,
483
+ type: fileExt.slice(1), // Remove the dot
484
+ name: path.basename(filePath, fileExt),
485
+ title: null,
486
+ hash: hash,
487
+ });
488
+ }
489
+ }
490
+
491
+ return fileMetadata;
492
+ }
493
+
494
+ /**
495
+ * Extract XML node attributes from MD file content
496
+ * @param {string} content - File content
497
+ * @param {string} filePath - File path for context
498
+ * @param {string} relativePath - Relative path starting with 'bmad/'
499
+ * @returns {Object|null} Extracted metadata or null
500
+ */
501
+ extractXmlNodeAttributes(content, filePath, relativePath) {
502
+ // Look for XML blocks in code fences
503
+ const xmlBlockMatch = content.match(/```xml\s*([\s\S]*?)```/);
504
+ if (!xmlBlockMatch) {
505
+ return null;
506
+ }
507
+
508
+ const xmlContent = xmlBlockMatch[1];
509
+
510
+ // Extract root XML node (agent, task, template, etc.)
511
+ const rootNodeMatch = xmlContent.match(/<(\w+)([^>]*)>/);
512
+ if (!rootNodeMatch) {
513
+ return null;
514
+ }
515
+
516
+ const nodeType = rootNodeMatch[1];
517
+ const attributes = rootNodeMatch[2];
518
+
519
+ // Extract name and title attributes (id not needed since we have path)
520
+ const nameMatch = attributes.match(/name="([^"]*)"/);
521
+ const titleMatch = attributes.match(/title="([^"]*)"/);
522
+
523
+ return {
524
+ file: relativePath,
525
+ type: nodeType,
526
+ name: nameMatch ? nameMatch[1] : null,
527
+ title: titleMatch ? titleMatch[1] : null,
528
+ };
529
+ }
530
+
531
+ /**
532
+ * Generate CSV manifest content
533
+ * @param {Object} data - Manifest data
534
+ * @param {Array} fileMetadata - File metadata array
535
+ * @param {Object} moduleConfigs - Module configuration data
536
+ * @returns {string} CSV content
537
+ */
538
+ generateManifestCsv(data, fileMetadata, moduleConfigs = {}) {
539
+ const timestamp = new Date().toISOString();
540
+ let csv = [];
541
+
542
+ // Header section
543
+ csv.push(
544
+ '# BMAD Manifest',
545
+ `# Generated: ${timestamp}`,
546
+ '',
547
+ '## Installation Info',
548
+ 'Property,Value',
549
+ `Version,${data.version}`,
550
+ `InstallDate,${data.installDate || timestamp}`,
551
+ `LastUpdated,${data.lastUpdated || timestamp}`,
552
+ );
553
+ if (data.language) {
554
+ csv.push(`Language,${data.language}`);
555
+ }
556
+ csv.push('');
557
+
558
+ // Modules section
559
+ if (data.modules && data.modules.length > 0) {
560
+ csv.push('## Modules', 'Name,Version,ShortTitle');
561
+ for (const moduleName of data.modules) {
562
+ const config = moduleConfigs[moduleName] || {};
563
+ csv.push([moduleName, config.version || '', config['short-title'] || ''].map((v) => this.escapeCsv(v)).join(','));
564
+ }
565
+ csv.push('');
566
+ }
567
+
568
+ // IDEs section
569
+ if (data.ides && data.ides.length > 0) {
570
+ csv.push('## IDEs', 'IDE');
571
+ for (const ide of data.ides) {
572
+ csv.push(this.escapeCsv(ide));
573
+ }
574
+ csv.push('');
575
+ }
576
+
577
+ // Files section - NO LONGER USED
578
+ // Files are now tracked in files-manifest.csv by ManifestGenerator
579
+
580
+ return csv.join('\n');
581
+ }
582
+
583
+ /**
584
+ * Parse CSV manifest content back to object
585
+ * @param {string} csvContent - CSV content to parse
586
+ * @returns {Object} Parsed manifest data
587
+ */
588
+ parseManifestCsv(csvContent) {
589
+ const result = {
590
+ modules: [],
591
+ ides: [],
592
+ files: [],
593
+ };
594
+
595
+ const lines = csvContent.split('\n');
596
+ let section = '';
597
+
598
+ for (const line_ of lines) {
599
+ const line = line_.trim();
600
+
601
+ // Skip empty lines and comments
602
+ if (!line || line.startsWith('#')) {
603
+ // Check for section headers
604
+ if (line.startsWith('## ')) {
605
+ section = line.slice(3).toLowerCase();
606
+ }
607
+ continue;
608
+ }
609
+
610
+ // Parse based on current section
611
+ switch (section) {
612
+ case 'installation info': {
613
+ // Skip header row
614
+ if (line === 'Property,Value') continue;
615
+
616
+ const [property, ...valueParts] = line.split(',');
617
+ const value = this.unescapeCsv(valueParts.join(','));
618
+
619
+ switch (property) {
620
+ // Path no longer stored in manifest
621
+ case 'Version': {
622
+ result.version = value;
623
+ break;
624
+ }
625
+ case 'InstallDate': {
626
+ result.installDate = value;
627
+ break;
628
+ }
629
+ case 'LastUpdated': {
630
+ result.lastUpdated = value;
631
+ break;
632
+ }
633
+ case 'Language': {
634
+ result.language = value;
635
+ break;
636
+ }
637
+ }
638
+
639
+ break;
640
+ }
641
+ case 'modules': {
642
+ // Skip header row
643
+ if (line === 'Name,Version,ShortTitle') continue;
644
+
645
+ const parts = this.parseCsvLine(line);
646
+ if (parts[0]) {
647
+ result.modules.push(parts[0]);
648
+ }
649
+
650
+ break;
651
+ }
652
+ case 'ides': {
653
+ // Skip header row
654
+ if (line === 'IDE') continue;
655
+
656
+ result.ides.push(this.unescapeCsv(line));
657
+
658
+ break;
659
+ }
660
+ case 'files': {
661
+ // Skip header rows (support both old and new format)
662
+ if (line === 'Type,Path,Name,Title' || line === 'Type,Path,Name,Title,Hash') continue;
663
+
664
+ const parts = this.parseCsvLine(line);
665
+ if (parts.length >= 2) {
666
+ result.files.push({
667
+ type: parts[0] || '',
668
+ file: parts[1] || '',
669
+ name: parts[2] || null,
670
+ title: parts[3] || null,
671
+ hash: parts[4] || null, // Hash column (may not exist in old manifests)
672
+ });
673
+ }
674
+
675
+ break;
676
+ }
677
+ // No default
678
+ }
679
+ }
680
+
681
+ return result;
682
+ }
683
+
684
+ /**
685
+ * Parse a CSV line handling quotes and commas
686
+ * @param {string} line - CSV line to parse
687
+ * @returns {Array} Array of values
688
+ */
689
+ parseCsvLine(line) {
690
+ const result = [];
691
+ let current = '';
692
+ let inQuotes = false;
693
+
694
+ for (let i = 0; i < line.length; i++) {
695
+ const char = line[i];
696
+
697
+ if (char === '"') {
698
+ if (inQuotes && line[i + 1] === '"') {
699
+ // Escaped quote
700
+ current += '"';
701
+ i++;
702
+ } else {
703
+ // Toggle quote state
704
+ inQuotes = !inQuotes;
705
+ }
706
+ } else if (char === ',' && !inQuotes) {
707
+ // Field separator
708
+ result.push(this.unescapeCsv(current));
709
+ current = '';
710
+ } else {
711
+ current += char;
712
+ }
713
+ }
714
+
715
+ // Add the last field
716
+ result.push(this.unescapeCsv(current));
717
+
718
+ return result;
719
+ }
720
+
721
+ /**
722
+ * Escape CSV special characters
723
+ * @param {string} text - Text to escape
724
+ * @returns {string} Escaped text
725
+ */
726
+ escapeCsv(text) {
727
+ if (!text) return '';
728
+ const str = String(text);
729
+
730
+ // If contains comma, newline, or quote, wrap in quotes and escape quotes
731
+ if (str.includes(',') || str.includes('\n') || str.includes('"')) {
732
+ return '"' + str.replaceAll('"', '""') + '"';
733
+ }
734
+
735
+ return str;
736
+ }
737
+
738
+ /**
739
+ * Unescape CSV field
740
+ * @param {string} text - Text to unescape
741
+ * @returns {string} Unescaped text
742
+ */
743
+ unescapeCsv(text) {
744
+ if (!text) return '';
745
+
746
+ // Remove surrounding quotes if present
747
+ if (text.startsWith('"') && text.endsWith('"')) {
748
+ text = text.slice(1, -1);
749
+ // Unescape doubled quotes
750
+ text = text.replaceAll('""', '"');
751
+ }
752
+
753
+ return text;
754
+ }
755
+
756
+ /**
757
+ * Load module configuration files
758
+ * @param {Array} modules - List of module names
759
+ * @returns {Object} Module configurations indexed by name
760
+ */
761
+ async loadModuleConfigs(modules) {
762
+ const configs = {};
763
+
764
+ for (const moduleName of modules) {
765
+ // Handle core module differently - it's in src/core not src/modules/core
766
+ const configPath =
767
+ moduleName === 'core'
768
+ ? path.join(process.cwd(), 'src', 'core', 'config.yaml')
769
+ : path.join(process.cwd(), 'src', 'modules', moduleName, 'config.yaml');
770
+
771
+ try {
772
+ if (await fs.pathExists(configPath)) {
773
+ const yaml = require('yaml');
774
+ const content = await fs.readFile(configPath, 'utf8');
775
+ configs[moduleName] = yaml.parse(content);
776
+ }
777
+ } catch (error) {
778
+ await prompts.log.warn(`Could not load config for module ${moduleName}: ${error.message}`);
779
+ }
780
+ }
781
+
782
+ return configs;
783
+ }
784
+ /**
785
+ * Add a custom module to the manifest with its source path
786
+ * @param {string} bmadDir - Path to bmad directory
787
+ * @param {Object} customModule - Custom module info
788
+ */
789
+ async addCustomModule(bmadDir, customModule) {
790
+ const manifest = await this.read(bmadDir);
791
+ if (!manifest) {
792
+ throw new Error('No manifest found');
793
+ }
794
+
795
+ if (!manifest.customModules) {
796
+ manifest.customModules = [];
797
+ }
798
+
799
+ // Check if custom module already exists
800
+ const existingIndex = manifest.customModules.findIndex((m) => m.id === customModule.id);
801
+ if (existingIndex === -1) {
802
+ // Add new entry
803
+ manifest.customModules.push(customModule);
804
+ } else {
805
+ // Update existing entry
806
+ manifest.customModules[existingIndex] = customModule;
807
+ }
808
+
809
+ await this.update(bmadDir, { customModules: manifest.customModules });
810
+ }
811
+
812
+ /**
813
+ * Remove a custom module from the manifest
814
+ * @param {string} bmadDir - Path to bmad directory
815
+ * @param {string} moduleId - Module ID to remove
816
+ */
817
+ async removeCustomModule(bmadDir, moduleId) {
818
+ const manifest = await this.read(bmadDir);
819
+ if (!manifest || !manifest.customModules) {
820
+ return;
821
+ }
822
+
823
+ const index = manifest.customModules.findIndex((m) => m.id === moduleId);
824
+ if (index !== -1) {
825
+ manifest.customModules.splice(index, 1);
826
+ await this.update(bmadDir, { customModules: manifest.customModules });
827
+ }
828
+ }
829
+
830
+ /**
831
+ * Get module version info from source
832
+ * @param {string} moduleName - Module name/code
833
+ * @param {string} bmadDir - Path to bmad directory
834
+ * @param {string} moduleSourcePath - Optional source path for custom modules
835
+ * @returns {Object} Version info object with version, source, npmPackage, repoUrl
836
+ */
837
+ async getModuleVersionInfo(moduleName, bmadDir, moduleSourcePath = null) {
838
+ const os = require('node:os');
839
+ const yaml = require('yaml');
840
+
841
+ // Built-in modules use BMad version (only core and bmm are in BMAD-METHOD repo)
842
+ if (['core', 'bmm'].includes(moduleName)) {
843
+ const bmadVersion = require(path.join(getProjectRoot(), 'package.json')).version;
844
+ return {
845
+ version: bmadVersion,
846
+ source: 'built-in',
847
+ npmPackage: null,
848
+ repoUrl: null,
849
+ };
850
+ }
851
+
852
+ // Check if this is an external official module
853
+ const { ExternalModuleManager } = require('../modules/external-manager');
854
+ const extMgr = new ExternalModuleManager();
855
+ const moduleInfo = await extMgr.getModuleByCode(moduleName);
856
+
857
+ if (moduleInfo) {
858
+ // External module - try to get version from npm registry first, then fall back to cache
859
+ let version = null;
860
+
861
+ if (moduleInfo.npmPackage) {
862
+ // Fetch version from npm registry
863
+ try {
864
+ version = await this.fetchNpmVersion(moduleInfo.npmPackage);
865
+ } catch {
866
+ // npm fetch failed, try cache as fallback
867
+ }
868
+ }
869
+
870
+ // If npm didn't work, try reading from cached repo's package.json
871
+ if (!version) {
872
+ const cacheDir = path.join(os.homedir(), '.bmad', 'cache', 'external-modules', moduleName);
873
+ const packageJsonPath = path.join(cacheDir, 'package.json');
874
+
875
+ if (await fs.pathExists(packageJsonPath)) {
876
+ try {
877
+ const pkg = require(packageJsonPath);
878
+ version = pkg.version;
879
+ } catch (error) {
880
+ await prompts.log.warn(`Failed to read package.json for ${moduleName}: ${error.message}`);
881
+ }
882
+ }
883
+ }
884
+
885
+ return {
886
+ version: version,
887
+ source: 'external',
888
+ npmPackage: moduleInfo.npmPackage || null,
889
+ repoUrl: moduleInfo.url || null,
890
+ };
891
+ }
892
+
893
+ // Custom module - check cache directory
894
+ const cacheDir = path.join(bmadDir, '_config', 'custom', moduleName);
895
+ const moduleYamlPath = path.join(cacheDir, 'module.yaml');
896
+
897
+ if (await fs.pathExists(moduleYamlPath)) {
898
+ try {
899
+ const yamlContent = await fs.readFile(moduleYamlPath, 'utf8');
900
+ const moduleConfig = yaml.parse(yamlContent);
901
+ return {
902
+ version: moduleConfig.version || null,
903
+ source: 'custom',
904
+ npmPackage: moduleConfig.npmPackage || null,
905
+ repoUrl: moduleConfig.repoUrl || null,
906
+ };
907
+ } catch (error) {
908
+ await prompts.log.warn(`Failed to read module.yaml for ${moduleName}: ${error.message}`);
909
+ }
910
+ }
911
+
912
+ // Unknown module
913
+ return {
914
+ version: null,
915
+ source: 'unknown',
916
+ npmPackage: null,
917
+ repoUrl: null,
918
+ };
919
+ }
920
+
921
+ /**
922
+ * Fetch latest version from npm for a package
923
+ * @param {string} packageName - npm package name
924
+ * @returns {string|null} Latest version or null
925
+ */
926
+ async fetchNpmVersion(packageName) {
927
+ try {
928
+ const https = require('node:https');
929
+ const { execSync } = require('node:child_process');
930
+
931
+ // Try using npm view first (more reliable)
932
+ try {
933
+ const result = execSync(`npm view ${packageName} version`, {
934
+ encoding: 'utf8',
935
+ stdio: 'pipe',
936
+ timeout: 10_000,
937
+ });
938
+ return result.trim();
939
+ } catch {
940
+ // Fallback to npm registry API
941
+ return new Promise((resolve, reject) => {
942
+ https
943
+ .get(`https://registry.npmjs.org/${packageName}`, (res) => {
944
+ let data = '';
945
+ res.on('data', (chunk) => (data += chunk));
946
+ res.on('end', () => {
947
+ try {
948
+ const pkg = JSON.parse(data);
949
+ resolve(pkg['dist-tags']?.latest || pkg.version || null);
950
+ } catch {
951
+ resolve(null);
952
+ }
953
+ });
954
+ })
955
+ .on('error', () => resolve(null));
956
+ });
957
+ }
958
+ } catch {
959
+ return null;
960
+ }
961
+ }
962
+
963
+ /**
964
+ * Check for available updates for installed modules
965
+ * @param {string} bmadDir - Path to bmad directory
966
+ * @returns {Array} Array of update info objects
967
+ */
968
+ async checkForUpdates(bmadDir) {
969
+ const modules = await this.getAllModuleVersions(bmadDir);
970
+ const updates = [];
971
+
972
+ for (const module of modules) {
973
+ if (!module.npmPackage) {
974
+ continue; // Skip modules without npm package (built-in)
975
+ }
976
+
977
+ const latestVersion = await this.fetchNpmVersion(module.npmPackage);
978
+ if (!latestVersion) {
979
+ continue;
980
+ }
981
+
982
+ if (module.version !== latestVersion) {
983
+ updates.push({
984
+ name: module.name,
985
+ installedVersion: module.version,
986
+ latestVersion: latestVersion,
987
+ npmPackage: module.npmPackage,
988
+ updateAvailable: true,
989
+ });
990
+ }
991
+ }
992
+
993
+ return updates;
994
+ }
995
+
996
+ /**
997
+ * Compare two semantic versions
998
+ * @param {string} v1 - First version
999
+ * @param {string} v2 - Second version
1000
+ * @returns {number} -1 if v1 < v2, 0 if v1 == v2, 1 if v1 > v2
1001
+ */
1002
+ compareVersions(v1, v2) {
1003
+ if (!v1 || !v2) return 0;
1004
+
1005
+ const normalize = (v) => {
1006
+ // Remove leading 'v' if present
1007
+ v = v.replace(/^v/, '');
1008
+ // Handle prerelease tags
1009
+ const parts = v.split('-');
1010
+ const main = parts[0].split('.');
1011
+ const prerelease = parts[1];
1012
+ return { main, prerelease };
1013
+ };
1014
+
1015
+ const n1 = normalize(v1);
1016
+ const n2 = normalize(v2);
1017
+
1018
+ // Compare main version parts
1019
+ for (let i = 0; i < 3; i++) {
1020
+ const num1 = parseInt(n1.main[i] || '0', 10);
1021
+ const num2 = parseInt(n2.main[i] || '0', 10);
1022
+ if (num1 !== num2) {
1023
+ return num1 < num2 ? -1 : 1;
1024
+ }
1025
+ }
1026
+
1027
+ // If main versions are equal, compare prerelease
1028
+ if (n1.prerelease && n2.prerelease) {
1029
+ return n1.prerelease < n2.prerelease ? -1 : n1.prerelease > n2.prerelease ? 1 : 0;
1030
+ }
1031
+ if (n1.prerelease) return -1; // Prerelease is older than stable
1032
+ if (n2.prerelease) return 1; // Stable is newer than prerelease
1033
+
1034
+ return 0;
1035
+ }
1036
+ }
1037
+
1038
+ module.exports = { Manifest };