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,809 @@
1
+ /**
2
+ * @clack/prompts wrapper for BMAD CLI
3
+ *
4
+ * This module provides a unified interface for CLI prompts using @clack/prompts.
5
+ * It replaces Inquirer.js to fix Windows arrow key navigation issues (libuv #852).
6
+ *
7
+ * @module prompts
8
+ */
9
+
10
+ let _clack = null;
11
+ let _clackCore = null;
12
+ let _picocolors = null;
13
+
14
+ /**
15
+ * Lazy-load @clack/prompts (ESM module)
16
+ * @returns {Promise<Object>} The clack prompts module
17
+ */
18
+ async function getClack() {
19
+ if (!_clack) {
20
+ _clack = await import('@clack/prompts');
21
+ }
22
+ return _clack;
23
+ }
24
+
25
+ /**
26
+ * Lazy-load @clack/core (ESM module)
27
+ * @returns {Promise<Object>} The clack core module
28
+ */
29
+ async function getClackCore() {
30
+ if (!_clackCore) {
31
+ _clackCore = await import('@clack/core');
32
+ }
33
+ return _clackCore;
34
+ }
35
+
36
+ /**
37
+ * Lazy-load picocolors
38
+ * @returns {Promise<Object>} The picocolors module
39
+ */
40
+ async function getPicocolors() {
41
+ if (!_picocolors) {
42
+ _picocolors = (await import('picocolors')).default;
43
+ }
44
+ return _picocolors;
45
+ }
46
+
47
+ /**
48
+ * Handle user cancellation gracefully
49
+ * @param {any} value - The value to check
50
+ * @param {string} [message='Operation cancelled'] - Message to display
51
+ * @returns {boolean} True if cancelled
52
+ */
53
+ async function handleCancel(value, message = 'Operation cancelled') {
54
+ const clack = await getClack();
55
+ if (clack.isCancel(value)) {
56
+ clack.cancel(message);
57
+ process.exit(0);
58
+ }
59
+ return false;
60
+ }
61
+
62
+ /**
63
+ * Display intro message
64
+ * @param {string} message - The intro message
65
+ */
66
+ async function intro(message) {
67
+ const clack = await getClack();
68
+ clack.intro(message);
69
+ }
70
+
71
+ /**
72
+ * Display outro message
73
+ * @param {string} message - The outro message
74
+ */
75
+ async function outro(message) {
76
+ const clack = await getClack();
77
+ clack.outro(message);
78
+ }
79
+
80
+ /**
81
+ * Display a note/info box
82
+ * @param {string} message - The note content
83
+ * @param {string} [title] - Optional title
84
+ */
85
+ async function note(message, title) {
86
+ const clack = await getClack();
87
+ clack.note(message, title);
88
+ }
89
+
90
+ /**
91
+ * Display a spinner for async operations
92
+ * Wraps @clack/prompts spinner with isSpinning state tracking
93
+ * @returns {Object} Spinner controller with start, stop, message, error, cancel, clear, isSpinning
94
+ */
95
+ async function spinner() {
96
+ const clack = await getClack();
97
+ const s = clack.spinner();
98
+ let spinning = false;
99
+
100
+ return {
101
+ start: (msg) => {
102
+ if (spinning) {
103
+ s.message(msg);
104
+ } else {
105
+ spinning = true;
106
+ s.start(msg);
107
+ }
108
+ },
109
+ stop: (msg) => {
110
+ if (spinning) {
111
+ spinning = false;
112
+ s.stop(msg);
113
+ }
114
+ },
115
+ message: (msg) => {
116
+ if (spinning) s.message(msg);
117
+ },
118
+ error: (msg) => {
119
+ spinning = false;
120
+ s.error(msg);
121
+ },
122
+ cancel: (msg) => {
123
+ spinning = false;
124
+ s.cancel(msg);
125
+ },
126
+ clear: () => {
127
+ spinning = false;
128
+ s.clear();
129
+ },
130
+ get isSpinning() {
131
+ return spinning;
132
+ },
133
+ get isCancelled() {
134
+ return s.isCancelled;
135
+ },
136
+ };
137
+ }
138
+
139
+ /**
140
+ * Single-select prompt (replaces Inquirer 'list' type)
141
+ * @param {Object} options - Prompt options
142
+ * @param {string} options.message - The question to ask
143
+ * @param {Array} options.choices - Array of choices [{name, value, hint?}]
144
+ * @param {any} [options.default] - Default selected value
145
+ * @returns {Promise<any>} Selected value
146
+ */
147
+ async function select(options) {
148
+ const clack = await getClack();
149
+
150
+ // Convert Inquirer-style choices to clack format
151
+ // Handle both object choices {name, value, hint} and primitive choices (string/number)
152
+ const clackOptions = options.choices
153
+ .filter((c) => c.type !== 'separator') // Skip separators for now
154
+ .map((choice) => {
155
+ if (typeof choice === 'string' || typeof choice === 'number') {
156
+ return { value: choice, label: String(choice) };
157
+ }
158
+ return {
159
+ value: choice.value === undefined ? choice.name : choice.value,
160
+ label: choice.name || choice.label || String(choice.value),
161
+ hint: choice.hint || choice.description,
162
+ };
163
+ });
164
+
165
+ // Find initial value
166
+ let initialValue;
167
+ if (options.default !== undefined) {
168
+ initialValue = options.default;
169
+ }
170
+
171
+ const result = await clack.select({
172
+ message: options.message,
173
+ options: clackOptions,
174
+ initialValue,
175
+ });
176
+
177
+ await handleCancel(result);
178
+ return result;
179
+ }
180
+
181
+ /**
182
+ * Multi-select prompt (replaces Inquirer 'checkbox' type)
183
+ * @param {Object} options - Prompt options
184
+ * @param {string} options.message - The question to ask
185
+ * @param {Array} options.choices - Array of choices [{name, value, checked?, hint?}]
186
+ * @param {boolean} [options.required=false] - Whether at least one must be selected
187
+ * @returns {Promise<Array>} Array of selected values
188
+ */
189
+ async function multiselect(options) {
190
+ const clack = await getClack();
191
+
192
+ // Support both clack-native (options) and Inquirer-style (choices) APIs
193
+ let clackOptions;
194
+ let initialValues;
195
+
196
+ if (options.options) {
197
+ // Native clack format: options with label/value
198
+ clackOptions = options.options;
199
+ initialValues = options.initialValues || [];
200
+ } else {
201
+ // Convert Inquirer-style choices to clack format
202
+ // Handle both object choices {name, value, hint} and primitive choices (string/number)
203
+ clackOptions = options.choices
204
+ .filter((c) => c.type !== 'separator') // Skip separators
205
+ .map((choice) => {
206
+ if (typeof choice === 'string' || typeof choice === 'number') {
207
+ return { value: choice, label: String(choice) };
208
+ }
209
+ return {
210
+ value: choice.value === undefined ? choice.name : choice.value,
211
+ label: choice.name || choice.label || String(choice.value),
212
+ hint: choice.hint || choice.description,
213
+ };
214
+ });
215
+
216
+ // Find initial values (pre-checked items)
217
+ initialValues = options.choices
218
+ .filter((c) => c.checked && c.type !== 'separator')
219
+ .map((c) => (c.value === undefined ? c.name : c.value));
220
+ }
221
+
222
+ const result = await clack.multiselect({
223
+ message: options.message,
224
+ options: clackOptions,
225
+ initialValues: initialValues.length > 0 ? initialValues : undefined,
226
+ required: options.required || false,
227
+ });
228
+
229
+ await handleCancel(result);
230
+ return result;
231
+ }
232
+
233
+ /**
234
+ * Default filter function for autocomplete - case-insensitive label matching
235
+ * @param {string} search - Search string
236
+ * @param {Object} option - Option object with label
237
+ * @returns {boolean} Whether the option matches
238
+ */
239
+ function defaultAutocompleteFilter(search, option) {
240
+ const label = option.label ?? String(option.value ?? '');
241
+ return label.toLowerCase().includes(search.toLowerCase());
242
+ }
243
+
244
+ /**
245
+ * Autocomplete multi-select prompt with type-ahead filtering
246
+ * Custom implementation that always shows "Space/Tab:" in the hint
247
+ * @param {Object} options - Prompt options
248
+ * @param {string} options.message - The question to ask
249
+ * @param {Array} options.options - Array of choices [{label, value, hint?}]
250
+ * @param {string} [options.placeholder] - Placeholder text for search input
251
+ * @param {Array} [options.initialValues] - Array of initially selected values
252
+ * @param {boolean} [options.required=false] - Whether at least one must be selected
253
+ * @param {number} [options.maxItems=5] - Maximum visible items in scrollable list
254
+ * @param {Function} [options.filter] - Custom filter function (search, option) => boolean
255
+ * @param {Array} [options.lockedValues] - Values that are always selected and cannot be toggled off
256
+ * @returns {Promise<Array>} Array of selected values
257
+ */
258
+ async function autocompleteMultiselect(options) {
259
+ const core = await getClackCore();
260
+ const clack = await getClack();
261
+ const color = await getPicocolors();
262
+
263
+ const filterFn = options.filter ?? defaultAutocompleteFilter;
264
+ const lockedSet = new Set(options.lockedValues || []);
265
+
266
+ const prompt = new core.AutocompletePrompt({
267
+ options: options.options,
268
+ multiple: true,
269
+ filter: filterFn,
270
+ validate: () => {
271
+ if (options.required && prompt.selectedValues.length === 0) {
272
+ return 'Please select at least one item';
273
+ }
274
+ },
275
+ initialValue: [...new Set([...(options.initialValues || []), ...(options.lockedValues || [])])],
276
+ render() {
277
+ const barColor = this.state === 'error' ? color.yellow : color.cyan;
278
+ const bar = barColor(clack.S_BAR);
279
+ const barEnd = barColor(clack.S_BAR_END);
280
+
281
+ const title = `${color.gray(clack.S_BAR)}\n${clack.symbol(this.state)} ${options.message}\n`;
282
+
283
+ const userInput = this.userInput;
284
+ const placeholder = options.placeholder || 'Type to search...';
285
+ const hasPlaceholder = userInput === '' && placeholder !== undefined;
286
+
287
+ // Show placeholder or user input with cursor
288
+ const searchDisplay =
289
+ this.isNavigating || hasPlaceholder ? color.dim(hasPlaceholder ? placeholder : userInput) : this.userInputWithCursor;
290
+
291
+ const allOptions = this.options;
292
+ const matchCount =
293
+ this.filteredOptions.length === allOptions.length
294
+ ? ''
295
+ : color.dim(` (${this.filteredOptions.length} match${this.filteredOptions.length === 1 ? '' : 'es'})`);
296
+
297
+ // Render option with checkbox
298
+ const renderOption = (opt, isHighlighted) => {
299
+ const isSelected = this.selectedValues.includes(opt.value);
300
+ const isLocked = lockedSet.has(opt.value);
301
+ const label = opt.label ?? String(opt.value ?? '');
302
+ const hintText = opt.hint && isHighlighted ? color.dim(` (${opt.hint})`) : '';
303
+
304
+ let checkbox;
305
+ if (isLocked) {
306
+ checkbox = color.green(clack.S_CHECKBOX_SELECTED);
307
+ const lockHint = color.dim(' (always installed)');
308
+ return isHighlighted ? `${checkbox} ${label}${lockHint}` : `${checkbox} ${color.dim(label)}${lockHint}`;
309
+ }
310
+ checkbox = isSelected ? color.green(clack.S_CHECKBOX_SELECTED) : color.dim(clack.S_CHECKBOX_INACTIVE);
311
+ return isHighlighted ? `${checkbox} ${label}${hintText}` : `${checkbox} ${color.dim(label)}`;
312
+ };
313
+
314
+ switch (this.state) {
315
+ case 'submit': {
316
+ return `${title}${color.gray(clack.S_BAR)} ${color.dim(`${this.selectedValues.length} items selected`)}`;
317
+ }
318
+
319
+ case 'cancel': {
320
+ return `${title}${color.gray(clack.S_BAR)} ${color.strikethrough(color.dim(userInput))}`;
321
+ }
322
+
323
+ default: {
324
+ // Always show "SPACE:" regardless of isNavigating state
325
+ const hints = [`${color.dim('↑/↓')} to navigate`, `${color.dim('TAB/SPACE:')} select`, `${color.dim('ENTER:')} confirm`];
326
+
327
+ const noMatchesLine = this.filteredOptions.length === 0 && userInput ? [`${bar} ${color.yellow('No matches found')}`] : [];
328
+
329
+ const errorLine = this.state === 'error' ? [`${bar} ${color.yellow(this.error)}`] : [];
330
+
331
+ const headerLines = [...`${title}${bar}`.split('\n'), `${bar} ${searchDisplay}${matchCount}`, ...noMatchesLine, ...errorLine];
332
+
333
+ const footerLines = [`${bar} ${color.dim(hints.join(' • '))}`, `${barEnd}`];
334
+
335
+ const optionLines = clack.limitOptions({
336
+ cursor: this.cursor,
337
+ options: this.filteredOptions,
338
+ style: renderOption,
339
+ maxItems: options.maxItems || 5,
340
+ output: options.output,
341
+ rowPadding: headerLines.length + footerLines.length,
342
+ });
343
+
344
+ return [...headerLines, ...optionLines.map((line) => `${bar} ${line}`), ...footerLines].join('\n');
345
+ }
346
+ }
347
+ },
348
+ });
349
+
350
+ // Prevent locked values from being toggled off
351
+ if (lockedSet.size > 0) {
352
+ const originalToggle = prompt.toggleSelected.bind(prompt);
353
+ prompt.toggleSelected = function (value) {
354
+ // If locked and already selected, skip the toggle (would deselect)
355
+ if (lockedSet.has(value) && this.selectedValues.includes(value)) {
356
+ return;
357
+ }
358
+ originalToggle(value);
359
+ };
360
+ }
361
+
362
+ // === FIX: Make SPACE always act as selection key (not search input) ===
363
+ // Override _isActionKey to treat SPACE like TAB - always an action key
364
+ // This prevents SPACE from being added to the search input
365
+ const originalIsActionKey = prompt._isActionKey.bind(prompt);
366
+ prompt._isActionKey = function (char, key) {
367
+ if (key && key.name === 'space') {
368
+ return true;
369
+ }
370
+ return originalIsActionKey(char, key);
371
+ };
372
+
373
+ // Handle SPACE toggle when NOT navigating (internal code only handles it when isNavigating=true)
374
+ prompt.on('key', (char, key) => {
375
+ if (key && key.name === 'space' && !prompt.isNavigating) {
376
+ const focused = prompt.filteredOptions[prompt.cursor];
377
+ if (focused) prompt.toggleSelected(focused.value);
378
+ }
379
+ });
380
+ // === END FIX ===
381
+
382
+ const result = await prompt.prompt();
383
+ await handleCancel(result);
384
+ return result;
385
+ }
386
+
387
+ /**
388
+ * Confirm prompt (replaces Inquirer 'confirm' type)
389
+ * @param {Object} options - Prompt options
390
+ * @param {string} options.message - The question to ask
391
+ * @param {boolean} [options.default=true] - Default value
392
+ * @returns {Promise<boolean>} User's answer
393
+ */
394
+ async function confirm(options) {
395
+ const clack = await getClack();
396
+
397
+ const result = await clack.confirm({
398
+ message: options.message,
399
+ initialValue: options.default === undefined ? true : options.default,
400
+ });
401
+
402
+ await handleCancel(result);
403
+ return result;
404
+ }
405
+
406
+ /**
407
+ * Text input prompt with Tab-to-fill-placeholder support (replaces Inquirer 'input' type)
408
+ *
409
+ * This custom implementation restores the Tab-to-fill-placeholder behavior that was
410
+ * intentionally removed in @clack/prompts v1.0.0 (placeholder became purely visual).
411
+ * Uses @clack/core's TextPrompt primitive with custom key handling.
412
+ *
413
+ * @param {Object} options - Prompt options
414
+ * @param {string} options.message - The question to ask
415
+ * @param {string} [options.default] - Default value
416
+ * @param {string} [options.placeholder] - Placeholder text (defaults to options.default if not provided)
417
+ * @param {Function} [options.validate] - Validation function
418
+ * @returns {Promise<string>} User's input
419
+ */
420
+ async function text(options) {
421
+ const core = await getClackCore();
422
+ const color = await getPicocolors();
423
+
424
+ // Use default as placeholder if placeholder not explicitly provided
425
+ // This shows the default value as grayed-out hint text
426
+ const placeholder = options.placeholder === undefined ? options.default : options.placeholder;
427
+ const defaultValue = options.default;
428
+
429
+ const prompt = new core.TextPrompt({
430
+ defaultValue,
431
+ validate: options.validate,
432
+ render() {
433
+ const title = `${color.gray('◆')} ${options.message}`;
434
+
435
+ // Show placeholder as dim text when input is empty
436
+ let valueDisplay;
437
+ if (this.state === 'error') {
438
+ valueDisplay = color.yellow(this.userInputWithCursor);
439
+ } else if (this.userInput) {
440
+ valueDisplay = this.userInputWithCursor;
441
+ } else if (placeholder) {
442
+ // Show placeholder with cursor indicator when empty
443
+ valueDisplay = `${color.inverse(color.hidden('_'))}${color.dim(placeholder)}`;
444
+ } else {
445
+ valueDisplay = color.inverse(color.hidden('_'));
446
+ }
447
+
448
+ const bar = color.gray('│');
449
+
450
+ // Handle different states
451
+ if (this.state === 'submit') {
452
+ return `${color.gray('◇')} ${options.message}\n${bar} ${color.dim(this.value || defaultValue || '')}`;
453
+ }
454
+
455
+ if (this.state === 'cancel') {
456
+ return `${color.gray('◇')} ${options.message}\n${bar} ${color.strikethrough(color.dim(this.userInput || ''))}`;
457
+ }
458
+
459
+ if (this.state === 'error') {
460
+ return `${color.yellow('▲')} ${options.message}\n${bar} ${valueDisplay}\n${color.yellow('│')} ${color.yellow(this.error)}`;
461
+ }
462
+
463
+ return `${title}\n${bar} ${valueDisplay}\n${bar}`;
464
+ },
465
+ });
466
+
467
+ // Add Tab key handler to fill placeholder into input
468
+ prompt.on('key', (char) => {
469
+ if (char === '\t' && placeholder && !prompt.userInput) {
470
+ // Use _setUserInput with write=true to populate the readline and update internal state
471
+ prompt._setUserInput(placeholder, true);
472
+ }
473
+ });
474
+
475
+ const result = await prompt.prompt();
476
+ await handleCancel(result);
477
+
478
+ // TextPrompt's finalize handler already applies defaultValue for empty input
479
+ return result;
480
+ }
481
+
482
+ /**
483
+ * Password input prompt (replaces Inquirer 'password' type)
484
+ * @param {Object} options - Prompt options
485
+ * @param {string} options.message - The question to ask
486
+ * @param {Function} [options.validate] - Validation function
487
+ * @returns {Promise<string>} User's input
488
+ */
489
+ async function password(options) {
490
+ const clack = await getClack();
491
+
492
+ const result = await clack.password({
493
+ message: options.message,
494
+ validate: options.validate,
495
+ });
496
+
497
+ await handleCancel(result);
498
+ return result;
499
+ }
500
+
501
+ /**
502
+ * Group multiple prompts together
503
+ * @param {Object} prompts - Object of prompt functions
504
+ * @param {Object} [options] - Group options
505
+ * @returns {Promise<Object>} Object with all answers
506
+ */
507
+ async function group(prompts, options = {}) {
508
+ const clack = await getClack();
509
+
510
+ const result = await clack.group(prompts, {
511
+ onCancel: () => {
512
+ clack.cancel('Operation cancelled');
513
+ process.exit(0);
514
+ },
515
+ ...options,
516
+ });
517
+
518
+ return result;
519
+ }
520
+
521
+ /**
522
+ * Run tasks with spinner feedback
523
+ * @param {Array} tasks - Array of task objects [{title, task, enabled?}]
524
+ * @returns {Promise<void>}
525
+ */
526
+ async function tasks(taskList) {
527
+ const clack = await getClack();
528
+ await clack.tasks(taskList);
529
+ }
530
+
531
+ /**
532
+ * Log messages with styling
533
+ */
534
+ const log = {
535
+ async info(message) {
536
+ const clack = await getClack();
537
+ clack.log.info(message);
538
+ },
539
+ async success(message) {
540
+ const clack = await getClack();
541
+ clack.log.success(message);
542
+ },
543
+ async warn(message) {
544
+ const clack = await getClack();
545
+ clack.log.warn(message);
546
+ },
547
+ async error(message) {
548
+ const clack = await getClack();
549
+ clack.log.error(message);
550
+ },
551
+ async message(message) {
552
+ const clack = await getClack();
553
+ clack.log.message(message);
554
+ },
555
+ async step(message) {
556
+ const clack = await getClack();
557
+ clack.log.step(message);
558
+ },
559
+ };
560
+
561
+ /**
562
+ * Display cancellation message
563
+ * @param {string} [message='Operation cancelled'] - The cancellation message
564
+ */
565
+ async function cancel(message = 'Operation cancelled') {
566
+ const clack = await getClack();
567
+ clack.cancel(message);
568
+ }
569
+
570
+ /**
571
+ * Display content in a styled box
572
+ * @param {string} content - The box content
573
+ * @param {string} [title] - Optional title
574
+ * @param {Object} [options] - Box options (contentAlign, titleAlign, width, rounded, formatBorder, etc.)
575
+ */
576
+ async function box(content, title, options) {
577
+ const clack = await getClack();
578
+ clack.box(content, title, options);
579
+ }
580
+
581
+ /**
582
+ * Create a progress bar for visualizing task completion
583
+ * @param {Object} [options] - Progress options (max, style, etc.)
584
+ * @returns {Promise<Object>} Progress controller with start, advance, stop methods
585
+ */
586
+ async function progress(options) {
587
+ const clack = await getClack();
588
+ return clack.progress(options);
589
+ }
590
+
591
+ /**
592
+ * Create a task log for displaying scrolling subprocess output
593
+ * @param {Object} options - TaskLog options (title, limit, retainLog)
594
+ * @returns {Promise<Object>} TaskLog controller with message, success, error methods
595
+ */
596
+ async function taskLog(options) {
597
+ const clack = await getClack();
598
+ return clack.taskLog(options);
599
+ }
600
+
601
+ /**
602
+ * File system path prompt with autocomplete
603
+ * @param {Object} options - Path options
604
+ * @param {string} options.message - The prompt message
605
+ * @param {string} [options.initialValue] - Initial path value
606
+ * @param {boolean} [options.directory=false] - Only allow directories
607
+ * @param {Function} [options.validate] - Validation function
608
+ * @returns {Promise<string>} Selected path
609
+ */
610
+ async function pathPrompt(options) {
611
+ const clack = await getClack();
612
+ const result = await clack.path(options);
613
+ await handleCancel(result);
614
+ return result;
615
+ }
616
+
617
+ /**
618
+ * Autocomplete single-select prompt with type-ahead filtering
619
+ * @param {Object} options - Autocomplete options
620
+ * @param {string} options.message - The prompt message
621
+ * @param {Array} options.options - Array of choices [{value, label, hint?}]
622
+ * @param {string} [options.placeholder] - Placeholder text
623
+ * @param {number} [options.maxItems] - Maximum visible items
624
+ * @param {Function} [options.filter] - Custom filter function
625
+ * @returns {Promise<any>} Selected value
626
+ */
627
+ async function autocomplete(options) {
628
+ const clack = await getClack();
629
+ const result = await clack.autocomplete(options);
630
+ await handleCancel(result);
631
+ return result;
632
+ }
633
+
634
+ /**
635
+ * Key-based instant selection prompt
636
+ * @param {Object} options - SelectKey options
637
+ * @param {string} options.message - The prompt message
638
+ * @param {Array} options.options - Array of choices [{value, label, hint?}]
639
+ * @returns {Promise<any>} Selected value
640
+ */
641
+ async function selectKey(options) {
642
+ const clack = await getClack();
643
+ const result = await clack.selectKey(options);
644
+ await handleCancel(result);
645
+ return result;
646
+ }
647
+
648
+ /**
649
+ * Stream messages with dynamic content (for LLMs, generators, etc.)
650
+ */
651
+ const stream = {
652
+ async info(generator) {
653
+ const clack = await getClack();
654
+ return clack.stream.info(generator);
655
+ },
656
+ async success(generator) {
657
+ const clack = await getClack();
658
+ return clack.stream.success(generator);
659
+ },
660
+ async step(generator) {
661
+ const clack = await getClack();
662
+ return clack.stream.step(generator);
663
+ },
664
+ async warn(generator) {
665
+ const clack = await getClack();
666
+ return clack.stream.warn(generator);
667
+ },
668
+ async error(generator) {
669
+ const clack = await getClack();
670
+ return clack.stream.error(generator);
671
+ },
672
+ async message(generator, options) {
673
+ const clack = await getClack();
674
+ return clack.stream.message(generator, options);
675
+ },
676
+ };
677
+
678
+ /**
679
+ * Get the color utility (picocolors instance from @clack/prompts)
680
+ * @returns {Promise<Object>} The color utility (picocolors)
681
+ */
682
+ async function getColor() {
683
+ return await getPicocolors();
684
+ }
685
+
686
+ /**
687
+ * Execute an array of Inquirer-style questions using @clack/prompts
688
+ * This provides compatibility with dynamic question arrays
689
+ * @param {Array} questions - Array of Inquirer-style question objects
690
+ * @returns {Promise<Object>} Object with answers keyed by question name
691
+ */
692
+ async function prompt(questions) {
693
+ const answers = {};
694
+
695
+ for (const question of questions) {
696
+ const { type, name, message, choices, default: defaultValue, validate, when } = question;
697
+
698
+ // Handle conditional questions via 'when' property
699
+ if (when !== undefined) {
700
+ const shouldAsk = typeof when === 'function' ? await when(answers) : when;
701
+ if (!shouldAsk) continue;
702
+ }
703
+
704
+ let answer;
705
+
706
+ switch (type) {
707
+ case 'input': {
708
+ // Note: @clack/prompts doesn't support async validation, so validate must be sync
709
+ answer = await text({
710
+ message,
711
+ default: typeof defaultValue === 'function' ? defaultValue(answers) : defaultValue,
712
+ validate: validate
713
+ ? (val) => {
714
+ const result = validate(val, answers);
715
+ if (result instanceof Promise) {
716
+ throw new TypeError('Async validation is not supported by @clack/prompts. Please use synchronous validation.');
717
+ }
718
+ return result === true ? undefined : result;
719
+ }
720
+ : undefined,
721
+ });
722
+ break;
723
+ }
724
+
725
+ case 'confirm': {
726
+ answer = await confirm({
727
+ message,
728
+ default: typeof defaultValue === 'function' ? defaultValue(answers) : defaultValue,
729
+ });
730
+ break;
731
+ }
732
+
733
+ case 'list': {
734
+ answer = await select({
735
+ message,
736
+ choices: choices || [],
737
+ default: typeof defaultValue === 'function' ? defaultValue(answers) : defaultValue,
738
+ });
739
+ break;
740
+ }
741
+
742
+ case 'checkbox': {
743
+ answer = await multiselect({
744
+ message,
745
+ choices: choices || [],
746
+ required: false,
747
+ });
748
+ break;
749
+ }
750
+
751
+ case 'password': {
752
+ // Note: @clack/prompts doesn't support async validation, so validate must be sync
753
+ answer = await password({
754
+ message,
755
+ validate: validate
756
+ ? (val) => {
757
+ const result = validate(val, answers);
758
+ if (result instanceof Promise) {
759
+ throw new TypeError('Async validation is not supported by @clack/prompts. Please use synchronous validation.');
760
+ }
761
+ return result === true ? undefined : result;
762
+ }
763
+ : undefined,
764
+ });
765
+ break;
766
+ }
767
+
768
+ default: {
769
+ // Default to text input for unknown types
770
+ answer = await text({
771
+ message,
772
+ default: typeof defaultValue === 'function' ? defaultValue(answers) : defaultValue,
773
+ });
774
+ }
775
+ }
776
+
777
+ answers[name] = answer;
778
+ }
779
+
780
+ return answers;
781
+ }
782
+
783
+ module.exports = {
784
+ getClack,
785
+ getColor,
786
+ handleCancel,
787
+ intro,
788
+ outro,
789
+ cancel,
790
+ note,
791
+ box,
792
+ spinner,
793
+ progress,
794
+ taskLog,
795
+ select,
796
+ multiselect,
797
+ autocompleteMultiselect,
798
+ autocomplete,
799
+ selectKey,
800
+ confirm,
801
+ text,
802
+ path: pathPrompt,
803
+ password,
804
+ group,
805
+ tasks,
806
+ log,
807
+ stream,
808
+ prompt,
809
+ };