bmad-method 5.1.3 → 6.0.0-Beta.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 (739) hide show
  1. package/.coderabbit.yaml +40 -0
  2. package/.github/CODE_OF_CONDUCT.md +128 -0
  3. package/.github/FUNDING.yaml +2 -2
  4. package/.github/ISSUE_TEMPLATE/config.yaml +8 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +11 -11
  6. package/.github/ISSUE_TEMPLATE/issue.md +32 -0
  7. package/.github/scripts/discord-helpers.sh +34 -0
  8. package/.github/workflows/discord.yaml +82 -17
  9. package/.github/workflows/docs.yaml +63 -0
  10. package/.github/workflows/manual-release.yaml +40 -20
  11. package/.github/workflows/quality.yaml +115 -0
  12. package/.husky/pre-commit +17 -0
  13. package/.markdownlint-cli2.yaml +41 -0
  14. package/.nvmrc +1 -0
  15. package/.prettierignore +9 -0
  16. package/.vscode/settings.json +38 -10
  17. package/CHANGELOG.md +1167 -372
  18. package/CNAME +1 -0
  19. package/CONTRIBUTING.md +100 -142
  20. package/CONTRIBUTORS.md +32 -0
  21. package/LICENSE +10 -1
  22. package/README.md +67 -170
  23. package/SECURITY.md +85 -0
  24. package/TRADEMARK.md +55 -0
  25. package/Wordmark.png +0 -0
  26. package/banner-bmad-method.png +0 -0
  27. package/docs/404.md +9 -0
  28. package/docs/_STYLE_GUIDE.md +367 -0
  29. package/docs/downloads.md +74 -0
  30. package/docs/explanation/advanced-elicitation.md +24 -0
  31. package/docs/explanation/adversarial-review.md +57 -0
  32. package/docs/explanation/brainstorming.md +31 -0
  33. package/docs/explanation/brownfield-faq.md +55 -0
  34. package/docs/explanation/party-mode.md +57 -0
  35. package/docs/explanation/preventing-agent-conflicts.md +110 -0
  36. package/docs/explanation/quick-flow.md +27 -0
  37. package/docs/explanation/why-solutioning-matters.md +75 -0
  38. package/docs/how-to/brownfield/index.md +84 -0
  39. package/docs/how-to/brownfield/quick-fix-in-brownfield.md +76 -0
  40. package/docs/how-to/customize-bmad.md +158 -0
  41. package/docs/how-to/get-answers-about-bmad.md +102 -0
  42. package/docs/how-to/install-bmad.md +82 -0
  43. package/docs/how-to/shard-large-documents.md +101 -0
  44. package/docs/how-to/upgrade-to-v6.md +131 -0
  45. package/docs/index.md +56 -0
  46. package/docs/reference/workflow-map.md +83 -0
  47. package/docs/tea/explanation/engagement-models.md +710 -0
  48. package/docs/tea/explanation/fixture-architecture.md +457 -0
  49. package/docs/tea/explanation/knowledge-base-system.md +554 -0
  50. package/docs/tea/explanation/network-first-patterns.md +853 -0
  51. package/docs/tea/explanation/risk-based-testing.md +586 -0
  52. package/docs/tea/explanation/tea-overview.md +410 -0
  53. package/docs/tea/explanation/test-quality-standards.md +907 -0
  54. package/docs/tea/explanation/testing-as-engineering.md +112 -0
  55. package/docs/tea/glossary/index.md +159 -0
  56. package/docs/tea/how-to/brownfield/use-tea-for-enterprise.md +525 -0
  57. package/docs/tea/how-to/brownfield/use-tea-with-existing-tests.md +577 -0
  58. package/docs/tea/how-to/customization/enable-tea-mcp-enhancements.md +424 -0
  59. package/docs/tea/how-to/customization/integrate-playwright-utils.md +813 -0
  60. package/docs/tea/how-to/workflows/run-atdd.md +436 -0
  61. package/docs/tea/how-to/workflows/run-automate.md +653 -0
  62. package/docs/tea/how-to/workflows/run-nfr-assess.md +679 -0
  63. package/docs/tea/how-to/workflows/run-test-design.md +135 -0
  64. package/docs/tea/how-to/workflows/run-test-review.md +605 -0
  65. package/docs/tea/how-to/workflows/run-trace.md +883 -0
  66. package/docs/tea/how-to/workflows/setup-ci.md +712 -0
  67. package/docs/tea/how-to/workflows/setup-test-framework.md +98 -0
  68. package/docs/tea/reference/commands.md +276 -0
  69. package/docs/tea/reference/configuration.md +678 -0
  70. package/docs/tea/reference/knowledge-base.md +340 -0
  71. package/docs/tea/tutorials/tea-lite-quickstart.md +444 -0
  72. package/docs/tutorials/getting-started.md +205 -0
  73. package/eslint.config.mjs +42 -9
  74. package/package.json +50 -38
  75. package/prettier.config.mjs +1 -1
  76. package/src/bmm/_module-installer/installer.js +48 -0
  77. package/src/bmm/agents/analyst.agent.yaml +36 -0
  78. package/src/bmm/agents/architect.agent.yaml +28 -0
  79. package/src/bmm/agents/dev.agent.yaml +38 -0
  80. package/src/bmm/agents/pm.agent.yaml +46 -0
  81. package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
  82. package/src/bmm/agents/sm.agent.yaml +36 -0
  83. package/src/bmm/agents/tea.agent.yaml +63 -0
  84. package/src/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
  85. package/src/bmm/agents/tech-writer/tech-writer.agent.yaml +45 -0
  86. package/src/bmm/agents/ux-designer.agent.yaml +26 -0
  87. package/src/bmm/data/project-context-template.md +26 -0
  88. package/src/bmm/module-help.csv +32 -0
  89. package/src/bmm/module.yaml +44 -0
  90. package/src/bmm/teams/default-party.csv +21 -0
  91. package/src/bmm/teams/team-fullstack.yaml +12 -0
  92. package/src/bmm/testarch/knowledge/adr-quality-readiness-checklist.md +350 -0
  93. package/src/bmm/testarch/knowledge/api-request.md +442 -0
  94. package/src/bmm/testarch/knowledge/api-testing-patterns.md +843 -0
  95. package/src/bmm/testarch/knowledge/auth-session.md +552 -0
  96. package/src/bmm/testarch/knowledge/burn-in.md +273 -0
  97. package/src/bmm/testarch/knowledge/ci-burn-in.md +675 -0
  98. package/src/bmm/testarch/knowledge/component-tdd.md +486 -0
  99. package/src/bmm/testarch/knowledge/contract-testing.md +957 -0
  100. package/src/bmm/testarch/knowledge/data-factories.md +500 -0
  101. package/src/bmm/testarch/knowledge/email-auth.md +721 -0
  102. package/src/bmm/testarch/knowledge/error-handling.md +725 -0
  103. package/src/bmm/testarch/knowledge/feature-flags.md +750 -0
  104. package/src/bmm/testarch/knowledge/file-utils.md +463 -0
  105. package/src/bmm/testarch/knowledge/fixture-architecture.md +401 -0
  106. package/src/bmm/testarch/knowledge/fixtures-composition.md +382 -0
  107. package/src/bmm/testarch/knowledge/intercept-network-call.md +430 -0
  108. package/src/bmm/testarch/knowledge/log.md +429 -0
  109. package/src/bmm/testarch/knowledge/network-error-monitor.md +405 -0
  110. package/src/bmm/testarch/knowledge/network-first.md +486 -0
  111. package/src/bmm/testarch/knowledge/network-recorder.md +527 -0
  112. package/src/bmm/testarch/knowledge/nfr-criteria.md +670 -0
  113. package/src/bmm/testarch/knowledge/overview.md +286 -0
  114. package/src/bmm/testarch/knowledge/playwright-config.md +730 -0
  115. package/src/bmm/testarch/knowledge/probability-impact.md +601 -0
  116. package/src/bmm/testarch/knowledge/recurse.md +421 -0
  117. package/src/bmm/testarch/knowledge/risk-governance.md +615 -0
  118. package/src/bmm/testarch/knowledge/selective-testing.md +732 -0
  119. package/src/bmm/testarch/knowledge/selector-resilience.md +527 -0
  120. package/src/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
  121. package/src/bmm/testarch/knowledge/test-levels-framework.md +473 -0
  122. package/src/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
  123. package/src/bmm/testarch/knowledge/test-quality.md +664 -0
  124. package/src/bmm/testarch/knowledge/timing-debugging.md +372 -0
  125. package/src/bmm/testarch/knowledge/visual-debugging.md +524 -0
  126. package/src/bmm/testarch/tea-index.csv +35 -0
  127. package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
  128. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
  129. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
  130. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
  131. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
  132. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
  133. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
  134. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -0
  135. package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +58 -0
  136. package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
  137. package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
  138. package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
  139. package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
  140. package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
  141. package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -0
  142. package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
  143. package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
  144. package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +200 -0
  145. package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
  146. package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
  147. package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
  148. package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -0
  149. package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
  150. package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
  151. package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
  152. package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
  153. package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
  154. package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +239 -0
  155. package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -0
  156. package/src/bmm/workflows/1-analysis/research/workflow.md +173 -0
  157. package/src/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +13 -0
  158. package/src/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
  159. package/src/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
  160. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +191 -0
  161. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +153 -0
  162. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +224 -0
  163. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +226 -0
  164. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +213 -0
  165. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +207 -0
  166. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +226 -0
  167. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +237 -0
  168. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +228 -0
  169. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +231 -0
  170. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +242 -0
  171. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +217 -0
  172. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +124 -0
  173. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +247 -0
  174. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
  175. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +249 -0
  176. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +253 -0
  177. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +168 -0
  178. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +218 -0
  179. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -0
  180. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -0
  181. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -0
  182. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
  183. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -0
  184. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -0
  185. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
  186. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
  187. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -0
  188. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -0
  189. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
  190. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -0
  191. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +231 -0
  192. package/src/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -0
  193. package/src/bmm/workflows/2-plan-workflows/create-prd/validation-report-prd-workflow.md +433 -0
  194. package/src/bmm/workflows/2-plan-workflows/create-prd/workflow.md +150 -0
  195. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
  196. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
  197. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
  198. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
  199. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
  200. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
  201. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
  202. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
  203. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
  204. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
  205. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
  206. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
  207. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
  208. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
  209. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -0
  210. package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
  211. package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +43 -0
  212. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +190 -0
  213. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +178 -0
  214. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
  215. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +139 -0
  216. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
  217. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +135 -0
  218. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
  219. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +55 -0
  220. package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
  221. package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +11 -0
  222. package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
  223. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
  224. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -0
  225. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
  226. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -0
  227. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
  228. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
  229. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
  230. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
  231. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -0
  232. package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +50 -0
  233. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
  234. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
  235. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
  236. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -0
  237. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
  238. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +59 -0
  239. package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
  240. package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
  241. package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +51 -0
  242. package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
  243. package/src/bmm/workflows/4-implementation/correct-course/instructions.md +206 -0
  244. package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +60 -0
  245. package/src/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
  246. package/src/bmm/workflows/4-implementation/create-story/instructions.xml +345 -0
  247. package/src/bmm/workflows/4-implementation/create-story/template.md +49 -0
  248. package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +61 -0
  249. package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
  250. package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
  251. package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +27 -0
  252. package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1443 -0
  253. package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +58 -0
  254. package/src/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
  255. package/src/bmm/workflows/4-implementation/sprint-planning/instructions.md +225 -0
  256. package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
  257. package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +54 -0
  258. package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +229 -0
  259. package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +36 -0
  260. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +176 -0
  261. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +120 -0
  262. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +113 -0
  263. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +113 -0
  264. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +106 -0
  265. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +149 -0
  266. package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
  267. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +192 -0
  268. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +145 -0
  269. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +128 -0
  270. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +201 -0
  271. package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
  272. package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
  273. package/src/bmm/workflows/document-project/checklist.md +245 -0
  274. package/src/bmm/workflows/document-project/documentation-requirements.csv +12 -0
  275. package/src/bmm/workflows/document-project/instructions.md +221 -0
  276. package/src/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
  277. package/src/bmm/workflows/document-project/templates/index-template.md +169 -0
  278. package/src/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
  279. package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
  280. package/src/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
  281. package/src/bmm/workflows/document-project/workflow.yaml +30 -0
  282. package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
  283. package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
  284. package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
  285. package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
  286. package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +90 -0
  287. package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +127 -0
  288. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +39 -0
  289. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +130 -0
  290. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +27 -0
  291. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +43 -0
  292. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +141 -0
  293. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +27 -0
  294. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +49 -0
  295. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +241 -0
  296. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +27 -0
  297. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +38 -0
  298. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +133 -0
  299. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +27 -0
  300. package/src/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
  301. package/src/bmm/workflows/testarch/atdd/checklist.md +374 -0
  302. package/src/bmm/workflows/testarch/atdd/instructions.md +806 -0
  303. package/src/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
  304. package/src/bmm/workflows/testarch/automate/checklist.md +582 -0
  305. package/src/bmm/workflows/testarch/automate/instructions.md +1324 -0
  306. package/src/bmm/workflows/testarch/automate/workflow.yaml +54 -0
  307. package/src/bmm/workflows/testarch/ci/checklist.md +247 -0
  308. package/src/bmm/workflows/testarch/ci/github-actions-template.yaml +198 -0
  309. package/src/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +149 -0
  310. package/src/bmm/workflows/testarch/ci/instructions.md +536 -0
  311. package/src/bmm/workflows/testarch/ci/workflow.yaml +47 -0
  312. package/src/bmm/workflows/testarch/framework/checklist.md +320 -0
  313. package/src/bmm/workflows/testarch/framework/instructions.md +481 -0
  314. package/src/bmm/workflows/testarch/framework/workflow.yaml +49 -0
  315. package/src/bmm/workflows/testarch/nfr-assess/checklist.md +407 -0
  316. package/src/bmm/workflows/testarch/nfr-assess/instructions.md +726 -0
  317. package/src/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +461 -0
  318. package/src/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
  319. package/src/bmm/workflows/testarch/test-design/checklist.md +407 -0
  320. package/src/bmm/workflows/testarch/test-design/instructions.md +1158 -0
  321. package/src/bmm/workflows/testarch/test-design/test-design-architecture-template.md +213 -0
  322. package/src/bmm/workflows/testarch/test-design/test-design-qa-template.md +286 -0
  323. package/src/bmm/workflows/testarch/test-design/test-design-template.md +294 -0
  324. package/src/bmm/workflows/testarch/test-design/workflow.yaml +71 -0
  325. package/src/bmm/workflows/testarch/test-review/checklist.md +472 -0
  326. package/src/bmm/workflows/testarch/test-review/instructions.md +628 -0
  327. package/src/bmm/workflows/testarch/test-review/test-review-template.md +390 -0
  328. package/src/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
  329. package/src/bmm/workflows/testarch/trace/checklist.md +642 -0
  330. package/src/bmm/workflows/testarch/trace/instructions.md +1030 -0
  331. package/src/bmm/workflows/testarch/trace/trace-template.md +675 -0
  332. package/src/bmm/workflows/testarch/trace/workflow.yaml +57 -0
  333. package/src/core/_module-installer/installer.js +60 -0
  334. package/src/core/agents/bmad-master.agent.yaml +29 -0
  335. package/src/core/module-help.csv +9 -0
  336. package/src/core/module.yaml +25 -0
  337. package/src/core/resources/excalidraw/README.md +160 -0
  338. package/src/core/resources/excalidraw/excalidraw-helpers.md +127 -0
  339. package/src/core/resources/excalidraw/library-loader.md +50 -0
  340. package/src/core/resources/excalidraw/validate-json-instructions.md +79 -0
  341. package/src/core/tasks/editorial-review-prose.xml +100 -0
  342. package/src/core/tasks/editorial-review-structure.xml +209 -0
  343. package/src/core/tasks/help.md +62 -0
  344. package/src/core/tasks/index-docs.xml +65 -0
  345. package/src/core/tasks/review-adversarial-general.xml +48 -0
  346. package/src/core/tasks/shard-doc.xml +109 -0
  347. package/src/core/tasks/workflow.xml +235 -0
  348. package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
  349. package/src/core/workflows/advanced-elicitation/workflow.xml +117 -0
  350. package/src/core/workflows/brainstorming/brain-methods.csv +62 -0
  351. package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
  352. package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
  353. package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
  354. package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
  355. package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
  356. package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
  357. package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
  358. package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
  359. package/src/core/workflows/brainstorming/template.md +15 -0
  360. package/src/core/workflows/brainstorming/workflow.md +58 -0
  361. package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
  362. package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
  363. package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +157 -0
  364. package/src/core/workflows/party-mode/workflow.md +194 -0
  365. package/src/utility/agent-components/activation-rules.txt +6 -0
  366. package/src/utility/agent-components/activation-steps.txt +14 -0
  367. package/src/utility/agent-components/agent-command-header.md +1 -0
  368. package/src/utility/agent-components/agent.customize.template.yaml +41 -0
  369. package/src/utility/agent-components/handler-action.txt +4 -0
  370. package/src/utility/agent-components/handler-data.txt +5 -0
  371. package/src/utility/agent-components/handler-exec.txt +6 -0
  372. package/src/utility/agent-components/handler-multi.txt +14 -0
  373. package/src/utility/agent-components/handler-tmpl.txt +5 -0
  374. package/src/utility/agent-components/handler-validate-workflow.txt +7 -0
  375. package/src/utility/agent-components/handler-workflow.txt +10 -0
  376. package/src/utility/agent-components/menu-handlers.txt +6 -0
  377. package/test/README.md +295 -0
  378. package/test/adversarial-review-tests/README.md +56 -0
  379. package/test/adversarial-review-tests/sample-content.md +46 -0
  380. package/test/adversarial-review-tests/test-cases.yaml +103 -0
  381. package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +27 -0
  382. package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +30 -0
  383. package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +22 -0
  384. package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +20 -0
  385. package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +25 -0
  386. package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +24 -0
  387. package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +25 -0
  388. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -0
  389. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -0
  390. package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +31 -0
  391. package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +25 -0
  392. package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +25 -0
  393. package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +25 -0
  394. package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +25 -0
  395. package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
  396. package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
  397. package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +27 -0
  398. package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
  399. package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +24 -0
  400. package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +27 -0
  401. package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +27 -0
  402. package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +24 -0
  403. package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +29 -0
  404. package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +31 -0
  405. package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +28 -0
  406. package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +28 -0
  407. package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
  408. package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +28 -0
  409. package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
  410. package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
  411. package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
  412. package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +24 -0
  413. package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +22 -0
  414. package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +27 -0
  415. package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +31 -0
  416. package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +22 -0
  417. package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +38 -0
  418. package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +24 -0
  419. package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -0
  420. package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +34 -0
  421. package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -0
  422. package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +24 -0
  423. package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +24 -0
  424. package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +24 -0
  425. package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -0
  426. package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -0
  427. package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +24 -0
  428. package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +24 -0
  429. package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +22 -0
  430. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +28 -0
  431. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +30 -0
  432. package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +24 -0
  433. package/test/test-agent-schema.js +387 -0
  434. package/test/test-cli-integration.sh +159 -0
  435. package/test/test-installation-components.js +214 -0
  436. package/test/unit-test-schema.js +133 -0
  437. package/tools/bmad-npx-wrapper.js +11 -12
  438. package/tools/build-docs.js +577 -0
  439. package/tools/cli/README.md +7 -0
  440. package/tools/cli/bmad-cli.js +58 -0
  441. package/tools/cli/commands/install.js +87 -0
  442. package/tools/cli/commands/status.js +65 -0
  443. package/tools/cli/external-official-modules.yaml +44 -0
  444. package/tools/cli/installers/install-messages.yaml +59 -0
  445. package/tools/cli/installers/lib/core/config-collector.js +1079 -0
  446. package/tools/cli/installers/lib/core/custom-module-cache.js +259 -0
  447. package/tools/cli/installers/lib/core/dependency-resolver.js +739 -0
  448. package/tools/cli/installers/lib/core/detector.js +223 -0
  449. package/tools/cli/installers/lib/core/ide-config-manager.js +156 -0
  450. package/tools/cli/installers/lib/core/installer.js +2826 -0
  451. package/tools/cli/installers/lib/core/manifest-generator.js +1054 -0
  452. package/tools/cli/installers/lib/core/manifest.js +1036 -0
  453. package/tools/cli/installers/lib/custom/handler.js +363 -0
  454. package/tools/cli/installers/lib/ide/STANDARDIZATION_PLAN.md +208 -0
  455. package/tools/cli/installers/lib/ide/_base-ide.js +655 -0
  456. package/tools/cli/installers/lib/ide/antigravity.js +474 -0
  457. package/tools/cli/installers/lib/ide/auggie.js +244 -0
  458. package/tools/cli/installers/lib/ide/claude-code.js +506 -0
  459. package/tools/cli/installers/lib/ide/cline.js +272 -0
  460. package/tools/cli/installers/lib/ide/codex.js +412 -0
  461. package/tools/cli/installers/lib/ide/crush.js +149 -0
  462. package/tools/cli/installers/lib/ide/cursor.js +160 -0
  463. package/tools/cli/installers/lib/ide/gemini.js +301 -0
  464. package/tools/cli/installers/lib/ide/github-copilot.js +383 -0
  465. package/tools/cli/installers/lib/ide/iflow.js +191 -0
  466. package/tools/cli/installers/lib/ide/kilo.js +250 -0
  467. package/tools/cli/installers/lib/ide/kiro-cli.js +326 -0
  468. package/tools/cli/installers/lib/ide/manager.js +244 -0
  469. package/tools/cli/installers/lib/ide/opencode.js +257 -0
  470. package/tools/cli/installers/lib/ide/qwen.js +372 -0
  471. package/tools/cli/installers/lib/ide/roo.js +273 -0
  472. package/tools/cli/installers/lib/ide/rovo-dev.js +290 -0
  473. package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +165 -0
  474. package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +158 -0
  475. package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
  476. package/tools/cli/installers/lib/ide/shared/path-utils.js +165 -0
  477. package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +268 -0
  478. package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +293 -0
  479. package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
  480. package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +14 -0
  481. package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +12 -0
  482. package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +13 -0
  483. package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
  484. package/tools/cli/installers/lib/ide/trae.js +313 -0
  485. package/tools/cli/installers/lib/ide/windsurf.js +258 -0
  486. package/tools/cli/installers/lib/message-loader.js +85 -0
  487. package/tools/cli/installers/lib/modules/external-manager.js +135 -0
  488. package/tools/cli/installers/lib/modules/manager.js +1375 -0
  489. package/tools/cli/lib/activation-builder.js +163 -0
  490. package/tools/cli/lib/agent/compiler.js +522 -0
  491. package/tools/cli/lib/agent/installer.js +716 -0
  492. package/tools/cli/lib/agent/template-engine.js +152 -0
  493. package/tools/cli/lib/agent-analyzer.js +109 -0
  494. package/tools/cli/lib/agent-party-generator.js +194 -0
  495. package/tools/cli/lib/cli-utils.js +227 -0
  496. package/tools/cli/lib/config.js +213 -0
  497. package/tools/cli/lib/file-ops.js +204 -0
  498. package/tools/cli/lib/platform-codes.js +116 -0
  499. package/tools/cli/lib/project-root.js +77 -0
  500. package/tools/cli/lib/prompts.js +433 -0
  501. package/tools/cli/lib/ui.js +1716 -0
  502. package/tools/cli/lib/xml-handler.js +177 -0
  503. package/tools/cli/lib/xml-to-markdown.js +82 -0
  504. package/tools/{yaml-format.js → cli/lib/yaml-format.js} +9 -17
  505. package/tools/cli/lib/yaml-xml-builder.js +587 -0
  506. package/tools/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
  507. package/tools/docs/fix-refs.md +91 -0
  508. package/tools/docs/index.md +2 -0
  509. package/tools/fix-doc-links.js +288 -0
  510. package/tools/flattener/ignoreRules.js +2 -6
  511. package/tools/flattener/main.js +31 -121
  512. package/tools/flattener/projectRoot.js +3 -8
  513. package/tools/flattener/stats.helpers.js +8 -35
  514. package/tools/flattener/stats.js +1 -6
  515. package/tools/flattener/test-matrix.js +1 -5
  516. package/tools/flattener/xml.js +1 -7
  517. package/tools/format-workflow-md.js +263 -0
  518. package/tools/lib/xml-utils.js +13 -0
  519. package/tools/maintainer/review-pr-README.md +55 -0
  520. package/tools/maintainer/review-pr.md +242 -0
  521. package/tools/migrate-custom-module-paths.js +124 -0
  522. package/tools/platform-codes.yaml +157 -0
  523. package/tools/schema/agent.js +491 -0
  524. package/tools/validate-agent-schema.js +110 -0
  525. package/tools/validate-doc-links.js +371 -0
  526. package/tools/validate-svg-changes.sh +356 -0
  527. package/website/README.md +76 -0
  528. package/website/_basement/components/WorkflowGuide.astro +444 -0
  529. package/website/_basement/pages/workflow-guide.astro +17 -0
  530. package/website/astro.config.mjs +169 -0
  531. package/website/public/favicon.ico +0 -0
  532. package/website/public/img/bmad-dark.png +0 -0
  533. package/website/public/img/bmad-light.png +0 -0
  534. package/website/public/img/logo.svg +4 -0
  535. package/website/public/img/workflow-map.png +0 -0
  536. package/website/public/robots.txt +37 -0
  537. package/website/public/workflow-map-diagram.html +361 -0
  538. package/website/src/components/Banner.astro +59 -0
  539. package/website/src/components/Header.astro +121 -0
  540. package/website/src/components/MobileMenuFooter.astro +53 -0
  541. package/website/src/content/config.ts +6 -0
  542. package/website/src/lib/site-url.js +25 -0
  543. package/website/src/pages/404.astro +11 -0
  544. package/website/src/rehype-base-paths.js +89 -0
  545. package/website/src/rehype-markdown-links.js +117 -0
  546. package/website/src/styles/custom.css +500 -0
  547. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
  548. package/.github/workflows/format-check.yaml +0 -42
  549. package/bmad-core/agent-teams/team-all.yaml +0 -14
  550. package/bmad-core/agent-teams/team-fullstack.yaml +0 -18
  551. package/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
  552. package/bmad-core/agent-teams/team-no-ui.yaml +0 -13
  553. package/bmad-core/agents/analyst.md +0 -81
  554. package/bmad-core/agents/architect.md +0 -83
  555. package/bmad-core/agents/bmad-master.md +0 -107
  556. package/bmad-core/agents/bmad-orchestrator.md +0 -149
  557. package/bmad-core/agents/dev.md +0 -75
  558. package/bmad-core/agents/pm.md +0 -81
  559. package/bmad-core/agents/po.md +0 -76
  560. package/bmad-core/agents/qa.md +0 -88
  561. package/bmad-core/agents/sm.md +0 -62
  562. package/bmad-core/agents/ux-expert.md +0 -66
  563. package/bmad-core/checklists/architect-checklist.md +0 -438
  564. package/bmad-core/checklists/change-checklist.md +0 -182
  565. package/bmad-core/checklists/pm-checklist.md +0 -370
  566. package/bmad-core/checklists/po-master-checklist.md +0 -432
  567. package/bmad-core/checklists/story-dod-checklist.md +0 -94
  568. package/bmad-core/checklists/story-draft-checklist.md +0 -153
  569. package/bmad-core/core-config.yaml +0 -20
  570. package/bmad-core/data/bmad-kb.md +0 -806
  571. package/bmad-core/data/brainstorming-techniques.md +0 -36
  572. package/bmad-core/data/elicitation-methods.md +0 -154
  573. package/bmad-core/data/technical-preferences.md +0 -3
  574. package/bmad-core/data/test-levels-framework.md +0 -146
  575. package/bmad-core/data/test-priorities-matrix.md +0 -172
  576. package/bmad-core/tasks/advanced-elicitation.md +0 -117
  577. package/bmad-core/tasks/brownfield-create-epic.md +0 -160
  578. package/bmad-core/tasks/brownfield-create-story.md +0 -147
  579. package/bmad-core/tasks/correct-course.md +0 -70
  580. package/bmad-core/tasks/create-brownfield-story.md +0 -312
  581. package/bmad-core/tasks/create-deep-research-prompt.md +0 -278
  582. package/bmad-core/tasks/create-next-story.md +0 -112
  583. package/bmad-core/tasks/document-project.md +0 -343
  584. package/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
  585. package/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
  586. package/bmad-core/tasks/index-docs.md +0 -173
  587. package/bmad-core/tasks/kb-mode-interaction.md +0 -75
  588. package/bmad-core/tasks/nfr-assess.md +0 -343
  589. package/bmad-core/tasks/qa-gate.md +0 -159
  590. package/bmad-core/tasks/review-story.md +0 -314
  591. package/bmad-core/tasks/risk-profile.md +0 -353
  592. package/bmad-core/tasks/shard-doc.md +0 -185
  593. package/bmad-core/tasks/test-design.md +0 -174
  594. package/bmad-core/tasks/trace-requirements.md +0 -264
  595. package/bmad-core/tasks/validate-next-story.md +0 -134
  596. package/bmad-core/templates/architecture-tmpl.yaml +0 -650
  597. package/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
  598. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
  599. package/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
  600. package/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -306
  601. package/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -218
  602. package/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
  603. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -823
  604. package/bmad-core/templates/market-research-tmpl.yaml +0 -252
  605. package/bmad-core/templates/prd-tmpl.yaml +0 -202
  606. package/bmad-core/templates/project-brief-tmpl.yaml +0 -221
  607. package/bmad-core/templates/qa-gate-tmpl.yaml +0 -102
  608. package/bmad-core/templates/story-tmpl.yaml +0 -137
  609. package/bmad-core/workflows/brownfield-fullstack.yaml +0 -297
  610. package/bmad-core/workflows/brownfield-service.yaml +0 -187
  611. package/bmad-core/workflows/brownfield-ui.yaml +0 -197
  612. package/bmad-core/workflows/greenfield-fullstack.yaml +0 -240
  613. package/bmad-core/workflows/greenfield-service.yaml +0 -206
  614. package/bmad-core/workflows/greenfield-ui.yaml +0 -235
  615. package/common/tasks/create-doc.md +0 -101
  616. package/common/tasks/execute-checklist.md +0 -86
  617. package/common/utils/bmad-doc-template.md +0 -325
  618. package/common/utils/workflow-management.md +0 -69
  619. package/dist/agents/analyst.txt +0 -2889
  620. package/dist/agents/architect.txt +0 -3552
  621. package/dist/agents/bmad-master.txt +0 -8769
  622. package/dist/agents/bmad-orchestrator.txt +0 -1513
  623. package/dist/agents/dev.txt +0 -414
  624. package/dist/agents/pm.txt +0 -2204
  625. package/dist/agents/po.txt +0 -1346
  626. package/dist/agents/qa.txt +0 -1987
  627. package/dist/agents/sm.txt +0 -658
  628. package/dist/agents/ux-expert.txt +0 -694
  629. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +0 -2371
  630. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +0 -1620
  631. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +0 -815
  632. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -10952
  633. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +0 -4012
  634. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +0 -3698
  635. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -450
  636. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +0 -973
  637. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -15376
  638. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +0 -2075
  639. package/dist/teams/team-all.txt +0 -12682
  640. package/dist/teams/team-fullstack.txt +0 -10421
  641. package/dist/teams/team-ide-minimal.txt +0 -5103
  642. package/dist/teams/team-no-ui.txt +0 -8980
  643. package/docs/GUIDING-PRINCIPLES.md +0 -91
  644. package/docs/core-architecture.md +0 -219
  645. package/docs/enhanced-ide-development-workflow.md +0 -248
  646. package/docs/expansion-packs.md +0 -280
  647. package/docs/how-to-contribute-with-pull-requests.md +0 -158
  648. package/docs/user-guide.md +0 -504
  649. package/docs/versioning-and-releases.md +0 -147
  650. package/docs/versions.md +0 -48
  651. package/docs/working-in-the-brownfield.md +0 -597
  652. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +0 -102
  653. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash copy.txt +0 -13
  654. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash.txt +0 -13
  655. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.2 Agent Development Kit Installation/1.2.2 - Basic Project Structure - txt.txt +0 -25
  656. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.1 - settings.py +0 -34
  657. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.2 - main.py - Base Application.py +0 -70
  658. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.4 Deployment Configuration/1.4.2 - cloudbuild.yaml +0 -26
  659. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +0 -109
  660. package/expansion-packs/README.md +0 -3
  661. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -13
  662. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -71
  663. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -78
  664. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -64
  665. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -201
  666. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -160
  667. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +0 -8
  668. package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -250
  669. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -647
  670. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -110
  671. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -216
  672. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -290
  673. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -613
  674. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -356
  675. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -343
  676. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -253
  677. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  678. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  679. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -175
  680. package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +0 -14
  681. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +0 -80
  682. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +0 -77
  683. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +0 -78
  684. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +0 -65
  685. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -391
  686. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +0 -203
  687. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +0 -201
  688. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -124
  689. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +0 -6
  690. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -769
  691. package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -586
  692. package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -110
  693. package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -141
  694. package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +0 -184
  695. package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -290
  696. package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +0 -200
  697. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +0 -1030
  698. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +0 -356
  699. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +0 -705
  700. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +0 -256
  701. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  702. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  703. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +0 -175
  704. package/expansion-packs/bmad-infrastructure-devops/README.md +0 -147
  705. package/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +0 -71
  706. package/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +0 -484
  707. package/expansion-packs/bmad-infrastructure-devops/config.yaml +0 -9
  708. package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -305
  709. package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -159
  710. package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -153
  711. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -424
  712. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -629
  713. package/release_notes.md +0 -33
  714. package/tools/builders/web-builder.js +0 -675
  715. package/tools/bump-all-versions.js +0 -115
  716. package/tools/bump-expansion-version.js +0 -90
  717. package/tools/cli.js +0 -152
  718. package/tools/installer/README.md +0 -8
  719. package/tools/installer/bin/bmad.js +0 -585
  720. package/tools/installer/config/ide-agent-config.yaml +0 -58
  721. package/tools/installer/config/install.config.yaml +0 -123
  722. package/tools/installer/lib/config-loader.js +0 -257
  723. package/tools/installer/lib/file-manager.js +0 -389
  724. package/tools/installer/lib/ide-base-setup.js +0 -228
  725. package/tools/installer/lib/ide-setup.js +0 -1441
  726. package/tools/installer/lib/installer.js +0 -1995
  727. package/tools/installer/lib/memory-profiler.js +0 -225
  728. package/tools/installer/lib/module-manager.js +0 -114
  729. package/tools/installer/lib/resource-locator.js +0 -308
  730. package/tools/installer/package.json +0 -44
  731. package/tools/lib/dependency-resolver.js +0 -175
  732. package/tools/lib/yaml-utils.js +0 -29
  733. package/tools/md-assets/web-agent-startup-instructions.md +0 -39
  734. package/tools/preview-release-notes.js +0 -66
  735. package/tools/shared/bannerArt.js +0 -105
  736. package/tools/sync-installer-version.js +0 -32
  737. package/tools/update-expansion-version.js +0 -53
  738. package/tools/upgraders/v3-to-v4-upgrader.js +0 -672
  739. package/tools/version-bump.js +0 -94
