bmalph 1.0.0 → 2.2.1

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 (455) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +398 -217
  3. package/bmad/bmm/agents/analyst.agent.yaml +43 -36
  4. package/bmad/bmm/agents/architect.agent.yaml +29 -28
  5. package/bmad/bmm/agents/dev.agent.yaml +38 -38
  6. package/bmad/bmm/agents/pm.agent.yaml +44 -46
  7. package/bmad/bmm/agents/qa.agent.yaml +58 -0
  8. package/bmad/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -32
  9. package/bmad/bmm/agents/sm.agent.yaml +37 -36
  10. package/bmad/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +223 -223
  11. package/bmad/bmm/agents/tech-writer/tech-writer.agent.yaml +46 -45
  12. package/bmad/bmm/agents/ux-designer.agent.yaml +27 -26
  13. package/bmad/bmm/data/project-context-template.md +26 -26
  14. package/bmad/bmm/module-help.csv +31 -31
  15. package/bmad/bmm/module.yaml +50 -44
  16. package/bmad/bmm/teams/default-party.csv +20 -21
  17. package/bmad/bmm/teams/team-fullstack.yaml +12 -12
  18. package/bmad/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -10
  19. package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -177
  20. package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -161
  21. package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -199
  22. package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -202
  23. package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -205
  24. package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -219
  25. package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -162
  26. package/bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md +57 -58
  27. package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -137
  28. package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -229
  29. package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -238
  30. package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -206
  31. package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -234
  32. package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -443
  33. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -182
  34. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -237
  35. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -249
  36. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -259
  37. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -177
  38. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -475
  39. package/bmad/bmm/workflows/1-analysis/research/research.template.md +29 -29
  40. package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -137
  41. package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -239
  42. package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -248
  43. package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -202
  44. package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +233 -239
  45. package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -486
  46. package/bmad/bmm/workflows/1-analysis/research/workflow-domain-research.md +54 -0
  47. package/bmad/bmm/workflows/1-analysis/research/workflow-market-research.md +54 -0
  48. package/bmad/bmm/workflows/1-analysis/research/workflow-technical-research.md +54 -0
  49. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/data/domain-complexity.csv +14 -12
  50. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/data/prd-purpose.md +197 -197
  51. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/data/project-types.csv +10 -10
  52. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-01-init.md +191 -191
  53. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-01b-continue.md +153 -153
  54. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-02-discovery.md +224 -224
  55. package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +154 -0
  56. package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +170 -0
  57. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-03-success.md +226 -226
  58. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-04-journeys.md +213 -213
  59. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-05-domain.md +207 -207
  60. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-06-innovation.md +226 -226
  61. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-07-project-type.md +237 -237
  62. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-08-scoping.md +228 -228
  63. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-09-functional.md +231 -231
  64. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-10-nonfunctional.md +242 -242
  65. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-11-polish.md +217 -217
  66. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-12-complete.md +124 -124
  67. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-e/step-e-01-discovery.md +247 -247
  68. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-e/step-e-01b-legacy-conversion.md +208 -208
  69. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-e/step-e-02-review.md +249 -249
  70. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-e/step-e-03-edit.md +253 -253
  71. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-e/step-e-04-complete.md +168 -168
  72. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-01-discovery.md +226 -218
  73. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-02-format-detection.md +191 -191
  74. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-02b-parity-check.md +209 -209
  75. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-03-density-validation.md +174 -174
  76. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-04-brief-coverage-validation.md +214 -214
  77. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-05-measurability-validation.md +228 -228
  78. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-06-traceability-validation.md +217 -217
  79. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-07-implementation-leakage-validation.md +205 -205
  80. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-08-domain-compliance-validation.md +243 -243
  81. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-09-project-type-validation.md +263 -263
  82. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-10-smart-validation.md +209 -209
  83. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-11-holistic-quality-validation.md +264 -264
  84. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-12-completeness-validation.md +242 -242
  85. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-13-report-complete.md +231 -231
  86. package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/templates/prd-template.md +10 -10
  87. package/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md +63 -0
  88. package/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md +65 -0
  89. package/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +63 -0
  90. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -135
  91. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -127
  92. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -190
  93. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -216
  94. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -219
  95. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -234
  96. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -252
  97. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -254
  98. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -224
  99. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -224
  100. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -241
  101. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -248
  102. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -237
  103. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -264
  104. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -171
  105. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -13
  106. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +42 -43
  107. package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +184 -190
  108. package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +172 -178
  109. package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +173 -179
  110. package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +133 -139
  111. package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +245 -252
  112. package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +129 -135
  113. package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -4
  114. package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +54 -55
  115. package/bmad/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -12
  116. package/bmad/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +12 -10
  117. package/bmad/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +6 -6
  118. package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -153
  119. package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -164
  120. package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -224
  121. package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -331
  122. package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -318
  123. package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -359
  124. package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -379
  125. package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -359
  126. package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -76
  127. package/bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md +49 -50
  128. package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -259
  129. package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -233
  130. package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -272
  131. package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -149
  132. package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -57
  133. package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -59
  134. package/bmad/bmm/workflows/4-implementation/code-review/checklist.md +23 -23
  135. package/bmad/bmm/workflows/4-implementation/code-review/instructions.xml +226 -226
  136. package/bmad/bmm/workflows/4-implementation/code-review/workflow.yaml +44 -51
  137. package/bmad/bmm/workflows/4-implementation/correct-course/checklist.md +288 -288
  138. package/bmad/bmm/workflows/4-implementation/correct-course/instructions.md +207 -206
  139. package/bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml +54 -60
  140. package/bmad/bmm/workflows/4-implementation/create-story/checklist.md +358 -358
  141. package/bmad/bmm/workflows/4-implementation/create-story/instructions.xml +346 -345
  142. package/bmad/bmm/workflows/4-implementation/create-story/template.md +49 -49
  143. package/bmad/bmm/workflows/4-implementation/create-story/workflow.yaml +53 -61
  144. package/bmad/bmm/workflows/4-implementation/dev-story/checklist.md +80 -80
  145. package/bmad/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -410
  146. package/bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml +21 -27
  147. package/bmad/bmm/workflows/4-implementation/retrospective/instructions.md +1444 -1443
  148. package/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml +53 -58
  149. package/bmad/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -33
  150. package/bmad/bmm/workflows/4-implementation/sprint-planning/instructions.md +226 -225
  151. package/bmad/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -55
  152. package/bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +47 -54
  153. package/bmad/bmm/workflows/4-implementation/sprint-status/instructions.md +230 -229
  154. package/bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml +25 -36
  155. package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +174 -156
  156. package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +118 -120
  157. package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +111 -113
  158. package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +111 -113
  159. package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +104 -106
  160. package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +146 -140
  161. package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -50
  162. package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +191 -189
  163. package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +144 -144
  164. package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +127 -128
  165. package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +200 -191
  166. package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -74
  167. package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -79
  168. package/bmad/bmm/workflows/document-project/checklist.md +245 -245
  169. package/bmad/bmm/workflows/document-project/documentation-requirements.csv +12 -12
  170. package/bmad/bmm/workflows/document-project/instructions.md +130 -221
  171. package/bmad/bmm/workflows/document-project/templates/deep-dive-template.md +345 -345
  172. package/bmad/bmm/workflows/document-project/templates/index-template.md +169 -169
  173. package/bmad/bmm/workflows/document-project/templates/project-overview-template.md +103 -103
  174. package/bmad/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -160
  175. package/bmad/bmm/workflows/document-project/templates/source-tree-template.md +135 -135
  176. package/bmad/bmm/workflows/document-project/workflow.yaml +22 -30
  177. package/bmad/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -298
  178. package/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -31
  179. package/bmad/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -1106
  180. package/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +31 -31
  181. package/bmad/bmm/workflows/generate-project-context/project-context-template.md +21 -0
  182. package/bmad/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -0
  183. package/bmad/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -0
  184. package/bmad/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -0
  185. package/bmad/bmm/workflows/generate-project-context/workflow.md +49 -0
  186. package/bmad/bmm/workflows/qa/automate/checklist.md +33 -0
  187. package/bmad/bmm/workflows/qa/automate/instructions.md +110 -0
  188. package/bmad/bmm/workflows/qa/automate/workflow.yaml +44 -0
  189. package/bmad/core/agents/bmad-master.agent.yaml +30 -30
  190. package/bmad/core/module-help.csv +9 -11
  191. package/bmad/core/module.yaml +25 -25
  192. package/bmad/core/tasks/editorial-review-prose.xml +102 -91
  193. package/bmad/core/tasks/editorial-review-structure.xml +209 -198
  194. package/bmad/core/tasks/help.md +85 -0
  195. package/bmad/core/tasks/index-docs.xml +64 -64
  196. package/bmad/core/tasks/review-adversarial-general.xml +48 -48
  197. package/bmad/core/tasks/shard-doc.xml +107 -108
  198. package/bmad/core/tasks/workflow.xml +234 -234
  199. package/bmad/core/workflows/advanced-elicitation/methods.csv +51 -51
  200. package/bmad/core/workflows/advanced-elicitation/workflow.xml +116 -116
  201. package/bmad/core/workflows/brainstorming/brain-methods.csv +61 -61
  202. package/bmad/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -197
  203. package/bmad/core/workflows/brainstorming/steps/step-01b-continue.md +122 -122
  204. package/bmad/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -225
  205. package/bmad/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -237
  206. package/bmad/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -209
  207. package/bmad/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -264
  208. package/bmad/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -399
  209. package/bmad/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -303
  210. package/bmad/core/workflows/brainstorming/template.md +15 -15
  211. package/bmad/core/workflows/brainstorming/workflow.md +58 -58
  212. package/bmad/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -138
  213. package/bmad/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -187
  214. package/bmad/core/workflows/party-mode/steps/step-03-graceful-exit.md +168 -157
  215. package/bmad/core/workflows/party-mode/workflow.md +194 -194
  216. package/bundled-versions.json +3 -0
  217. package/dist/cli.js +61 -6
  218. package/dist/commands/check-updates.d.ts +5 -0
  219. package/dist/commands/check-updates.js +63 -0
  220. package/dist/commands/doctor.d.ts +39 -1
  221. package/dist/commands/doctor.js +348 -79
  222. package/dist/commands/init.d.ts +2 -0
  223. package/dist/commands/init.js +41 -15
  224. package/dist/commands/status.d.ts +7 -1
  225. package/dist/commands/status.js +111 -42
  226. package/dist/commands/upgrade.d.ts +7 -1
  227. package/dist/commands/upgrade.js +43 -12
  228. package/dist/installer.d.ts +19 -2
  229. package/dist/installer.js +305 -66
  230. package/dist/transition/artifacts.d.ts +2 -0
  231. package/dist/transition/artifacts.js +46 -0
  232. package/dist/transition/context.d.ts +19 -0
  233. package/dist/transition/context.js +261 -0
  234. package/dist/transition/fix-plan.d.ts +15 -0
  235. package/dist/transition/fix-plan.js +94 -0
  236. package/dist/transition/index.d.ts +9 -0
  237. package/dist/transition/index.js +16 -0
  238. package/dist/transition/orchestration.d.ts +2 -0
  239. package/dist/transition/orchestration.js +243 -0
  240. package/dist/transition/specs-changelog.d.ts +3 -0
  241. package/dist/transition/specs-changelog.js +75 -0
  242. package/dist/transition/specs-index.d.ts +22 -0
  243. package/dist/transition/specs-index.js +157 -0
  244. package/dist/transition/story-parsing.d.ts +7 -0
  245. package/dist/transition/story-parsing.js +124 -0
  246. package/dist/transition/tech-stack.d.ts +3 -0
  247. package/dist/transition/tech-stack.js +79 -0
  248. package/dist/transition/types.d.ts +60 -0
  249. package/dist/transition/types.js +1 -0
  250. package/dist/utils/config.d.ts +4 -0
  251. package/dist/utils/config.js +14 -4
  252. package/dist/utils/constants.d.ts +70 -0
  253. package/dist/utils/constants.js +97 -0
  254. package/dist/utils/dryrun.d.ts +7 -0
  255. package/dist/utils/dryrun.js +48 -0
  256. package/dist/utils/errors.d.ts +63 -0
  257. package/dist/utils/errors.js +86 -0
  258. package/dist/utils/file-system.d.ts +24 -0
  259. package/dist/utils/file-system.js +99 -0
  260. package/dist/utils/github.d.ts +83 -0
  261. package/dist/utils/github.js +230 -0
  262. package/dist/utils/json.js +3 -3
  263. package/dist/utils/logger.d.ts +6 -0
  264. package/dist/utils/logger.js +27 -0
  265. package/dist/utils/state.d.ts +4 -7
  266. package/dist/utils/state.js +147 -26
  267. package/dist/utils/validate.d.ts +40 -0
  268. package/dist/utils/validate.js +175 -1
  269. package/package.json +75 -59
  270. package/ralph/RALPH-REFERENCE.md +412 -0
  271. package/ralph/lib/circuit_breaker.sh +463 -330
  272. package/ralph/lib/date_utils.sh +104 -53
  273. package/ralph/lib/enable_core.sh +815 -0
  274. package/ralph/lib/response_analyzer.sh +884 -768
  275. package/ralph/lib/task_sources.sh +577 -0
  276. package/ralph/lib/timeout_utils.sh +145 -145
  277. package/ralph/lib/wizard_utils.sh +547 -0
  278. package/ralph/ralph_import.sh +636 -0
  279. package/ralph/ralph_loop.sh +1793 -1391
  280. package/ralph/ralph_monitor.sh +125 -0
  281. package/ralph/templates/AGENT.md +158 -158
  282. package/ralph/templates/PROMPT.md +285 -292
  283. package/ralph/templates/fix_plan.md +27 -27
  284. package/ralph/templates/ralphrc.template +102 -0
  285. package/ralph/templates/specs/.gitkeep +1 -1
  286. package/slash-commands/advanced-elicitation.md +1 -1
  287. package/slash-commands/adversarial-review.md +1 -1
  288. package/slash-commands/analyst.md +1 -1
  289. package/slash-commands/architect.md +1 -1
  290. package/slash-commands/bmad-help.md +1 -1
  291. package/slash-commands/bmalph-implement.md +152 -152
  292. package/slash-commands/brainstorm-project.md +1 -1
  293. package/slash-commands/brainstorming.md +1 -1
  294. package/slash-commands/correct-course.md +1 -1
  295. package/slash-commands/create-architecture.md +1 -1
  296. package/slash-commands/create-brief.md +1 -1
  297. package/slash-commands/create-epics-stories.md +1 -1
  298. package/slash-commands/create-prd.md +1 -1
  299. package/slash-commands/create-story.md +1 -1
  300. package/slash-commands/create-ux.md +1 -1
  301. package/slash-commands/dev.md +1 -1
  302. package/slash-commands/document-project.md +1 -1
  303. package/slash-commands/domain-research.md +1 -1
  304. package/slash-commands/editorial-prose.md +1 -1
  305. package/slash-commands/editorial-structure.md +1 -1
  306. package/slash-commands/execute-workflow.md +1 -1
  307. package/slash-commands/generate-project-context.md +1 -0
  308. package/slash-commands/implementation-readiness.md +1 -1
  309. package/slash-commands/index-docs.md +1 -1
  310. package/slash-commands/market-research.md +1 -1
  311. package/slash-commands/party-mode.md +1 -1
  312. package/slash-commands/pm.md +1 -1
  313. package/slash-commands/qa-automate.md +1 -0
  314. package/slash-commands/qa.md +1 -0
  315. package/slash-commands/quick-dev.md +1 -1
  316. package/slash-commands/quick-flow-solo-dev.md +1 -1
  317. package/slash-commands/retrospective.md +1 -1
  318. package/slash-commands/shard-doc.md +1 -1
  319. package/slash-commands/sm.md +1 -1
  320. package/slash-commands/sprint-planning.md +1 -1
  321. package/slash-commands/sprint-status.md +1 -1
  322. package/slash-commands/tech-spec.md +1 -1
  323. package/slash-commands/tech-writer.md +1 -0
  324. package/slash-commands/technical-research.md +1 -1
  325. package/slash-commands/ux-designer.md +1 -1
  326. package/slash-commands/validate-architecture.md +1 -1
  327. package/slash-commands/validate-brief.md +1 -1
  328. package/slash-commands/validate-epics-stories.md +1 -1
  329. package/slash-commands/validate-prd.md +1 -1
  330. package/slash-commands/validate-story.md +1 -1
  331. package/slash-commands/validate-ux.md +1 -1
  332. package/bmad/bmm/agents/tea.agent.yaml +0 -63
  333. package/bmad/bmm/sub-modules/claude-code/config.yaml +0 -4
  334. package/bmad/bmm/sub-modules/claude-code/injections.yaml +0 -242
  335. package/bmad/bmm/sub-modules/claude-code/readme.md +0 -87
  336. package/bmad/bmm/testarch/knowledge/adr-quality-readiness-checklist.md +0 -350
  337. package/bmad/bmm/testarch/knowledge/api-request.md +0 -442
  338. package/bmad/bmm/testarch/knowledge/api-testing-patterns.md +0 -843
  339. package/bmad/bmm/testarch/knowledge/auth-session.md +0 -552
  340. package/bmad/bmm/testarch/knowledge/burn-in.md +0 -273
  341. package/bmad/bmm/testarch/knowledge/ci-burn-in.md +0 -675
  342. package/bmad/bmm/testarch/knowledge/component-tdd.md +0 -486
  343. package/bmad/bmm/testarch/knowledge/contract-testing.md +0 -957
  344. package/bmad/bmm/testarch/knowledge/data-factories.md +0 -500
  345. package/bmad/bmm/testarch/knowledge/email-auth.md +0 -721
  346. package/bmad/bmm/testarch/knowledge/error-handling.md +0 -725
  347. package/bmad/bmm/testarch/knowledge/feature-flags.md +0 -750
  348. package/bmad/bmm/testarch/knowledge/file-utils.md +0 -463
  349. package/bmad/bmm/testarch/knowledge/fixture-architecture.md +0 -401
  350. package/bmad/bmm/testarch/knowledge/fixtures-composition.md +0 -382
  351. package/bmad/bmm/testarch/knowledge/intercept-network-call.md +0 -430
  352. package/bmad/bmm/testarch/knowledge/log.md +0 -429
  353. package/bmad/bmm/testarch/knowledge/network-error-monitor.md +0 -405
  354. package/bmad/bmm/testarch/knowledge/network-first.md +0 -486
  355. package/bmad/bmm/testarch/knowledge/network-recorder.md +0 -527
  356. package/bmad/bmm/testarch/knowledge/nfr-criteria.md +0 -670
  357. package/bmad/bmm/testarch/knowledge/overview.md +0 -286
  358. package/bmad/bmm/testarch/knowledge/playwright-config.md +0 -730
  359. package/bmad/bmm/testarch/knowledge/probability-impact.md +0 -601
  360. package/bmad/bmm/testarch/knowledge/recurse.md +0 -421
  361. package/bmad/bmm/testarch/knowledge/risk-governance.md +0 -615
  362. package/bmad/bmm/testarch/knowledge/selective-testing.md +0 -732
  363. package/bmad/bmm/testarch/knowledge/selector-resilience.md +0 -527
  364. package/bmad/bmm/testarch/knowledge/test-healing-patterns.md +0 -644
  365. package/bmad/bmm/testarch/knowledge/test-levels-framework.md +0 -473
  366. package/bmad/bmm/testarch/knowledge/test-priorities-matrix.md +0 -373
  367. package/bmad/bmm/testarch/knowledge/test-quality.md +0 -664
  368. package/bmad/bmm/testarch/knowledge/timing-debugging.md +0 -372
  369. package/bmad/bmm/testarch/knowledge/visual-debugging.md +0 -524
  370. package/bmad/bmm/testarch/tea-index.csv +0 -35
  371. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +0 -200
  372. package/bmad/bmm/workflows/1-analysis/research/workflow.md +0 -173
  373. package/bmad/bmm/workflows/2-plan-workflows/prd/validation-report-prd-workflow.md +0 -433
  374. package/bmad/bmm/workflows/2-plan-workflows/prd/workflow.md +0 -150
  375. package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/data/project-levels.yaml +0 -59
  376. package/bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +0 -90
  377. package/bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +0 -127
  378. package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +0 -39
  379. package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +0 -130
  380. package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +0 -27
  381. package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +0 -43
  382. package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +0 -141
  383. package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +0 -27
  384. package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +0 -49
  385. package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +0 -241
  386. package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +0 -27
  387. package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +0 -38
  388. package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +0 -133
  389. package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +0 -27
  390. package/bmad/bmm/workflows/testarch/atdd/atdd-checklist-template.md +0 -363
  391. package/bmad/bmm/workflows/testarch/atdd/checklist.md +0 -374
  392. package/bmad/bmm/workflows/testarch/atdd/instructions.md +0 -806
  393. package/bmad/bmm/workflows/testarch/atdd/workflow.yaml +0 -47
  394. package/bmad/bmm/workflows/testarch/automate/checklist.md +0 -582
  395. package/bmad/bmm/workflows/testarch/automate/instructions.md +0 -1324
  396. package/bmad/bmm/workflows/testarch/automate/workflow.yaml +0 -54
  397. package/bmad/bmm/workflows/testarch/ci/checklist.md +0 -247
  398. package/bmad/bmm/workflows/testarch/ci/github-actions-template.yaml +0 -198
  399. package/bmad/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +0 -149
  400. package/bmad/bmm/workflows/testarch/ci/instructions.md +0 -536
  401. package/bmad/bmm/workflows/testarch/ci/workflow.yaml +0 -47
  402. package/bmad/bmm/workflows/testarch/framework/checklist.md +0 -320
  403. package/bmad/bmm/workflows/testarch/framework/instructions.md +0 -481
  404. package/bmad/bmm/workflows/testarch/framework/workflow.yaml +0 -49
  405. package/bmad/bmm/workflows/testarch/nfr-assess/checklist.md +0 -407
  406. package/bmad/bmm/workflows/testarch/nfr-assess/instructions.md +0 -726
  407. package/bmad/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +0 -461
  408. package/bmad/bmm/workflows/testarch/nfr-assess/workflow.yaml +0 -49
  409. package/bmad/bmm/workflows/testarch/test-design/checklist.md +0 -407
  410. package/bmad/bmm/workflows/testarch/test-design/instructions.md +0 -1158
  411. package/bmad/bmm/workflows/testarch/test-design/test-design-architecture-template.md +0 -213
  412. package/bmad/bmm/workflows/testarch/test-design/test-design-qa-template.md +0 -286
  413. package/bmad/bmm/workflows/testarch/test-design/test-design-template.md +0 -294
  414. package/bmad/bmm/workflows/testarch/test-design/workflow.yaml +0 -71
  415. package/bmad/bmm/workflows/testarch/test-review/checklist.md +0 -472
  416. package/bmad/bmm/workflows/testarch/test-review/instructions.md +0 -628
  417. package/bmad/bmm/workflows/testarch/test-review/test-review-template.md +0 -390
  418. package/bmad/bmm/workflows/testarch/test-review/workflow.yaml +0 -48
  419. package/bmad/bmm/workflows/testarch/trace/checklist.md +0 -642
  420. package/bmad/bmm/workflows/testarch/trace/instructions.md +0 -1030
  421. package/bmad/bmm/workflows/testarch/trace/trace-template.md +0 -675
  422. package/bmad/bmm/workflows/testarch/trace/workflow.yaml +0 -57
  423. package/bmad/core/resources/excalidraw/README.md +0 -160
  424. package/bmad/core/resources/excalidraw/excalidraw-helpers.md +0 -127
  425. package/bmad/core/resources/excalidraw/library-loader.md +0 -50
  426. package/bmad/core/resources/excalidraw/validate-json-instructions.md +0 -79
  427. package/bmad/core/tasks/bmad-help.md +0 -62
  428. package/dist/commands/guide.d.ts +0 -1
  429. package/dist/commands/guide.js +0 -19
  430. package/dist/commands/implement.d.ts +0 -1
  431. package/dist/commands/implement.js +0 -83
  432. package/dist/commands/plan.d.ts +0 -5
  433. package/dist/commands/plan.js +0 -44
  434. package/dist/commands/reset.d.ts +0 -5
  435. package/dist/commands/reset.js +0 -35
  436. package/dist/commands/resume.d.ts +0 -1
  437. package/dist/commands/resume.js +0 -44
  438. package/dist/commands/start.d.ts +0 -5
  439. package/dist/commands/start.js +0 -54
  440. package/dist/transition.d.ts +0 -52
  441. package/dist/transition.js +0 -656
  442. package/slash-commands/atdd.md +0 -1
  443. package/slash-commands/continuous-integration.md +0 -1
  444. package/slash-commands/create-dataflow.md +0 -1
  445. package/slash-commands/create-diagram.md +0 -1
  446. package/slash-commands/create-flowchart.md +0 -1
  447. package/slash-commands/create-wireframe.md +0 -1
  448. package/slash-commands/nfr-assess.md +0 -1
  449. package/slash-commands/tea.md +0 -1
  450. package/slash-commands/test-automate.md +0 -1
  451. package/slash-commands/test-design.md +0 -1
  452. package/slash-commands/test-framework.md +0 -1
  453. package/slash-commands/test-review.md +0 -1
  454. package/slash-commands/test-trace.md +0 -1
  455. package/slash-commands/validate-test-design.md +0 -1
