Skip to content
Back to skills

A11y

ASecurity

Accessibility audit against WCAG 2.1 AA — run the automated scan, then the manual checks tooling cannot make, and report in this project's format.

  • 6 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added February 10, 2026
developmentbash

Works with

  • cli

Security analysis

A100/100

Scanned September 20, 2026

npx -y skills add djnsty23/claude-auto-dev --skill a11y --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of A11y?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for A11y
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/djnsty23-a11y/badge)](https://www.skillsdirectory.com/skills/djnsty23-a11y)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: a11y
description: Accessibility audit against WCAG 2.1 AA — run the automated scan, then the manual checks tooling cannot make, and report in this project's format.
when_to_use: "Invoked when the user says \"a11y\", \"accessibility\", \"wcag\", \"screen reader\", or asks whether a UI is accessible."
allowed-tools: Bash, Read, Grep, Glob
model: opus
user-invocable: true
argument-hint: "[url or component path]"
---

# Accessibility Audit

You know WCAG 2.1 AA. This skill is the procedure and the report format, not a
tutorial on it.

## 1. Automated scan

```bash
npx --no-install axe "$TARGET_URL" --exit
```

Resolve the project’s installed `@axe-core/cli` and its browser driver first;
use an existing axe integration if that is what the project provides. Record
the command, version, target build, routes/states, exit status and report.
Missing tooling or a failed page load is an unexecuted check. A clean automated
scan covers only its rules and scanned states; manual checks still apply.

## 2. Manual checks

Use an available browser driver with its actual tool schema. Confirm these in
the affected public and authenticated flows, including relevant error states:

1. **Keyboard only.** Tab through the whole flow. Every interactive element is
   reachable, in a sensible order, with a visible focus indicator. Modal dialogs trap
   focus and restore it on close; nonmodal dialogs must not trap the user.
2. **Status changes are accessible.** Verify relevant loading, error and success
   notifications through suitable status semantics or focus management. Do not
   claim an announcement was heard from a DOM inspection alone; if no screen
   reader was exercised, record that manual coverage gap.
3. Labels on every input; errors tied to their field.
4. Contrast at 4.5:1 for body text, 3:1 for large text and UI boundaries.
5. Meaningful landmarks and a heading hierarchy that describes the content.
6. Images: meaningful ones have alt text, decorative ones have `alt=""`.

`rule-design-system` and `standards` list the anti-patterns to flag on sight
(`user-scalable=no`, `outline-none` with no visible focus replacement). Check
reduced-motion behavior and effective hit areas; distinguish project touch-size
targets from the WCAG criterion actually violated.

## 3. Report

```
Accessibility Audit (WCAG 2.1 AA)
──────────────────────────────────
Keyboard Navigation:  ✅ All interactive elements reachable
Focus Management:     ⚠️ Dialog doesn't trap focus
Color Contrast:       ✅ All text meets 4.5:1
Images:               ⚠️ 3 images missing alt text
Forms:                ✅ All inputs labeled
ARIA:                 ✅ Live regions for loading states
Semantic HTML:        ⚠️ Missing landmark roles

Coverage: [named routes, roles, states, automated/manual checks and gaps]
Critical: 0 | High: 1 | Medium: 2 | Low: 1
```

Each finding gets `file:line`, the WCAG criterion, and the fix. Say which checks
were automated and which you performed manually — a reader cannot tell
otherwise. A severity or rating requires a stated rationale, not a raw violation count.

## Proving the run

**Observable:** the scanner executed across the named routes/states, findings
were triaged against the applicable standard, and manual outcomes are recorded.
`--exit` fails on any selected rule violation, not only serious/critical ones.

```bash
npx --no-install axe "$TARGET_URL" --exit   # non-zero on any selected rule violation
```

A clean report is only meaningful next to the population it covers. "No issues
found" over one route reads identically to "no issues found" over twelve, and
identically again to a scanner that failed to load the page — so the report says
how many routes were scanned and names them. If the scan could not run, say that
instead; it is not a pass.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…