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,269 @@
1
+ const path = require('node:path');
2
+ const { BaseIdeSetup } = require('./_base-ide');
3
+ const yaml = require('yaml');
4
+ const prompts = require('../../../lib/prompts');
5
+ const { AgentCommandGenerator } = require('./shared/agent-command-generator');
6
+ const { WorkflowCommandGenerator } = require('./shared/workflow-command-generator');
7
+ const { TaskToolCommandGenerator } = require('./shared/task-tool-command-generator');
8
+
9
+ /**
10
+ * KiloCode IDE setup handler
11
+ * Creates custom modes in .kilocodemodes file (similar to Roo)
12
+ */
13
+ class KiloSetup extends BaseIdeSetup {
14
+ constructor() {
15
+ super('kilo', 'Kilo Code');
16
+ this.configFile = '.kilocodemodes';
17
+ }
18
+
19
+ /**
20
+ * Setup KiloCode IDE configuration
21
+ * @param {string} projectDir - Project directory
22
+ * @param {string} bmadDir - BMAD installation directory
23
+ * @param {Object} options - Setup options
24
+ */
25
+ async setup(projectDir, bmadDir, options = {}) {
26
+ if (!options.silent) await prompts.log.info(`Setting up ${this.name}...`);
27
+
28
+ // Clean up any old BMAD installation first
29
+ await this.cleanup(projectDir, options);
30
+
31
+ // Load existing config (may contain non-BMAD modes and other settings)
32
+ const kiloModesPath = path.join(projectDir, this.configFile);
33
+ let config = {};
34
+
35
+ if (await this.pathExists(kiloModesPath)) {
36
+ const existingContent = await this.readFile(kiloModesPath);
37
+ try {
38
+ config = yaml.parse(existingContent) || {};
39
+ } catch {
40
+ // If parsing fails, start fresh but warn user
41
+ await prompts.log.warn('Warning: Could not parse existing .kilocodemodes, starting fresh');
42
+ config = {};
43
+ }
44
+ }
45
+
46
+ // Ensure customModes array exists
47
+ if (!Array.isArray(config.customModes)) {
48
+ config.customModes = [];
49
+ }
50
+
51
+ // Generate agent launchers
52
+ const agentGen = new AgentCommandGenerator(this.bmadFolderName);
53
+ const { artifacts: agentArtifacts } = await agentGen.collectAgentArtifacts(bmadDir, options.selectedModules || []);
54
+
55
+ // Create mode objects and add to config
56
+ let addedCount = 0;
57
+
58
+ for (const artifact of agentArtifacts) {
59
+ const modeObject = await this.createModeObject(artifact, projectDir);
60
+ config.customModes.push(modeObject);
61
+ addedCount++;
62
+ }
63
+
64
+ // Write .kilocodemodes file with proper YAML structure
65
+ const finalContent = yaml.stringify(config, { lineWidth: 0 });
66
+ await this.writeFile(kiloModesPath, finalContent);
67
+
68
+ // Generate workflow commands
69
+ const workflowGenerator = new WorkflowCommandGenerator(this.bmadFolderName);
70
+ const { artifacts: workflowArtifacts } = await workflowGenerator.collectWorkflowArtifacts(bmadDir);
71
+
72
+ // Write to .kilocode/workflows/ directory
73
+ const workflowsDir = path.join(projectDir, '.kilocode', 'workflows');
74
+ await this.ensureDir(workflowsDir);
75
+
76
+ // Clear old BMAD workflows before writing new ones
77
+ await this.clearBmadWorkflows(workflowsDir);
78
+
79
+ // Write workflow files
80
+ const workflowCount = await workflowGenerator.writeDashArtifacts(workflowsDir, workflowArtifacts);
81
+
82
+ // Generate task and tool commands
83
+ const taskToolGen = new TaskToolCommandGenerator(this.bmadFolderName);
84
+ const { artifacts: taskToolArtifacts, counts: taskToolCounts } = await taskToolGen.collectTaskToolArtifacts(bmadDir);
85
+
86
+ // Write task/tool files to workflows directory (same location as workflows)
87
+ await taskToolGen.writeDashArtifacts(workflowsDir, taskToolArtifacts);
88
+ const taskCount = taskToolCounts.tasks || 0;
89
+ const toolCount = taskToolCounts.tools || 0;
90
+
91
+ if (!options.silent) {
92
+ await prompts.log.success(
93
+ `${this.name} configured: ${addedCount} modes, ${workflowCount} workflows, ${taskCount} tasks, ${toolCount} tools → ${this.configFile}`,
94
+ );
95
+ }
96
+
97
+ return {
98
+ success: true,
99
+ modes: addedCount,
100
+ workflows: workflowCount,
101
+ tasks: taskCount,
102
+ tools: toolCount,
103
+ };
104
+ }
105
+
106
+ /**
107
+ * Create a mode object for an agent
108
+ * @param {Object} artifact - Agent artifact
109
+ * @param {string} projectDir - Project directory
110
+ * @returns {Object} Mode object for YAML serialization
111
+ */
112
+ async createModeObject(artifact, projectDir) {
113
+ // Extract metadata from launcher content
114
+ const titleMatch = artifact.content.match(/title="([^"]+)"/);
115
+ const title = titleMatch ? titleMatch[1] : this.formatTitle(artifact.name);
116
+
117
+ const iconMatch = artifact.content.match(/icon="([^"]+)"/);
118
+ const icon = iconMatch ? iconMatch[1] : '🤖';
119
+
120
+ const whenToUseMatch = artifact.content.match(/whenToUse="([^"]+)"/);
121
+ const whenToUse = whenToUseMatch ? whenToUseMatch[1] : `Use for ${title} tasks`;
122
+
123
+ // Get the activation header from central template (trim to avoid YAML formatting issues)
124
+ const activationHeader = (await this.getAgentCommandHeader()).trim();
125
+
126
+ const roleDefinitionMatch = artifact.content.match(/roleDefinition="([^"]+)"/);
127
+ const roleDefinition = roleDefinitionMatch
128
+ ? roleDefinitionMatch[1]
129
+ : `You are a ${title} specializing in ${title.toLowerCase()} tasks.`;
130
+
131
+ // Get relative path
132
+ const relativePath = path.relative(projectDir, artifact.sourcePath).replaceAll('\\', '/');
133
+
134
+ // Build mode object (KiloCode uses same schema as Roo)
135
+ return {
136
+ slug: `bmad-${artifact.module}-${artifact.name}`,
137
+ name: `${icon} ${title}`,
138
+ roleDefinition: roleDefinition,
139
+ whenToUse: whenToUse,
140
+ customInstructions: `${activationHeader} Read the full YAML from ${relativePath} start activation to alter your state of being follow startup section instructions stay in this being until told to exit this mode\n`,
141
+ groups: ['read', 'edit', 'browser', 'command', 'mcp'],
142
+ };
143
+ }
144
+
145
+ /**
146
+ * Format name as title
147
+ */
148
+ formatTitle(name) {
149
+ return name
150
+ .split('-')
151
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
152
+ .join(' ');
153
+ }
154
+
155
+ /**
156
+ * Clear old BMAD workflow files from workflows directory
157
+ * @param {string} workflowsDir - Workflows directory path
158
+ */
159
+ async clearBmadWorkflows(workflowsDir) {
160
+ const fs = require('fs-extra');
161
+ if (!(await fs.pathExists(workflowsDir))) return;
162
+
163
+ const entries = await fs.readdir(workflowsDir);
164
+ for (const entry of entries) {
165
+ if (entry.startsWith('bmad-') && entry.endsWith('.md')) {
166
+ await fs.remove(path.join(workflowsDir, entry));
167
+ }
168
+ }
169
+ }
170
+
171
+ /**
172
+ * Cleanup KiloCode configuration
173
+ */
174
+ async cleanup(projectDir, options = {}) {
175
+ const fs = require('fs-extra');
176
+ const kiloModesPath = path.join(projectDir, this.configFile);
177
+
178
+ if (await fs.pathExists(kiloModesPath)) {
179
+ const content = await fs.readFile(kiloModesPath, 'utf8');
180
+
181
+ try {
182
+ const config = yaml.parse(content) || {};
183
+
184
+ if (Array.isArray(config.customModes)) {
185
+ const originalCount = config.customModes.length;
186
+ // Remove BMAD modes only (keep non-BMAD modes)
187
+ config.customModes = config.customModes.filter((mode) => !mode.slug || !mode.slug.startsWith('bmad-'));
188
+ const removedCount = originalCount - config.customModes.length;
189
+
190
+ if (removedCount > 0) {
191
+ await fs.writeFile(kiloModesPath, yaml.stringify(config, { lineWidth: 0 }));
192
+ if (!options.silent) await prompts.log.message(`Removed ${removedCount} BMAD modes from .kilocodemodes`);
193
+ }
194
+ }
195
+ } catch {
196
+ // If parsing fails, leave file as-is
197
+ if (!options.silent) await prompts.log.warn('Warning: Could not parse .kilocodemodes for cleanup');
198
+ }
199
+ }
200
+
201
+ // Clean up workflow files
202
+ const workflowsDir = path.join(projectDir, '.kilocode', 'workflows');
203
+ await this.clearBmadWorkflows(workflowsDir);
204
+ }
205
+
206
+ /**
207
+ * Install a custom agent launcher for Kilo
208
+ * @param {string} projectDir - Project directory
209
+ * @param {string} agentName - Agent name (e.g., "fred-commit-poet")
210
+ * @param {string} agentPath - Path to compiled agent (relative to project root)
211
+ * @param {Object} metadata - Agent metadata
212
+ * @returns {Object} Installation result
213
+ */
214
+ async installCustomAgentLauncher(projectDir, agentName, agentPath, metadata) {
215
+ const kilocodemodesPath = path.join(projectDir, this.configFile);
216
+ let config = {};
217
+
218
+ // Read existing .kilocodemodes file
219
+ if (await this.pathExists(kilocodemodesPath)) {
220
+ const existingContent = await this.readFile(kilocodemodesPath);
221
+ try {
222
+ config = yaml.parse(existingContent) || {};
223
+ } catch {
224
+ config = {};
225
+ }
226
+ }
227
+
228
+ // Ensure customModes array exists
229
+ if (!Array.isArray(config.customModes)) {
230
+ config.customModes = [];
231
+ }
232
+
233
+ // Create custom agent mode object
234
+ const slug = `bmad-custom-${agentName.toLowerCase()}`;
235
+
236
+ // Check if mode already exists
237
+ if (config.customModes.some((mode) => mode.slug === slug)) {
238
+ return {
239
+ ide: 'kilo',
240
+ path: this.configFile,
241
+ command: agentName,
242
+ type: 'custom-agent-launcher',
243
+ alreadyExists: true,
244
+ };
245
+ }
246
+
247
+ // Add custom mode object
248
+ config.customModes.push({
249
+ slug: slug,
250
+ name: `BMAD Custom: ${agentName}`,
251
+ description: `Custom BMAD agent: ${agentName}\n\n**⚠️ IMPORTANT**: Run @${agentPath} first to load the complete agent!\n\nThis is a launcher for the custom BMAD agent "${agentName}". The agent will follow the persona and instructions from the main agent file.\n`,
252
+ prompt: `@${agentPath}\n`,
253
+ always: false,
254
+ permissions: 'all',
255
+ });
256
+
257
+ // Write .kilocodemodes file with proper YAML structure
258
+ await this.writeFile(kilocodemodesPath, yaml.stringify(config, { lineWidth: 0 }));
259
+
260
+ return {
261
+ ide: 'kilo',
262
+ path: this.configFile,
263
+ command: slug,
264
+ type: 'custom-agent-launcher',
265
+ };
266
+ }
267
+ }
268
+
269
+ module.exports = { KiloSetup };
@@ -0,0 +1,342 @@
1
+ const fs = require('fs-extra');
2
+ const path = require('node:path');
3
+ const { BMAD_FOLDER_NAME } = require('./shared/path-utils');
4
+ const prompts = require('../../../lib/prompts');
5
+
6
+ /**
7
+ * IDE Manager - handles IDE-specific setup
8
+ * Dynamically discovers and loads IDE handlers
9
+ *
10
+ * Loading strategy:
11
+ * 1. Custom installer files (codex.js, github-copilot.js, kilo.js, rovodev.js) - for platforms with unique installation logic
12
+ * 2. Config-driven handlers (from platform-codes.yaml) - for standard IDE installation patterns
13
+ */
14
+ class IdeManager {
15
+ constructor() {
16
+ this.handlers = new Map();
17
+ this._initialized = false;
18
+ this.bmadFolderName = BMAD_FOLDER_NAME; // Default, can be overridden
19
+ }
20
+
21
+ /**
22
+ * Set the bmad folder name for all IDE handlers
23
+ * @param {string} bmadFolderName - The bmad folder name
24
+ */
25
+ setBmadFolderName(bmadFolderName) {
26
+ this.bmadFolderName = bmadFolderName;
27
+ // Update all loaded handlers
28
+ for (const handler of this.handlers.values()) {
29
+ if (typeof handler.setBmadFolderName === 'function') {
30
+ handler.setBmadFolderName(bmadFolderName);
31
+ }
32
+ }
33
+ }
34
+
35
+ /**
36
+ * Ensure handlers are loaded (lazy loading)
37
+ */
38
+ async ensureInitialized() {
39
+ if (!this._initialized) {
40
+ await this.loadHandlers();
41
+ this._initialized = true;
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Dynamically load all IDE handlers
47
+ * 1. Load custom installer files first (codex.js, github-copilot.js, kilo.js, rovodev.js)
48
+ * 2. Load config-driven handlers from platform-codes.yaml
49
+ */
50
+ async loadHandlers() {
51
+ // Load custom installer files
52
+ await this.loadCustomInstallerFiles();
53
+
54
+ // Load config-driven handlers from platform-codes.yaml
55
+ await this.loadConfigDrivenHandlers();
56
+ }
57
+
58
+ /**
59
+ * Load custom installer files (unique installation logic)
60
+ * These files have special installation patterns that don't fit the config-driven model
61
+ */
62
+ async loadCustomInstallerFiles() {
63
+ const ideDir = __dirname;
64
+ const customFiles = ['codex.js', 'github-copilot.js', 'kilo.js', 'rovodev.js'];
65
+
66
+ for (const file of customFiles) {
67
+ const filePath = path.join(ideDir, file);
68
+ if (!fs.existsSync(filePath)) continue;
69
+
70
+ try {
71
+ const HandlerModule = require(filePath);
72
+ const HandlerClass = HandlerModule.default || Object.values(HandlerModule)[0];
73
+
74
+ if (HandlerClass) {
75
+ const instance = new HandlerClass();
76
+ if (instance.name && typeof instance.name === 'string') {
77
+ if (typeof instance.setBmadFolderName === 'function') {
78
+ instance.setBmadFolderName(this.bmadFolderName);
79
+ }
80
+ this.handlers.set(instance.name, instance);
81
+ }
82
+ }
83
+ } catch (error) {
84
+ await prompts.log.warn(`Warning: Could not load ${file}: ${error.message}`);
85
+ }
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Load config-driven handlers from platform-codes.yaml
91
+ * This creates ConfigDrivenIdeSetup instances for platforms with installer config
92
+ */
93
+ async loadConfigDrivenHandlers() {
94
+ const { loadPlatformCodes } = require('./platform-codes');
95
+ const platformConfig = await loadPlatformCodes();
96
+
97
+ const { ConfigDrivenIdeSetup } = require('./_config-driven');
98
+
99
+ for (const [platformCode, platformInfo] of Object.entries(platformConfig.platforms)) {
100
+ // Skip if already loaded by custom installer
101
+ if (this.handlers.has(platformCode)) continue;
102
+
103
+ // Skip if no installer config (platform may not need installation)
104
+ if (!platformInfo.installer) continue;
105
+
106
+ const handler = new ConfigDrivenIdeSetup(platformCode, platformInfo);
107
+ if (typeof handler.setBmadFolderName === 'function') {
108
+ handler.setBmadFolderName(this.bmadFolderName);
109
+ }
110
+ this.handlers.set(platformCode, handler);
111
+ }
112
+ }
113
+
114
+ /**
115
+ * Get all available IDEs with their metadata
116
+ * @returns {Array} Array of IDE information objects
117
+ */
118
+ getAvailableIdes() {
119
+ const ides = [];
120
+
121
+ for (const [key, handler] of this.handlers) {
122
+ // Skip handlers without valid names
123
+ const name = handler.displayName || handler.name || key;
124
+
125
+ // Filter out invalid entries (undefined name, empty key, etc.)
126
+ if (!key || !name || typeof key !== 'string' || typeof name !== 'string') {
127
+ continue;
128
+ }
129
+
130
+ ides.push({
131
+ value: key,
132
+ name: name,
133
+ preferred: handler.preferred || false,
134
+ });
135
+ }
136
+
137
+ // Sort: preferred first, then alphabetical
138
+ ides.sort((a, b) => {
139
+ if (a.preferred && !b.preferred) return -1;
140
+ if (!a.preferred && b.preferred) return 1;
141
+ return a.name.localeCompare(b.name);
142
+ });
143
+
144
+ return ides;
145
+ }
146
+
147
+ /**
148
+ * Get preferred IDEs
149
+ * @returns {Array} Array of preferred IDE information
150
+ */
151
+ getPreferredIdes() {
152
+ return this.getAvailableIdes().filter((ide) => ide.preferred);
153
+ }
154
+
155
+ /**
156
+ * Get non-preferred IDEs
157
+ * @returns {Array} Array of non-preferred IDE information
158
+ */
159
+ getOtherIdes() {
160
+ return this.getAvailableIdes().filter((ide) => !ide.preferred);
161
+ }
162
+
163
+ /**
164
+ * Setup IDE configuration
165
+ * @param {string} ideName - Name of the IDE
166
+ * @param {string} projectDir - Project directory
167
+ * @param {string} bmadDir - BMAD installation directory
168
+ * @param {Object} options - Setup options
169
+ */
170
+ async setup(ideName, projectDir, bmadDir, options = {}) {
171
+ const handler = this.handlers.get(ideName.toLowerCase());
172
+
173
+ if (!handler) {
174
+ await prompts.log.warn(`IDE '${ideName}' is not yet supported`);
175
+ await prompts.log.message(`Supported IDEs: ${[...this.handlers.keys()].join(', ')}`);
176
+ return { success: false, ide: ideName, error: 'unsupported IDE' };
177
+ }
178
+
179
+ try {
180
+ const handlerResult = await handler.setup(projectDir, bmadDir, options);
181
+ // Build detail string from handler-returned data
182
+ let detail = '';
183
+ if (handlerResult && handlerResult.results) {
184
+ // Config-driven handlers return { success, results: { agents, workflows, tasks, tools } }
185
+ const r = handlerResult.results;
186
+ const parts = [];
187
+ if (r.agents > 0) parts.push(`${r.agents} agents`);
188
+ if (r.workflows > 0) parts.push(`${r.workflows} workflows`);
189
+ if (r.tasks > 0) parts.push(`${r.tasks} tasks`);
190
+ if (r.tools > 0) parts.push(`${r.tools} tools`);
191
+ detail = parts.join(', ');
192
+ } else if (handlerResult && handlerResult.counts) {
193
+ // Codex handler returns { success, counts: { agents, workflows, tasks }, written }
194
+ const c = handlerResult.counts;
195
+ const parts = [];
196
+ if (c.agents > 0) parts.push(`${c.agents} agents`);
197
+ if (c.workflows > 0) parts.push(`${c.workflows} workflows`);
198
+ if (c.tasks > 0) parts.push(`${c.tasks} tasks`);
199
+ detail = parts.join(', ');
200
+ } else if (handlerResult && handlerResult.modes !== undefined) {
201
+ // Kilo handler returns { success, modes, workflows, tasks, tools }
202
+ const parts = [];
203
+ if (handlerResult.modes > 0) parts.push(`${handlerResult.modes} modes`);
204
+ if (handlerResult.workflows > 0) parts.push(`${handlerResult.workflows} workflows`);
205
+ if (handlerResult.tasks > 0) parts.push(`${handlerResult.tasks} tasks`);
206
+ if (handlerResult.tools > 0) parts.push(`${handlerResult.tools} tools`);
207
+ detail = parts.join(', ');
208
+ }
209
+ // Propagate handler's success status (default true for backward compat)
210
+ const success = handlerResult?.success !== false;
211
+ return { success, ide: ideName, detail, error: handlerResult?.error, handlerResult };
212
+ } catch (error) {
213
+ await prompts.log.error(`Failed to setup ${ideName}: ${error.message}`);
214
+ return { success: false, ide: ideName, error: error.message };
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Cleanup IDE configurations
220
+ * @param {string} projectDir - Project directory
221
+ * @param {Object} [options] - Cleanup options passed through to handlers
222
+ */
223
+ async cleanup(projectDir, options = {}) {
224
+ const results = [];
225
+
226
+ for (const [name, handler] of this.handlers) {
227
+ try {
228
+ await handler.cleanup(projectDir, options);
229
+ results.push({ ide: name, success: true });
230
+ } catch (error) {
231
+ results.push({ ide: name, success: false, error: error.message });
232
+ }
233
+ }
234
+
235
+ return results;
236
+ }
237
+
238
+ /**
239
+ * Cleanup only the IDEs in the provided list
240
+ * Falls back to cleanup() (all handlers) if ideList is empty or undefined
241
+ * @param {string} projectDir - Project directory
242
+ * @param {Array<string>} ideList - List of IDE names to clean up
243
+ * @param {Object} [options] - Cleanup options passed through to handlers
244
+ * @returns {Array} Results array
245
+ */
246
+ async cleanupByList(projectDir, ideList, options = {}) {
247
+ if (!ideList || ideList.length === 0) {
248
+ return this.cleanup(projectDir, options);
249
+ }
250
+
251
+ await this.ensureInitialized();
252
+ const results = [];
253
+
254
+ // Build lowercase lookup for case-insensitive matching
255
+ const lowercaseHandlers = new Map([...this.handlers.entries()].map(([k, v]) => [k.toLowerCase(), v]));
256
+
257
+ for (const ideName of ideList) {
258
+ const handler = lowercaseHandlers.get(ideName.toLowerCase());
259
+ if (!handler) continue;
260
+
261
+ try {
262
+ await handler.cleanup(projectDir, options);
263
+ results.push({ ide: ideName, success: true });
264
+ } catch (error) {
265
+ results.push({ ide: ideName, success: false, error: error.message });
266
+ }
267
+ }
268
+
269
+ return results;
270
+ }
271
+
272
+ /**
273
+ * Get list of supported IDEs
274
+ * @returns {Array} List of supported IDE names
275
+ */
276
+ getSupportedIdes() {
277
+ return [...this.handlers.keys()];
278
+ }
279
+
280
+ /**
281
+ * Check if an IDE is supported
282
+ * @param {string} ideName - Name of the IDE
283
+ * @returns {boolean} True if IDE is supported
284
+ */
285
+ isSupported(ideName) {
286
+ return this.handlers.has(ideName.toLowerCase());
287
+ }
288
+
289
+ /**
290
+ * Detect installed IDEs
291
+ * @param {string} projectDir - Project directory
292
+ * @returns {Array} List of detected IDEs
293
+ */
294
+ async detectInstalledIdes(projectDir) {
295
+ const detected = [];
296
+
297
+ for (const [name, handler] of this.handlers) {
298
+ if (typeof handler.detect === 'function' && (await handler.detect(projectDir))) {
299
+ detected.push(name);
300
+ }
301
+ }
302
+
303
+ return detected;
304
+ }
305
+
306
+ /**
307
+ * Install custom agent launchers for specified IDEs
308
+ * @param {Array} ides - List of IDE names to install for
309
+ * @param {string} projectDir - Project directory
310
+ * @param {string} agentName - Agent name (e.g., "fred-commit-poet")
311
+ * @param {string} agentPath - Path to compiled agent (relative to project root)
312
+ * @param {Object} metadata - Agent metadata
313
+ * @returns {Object} Results for each IDE
314
+ */
315
+ async installCustomAgentLaunchers(ides, projectDir, agentName, agentPath, metadata) {
316
+ const results = {};
317
+
318
+ for (const ideName of ides) {
319
+ const handler = this.handlers.get(ideName.toLowerCase());
320
+
321
+ if (!handler) {
322
+ await prompts.log.warn(`IDE '${ideName}' is not yet supported for custom agent installation`);
323
+ continue;
324
+ }
325
+
326
+ try {
327
+ if (typeof handler.installCustomAgentLauncher === 'function') {
328
+ const result = await handler.installCustomAgentLauncher(projectDir, agentName, agentPath, metadata);
329
+ if (result) {
330
+ results[ideName] = result;
331
+ }
332
+ }
333
+ } catch (error) {
334
+ await prompts.log.warn(`Failed to install ${ideName} launcher: ${error.message}`);
335
+ }
336
+ }
337
+
338
+ return results;
339
+ }
340
+ }
341
+
342
+ module.exports = { IdeManager };
@@ -0,0 +1,100 @@
1
+ const fs = require('fs-extra');
2
+ const path = require('node:path');
3
+ const yaml = require('yaml');
4
+
5
+ const PLATFORM_CODES_PATH = path.join(__dirname, 'platform-codes.yaml');
6
+
7
+ let _cachedPlatformCodes = null;
8
+
9
+ /**
10
+ * Load the platform codes configuration from YAML
11
+ * @returns {Object} Platform codes configuration
12
+ */
13
+ async function loadPlatformCodes() {
14
+ if (_cachedPlatformCodes) {
15
+ return _cachedPlatformCodes;
16
+ }
17
+
18
+ if (!(await fs.pathExists(PLATFORM_CODES_PATH))) {
19
+ throw new Error(`Platform codes configuration not found at: ${PLATFORM_CODES_PATH}`);
20
+ }
21
+
22
+ const content = await fs.readFile(PLATFORM_CODES_PATH, 'utf8');
23
+ _cachedPlatformCodes = yaml.parse(content);
24
+ return _cachedPlatformCodes;
25
+ }
26
+
27
+ /**
28
+ * Get platform information by code
29
+ * @param {string} platformCode - Platform code (e.g., 'claude-code', 'cursor')
30
+ * @returns {Object|null} Platform info or null if not found
31
+ */
32
+ function getPlatformInfo(platformCode) {
33
+ if (!_cachedPlatformCodes) {
34
+ throw new Error('Platform codes not loaded. Call loadPlatformCodes() first.');
35
+ }
36
+
37
+ return _cachedPlatformCodes.platforms[platformCode] || null;
38
+ }
39
+
40
+ /**
41
+ * Get all preferred platforms
42
+ * @returns {Promise<Array>} Array of preferred platform codes
43
+ */
44
+ async function getPreferredPlatforms() {
45
+ const config = await loadPlatformCodes();
46
+ return Object.entries(config.platforms)
47
+ .filter(([_, info]) => info.preferred)
48
+ .map(([code, _]) => code);
49
+ }
50
+
51
+ /**
52
+ * Get all platform codes by category
53
+ * @param {string} category - Category to filter by (ide, cli, tool, etc.)
54
+ * @returns {Promise<Array>} Array of platform codes in the category
55
+ */
56
+ async function getPlatformsByCategory(category) {
57
+ const config = await loadPlatformCodes();
58
+ return Object.entries(config.platforms)
59
+ .filter(([_, info]) => info.category === category)
60
+ .map(([code, _]) => code);
61
+ }
62
+
63
+ /**
64
+ * Get all platforms with installer config
65
+ * @returns {Promise<Array>} Array of platform codes that have installer config
66
+ */
67
+ async function getConfigDrivenPlatforms() {
68
+ const config = await loadPlatformCodes();
69
+ return Object.entries(config.platforms)
70
+ .filter(([_, info]) => info.installer)
71
+ .map(([code, _]) => code);
72
+ }
73
+
74
+ /**
75
+ * Get platforms that use custom installers (no installer config)
76
+ * @returns {Promise<Array>} Array of platform codes with custom installers
77
+ */
78
+ async function getCustomInstallerPlatforms() {
79
+ const config = await loadPlatformCodes();
80
+ return Object.entries(config.platforms)
81
+ .filter(([_, info]) => !info.installer)
82
+ .map(([code, _]) => code);
83
+ }
84
+
85
+ /**
86
+ * Clear the cached platform codes (useful for testing)
87
+ */
88
+ function clearCache() {
89
+ _cachedPlatformCodes = null;
90
+ }
91
+
92
+ module.exports = {
93
+ loadPlatformCodes,
94
+ getPlatformInfo,
95
+ getPreferredPlatforms,
96
+ getPlatformsByCategory,
97
+ getConfigDrivenPlatforms,
98
+ getCustomInstallerPlatforms,
99
+ clearCache,
100
+ };