qa-skills 3.0.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.
- package/README.md +168 -0
- package/bin/cli.js +42 -0
- package/dist/agents/registry.d.ts +5 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +101 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/types.d.ts +9 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/dependencies.d.ts +21 -0
- package/dist/dependencies.d.ts.map +1 -0
- package/dist/dependencies.js +125 -0
- package/dist/dependencies.js.map +1 -0
- package/dist/installer.d.ts +25 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +437 -0
- package/dist/installer.js.map +1 -0
- package/dist/scaffold.d.ts +27 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +182 -0
- package/dist/scaffold.js.map +1 -0
- package/package.json +40 -0
- package/skills/qa-accessibility-test-writer/SKILL.md +127 -0
- package/skills/qa-accessibility-test-writer/references/axe-core-patterns.md +349 -0
- package/skills/qa-accessibility-test-writer/references/best-practices.md +184 -0
- package/skills/qa-accessibility-test-writer/references/wcag-tests.md +331 -0
- package/skills/qa-api-contract-curator/SKILL.md +104 -0
- package/skills/qa-api-contract-curator/references/breaking-changes.md +363 -0
- package/skills/qa-api-contract-curator/references/openapi-structure.md +404 -0
- package/skills/qa-browser-data-collector/SKILL.md +132 -0
- package/skills/qa-browser-data-collector/references/data-collection-checklist.md +91 -0
- package/skills/qa-browser-data-collector/references/playwright-mcp-patterns.md +113 -0
- package/skills/qa-bug-ticket-creator/SKILL.md +148 -0
- package/skills/qa-bug-ticket-creator/references/bug-report-format.md +149 -0
- package/skills/qa-bug-ticket-creator/references/severity-guide.md +81 -0
- package/skills/qa-bug-ticket-creator/templates/bug-ticket-template.md +39 -0
- package/skills/qa-changelog-analyzer/SKILL.md +134 -0
- package/skills/qa-changelog-analyzer/references/git-analysis-patterns.md +138 -0
- package/skills/qa-changelog-analyzer/references/impact-mapping.md +120 -0
- package/skills/qa-clickup-integration/SKILL.md +166 -0
- package/skills/qa-clickup-integration/references/api-patterns.md +102 -0
- package/skills/qa-clickup-integration/references/field-mapping.md +71 -0
- package/skills/qa-codeceptjs-writer/SKILL.md +136 -0
- package/skills/qa-codeceptjs-writer/references/best-practices.md +207 -0
- package/skills/qa-codeceptjs-writer/references/config.md +255 -0
- package/skills/qa-codeceptjs-writer/references/patterns.md +285 -0
- package/skills/qa-coverage-analyzer/SKILL.md +166 -0
- package/skills/qa-coverage-analyzer/references/best-practices.md +142 -0
- package/skills/qa-coverage-analyzer/references/coverage-dimensions.md +155 -0
- package/skills/qa-coverage-analyzer/references/tools.md +204 -0
- package/skills/qa-cypress-writer/SKILL.md +134 -0
- package/skills/qa-cypress-writer/references/assertions.md +121 -0
- package/skills/qa-cypress-writer/references/best-practices.md +82 -0
- package/skills/qa-cypress-writer/references/config.md +121 -0
- package/skills/qa-cypress-writer/references/patterns.md +170 -0
- package/skills/qa-data-factory/SKILL.md +126 -0
- package/skills/qa-data-factory/references/factory-patterns.md +164 -0
- package/skills/qa-data-factory/references/faker-guide.md +131 -0
- package/skills/qa-diagram-generator/SKILL.md +125 -0
- package/skills/qa-diagram-generator/references/c4-model.md +53 -0
- package/skills/qa-diagram-generator/references/charts.md +58 -0
- package/skills/qa-diagram-generator/references/class-diagram.md +85 -0
- package/skills/qa-diagram-generator/references/er-diagram.md +69 -0
- package/skills/qa-diagram-generator/references/flowchart.md +92 -0
- package/skills/qa-diagram-generator/references/from-screenshot.md +45 -0
- package/skills/qa-diagram-generator/references/gantt.md +49 -0
- package/skills/qa-diagram-generator/references/journey.md +50 -0
- package/skills/qa-diagram-generator/references/mindmap.md +75 -0
- package/skills/qa-diagram-generator/references/sequence.md +69 -0
- package/skills/qa-diagram-generator/references/state-diagram.md +56 -0
- package/skills/qa-discovery-interview/SKILL.md +182 -0
- package/skills/qa-discovery-interview/references/completeness-checklist.md +53 -0
- package/skills/qa-discovery-interview/references/conflict-patterns.md +101 -0
- package/skills/qa-discovery-interview/references/qa-categories.md +147 -0
- package/skills/qa-discovery-interview/templates/qa-brief-template.md +168 -0
- package/skills/qa-environment-checker/SKILL.md +142 -0
- package/skills/qa-environment-checker/references/dependency-matrix.md +101 -0
- package/skills/qa-environment-checker/references/health-checks.md +209 -0
- package/skills/qa-environment-checker/templates/env-readiness-template.md +64 -0
- package/skills/qa-flaky-detector/SKILL.md +153 -0
- package/skills/qa-flaky-detector/references/ci-analysis.md +140 -0
- package/skills/qa-flaky-detector/references/flaky-patterns.md +247 -0
- package/skills/qa-github-issues-enhanced/SKILL.md +175 -0
- package/skills/qa-github-issues-enhanced/references/issue-templates.md +425 -0
- package/skills/qa-github-issues-enhanced/references/label-taxonomy.md +130 -0
- package/skills/qa-github-issues-enhanced/references/workflow-patterns.md +188 -0
- package/skills/qa-httpx-writer/SKILL.md +138 -0
- package/skills/qa-httpx-writer/references/assertions.md +195 -0
- package/skills/qa-httpx-writer/references/best-practices.md +140 -0
- package/skills/qa-httpx-writer/references/config.md +212 -0
- package/skills/qa-httpx-writer/references/patterns.md +262 -0
- package/skills/qa-jest-writer/SKILL.md +131 -0
- package/skills/qa-jest-writer/references/assertions.md +125 -0
- package/skills/qa-jest-writer/references/best-practices.md +136 -0
- package/skills/qa-jest-writer/references/config.md +134 -0
- package/skills/qa-jest-writer/references/patterns.md +172 -0
- package/skills/qa-jira-integration/SKILL.md +135 -0
- package/skills/qa-jira-integration/references/api-patterns.md +143 -0
- package/skills/qa-jira-integration/references/field-mapping.md +79 -0
- package/skills/qa-jira-integration/references/xray-integration.md +85 -0
- package/skills/qa-jmeter-writer/SKILL.md +171 -0
- package/skills/qa-jmeter-writer/references/best-practices.md +157 -0
- package/skills/qa-jmeter-writer/references/config.md +204 -0
- package/skills/qa-jmeter-writer/references/patterns.md +242 -0
- package/skills/qa-junit5-writer/SKILL.md +157 -0
- package/skills/qa-junit5-writer/references/assertions.md +118 -0
- package/skills/qa-junit5-writer/references/config.md +97 -0
- package/skills/qa-junit5-writer/references/patterns.md +162 -0
- package/skills/qa-k6-writer/SKILL.md +155 -0
- package/skills/qa-k6-writer/references/best-practices.md +236 -0
- package/skills/qa-k6-writer/references/config.md +219 -0
- package/skills/qa-k6-writer/references/patterns.md +304 -0
- package/skills/qa-linear-integration/SKILL.md +137 -0
- package/skills/qa-linear-integration/references/api-patterns.md +249 -0
- package/skills/qa-linear-integration/references/field-mapping.md +121 -0
- package/skills/qa-locust-writer/SKILL.md +151 -0
- package/skills/qa-locust-writer/references/best-practices.md +126 -0
- package/skills/qa-locust-writer/references/config.md +170 -0
- package/skills/qa-locust-writer/references/patterns.md +235 -0
- package/skills/qa-manual-test-designer/SKILL.md +145 -0
- package/skills/qa-manual-test-designer/references/exploratory-charters.md +138 -0
- package/skills/qa-manual-test-designer/references/personas.md +146 -0
- package/skills/qa-manual-test-designer/templates/exploratory-charter-template.md +47 -0
- package/skills/qa-manual-test-designer/templates/test-case-template.md +31 -0
- package/skills/qa-mobile-test-writer/SKILL.md +144 -0
- package/skills/qa-mobile-test-writer/references/best-practices.md +214 -0
- package/skills/qa-mobile-test-writer/references/config.md +309 -0
- package/skills/qa-mobile-test-writer/references/patterns.md +304 -0
- package/skills/qa-nfr-analyst/SKILL.md +177 -0
- package/skills/qa-nfr-analyst/references/iso-25010-model.md +159 -0
- package/skills/qa-nfr-analyst/references/owasp-wstg-baseline.md +202 -0
- package/skills/qa-nfr-analyst/references/wcag-checklist.md +184 -0
- package/skills/qa-nfr-analyst/templates/owasp-checklist-template.md +89 -0
- package/skills/qa-nfr-analyst/templates/wcag-checklist-template.md +48 -0
- package/skills/qa-orchestrator/SKILL.md +132 -0
- package/skills/qa-orchestrator/references/handoff-chains.md +105 -0
- package/skills/qa-orchestrator/references/pipeline-modes.md +115 -0
- package/skills/qa-orchestrator/references/scheduler-rules.md +84 -0
- package/skills/qa-pact-writer/SKILL.md +133 -0
- package/skills/qa-pact-writer/references/best-practices.md +100 -0
- package/skills/qa-pact-writer/references/config.md +135 -0
- package/skills/qa-pact-writer/references/patterns.md +161 -0
- package/skills/qa-plan-creator/SKILL.md +139 -0
- package/skills/qa-plan-creator/references/introduction-plan.md +43 -0
- package/skills/qa-plan-creator/references/migration-plan.md +44 -0
- package/skills/qa-plan-creator/references/onboarding-plan.md +46 -0
- package/skills/qa-plan-creator/references/performance-plan.md +44 -0
- package/skills/qa-plan-creator/references/regression-plan.md +45 -0
- package/skills/qa-plan-creator/references/release-plan.md +45 -0
- package/skills/qa-plan-creator/references/sprint-plan.md +44 -0
- package/skills/qa-plan-creator/references/test-plan.md +59 -0
- package/skills/qa-plan-creator/references/uat-plan.md +43 -0
- package/skills/qa-plan-creator/templates/checklist-template.md +36 -0
- package/skills/qa-plan-creator/templates/regression-checklist-template.md +49 -0
- package/skills/qa-plan-creator/templates/release-checklist-template.md +46 -0
- package/skills/qa-plan-creator/templates/test-plan-template.md +74 -0
- package/skills/qa-playwright-py-writer/SKILL.md +156 -0
- package/skills/qa-playwright-py-writer/references/best-practices.md +194 -0
- package/skills/qa-playwright-py-writer/references/config.md +195 -0
- package/skills/qa-playwright-py-writer/references/patterns.md +212 -0
- package/skills/qa-playwright-ts-writer/SKILL.md +151 -0
- package/skills/qa-playwright-ts-writer/references/assertions.md +109 -0
- package/skills/qa-playwright-ts-writer/references/best-practices.md +191 -0
- package/skills/qa-playwright-ts-writer/references/config.md +144 -0
- package/skills/qa-playwright-ts-writer/references/patterns.md +171 -0
- package/skills/qa-pytest-writer/SKILL.md +145 -0
- package/skills/qa-pytest-writer/references/assertions.md +149 -0
- package/skills/qa-pytest-writer/references/best-practices.md +97 -0
- package/skills/qa-pytest-writer/references/config.md +176 -0
- package/skills/qa-pytest-writer/references/patterns.md +251 -0
- package/skills/qa-qase-integration/SKILL.md +149 -0
- package/skills/qa-qase-integration/references/api-reference.md +354 -0
- package/skills/qa-qase-integration/references/ci-integration.md +196 -0
- package/skills/qa-qase-integration/references/field-mapping.md +157 -0
- package/skills/qa-requirements-generator/SKILL.md +152 -0
- package/skills/qa-requirements-generator/references/iso-29148-structure.md +153 -0
- package/skills/qa-requirements-generator/references/requirement-patterns.md +278 -0
- package/skills/qa-rest-assured-writer/SKILL.md +137 -0
- package/skills/qa-rest-assured-writer/references/best-practices.md +50 -0
- package/skills/qa-rest-assured-writer/references/config.md +124 -0
- package/skills/qa-rest-assured-writer/references/patterns.md +192 -0
- package/skills/qa-risk-analyzer/SKILL.md +158 -0
- package/skills/qa-risk-analyzer/references/impact-analysis.md +133 -0
- package/skills/qa-risk-analyzer/references/risk-factors.md +123 -0
- package/skills/qa-robot-framework-writer/SKILL.md +147 -0
- package/skills/qa-robot-framework-writer/references/best-practices.md +249 -0
- package/skills/qa-robot-framework-writer/references/config.md +204 -0
- package/skills/qa-robot-framework-writer/references/libraries.md +273 -0
- package/skills/qa-robot-framework-writer/references/patterns.md +216 -0
- package/skills/qa-security-test-writer/SKILL.md +123 -0
- package/skills/qa-security-test-writer/references/best-practices.md +155 -0
- package/skills/qa-security-test-writer/references/owasp-top10.md +331 -0
- package/skills/qa-security-test-writer/references/zap-config.md +258 -0
- package/skills/qa-selenium-java-writer/SKILL.md +143 -0
- package/skills/qa-selenium-java-writer/references/best-practices.md +59 -0
- package/skills/qa-selenium-java-writer/references/config.md +143 -0
- package/skills/qa-selenium-java-writer/references/patterns.md +170 -0
- package/skills/qa-selenium-py-writer/SKILL.md +150 -0
- package/skills/qa-selenium-py-writer/references/best-practices.md +175 -0
- package/skills/qa-selenium-py-writer/references/config.md +224 -0
- package/skills/qa-selenium-py-writer/references/patterns.md +255 -0
- package/skills/qa-shortcut-integration/SKILL.md +143 -0
- package/skills/qa-shortcut-integration/references/api-patterns.md +126 -0
- package/skills/qa-shortcut-integration/references/field-mapping.md +66 -0
- package/skills/qa-spec-auditor/SKILL.md +162 -0
- package/skills/qa-spec-auditor/references/audit-checklist.md +144 -0
- package/skills/qa-spec-auditor/references/drift-patterns.md +207 -0
- package/skills/qa-spec-writer/SKILL.md +143 -0
- package/skills/qa-spec-writer/references/gherkin-guide.md +253 -0
- package/skills/qa-spec-writer/references/specification-patterns.md +274 -0
- package/skills/qa-spring-test-writer/SKILL.md +170 -0
- package/skills/qa-spring-test-writer/references/best-practices.md +57 -0
- package/skills/qa-spring-test-writer/references/config.md +179 -0
- package/skills/qa-spring-test-writer/references/patterns.md +235 -0
- package/skills/qa-supertest-writer/SKILL.md +150 -0
- package/skills/qa-supertest-writer/references/assertions.md +192 -0
- package/skills/qa-supertest-writer/references/best-practices.md +102 -0
- package/skills/qa-supertest-writer/references/config.md +166 -0
- package/skills/qa-supertest-writer/references/patterns.md +242 -0
- package/skills/qa-task-creator/SKILL.md +142 -0
- package/skills/qa-task-creator/references/linking-patterns.md +127 -0
- package/skills/qa-task-creator/references/task-types.md +169 -0
- package/skills/qa-task-creator/templates/task-template.md +24 -0
- package/skills/qa-test-doc-compiler/SKILL.md +114 -0
- package/skills/qa-test-doc-compiler/references/agile-tailoring.md +220 -0
- package/skills/qa-test-doc-compiler/references/iso-29119-3-documents.md +302 -0
- package/skills/qa-test-healer/SKILL.md +101 -0
- package/skills/qa-test-healer/references/diagnosis-patterns.md +142 -0
- package/skills/qa-test-healer/references/fix-strategies.md +177 -0
- package/skills/qa-test-reporter/SKILL.md +130 -0
- package/skills/qa-test-reporter/references/best-practices.md +162 -0
- package/skills/qa-test-reporter/references/iso-29119-reports.md +236 -0
- package/skills/qa-test-reporter/references/report-formats.md +287 -0
- package/skills/qa-test-reviewer/SKILL.md +142 -0
- package/skills/qa-test-reviewer/references/anti-patterns.md +268 -0
- package/skills/qa-test-reviewer/references/review-checklist.md +93 -0
- package/skills/qa-test-strategy/SKILL.md +133 -0
- package/skills/qa-test-strategy/references/entry-exit-criteria.md +176 -0
- package/skills/qa-test-strategy/references/risk-matrix.md +102 -0
- package/skills/qa-test-strategy/references/testing-types.md +143 -0
- package/skills/qa-testcase-from-docs/SKILL.md +161 -0
- package/skills/qa-testcase-from-docs/references/test-case-format.md +196 -0
- package/skills/qa-testcase-from-docs/references/test-design-techniques.md +126 -0
- package/skills/qa-testcase-from-docs/templates/test-case-template.md +31 -0
- package/skills/qa-testcase-from-ui/SKILL.md +109 -0
- package/skills/qa-testcase-from-ui/references/ui-element-patterns.md +126 -0
- package/skills/qa-testcase-from-ui/references/visual-analysis-guide.md +146 -0
- package/skills/qa-testcase-from-ui/templates/test-case-template.md +31 -0
- package/skills/qa-visual-regression-writer/SKILL.md +175 -0
- package/skills/qa-visual-regression-writer/references/best-practices.md +154 -0
- package/skills/qa-visual-regression-writer/references/config.md +220 -0
- package/skills/qa-visual-regression-writer/references/patterns.md +213 -0
- package/skills/qa-vitest-writer/SKILL.md +141 -0
- package/skills/qa-vitest-writer/references/assertions.md +105 -0
- package/skills/qa-vitest-writer/references/best-practices.md +62 -0
- package/skills/qa-vitest-writer/references/config.md +127 -0
- package/skills/qa-vitest-writer/references/patterns.md +141 -0
- package/skills/qa-webdriverio-writer/SKILL.md +145 -0
- package/skills/qa-webdriverio-writer/references/best-practices.md +176 -0
- package/skills/qa-webdriverio-writer/references/config.md +240 -0
- package/skills/qa-webdriverio-writer/references/patterns.md +269 -0
|
@@ -0,0 +1,331 @@
|
|
|
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)
|
|
@@ -0,0 +1,104 @@
|
|
|
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
|