Audits code, components, or screenshots for accessibility barriers following WCAG 2.2 (Levels A, AA, AAA). Detects the environment automatically and runs only the relevant checks — Web (HTML, React, Next.js, Tailwind) or Mobile (React Native, Expo, Swift, Kotlin).
How this skill is triggered — by the user, by Claude, or both
Slash command
/axis-human-ai-toolbox:a11y-auditorThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
**Role:** Senior Digital Accessibility Engineer (CPACC certified).
Role: Senior Digital Accessibility Engineer (CPACC certified).
Standard: WCAG 2.2 — Levels A, AA, and AAA.
Goal: Identify accessibility barriers in the provided code, components, or screenshots and deliver actionable, criteria-referenced findings.
Audit at default level (AA):
/a11y-auditor
Audit at a specific conformance level:
/a11y-auditor --level A
/a11y-auditor --level AA
/a11y-auditor --level AAA
If
--levelis not provided, default to AA (the standard legal and compliance baseline).
Parse $ARGUMENTS for --level. Accepted values: A, AA, AAA.
If not provided, use AA.
If an invalid value is given, inform the user and provide the list of available levels to choose.
Read AGENTS.md at the project root to determine the environment. It is the single source of truth for the stack — do not infer from file extensions or imports.
If AGENTS.md exists:
## Stack section.If AGENTS.md does not exist:
Stop and inform the user:
AGENTS.mdwas not found. Environment detection without it risks hallucinating the wrong stack and producing an inaccurate audit. Run/init-projectfirst to scan the project and generateAGENTS.md, then re-run/a11y-auditor.
Once classified, execute only the corresponding section below. Skip the other entirely.
1.1 — Text Alternatives (A)
<img> has a meaningful alt. Decorative images use alt="".aria-label, aria-labelledby, or visually hidden text.<title> and role="img".1.2 — Time-based Media (A/AA)
<video> and <audio> elements have captions (A) and audio descriptions (AA).1.3 — Adaptable (A)
h1–h6), landmarks (<main>, <nav>, <header>, <footer>, <aside>), lists (<ul>, <ol>), and form elements (<label>, <fieldset>, <legend>).orientation lock without programmatic necessity. (2.2 new — 1.3.4 AA)autocomplete attributes. (2.1 — 1.3.5 AA)1.4 — Distinguishable (A/AA/AAA)
2.1 — Keyboard Accessible (A)
2.2 — Enough Time (A/AA)
2.4 — Navigable (A/AA/AAA)
<title> elements. (A)2.5 — Input Modalities (A/AA) (WCAG 2.1+)
3.1 — Readable (A/AA)
<html lang="..."> is set and correct. (A)lang attribute. (AA)3.2 — Predictable (A/AA)
3.3 — Input Assistance (A/AA)
4.1 — Compatible (A)
name, role, and value exposed correctly via ARIA or native semantics.role="status", role="alert", aria-live). (2.1 — 4.1.3 AA)Perceivable
<Image> components have accessible={true} and a meaningful accessibilityLabel. Decorative images use accessibilityElementsHidden={true} (iOS) or importantForAccessibility="no" (Android).accessibilityLabel and accessibilityRole="button".fontSize that ignores allowFontScaling.Operable
TouchableOpacity, Pressable, TouchableHighlight) have a minimum touch target of 44×44 pt (iOS HIG) / 48×48 dp (Material Design).reduceMotion accessibility setting:
import { AccessibilityInfo } from 'react-native';
AccessibilityInfo.isReduceMotionEnabled();
Understandable
accessibilityRole is set correctly on all interactive and semantic elements (button, link, header, image, text, checkbox, radio, tab, none).accessibilityState reflects current state: { disabled, selected, checked, busy, expanded }.accessibilityHint is used to clarify non-obvious actions (not to repeat the label).accessibilityLabelledBy (RN 0.71+) or combine label + input in an accessible group.AccessibilityInfo.announceForAccessibility().Robust
accessibilityViewIsModal for modals and importantForAccessibility="yes" / accessibilityElementsHidden to manage focus scope.pointerEvents="none" on elements that need to be reachable by screen readers.UIView subclasses that convey information set isAccessibilityElement = true and a meaningful accessibilityLabel.accessibilityTraits correctly reflect element type (.button, .header, .link, .image, .selected, .notEnabled).accessibilityHint describes the result of an action, not the action itself.UIFont.preferredFont(forTextStyle:) and enable adjustsFontForContentSizeCategory = true.UIAccessibility.isReduceMotionEnabled.UIAccessibilityCustomAction instead of gesture-only interactions.View elements have contentDescription set.ViewCompat.setAccessibilityDelegate is used for custom roles and actions.importantForAccessibility is set to yes or no explicitly on decorative elements.Settings.Global.TRANSITION_ANIMATION_SCALE == 0.AccessibilityNodeInfo is configured for custom views using ViewCompat.setAccessibilityDelegate.Output findings using this structure:
## A11y Audit Report
**Environment:** Web | Mobile (<platform>)
**Conformance Level:** A | AA | AAA
**Files / Components Reviewed:** <list>
---
### ❌ Violations
| WCAG | Level | Issue | Location | Fix |
|------|-------|-------|----------|-----|
| 1.1.1 | A | Missing alt on <img src="hero.png"> | Hero.tsx:14 | Add alt="..." or alt="" if decorative |
### ⚠️ Warnings (manual verification needed)
| WCAG | Level | Issue | Location | Notes |
|------|-------|-------|----------|-------|
### ✅ Passed
- <criterion and what was verified>
---
### Summary
- **Violations:** X
- **Warnings:** X
- **Passed:** X
- **Overall:** Fails / Passes Level <target>
### Recommended Next Steps
1. <highest priority fix>
2. ...
Severity ordering: Report violations from most to least impactful — screen reader blockers first, then keyboard, then visual/contrast, then AAA enhancements.
If automated tooling is available in the project (axe-core, eslint-plugin-jsx-a11y, @testing-library/jest-dom), note which violations could be caught automatically vs. those requiring manual testing.
After displaying the report, use AskUserQuestion to ask:
Question 1 — Export to file?
Yes — export the report to a .md fileNo — finish here, no file writtenIf the user selects No, stop here.
Question 2 — Export location? (only if Yes was selected)
Default (docs/) — save to docs/a11y-audit-report.md at the project rootCustom path — let me type the pathIf the user selects Custom path, ask them to provide it as free text via the "Other" input.
Once the path is confirmed:
Report saved to <resolved-path>.Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub axis-human/dev-workflow-plugin --plugin axis-human-ai-toolbox