{"id":51079057,"url":"https://github.com/maxgfr/ultra11y","last_synced_at":"2026-06-23T16:33:07.543Z","repository":{"id":365304883,"uuid":"1271514293","full_name":"maxgfr/ultra11y","owner":"maxgfr","description":"Audit HTML/CSS/JSX for RGAA 4.1.2 + WCAG 2.1/2.2 AA accessibility (dated report) or author/review accessible markup — a zero-dependency static engine + agent judgment, with anti-hallucination gates. A skills.sh agent skill.","archived":false,"fork":false,"pushed_at":"2026-06-16T20:12:38.000Z","size":613,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-16T20:23:43.184Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/maxgfr.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-16T18:33:07.000Z","updated_at":"2026-06-16T20:13:26.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/maxgfr/ultra11y","commit_stats":null,"previous_names":["maxgfr/ultra11y"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/maxgfr/ultra11y","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxgfr%2Fultra11y","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxgfr%2Fultra11y/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxgfr%2Fultra11y/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxgfr%2Fultra11y/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/maxgfr","download_url":"https://codeload.github.com/maxgfr/ultra11y/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/maxgfr%2Fultra11y/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34698696,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-23T02:00:07.161Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-23T16:33:07.027Z","updated_at":"2026-06-23T16:33:07.538Z","avatar_url":"https://github.com/maxgfr.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ultra11y\n\n\u003e Audit HTML/CSS/JSX for **RGAA 4.1.2** + WCAG 2.1/2.2 AA accessibility and produce a dated compliance report — or author/review accessible markup without regressions. A [skills.sh](https://skills.sh) agent skill: a deterministic, zero-dependency static engine **plus** the agent's judgment, with `check`/`verify` gates against hallucinated non-conformities.\n\nultra11y is built around an honest **division of labour**. Automated tools only catch a fraction of accessibility problems, so the engine does the *mechanical* work — the ~35 machine-detectable checks across the 13 RGAA themes — and is explicit about everything it cannot decide:\n\n- **Automatable (engine):** missing `alt`/`lang`/`title`, unlabeled fields, empty links/buttons, icon-only controls, iframes without title, tables without headers, heading-level skips, duplicate ids, invalid/broken ARIA, positive `tabindex`, autoplay media…\n- **Needs rendering (you):** computed contrast, visible focus, zoom/reflow, content on hover — flagged as **residual risks**, never silently \"conforming\".\n- **Human judgment (you):** alt-text relevance, link purpose in context, reading/tab order, caption accuracy…\n\n## Install\n\n```sh\nnpx skills add maxgfr/ultra11y\n```\n\nOr clone and run the bundled engine directly (Node ≥ 18, zero dependencies):\n\n```sh\nnode scripts/ultra11y.mjs --help\n```\n\n## Commands\n\n```\nultra11y audit    \u003cglobs… | -\u003e  [--out \u003cdir\u003e] [--include \u003cglob\u003e] [--exclude \u003cglob\u003e] [--ext \u003clist\u003e] [--jsx] [--json] [--lang fr|en]\nultra11y audit    [--changed | --since \u003cref\u003e] [--max-files \u003cn\u003e] [--dedup exact|normalized|off] [--baseline \u003cfile\u003e] [--fail-on bloquant|majeur|mineur]\nultra11y report   --in \u003caudit.json\u003e [--out \u003cdir\u003e] [--standard rgaa|wcag] [--lang fr|en]\nultra11y criteria [\u003cid\u003e] [--theme \u003cN\u003e] [--list] [--standard rgaa|wcag] [--json] [--lang fr|en]\nultra11y check    --report \u003cmd\u003e [--quiet] [--json]\nultra11y verify   --report \u003cmd\u003e [--semantic] [--apply \u003cverdicts.json\u003e] [--max-verify \u003cn\u003e] [--json]\nultra11y fix      \u003cglobs… | -\u003e  [--write] [--changed | --since \u003cref\u003e] [--only \u003cids\u003e] [--jsx] [--json]\nultra11y init     [--hook] [--ci] [--baseline] [--fail-on bloquant|majeur|mineur]\nultra11y scan     \u003curl|file\u003e [--merge \u003caudit.json\u003e] [--out \u003cdir\u003e] [--docker] [--json]\n```\n\n### Scale, fixes, and repo automation\n\n- **Scale** — the engine streams file-by-file (bounded memory), audits **only markup**,\n  and lets you focus: `--changed`/`--since` (git diff only), priority ordering\n  (layouts/templates/shared components first), content de-duplication, and an explicit\n  `--max-files` cap with logged truncation. See `references/scale.md`.\n- **Fixes** — `fix` puts the fixes in place (native-first, anti-hallucination): deterministic\n  auto-codemods, fill-in `TODO` placeholders for the agent to complete, and judgment-only\n  proposals. `--dry-run` is the default; `--write` applies but only after a re-audit proves\n  no new non-conformity, and never on lossy JSX/TSX. See `references/fix.md`.\n- **Automation** — `init` wires a zero-dependency git pre-commit hook and/or a GitHub Actions\n  job that run `audit --changed --baseline` so only **new** blocking non-conformities fail (not\n  the existing backlog). See `references/automation.md`.\n- **Worldwide** — RGAA stays the engine's key; `--standard wcag` re-keys `report`/`criteria` by\n  WCAG 2.1 AA success criterion (presentation-only), with an EN 301 549 / Section 508 equivalence\n  note. See `references/methodology.md`.\n\n### Optional dynamic tier (Docker + axe-core)\n\n`scan` runs **axe-core in a headless browser** (Playwright, in a self-contained Docker image built on first use) to decide the *needs-rendering* criteria the static engine leaves as residual risks — chiefly **computed colour contrast (3.2/3.3)** plus a 320px **reflow** check (10.11) and a render cross-check of the structural rules. `--merge` folds the findings into a static `AuditResult`, upgrading `manual` criteria to `C`/`NC`:\n\n```sh\nnode scripts/ultra11y.mjs audit \"src/**/*.html\" --out audits --json \u003e /dev/null\nnode scripts/ultra11y.mjs scan https://example.com --merge audits/audit-latest.json --out audits\nnode scripts/ultra11y.mjs report --in audits/audit-latest.json --out audits\n```\n\nRequires Docker (the rest of the skill is zero-dependency and Docker-free). The runner + Dockerfile are embedded in the engine and mirrored under `docker/` (with a `docker-compose.yml`). See `skills/ultra11y/references/dynamic.md`.\n\nTypical audit flow:\n\n```sh\nnode scripts/ultra11y.mjs audit \"src/**/*.html\" --json \u003e audit.json\nnode scripts/ultra11y.mjs report --in audit.json --out audits      # audits/rgaa-YYYY-MM-DD.md\nnode scripts/ultra11y.mjs check  --report audits/rgaa-YYYY-MM-DD.md # integrity gate\n```\n\nThe skill (`skills/ultra11y/SKILL.md` + `references/`) teaches the agent when and how to run these, how to complete the manual criteria, and the native-first authoring doctrine.\n\n## Development\n\n```sh\npnpm install\npnpm test            # vitest\npnpm run typecheck\npnpm run build       # tsup → scripts/ultra11y.mjs, mirrored into skills/ultra11y/scripts/\npnpm run check:build # asserts the committed bundle is reproducible\npnpm run fetch:rgaa  # re-fetch + transform the official RGAA dataset\n```\n\nReleases are cut automatically by semantic-release on push to `main` (GitHub release + tarball, no npm publish).\n\n## Data \u0026 licensing\n\n- ultra11y's code: **MIT** (see `LICENSE`).\n- The bundled RGAA dataset (`src/data/rgaa.json`, `glossary.json`) is derived from the official **RGAA 4.1.2** reference published by DINUM/DISIC, under the **Licence Ouverte / Etalab 2.0** — see `NOTICE`. Attribution: « RGAA 4.1.2 — DINUM ».\n- The report format is inspired by DINUM/etalab-ia audit conventions; the native-first authoring rules are adapted from the SocialGouv accessibility skill. No source code was copied.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxgfr%2Fultra11y","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxgfr%2Fultra11y","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxgfr%2Fultra11y/lists"}