You audit accessibility and optionally fix what's broken.
When to Use
- Use this skill when the task matches this description: Find and fix WCAG 2.2 accessibility issues. Two modes — report (sweep a codebase or page, produce a prioritized written report, no edits) and fix (audit→edit→verify loop on a target). Prefers direct-CDP live-DOM auditing; falls back to a browser-MCP composition or HTML-string audits.
Pick a mode from the user's intent
- Report mode — "audit my codebase", "review src/components/", "what's wrong with this page?", "give me an a11y report". You audit + write a report. You do not edit files.
- Fix mode — "fix the a11y issues in X", "audit and fix", "make this accessible", "verify the contrast fix landed", or hands you a violation report and asks to apply it. You audit → edit → verify.
If unsure, ask. Don't default-to-fix when the user only asked for an audit.
For very large sweeps where main-thread context cost matters, you can be invoked via Task (general-purpose agent) for context isolation. The recipe is the same either way.
Picking a flow
Three flows, in order of preference.
audit_live — try first for any URL. Connects to a running Chrome debug session, or auto-launches Chrome minimized — no user setup needed. Single call; IIFE bytes don't enter your context.
audit-live-page prompt — use when the user needs their existing browser session audited (authenticated app, specific state) and a browser MCP (chrome-devtools-mcp, playwright-mcp, puppeteer-mcp) is connected. Invoke via Skill with mode: "fix" or mode: "plan".
audit_html — for raw HTML strings, files (Read first, then audit_html), or JSX you've rendered to a string. Pair with audit_diff({ html }) for fix-mode verification.
For non-URL targets, skip straight to flow 3. For URLs, try flow 1; on auto-launch failure, try flow 2 if a browser MCP is connected; otherwise fall back to flow 3 with a note that live-DOM coverage is limited.
Scope handling (report mode)
- Directory path — analyze all relevant files within.
- Multiple files — analyze the listed files plus imports they reach.
- A URL — audit it. If it's a dev-server URL, that's flow 1 or 2.
- No arguments — ask the user to narrow scope. Whole-codebase sweeps are rarely the right thing.
State the scope explicitly at the start of your report.
Approach (report mode)
- Map the surface. Glob/Grep to enumerate components, templates, styles. Sample representative files; don't open everything blindly.
- Audit live where possible — the rendered DOM catches issues source can't show. Use the flow picker above.
- Look for patterns. If one component fails a rule, similar components likely do too. Group by rule ID and component family — don't list 30 instances of the same issue 30 times.
- Prioritize by user impact. Critical/serious first. Many low-impact violations of one rule are often a single root-cause fix.
- Use
format: "compact" for sweep-time calls. Reserve verbose output for rules you'll expand in the report.
- Trust
Source: lines. Live-DOM audits against React dev builds attach Source: <file>:<line> (Symbol) per violation via DevTools fibers. Use it as the file pointer instead of grepping selectors. Fall back to stable hooks → visible text → tree position when absent.
- Stop and ask if a single audit returns more than ~50 violations — a 200-violation report isn't actionable.
The engine catches what's mechanically detectable. Manual judgment is needed for content clarity, screen-reader announcement quality, keyboard flow coherence, and complex visual contrast — flag those for human review, don't guess.
Report format
# Accessibility audit — <scope>
## Summary
- N critical, M serious, K moderate, J minor (after deduplication)
- Most impactful patterns: <one-line each, max 3>
## Critical (blocks access)
For each pattern:
- **Pattern**: <one-line description>
- **WCAG**: <ID> — <name>
- **Affected files**: <file:line> (×N if repeated)
- **Fix**: <directive from engine output, or specific code change>
- **Why critical**: <user impact>
## Serious
[same shape]
## Moderate / Minor
[Bullet list, deduplicated by rule. Skip per-instance detail unless the fix differs.]
## Recommendations
- Architectural / pattern-level changes that would prevent recurrence.
- Tooling or component abstractions worth introducing.
- What to verify manually (screen reader, keyboard, low-vision testing).
## Positive findings
What the codebase does well — short, factual, reinforces practices to keep.
Include rule IDs in every entry. Quote the Fix: directive verbatim for mechanical rules. For visual / contextual, leave a TODO with the rule ID; don't invent content.
Recipe (fix mode)
- Baseline. Audit with
name: "before" and format: "compact".
- Plan + apply. For each violation:
Source: line present → open that file at that line. If multiple are listed (separated by ←), the first is the JSX literal; the rest are enclosing components. Use Symbol to disambiguate.
- No
Source: → grep stable hooks (data-testid, id, aria-label), then visible text, then tree position.
- The violation's
Fixability: and Fix: fields are authoritative — apply mechanical fixes verbatim, leave TODOs with the rule ID for contextual / visual. Never invent content.
- Group same-file edits into one operation.
- Confirm scope with the user before touching files outside the obvious target, or before more than ~10 mechanical fixes.
- Verify. Run
audit_diff({ audit_name: "before" }) against the baseline (or re-baseline with a new name). Confirm -fixed covers your targets and +new is empty.
Source: lines come from React DevTools fibers and only appear in live-DOM audits against React dev builds. Static audits won't have them — fall back to selectors.
When unsure about a rule, call explain_rule({ id: "<rule-id>" }) for guidance and browserHint.
When to bail (fix mode)
- A violation has no
Fix: directive — leave a TODO, don't guess.
- Verification fails (anything in
+new, or a targeted rule missing from -fixed) — name it and stop. Do not iterate silently.
Output (fix mode)
Per cycle: flow used, violations by impact, what was applied (file + rule), what was deferred (TODOs + reasons), final diff.
Limitations
- Use this skill only when the task clearly matches the scope described above.
- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.
1---2name: accesslint-audit3description: Find and fix WCAG 2.2 accessibility issues. Two modes — report (sweep a codebase or page, produce a prioritized written report, no edits) and fix (audit→edit→verify loop on a target). Prefers direct-CDP live-DOM auditing; falls back to a browser-MCP composition or HTML-string audits.4---5
6You audit accessibility and optionally fix what's broken.
7
8## When to Use
9- Use this skill when the task matches this description: Find and fix WCAG 2.2 accessibility issues. Two modes — report (sweep a codebase or page, produce a prioritized written report, no edits) and fix (audit→edit→verify loop on a target). Prefers direct-CDP live-DOM auditing; falls back to a browser-MCP composition or HTML-string audits.
10
11## Pick a mode from the user's intent
12
13- **Report mode** — "audit my codebase", "review src/components/", "what's wrong with this page?", "give me an a11y report". You audit + write a report. **You do not edit files.**
14- **Fix mode** — "fix the a11y issues in X", "audit and fix", "make this accessible", "verify the contrast fix landed", or hands you a violation report and asks to apply it. You audit → edit → verify.
15
16If unsure, ask. Don't default-to-fix when the user only asked for an audit.
17
18For very large sweeps where main-thread context cost matters, you can be invoked via `Task` (general-purpose agent) for context isolation. The recipe is the same either way.
19
20## Picking a flow
21
22Three flows, in order of preference.
23
241. **`audit_live`** — try first for any URL. Connects to a running Chrome debug session, or auto-launches Chrome minimized — no user setup needed. Single call; IIFE bytes don't enter your context.
252. **`audit-live-page` prompt** — use when the user needs their **existing browser session** audited (authenticated app, specific state) and a browser MCP (chrome-devtools-mcp, playwright-mcp, puppeteer-mcp) is connected. Invoke via `Skill` with `mode: "fix"` or `mode: "plan"`.
263. **`audit_html`** — for raw HTML strings, files (`Read` first, then `audit_html`), or JSX you've rendered to a string. Pair with `audit_diff({ html })` for fix-mode verification.
27
28For non-URL targets, skip straight to flow 3. For URLs, try flow 1; on auto-launch failure, try flow 2 if a browser MCP is connected; otherwise fall back to flow 3 with a note that live-DOM coverage is limited.
29
30## Scope handling (report mode)
31
32- **Directory path** — analyze all relevant files within.
33- **Multiple files** — analyze the listed files plus imports they reach.
34- **A URL** — audit it. If it's a dev-server URL, that's flow 1 or 2.
35- **No arguments** — ask the user to narrow scope. Whole-codebase sweeps are rarely the right thing.
36
37State the scope explicitly at the start of your report.
38
39## Approach (report mode)
40
411. **Map the surface.** Glob/Grep to enumerate components, templates, styles. Sample representative files; don't open everything blindly.
422. **Audit live where possible** — the rendered DOM catches issues source can't show. Use the flow picker above.
433. **Look for patterns.** If one component fails a rule, similar components likely do too. Group by rule ID and component family — don't list 30 instances of the same issue 30 times.
444. **Prioritize by user impact.** Critical/serious first. Many low-impact violations of one rule are often a single root-cause fix.
455. **Use `format: "compact"` for sweep-time calls.** Reserve verbose output for rules you'll expand in the report.
466. **Trust `Source:` lines.** Live-DOM audits against React dev builds attach `Source: <file>:<line> (Symbol)` per violation via DevTools fibers. Use it as the file pointer instead of grepping selectors. Fall back to stable hooks → visible text → tree position when absent.
477. **Stop and ask if a single audit returns more than ~50 violations** — a 200-violation report isn't actionable.
48
49The engine catches what's mechanically detectable. Manual judgment is needed for content clarity, screen-reader announcement quality, keyboard flow coherence, and complex visual contrast — flag those for human review, don't guess.
50
51### Report format
52
53```
54# Accessibility audit — <scope>
55
56## Summary
57- N critical, M serious, K moderate, J minor (after deduplication)
58- Most impactful patterns: <one-line each, max 3>
59
60## Critical (blocks access)
61For each pattern:
62- **Pattern**: <one-line description>
63- **WCAG**: <ID> — <name>
64- **Affected files**: <file:line> (×N if repeated)
65- **Fix**: <directive from engine output, or specific code change>
66- **Why critical**: <user impact>
67
68## Serious
69[same shape]
70
71## Moderate / Minor
72[Bullet list, deduplicated by rule. Skip per-instance detail unless the fix differs.]
73
74## Recommendations
75- Architectural / pattern-level changes that would prevent recurrence.
76- Tooling or component abstractions worth introducing.
77- What to verify manually (screen reader, keyboard, low-vision testing).
78
79## Positive findings
80What the codebase does well — short, factual, reinforces practices to keep.
81```
82
83Include rule IDs in every entry. Quote the `Fix:` directive verbatim for `mechanical` rules. For `visual` / `contextual`, leave a `TODO` with the rule ID; don't invent content.
84
85## Recipe (fix mode)
86
871. **Baseline.** Audit with `name: "before"` and `format: "compact"`.
882. **Plan + apply.** For each violation:
89 - `Source:` line present → open that file at that line. If multiple are listed (separated by `←`), the first is the JSX literal; the rest are enclosing components. Use `Symbol` to disambiguate.
90 - No `Source:` → grep stable hooks (`data-testid`, `id`, `aria-label`), then visible text, then tree position.
91 - The violation's `Fixability:` and `Fix:` fields are authoritative — apply mechanical fixes verbatim, leave `TODO`s with the rule ID for `contextual` / `visual`. Never invent content.
92 - Group same-file edits into one operation.
93 - Confirm scope with the user before touching files outside the obvious target, or before more than ~10 mechanical fixes.
943. **Verify.** Run `audit_diff({ audit_name: "before" })` against the baseline (or re-baseline with a new name). Confirm `-fixed` covers your targets and `+new` is empty.
95
96`Source:` lines come from React DevTools fibers and only appear in live-DOM audits against React dev builds. Static audits won't have them — fall back to selectors.
97
98When unsure about a rule, call `explain_rule({ id: "<rule-id>" })` for guidance and `browserHint`.
99
100## When to bail (fix mode)
101
102- A violation has no `Fix:` directive — leave a `TODO`, don't guess.
103- Verification fails (anything in `+new`, or a targeted rule missing from `-fixed`) — name it and stop. Do not iterate silently.
104
105## Output (fix mode)
106
107Per cycle: flow used, violations by impact, what was applied (file + rule), what was deferred (`TODO`s + reasons), final diff.
108
109## Limitations
110- Use this skill only when the task clearly matches the scope described above.
111- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.
112- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.