accessibility-diff
Regression check that diffs a live page's accessibility violations against a baseline from uncommitted changes or a branch.
Install
npx skills add https://github.com/AccessLint/claude-marketplace --skill accessibility-diff- argument-hint
- [--branch [<name>]] [target|url]
- allowed-tools
- Bash, Read, Glob, Grep, Skill, Task
Default branch: !git symbolic-ref refs/remotes/origin/HEAD --short 2>/dev/null | sed 's|.*/||' || echo main
Report only what changed. Locate; don't fix.
Shared grounding and honesty conventions: ../shared/methodology.md.
Parse $ARGUMENTS: if --branch <name> is present, remove it and use branch mode (no value means the default branch above). The rest is the target: a URL, a config target name, or empty for the default target from accesslint.config.json. If it's empty and there's no config, ask for a URL.
1. Audit
Stash mode (default; uncommitted changes). Tell the user first: "Running in diff mode — stashing your changes to capture a baseline, then restoring. Your working tree will be fully restored." If git stash push fails, warn and exit.
Branch mode (--branch <name>). Tell the user first: "Diffing against <name> — checking out that branch to capture a baseline, then restoring. Your working tree will be fully restored." Branch switching triggers a rebuild but not a browser reload, so the CLI opens a fresh tab each run to read the current build. Use --wait-for "<selector>" to hold the audit until the rebuild is ready; without it, warn that a slow build may give a stale baseline.
Pass --selector and --include-aaa to both runs.
2. Report
For each new violation: where (selector verbatim, plus file:line (symbol) if source is present; don't fabricate), evidence, and fix (mechanical change or NEEDS HUMAN).
Don't edit. For fixes, apply the mechanical ones and re-run accesslint:accessibility-diff to verify; for bulk work hand off to accesslint:accessibility-fix.
3. Tear down
Notes
ensuredetermines the port; don't hardcode 9222.- CLI exit 2 means a bad URL or target, or the page never loaded; check the dev server.
- A target name resolves the same in both runs only if
accesslint.config.jsonis unchanged across the stash or checkout. If your changes touch the config, pass an explicit URL. - Stash mode:
sleep 2covers most HMR cases; if the baseline looks identical to current, add--wait-for "<selector>". - Branch mode: no HMR; the CLI opens a fresh tab each run, and
--wait-foris the rebuild gate. - Large DOM changes between runs cause selector drift; re-run
accesslint:accessibility-scanfor the full picture.