qa-skills 3.0.0 → 3.1.0

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 (262) hide show
  1. package/README.md +20 -149
  2. package/bin/cli.js +1 -40
  3. package/package.json +23 -26
  4. package/dist/agents/registry.d.ts +0 -5
  5. package/dist/agents/registry.d.ts.map +0 -1
  6. package/dist/agents/registry.js +0 -101
  7. package/dist/agents/registry.js.map +0 -1
  8. package/dist/agents/types.d.ts +0 -9
  9. package/dist/agents/types.d.ts.map +0 -1
  10. package/dist/agents/types.js +0 -2
  11. package/dist/agents/types.js.map +0 -1
  12. package/dist/dependencies.d.ts +0 -21
  13. package/dist/dependencies.d.ts.map +0 -1
  14. package/dist/dependencies.js +0 -125
  15. package/dist/dependencies.js.map +0 -1
  16. package/dist/installer.d.ts +0 -25
  17. package/dist/installer.d.ts.map +0 -1
  18. package/dist/installer.js +0 -437
  19. package/dist/installer.js.map +0 -1
  20. package/dist/scaffold.d.ts +0 -27
  21. package/dist/scaffold.d.ts.map +0 -1
  22. package/dist/scaffold.js +0 -182
  23. package/dist/scaffold.js.map +0 -1
  24. package/skills/qa-accessibility-test-writer/SKILL.md +0 -127
  25. package/skills/qa-accessibility-test-writer/references/axe-core-patterns.md +0 -349
  26. package/skills/qa-accessibility-test-writer/references/best-practices.md +0 -184
  27. package/skills/qa-accessibility-test-writer/references/wcag-tests.md +0 -331
  28. package/skills/qa-api-contract-curator/SKILL.md +0 -104
  29. package/skills/qa-api-contract-curator/references/breaking-changes.md +0 -363
  30. package/skills/qa-api-contract-curator/references/openapi-structure.md +0 -404
  31. package/skills/qa-browser-data-collector/SKILL.md +0 -132
  32. package/skills/qa-browser-data-collector/references/data-collection-checklist.md +0 -91
  33. package/skills/qa-browser-data-collector/references/playwright-mcp-patterns.md +0 -113
  34. package/skills/qa-bug-ticket-creator/SKILL.md +0 -148
  35. package/skills/qa-bug-ticket-creator/references/bug-report-format.md +0 -149
  36. package/skills/qa-bug-ticket-creator/references/severity-guide.md +0 -81
  37. package/skills/qa-bug-ticket-creator/templates/bug-ticket-template.md +0 -39
  38. package/skills/qa-changelog-analyzer/SKILL.md +0 -134
  39. package/skills/qa-changelog-analyzer/references/git-analysis-patterns.md +0 -138
  40. package/skills/qa-changelog-analyzer/references/impact-mapping.md +0 -120
  41. package/skills/qa-clickup-integration/SKILL.md +0 -166
  42. package/skills/qa-clickup-integration/references/api-patterns.md +0 -102
  43. package/skills/qa-clickup-integration/references/field-mapping.md +0 -71
  44. package/skills/qa-codeceptjs-writer/SKILL.md +0 -136
  45. package/skills/qa-codeceptjs-writer/references/best-practices.md +0 -207
  46. package/skills/qa-codeceptjs-writer/references/config.md +0 -255
  47. package/skills/qa-codeceptjs-writer/references/patterns.md +0 -285
  48. package/skills/qa-coverage-analyzer/SKILL.md +0 -166
  49. package/skills/qa-coverage-analyzer/references/best-practices.md +0 -142
  50. package/skills/qa-coverage-analyzer/references/coverage-dimensions.md +0 -155
  51. package/skills/qa-coverage-analyzer/references/tools.md +0 -204
  52. package/skills/qa-cypress-writer/SKILL.md +0 -134
  53. package/skills/qa-cypress-writer/references/assertions.md +0 -121
  54. package/skills/qa-cypress-writer/references/best-practices.md +0 -82
  55. package/skills/qa-cypress-writer/references/config.md +0 -121
  56. package/skills/qa-cypress-writer/references/patterns.md +0 -170
  57. package/skills/qa-data-factory/SKILL.md +0 -126
  58. package/skills/qa-data-factory/references/factory-patterns.md +0 -164
  59. package/skills/qa-data-factory/references/faker-guide.md +0 -131
  60. package/skills/qa-diagram-generator/SKILL.md +0 -125
  61. package/skills/qa-diagram-generator/references/c4-model.md +0 -53
  62. package/skills/qa-diagram-generator/references/charts.md +0 -58
  63. package/skills/qa-diagram-generator/references/class-diagram.md +0 -85
  64. package/skills/qa-diagram-generator/references/er-diagram.md +0 -69
  65. package/skills/qa-diagram-generator/references/flowchart.md +0 -92
  66. package/skills/qa-diagram-generator/references/from-screenshot.md +0 -45
  67. package/skills/qa-diagram-generator/references/gantt.md +0 -49
  68. package/skills/qa-diagram-generator/references/journey.md +0 -50
  69. package/skills/qa-diagram-generator/references/mindmap.md +0 -75
  70. package/skills/qa-diagram-generator/references/sequence.md +0 -69
  71. package/skills/qa-diagram-generator/references/state-diagram.md +0 -56
  72. package/skills/qa-discovery-interview/SKILL.md +0 -182
  73. package/skills/qa-discovery-interview/references/completeness-checklist.md +0 -53
  74. package/skills/qa-discovery-interview/references/conflict-patterns.md +0 -101
  75. package/skills/qa-discovery-interview/references/qa-categories.md +0 -147
  76. package/skills/qa-discovery-interview/templates/qa-brief-template.md +0 -168
  77. package/skills/qa-environment-checker/SKILL.md +0 -142
  78. package/skills/qa-environment-checker/references/dependency-matrix.md +0 -101
  79. package/skills/qa-environment-checker/references/health-checks.md +0 -209
  80. package/skills/qa-environment-checker/templates/env-readiness-template.md +0 -64
  81. package/skills/qa-flaky-detector/SKILL.md +0 -153
  82. package/skills/qa-flaky-detector/references/ci-analysis.md +0 -140
  83. package/skills/qa-flaky-detector/references/flaky-patterns.md +0 -247
  84. package/skills/qa-github-issues-enhanced/SKILL.md +0 -175
  85. package/skills/qa-github-issues-enhanced/references/issue-templates.md +0 -425
  86. package/skills/qa-github-issues-enhanced/references/label-taxonomy.md +0 -130
  87. package/skills/qa-github-issues-enhanced/references/workflow-patterns.md +0 -188
  88. package/skills/qa-httpx-writer/SKILL.md +0 -138
  89. package/skills/qa-httpx-writer/references/assertions.md +0 -195
  90. package/skills/qa-httpx-writer/references/best-practices.md +0 -140
  91. package/skills/qa-httpx-writer/references/config.md +0 -212
  92. package/skills/qa-httpx-writer/references/patterns.md +0 -262
  93. package/skills/qa-jest-writer/SKILL.md +0 -131
  94. package/skills/qa-jest-writer/references/assertions.md +0 -125
  95. package/skills/qa-jest-writer/references/best-practices.md +0 -136
  96. package/skills/qa-jest-writer/references/config.md +0 -134
  97. package/skills/qa-jest-writer/references/patterns.md +0 -172
  98. package/skills/qa-jira-integration/SKILL.md +0 -135
  99. package/skills/qa-jira-integration/references/api-patterns.md +0 -143
  100. package/skills/qa-jira-integration/references/field-mapping.md +0 -79
  101. package/skills/qa-jira-integration/references/xray-integration.md +0 -85
  102. package/skills/qa-jmeter-writer/SKILL.md +0 -171
  103. package/skills/qa-jmeter-writer/references/best-practices.md +0 -157
  104. package/skills/qa-jmeter-writer/references/config.md +0 -204
  105. package/skills/qa-jmeter-writer/references/patterns.md +0 -242
  106. package/skills/qa-junit5-writer/SKILL.md +0 -157
  107. package/skills/qa-junit5-writer/references/assertions.md +0 -118
  108. package/skills/qa-junit5-writer/references/config.md +0 -97
  109. package/skills/qa-junit5-writer/references/patterns.md +0 -162
  110. package/skills/qa-k6-writer/SKILL.md +0 -155
  111. package/skills/qa-k6-writer/references/best-practices.md +0 -236
  112. package/skills/qa-k6-writer/references/config.md +0 -219
  113. package/skills/qa-k6-writer/references/patterns.md +0 -304
  114. package/skills/qa-linear-integration/SKILL.md +0 -137
  115. package/skills/qa-linear-integration/references/api-patterns.md +0 -249
  116. package/skills/qa-linear-integration/references/field-mapping.md +0 -121
  117. package/skills/qa-locust-writer/SKILL.md +0 -151
  118. package/skills/qa-locust-writer/references/best-practices.md +0 -126
  119. package/skills/qa-locust-writer/references/config.md +0 -170
  120. package/skills/qa-locust-writer/references/patterns.md +0 -235
  121. package/skills/qa-manual-test-designer/SKILL.md +0 -145
  122. package/skills/qa-manual-test-designer/references/exploratory-charters.md +0 -138
  123. package/skills/qa-manual-test-designer/references/personas.md +0 -146
  124. package/skills/qa-manual-test-designer/templates/exploratory-charter-template.md +0 -47
  125. package/skills/qa-manual-test-designer/templates/test-case-template.md +0 -31
  126. package/skills/qa-mobile-test-writer/SKILL.md +0 -144
  127. package/skills/qa-mobile-test-writer/references/best-practices.md +0 -214
  128. package/skills/qa-mobile-test-writer/references/config.md +0 -309
  129. package/skills/qa-mobile-test-writer/references/patterns.md +0 -304
  130. package/skills/qa-nfr-analyst/SKILL.md +0 -177
  131. package/skills/qa-nfr-analyst/references/iso-25010-model.md +0 -159
  132. package/skills/qa-nfr-analyst/references/owasp-wstg-baseline.md +0 -202
  133. package/skills/qa-nfr-analyst/references/wcag-checklist.md +0 -184
  134. package/skills/qa-nfr-analyst/templates/owasp-checklist-template.md +0 -89
  135. package/skills/qa-nfr-analyst/templates/wcag-checklist-template.md +0 -48
  136. package/skills/qa-orchestrator/SKILL.md +0 -132
  137. package/skills/qa-orchestrator/references/handoff-chains.md +0 -105
  138. package/skills/qa-orchestrator/references/pipeline-modes.md +0 -115
  139. package/skills/qa-orchestrator/references/scheduler-rules.md +0 -84
  140. package/skills/qa-pact-writer/SKILL.md +0 -133
  141. package/skills/qa-pact-writer/references/best-practices.md +0 -100
  142. package/skills/qa-pact-writer/references/config.md +0 -135
  143. package/skills/qa-pact-writer/references/patterns.md +0 -161
  144. package/skills/qa-plan-creator/SKILL.md +0 -139
  145. package/skills/qa-plan-creator/references/introduction-plan.md +0 -43
  146. package/skills/qa-plan-creator/references/migration-plan.md +0 -44
  147. package/skills/qa-plan-creator/references/onboarding-plan.md +0 -46
  148. package/skills/qa-plan-creator/references/performance-plan.md +0 -44
  149. package/skills/qa-plan-creator/references/regression-plan.md +0 -45
  150. package/skills/qa-plan-creator/references/release-plan.md +0 -45
  151. package/skills/qa-plan-creator/references/sprint-plan.md +0 -44
  152. package/skills/qa-plan-creator/references/test-plan.md +0 -59
  153. package/skills/qa-plan-creator/references/uat-plan.md +0 -43
  154. package/skills/qa-plan-creator/templates/checklist-template.md +0 -36
  155. package/skills/qa-plan-creator/templates/regression-checklist-template.md +0 -49
  156. package/skills/qa-plan-creator/templates/release-checklist-template.md +0 -46
  157. package/skills/qa-plan-creator/templates/test-plan-template.md +0 -74
  158. package/skills/qa-playwright-py-writer/SKILL.md +0 -156
  159. package/skills/qa-playwright-py-writer/references/best-practices.md +0 -194
  160. package/skills/qa-playwright-py-writer/references/config.md +0 -195
  161. package/skills/qa-playwright-py-writer/references/patterns.md +0 -212
  162. package/skills/qa-playwright-ts-writer/SKILL.md +0 -151
  163. package/skills/qa-playwright-ts-writer/references/assertions.md +0 -109
  164. package/skills/qa-playwright-ts-writer/references/best-practices.md +0 -191
  165. package/skills/qa-playwright-ts-writer/references/config.md +0 -144
  166. package/skills/qa-playwright-ts-writer/references/patterns.md +0 -171
  167. package/skills/qa-pytest-writer/SKILL.md +0 -145
  168. package/skills/qa-pytest-writer/references/assertions.md +0 -149
  169. package/skills/qa-pytest-writer/references/best-practices.md +0 -97
  170. package/skills/qa-pytest-writer/references/config.md +0 -176
  171. package/skills/qa-pytest-writer/references/patterns.md +0 -251
  172. package/skills/qa-qase-integration/SKILL.md +0 -149
  173. package/skills/qa-qase-integration/references/api-reference.md +0 -354
  174. package/skills/qa-qase-integration/references/ci-integration.md +0 -196
  175. package/skills/qa-qase-integration/references/field-mapping.md +0 -157
  176. package/skills/qa-requirements-generator/SKILL.md +0 -152
  177. package/skills/qa-requirements-generator/references/iso-29148-structure.md +0 -153
  178. package/skills/qa-requirements-generator/references/requirement-patterns.md +0 -278
  179. package/skills/qa-rest-assured-writer/SKILL.md +0 -137
  180. package/skills/qa-rest-assured-writer/references/best-practices.md +0 -50
  181. package/skills/qa-rest-assured-writer/references/config.md +0 -124
  182. package/skills/qa-rest-assured-writer/references/patterns.md +0 -192
  183. package/skills/qa-risk-analyzer/SKILL.md +0 -158
  184. package/skills/qa-risk-analyzer/references/impact-analysis.md +0 -133
  185. package/skills/qa-risk-analyzer/references/risk-factors.md +0 -123
  186. package/skills/qa-robot-framework-writer/SKILL.md +0 -147
  187. package/skills/qa-robot-framework-writer/references/best-practices.md +0 -249
  188. package/skills/qa-robot-framework-writer/references/config.md +0 -204
  189. package/skills/qa-robot-framework-writer/references/libraries.md +0 -273
  190. package/skills/qa-robot-framework-writer/references/patterns.md +0 -216
  191. package/skills/qa-security-test-writer/SKILL.md +0 -123
  192. package/skills/qa-security-test-writer/references/best-practices.md +0 -155
  193. package/skills/qa-security-test-writer/references/owasp-top10.md +0 -331
  194. package/skills/qa-security-test-writer/references/zap-config.md +0 -258
  195. package/skills/qa-selenium-java-writer/SKILL.md +0 -143
  196. package/skills/qa-selenium-java-writer/references/best-practices.md +0 -59
  197. package/skills/qa-selenium-java-writer/references/config.md +0 -143
  198. package/skills/qa-selenium-java-writer/references/patterns.md +0 -170
  199. package/skills/qa-selenium-py-writer/SKILL.md +0 -150
  200. package/skills/qa-selenium-py-writer/references/best-practices.md +0 -175
  201. package/skills/qa-selenium-py-writer/references/config.md +0 -224
  202. package/skills/qa-selenium-py-writer/references/patterns.md +0 -255
  203. package/skills/qa-shortcut-integration/SKILL.md +0 -143
  204. package/skills/qa-shortcut-integration/references/api-patterns.md +0 -126
  205. package/skills/qa-shortcut-integration/references/field-mapping.md +0 -66
  206. package/skills/qa-spec-auditor/SKILL.md +0 -162
  207. package/skills/qa-spec-auditor/references/audit-checklist.md +0 -144
  208. package/skills/qa-spec-auditor/references/drift-patterns.md +0 -207
  209. package/skills/qa-spec-writer/SKILL.md +0 -143
  210. package/skills/qa-spec-writer/references/gherkin-guide.md +0 -253
  211. package/skills/qa-spec-writer/references/specification-patterns.md +0 -274
  212. package/skills/qa-spring-test-writer/SKILL.md +0 -170
  213. package/skills/qa-spring-test-writer/references/best-practices.md +0 -57
  214. package/skills/qa-spring-test-writer/references/config.md +0 -179
  215. package/skills/qa-spring-test-writer/references/patterns.md +0 -235
  216. package/skills/qa-supertest-writer/SKILL.md +0 -150
  217. package/skills/qa-supertest-writer/references/assertions.md +0 -192
  218. package/skills/qa-supertest-writer/references/best-practices.md +0 -102
  219. package/skills/qa-supertest-writer/references/config.md +0 -166
  220. package/skills/qa-supertest-writer/references/patterns.md +0 -242
  221. package/skills/qa-task-creator/SKILL.md +0 -142
  222. package/skills/qa-task-creator/references/linking-patterns.md +0 -127
  223. package/skills/qa-task-creator/references/task-types.md +0 -169
  224. package/skills/qa-task-creator/templates/task-template.md +0 -24
  225. package/skills/qa-test-doc-compiler/SKILL.md +0 -114
  226. package/skills/qa-test-doc-compiler/references/agile-tailoring.md +0 -220
  227. package/skills/qa-test-doc-compiler/references/iso-29119-3-documents.md +0 -302
  228. package/skills/qa-test-healer/SKILL.md +0 -101
  229. package/skills/qa-test-healer/references/diagnosis-patterns.md +0 -142
  230. package/skills/qa-test-healer/references/fix-strategies.md +0 -177
  231. package/skills/qa-test-reporter/SKILL.md +0 -130
  232. package/skills/qa-test-reporter/references/best-practices.md +0 -162
  233. package/skills/qa-test-reporter/references/iso-29119-reports.md +0 -236
  234. package/skills/qa-test-reporter/references/report-formats.md +0 -287
  235. package/skills/qa-test-reviewer/SKILL.md +0 -142
  236. package/skills/qa-test-reviewer/references/anti-patterns.md +0 -268
  237. package/skills/qa-test-reviewer/references/review-checklist.md +0 -93
  238. package/skills/qa-test-strategy/SKILL.md +0 -133
  239. package/skills/qa-test-strategy/references/entry-exit-criteria.md +0 -176
  240. package/skills/qa-test-strategy/references/risk-matrix.md +0 -102
  241. package/skills/qa-test-strategy/references/testing-types.md +0 -143
  242. package/skills/qa-testcase-from-docs/SKILL.md +0 -161
  243. package/skills/qa-testcase-from-docs/references/test-case-format.md +0 -196
  244. package/skills/qa-testcase-from-docs/references/test-design-techniques.md +0 -126
  245. package/skills/qa-testcase-from-docs/templates/test-case-template.md +0 -31
  246. package/skills/qa-testcase-from-ui/SKILL.md +0 -109
  247. package/skills/qa-testcase-from-ui/references/ui-element-patterns.md +0 -126
  248. package/skills/qa-testcase-from-ui/references/visual-analysis-guide.md +0 -146
  249. package/skills/qa-testcase-from-ui/templates/test-case-template.md +0 -31
  250. package/skills/qa-visual-regression-writer/SKILL.md +0 -175
  251. package/skills/qa-visual-regression-writer/references/best-practices.md +0 -154
  252. package/skills/qa-visual-regression-writer/references/config.md +0 -220
  253. package/skills/qa-visual-regression-writer/references/patterns.md +0 -213
  254. package/skills/qa-vitest-writer/SKILL.md +0 -141
  255. package/skills/qa-vitest-writer/references/assertions.md +0 -105
  256. package/skills/qa-vitest-writer/references/best-practices.md +0 -62
  257. package/skills/qa-vitest-writer/references/config.md +0 -127
  258. package/skills/qa-vitest-writer/references/patterns.md +0 -141
  259. package/skills/qa-webdriverio-writer/SKILL.md +0 -145
  260. package/skills/qa-webdriverio-writer/references/best-practices.md +0 -176
  261. package/skills/qa-webdriverio-writer/references/config.md +0 -240
  262. package/skills/qa-webdriverio-writer/references/patterns.md +0 -269
