AccessPath CI replays critical browser flows and reports accessibility regressions with the evidence a reviewer needs: route, rule, affected target, screenshot, keyboard-path focus evidence, accessibility-tree snapshot, and Playwright trace.
npm install
npx playwright install chromium
npm run build
npm run demoIn another terminal:
node dist/cli.js run \
--flow accesspath.yml \
--baseline .accesspath/baseline.json \
--output accesspath-resultsOpen accesspath-results/report.html after the run. The CLI exits non-zero only for runner errors or new critical/serious axe findings. Existing baseline findings are retained as context but do not fail the check.
name: checkout
baseUrl: http://127.0.0.1:3000
steps:
- goto: /signup
- fill:
target: '#email'
value: qa@example.com
- tab: 2
- scan: signup-form
- click: '#continue'
- waitFor: '#checkout-heading'
- scan: checkout
assertions:
- url: /checkout
- visible: '#checkout-heading'Supported actions are goto, click, fill, press, tab, waitFor, screenshot, and scan. A scan captures axe-core results, a full-page screenshot, the current ARIA snapshot when supported by the installed Playwright version, and the keyboard evidence collected so far.
To intentionally accept the current state:
node dist/cli.js run --flow accesspath.yml \
--baseline .accesspath/baseline.json \
--update-baselineBaselines are route- and rule-specific. A newly affected DOM target under an existing rule is also treated as a new finding. Keep the baseline reviewable in git; generated screenshots, traces, and HTML/JSON reports belong in CI artifacts.
The repository includes a local action entrypoint in action.yml and a sample workflow in .github/workflows/accesspath.yml. Build dist/ before using the action from a tag or release. The action writes report_path, json_path, new_violations, blocking_violations, and status to GITHUB_OUTPUT, appends a Markdown summary, emits workflow error annotations for blocking findings, and upserts one marked PR comment when a token is available. The sample workflow uploads the full accesspath-results directory as an artifact.
The demo intentionally adds an unlabeled button to the sign-up flow when DEMO_REGRESSION=1:
DEMO_REGRESSION=1 npm run demoThat makes the same flow produce a new label violation, which is useful for smoke-testing the failure policy and showing the report in a portfolio demo.
The first vertical slice uses a portable JSON baseline so it works in local development and GitHub Actions without a database service. SQLite history, multi-flow orchestration, PR-comment upserts, and a standalone Next.js viewer are natural follow-ons once the flow contract and evidence model have settled.