package/dist/installer.js CHANGED
@@ -1,55 +1,109 @@
1
- import { cp, mkdir, readFile, readdir, writeFile, access } from "fs/promises";
1
+ import { cp, mkdir, readFile, readdir, rm, chmod, rename } from "fs/promises";
2
2
  import { readFileSync } from "fs";
3
3
  import { join, basename, dirname } from "path";
4
4
  import { fileURLToPath } from "url";
5
+ import { debug, warn } from "./utils/logger.js";
6
+ import { formatError, isEnoent } from "./utils/errors.js";
7
+ import { exists, atomicWriteFile } from "./utils/file-system.js";
8
+ import { STATE_DIR, CONFIG_FILE } from "./utils/constants.js";
5
9
  const __filename = fileURLToPath(import.meta.url);
6
10
  const __dirname = dirname(__filename);
7
11
  export function getPackageVersion() {
8
12
  const pkgPath = join(__dirname, "..", "package.json");
9
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
10
- return pkg.version;
13
+ try {
14
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
15
+ return pkg.version ?? "unknown";
16
+ }
17
+ catch {
18
+ return "unknown";
19
+ }
20
+ }
21
+ export function getBundledVersions() {
22
+ const versionsPath = join(__dirname, "..", "bundled-versions.json");
23
+ try {
24
+ const versions = JSON.parse(readFileSync(versionsPath, "utf-8"));
25
+ if (!versions || typeof versions.bmadCommit !== "string") {
26
+ throw new Error("Invalid bundled-versions.json structure: missing bmadCommit");
27
+ }
28
+ return {
29
+ bmadCommit: versions.bmadCommit,
30
+ };
31
+ }
32
+ catch (err) {
33
+ if (err instanceof Error && err.message.includes("Invalid bundled-versions.json")) {
34
+ throw err;
35
+ }
36
+ throw new Error(`Failed to read bundled-versions.json at ${versionsPath}`, { cause: err });
37
+ }
11
38
  }
