Skip to main content

a11y-validate

Accessibility validator: WCAG 2.1 AA, EN 301 549, EAA. Triggers: a11y, accessibility, WCAG, EAA, ARIA, contrast, keyboard, screen reader.

소스 정보

저장소
softspark/ai-toolkit
최근 소스 활동
2026년 8월 6일 05:58
감지된 SKILL.md 언어
영어
스타
179
포크
21

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

파일 탐색기
8 개 파일

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
a11y-validate
description
Accessibility validator: WCAG 2.1 AA, EN 301 549, EAA. Triggers: a11y, accessibility, WCAG, EAA, ARIA, contrast, keyboard, screen reader.
user-invocable
true
effort
medium
disable-model-invocation
true
context
fork
agent
frontend-specialist
argument-hint
[path] [--scope full|keyboard|contrast|forms|media|aria|motion|mobile|docs] [--standard wcag-2.1-aa|wcag-2.2-aa|en-301-549|eaa] [--severity high|warn|info] [--framework auto|react|next|nuxt|astro|gatsby|sveltekit|remix|angular|vue|react-native|flutter|static] [--output markdown|json]
allowed-tools
Read, Grep, Glob, Bash
# /a11y-validate — Accessibility & EAA Compliance Scanner $ARGUMENTS Scan a codebase for accessibility issues using pattern-matching heuristics. Detects violations of **WCAG 2.1 Level AA**, **EN 301 549** (the EU harmonized accessibility standard), and the **European Accessibility Act** (Directive (EU) 2019/882, "EAA", in force since 28 June 2025). Read-only — never modifies files. Complements `/seo-validate` (which only covers SEO-a11y overlap shallowly). Use this skill when the concern is legal accessibility compliance, not search engine ranking. **Standards basis**: - **WCAG 2.1** Level A + AA — W3C Recommendation 2018 (updated 2023). - **WCAG 2.2** Level AA (opt-in via `--standard wcag-2.2-aa`) — adds 2.4.11 focus not obscured, 2.5.8 target size minimum, 3.2.6 consistent help, 3.3.7 redundant entry, 3.3.8 accessible authentication. - **EN 301 549 v3.2.1** — EU harmonized standard; aligned with WCAG 2.1 AA plus additional chapters for mobile, hardware, ICT procurement, authoring tools, and functional-performance statements. - **EAA / Directive (EU) 2019/882** — legal framework requiring EN 301 549 conformance for consumer-facing digital products and services in EU markets. Deadline: **28 June 2025**. Requires accessibility statements per member-state templates. ## Usage ``` /a11y-validate # Scan full project, auto-detect framework /a11y-validate src/ # Scan specific path /a11y-validate --scope keyboard # Only keyboard + focus checks /a11y-validate --scope media # Only captions/transcripts/autoplay /a11y-validate --scope docs # Only EAA accessibility-statement check /a11y-validate --scope mobile # Only React Native + Flutter patterns /a11y-validate --standard eaa # Activate EAA documentation category /a11y-validate --standard wcag-2.2-aa # Add WCAG 2.2 criteria /a11y-validate --severity high # Filter to HIGH findings /a11y-validate --framework react-native # Force framework /a11y-validate --output json # Structured JSON for CI integration ``` **Scopes:** - `full` (default) — all 8 categories - `keyboard` — Category 3 only - `contrast` — Category 4 only - `forms` — Category 5 only - `media` — Category 6 only - `aria` — Category 7 only - `motion` — Category 8 motion subsection - `mobile` — Category 8 mobile subsection (React Native / Flutter) - `docs` — Category 8 EAA documentation subsection (fast "are we legally exposed?" scan) **Standards:** - `wcag-2.1-aa` (default) — 50 Level A + AA success criteria. - `wcag-2.2-aa` — adds 2.4.11, 2.5.8, 3.2.6, 3.3.7, 3.3.8. - `en-301-549` — wcag-2.1-aa + mobile chapter + functional-performance statements. - `eaa` — en-301-549 + accessibility-statement documentation requirement (activates Category 8 docs). **Severity filtering:** `--severity high` shows only HIGH, `--severity warn` shows HIGH+WARN, `--severity info` shows all. Default: all. ## What This Command Does 1. **Detect framework** from `package.json`, `pubspec.yaml`, and entry HTML. 2. **Run the scanner script** for a deterministic baseline over 13 WCAG success criteria. 3. **Extend the scan by hand** using `Grep` / `Glob` / `Read` against framework-aware patterns for everything the script does not cover. 4. **Interpret findings** with specific fixes tied to the detected framework. 5. **Report** findings sorted by severity with WCAG / EN 301 549 citations. ## Steps ### Step 1: Detect Framework Run detection before scanning. Same logic as `/seo-validate` plus mobile entries: | Deps / files contain | Framework | Notes | |---|---|---| | `next` | `next` | App Router uses `metadata` export | | `nuxt` | `nuxt` | `useHead()` / `definePageMeta` | | `astro` | `astro` | islands model; `client:only` affects a11y | | `gatsby` | `gatsby` | Head API + react-helmet | | `@sveltejs/kit` | `sveltekit` | `<svelte:head>` | | `@remix-run/*` | `remix` | `MetaFunction` | | `@angular/core` | `angular` | CDK `a11y` module expected | | `vue` (no nuxt) | `vue` | a11y plugins optional | | `react` + `vite` (no next/remix) | `react-spa` | — | | `react-scripts` | `cra` | — | | `react-native` | `react-native` | mobile — AccessibilityInfo API | | `pubspec.yaml` with Flutter SDK | `flutter` | mobile — `Semantics()` widget | | no framework deps | `static` | raw HTML | Also detect a11y libraries: `@react-aria/*`, `@reach/*`, `@angular/cdk/a11y`, `vue-a11y`, `svelte-a11y`, `react-axe`, `axe-core`. Their presence is INFO. ### Step 2: Run the Scanner Script ```bash python3 ${CLAUDE_SKILL_DIR}/scripts/a11y-scanner.py [path] [--severity high|warn|info|all] [--output json|text] ``` Deterministic regex checks over 13 WCAG success criteria — images, headings, language, forms, keyboard, focus, colour contrast, media, ARIA and target size. No framework awareness and no heuristics: what it reports is real, what it misses is Step 3's job. Exit code is non-zero when HIGH findings exist. ### Step 3: Extend the Scan by Hand Read [reference/scanner-categories.md](reference/scanner-categories.md) in full, then work every category in `--scope` with `Grep` + `Read`, skipping only the success criteria Step 2 already reported. Patterns adapt to the detected framework. The coverage table under [Scanner Reference](#scanner-reference) says which criteria Step 2 handles per category. Everything else in the category is yours. ### Step 4: Interpret and Enrich For each finding: 1. **Read the flagged file/lines** to confirm the match. 2. **Add a framework-specific fix** (e.g., "use `@react-aria/button`" vs "add `aria-label`"). 3. **Mark confidence** — `definitive` for regex matches, `heuristic` for co-occurrence / absence / target-size estimation. 4. **Skip false positives** when context shows the concern is addressed (e.g., aria-label set via intl translation key). ### Step 5: Report Present findings sorted by severity (HIGH → WARN → INFO), then file path. State which findings came from the script and which from the manual pass — a reader needs to know how much of the result is deterministic. --- ## Scanner Reference `scripts/a11y-scanner.py` gives a deterministic baseline over 13 WCAG success criteria. Everything else in each category is a manual pass, and the full pattern tables for it live in [reference/scanner-categories.md](reference/scanner-categories.md). | # | Category | Covered by the script | Manual pass | |---|----------|----------------------|-------------| | 1 | Semantic Structure & Landmarks | 1.3.1, 3.1.1 | rest of the category | | 2 | Text Alternatives & Non-Text Content | 1.1.1 | rest of the category | | 3 | Keyboard & Focus | 2.1.1, 2.4.3, 2.4.7 | rest of the category | | 4 | Color, Contrast & Visual Cues | 1.4.3 | rest of the category | | 5 | Forms, Labels & Errors | 3.3.2 | rest of the category | | 6 | Media (Audio, Video, Embeds) | 1.2.1, 1.2.2, 1.4.2 | rest of the category | | 7 | ARIA, Live Regions & Dynamic Content | 4.1.2 | rest of the category | | 8 | Motion, Target Size, Mobile & EAA Docs | 2.5.8 | rest of the category | The script never covers a whole category. Treat its output as the floor, not the result: a run that reports only script findings has skipped most of WCAG 2.1 AA. ## Output Format ```markdown ## Accessibility Validation Report ### Summary | Metric | Value | |--------|-------| | Standard | wcag-2.1-aa / wcag-2.2-aa / en-301-549 / eaa | | Scope | full / keyboard / contrast / forms / media / aria / motion / mobile / docs | | Framework detected | next / nuxt / astro / ... / react-native / flutter / static | | Files scanned | N | | Public routes scanned | N | | Accessibility statement | found / not-found | | Findings: HIGH | N | | Findings: WARN | N | | Findings: INFO | N | ### Findings #### [HIGH] src/components/VideoPlayer.tsx:42 Category: Media Confidence: definitive Pattern: `<video>` without `<track kind="captions">` WCAG: 1.2.2 (Captions — Prerecorded, Level AA) EAA: Article 4 (product/service accessibility requirements) Fix: Add `<track kind="captions" src="/captions/en.vtt" srclang="en" label="English" default>`. If captions are unavailable, provide a transcript link. See: reference/wcag-2-1-aa.md#guideline-12-time-based-media #### [HIGH] public/index.html:8 Category: Viewport & Zoom Confidence: definitive Pattern: `<meta name="viewport" content="..., user-scalable=no">` WCAG: 1.4.4 (Resize Text, Level AA) Fix: Remove `user-scalable=no` and `maximum-scale=1` from the viewport meta — users must be able to zoom to 200%. See: reference/wcag-2-1-aa.md#144-resize-text #### [HIGH] src/routes.tsx:15 Category: EAA Accessibility Documentation Confidence: heuristic Pattern: No `/accessibility` / `/accessibility-statement` route detected; footer contains no a11y link Standard: EAA Article 14 (mandatory accessibility statement) Fix: Publish an accessibility statement conforming to your member-state template. Link it from the footer of every public page. See reference/eaa-compliance.md for template structure. ``` **Confidence values**: - `definitive` — regex match against a known-bad pattern. - `heuristic` — co-occurrence, absence, ordering, or derived inference (target size from CSS, contrast from hardcoded colors, ATF detection). **Exit codes** (when `--output json`): - `0` — no HIGH findings. - `1` — one or more HIGH findings. ## Out of Scope (Static Analysis Cannot Detect) The skill explicitly does NOT verify the following — pair with runtime tools: - **Actual contrast ratios** under runtime CSS cascade, theme switching, custom properties (use `axe-core`, Lighthouse, or manual tooling). - **Zoom / reflow behavior** at 200% / 400% (WCAG 1.4.10, 1.4.4) — requires rendering. - **Screen reader announcement order and quality** (NVDA, JAWS, VoiceOver, TalkBack). - **Cognitive accessibility** (WCAG 3.x is mostly process/content-driven, not pattern-matchable). - **Actual keyboard trap behavior** — requires interaction. - **Pronunciation / lang switches** at runtime. - **Real-time caption accuracy**. - **Usability / comprehension** — requires user studies. For these, use: `axe-core`, `pa11y`, Lighthouse accessibility audit, manual assistive-tech testing, and user research with disabled participants. ## Rules - **Read-only**: Never modify any files. - **Framework-aware**: Detect framework first; apply correct pattern set. - **Standards citation**: Every HIGH/WARN finding cites a WCAG success criterion (e.g., "1.3.1") or EN 301 549 clause. - **Skip non-source files**: Binary files, lock files, vendored directories (`node_modules/`, `vendor/`, `dist/`, `build/`, `.next/`, `.nuxt/`, `.svelte-kit/`, `ios/Pods/`, `android/build/`, `.dart_tool/`). - **No false confidence**: Label heuristic findings clearly. Color contrast and target size are ALWAYS heuristic in static analysis. - **EAA docs category is LEGAL risk**: Missing accessibility statement when `--standard eaa` is selected is HIGH — this is a regulatory finding, not a code-quality suggestion. - **No auto-fix**: A11y fixes often require design/content decisions that exceed pattern matching. - **Don't flag missing ARIA when native semantics suffice**: Prefer native HTML elements; flag redundant ARIA, not absence when the native element is already there. ## Gotchas - `scripts/a11y-scanner.py` exits **1 when it finds HIGH findings**, which is success for this skill, not failure. A wrapper that treats non-zero as an error will report a clean scan on the codebase with the most problems. - The script covers 13 success criteria; `reference/wcag-2-1-aa.md` documents ~50. Reporting only script output looks like a full WCAG 2.1 AA pass and is not one — Step 3 is where most of the standard actually gets checked. - Colour contrast is computed from **hardcoded hex values in source**. A theme built on CSS custom properties, `oklch()`, or a design-token pipeline yields no matches at all, and "no contrast findings" then means "nothing was measurable", not "contrast is fine". - `alt=""` is correct for decorative images and wrong for meaningful ones. The scanner cannot see which is which — it flags missing `alt`, not useless `alt`, so a codebase that blanket-added `alt=""` scans clean while being less accessible than one that omitted the attribute. - React Native and Flutter have no DOM. Categories written around HTML elements (landmarks, heading order, `lang`) do not transfer; use `reference/mobile-eaa.md` instead of reporting the whole category as passing. - `--standard eaa` findings are **legal** risk with a June 2025 deadline, not code-quality suggestions. Downgrading a missing accessibility statement to WARN because it "isn't a code problem" misreports regulatory exposure. ## When NOT to Use - To prove WCAG conformance for an audit or a VPAT — this is static analysis; conformance needs assistive-tech testing with disabled participants. - To check contrast in a themed or token-driven design system — run `axe-core` or Lighthouse against the rendered page instead. - For a runtime-only concern (focus traps, screen-reader announcement order, zoom reflow at 200%/400%) — see [Out of Scope](#out-of-scope-static-analysis-cannot-detect). - For the a11y subset that affects search ranking — use `/seo-validate`, category 9. - To fix what was found — this skill is read-only by contract; fixes usually need design and content decisions. ## Reference Documents - [reference/wcag-2-1-aa.md](reference/wcag-2-1-aa.md) — All 50 Level A + AA success criteria with detection status (statically detectable vs runtime-only). - [reference/wcag-2-2-aa.md](reference/wcag-2-2-aa.md) — 9 new WCAG 2.2 success criteria (2.4.11, 2.4.12, 2.4.13, 2.5.7, 2.5.8, 3.2.6, 3.3.7, 3.3.8, 3.3.9) with failure patterns, grep patterns, and framework notes. - [reference/eaa-compliance.md](reference/eaa-compliance.md) — EU Directive 2019/882 articles, EN 301 549 v3.2.1 mapping, 28 June 2025 timeline, member-state transposition deltas, accessibility-statement templates. - [reference/aria-patterns.md](reference/aria-patterns.md) — ARIA 1.2 Authoring Practices: landmarks, roles, states/properties, common anti-patterns, framework-specific helpers (`@react-aria`, `@angular/cdk/a11y`). - [reference/mobile-eaa.md](reference/mobile-eaa.md) — EN 301 549 mobile chapter + React Native `AccessibilityInfo` / Flutter `Semantics()` patterns. ## Related Skills
GitHub에서 보기
이 SKILL.md는 매우 커서 SkillsMP가 여기에는 첫 섹션만 미리 보여줍니다. GitHub에서 보기