bmad-method 6.0.0-alpha.6 → 6.0.0-alpha.7

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 (367) hide show
  1. package/.claude/settings.local.json +13 -6
  2. package/.github/workflows/{lint.yaml → quality.yaml} +19 -2
  3. package/.husky/pre-commit +4 -0
  4. package/README.md +59 -1
  5. package/bmad/_cfg/agent-manifest.csv +2 -8
  6. package/bmad/_cfg/files-manifest.csv +8 -202
  7. package/bmad/_cfg/ides/claude-code.yaml +3 -4
  8. package/bmad/_cfg/manifest.yaml +5 -4
  9. package/bmad/_cfg/task-manifest.csv +8 -1
  10. package/bmad/_cfg/tool-manifest.csv +2 -0
  11. package/bmad/_cfg/workflow-manifest.csv +4 -31
  12. package/bmad/bmb/config.yaml +2 -2
  13. package/bmad/bmb/workflows/create-agent/instructions.md +25 -9
  14. package/bmad/bmb/workflows/create-module/module-structure.md +34 -0
  15. package/bmad/core/config.yaml +2 -2
  16. package/docs/installers-bundlers/installers-modules-platforms-reference.md +61 -0
  17. package/package.json +5 -3
  18. package/src/core/tasks/adv-elicit.xml +1 -1
  19. package/src/modules/bmb/workflows/create-agent/instructions.md +25 -9
  20. package/src/modules/bmb/workflows/create-module/module-structure.md +34 -0
  21. package/src/modules/bmgd/README.md +208 -0
  22. package/src/modules/bmgd/_module-installer/install-config.yaml +66 -0
  23. package/src/modules/{bmm → bmgd}/agents/game-architect.agent.yaml +5 -12
  24. package/src/modules/{bmm → bmgd}/agents/game-designer.agent.yaml +10 -22
  25. package/src/modules/{bmm → bmgd}/agents/game-dev.agent.yaml +9 -10
  26. package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +70 -0
  27. package/{bmad/bmm → src/modules/bmgd}/teams/team-gamedev.yaml +3 -1
  28. package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/workflow.yaml +7 -7
  29. package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/workflow.yaml +9 -9
  30. package/src/modules/bmgd/workflows/2-design/gdd/workflow.yaml +81 -0
  31. package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/narrative/workflow.yaml +6 -6
  32. package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/workflow.yaml +16 -16
  33. package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/code-review/workflow.yaml +3 -1
  34. package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/correct-course/workflow.yaml +3 -1
  35. package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/create-story/workflow.yaml +3 -1
  36. package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/dev-story/workflow.yaml +3 -1
  37. package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/epic-tech-context/workflow.yaml +3 -1
  38. package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/retrospective/workflow.yaml +3 -1
  39. package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/sprint-planning/workflow.yaml +3 -1
  40. package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-context/workflow.yaml +3 -1
  41. package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-done/workflow.yaml +3 -1
  42. package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-ready/workflow.yaml +3 -1
  43. package/src/modules/bmm/docs/README.md +8 -9
  44. package/src/modules/bmm/docs/agents-guide.md +0 -1
  45. package/src/modules/bmm/docs/brownfield-guide.md +5 -9
  46. package/src/modules/bmm/docs/faq.md +4 -6
  47. package/src/modules/bmm/docs/glossary.md +0 -1
  48. package/src/modules/bmm/docs/quick-spec-flow.md +4 -4
  49. package/src/modules/bmm/docs/quick-start.md +4 -4
  50. package/src/modules/bmm/docs/scale-adaptive-system.md +5 -5
  51. package/src/modules/bmm/docs/test-architecture.md +183 -118
  52. package/src/modules/bmm/docs/workflows-analysis.md +203 -539
  53. package/src/modules/bmm/docs/workflows-planning.md +326 -850
  54. package/src/modules/bmm/docs/workflows-solutioning.md +250 -505
  55. package/src/modules/bmm/workflows/1-analysis/domain-research/workflow.yaml +65 -32
  56. package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +4 -0
  57. package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +1 -1
  58. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +34 -5
  59. package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +1 -1
  60. package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +8 -0
  61. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +6 -0
  62. package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +47 -0
  63. package/src/modules/bmm/workflows/workflow-status/init/instructions.md +50 -0
  64. package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +18 -11
  65. package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +18 -11
  66. package/src/modules/bmm/workflows/workflow-status/paths/game-design.yaml +42 -65
  67. package/test/test-installation-components.js +214 -0
  68. package/tools/cli/bundlers/web-bundler.js +127 -8
  69. package/tools/cli/installers/lib/ide/auggie.js +9 -20
  70. package/tools/cli/installers/lib/ide/claude-code.js +33 -3
  71. package/tools/cli/installers/lib/ide/cursor.js +17 -0
  72. package/tools/cli/installers/lib/modules/manager.js +128 -0
  73. package/tools/cli/lib/yaml-xml-builder.js +9 -1
  74. package/tools/schema/agent.js +1 -0
  75. package/v6-open-items.md +3 -9
  76. package/web-bundles/bmm/agents/analyst.xml +5028 -0
  77. package/web-bundles/bmm/agents/architect.xml +2047 -0
  78. package/web-bundles/bmm/agents/dev.xml +68 -0
  79. package/web-bundles/bmm/agents/pm.xml +3808 -0
  80. package/web-bundles/bmm/agents/sm.xml +77 -0
  81. package/web-bundles/bmm/agents/tea.xml +66 -0
  82. package/web-bundles/bmm/agents/tech-writer.xml +84 -0
  83. package/web-bundles/bmm/agents/ux-designer.xml +2018 -0
  84. package/web-bundles/bmm/teams/team-fullstack.xml +12039 -0
  85. package/.claude/agents/bmad-analysis/api-documenter.md +0 -102
  86. package/.claude/agents/bmad-analysis/codebase-analyzer.md +0 -82
  87. package/.claude/agents/bmad-analysis/data-analyst.md +0 -101
  88. package/.claude/agents/bmad-analysis/pattern-detector.md +0 -84
  89. package/.claude/agents/bmad-planning/dependency-mapper.md +0 -83
  90. package/.claude/agents/bmad-planning/epic-optimizer.md +0 -81
  91. package/.claude/agents/bmad-planning/requirements-analyst.md +0 -61
  92. package/.claude/agents/bmad-planning/technical-decisions-curator.md +0 -168
  93. package/.claude/agents/bmad-planning/trend-spotter.md +0 -115
  94. package/.claude/agents/bmad-planning/user-journey-mapper.md +0 -123
  95. package/.claude/agents/bmad-planning/user-researcher.md +0 -72
  96. package/.claude/agents/bmad-research/market-researcher.md +0 -51
  97. package/.claude/agents/bmad-research/tech-debt-auditor.md +0 -106
  98. package/.claude/agents/bmad-review/document-reviewer.md +0 -102
  99. package/.claude/agents/bmad-review/technical-evaluator.md +0 -68
  100. package/.claude/agents/bmad-review/test-coverage-analyzer.md +0 -108
  101. package/.claude/commands/bmad/bmb/workflows/README.md +0 -67
  102. package/.claude/commands/bmad/bmm/agents/analyst.md +0 -67
  103. package/.claude/commands/bmad/bmm/agents/architect.md +0 -72
  104. package/.claude/commands/bmad/bmm/agents/dev.md +0 -69
  105. package/.claude/commands/bmad/bmm/agents/pm.md +0 -76
  106. package/.claude/commands/bmad/bmm/agents/sm.md +0 -85
  107. package/.claude/commands/bmad/bmm/agents/tea.md +0 -72
  108. package/.claude/commands/bmad/bmm/agents/tech-writer.md +0 -82
  109. package/.claude/commands/bmad/bmm/agents/ux-designer.md +0 -71
  110. package/.claude/commands/bmad/bmm/workflows/README.md +0 -132
  111. package/.claude/commands/bmad/bmm/workflows/architecture.md +0 -15
  112. package/.claude/commands/bmad/bmm/workflows/brainstorm-project.md +0 -15
  113. package/.claude/commands/bmad/bmm/workflows/code-review.md +0 -15
  114. package/.claude/commands/bmad/bmm/workflows/correct-course.md +0 -15
  115. package/.claude/commands/bmad/bmm/workflows/create-epics-and-stories.md +0 -15
  116. package/.claude/commands/bmad/bmm/workflows/create-story.md +0 -15
  117. package/.claude/commands/bmad/bmm/workflows/create-ux-design.md +0 -15
  118. package/.claude/commands/bmad/bmm/workflows/dev-story.md +0 -15
  119. package/.claude/commands/bmad/bmm/workflows/document-project.md +0 -15
  120. package/.claude/commands/bmad/bmm/workflows/epic-tech-context.md +0 -15
  121. package/.claude/commands/bmad/bmm/workflows/narrative.md +0 -15
  122. package/.claude/commands/bmad/bmm/workflows/prd.md +0 -15
  123. package/.claude/commands/bmad/bmm/workflows/product-brief.md +0 -15
  124. package/.claude/commands/bmad/bmm/workflows/research.md +0 -15
  125. package/.claude/commands/bmad/bmm/workflows/retrospective.md +0 -15
  126. package/.claude/commands/bmad/bmm/workflows/solutioning-gate-check.md +0 -15
  127. package/.claude/commands/bmad/bmm/workflows/sprint-planning.md +0 -15
  128. package/.claude/commands/bmad/bmm/workflows/story-context.md +0 -15
  129. package/.claude/commands/bmad/bmm/workflows/story-done.md +0 -15
  130. package/.claude/commands/bmad/bmm/workflows/story-ready.md +0 -15
  131. package/.claude/commands/bmad/bmm/workflows/tech-spec.md +0 -15
  132. package/.claude/commands/bmad/bmm/workflows/workflow-init.md +0 -15
  133. package/.claude/commands/bmad/bmm/workflows/workflow-status.md +0 -15
  134. package/.claude/commands/bmad/cis/agents/README.md +0 -104
  135. package/.claude/commands/bmad/cis/agents/brainstorming-coach.md +0 -62
  136. package/.claude/commands/bmad/cis/agents/creative-problem-solver.md +0 -62
  137. package/.claude/commands/bmad/cis/agents/design-thinking-coach.md +0 -62
  138. package/.claude/commands/bmad/cis/agents/innovation-strategist.md +0 -62
  139. package/.claude/commands/bmad/cis/agents/storyteller.md +0 -59
  140. package/.claude/commands/bmad/cis/workflows/README.md +0 -37
  141. package/.claude/commands/bmad/cis/workflows/design-thinking.md +0 -15
  142. package/.claude/commands/bmad/cis/workflows/innovation-strategy.md +0 -15
  143. package/.claude/commands/bmad/cis/workflows/problem-solving.md +0 -15
  144. package/.claude/commands/bmad/cis/workflows/storytelling.md +0 -15
  145. package/.claude/commands/bmad/core/workflows/README.md +0 -27
  146. package/bmad/_cfg/agents/bmm-analyst.customize.yaml +0 -42
  147. package/bmad/_cfg/agents/bmm-architect.customize.yaml +0 -42
  148. package/bmad/_cfg/agents/bmm-dev.customize.yaml +0 -42
  149. package/bmad/_cfg/agents/bmm-pm.customize.yaml +0 -42
  150. package/bmad/_cfg/agents/bmm-sm.customize.yaml +0 -42
  151. package/bmad/_cfg/agents/bmm-tea.customize.yaml +0 -42
  152. package/bmad/_cfg/agents/bmm-tech-writer.customize.yaml +0 -42
  153. package/bmad/_cfg/agents/bmm-ux-designer.customize.yaml +0 -42
  154. package/bmad/bmm/README.md +0 -128
  155. package/bmad/bmm/agents/analyst.md +0 -67
  156. package/bmad/bmm/agents/architect.md +0 -72
  157. package/bmad/bmm/agents/dev.md +0 -69
  158. package/bmad/bmm/agents/pm.md +0 -76
  159. package/bmad/bmm/agents/sm.md +0 -85
  160. package/bmad/bmm/agents/tea.md +0 -72
  161. package/bmad/bmm/agents/tech-writer.md +0 -82
  162. package/bmad/bmm/agents/ux-designer.md +0 -71
  163. package/bmad/bmm/config.yaml +0 -18
  164. package/bmad/bmm/tasks/daily-standup.xml +0 -85
  165. package/bmad/bmm/teams/team-fullstack.yaml +0 -11
  166. package/bmad/bmm/testarch/knowledge/ci-burn-in.md +0 -675
  167. package/bmad/bmm/testarch/knowledge/component-tdd.md +0 -486
  168. package/bmad/bmm/testarch/knowledge/contract-testing.md +0 -957
  169. package/bmad/bmm/testarch/knowledge/data-factories.md +0 -500
  170. package/bmad/bmm/testarch/knowledge/email-auth.md +0 -721
  171. package/bmad/bmm/testarch/knowledge/error-handling.md +0 -725
  172. package/bmad/bmm/testarch/knowledge/feature-flags.md +0 -750
  173. package/bmad/bmm/testarch/knowledge/fixture-architecture.md +0 -401
  174. package/bmad/bmm/testarch/knowledge/network-first.md +0 -486
  175. package/bmad/bmm/testarch/knowledge/nfr-criteria.md +0 -670
  176. package/bmad/bmm/testarch/knowledge/playwright-config.md +0 -730
  177. package/bmad/bmm/testarch/knowledge/probability-impact.md +0 -601
  178. package/bmad/bmm/testarch/knowledge/risk-governance.md +0 -615
  179. package/bmad/bmm/testarch/knowledge/selective-testing.md +0 -732
  180. package/bmad/bmm/testarch/knowledge/selector-resilience.md +0 -527
  181. package/bmad/bmm/testarch/knowledge/test-healing-patterns.md +0 -644
  182. package/bmad/bmm/testarch/knowledge/test-levels-framework.md +0 -473
  183. package/bmad/bmm/testarch/knowledge/test-priorities-matrix.md +0 -373
  184. package/bmad/bmm/testarch/knowledge/test-quality.md +0 -664
  185. package/bmad/bmm/testarch/knowledge/timing-debugging.md +0 -372
  186. package/bmad/bmm/testarch/knowledge/visual-debugging.md +0 -524
  187. package/bmad/bmm/testarch/tea-index.csv +0 -22
  188. package/bmad/bmm/workflows/1-analysis/brainstorm-project/instructions.md +0 -110
  189. package/bmad/bmm/workflows/1-analysis/brainstorm-project/project-context.md +0 -25
  190. package/bmad/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +0 -26
  191. package/bmad/bmm/workflows/1-analysis/domain-research/instructions.md +0 -423
  192. package/bmad/bmm/workflows/1-analysis/domain-research/template.md +0 -180
  193. package/bmad/bmm/workflows/1-analysis/domain-research/workflow.yaml +0 -36
  194. package/bmad/bmm/workflows/1-analysis/product-brief/checklist.md +0 -115
  195. package/bmad/bmm/workflows/1-analysis/product-brief/instructions.md +0 -524
  196. package/bmad/bmm/workflows/1-analysis/product-brief/template.md +0 -181
  197. package/bmad/bmm/workflows/1-analysis/product-brief/workflow.yaml +0 -45
  198. package/bmad/bmm/workflows/1-analysis/research/checklist-deep-prompt.md +0 -144
  199. package/bmad/bmm/workflows/1-analysis/research/checklist-technical.md +0 -249
  200. package/bmad/bmm/workflows/1-analysis/research/checklist.md +0 -299
  201. package/bmad/bmm/workflows/1-analysis/research/claude-code/injections.yaml +0 -114
  202. package/bmad/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +0 -439
  203. package/bmad/bmm/workflows/1-analysis/research/instructions-market.md +0 -679
  204. package/bmad/bmm/workflows/1-analysis/research/instructions-router.md +0 -133
  205. package/bmad/bmm/workflows/1-analysis/research/instructions-technical.md +0 -538
  206. package/bmad/bmm/workflows/1-analysis/research/template-deep-prompt.md +0 -94
  207. package/bmad/bmm/workflows/1-analysis/research/template-market.md +0 -347
  208. package/bmad/bmm/workflows/1-analysis/research/template-technical.md +0 -245
  209. package/bmad/bmm/workflows/1-analysis/research/workflow.yaml +0 -44
  210. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/checklist.md +0 -310
  211. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/instructions.md +0 -1301
  212. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +0 -145
  213. package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +0 -64
  214. package/bmad/bmm/workflows/2-plan-workflows/narrative/workflow.yaml +0 -29
  215. package/bmad/bmm/workflows/2-plan-workflows/prd/checklist.md +0 -350
  216. package/bmad/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/epics-template.md +0 -52
  217. package/bmad/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/instructions.md +0 -169
  218. package/bmad/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/workflow.yaml +0 -45
  219. package/bmad/bmm/workflows/2-plan-workflows/prd/domain-complexity.csv +0 -13
  220. package/bmad/bmm/workflows/2-plan-workflows/prd/instructions.md +0 -408
  221. package/bmad/bmm/workflows/2-plan-workflows/prd/prd-template.md +0 -237
  222. package/bmad/bmm/workflows/2-plan-workflows/prd/project-types.csv +0 -11
  223. package/bmad/bmm/workflows/2-plan-workflows/prd/workflow.yaml +0 -46
  224. package/bmad/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +0 -214
  225. package/bmad/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +0 -80
  226. package/bmad/bmm/workflows/2-plan-workflows/tech-spec/instructions-level0-story.md +0 -200
  227. package/bmad/bmm/workflows/2-plan-workflows/tech-spec/instructions-level1-stories.md +0 -451
  228. package/bmad/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +0 -1115
  229. package/bmad/bmm/workflows/2-plan-workflows/tech-spec/tech-spec-template.md +0 -181
  230. package/bmad/bmm/workflows/2-plan-workflows/tech-spec/user-story-template.md +0 -90
  231. package/bmad/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +0 -60
  232. package/bmad/bmm/workflows/3-solutioning/solutioning-gate-check/checklist.md +0 -175
  233. package/bmad/bmm/workflows/3-solutioning/solutioning-gate-check/instructions.md +0 -305
  234. package/bmad/bmm/workflows/3-solutioning/solutioning-gate-check/template.md +0 -146
  235. package/bmad/bmm/workflows/3-solutioning/solutioning-gate-check/validation-criteria.yaml +0 -189
  236. package/bmad/bmm/workflows/3-solutioning/solutioning-gate-check/workflow.yaml +0 -64
  237. package/bmad/bmm/workflows/document-project/checklist.md +0 -245
  238. package/bmad/bmm/workflows/document-project/documentation-requirements.csv +0 -12
  239. package/bmad/bmm/workflows/document-project/instructions.md +0 -222
  240. package/bmad/bmm/workflows/document-project/templates/deep-dive-template.md +0 -345
  241. package/bmad/bmm/workflows/document-project/templates/index-template.md +0 -169
  242. package/bmad/bmm/workflows/document-project/templates/project-overview-template.md +0 -103
  243. package/bmad/bmm/workflows/document-project/templates/project-scan-report-schema.json +0 -160
  244. package/bmad/bmm/workflows/document-project/templates/source-tree-template.md +0 -135
  245. package/bmad/bmm/workflows/document-project/workflow.yaml +0 -34
  246. package/bmad/bmm/workflows/document-project/workflows/deep-dive-instructions.md +0 -298
  247. package/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +0 -31
  248. package/bmad/bmm/workflows/document-project/workflows/full-scan-instructions.md +0 -1106
  249. package/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +0 -31
  250. package/bmad/bmm/workflows/techdoc/documentation-standards.md +0 -262
  251. package/bmad/bmm/workflows/testarch/atdd/atdd-checklist-template.md +0 -363
  252. package/bmad/bmm/workflows/testarch/atdd/checklist.md +0 -373
  253. package/bmad/bmm/workflows/testarch/atdd/instructions.md +0 -785
  254. package/bmad/bmm/workflows/testarch/atdd/workflow.yaml +0 -52
  255. package/bmad/bmm/workflows/testarch/automate/checklist.md +0 -580
  256. package/bmad/bmm/workflows/testarch/automate/instructions.md +0 -1303
  257. package/bmad/bmm/workflows/testarch/automate/workflow.yaml +0 -61
  258. package/bmad/bmm/workflows/testarch/ci/checklist.md +0 -246
  259. package/bmad/bmm/workflows/testarch/ci/github-actions-template.yaml +0 -165
  260. package/bmad/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +0 -128
  261. package/bmad/bmm/workflows/testarch/ci/instructions.md +0 -517
  262. package/bmad/bmm/workflows/testarch/ci/workflow.yaml +0 -53
  263. package/bmad/bmm/workflows/testarch/framework/checklist.md +0 -321
  264. package/bmad/bmm/workflows/testarch/framework/instructions.md +0 -455
  265. package/bmad/bmm/workflows/testarch/framework/workflow.yaml +0 -53
  266. package/bmad/bmm/workflows/testarch/nfr-assess/checklist.md +0 -405
  267. package/bmad/bmm/workflows/testarch/nfr-assess/instructions.md +0 -722
  268. package/bmad/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +0 -443
  269. package/bmad/bmm/workflows/testarch/nfr-assess/workflow.yaml +0 -56
  270. package/bmad/bmm/workflows/testarch/test-design/checklist.md +0 -234
  271. package/bmad/bmm/workflows/testarch/test-design/instructions.md +0 -621
  272. package/bmad/bmm/workflows/testarch/test-design/test-design-template.md +0 -285
  273. package/bmad/bmm/workflows/testarch/test-design/workflow.yaml +0 -52
  274. package/bmad/bmm/workflows/testarch/test-review/checklist.md +0 -470
  275. package/bmad/bmm/workflows/testarch/test-review/instructions.md +0 -608
  276. package/bmad/bmm/workflows/testarch/test-review/test-review-template.md +0 -388
  277. package/bmad/bmm/workflows/testarch/test-review/workflow.yaml +0 -53
  278. package/bmad/bmm/workflows/testarch/trace/checklist.md +0 -654
  279. package/bmad/bmm/workflows/testarch/trace/instructions.md +0 -1045
  280. package/bmad/bmm/workflows/testarch/trace/trace-template.md +0 -673
  281. package/bmad/bmm/workflows/testarch/trace/workflow.yaml +0 -66
  282. package/bmad/bmm/workflows/workflow-status/init/instructions.md +0 -771
  283. package/bmad/bmm/workflows/workflow-status/init/workflow.yaml +0 -27
  284. package/bmad/bmm/workflows/workflow-status/instructions.md +0 -386
  285. package/bmad/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +0 -120
  286. package/bmad/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +0 -108
  287. package/bmad/bmm/workflows/workflow-status/paths/game-design.yaml +0 -75
  288. package/bmad/bmm/workflows/workflow-status/paths/method-brownfield.yaml +0 -97
  289. package/bmad/bmm/workflows/workflow-status/paths/method-greenfield.yaml +0 -88
  290. package/bmad/bmm/workflows/workflow-status/paths/quick-flow-brownfield.yaml +0 -58
  291. package/bmad/bmm/workflows/workflow-status/paths/quick-flow-greenfield.yaml +0 -47
  292. package/bmad/bmm/workflows/workflow-status/project-levels.yaml +0 -59
  293. package/bmad/bmm/workflows/workflow-status/sample-level-3-workflow.yaml +0 -49
  294. package/bmad/bmm/workflows/workflow-status/workflow-status-template.yaml +0 -31
  295. package/bmad/bmm/workflows/workflow-status/workflow.yaml +0 -28
  296. package/src/modules/bmm/docs/troubleshooting.md +0 -680
  297. package/src/modules/bmm/teams/team-gamedev.yaml +0 -14
  298. package/src/modules/bmm/workflows/2-plan-workflows/gdd/workflow.yaml +0 -81
  299. package/src/modules/bmm/workflows/2-plan-workflows/narrative/checklist.md +0 -139
  300. package/src/modules/bmm/workflows/2-plan-workflows/narrative/instructions-narrative.md +0 -608
  301. package/src/modules/bmm/workflows/2-plan-workflows/narrative/narrative-template.md +0 -195
  302. /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-brain-methods.csv +0 -0
  303. /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-context.md +0 -0
  304. /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/instructions.md +0 -0
  305. /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/checklist.md +0 -0
  306. /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/instructions.md +0 -0
  307. /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/template.md +0 -0
  308. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/checklist.md +0 -0
  309. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/action-platformer.md +0 -0
  310. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/adventure.md +0 -0
  311. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/card-game.md +0 -0
  312. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/fighting.md +0 -0
  313. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/horror.md +0 -0
  314. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/idle-incremental.md +0 -0
  315. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/metroidvania.md +0 -0
  316. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/moba.md +0 -0
  317. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/party-game.md +0 -0
  318. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/puzzle.md +0 -0
  319. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/racing.md +0 -0
  320. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/rhythm.md +0 -0
  321. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/roguelike.md +0 -0
  322. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/rpg.md +0 -0
  323. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/sandbox.md +0 -0
  324. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/shooter.md +0 -0
  325. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/simulation.md +0 -0
  326. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/sports.md +0 -0
  327. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/strategy.md +0 -0
  328. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/survival.md +0 -0
  329. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/text-based.md +0 -0
  330. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/tower-defense.md +0 -0
  331. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/turn-based-tactics.md +0 -0
  332. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types/visual-novel.md +0 -0
  333. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/game-types.csv +0 -0
  334. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/gdd-template.md +0 -0
  335. /package/src/modules/{bmm/workflows/2-plan-workflows → bmgd/workflows/2-design}/gdd/instructions-gdd.md +0 -0
  336. /package/{bmad/bmm/workflows/2-plan-workflows → src/modules/bmgd/workflows/2-design}/narrative/checklist.md +0 -0
  337. /package/{bmad/bmm/workflows/2-plan-workflows → src/modules/bmgd/workflows/2-design}/narrative/instructions-narrative.md +0 -0
  338. /package/{bmad/bmm/workflows/2-plan-workflows → src/modules/bmgd/workflows/2-design}/narrative/narrative-template.md +0 -0
  339. /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/architecture-patterns.yaml +0 -0
  340. /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/architecture-template.md +0 -0
  341. /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/checklist.md +0 -0
  342. /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/decision-catalog.yaml +0 -0
  343. /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/instructions.md +0 -0
  344. /package/{bmad/bmm/workflows/3-solutioning/architecture → src/modules/bmgd/workflows/3-technical/game-architecture}/pattern-categories.csv +0 -0
  345. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/code-review/backlog_template.md +0 -0
  346. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/code-review/checklist.md +0 -0
  347. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/code-review/instructions.md +0 -0
  348. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/correct-course/checklist.md +0 -0
  349. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/correct-course/instructions.md +0 -0
  350. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/create-story/checklist.md +0 -0
  351. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/create-story/instructions.md +0 -0
  352. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/create-story/template.md +0 -0
  353. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/dev-story/AUDIT-REPORT.md +0 -0
  354. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/dev-story/checklist.md +0 -0
  355. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/dev-story/instructions.md +0 -0
  356. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/epic-tech-context/checklist.md +0 -0
  357. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/epic-tech-context/instructions.md +0 -0
  358. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/epic-tech-context/template.md +0 -0
  359. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/retrospective/instructions.md +0 -0
  360. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/sprint-planning/checklist.md +0 -0
  361. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/sprint-planning/instructions.md +0 -0
  362. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/sprint-planning/sprint-status-template.yaml +0 -0
  363. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-context/checklist.md +0 -0
  364. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-context/context-template.xml +0 -0
  365. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-context/instructions.md +0 -0
  366. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-done/instructions.md +0 -0
  367. /package/{bmad/bmm/workflows/4-implementation → src/modules/bmgd/workflows/4-production}/story-ready/instructions.md +0 -0