12
- export function getBmadDir() {
39
+ export function getBundledBmadDir() {
13
40
  return join(__dirname, "..", "bmad");
14
41
  }
15
- export function getRalphDir() {
42
+ export function getBundledRalphDir() {
16
43
  return join(__dirname, "..", "ralph");
17
44
  }
18
45
  export function getSlashCommandsDir() {
19
46
  return join(__dirname, "..", "slash-commands");
20
47
  }
48
+ const TEMPLATE_PLACEHOLDERS = {
49
+ "PROMPT.md": "[YOUR PROJECT NAME]",
50
+ "AGENT.md": "pip install -r requirements.txt",
51
+ };
52
+ async function isTemplateCustomized(filePath, templateName) {
53
+ const placeholder = TEMPLATE_PLACEHOLDERS[templateName];
54
+ if (!placeholder)
55
+ return false;
56
+ try {
57
+ const content = await readFile(filePath, "utf-8");
58
+ return !content.includes(placeholder);
59
+ }
60
+ catch (err) {
61
+ if (isEnoent(err))
62
+ return false;
63
+ throw err;
64
+ }
65
+ }
21
66
  export async function copyBundledAssets(projectDir) {
22
- const bmadDir = getBmadDir();
23
- const ralphDir = getRalphDir();
67
+ const bmadDir = getBundledBmadDir();
68
+ const ralphDir = getBundledRalphDir();
24
69
  const slashCommandsDir = getSlashCommandsDir();
25
70
  // Validate source directories exist
26
- try {
27
- await access(bmadDir);
28
- }
29
- catch {
71
+ if (!(await exists(bmadDir))) {
30
72
  throw new Error(`BMAD source directory not found at ${bmadDir}. Package may be corrupted.`);
31
73
  }
32
- try {
33
- await access(ralphDir);
34
- }
35
- catch {
74
+ if (!(await exists(ralphDir))) {
36
75
  throw new Error(`Ralph source directory not found at ${ralphDir}. Package may be corrupted.`);
37
76
  }
77
+ if (!(await exists(slashCommandsDir))) {
78
+ throw new Error(`Slash commands directory not found at ${slashCommandsDir}. Package may be corrupted.`);
79
+ }
80
+ // Atomic copy: write to temp dir, then swap with old
81
+ const bmadDest = join(projectDir, "_bmad");
82
+ const bmadTemp = join(projectDir, "_bmad.new");
83
+ await rm(bmadTemp, { recursive: true, force: true });
84
+ await cp(bmadDir, bmadTemp, { recursive: true, dereference: false });
38
85
  try {
39
- await access(slashCommandsDir);
86
+ await rm(bmadDest, { recursive: true, force: true });
87
+ await rename(bmadTemp, bmadDest);
40
88
  }
41
- catch {
42
- throw new Error(`Slash commands directory not found at ${slashCommandsDir}. Package may be corrupted.`);
89
+ catch (err) {
90
+ // If rename fails, attempt to restore from temp
91
+ try {
92
+ await rename(bmadTemp, bmadDest);
93
+ }
94
+ catch {
95
+ // Best effort restore failed
96
+ }
97
+ throw err;
43
98
  }
44
- // Copy BMAD files → _bmad/
45
- await cp(bmadDir, join(projectDir, "_bmad"), { recursive: true });
46
99
  // Generate combined manifest from module-help.csv files
47
100
  await generateManifests(projectDir);
48
101
  // Generate _bmad/config.yaml
49
102
  const projectName = await deriveProjectName(projectDir);
50
- await writeFile(join(projectDir, "_bmad/config.yaml"), `# BMAD Configuration - Generated by bmalph
103
+ const escapedName = projectName.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
104
+ await atomicWriteFile(join(projectDir, "_bmad/config.yaml"), `# BMAD Configuration - Generated by bmalph
51
105
  platform: claude-code
52
- project_name: ${projectName}
106
+ project_name: "${escapedName}"
53
107
  output_folder: _bmad-output
54
108
  user_name: BMad
55
109
  communication_language: English
@@ -63,42 +117,91 @@ modules:
63
117
  `);
64
118
  // Copy Ralph templates → .ralph/
65
119
  await mkdir(join(projectDir, ".ralph"), { recursive: true });
66
- await cp(join(ralphDir, "templates/PROMPT.md"), join(projectDir, ".ralph/PROMPT.md"));
67
- await cp(join(ralphDir, "templates/AGENT.md"), join(projectDir, ".ralph/@AGENT.md"));
120
+ // Preserve customized PROMPT.md and @AGENT.md on upgrade
121
+ const promptCustomized = await isTemplateCustomized(join(projectDir, ".ralph/PROMPT.md"), "PROMPT.md");
122
+ const agentCustomized = await isTemplateCustomized(join(projectDir, ".ralph/@AGENT.md"), "AGENT.md");
123
+ if (!promptCustomized) {
124
+ await cp(join(ralphDir, "templates/PROMPT.md"), join(projectDir, ".ralph/PROMPT.md"), {
125
+ dereference: false,
126
+ });
127
+ }
128
+ if (!agentCustomized) {
129
+ await cp(join(ralphDir, "templates/AGENT.md"), join(projectDir, ".ralph/@AGENT.md"), {
130
+ dereference: false,
131
+ });
132
+ }
133
+ await cp(join(ralphDir, "RALPH-REFERENCE.md"), join(projectDir, ".ralph/RALPH-REFERENCE.md"), {
134
+ dereference: false,
135
+ });
136
+ // Copy .ralphrc from template (skip if user has customized it)
137
+ const ralphrcDest = join(projectDir, ".ralph/.ralphrc");
138
+ if (!(await exists(ralphrcDest))) {
139
+ await cp(join(ralphDir, "templates/ralphrc.template"), ralphrcDest, { dereference: false });
140
+ }
68
141
  // Copy Ralph loop and lib → .ralph/
69
142
  // Add version marker to ralph_loop.sh
70
143
  const loopContent = await readFile(join(ralphDir, "ralph_loop.sh"), "utf-8");
71
144
  const markerLine = `# bmalph-version: ${getPackageVersion()}`;
145
+ // Use .* to handle empty version (edge case) and EOF without newline
72
146
  const markedContent = loopContent.includes("# bmalph-version:")
73
- ? loopContent.replace(/# bmalph-version: .+/, markerLine)
147
+ ? loopContent.replace(/# bmalph-version:.*/, markerLine)
74
148
  : loopContent.replace(/^(#!.+\r?\n)/, `$1${markerLine}\n`);
75
- await writeFile(join(projectDir, ".ralph/ralph_loop.sh"), markedContent);
76
- await cp(join(ralphDir, "lib"), join(projectDir, ".ralph/lib"), { recursive: true });
149
+ await atomicWriteFile(join(projectDir, ".ralph/ralph_loop.sh"), markedContent);
150
+ await chmod(join(projectDir, ".ralph/ralph_loop.sh"), 0o755);
151
+ await rm(join(projectDir, ".ralph/lib"), { recursive: true, force: true });
152
+ await cp(join(ralphDir, "lib"), join(projectDir, ".ralph/lib"), {
153
+ recursive: true,
154
+ dereference: false,
155
+ });
156
+ // Copy Ralph utilities → .ralph/
157
+ await cp(join(ralphDir, "ralph_import.sh"), join(projectDir, ".ralph/ralph_import.sh"), {
158
+ dereference: false,
159
+ });
160
+ await chmod(join(projectDir, ".ralph/ralph_import.sh"), 0o755);
161
+ await cp(join(ralphDir, "ralph_monitor.sh"), join(projectDir, ".ralph/ralph_monitor.sh"), {
162
+ dereference: false,
163
+ });
164
+ await chmod(join(projectDir, ".ralph/ralph_monitor.sh"), 0o755);
77
165
  // Install all slash commands → .claude/commands/
78
- await mkdir(join(projectDir, ".claude/commands"), { recursive: true });
166
+ // Clean stale bmalph-owned commands before copying (preserve user-created commands)
167
+ const commandsDir = join(projectDir, ".claude/commands");
168
+ await mkdir(commandsDir, { recursive: true });
79
169
  const slashFiles = await readdir(slashCommandsDir);
80
- for (const file of slashFiles) {
81
- if (file.endsWith(".md")) {
82
- await cp(join(slashCommandsDir, file), join(projectDir, ".claude/commands", file));
170
+ const bundledCommandNames = new Set(slashFiles.filter((f) => f.endsWith(".md")));
171
+ try {
172
+ const existingCommands = await readdir(commandsDir);
173
+ for (const file of existingCommands) {
174
+ if (file.endsWith(".md") && bundledCommandNames.has(file)) {
175
+ await rm(join(commandsDir, file), { force: true });
176
+ }
83
177
  }
84
178
  }
179
+ catch (err) {
180
+ if (!isEnoent(err))
181
+ throw err;
182
+ }
183
+ for (const file of bundledCommandNames) {
184
+ await cp(join(slashCommandsDir, file), join(commandsDir, file), { dereference: false });
185
+ }
85
186
  // Update .gitignore
86
187
  await updateGitignore(projectDir);
87
- return {
88
- updatedPaths: [
89
- "_bmad/",
90
- ".ralph/ralph_loop.sh",
91
- ".ralph/lib/",
92
- ".ralph/PROMPT.md",
93
- ".ralph/@AGENT.md",
94
- ".claude/commands/",
95
- ".gitignore",
96
- ],
97
- };
188
+ const updatedPaths = [
189
+ "_bmad/",
190
+ ".ralph/ralph_loop.sh",
191
+ ".ralph/ralph_import.sh",
192
+ ".ralph/ralph_monitor.sh",
193
+ ".ralph/lib/",
194
+ ...(!promptCustomized ? [".ralph/PROMPT.md"] : []),
195
+ ...(!agentCustomized ? [".ralph/@AGENT.md"] : []),
196
+ ".ralph/RALPH-REFERENCE.md",
197
+ ".claude/commands/",
198
+ ".gitignore",
199
+ ];
200
+ return { updatedPaths };
98
201
  }
99
202
  export async function installProject(projectDir) {
100
203
  // Create user directories (not overwritten by upgrade)
101
- await mkdir(join(projectDir, "bmalph/state"), { recursive: true });
204
+ await mkdir(join(projectDir, STATE_DIR), { recursive: true });
102
205
  await mkdir(join(projectDir, ".ralph/specs"), { recursive: true });
103
206
  await mkdir(join(projectDir, ".ralph/logs"), { recursive: true });
104
207
  await mkdir(join(projectDir, ".ralph/docs/generated"), { recursive: true });
@@ -106,34 +209,62 @@ export async function installProject(projectDir) {
106
209
  }
107
210
  async function deriveProjectName(projectDir) {
108
211
  try {
109
- const configPath = join(projectDir, "bmalph/config.json");
212
+ const configPath = join(projectDir, CONFIG_FILE);
110
213
  const raw = await readFile(configPath, "utf-8");
111
214
  const config = JSON.parse(raw);
112
215
  if (config.name)
113
216
  return config.name;
114
217
  }
115
- catch {
116
- // config.json doesn't exist or is invalid — fall through
218
+ catch (err) {
219
+ if (!isEnoent(err)) {
220
+ warn(`Could not read ${CONFIG_FILE}: ${formatError(err)}`);
221
+ }
117
222
  }
118
223
  return basename(projectDir);
119
224
  }
120
- async function generateManifests(projectDir) {
225
+ export async function generateManifests(projectDir) {
121
226
  const configDir = join(projectDir, "_bmad/_config");
122
227
  await mkdir(configDir, { recursive: true });
123
228
  const coreHelpPath = join(projectDir, "_bmad/core/module-help.csv");
124
229
  const bmmHelpPath = join(projectDir, "_bmad/bmm/module-help.csv");
230
+ // Validate CSV files exist before reading
231
+ if (!(await exists(coreHelpPath))) {
232
+ throw new Error(`Core module-help.csv not found at ${coreHelpPath}. BMAD installation may be incomplete.`);
233
+ }
234
+ if (!(await exists(bmmHelpPath))) {
235
+ throw new Error(`BMM module-help.csv not found at ${bmmHelpPath}. BMAD installation may be incomplete.`);
236
+ }
125
237
  const coreContent = await readFile(coreHelpPath, "utf-8");
126
238
  const bmmContent = await readFile(bmmHelpPath, "utf-8");
127
239
  // Extract header from core (first line) and data lines from both
128
240
  const coreLines = coreContent.trimEnd().split(/\r?\n/);
129
241
  const bmmLines = bmmContent.trimEnd().split(/\r?\n/);
130
- const header = coreLines[0];
131
- const coreData = coreLines.slice(1).filter((l) => l.trim());
132
- const bmmData = bmmLines.slice(1).filter((l) => l.trim());
242
+ if (!coreLines[0]?.trim()) {
243
+ throw new Error(`Core module-help.csv is empty at ${coreHelpPath}`);
244
+ }
245
+ if (!bmmLines[0]?.trim()) {
246
+ throw new Error(`BMM module-help.csv is empty at ${bmmHelpPath}`);
247
+ }
248
+ const normalize = (line) => line.replace(/,+$/, "");
249
+ const header = normalize(coreLines[0]);
250
+ const bmmHeader = normalize(bmmLines[0]);
251
+ // Validate headers match (warn if mismatch but continue)
252
+ if (header && bmmHeader && header !== bmmHeader) {
253
+ warn(`CSV header mismatch detected. BMAD modules may have incompatible formats.`);
254
+ debug(`CSV header mismatch details - core: "${header.slice(0, 50)}...", bmm: "${bmmHeader.slice(0, 50)}..."`);
255
+ }
256
+ const coreData = coreLines
257
+ .slice(1)
258
+ .filter((l) => l.trim())
259
+ .map(normalize);
260
+ const bmmData = bmmLines
261
+ .slice(1)
262
+ .filter((l) => l.trim())
263
+ .map(normalize);
133
264
  const combined = [header, ...coreData, ...bmmData].join("\n") + "\n";
134
- await writeFile(join(configDir, "task-manifest.csv"), combined);
135
- await writeFile(join(configDir, "workflow-manifest.csv"), combined);
136
- await writeFile(join(configDir, "bmad-help.csv"), combined);
265
+ await atomicWriteFile(join(configDir, "task-manifest.csv"), combined);
266
+ await atomicWriteFile(join(configDir, "workflow-manifest.csv"), combined);
267
+ await atomicWriteFile(join(configDir, "bmad-help.csv"), combined);
137
268
  }
138
269
  async function updateGitignore(projectDir) {
139
270
  const gitignorePath = join(projectDir, ".gitignore");
@@ -141,17 +272,23 @@ async function updateGitignore(projectDir) {
141
272
  try {
142
273
  existing = await readFile(gitignorePath, "utf-8");
143
274
  }
144
- catch {
145
- // File doesn't exist, start fresh
275
+ catch (err) {
276
+ if (!isEnoent(err))
277
+ throw err;
146
278
  }
279
+ // Split into lines for exact comparison (avoid substring matching issues)
280
+ const existingLines = new Set(existing
281
+ .split(/\r?\n/)
282
+ .map((line) => line.trim())
283
+ .filter(Boolean));
147
284
  const entries = [".ralph/logs/", "_bmad-output/"];
148
- const newEntries = entries.filter((e) => !existing.includes(e));
285
+ const newEntries = entries.filter((e) => !existingLines.has(e));
149
286
  if (newEntries.length === 0)
150
287
  return;
151
288
  const suffix = existing.length > 0 && !existing.endsWith("\n")
152
289
  ? "\n" + newEntries.join("\n") + "\n"
153
290
  : newEntries.join("\n") + "\n";
154
- await writeFile(gitignorePath, existing + suffix);
291
+ await atomicWriteFile(gitignorePath, existing + suffix);
155
292
  }
156
293
  export async function mergeClaudeMd(projectDir) {
157
294
  const claudeMdPath = join(projectDir, "CLAUDE.md");
@@ -194,26 +331,128 @@ Use \`/bmalph\` to navigate phases. Use \`/bmad-help\` to discover all commands.
194
331
  | \`/sm\` | Scrum Master | Sprint planning, status, coordination |
195
332
  | \`/dev\` | Developer | Implementation, coding |
196
333
  | \`/ux-designer\` | UX Designer | User experience, wireframes |
197
- | \`/tea\` | Test Engineer | Test design, validation |
334
+ | \`/qa\` | QA Engineer | Test automation, quality assurance |
198
335
  `;
199
336
  let existing = "";
200
337
  try {
201
338
  existing = await readFile(claudeMdPath, "utf-8");
202
339
  }
203
- catch {
204
- // File doesn't exist, that's fine
340
+ catch (err) {
341
+ if (!isEnoent(err))
342
+ throw err;
205
343
  }
206
344
  if (existing.includes("## BMAD-METHOD Integration")) {
207
- return; // Already merged
345
+ // Replace stale section with current content, preserving content after it
346
+ const sectionStart = existing.indexOf("## BMAD-METHOD Integration");
347
+ const before = existing.slice(0, sectionStart);
348
+ const afterSection = existing.slice(sectionStart);
349
+ // Find the next level-2 heading after the BMAD section start
350
+ const nextHeadingMatch = afterSection.match(/\n## (?!BMAD-METHOD Integration)/);
351
+ const after = nextHeadingMatch ? afterSection.slice(nextHeadingMatch.index) : "";
352
+ await atomicWriteFile(claudeMdPath, before.trimEnd() + "\n" + snippet + after);
353
+ return;
208
354
  }
209
- await writeFile(claudeMdPath, existing + snippet);
355
+ await atomicWriteFile(claudeMdPath, existing + snippet);
210
356
  }
211
357
  export async function isInitialized(projectDir) {
358
+ return exists(join(projectDir, CONFIG_FILE));
359
+ }
360
+ export async function previewInstall(projectDir) {
361
+ const wouldCreate = [];
362
+ const wouldModify = [];
363
+ const wouldSkip = [];
364
+ // Directories that would be created
365
+ const dirsToCreate = [
366
+ `${STATE_DIR}/`,
367
+ ".ralph/specs/",
368
+ ".ralph/logs/",
369
+ ".ralph/docs/generated/",
370
+ "_bmad/",
371
+ ".claude/commands/",
372
+ ];
373
+ for (const dir of dirsToCreate) {
374
+ if (await exists(join(projectDir, dir))) {
375
+ if (dir === "_bmad/" || dir === ".claude/commands/") {
376
+ wouldModify.push(dir);
377
+ }
378
+ }
379
+ else {
380
+ wouldCreate.push(dir);
381
+ }
382
+ }
383
+ // Files that would be created/modified
384
+ const filesToCheck = [
385
+ { path: ".ralph/PROMPT.md", isTemplate: true },
386
+ { path: ".ralph/@AGENT.md", isTemplate: true },
387
+ { path: ".ralph/ralph_loop.sh", isTemplate: false },
388
+ { path: CONFIG_FILE, isTemplate: false },
389
+ ];
390
+ for (const file of filesToCheck) {
391
+ if (await exists(join(projectDir, file.path))) {
392
+ if (file.isTemplate) {
393
+ wouldModify.push(file.path);
394
+ }
395
+ }
396
+ else {
397
+ wouldCreate.push(file.path);
398
+ }
399
+ }
400
+ // .gitignore would be modified if it exists, created otherwise
401
+ if (await exists(join(projectDir, ".gitignore"))) {
402
+ wouldModify.push(".gitignore");
403
+ }
404
+ else {
405
+ wouldCreate.push(".gitignore");
406
+ }
407
+ // CLAUDE.md integration check
212
408
  try {
213
- await access(join(projectDir, "bmalph/config.json"));
214
- return true;
409
+ const claudeMd = await readFile(join(projectDir, "CLAUDE.md"), "utf-8");
410
+ if (claudeMd.includes("## BMAD-METHOD Integration")) {
411
+ wouldSkip.push("CLAUDE.md (already integrated)");
412
+ }
413
+ else {
414
+ wouldModify.push("CLAUDE.md");
415
+ }
215
416
  }
216
- catch {
217
- return false;
417
+ catch (err) {
418
+ if (isEnoent(err)) {
419
+ wouldCreate.push("CLAUDE.md");
420
+ }
421
+ else {
422
+ throw err;
423
+ }
424
+ }
425
+ return { wouldCreate, wouldModify, wouldSkip };
426
+ }
427
+ export async function previewUpgrade(projectDir) {
428
+ const managedPaths = [
429
+ { path: "_bmad/", isDir: true },
430
+ { path: ".ralph/ralph_loop.sh", isDir: false },
431
+ { path: ".ralph/ralph_import.sh", isDir: false },
432
+ { path: ".ralph/ralph_monitor.sh", isDir: false },
433
+ { path: ".ralph/lib/", isDir: true },
434
+ { path: ".ralph/PROMPT.md", isDir: false, templateName: "PROMPT.md" },
435
+ { path: ".ralph/@AGENT.md", isDir: false, templateName: "AGENT.md" },
436
+ { path: ".ralph/RALPH-REFERENCE.md", isDir: false },
437
+ { path: ".claude/commands/", isDir: true },
438
+ { path: ".gitignore", isDir: false },
439
+ ];
440
+ const wouldUpdate = [];
441
+ const wouldCreate = [];
442
+ const wouldPreserve = [];
443
+ for (const { path: p, templateName } of managedPaths) {
444
+ const fullPath = join(projectDir, p.replace(/\/$/, ""));
445
+ if (await exists(fullPath)) {
446
+ if (templateName && (await isTemplateCustomized(fullPath, templateName))) {
447
+ wouldPreserve.push(p);
448
+ }
449
+ else {
450
+ wouldUpdate.push(p);
451
+ }
452
+ }
453
+ else {
454
+ wouldCreate.push(p);
455
+ }
218
456
  }
457
+ return { wouldUpdate, wouldCreate, wouldPreserve };
219
458
  }
@@ -0,0 +1,2 @@
1
+ export declare function findArtifactsDir(projectDir: string): Promise<string | null>;
2
+ export declare function validateArtifacts(files: string[], artifactsDir: string): Promise<string[]>;
@@ -0,0 +1,46 @@
1
+ import { readFile } from "fs/promises";
2
+ import { join } from "path";
3
+ import { debug } from "../utils/logger.js";
4
+ import { exists } from "../utils/file-system.js";
5
+ export async function findArtifactsDir(projectDir) {
6
+ const candidates = [
7
+ "_bmad-output/planning-artifacts",
8
+ "_bmad-output/planning_artifacts",
9
+ "docs/planning",
10
+ ];
11
+ for (const candidate of candidates) {
12
+ const fullPath = join(projectDir, candidate);
13
+ debug(`Checking artifacts dir: ${fullPath}`);
14
+ if (await exists(fullPath)) {
15
+ debug(`Found artifacts at: ${fullPath}`);
16
+ return fullPath;
17
+ }
18
+ }
19
+ debug(`No artifacts found. Checked: ${candidates.join(", ")}`);
20
+ return null;
21
+ }
22
+ export async function validateArtifacts(files, artifactsDir) {
23
+ const warnings = [];
24
+ const hasPrd = files.some((f) => /prd/i.test(f));
25
+ if (!hasPrd) {
26
+ warnings.push("No PRD document found in planning artifacts");
27
+ }
28
+ const hasArchitecture = files.some((f) => /architect/i.test(f));
29
+ if (!hasArchitecture) {
30
+ warnings.push("No architecture document found in planning artifacts");
31
+ }
32
+ // Check readiness report for NO-GO
33
+ const readinessFile = files.find((f) => /readiness/i.test(f));
34
+ if (readinessFile) {
35
+ try {
36
+ const content = await readFile(join(artifactsDir, readinessFile), "utf-8");
37
+ if (/NO[-\s]?GO/i.test(content)) {
38
+ warnings.push("Readiness report indicates NO-GO status");
39
+ }
40
+ }
41
+ catch {
42
+ // Cannot read readiness file, skip
43
+ }
44
+ }
45
+ return warnings;
46
+ }
@@ -0,0 +1,19 @@
1
+ import type { ProjectContext, TruncationInfo } from "./types.js";
2
+ export interface ExtractProjectContextResult {
3
+ context: ProjectContext;
4
+ truncated: TruncationInfo[];
5
+ }
6
+ export interface ExtractSectionResult {
7
+ content: string;
8
+ wasTruncated: boolean;
9
+ originalLength: number;
10
+ }
11
+ export declare function extractSection(content: string, headingPattern: RegExp, maxLength?: number): string;
12
+ export declare function extractSectionWithInfo(content: string, headingPattern: RegExp, maxLength?: number): ExtractSectionResult;
13
+ export declare function extractProjectContext(artifacts: Map<string, string>): ExtractProjectContextResult;
14
+ /**
15
+ * Converts truncation info into human-readable warnings.
16
+ */
17
+ export declare function detectTruncation(truncated: TruncationInfo[]): string[];
18
+ export declare function generateProjectContextMd(context: ProjectContext, projectName: string): string;
19
+ export declare function generatePrompt(projectName: string, context?: ProjectContext): string;