@@ -0,0 +1,907 @@
1
+ ---
2
+ title: "Test Quality Standards Explained"
3
+ description: Understanding TEA's Definition of Done for deterministic, isolated, and maintainable tests
4
+ ---
5
+
6
+ # Test Quality Standards Explained
7
+
8
+ Test quality standards define what makes a test "good" in TEA. These aren't suggestions - they're the Definition of Done that prevents tests from rotting in review.
9
+
10
+ ## Overview
11
+
12
+ **TEA's Quality Principles:**
13
+ - **Deterministic** - Same result every run
14
+ - **Isolated** - No dependencies on other tests
15
+ - **Explicit** - Assertions visible in test body
16
+ - **Focused** - Single responsibility, appropriate size
17
+ - **Fast** - Execute in reasonable time
18
+
19
+ **Why these matter:** Tests that violate these principles create maintenance burden, slow down development, and lose team trust.
20
+
21
+ ## The Problem
22
+
23
+ ### Tests That Rot in Review
24
+
25
+ ```typescript
26
+ // ❌ The anti-pattern: This test will rot
27
+ test('user can do stuff', async ({ page }) => {
28
+ await page.goto('/');
29
+ await page.waitForTimeout(5000); // Non-deterministic
30
+
31
+ if (await page.locator('.banner').isVisible()) { // Conditional
32
+ await page.click('.dismiss');
33
+ }
34
+
35
+ try { // Try-catch for flow control
36
+ await page.click('#load-more');
37
+ } catch (e) {
38
+ // Silently continue
39
+ }
40
+
41
+ // ... 300 more lines of test logic
42
+ // ... no clear assertions
43
+ });
44
+ ```
45
+
46
+ **What's wrong:**
47
+ - **Hard wait** - Flaky, wastes time
48
+ - **Conditional** - Non-deterministic behavior
49
+ - **Try-catch** - Hides failures
50
+ - **Too large** - Hard to maintain
51
+ - **Vague name** - Unclear purpose
52
+ - **No explicit assertions** - What's being tested?
53
+
54
+ **Result:** PR review comments: "This test is flaky, please fix" → never merged → test deleted → coverage lost
55
+
56
+ ### AI-Generated Tests Without Standards
57
+
58
+ AI-generated tests without quality guardrails:
59
+
60
+ ```typescript
61
+ // AI generates 50 tests like this:
62
+ test('test1', async ({ page }) => {
63
+ await page.goto('/');
64
+ await page.waitForTimeout(3000);
65
+ // ... flaky, vague, redundant
66
+ });
67
+
68
+ test('test2', async ({ page }) => {
69
+ await page.goto('/');
70
+ await page.waitForTimeout(3000);
71
+ // ... duplicates test1
72
+ });
73
+
74
+ // ... 48 more similar tests
75
+ ```
76
+
77
+ **Result:** 50 tests, 80% redundant, 90% flaky, 0% trusted by team - low-quality outputs that create maintenance burden.
78
+
79
+ ## The Solution: TEA's Quality Standards
80
+
81
+ ### 1. Determinism (No Flakiness)
82
+
83
+ **Rule:** Test produces same result every run.
84
+
85
+ **Requirements:**
86
+ - ❌ No hard waits (`waitForTimeout`)
87
+ - ❌ No conditionals for flow control (`if/else`)
88
+ - ❌ No try-catch for flow control
89
+ - ✅ Use network-first patterns (wait for responses)
90
+ - ✅ Use explicit waits (waitForSelector, waitForResponse)
91
+
92
+ **Bad Example:**
93
+ ```typescript
94
+ test('flaky test', async ({ page }) => {
95
+ await page.click('button');
96
+ await page.waitForTimeout(2000); // ❌ Might be too short
97
+
98
+ if (await page.locator('.modal').isVisible()) { // ❌ Non-deterministic
99
+ await page.click('.dismiss');
100
+ }
101
+
102
+ try { // ❌ Silently handles errors
103
+ await expect(page.locator('.success')).toBeVisible();
104
+ } catch (e) {
105
+ // Test passes even if assertion fails!
106
+ }
107
+ });
108
+ ```
109
+
110
+ **Good Example (Vanilla Playwright):**
111
+ ```typescript
112
+ test('deterministic test', async ({ page }) => {
113
+ const responsePromise = page.waitForResponse(
114
+ resp => resp.url().includes('/api/submit') && resp.ok()
115
+ );
116
+
117
+ await page.click('button');
118
+ await responsePromise; // ✅ Wait for actual response
119
+
120
+ // Modal should ALWAYS show (make it deterministic)
121
+ await expect(page.locator('.modal')).toBeVisible();
122
+ await page.click('.dismiss');
123
+
124
+ // Explicit assertion (fails if not visible)
125
+ await expect(page.locator('.success')).toBeVisible();
126
+ });
127
+ ```
128
+
129
+ **With Playwright Utils (Even Cleaner):**
130
+ ```typescript
131
+ import { test } from '@seontechnologies/playwright-utils/fixtures';
132
+ import { expect } from '@playwright/test';
133
+
134
+ test('deterministic test', async ({ page, interceptNetworkCall }) => {
135
+ const submitCall = interceptNetworkCall({
136
+ method: 'POST',
137
+ url: '**/api/submit'
138
+ });
139
+
140
+ await page.click('button');
141
+
142
+ // Wait for actual response (automatic JSON parsing)
143
+ const { status, responseJson } = await submitCall;
144
+ expect(status).toBe(200);
145
+
146
+ // Modal should ALWAYS show (make it deterministic)
147
+ await expect(page.locator('.modal')).toBeVisible();
148
+ await page.click('.dismiss');
149
+
150
+ // Explicit assertion (fails if not visible)
151
+ await expect(page.locator('.success')).toBeVisible();
152
+ });
153
+ ```
154
+
155
+ **Why both work:**
156
+ - Waits for actual event (network response)
157
+ - No conditionals (behavior is deterministic)
158
+ - Assertions fail loudly (no silent failures)
159
+ - Same result every run (deterministic)
160
+
161
+ **Playwright Utils additional benefits:**
162
+ - Automatic JSON parsing
163
+ - `{ status, responseJson }` structure (can validate response data)
164
+ - No manual `await response.json()`
165
+
166
+ ### 2. Isolation (No Dependencies)
167
+
168
+ **Rule:** Test runs independently, no shared state.
169
+
170
+ **Requirements:**
171
+ - ✅ Self-cleaning (cleanup after test)
172
+ - ✅ No global state dependencies
173
+ - ✅ Can run in parallel
174
+ - ✅ Can run in any order
175
+ - ✅ Use unique test data
176
+
177
+ **Bad Example:**
178
+ ```typescript
179
+ // ❌ Tests depend on execution order
180
+ let userId: string; // Shared global state
181
+
182
+ test('create user', async ({ apiRequest }) => {
183
+ const { body } = await apiRequest({
184
+ method: 'POST',
185
+ path: '/api/users',
186
+ body: { email: 'test@example.com' } (hard-coded)
187
+ });
188
+ userId = body.id; // Store in global
189
+ });
190
+
191
+ test('update user', async ({ apiRequest }) => {
192
+ // Depends on previous test setting userId
193
+ await apiRequest({
194
+ method: 'PATCH',
195
+ path: `/api/users/${userId}`,
196
+ body: { name: 'Updated' }
197
+ });
198
+ // No cleanup - leaves user in database
199
+ });
200
+ ```
201
+
202
+ **Problems:**
203
+ - Tests must run in order (can't parallelize)
204
+ - Second test fails if first skipped (`.only`)
205
+ - Hard-coded data causes conflicts
206
+ - No cleanup (database fills with test data)
207
+
208
+ **Good Example (Vanilla Playwright):**
209
+ ```typescript
210
+ test('should update user profile', async ({ request }) => {
211
+ // Create unique test data
212
+ const testEmail = `test-${Date.now()}@example.com`;
213
+
214
+ // Setup: Create user
215
+ const createResp = await request.post('/api/users', {
216
+ data: { email: testEmail, name: 'Original' }
217
+ });
218
+ const user = await createResp.json();
219
+
220
+ // Test: Update user
221
+ const updateResp = await request.patch(`/api/users/${user.id}`, {
222
+ data: { name: 'Updated' }
223
+ });
224
+ const updated = await updateResp.json();
225
+
226
+ expect(updated.name).toBe('Updated');
227
+
228
+ // Cleanup: Delete user
229
+ await request.delete(`/api/users/${user.id}`);
230
+ });
231
+ ```
232
+
233
+ **Even Better (With Playwright Utils):**
234
+ ```typescript
235
+ import { test } from '@seontechnologies/playwright-utils/api-request/fixtures';
236
+ import { expect } from '@playwright/test';
237
+ import { faker } from '@faker-js/faker';
238
+
239
+ test('should update user profile', async ({ apiRequest }) => {
240
+ // Dynamic unique test data
241
+ const testEmail = faker.internet.email();
242
+
243
+ // Setup: Create user
244
+ const { status: createStatus, body: user } = await apiRequest({
245
+ method: 'POST',
246
+ path: '/api/users',
247
+ body: { email: testEmail, name: faker.person.fullName() }
248
+ });
249
+
250
+ expect(createStatus).toBe(201);
251
+
252
+ // Test: Update user
253
+ const { status, body: updated } = await apiRequest({
254
+ method: 'PATCH',
255
+ path: `/api/users/${user.id}`,
256
+ body: { name: 'Updated Name' }
257
+ });
258
+
259
+ expect(status).toBe(200);
260
+ expect(updated.name).toBe('Updated Name');
261
+
262
+ // Cleanup: Delete user
263
+ await apiRequest({
264
+ method: 'DELETE',
265
+ path: `/api/users/${user.id}`
266
+ });
267
+ });
268
+ ```
269
+
270
+ **Playwright Utils Benefits:**
271
+ - `{ status, body }` destructuring (cleaner than `response.status()` + `await response.json()`)
272
+ - No manual `await response.json()`
273
+ - Automatic retry for 5xx errors
274
+ - Optional schema validation with `.validateSchema()`
275
+
276
+ **Why it works:**
277
+ - No global state
278
+ - Unique test data (no conflicts)
279
+ - Self-cleaning (deletes user)
280
+ - Can run in parallel
281
+ - Can run in any order
282
+
283
+ ### 3. Explicit Assertions (No Hidden Validation)
284
+
285
+ **Rule:** Assertions visible in test body, not abstracted.
286
+
287
+ **Requirements:**
288
+ - ✅ Assertions in test code (not helper functions)
289
+ - ✅ Specific assertions (not generic `toBeTruthy`)
290
+ - ✅ Meaningful expectations (test actual behavior)
291
+
292
+ **Bad Example:**
293
+ ```typescript
294
+ // ❌ Assertions hidden in helper
295
+ async function verifyProfilePage(page: Page) {
296
+ // Assertions buried in helper (not visible in test)
297
+ await expect(page.locator('h1')).toBeVisible();
298
+ await expect(page.locator('.email')).toContainText('@');
299
+ await expect(page.locator('.name')).not.toBeEmpty();
300
+ }
301
+
302
+ test('profile page', async ({ page }) => {
303
+ await page.goto('/profile');
304
+ await verifyProfilePage(page); // What's being verified?
305
+ });
306
+ ```
307
+
308
+ **Problems:**
309
+ - Can't see what's tested (need to read helper)
310
+ - Hard to debug failures (which assertion failed?)
311
+ - Reduces test readability
312
+ - Hides important validation
313
+
314
+ **Good Example:**
315
+ ```typescript
316
+ // ✅ Assertions explicit in test
317
+ test('should display profile with correct data', async ({ page }) => {
318
+ await page.goto('/profile');
319
+
320
+ // Explicit assertions - clear what's tested
321
+ await expect(page.locator('h1')).toContainText('Test User');
322
+ await expect(page.locator('.email')).toContainText('test@example.com');
323
+ await expect(page.locator('.bio')).toContainText('Software Engineer');
324
+ await expect(page.locator('img[alt="Avatar"]')).toBeVisible();
325
+ });
326
+ ```
327
+
328
+ **Why it works:**
329
+ - See what's tested at a glance
330
+ - Debug failures easily (know which assertion failed)
331
+ - Test is self-documenting
332
+ - No hidden behavior
333
+
334
+ **Exception:** Use helper for setup/cleanup, not assertions.
335
+
336
+ ### 4. Focused Tests (Appropriate Size)
337
+
338
+ **Rule:** Test has single responsibility, reasonable size.
339
+
340
+ **Requirements:**
341
+ - ✅ Test size < 300 lines
342
+ - ✅ Single responsibility (test one thing well)
343
+ - ✅ Clear describe/test names
344
+ - ✅ Appropriate scope (not too granular, not too broad)
345
+
346
+ **Bad Example:**
347
+ ```typescript
348
+ // ❌ 500-line test testing everything
349
+ test('complete user flow', async ({ page }) => {
350
+ // Registration (50 lines)
351
+ await page.goto('/register');
352
+ await page.fill('#email', 'test@example.com');
353
+ // ... 48 more lines
354
+
355
+ // Profile setup (100 lines)
356
+ await page.goto('/profile');
357
+ // ... 98 more lines
358
+
359
+ // Settings configuration (150 lines)
360
+ await page.goto('/settings');
361
+ // ... 148 more lines
362
+
363
+ // Data export (200 lines)
364
+ await page.goto('/export');
365
+ // ... 198 more lines
366
+
367
+ // Total: 500 lines, testing 4 different features
368
+ });
369
+ ```
370
+
371
+ **Problems:**
372
+ - Failure in line 50 prevents testing lines 51-500
373
+ - Hard to understand (what's being tested?)
374
+ - Slow to execute (testing too much)
375
+ - Hard to debug (which feature failed?)
376
+
377
+ **Good Example:**
378
+ ```typescript
379
+ // ✅ Focused tests - one responsibility each
380
+
381
+ test('should register new user', async ({ page }) => {
382
+ await page.goto('/register');
383
+ await page.fill('#email', 'test@example.com');
384
+ await page.fill('#password', 'password123');
385
+ await page.click('button[type="submit"]');
386
+
387
+ await expect(page).toHaveURL('/welcome');
388
+ await expect(page.locator('h1')).toContainText('Welcome');
389
+ });
390
+
391
+ test('should configure user profile', async ({ page, authSession }) => {
392
+ await authSession.login({ email: 'test@example.com', password: 'pass' });
393
+ await page.goto('/profile');
394
+
395
+ await page.fill('#name', 'Test User');
396
+ await page.fill('#bio', 'Software Engineer');
397
+ await page.click('button:has-text("Save")');
398
+
399
+ await expect(page.locator('.success')).toBeVisible();
400
+ });
401
+
402
+ // ... separate tests for settings, export (each < 50 lines)
403
+ ```
404
+
405
+ **Why it works:**
406
+ - Each test has one responsibility
407
+ - Failure is easy to diagnose
408
+ - Can run tests independently
409
+ - Test names describe exactly what's tested
410
+
411
+ ### 5. Fast Execution (Performance Budget)
412
+
413
+ **Rule:** Individual test executes in < 1.5 minutes.
414
+
415
+ **Requirements:**
416
+ - ✅ Test execution < 90 seconds
417
+ - ✅ Efficient selectors (getByRole > XPath)
418
+ - ✅ Minimal redundant actions
419
+ - ✅ Parallel execution enabled
420
+
421
+ **Bad Example:**
422
+ ```typescript
423
+ // ❌ Slow test (3+ minutes)
424
+ test('slow test', async ({ page }) => {
425
+ await page.goto('/');
426
+ await page.waitForTimeout(10000); // 10s wasted
427
+
428
+ // Navigate through 10 pages (2 minutes)
429
+ for (let i = 1; i <= 10; i++) {
430
+ await page.click(`a[href="/page-${i}"]`);
431
+ await page.waitForTimeout(5000); // 5s per page = 50s wasted
432
+ }
433
+
434
+ // Complex XPath selector (slow)
435
+ await page.locator('//div[@class="container"]/section[3]/div[2]/p').click();
436
+
437
+ // More waiting
438
+ await page.waitForTimeout(30000); // 30s wasted
439
+
440
+ await expect(page.locator('.result')).toBeVisible();
441
+ });
442
+ ```
443
+
444
+ **Total time:** 3+ minutes (95 seconds wasted on hard waits)
445
+
446
+ **Good Example (Vanilla Playwright):**
447
+ ```typescript
448
+ // ✅ Fast test (< 10 seconds)
449
+ test('fast test', async ({ page }) => {
450
+ // Set up response wait
451
+ const apiPromise = page.waitForResponse(
452
+ resp => resp.url().includes('/api/result') && resp.ok()
453
+ );
454
+
455
+ await page.goto('/');
456
+
457
+ // Direct navigation (skip intermediate pages)
458
+ await page.goto('/page-10');
459
+
460
+ // Efficient selector
461
+ await page.getByRole('button', { name: 'Submit' }).click();
462
+
463
+ // Wait for actual response (fast when API is fast)
464
+ await apiPromise;
465
+
466
+ await expect(page.locator('.result')).toBeVisible();
467
+ });
468
+ ```
469
+
470
+ **With Playwright Utils:**
471
+ ```typescript
472
+ import { test } from '@seontechnologies/playwright-utils/fixtures';
473
+ import { expect } from '@playwright/test';
474
+
475
+ test('fast test', async ({ page, interceptNetworkCall }) => {
476
+ // Set up interception
477
+ const resultCall = interceptNetworkCall({
478
+ method: 'GET',
479
+ url: '**/api/result'
480
+ });
481
+
482
+ await page.goto('/');
483
+
484
+ // Direct navigation (skip intermediate pages)
485
+ await page.goto('/page-10');
486
+
487
+ // Efficient selector
488
+ await page.getByRole('button', { name: 'Submit' }).click();
489
+
490
+ // Wait for actual response (automatic JSON parsing)
491
+ const { status, responseJson } = await resultCall;
492
+
493
+ expect(status).toBe(200);
494
+ await expect(page.locator('.result')).toBeVisible();
495
+
496
+ // Can also validate response data if needed
497
+ // expect(responseJson.data).toBeDefined();
498
+ });
499
+ ```
500
+
501
+ **Total time:** < 10 seconds (no wasted waits)
502
+
503
+ **Both examples achieve:**
504
+ - No hard waits (wait for actual events)
505
+ - Direct navigation (skip unnecessary steps)
506
+ - Efficient selectors (getByRole)
507
+ - Fast execution
508
+
509
+ **Playwright Utils bonus:**
510
+ - Can validate API response data easily
511
+ - Automatic JSON parsing
512
+ - Cleaner API
513
+
514
+ ## TEA's Quality Scoring
515
+
516
+ TEA reviews tests against these standards in `test-review`:
517
+
518
+ ### Scoring Categories (100 points total)
519
+
520
+ **Determinism (35 points):**
521
+ - No hard waits: 10 points
522
+ - No conditionals: 10 points
523
+ - No try-catch flow: 10 points
524
+ - Network-first patterns: 5 points
525
+
526
+ **Isolation (25 points):**
527
+ - Self-cleaning: 15 points
528
+ - No global state: 5 points
529
+ - Parallel-safe: 5 points
530
+
531
+ **Assertions (20 points):**
532
+ - Explicit in test body: 10 points
533
+ - Specific and meaningful: 10 points
534
+
535
+ **Structure (10 points):**
536
+ - Test size < 300 lines: 5 points
537
+ - Clear naming: 5 points
538
+
539
+ **Performance (10 points):**
540
+ - Execution time < 1.5 min: 10 points
541
+
542
+ #### Quality Scoring Breakdown
543
+
544
+ ```mermaid
545
+ %%{init: {'theme':'base', 'themeVariables': { 'fontSize':'14px'}}}%%
546
+ pie title Test Quality Score (100 points)
547
+ "Determinism" : 35
548
+ "Isolation" : 25
549
+ "Assertions" : 20
550
+ "Structure" : 10
551
+ "Performance" : 10
552
+ ```
553
+
554
+ ```mermaid
555
+ %%{init: {'theme':'base', 'themeVariables': { 'fontSize':'13px'}}}%%
556
+ flowchart LR
557
+ subgraph Det[Determinism - 35 pts]
558
+ D1[No hard waits<br/>10 pts]
559
+ D2[No conditionals<br/>10 pts]
560
+ D3[No try-catch flow<br/>10 pts]
561
+ D4[Network-first<br/>5 pts]
562
+ end
563
+
564
+ subgraph Iso[Isolation - 25 pts]
565
+ I1[Self-cleaning<br/>15 pts]
566
+ I2[No global state<br/>5 pts]
567
+ I3[Parallel-safe<br/>5 pts]
568
+ end
569
+
570
+ subgraph Assrt[Assertions - 20 pts]
571
+ A1[Explicit in body<br/>10 pts]
572
+ A2[Specific/meaningful<br/>10 pts]
573
+ end
574
+
575
+ subgraph Struct[Structure - 10 pts]
576
+ S1[Size < 300 lines<br/>5 pts]
577
+ S2[Clear naming<br/>5 pts]
578
+ end
579
+
580
+ subgraph Perf[Performance - 10 pts]
581
+ P1[Time < 1.5 min<br/>10 pts]
582
+ end
583
+
584
+ Det --> Total([Total: 100 points])
585
+ Iso --> Total
586
+ Assrt --> Total
587
+ Struct --> Total
588
+ Perf --> Total
589
+
590
+ style Det fill:#ffebee,stroke:#c62828,stroke-width:2px
591
+ style Iso fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
592
+ style Assrt fill:#f3e5f5,stroke:#6a1b9a,stroke-width:2px
593
+ style Struct fill:#fff9c4,stroke:#f57f17,stroke-width:2px
594
+ style Perf fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
595
+ style Total fill:#fff,stroke:#000,stroke-width:3px
596
+ ```
597
+
598
+ ### Score Interpretation
599
+
600
+ | Score | Interpretation | Action |
601
+ | ---------- | -------------- | -------------------------------------- |
602
+ | **90-100** | Excellent | Production-ready, minimal changes |
603
+ | **80-89** | Good | Minor improvements recommended |
604
+ | **70-79** | Acceptable | Address recommendations before release |
605
+ | **60-69** | Needs Work | Fix critical issues |
606
+ | **< 60** | Critical | Significant refactoring needed |
607
+
608
+ ## Comparison: Good vs Bad Tests
609
+
610
+ ### Example: User Login
611
+
612
+ **Bad Test (Score: 45/100):**
613
+ ```typescript
614
+ test('login test', async ({ page }) => { // Vague name
615
+ await page.goto('/login');
616
+ await page.waitForTimeout(3000); // -10 (hard wait)
617
+
618
+ await page.fill('[name="email"]', 'test@example.com');
619
+ await page.fill('[name="password"]', 'password');
620
+
621
+ if (await page.locator('.remember-me').isVisible()) { // -10 (conditional)
622
+ await page.click('.remember-me');
623
+ }
624
+
625
+ await page.click('button');
626
+
627
+ try { // -10 (try-catch flow)
628
+ await page.waitForURL('/dashboard', { timeout: 5000 });
629
+ } catch (e) {
630
+ // Ignore navigation failure
631
+ }
632
+
633
+ // No assertions! -10
634
+ // No cleanup! -10
635
+ });
636
+ ```
637
+
638
+ **Issues:**
639
+ - Determinism: 5/35 (hard wait, conditional, try-catch)
640
+ - Isolation: 10/25 (no cleanup)
641
+ - Assertions: 0/20 (no assertions!)
642
+ - Structure: 15/10 (okay)
643
+ - Performance: 5/10 (slow)
644
+ - **Total: 45/100**
645
+
646
+ **Good Test (Score: 95/100):**
647
+ ```typescript
648
+ test('should login with valid credentials and redirect to dashboard', async ({ page, authSession }) => {
649
+ // Use fixture for deterministic auth
650
+ const loginPromise = page.waitForResponse(
651
+ resp => resp.url().includes('/api/auth/login') && resp.ok()
652
+ );
653
+
654
+ await page.goto('/login');
655
+ await page.getByLabel('Email').fill('test@example.com');
656
+ await page.getByLabel('Password').fill('password123');
657
+ await page.getByRole('button', { name: 'Sign in' }).click();
658
+
659
+ // Wait for actual API response
660
+ const response = await loginPromise;
661
+ const { token } = await response.json();
662
+
663
+ // Explicit assertions
664
+ expect(token).toBeDefined();
665
+ await expect(page).toHaveURL('/dashboard');
666
+ await expect(page.getByText('Welcome back')).toBeVisible();
667
+
668
+ // Cleanup handled by authSession fixture
669
+ });
670
+ ```
671
+
672
+ **Quality:**
673
+ - Determinism: 35/35 (network-first, no conditionals)
674
+ - Isolation: 25/25 (fixture handles cleanup)
675
+ - Assertions: 20/20 (explicit and specific)
676
+ - Structure: 10/10 (clear name, focused)
677
+ - Performance: 5/10 (< 1 min)
678
+ - **Total: 95/100**
679
+
680
+ ### Example: API Testing
681
+
682
+ **Bad Test (Score: 50/100):**
683
+ ```typescript
684
+ test('api test', async ({ request }) => {
685
+ const response = await request.post('/api/users', {
686
+ data: { email: 'test@example.com' } // Hard-coded (conflicts)
687
+ });
688
+
689
+ if (response.ok()) { // Conditional
690
+ const user = await response.json();
691
+ // Weak assertion
692
+ expect(user).toBeTruthy();
693
+ }
694
+
695
+ // No cleanup - user left in database
696
+ });
697
+ ```
698
+
699
+ **Good Test (Score: 92/100):**
700
+ ```typescript
701
+ test('should create user with valid data', async ({ apiRequest }) => {
702
+ // Unique test data
703
+ const testEmail = `test-${Date.now()}@example.com`;
704
+
705
+ // Create user
706
+ const { status, body } = await apiRequest({
707
+ method: 'POST',
708
+ path: '/api/users',
709
+ body: { email: testEmail, name: 'Test User' }
710
+ });
711
+
712
+ // Explicit assertions
713
+ expect(status).toBe(201);
714
+ expect(body.id).toBeDefined();
715
+ expect(body.email).toBe(testEmail);
716
+ expect(body.name).toBe('Test User');
717
+
718
+ // Cleanup
719
+ await apiRequest({
720
+ method: 'DELETE',
721
+ path: `/api/users/${body.id}`
722
+ });
723
+ });
724
+ ```
725
+
726
+ ## How TEA Enforces Standards
727
+
728
+ ### During Test Generation (`atdd`, `automate`)
729
+
730
+ TEA generates tests following standards by default:
731
+
732
+ ```typescript
733
+ // TEA-generated test (automatically follows standards)
734
+ test('should submit contact form', async ({ page }) => {
735
+ // Network-first pattern (no hard waits)
736
+ const submitPromise = page.waitForResponse(
737
+ resp => resp.url().includes('/api/contact') && resp.ok()
738
+ );
739
+
740
+ // Accessible selectors (resilient)
741
+ await page.getByLabel('Name').fill('Test User');
742
+ await page.getByLabel('Email').fill('test@example.com');
743
+ await page.getByLabel('Message').fill('Test message');
744
+ await page.getByRole('button', { name: 'Send' }).click();
745
+
746
+ const response = await submitPromise;
747
+ const result = await response.json();
748
+
749
+ // Explicit assertions
750
+ expect(result.success).toBe(true);
751
+ await expect(page.getByText('Message sent')).toBeVisible();
752
+
753
+ // Size: 15 lines (< 300 ✓)
754
+ // Execution: ~2 seconds (< 90s ✓)
755
+ });
756
+ ```
757
+
758
+ ### During Test Review (`test-review`)
759
+
760
+ TEA audits tests and flags violations:
761
+
762
+ ```markdown
763
+ ## Critical Issues
764
+
765
+ ### Hard Wait Detected (tests/login.spec.ts:23)
766
+ **Issue:** `await page.waitForTimeout(3000)`
767
+ **Score Impact:** -10 (Determinism)
768
+ **Fix:** Use network-first pattern
769
+
770
+ ### Conditional Flow Control (tests/profile.spec.ts:45)
771
+ **Issue:** `if (await page.locator('.banner').isVisible())`
772
+ **Score Impact:** -10 (Determinism)
773
+ **Fix:** Make banner presence deterministic
774
+
775
+ ## Recommendations
776
+
777
+ ### Extract Fixture (tests/auth.spec.ts)
778
+ **Issue:** Login code repeated 5 times
779
+ **Score Impact:** -3 (Structure)
780
+ **Fix:** Extract to authSession fixture
781
+ ```
782
+
783
+ ## Definition of Done Checklist
784
+
785
+ When is a test "done"?
786
+
787
+ **Test Quality DoD:**
788
+ - [ ] No hard waits (`waitForTimeout`)
789
+ - [ ] No conditionals for flow control
790
+ - [ ] No try-catch for flow control
791
+ - [ ] Network-first patterns used
792
+ - [ ] Assertions explicit in test body
793
+ - [ ] Test size < 300 lines
794
+ - [ ] Clear, descriptive test name
795
+ - [ ] Self-cleaning (cleanup in afterEach or test)
796
+ - [ ] Unique test data (no hard-coded values)
797
+ - [ ] Execution time < 1.5 minutes
798
+ - [ ] Can run in parallel
799
+ - [ ] Can run in any order
800
+
801
+ **Code Review DoD:**
802
+ - [ ] Test quality score > 80
803
+ - [ ] No critical issues from `test-review`
804
+ - [ ] Follows project patterns (fixtures, selectors)
805
+ - [ ] Test reviewed by team member
806
+
807
+ ## Common Quality Issues
808
+
809
+ ### Issue: "My test needs conditionals for optional elements"
810
+
811
+ **Wrong approach:**
812
+ ```typescript
813
+ if (await page.locator('.banner').isVisible()) {
814
+ await page.click('.dismiss');
815
+ }
816
+ ```
817
+
818
+ **Right approach - Make it deterministic:**
819
+ ```typescript
820
+ // Option 1: Always expect banner
821
+ await expect(page.locator('.banner')).toBeVisible();
822
+ await page.click('.dismiss');
823
+
824
+ // Option 2: Test both scenarios separately
825
+ test('should show banner for new users', ...);
826
+ test('should not show banner for returning users', ...);
827
+ ```
828
+
829
+ ### Issue: "My test needs try-catch for error handling"
830
+
831
+ **Wrong approach:**
832
+ ```typescript
833
+ try {
834
+ await page.click('#optional-button');
835
+ } catch (e) {
836
+ // Silently continue
837
+ }
838
+ ```
839
+
840
+ **Right approach - Make failures explicit:**
841
+ ```typescript
842
+ // Option 1: Button should exist
843
+ await page.click('#optional-button'); // Fails loudly if missing
844
+
845
+ // Option 2: Button might not exist (test both)
846
+ test('should work with optional button', async ({ page }) => {
847
+ const hasButton = await page.locator('#optional-button').count() > 0;
848
+ if (hasButton) {
849
+ await page.click('#optional-button');
850
+ }
851
+ // But now you're testing optional behavior explicitly
852
+ });
853
+ ```
854
+
855
+ ### Issue: "Hard waits are easier than network patterns"
856
+
857
+ **Short-term:** Hard waits seem simpler
858
+ **Long-term:** Flaky tests waste more time than learning network patterns
859
+
860
+ **Investment:**
861
+ - 30 minutes to learn network-first patterns
862
+ - Prevents hundreds of hours debugging flaky tests
863
+ - Tests run faster (no wasted waits)
864
+ - Team trusts test suite
865
+
866
+ ## Technical Implementation
867
+
868
+ For detailed test quality patterns, see:
869
+ - [Test Quality Fragment](/docs/tea/reference/knowledge-base.md#quality-standards)
870
+ - [Test Levels Framework Fragment](/docs/tea/reference/knowledge-base.md#quality-standards)
871
+ - [Complete Knowledge Base Index](/docs/tea/reference/knowledge-base.md)
872
+
873
+ ## Related Concepts
874
+
875
+ **Core TEA Concepts:**
876
+ - [Risk-Based Testing](/docs/tea/explanation/risk-based-testing.md) - Quality scales with risk
877
+ - [Knowledge Base System](/docs/tea/explanation/knowledge-base-system.md) - How standards are enforced
878
+ - [Engagement Models](/docs/tea/explanation/engagement-models.md) - Quality in different models
879
+
880
+ **Technical Patterns:**
881
+ - [Network-First Patterns](/docs/tea/explanation/network-first-patterns.md) - Determinism explained
882
+ - [Fixture Architecture](/docs/tea/explanation/fixture-architecture.md) - Isolation through fixtures
883
+
884
+ **Overview:**
885
+ - [TEA Overview](/docs/tea/explanation/tea-overview.md) - Quality standards in lifecycle
886
+ - [Testing as Engineering](/docs/tea/explanation/testing-as-engineering.md) - Why quality matters
887
+
888
+ ## Practical Guides
889
+
890
+ **Workflow Guides:**
891
+ - [How to Run Test Review](/docs/tea/how-to/workflows/run-test-review.md) - Audit against these standards
892
+ - [How to Run ATDD](/docs/tea/how-to/workflows/run-atdd.md) - Generate quality tests
893
+ - [How to Run Automate](/docs/tea/how-to/workflows/run-automate.md) - Expand with quality
894
+
895
+ **Use-Case Guides:**
896
+ - [Using TEA with Existing Tests](/docs/tea/how-to/brownfield/use-tea-with-existing-tests.md) - Improve legacy quality
897
+ - [Running TEA for Enterprise](/docs/tea/how-to/brownfield/use-tea-for-enterprise.md) - Enterprise quality thresholds
898
+
899
+ ## Reference
900
+
901
+ - [TEA Command Reference](/docs/tea/reference/commands.md) - `test-review` command
902
+ - [Knowledge Base Index](/docs/tea/reference/knowledge-base.md) - Test quality fragment
903
+ - [Glossary](/docs/tea/glossary/index.md#test-architect-tea-concepts) - TEA terminology
904
+
905
+ ---
906
+
907
+ Generated with [BMad Method](https://bmad-method.org) - TEA (Test Architect)