@@ -1,486 +0,0 @@
1
- # Component Test-Driven Development Loop
2
-
3
- ## Principle
4
-
5
- Start every UI change with a failing component test (`cy.mount`, Playwright component test, or RTL `render`). Follow the Red-Green-Refactor cycle: write a failing test (red), make it pass with minimal code (green), then improve the implementation (refactor). Ship only after the cycle completes. Keep component tests under 100 lines, isolated with fresh providers per test, and validate accessibility alongside functionality.
6
-
7
- ## Rationale
8
-
9
- Component TDD provides immediate feedback during development. Failing tests (red) clarify requirements before writing code. Minimal implementations (green) prevent over-engineering. Refactoring with passing tests ensures changes don't break functionality. Isolated tests with fresh providers prevent state bleed in parallel runs. Accessibility assertions catch usability issues early. Visual debugging (Cypress runner, Storybook, Playwright trace viewer) accelerates diagnosis when tests fail.
10
-
11
- ## Pattern Examples
12
-
13
- ### Example 1: Red-Green-Refactor Loop
14
-
15
- **Context**: When building a new component, start with a failing test that describes the desired behavior. Implement just enough to pass, then refactor for quality.
16
-
17
- **Implementation**:
18
-
19
- ```typescript
20
- // Step 1: RED - Write failing test
21
- // Button.cy.tsx (Cypress Component Test)
22
- import { Button } from './Button';
23
-
24
- describe('Button Component', () => {
25
- it('should render with label', () => {
26
- cy.mount(<Button label="Click Me" />);
27
- cy.contains('Click Me').should('be.visible');
28
- });
29
-
30
- it('should call onClick when clicked', () => {
31
- const onClickSpy = cy.stub().as('onClick');
32
- cy.mount(<Button label="Submit" onClick={onClickSpy} />);
33
-
34
- cy.get('button').click();
35
- cy.get('@onClick').should('have.been.calledOnce');
36
- });
37
- });
38
-
39
- // Run test: FAILS - Button component doesn't exist yet
40
- // Error: "Cannot find module './Button'"
41
-
42
- // Step 2: GREEN - Minimal implementation
43
- // Button.tsx
44
- type ButtonProps = {
45
- label: string;
46
- onClick?: () => void;
47
- };
48
-
49
- export const Button = ({ label, onClick }: ButtonProps) => {
50
- return <button onClick={onClick}>{label}</button>;
51
- };
52
-
53
- // Run test: PASSES - Component renders and handles clicks
54
-
55
- // Step 3: REFACTOR - Improve implementation
56
- // Add disabled state, loading state, variants
57
- type ButtonProps = {
58
- label: string;
59
- onClick?: () => void;
60
- disabled?: boolean;
61
- loading?: boolean;
62
- variant?: 'primary' | 'secondary' | 'danger';
63
- };
64
-
65
- export const Button = ({
66
- label,
67
- onClick,
68
- disabled = false,
69
- loading = false,
70
- variant = 'primary'
71
- }: ButtonProps) => {
72
- return (
73
- <button
74
- onClick={onClick}
75
- disabled={disabled || loading}
76
- className={`btn btn-${variant}`}
77
- data-testid="button"
78
- >
79
- {loading ? <Spinner /> : label}
80
- </button>
81
- );
82
- };
83
-
84
- // Step 4: Expand tests for new features
85
- describe('Button Component', () => {
86
- it('should render with label', () => {
87
- cy.mount(<Button label="Click Me" />);
88
- cy.contains('Click Me').should('be.visible');
89
- });
90
-
91
- it('should call onClick when clicked', () => {
92
- const onClickSpy = cy.stub().as('onClick');
93
- cy.mount(<Button label="Submit" onClick={onClickSpy} />);
94
-
95
- cy.get('button').click();
96
- cy.get('@onClick').should('have.been.calledOnce');
97
- });
98
-
99
- it('should be disabled when disabled prop is true', () => {
100
- cy.mount(<Button label="Submit" disabled={true} />);
101
- cy.get('button').should('be.disabled');
102
- });
103
-
104
- it('should show spinner when loading', () => {
105
- cy.mount(<Button label="Submit" loading={true} />);
106
- cy.get('[data-testid="spinner"]').should('be.visible');
107
- cy.get('button').should('be.disabled');
108
- });
109
-
110
- it('should apply variant styles', () => {
111
- cy.mount(<Button label="Delete" variant="danger" />);
112
- cy.get('button').should('have.class', 'btn-danger');
113
- });
114
- });
115
-
116
- // Run tests: ALL PASS - Refactored component still works
117
-
118
- // Playwright Component Test equivalent
119
- import { test, expect } from '@playwright/experimental-ct-react';
120
- import { Button } from './Button';
121
-
122
- test.describe('Button Component', () => {
123
- test('should call onClick when clicked', async ({ mount }) => {
124
- let clicked = false;
125
- const component = await mount(
126
- <Button label="Submit" onClick={() => { clicked = true; }} />
127
- );
128
-
129
- await component.getByRole('button').click();
130
- expect(clicked).toBe(true);
131
- });
132
-
133
- test('should be disabled when loading', async ({ mount }) => {
134
- const component = await mount(<Button label="Submit" loading={true} />);
135
- await expect(component.getByRole('button')).toBeDisabled();
136
- await expect(component.getByTestId('spinner')).toBeVisible();
137
- });
138
- });
139
- ```
140
-
141
- **Key Points**:
142
-
143
- - Red: Write failing test first - clarifies requirements before coding
144
- - Green: Implement minimal code to pass - prevents over-engineering
145
- - Refactor: Improve code quality while keeping tests green
146
- - Expand: Add tests for new features after refactoring
147
- - Cycle repeats: Each new feature starts with a failing test
148
-
149
- ### Example 2: Provider Isolation Pattern
150
-
151
- **Context**: When testing components that depend on context providers (React Query, Auth, Router), wrap them with required providers in each test to prevent state bleed between tests.
152
-
153
- **Implementation**:
154
-
155
- ```typescript
156
- // test-utils/AllTheProviders.tsx
157
- import { FC, ReactNode } from 'react';
158
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
159
- import { BrowserRouter } from 'react-router-dom';
160
- import { AuthProvider } from '../contexts/AuthContext';
161
-
162
- type Props = {
163
- children: ReactNode;
164
- initialAuth?: { user: User | null; token: string | null };
165
- };
166
-
167
- export const AllTheProviders: FC<Props> = ({ children, initialAuth }) => {
168
- // Create NEW QueryClient per test (prevent state bleed)
169
- const queryClient = new QueryClient({
170
- defaultOptions: {
171
- queries: { retry: false },
172
- mutations: { retry: false }
173
- }
174
- });
175
-
176
- return (
177
- <QueryClientProvider client={queryClient}>
178
- <BrowserRouter>
179
- <AuthProvider initialAuth={initialAuth}>
180
- {children}
181
- </AuthProvider>
182
- </BrowserRouter>
183
- </QueryClientProvider>
184
- );
185
- };
186
-
187
- // Cypress custom mount command
188
- // cypress/support/component.tsx
189
- import { mount } from 'cypress/react18';
190
- import { AllTheProviders } from '../../test-utils/AllTheProviders';
191
-
192
- Cypress.Commands.add('wrappedMount', (component, options = {}) => {
193
- const { initialAuth, ...mountOptions } = options;
194
-
195
- return mount(
196
- <AllTheProviders initialAuth={initialAuth}>
197
- {component}
198
- </AllTheProviders>,
199
- mountOptions
200
- );
201
- });
202
-
203
- // Usage in tests
204
- // UserProfile.cy.tsx
205
- import { UserProfile } from './UserProfile';
206
-
207
- describe('UserProfile Component', () => {
208
- it('should display user when authenticated', () => {
209
- const user = { id: 1, name: 'John Doe', email: 'john@example.com' };
210
-
211
- cy.wrappedMount(<UserProfile />, {
212
- initialAuth: { user, token: 'fake-token' }
213
- });
214
-
215
- cy.contains('John Doe').should('be.visible');
216
- cy.contains('john@example.com').should('be.visible');
217
- });
218
-
219
- it('should show login prompt when not authenticated', () => {
220
- cy.wrappedMount(<UserProfile />, {
221
- initialAuth: { user: null, token: null }
222
- });
223
-
224
- cy.contains('Please log in').should('be.visible');
225
- });
226
- });
227
-
228
- // Playwright Component Test with providers
229
- import { test, expect } from '@playwright/experimental-ct-react';
230
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
231
- import { UserProfile } from './UserProfile';
232
- import { AuthProvider } from '../contexts/AuthContext';
233
-
234
- test.describe('UserProfile Component', () => {
235
- test('should display user when authenticated', async ({ mount }) => {
236
- const user = { id: 1, name: 'John Doe', email: 'john@example.com' };
237
- const queryClient = new QueryClient();
238
-
239
- const component = await mount(
240
- <QueryClientProvider client={queryClient}>
241
- <AuthProvider initialAuth={{ user, token: 'fake-token' }}>
242
- <UserProfile />
243
- </AuthProvider>
244
- </QueryClientProvider>
245
- );
246
-
247
- await expect(component.getByText('John Doe')).toBeVisible();
248
- await expect(component.getByText('john@example.com')).toBeVisible();
249
- });
250
- });
251
- ```
252
-
253
- **Key Points**:
254
-
255
- - Create NEW providers per test (QueryClient, Router, Auth)
256
- - Prevents state pollution between tests
257
- - `initialAuth` prop allows testing different auth states
258
- - Custom mount command (`wrappedMount`) reduces boilerplate
259
- - Providers wrap component, not the entire test suite
260
-
261
- ### Example 3: Accessibility Assertions
262
-
263
- **Context**: When testing components, validate accessibility alongside functionality using axe-core, ARIA roles, labels, and keyboard navigation.
264
-
265
- **Implementation**:
266
-
267
- ```typescript
268
- // Cypress with axe-core
269
- // cypress/support/component.tsx
270
- import 'cypress-axe';
271
-
272
- // Form.cy.tsx
273
- import { Form } from './Form';
274
-
275
- describe('Form Component Accessibility', () => {
276
- beforeEach(() => {
277
- cy.wrappedMount(<Form />);
278
- cy.injectAxe(); // Inject axe-core
279
- });
280
-
281
- it('should have no accessibility violations', () => {
282
- cy.checkA11y(); // Run axe scan
283
- });
284
-
285
- it('should have proper ARIA labels', () => {
286
- cy.get('input[name="email"]').should('have.attr', 'aria-label', 'Email address');
287
- cy.get('input[name="password"]').should('have.attr', 'aria-label', 'Password');
288
- cy.get('button[type="submit"]').should('have.attr', 'aria-label', 'Submit form');
289
- });
290
-
291
- it('should support keyboard navigation', () => {
292
- // Tab through form fields
293
- cy.get('input[name="email"]').focus().type('test@example.com');
294
- cy.realPress('Tab'); // cypress-real-events plugin
295
- cy.focused().should('have.attr', 'name', 'password');
296
-
297
- cy.focused().type('password123');
298
- cy.realPress('Tab');
299
- cy.focused().should('have.attr', 'type', 'submit');
300
-
301
- cy.realPress('Enter'); // Submit via keyboard
302
- cy.contains('Form submitted').should('be.visible');
303
- });
304
-
305
- it('should announce errors to screen readers', () => {
306
- cy.get('button[type="submit"]').click(); // Submit without data
307
-
308
- // Error has role="alert" and aria-live="polite"
309
- cy.get('[role="alert"]')
310
- .should('be.visible')
311
- .and('have.attr', 'aria-live', 'polite')
312
- .and('contain', 'Email is required');
313
- });
314
-
315
- it('should have sufficient color contrast', () => {
316
- cy.checkA11y(null, {
317
- rules: {
318
- 'color-contrast': { enabled: true }
319
- }
320
- });
321
- });
322
- });
323
-
324
- // Playwright with axe-playwright
325
- import { test, expect } from '@playwright/experimental-ct-react';
326
- import AxeBuilder from '@axe-core/playwright';
327
- import { Form } from './Form';
328
-
329
- test.describe('Form Component Accessibility', () => {
330
- test('should have no accessibility violations', async ({ mount, page }) => {
331
- await mount(<Form />);
332
-
333
- const accessibilityScanResults = await new AxeBuilder({ page })
334
- .analyze();
335
-
336
- expect(accessibilityScanResults.violations).toEqual([]);
337
- });
338
-
339
- test('should support keyboard navigation', async ({ mount, page }) => {
340
- const component = await mount(<Form />);
341
-
342
- await component.getByLabel('Email address').fill('test@example.com');
343
- await page.keyboard.press('Tab');
344
-
345
- await expect(component.getByLabel('Password')).toBeFocused();
346
-
347
- await component.getByLabel('Password').fill('password123');
348
- await page.keyboard.press('Tab');
349
-
350
- await expect(component.getByRole('button', { name: 'Submit form' })).toBeFocused();
351
-
352
- await page.keyboard.press('Enter');
353
- await expect(component.getByText('Form submitted')).toBeVisible();
354
- });
355
- });
356
- ```
357
-
358
- **Key Points**:
359
-
360
- - Use `cy.checkA11y()` (Cypress) or `AxeBuilder` (Playwright) for automated accessibility scanning
361
- - Validate ARIA roles, labels, and live regions
362
- - Test keyboard navigation (Tab, Enter, Escape)
363
- - Ensure errors are announced to screen readers (`role="alert"`, `aria-live`)
364
- - Check color contrast meets WCAG standards
365
-
366
- ### Example 4: Visual Regression Test
367
-
368
- **Context**: When testing components, capture screenshots to detect unintended visual changes. Use Playwright visual comparison or Cypress snapshot plugins.
369
-
370
- **Implementation**:
371
-
372
- ```typescript
373
- // Playwright visual regression
374
- import { test, expect } from '@playwright/experimental-ct-react';
375
- import { Button } from './Button';
376
-
377
- test.describe('Button Visual Regression', () => {
378
- test('should match primary button snapshot', async ({ mount }) => {
379
- const component = await mount(<Button label="Primary" variant="primary" />);
380
-
381
- // Capture and compare screenshot
382
- await expect(component).toHaveScreenshot('button-primary.png');
383
- });
384
-
385
- test('should match secondary button snapshot', async ({ mount }) => {
386
- const component = await mount(<Button label="Secondary" variant="secondary" />);
387
- await expect(component).toHaveScreenshot('button-secondary.png');
388
- });
389
-
390
- test('should match disabled button snapshot', async ({ mount }) => {
391
- const component = await mount(<Button label="Disabled" disabled={true} />);
392
- await expect(component).toHaveScreenshot('button-disabled.png');
393
- });
394
-
395
- test('should match loading button snapshot', async ({ mount }) => {
396
- const component = await mount(<Button label="Loading" loading={true} />);
397
- await expect(component).toHaveScreenshot('button-loading.png');
398
- });
399
- });
400
-
401
- // Cypress visual regression with percy or snapshot plugins
402
- import { Button } from './Button';
403
-
404
- describe('Button Visual Regression', () => {
405
- it('should match primary button snapshot', () => {
406
- cy.wrappedMount(<Button label="Primary" variant="primary" />);
407
-
408
- // Option 1: Percy (cloud-based visual testing)
409
- cy.percySnapshot('Button - Primary');
410
-
411
- // Option 2: cypress-plugin-snapshots (local snapshots)
412
- cy.get('button').toMatchImageSnapshot({
413
- name: 'button-primary',
414
- threshold: 0.01 // 1% threshold for pixel differences
415
- });
416
- });
417
-
418
- it('should match hover state', () => {
419
- cy.wrappedMount(<Button label="Hover Me" />);
420
- cy.get('button').realHover(); // cypress-real-events
421
- cy.percySnapshot('Button - Hover State');
422
- });
423
-
424
- it('should match focus state', () => {
425
- cy.wrappedMount(<Button label="Focus Me" />);
426
- cy.get('button').focus();
427
- cy.percySnapshot('Button - Focus State');
428
- });
429
- });
430
-
431
- // Playwright configuration for visual regression
432
- // playwright.config.ts
433
- export default defineConfig({
434
- expect: {
435
- toHaveScreenshot: {
436
- maxDiffPixels: 100, // Allow 100 pixels difference
437
- threshold: 0.2 // 20% threshold
438
- }
439
- },
440
- use: {
441
- screenshot: 'only-on-failure'
442
- }
443
- });
444
-
445
- // Update snapshots when intentional changes are made
446
- // npx playwright test --update-snapshots
447
- ```
448
-
449
- **Key Points**:
450
-
451
- - Playwright: Use `toHaveScreenshot()` for built-in visual comparison
452
- - Cypress: Use Percy (cloud) or snapshot plugins (local) for visual testing
453
- - Capture different states: default, hover, focus, disabled, loading
454
- - Set threshold for acceptable pixel differences (avoid false positives)
455
- - Update snapshots when visual changes are intentional
456
- - Visual tests catch unintended CSS/layout regressions
457
-
458
- ## Integration Points
459
-
460
- - **Used in workflows**: `*atdd` (component test generation), `*automate` (component test expansion), `*framework` (component testing setup)
461
- - **Related fragments**:
462
- - `test-quality.md` - Keep component tests <100 lines, isolated, focused
463
- - `fixture-architecture.md` - Provider wrapping patterns, custom mount commands
464
- - `data-factories.md` - Factory functions for component props
465
- - `test-levels-framework.md` - When to use component tests vs E2E tests
466
-
467
- ## TDD Workflow Summary
468
-
469
- **Red-Green-Refactor Cycle**:
470
-
471
- 1. **Red**: Write failing test describing desired behavior
472
- 2. **Green**: Implement minimal code to make test pass
473
- 3. **Refactor**: Improve code quality, tests stay green
474
- 4. **Repeat**: Each new feature starts with failing test
475
-
476
- **Component Test Checklist**:
477
-
478
- - [ ] Test renders with required props
479
- - [ ] Test user interactions (click, type, submit)
480
- - [ ] Test different states (loading, error, disabled)
481
- - [ ] Test accessibility (ARIA, keyboard navigation)
482
- - [ ] Test visual regression (snapshots)
483
- - [ ] Isolate with fresh providers (no state bleed)
484
- - [ ] Keep tests <100 lines (split by intent)
485
-
486
- _Source: CCTDD repository, Murat component testing talks, Playwright/Cypress component testing docs._