Accessibility Audit
WCAG 2.2 Accessibility Audit and Remediation Skill
Description
The a11y-audit skill provides a complete accessibility audit pipeline for modern web applications. It implements a three-phase workflow -- Scan, Fix, Verify -- that identifies WCAG 2.2 Level A and AA violations, generates exact fix code per framework, and produces stakeholder-ready compliance reports.
For every violation it finds, it provides the precise before/after code fix tailored to your framework (React, Next.js, Vue, Angular, Svelte, or plain HTML).
What this skill does:
- Scans your codebase for every WCAG 2.2 Level A and AA violation, categorized by severity (Critical, Major, Minor)
- Fixes each violation with framework-specific before/after code patterns
- Verifies that fixes resolve the original violations and introduces no regressions
- Reports findings in a structured format suitable for developers, PMs, and compliance stakeholders
- Integrates into CI/CD pipelines to prevent accessibility regressions
Features
| Feature |
Description |
| Full WCAG 2.2 Scan |
Checks all Level A and AA success criteria across your codebase |
| Framework Detection |
Auto-detects React, Next.js, Vue, Angular, Svelte, or plain HTML |
| Severity Classification |
Categorizes each violation as Critical, Major, or Minor |
| Fix Code Generation |
Produces before/after code diffs for every issue |
| Color Contrast Checker |
Validates foreground/background pairs against AA and AAA ratios |
| Compliance Reporting |
Generates stakeholder reports with pass/fail summaries |
| CI/CD Integration |
GitHub Actions, GitLab CI, Azure DevOps pipeline configs |
| Keyboard Navigation Audit |
Detects missing focus management and tab order issues |
| ARIA Validation |
Checks for incorrect, redundant, or missing ARIA attributes |
Severity Definitions
| Severity |
Definition |
Example |
SLA |
| Critical |
Blocks access for entire user groups |
Missing alt text, no keyboard access to navigation |
Fix before release |
| Major |
Significant barrier that degrades experience |
Insufficient color contrast, missing form labels |
Fix within current sprint |
| Minor |
Usability issue that causes friction |
Redundant ARIA roles, suboptimal heading hierarchy |
Fix within next 2 sprints |
Usage
Quick Start
# Scan entire project
python scripts/a11y_scanner.py /path/to/project
# Scan with JSON output for tooling
python scripts/a11y_scanner.py /path/to/project --json
# Check color contrast for specific values
python scripts/contrast_checker.py --fg "#777777" --bg "#ffffff"
# Check contrast across a CSS/Tailwind file
python scripts/contrast_checker.py --file /path/to/styles.css
Slash Command
/a11y-audit # Audit current project
/a11y-audit --scope src/ # Audit specific directory
/a11y-audit --fix # Audit and auto-apply fixes
/a11y-audit --report # Generate stakeholder report
/a11y-audit --ci # Output CI-compatible results
Three-Phase Workflow
Phase 1: Scan -- Walk the source tree, detect framework, apply rule set.
python scripts/a11y_scanner.py /path/to/project --format table
Phase 2: Fix -- Apply framework-specific fixes for each violation.
See references/framework-a11y-patterns.md for the complete fix patterns catalog.
Phase 3: Verify -- Re-run the scanner to confirm fixes and check for regressions.
python scripts/a11y_scanner.py /path/to/project --baseline audit-baseline.json
Example: React Component Audit
// BEFORE: src/components/ProductCard.tsx
function ProductCard({ product }) {
return (
<div => navigate(`/product/${product.id}`)}>
<img src={product.image} />
<div style={{ color: '#aaa', fontSize: '12px' }}>{product.name}</div>
<span style={{ color: '#999' }}>${product.price}</span>
</div>
);
}
| # |
WCAG |
Severity |
Issue |
| 1 |
1.1.1 |
Critical |
<img> missing alt attribute |
| 2 |
2.1.1 |
Critical |
<div onClick> not keyboard accessible |
| 3 |
1.4.3 |
Major |
Color #aaa on white fails contrast (2.32:1, needs 4.5:1) |
| 4 |
1.4.3 |
Major |
Color #999 on white fails contrast (2.85:1, needs 4.5:1) |
| 5 |
4.1.2 |
Major |
Interactive element missing role and accessible name |
// AFTER: src/components/ProductCard.tsx
function ProductCard({ product }) {
return (
<a href={`/product/${product.id}`} className="product-card"
aria-label={`View ${product.name} - $${product.price}`}>
<img src={product.image} alt={product.imageAlt || product.name} />
<div style={{ color: '#595959', fontSize: '12px' }}>{product.name}</div>
<span style={{ color: '#767676' }}>${product.price}</span>
</a>
);
}
See references/examples-by-framework.md for Vue, Angular, Next.js, and Svelte examples.
Tools Reference
a11y_scanner.py
Usage: python scripts/a11y_scanner.py <path> [options]
Options:
--json Output results as JSON
--format {table,csv} Output format (default: table)
--severity {critical,major,minor} Filter by minimum severity
--framework {react,vue,angular,svelte,html,auto} Force framework (default: auto)
--baseline FILE Compare against previous scan results
--report Generate stakeholder report
--output FILE Write results to file
--quiet Suppress output, exit code only
--ci CI mode: non-zero exit on critical issues
contrast_checker.py
Usage: python scripts/contrast_checker.py [options]
Options:
--fg COLOR Foreground color (hex)
--bg COLOR Background color (hex)
--file FILE Scan CSS file for color pairs
--tailwind DIR Scan directory for Tailwind color classes
--json Output results as JSON
--suggest Suggest accessible alternatives for failures
--level {aa,aaa} Target conformance level (default: aa)
Common Pitfalls
| Pitfall |
Correct Approach |
role="button" on a <div> |
Use native <button> -- includes keyboard handling for free |
tabindex="0" on everything |
Only interactive elements need focus; use native elements |
aria-label on non-interactive elements |
Use aria-labelledby pointing to visible text |
display: none for screen reader hiding |
Use .sr-only class instead |
| Color alone to convey meaning |
Add icons, text labels, or patterns alongside color |
| Placeholder as only label |
Always provide a visible <label> |
outline: none without replacement |
Always provide a visible focus indicator via focus-visible |
Empty alt="" on informational images |
Informational images need descriptive alt text |
| Skipping heading levels (h1 -> h3) |
Heading levels must be sequential |
onClick without onKeyDown |
Add keyboard support or prefer native elements |
Ignoring prefers-reduced-motion |
Wrap animations in @media (prefers-reduced-motion: no-preference) |
Related Skills
| Skill |
Relationship |
| senior-frontend |
Frontend patterns used in a11y fixes |
| code-reviewer |
Include a11y checks in code review workflows |
| senior-qa |
Integration of a11y testing into QA processes |
| playwright-pro |
Automated browser testing with accessibility assertions |
| epic-design |
WCAG 2.1 AA compliant animations and scroll storytelling |
| tdd-guide |
Test-driven development patterns for a11y test cases |
Reference Documentation
| Reference |
Description |
| wcag-quick-ref.md |
WCAG 2.2 Level A & AA criteria quick reference |
| wcag-22-new-criteria.md |
New WCAG 2.2 success criteria (Focus Appearance, Target Size, etc.) |
| aria-patterns.md |
ARIA patterns, keyboard interaction, and live regions |
| framework-a11y-patterns.md |
Framework-specific fix patterns (React, Vue, Angular, Svelte, HTML) |
| color-contrast-guide.md |
Color contrast checker details, Tailwind palette mapping, sr-only class |
| ci-cd-integration.md |
GitHub Actions, GitLab CI, Azure DevOps, pre-commit hook configs |
| audit-report-template.md |
Stakeholder-ready audit report template |
| testing-checklist.md |
Manual testing checklist (keyboard, screen reader, visual, forms) |
| examples-by-framework.md |
Full audit examples for Vue, Angular, Next.js, and Svelte |
Resources
1---2name: a11y-audit-23description: Accessibility audit skill for scanning, fixing, and verifying WCAG 2.2 Level A and AA compliance across React, Next.js, Vue, Angular, Svelte, and plain HTML codebases. Use when auditing accessibility, fixing a11y violations, checking color contras...4license: MIT5---6
7# Accessibility Audit
8
9WCAG 2.2 Accessibility Audit and Remediation Skill
10
11## Description
12
13The a11y-audit skill provides a complete accessibility audit pipeline for modern web applications. It implements a three-phase workflow -- Scan, Fix, Verify -- that identifies WCAG 2.2 Level A and AA violations, generates exact fix code per framework, and produces stakeholder-ready compliance reports.
14
15For every violation it finds, it provides the precise before/after code fix tailored to your framework (React, Next.js, Vue, Angular, Svelte, or plain HTML).
16
17**What this skill does:**
18
191. **Scans** your codebase for every WCAG 2.2 Level A and AA violation, categorized by severity (Critical, Major, Minor)
202. **Fixes** each violation with framework-specific before/after code patterns
213. **Verifies** that fixes resolve the original violations and introduces no regressions
224. **Reports** findings in a structured format suitable for developers, PMs, and compliance stakeholders
235. **Integrates** into CI/CD pipelines to prevent accessibility regressions
24
25## Features
26
27| Feature | Description |
28|---------|-------------|
29| **Full WCAG 2.2 Scan** | Checks all Level A and AA success criteria across your codebase |
30| **Framework Detection** | Auto-detects React, Next.js, Vue, Angular, Svelte, or plain HTML |
31| **Severity Classification** | Categorizes each violation as Critical, Major, or Minor |
32| **Fix Code Generation** | Produces before/after code diffs for every issue |
33| **Color Contrast Checker** | Validates foreground/background pairs against AA and AAA ratios |
34| **Compliance Reporting** | Generates stakeholder reports with pass/fail summaries |
35| **CI/CD Integration** | GitHub Actions, GitLab CI, Azure DevOps pipeline configs |
36| **Keyboard Navigation Audit** | Detects missing focus management and tab order issues |
37| **ARIA Validation** | Checks for incorrect, redundant, or missing ARIA attributes |
38
39### Severity Definitions
40
41| Severity | Definition | Example | SLA |
42|----------|-----------|---------|-----|
43| **Critical** | Blocks access for entire user groups | Missing alt text, no keyboard access to navigation | Fix before release |
44| **Major** | Significant barrier that degrades experience | Insufficient color contrast, missing form labels | Fix within current sprint |
45| **Minor** | Usability issue that causes friction | Redundant ARIA roles, suboptimal heading hierarchy | Fix within next 2 sprints |
46
47## Usage
48
49### Quick Start
50
51```bash
52# Scan entire project
53python scripts/a11y_scanner.py /path/to/project
54
55# Scan with JSON output for tooling
56python scripts/a11y_scanner.py /path/to/project --json
57
58# Check color contrast for specific values
59python scripts/contrast_checker.py --fg "#777777" --bg "#ffffff"
60
61# Check contrast across a CSS/Tailwind file
62python scripts/contrast_checker.py --file /path/to/styles.css
63```
64
65### Slash Command
66
67```
68/a11y-audit # Audit current project
69/a11y-audit --scope src/ # Audit specific directory
70/a11y-audit --fix # Audit and auto-apply fixes
71/a11y-audit --report # Generate stakeholder report
72/a11y-audit --ci # Output CI-compatible results
73```
74
75### Three-Phase Workflow
76
77**Phase 1: Scan** -- Walk the source tree, detect framework, apply rule set.
78
79```bash
80python scripts/a11y_scanner.py /path/to/project --format table
81```
82
83**Phase 2: Fix** -- Apply framework-specific fixes for each violation.
84
85> See [references/framework-a11y-patterns.md](references/framework-a11y-patterns.md) for the complete fix patterns catalog.
86
87**Phase 3: Verify** -- Re-run the scanner to confirm fixes and check for regressions.
88
89```bash
90python scripts/a11y_scanner.py /path/to/project --baseline audit-baseline.json
91```
92
93## Example: React Component Audit
94
95```tsx
96// BEFORE: src/components/ProductCard.tsx
97function ProductCard({ product }) {
98 return (
99 <div onClick={() => navigate(`/product/${product.id}`)}>
100 <img src={product.image} />
101 <div style={{ color: '#aaa', fontSize: '12px' }}>{product.name}</div>
102 <span style={{ color: '#999' }}>${product.price}</span>
103 </div>
104 );
105}
106```
107
108| # | WCAG | Severity | Issue |
109|---|------|----------|-------|
110| 1 | 1.1.1 | Critical | `<img>` missing `alt` attribute |
111| 2 | 2.1.1 | Critical | `<div onClick>` not keyboard accessible |
112| 3 | 1.4.3 | Major | Color `#aaa` on white fails contrast (2.32:1, needs 4.5:1) |
113| 4 | 1.4.3 | Major | Color `#999` on white fails contrast (2.85:1, needs 4.5:1) |
114| 5 | 4.1.2 | Major | Interactive element missing role and accessible name |
115
116```tsx
117// AFTER: src/components/ProductCard.tsx
118function ProductCard({ product }) {
119 return (
120 <a href={`/product/${product.id}`} className="product-card"
121 aria-label={`View ${product.name} - $${product.price}`}>
122 <img src={product.image} alt={product.imageAlt || product.name} />
123 <div style={{ color: '#595959', fontSize: '12px' }}>{product.name}</div>
124 <span style={{ color: '#767676' }}>${product.price}</span>
125 </a>
126 );
127}
128```
129
130> See [references/examples-by-framework.md](references/examples-by-framework.md) for Vue, Angular, Next.js, and Svelte examples.
131
132## Tools Reference
133
134### a11y_scanner.py
135
136```
137Usage: python scripts/a11y_scanner.py <path> [options]
138
139Options:
140 --json Output results as JSON
141 --format {table,csv} Output format (default: table)
142 --severity {critical,major,minor} Filter by minimum severity
143 --framework {react,vue,angular,svelte,html,auto} Force framework (default: auto)
144 --baseline FILE Compare against previous scan results
145 --report Generate stakeholder report
146 --output FILE Write results to file
147 --quiet Suppress output, exit code only
148 --ci CI mode: non-zero exit on critical issues
149```
150
151### contrast_checker.py
152
153```
154Usage: python scripts/contrast_checker.py [options]
155
156Options:
157 --fg COLOR Foreground color (hex)
158 --bg COLOR Background color (hex)
159 --file FILE Scan CSS file for color pairs
160 --tailwind DIR Scan directory for Tailwind color classes
161 --json Output results as JSON
162 --suggest Suggest accessible alternatives for failures
163 --level {aa,aaa} Target conformance level (default: aa)
164```
165
166## Common Pitfalls
167
168| Pitfall | Correct Approach |
169|---------|------------------|
170| `role="button"` on a `<div>` | Use native `<button>` -- includes keyboard handling for free |
171| `tabindex="0"` on everything | Only interactive elements need focus; use native elements |
172| `aria-label` on non-interactive elements | Use `aria-labelledby` pointing to visible text |
173| `display: none` for screen reader hiding | Use `.sr-only` class instead |
174| Color alone to convey meaning | Add icons, text labels, or patterns alongside color |
175| Placeholder as only label | Always provide a visible `<label>` |
176| `outline: none` without replacement | Always provide a visible focus indicator via `focus-visible` |
177| Empty `alt=""` on informational images | Informational images need descriptive alt text |
178| Skipping heading levels (h1 -> h3) | Heading levels must be sequential |
179| `onClick` without `onKeyDown` | Add keyboard support or prefer native elements |
180| Ignoring `prefers-reduced-motion` | Wrap animations in `@media (prefers-reduced-motion: no-preference)` |
181
182## Related Skills
183
184| Skill | Relationship |
185|-------|-------------|
186| **senior-frontend** | Frontend patterns used in a11y fixes |
187| **code-reviewer** | Include a11y checks in code review workflows |
188| **senior-qa** | Integration of a11y testing into QA processes |
189| **playwright-pro** | Automated browser testing with accessibility assertions |
190| **epic-design** | WCAG 2.1 AA compliant animations and scroll storytelling |
191| **tdd-guide** | Test-driven development patterns for a11y test cases |
192
193## Reference Documentation
194
195| Reference | Description |
196|-----------|-------------|
197| [wcag-quick-ref.md](references/wcag-quick-ref.md) | WCAG 2.2 Level A & AA criteria quick reference |
198| [wcag-22-new-criteria.md](references/wcag-22-new-criteria.md) | New WCAG 2.2 success criteria (Focus Appearance, Target Size, etc.) |
199| [aria-patterns.md](references/aria-patterns.md) | ARIA patterns, keyboard interaction, and live regions |
200| [framework-a11y-patterns.md](references/framework-a11y-patterns.md) | Framework-specific fix patterns (React, Vue, Angular, Svelte, HTML) |
201| [color-contrast-guide.md](references/color-contrast-guide.md) | Color contrast checker details, Tailwind palette mapping, sr-only class |
202| [ci-cd-integration.md](references/ci-cd-integration.md) | GitHub Actions, GitLab CI, Azure DevOps, pre-commit hook configs |
203| [audit-report-template.md](references/audit-report-template.md) | Stakeholder-ready audit report template |
204| [testing-checklist.md](references/testing-checklist.md) | Manual testing checklist (keyboard, screen reader, visual, forms) |
205| [examples-by-framework.md](references/examples-by-framework.md) | Full audit examples for Vue, Angular, Next.js, and Svelte |
206
207## Resources
208
209- [WCAG 2.2 Specification](https://www.w3.org/TR/WCAG22/)
210- [WAI-ARIA Authoring Practices 1.2](https://www.w3.org/WAI/ARIA/apg/)
211- [Deque axe-core Rules](https://github.com/dequelabs/axe-core/blob/develop/doc/rule-descriptions.md)
212- [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y)