@@ -1,184 +0,0 @@
1
- # Accessibility Testing Best Practices
2
-
3
- Best practices for automated and manual accessibility testing. Use with qa-accessibility-test-writer when generating tests and planning audits.
4
-
5
- ---
6
-
7
- ## Automated vs Manual Testing
8
-
9
- ### What Automation Covers
10
-
11
- | Category | Automated | Manual |
12
- |----------|-----------|--------|
13
- | Color contrast | ✓ | ✓ (verify in context) |
14
- | Alt text presence | ✓ | ✓ (verify accuracy) |
15
- | ARIA validity | ✓ | ✓ (verify semantics) |
16
- | Keyboard operability | Partial | ✓ |
17
- | Focus order | Partial | ✓ |
18
- | Screen reader experience | ✗ | ✓ |
19
- | Cognitive load | ✗ | ✓ |
20
- | Motion sensitivity | ✗ | ✓ |
21
-
22
- ### Recommended Mix
23
-
24
- 1. **Automated first** — axe-core, Pa11y, Lighthouse on every build
25
- 2. **Manual keyboard** — Tab through critical flows (login, checkout, forms)
26
- 3. **Manual screen reader** — NVDA/JAWS (Windows), VoiceOver (macOS/iOS), TalkBack (Android)
27
- 4. **Manual spot checks** — Color contrast in context, zoom to 200%, reduced motion
28
-
29
- ---
30
-
31
- ## Screen Reader Testing
32
-
33
- ### Tools
34
-
35
- | Platform | Screen Reader | Notes |
36
- |----------|---------------|-------|
37
- | Windows | NVDA (free) | Most common for testing |
38
- | Windows | JAWS | Commercial; often required for compliance |
39
- | macOS | VoiceOver | Built-in; Cmd+F5 |
40
- | iOS | VoiceOver | Built-in; triple-click Home/Side |
41
- | Android | TalkBack | Built-in |
42
-
43
- ### Key Scenarios
44
-
45
- 1. **Landmarks** — Can user jump between main, nav, footer?
46
- 2. **Headings** — Can user navigate by heading level?
47
- 3. **Forms** — Are labels announced? Are errors announced?
48
- 4. **Dynamic content** — Are live regions (`aria-live`) announced?
49
- 5. **Custom widgets** — Do dialogs, tabs, accordions have correct roles and states?
50
-
51
- ### Testing Workflow
52
-
53
- ```
54
- 1. Unplug mouse; use keyboard only
55
- 2. Turn on screen reader
56
- 3. Navigate page from top (headings, landmarks, links)
57
- 4. Complete critical user flow (e.g., add to cart, checkout)
58
- 5. Note: missing labels, wrong order, unannounced updates
59
- ```
60
-
61
- ---
62
-
63
- ## Keyboard Testing
64
-
65
- ### Essential Keys
66
-
67
- | Key | Purpose |
68
- |-----|---------|
69
- | Tab | Move forward through focusable elements |
70
- | Shift+Tab | Move backward |
71
- | Enter | Activate links, buttons |
72
- | Space | Toggle checkboxes, activate buttons |
73
- | Arrow keys | Navigate within components (tabs, menus, sliders) |
74
- | Escape | Close modals, cancel |
75
-
76
- ### Checklist
77
-
78
- - [ ] All interactive elements reachable via Tab
79
- - [ ] No keyboard traps (can always Tab out)
80
- - [ ] Focus order matches visual order
81
- - [ ] Focus indicator visible (outline or equivalent)
82
- - [ ] Skip link works and targets main content
83
- - [ ] Modals trap focus and return focus on close
84
- - [ ] Dropdowns/menus operable with Arrow keys
85
-
86
- ### Common Failures
87
-
88
- | Issue | Fix |
89
- |-------|-----|
90
- | Custom div not focusable | Add `tabindex="0"` and keyboard handlers |
91
- | Focus lost after modal close | Store focused element; restore on close |
92
- | No visible focus | Add `:focus-visible` styles |
93
- | Wrong tab order | Use `tabindex` sparingly; fix DOM order |
94
-
95
- ---
96
-
97
- ## Color Contrast
98
-
99
- ### Requirements (WCAG 2.2)
100
-
101
- | Level | Normal Text | Large Text |
102
- |-------|-------------|------------|
103
- | AA | 4.5:1 | 3:1 |
104
- | AAA | 7:1 | 4.5:1 |
105
-
106
- Large text = 18pt+ or 14pt+ bold.
107
-
108
- ### Tools
109
-
110
- - **axe-core** — Automated contrast checks
111
- - **WebAIM Contrast Checker** — Manual verification
112
- - **Chrome DevTools** — Inspect element → Accessibility panel
113
-
114
- ### Edge Cases
115
-
116
- - **Logos** — Exempt; no contrast requirement
117
- - **Disabled elements** — No contrast requirement
118
- - **Placeholder text** — Should meet 4.5:1 or have visible label
119
- - **Focus indicators** — 3:1 against adjacent colors
120
-
121
- ---
122
-
123
- ## Form Accessibility
124
-
125
- ### Labels
126
-
127
- - Every input has a visible `<label>` or `aria-label`
128
- - Labels describe purpose; placeholders are supplementary
129
- - Error messages linked via `aria-describedby` or `aria-errormessage`
130
-
131
- ### Error Handling
132
-
133
- - Errors identified in text (not color alone)
134
- - `aria-invalid="true"` on invalid fields
135
- - `role="alert"` or `aria-live="assertive"` for error announcements
136
- - Suggestions provided (3.3.3 Error Suggestion)
137
-
138
- ### Autocomplete
139
-
140
- - Use `autocomplete` attribute for common fields (name, email, address)
141
-
142
- ---
143
-
144
- ## Testing in CI/CD
145
-
146
- ### Playwright Example
147
-
148
- ```yaml
149
- # .github/workflows/a11y.yml
150
- - name: Run accessibility tests
151
- run: npx playwright test tests/accessibility/
152
- ```
153
-
154
- ### Thresholds
155
-
156
- - **Zero violations** for WCAG 2.2 A/AA in critical paths
157
- - **Lighthouse accessibility score** ≥ 90 for key pages
158
- - **Allow known exceptions** via axe `disableRules` with documented rationale
159
-
160
- ### Reporting
161
-
162
- - Store JSON/HTML reports as artifacts
163
- - Fail build on new violations
164
- - Track trends over time (e.g., Lighthouse CI)
165
-
166
- ---
167
-
168
- ## When to Escalate
169
-
170
- | Situation | Action |
171
- |-----------|--------|
172
- | axe reports "needs review" | Manual verification; document decision |
173
- | Design conflicts with WCAG | Discuss with design; propose alternatives |
174
- | Third-party widget fails | Contact vendor; document as known limitation |
175
- | AAA required | Plan manual testing; automation covers subset |
176
-
177
- ---
178
-
179
- ## References
180
-
181
- - [WCAG 2.2 Understanding](https://www.w3.org/WAI/WCAG22/Understanding/)
182
- - [WebAIM Screen Reader User Survey](https://webaim.org/projects/screenreadersurvey9/)
183
- - [Inclusive Design Principles](https://inclusivedesignprinciples.org/)
184
- - [A11y Project Checklist](https://www.a11yproject.com/checklist/)
@@ -1,331 +0,0 @@
1
- # WCAG 2.2 Test Scenarios per Success Criteria
2
-
3
- Test scenarios and code examples for WCAG 2.2 success criteria. Use with qa-accessibility-test-writer when generating accessibility tests.
4
-
5
- ---
6
-
7
- ## Principle 1: Perceivable
8
-
9
- ### 1.1.1 Non-text Content (Level A)
10
-
11
- **Checkpoint:** All images have alt text; decorative images use `alt=""` or `aria-hidden`.
12
-
13
- ```typescript
14
- // Playwright + @axe-core/playwright
15
- import AxeBuilder from '@axe-core/playwright';
16
-
17
- test('images have appropriate alt text', async ({ page }) => {
18
- await page.goto('/gallery');
19
- const results = await new AxeBuilder({ page })
20
- .withTags(['wcag2a'])
21
- .analyze();
22
- const imageViolations = results.violations.filter(
23
- v => v.id === 'image-alt' || v.ruleId === 'image-alt'
24
- );
25
- expect(imageViolations).toHaveLength(0);
26
- });
27
- ```
28
-
29
- ### 1.3.1 Info and Relationships (Level A)
30
-
31
- **Checkpoint:** Structure conveyed via markup (headings, lists, tables, form labels).
32
-
33
- ```typescript
34
- // Cypress + cypress-axe
35
- it('has semantic structure', () => {
36
- cy.visit('/article');
37
- cy.injectAxe();
38
- cy.checkA11y(null, { runOnly: { type: 'rule', values: ['landmark-one-main', 'page-has-heading-one'] } });
39
- });
40
- ```
41
-
42
- ### 1.4.3 Contrast (Minimum) (Level AA)
43
-
44
- **Checkpoint:** Text contrast ratio ≥ 4.5:1 (normal), 3:1 (large).
45
-
46
- ```typescript
47
- // axe-core checks color-contrast automatically
48
- test('meets color contrast requirements', async ({ page }) => {
49
- await page.goto('/');
50
- const results = await new AxeBuilder({ page })
51
- .withTags(['wcag2aa'])
52
- .analyze();
53
- const contrastViolations = results.violations.filter(
54
- v => v.id === 'color-contrast'
55
- );
56
- expect(contrastViolations).toHaveLength(0);
57
- });
58
- ```
59
-
60
- ### 1.4.4 Resize Text (Level A)
61
-
62
- **Checkpoint:** Text can be resized to 200% without loss of content/function.
63
-
64
- ```typescript
65
- // Playwright: simulate zoom
66
- test('text resizable to 200%', async ({ page }) => {
67
- await page.goto('/');
68
- await page.setViewportSize({ width: 1280, height: 720 });
69
- await page.evaluate(() => document.body.style.zoom = '200%');
70
- const main = page.locator('main');
71
- await expect(main).toBeVisible();
72
- const box = await main.boundingBox();
73
- expect(box?.height).toBeGreaterThan(0);
74
- });
75
- ```
76
-
77
- ### 1.4.10 Reflow (Level AA)
78
-
79
- **Checkpoint:** Content reflows at 320px width without horizontal scroll.
80
-
81
- ```typescript
82
- test('no horizontal scroll at 320px', async ({ page }) => {
83
- await page.setViewportSize({ width: 320, height: 568 });
84
- await page.goto('/');
85
- const scrollWidth = await page.evaluate(() => document.documentElement.scrollWidth);
86
- const clientWidth = await page.evaluate(() => document.documentElement.clientWidth);
87
- expect(scrollWidth).toBeLessThanOrEqual(clientWidth + 1);
88
- });
89
- ```
90
-
91
- ### 1.4.13 Content on Hover or Focus (Level AA)
92
-
93
- **Checkpoint:** Dismissible, hoverable, persistent on pointer hover/focus.
94
-
95
- ```typescript
96
- test('hover/focus content is dismissible', async ({ page }) => {
97
- await page.goto('/tooltips');
98
- const trigger = page.locator('[aria-haspopup="true"]').first();
99
- await trigger.focus();
100
- await expect(page.locator('[role="tooltip"]')).toBeVisible();
101
- await page.keyboard.press('Escape');
102
- await expect(page.locator('[role="tooltip"]')).toBeHidden();
103
- });
104
- ```
105
-
106
- ---
107
-
108
- ## Principle 2: Operable
109
-
110
- ### 2.1.1 Keyboard (Level A)
111
-
112
- **Checkpoint:** All functionality available via keyboard.
113
-
114
- ```typescript
115
- test('modal can be closed with Escape', async ({ page }) => {
116
- await page.goto('/modal-demo');
117
- await page.keyboard.press('Tab');
118
- await page.keyboard.press('Enter'); // open modal
119
- await expect(page.locator('[role="dialog"]')).toBeVisible();
120
- await page.keyboard.press('Escape');
121
- await expect(page.locator('[role="dialog"]')).toBeHidden();
122
- });
123
- ```
124
-
125
- ### 2.1.2 No Keyboard Trap (Level A)
126
-
127
- **Checkpoint:** Focus can be moved away from any component.
128
-
129
- ```typescript
130
- test('no keyboard trap in modal', async ({ page }) => {
131
- await page.goto('/modal-demo');
132
- await page.keyboard.press('Tab');
133
- await page.keyboard.press('Enter');
134
- const focusable = page.locator('[role="dialog"] button, [role="dialog"] [href]');
135
- const count = await focusable.count();
136
- for (let i = 0; i < count + 2; i++) {
137
- await page.keyboard.press('Tab');
138
- }
139
- const focusEl = await page.evaluate(() => document.activeElement?.tagName);
140
- expect(focusEl).toBeDefined();
141
- });
142
- ```
143
-
144
- ### 2.4.1 Bypass Blocks (Level A)
145
-
146
- **Checkpoint:** Skip link or landmark to bypass repeated content.
147
-
148
- ```typescript
149
- test('has skip link', async ({ page }) => {
150
- await page.goto('/');
151
- const skipLink = page.locator('a[href="#main"], a[href="#content"], [href^="#"]').first();
152
- await expect(skipLink).toBeVisible();
153
- await skipLink.click();
154
- const target = await page.locator('#main, #content, [id]').first();
155
- await expect(target).toBeFocused();
156
- });
157
- ```
158
-
159
- ### 2.4.3 Focus Order (Level A)
160
-
161
- **Checkpoint:** Tab order is logical and meaningful.
162
-
163
- ```typescript
164
- test('focus order is logical', async ({ page }) => {
165
- await page.goto('/form');
166
- const order: string[] = [];
167
- for (let i = 0; i < 10; i++) {
168
- await page.keyboard.press('Tab');
169
- const id = await page.evaluate(() => (document.activeElement as HTMLElement)?.id || '');
170
- if (id) order.push(id);
171
- }
172
- expect(order.indexOf('submit')).toBeGreaterThan(order.indexOf('email'));
173
- });
174
- ```
175
-
176
- ### 2.4.7 Focus Visible (Level AA)
177
-
178
- **Checkpoint:** Keyboard focus indicator visible.
179
-
180
- ```typescript
181
- test('focus indicator visible', async ({ page }) => {
182
- await page.goto('/');
183
- const link = page.locator('a').first();
184
- await link.focus();
185
- const outline = await link.evaluate(el => {
186
- const s = getComputedStyle(el);
187
- return s.outlineWidth !== '0px' || s.boxShadow !== 'none' || s.outlineStyle !== 'none';
188
- });
189
- expect(outline).toBeTruthy();
190
- });
191
- ```
192
-
193
- ### 2.5.3 Label in Name (Level A)
194
-
195
- **Checkpoint:** Accessible name includes visible label text.
196
-
197
- ```typescript
198
- test('button accessible name matches visible text', async ({ page }) => {
199
- await page.goto('/');
200
- const btn = page.locator('button').first();
201
- const visibleText = await btn.textContent();
202
- const ariaLabel = await btn.getAttribute('aria-label');
203
- const name = ariaLabel || visibleText?.trim();
204
- expect(name?.length).toBeGreaterThan(0);
205
- });
206
- ```
207
-
208
- ---
209
-
210
- ## Principle 3: Understandable
211
-
212
- ### 3.1.1 Language of Page (Level A)
213
-
214
- **Checkpoint:** Page has `lang` attribute.
215
-
216
- ```typescript
217
- test('page has lang attribute', async ({ page }) => {
218
- await page.goto('/');
219
- const lang = await page.locator('html').getAttribute('lang');
220
- expect(lang).toMatch(/^[a-z]{2}(-[A-Z]{2})?$/);
221
- });
222
- ```
223
-
224
- ### 3.3.1 Error Identification (Level A)
225
-
226
- **Checkpoint:** Input errors identified and described in text.
227
-
228
- ```typescript
229
- test('form errors are announced', async ({ page }) => {
230
- await page.goto('/signup');
231
- await page.locator('input[type="email"]').fill('invalid');
232
- await page.locator('button[type="submit"]').click();
233
- const error = page.locator('[role="alert"], .error, [aria-invalid="true"]');
234
- await expect(error).toBeVisible();
235
- await expect(error).toContainText(/invalid|error|required/i);
236
- });
237
- ```
238
-
239
- ### 3.3.2 Labels or Instructions (Level A)
240
-
241
- **Checkpoint:** Labels/instructions provided for user input.
242
-
243
- ```typescript
244
- // Cypress + cypress-axe: axe-core checks label, label-title-only, etc.
245
- it('form inputs have labels', () => {
246
- cy.visit('/contact');
247
- cy.injectAxe();
248
- cy.checkA11y('form', { runOnly: { type: 'rule', values: ['label', 'input-button-name'] } });
249
- });
250
- ```
251
-
252
- ---
253
-
254
- ## Principle 4: Robust
255
-
256
- ### 4.1.1 Parsing (Level A)
257
-
258
- **Checkpoint:** Markup validates; no duplicate IDs.
259
-
260
- ```typescript
261
- test('no duplicate IDs', async ({ page }) => {
262
- await page.goto('/');
263
- const ids = await page.evaluate(() => {
264
- const elements = document.querySelectorAll('[id]');
265
- const idList = Array.from(elements).map(el => el.id);
266
- return idList;
267
- });
268
- const unique = new Set(ids);
269
- expect(unique.size).toBe(ids.length);
270
- });
271
- ```
272
-
273
- ### 4.1.2 Name, Role, Value (Level A)
274
-
275
- **Checkpoint:** UI components have accessible name, role, value.
276
-
277
- ```typescript
278
- // axe-core checks aria-valid-attr, aria-required-attr, etc.
279
- test('components have name, role, value', async ({ page }) => {
280
- await page.goto('/');
281
- const results = await new AxeBuilder({ page })
282
- .withTags(['wcag2a'])
283
- .analyze();
284
- const ariaViolations = results.violations.filter(
285
- v => v.id?.includes('aria') || v.id === 'button-name'
286
- );
287
- expect(ariaViolations).toHaveLength(0);
288
- });
289
- ```
290
-
291
- ### 4.1.3 Status Messages (Level AA)
292
-
293
- **Checkpoint:** Status messages identified via role or live region.
294
-
295
- ```typescript
296
- test('status messages use live region', async ({ page }) => {
297
- await page.goto('/cart');
298
- await page.locator('button:has-text("Add to cart")').click();
299
- const liveRegion = page.locator('[aria-live="polite"], [aria-live="assertive"], [role="status"], [role="alert"]');
300
- await expect(liveRegion).toBeVisible();
301
- });
302
- ```
303
-
304
- ---
305
-
306
- ## Full Page Audit Example
307
-
308
- ```typescript
309
- // Playwright + @axe-core/playwright
310
- import { test, expect } from '@playwright/test';
311
- import AxeBuilder from '@axe-core/playwright';
312
-
313
- test('homepage meets WCAG 2.2 AA', async ({ page }) => {
314
- await page.goto('/');
315
- const results = await new AxeBuilder({ page })
316
- .withTags(['wcag2a', 'wcag2aa'])
317
- .analyze();
318
-
319
- expect(results.violations).toEqual([]);
320
- if (results.violations.length > 0) {
321
- console.log(JSON.stringify(results.violations, null, 2));
322
- }
323
- });
324
- ```
325
-
326
- ---
327
-
328
- ## References
329
-
330
- - [WCAG 2.2 Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/)
331
- - [axe-core Rule Descriptions](https://github.com/dequelabs/axe-core/blob/develop/doc/rule-descriptions.md)
@@ -1,104 +0,0 @@
1
- ---
2
- name: qa-api-contract-curator
3
- description: Manage and formalize API contracts from existing endpoints, swagger/JSON, network traffic, or developer interviews into OpenAPI specifications.
4
- output_dir: docs/api-contracts
5
- ---
6
-
7
- # QA API Contract Curator
8
-
9
- ## Purpose
10
-
11
- Manage and formalize API contracts. Detect breaking changes, generate OpenAPI (OAS) specifications, and produce versioning rules. Transform disparate API information into a single, validated, version-controlled contract.
12
-
13
- ## Input Sources
14
-
15
- | Source | Description | How to Use |
16
- | ------ | ----------- | ---------- |
17
- | **Existing endpoints** | Live API or network traffic capture | Capture requests/responses via HAR, Postman, browser DevTools; infer schema from payloads |
18
- | **Swagger/OpenAPI JSON/YAML** | Existing spec files | Parse, validate, normalize to OpenAPI 3.x, fill gaps |
19
- | **Developer interviews/descriptions** | Natural language API descriptions | Extract endpoints, methods, parameters, responses; formalize into OAS |
20
- | **Codebase analysis** | Express routes, FastAPI endpoints, Spring controllers, etc. | Scan route definitions, decorators, DTOs; derive contract from implementation |
21
-
22
- ## Workflow
23
-
24
- 1. **Collect endpoint data** — Gather from one or more input sources; merge and deduplicate.
25
- 2. **Normalize into OpenAPI 3.x** — Convert all data into a single OpenAPI 3.x specification (YAML preferred).
26
- 3. **Validate schema completeness** — Ensure paths, schemas, parameters, and responses are documented; flag gaps.
27
- 4. **Detect breaking changes** — Compare against previous version (if available); produce breaking change report.
28
- 5. **Generate request/response examples** — Add realistic examples for each operation.
29
-
30
- ## Output
31
-
32
- - **OpenAPI 3.x specification** (YAML) — Single source of truth for the API contract
33
- - **Request/response examples** — Per-operation examples for documentation and testing
34
- - **Versioning rules** — Semantic versioning guidance, deprecation notes
35
- - **Breaking change report** — When comparing versions: list of breaking changes with severity and migration notes
36
-
37
- ## Breaking Change Detection
38
-
39
- | Change Type | Description | Severity |
40
- | ----------- | ----------- | -------- |
41
- | **Removed endpoints** | Path or method no longer exists | Breaking |
42
- | **Changed response schemas** | Added/removed fields, type changes | Breaking or additive |
43
- | **Modified required fields** | New required field in request/response | Breaking |
44
- | **Authentication changes** | New auth requirement, changed scheme | Breaking |
45
- | **Parameter changes** | Removed/renamed path/query/header params | Breaking |
46
- | **Status code changes** | Success/error codes removed or redefined | Breaking |
47
- | **Additive changes** | New optional fields, new endpoints | Non-breaking |
48
-
49
- See `references/breaking-changes.md` for catalog and mitigation strategies.
50
-
51
- ## Feeds Into
52
-
53
- - **qa-supertest-writer** — TypeScript/Node API tests from contract
54
- - **qa-httpx-writer** — Python API tests from contract
55
- - **qa-pact-writer** — Consumer-driven contract tests from OAS
56
-
57
- ## Scope
58
-
59
- **Can do (autonomous):**
60
- - Generate OpenAPI 3.x from any supported input source
61
- - Merge multiple sources into one spec
62
- - Validate schema completeness and flag gaps
63
- - Detect breaking changes vs previous version
64
- - Generate request/response examples
65
- - Document authentication schemes
66
- - Define versioning strategy
67
-
68
- **Cannot do (requires confirmation):**
69
- - Modify production API implementation
70
- - Change business logic or endpoint behavior
71
- - Override stakeholder decisions on versioning
72
-
73
- **Will not do (out of scope):**
74
- - Implement API endpoints
75
- - Deploy or modify live services
76
- - Make business decisions about API design
77
-
78
- ## Quality Checklist
79
-
80
- Before delivering an OpenAPI specification:
81
-
82
- - [ ] All endpoints are documented (paths, methods, parameters)
83
- - [ ] Request/response examples provided for each operation
84
- - [ ] Error responses defined (4xx, 5xx) where applicable
85
- - [ ] Authentication documented (security schemes, scopes)
86
- - [ ] Versioning strategy defined (info.version, deprecation notes)
87
- - [ ] Schemas are complete (no `{}` or placeholder types)
88
- - [ ] Breaking change report included when comparing versions
89
-
90
- ## Troubleshooting
91
-
92
- | Symptom | Likely Cause | Fix |
93
- | ------- | ------------ | --- |
94
- | Missing request/response schemas | Source has no examples | Infer from code DTOs, add placeholder schemas, ask for samples |
95
- | Duplicate paths from multiple sources | Same API documented in different formats | Merge by path+method, reconcile differences, prefer most complete |
96
- | Breaking changes false positives | Optional vs required misinterpreted | Verify `required` arrays; additive optional changes are non-breaking |
97
- | Auth not documented | Source lacks auth info | Check codebase for middleware, add `security` at spec or operation level |
98
- | Invalid OpenAPI output | Schema syntax errors | Validate with `openapi-generator validate` or Swagger Editor |
99
- | Incomplete codebase extraction | Framework not recognized | Add framework-specific patterns to extraction logic; fall back to manual |
100
-
101
- ## References
102
-
103
- - `references/openapi-structure.md` — OpenAPI 3.x specification structure with examples
104
- - `references/breaking-changes.md` — Catalog of breaking changes and mitigation strategies