From wcag-auditor
Use this skill for ANY task involving: buttons, forms, inputs, images, modals, navigation, focus, keyboard, color, contrast, screen readers, ARIA, semantic HTML, interactive elements, component review, frontend code review, UI audit, UX review, checkout flow, or any component that users interact with visually or programmatically. Also triggers explicitly on: "accessibility", "a11y", "WCAG", "ARIA", "screen reader", "color contrast", "tab order", "ADA compliance", "audit my", "check my", "review my", "fix my", "is my X accessible". When in doubt — run Phase 1 tool check first, it costs nothing.
How this skill is triggered — by the user, by Claude, or both
Slash command
/wcag-auditor:wcag-auditorThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Run real tools. They catch 30–40% of issues with zero false negatives on what they cover.
Run real tools. They catch 30–40% of issues with zero false negatives on what they cover.
# 1a. Check if eslint-plugin-jsx-a11y is available
npx eslint --no-eslintrc -c '{"plugins":["jsx-a11y"],"extends":["plugin:jsx-a11y/recommended"],"parser":"@babel/eslint-parser","parserOptions":{"requireConfigFile":false,"babelOptions":{"presets":["@babel/preset-react"]}}}' \
--ext .jsx,.tsx src/ 2>/dev/null | head -60
# 1b. If axe-cli available — run against local dev server
npx axe http://localhost:3000 --reporter json 2>/dev/null | head -80
# 1c. Quick deterministic grep (high signal-to-noise patterns only)
echo "=== Images without alt ===" && grep -rn '<img[^>]*>' src/ --include='*.tsx' --include='*.jsx' | grep -v 'alt=' | grep -v '//'
echo "=== Interactive divs/spans ===" && grep -rn '<\(div\|span\)[^>]*onClick' src/ --include='*.tsx' --include='*.jsx' | grep -v 'role=\|//.*onClick'
echo "=== Inputs without label association ===" && grep -rn '<input' src/ --include='*.tsx' --include='*.jsx' | grep -v 'type="hidden"\|aria-label\|aria-labelledby\|id='
echo "=== outline:none without replacement ===" && grep -rn 'outline.*:.*none\|outline.*:.*0' src/ --include='*.css' --include='*.scss' --include='*.tsx'
echo "=== Missing lang on html ===" && grep -rn '<html' public/ --include='*.html' | grep -v 'lang='
Interpret tool output before proceeding to Phase 2. If eslint/axe output is available — list all reported issues first, mapped to WCAG criteria.
Tools cannot check: logical focus order, meaningful alt text quality, context-appropriate ARIA labels, color contrast in CSS-in-JS/Tailwind, screen reader announcement flow, keyboard UX patterns.
Decision tree for Phase 2:
references/aria-roles.mdreferences/color-contrast.mdreferences/screen-reader.mdreferences/fix-suggestions.mdreferences/wcag-checks.mdFormat every finding as:
[SEVERITY] WCAG X.X.X — Issue description
File: path/to/file.tsx:42
Source: eslint-jsx-a11y / axe-core / manual
Before: <problematic code>
After: <fixed code>
Severity levels:
End every report with:
Tool coverage: ~35% of issues (eslint-jsx-a11y + axe-core)
Manual review: ~65% of issues (this analysis)
Recommendation: run axe DevTools in browser for final verification
| User says | Do this |
|---|---|
| "audit my repo" | Run Phase 1 scan across all src/, report Phase 2 summary |
| "check this component" | Skip Phase 1, go straight to Phase 2 with provided code |
| "fix this error" | Read fix-suggestions.md, provide before/after |
| "contrast for #hex" | Read color-contrast.md, calculate ratio inline |
| "check my buttons/forms/nav" | Phase 1 grep for that element type, then Phase 2 |
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub petro-nazarenko/wcag-auditor