{"_id":"@a11yeco/cli","_rev":"8-76c8fe0c9775f07b3ba598232061dc1b","name":"@a11yeco/cli","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"@a11yeco/cli","version":"0.1.0","_id":"@a11yeco/cli@0.1.0","maintainers":[{"name":"amber2209","email":"amberanand.work@gmail.com"}],"bin":{"a11yeco":"dist/cli.js"},"dist":{"shasum":"ecbbea0f6bc011a72093bf4fb4ce1df0ff6b0faf","tarball":"https://registry.npmjs.org/@a11yeco/cli/-/cli-0.1.0.tgz","fileCount":15,"integrity":"sha512-2AfPoaIEgFRh5cgD6Yod+7GOpy5+nF6U0gSJ7p1sTIoTCjD+atWo9v/OGzfXjbbwKrTfB9nQEH2leBoTgd5fuQ==","signatures":[{"sig":"MEUCIHfiiETdxnDwGghNhpAksNl/xY6HqYZ3mcrwE8pXZSPwAiEAnN1XJIFuPz4uyc8XM8TcSE9HFvBJ9YgIxdWrIlbZAwk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42699},"main":"./dist/cli.js","type":"module","types":"./dist/cli.d.ts","gitHead":"5fe6a1bb98cf0ee35549d8a74b33cf94c917e7a6","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"npm run build && node --test dist/__tests__/*.test.js","build":"tsc -p tsconfig.json","start":"node dist/cli.js"},"_npmUser":{"name":"amber2209","email":"amberanand.work@gmail.com"},"_npmVersion":"11.7.0","description":"A11yEco CLI — WCAG 2.2 accessibility scanner for URLs and local HTML files","directories":{},"_nodeVersion":"24.8.0","dependencies":{"axe-core":"^4.10.0","playwright":"^1.40.0","@a11yeco/core":"*"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.0_1779300818659_0.9414527692693009","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@a11yeco/cli","version":"0.1.1","_id":"@a11yeco/cli@0.1.1","maintainers":[{"name":"amber2209","email":"amberanand.work@gmail.com"}],"bin":{"a11yeco":"dist/cli.js"},"dist":{"shasum":"da35edca6eb10b1a5e4d35dca5ab48bd5e94b5d2","tarball":"https://registry.npmjs.org/@a11yeco/cli/-/cli-0.1.1.tgz","fileCount":15,"integrity":"sha512-UxaBa0t9QWTNInoAPLzVtE5GAElRjx2pk2yHZWJjVQk+yAy/CWyBv5KWynZg+Pqqx/mhLvaFcFa/YUvZR6Ql0A==","signatures":[{"sig":"MEUCIBgLXURT1YTcvK3mRW6N+Qpg1w8YongcC/u/wwPrTIVGAiEAyHH9B8r7c/zAw3dOc/3DSFxSlX0FI2MIpCqHdwKX2Xk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":42705},"main":"./dist/cli.js","type":"module","types":"./dist/cli.d.ts","gitHead":"2c38f88ccd8c3d77f9cb6f4a6f5d3fd003dfcf24","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"npm run build && node --test dist/__tests__/*.test.js","build":"tsc -p tsconfig.json","start":"node dist/cli.js"},"_npmUser":{"name":"amber2209","email":"amberanand.work@gmail.com"},"_npmVersion":"11.7.0","description":"A11yEco CLI — WCAG 2.2 accessibility scanner for URLs and local HTML files","directories":{},"_nodeVersion":"24.8.0","dependencies":{"axe-core":"^4.10.0","playwright":"^1.40.0","@a11yeco/core":"*"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.1_1779301077674_0.2896578737879132","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@a11yeco/cli","version":"0.1.2","_id":"@a11yeco/cli@0.1.2","maintainers":[{"name":"amber2209","email":"amberanand.work@gmail.com"}],"bin":{"a11yeco":"dist/cli.js"},"dist":{"shasum":"5dc5c9c5f1d86a6b41fbd14488bc95b6ebb779de","tarball":"https://registry.npmjs.org/@a11yeco/cli/-/cli-0.1.2.tgz","fileCount":15,"integrity":"sha512-i/1Xv1eQJxiK47OnKNnK3e8ouPTvvrq9OJZEp0/DmhndF2b8Tb3rNQNnDTftui1aQOYeGpJyroAikvGFisAH2A==","signatures":[{"sig":"MEQCIAjpOIqbzhrGYEKvN06hIqc7bpXSPAZ7VyXJVZ+stSV7AiBvDvpXYLzceBqrsgiLjwUIRosnPtZyZFveZF5aQxNP0Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44175},"main":"./dist/cli.js","type":"module","types":"./dist/cli.d.ts","gitHead":"83f0098a03484aace30a1970da647ec88542bb73","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"npm run build && node --test dist/__tests__/*.test.js","build":"tsc -p tsconfig.json","start":"node dist/cli.js"},"_npmUser":{"name":"amber2209","email":"amberanand.work@gmail.com"},"_npmVersion":"10.9.8","description":"A11yEco CLI — WCAG 2.2 accessibility scanner for URLs and local HTML files","directories":{},"_nodeVersion":"22.23.1","dependencies":{"axe-core":"^4.10.0","playwright":"^1.40.0","@a11yeco/core":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.2_1785210367164_0.0002849637263384608","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@a11yeco/cli","version":"0.1.3","_id":"@a11yeco/cli@0.1.3","maintainers":[{"name":"amber2209","email":"amberanand.work@gmail.com"}],"bin":{"a11yeco":"dist/cli.js"},"dist":{"shasum":"763838ce64e13eed2aa02b767bb6c28a58f9753c","tarball":"https://registry.npmjs.org/@a11yeco/cli/-/cli-0.1.3.tgz","fileCount":16,"integrity":"sha512-zHBadMB8L+gTEt4glhRjwBGHgiaKpbEM9nu1gpRPnnKntJmY63agzwm7uCkapP+JWxDp0gHOEWwSzkQbt5DgOA==","signatures":[{"sig":"MEQCIE/tby87dhRD2Z/xTH7digwIGmx6VJFZi0eGELloXioyAiBwzpQLQBEl+SLMVQ1hyVrKr8cCHCpv9YWsWA0w/Nm6eg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51761},"main":"./dist/cli.js","type":"module","types":"./dist/cli.d.ts","gitHead":"98b09c8d155e0b9ef6590a0b5c63ccd7e31d468d","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"npm run build && node --test dist/__tests__/*.test.js","build":"tsc -p tsconfig.json","start":"node dist/cli.js"},"_npmUser":{"name":"amber2209","email":"amberanand.work@gmail.com"},"_npmVersion":"11.7.0","description":"A11yEco CLI — WCAG 2.2 accessibility scanner for URLs and local HTML files","directories":{},"_nodeVersion":"24.8.0","dependencies":{"axe-core":"^4.10.0","playwright":"^1.40.0","@a11yeco/core":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.1.3_1785253873318_0.29340230541868406","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@a11yeco/cli","version":"0.2.0","_id":"@a11yeco/cli@0.2.0","maintainers":[{"name":"amber2209","email":"amberanand.work@gmail.com"}],"bin":{"a11yeco":"dist/cli.js"},"dist":{"shasum":"43b519588f8f163476b4a2a845403f93f5b53569","tarball":"https://registry.npmjs.org/@a11yeco/cli/-/cli-0.2.0.tgz","fileCount":24,"integrity":"sha512-sMD9bUGjP8OtsAHdxDX8/o4bWh70gl6Jo9wCo2FZ+m76vPXsO5MGIYf1CWV3ZapBZq+4vlMUr+jgF4B8ZA0SAg==","signatures":[{"sig":"MEUCIQDc1IXhlv9OfwhGFCuX+y7KH/0eye0UxvrHBd9j698newIgfdQ4pG5roYSsM5Z09a3qRHypta8BMWyLcktz1tn2cc4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78919},"main":"./dist/cli.js","type":"module","types":"./dist/cli.d.ts","gitHead":"06569fc16a86d9c084f59f958dec01fb90304b34","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"npm run build && node --test dist/__tests__/*.test.js","build":"tsc -p tsconfig.json","start":"node dist/cli.js"},"_npmUser":{"name":"amber2209","email":"amberanand.work@gmail.com"},"_npmVersion":"11.7.0","description":"A11yEco CLI — WCAG 2.2 accessibility scanner for URLs and local HTML files","directories":{},"_nodeVersion":"24.8.0","dependencies":{"axe-core":"^4.10.0","playwright":"^1.40.0","@a11yeco/core":"^0.2.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.2.0_1786733275743_0.5618517356012513","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@a11yeco/cli","version":"0.3.0","_id":"@a11yeco/cli@0.3.0","maintainers":[{"name":"amber2209","email":"amberanand.work@gmail.com"}],"bin":{"a11yeco":"dist/cli.js"},"dist":{"shasum":"087a00ac5c364a06e01ae8b271aed560bd4ffece","tarball":"https://registry.npmjs.org/@a11yeco/cli/-/cli-0.3.0.tgz","fileCount":28,"integrity":"sha512-cZOjDyVAFSFixY7ZvQR0ePFyvhCXcFYDeJQPrWNMuxMbB8Rr+TfbfUqi0I61/OJIZ/ikl9hTqhS1WheLRDEycA==","signatures":[{"sig":"MEYCIQD/qKfdGdCPEiJlpvUPyG1Hcxa+v2um2TU0cDeRAHMVUQIhAJPoobFyZVOffNxlzPoU6XF2hRX193Eqde3D4XYflgHa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84520},"main":"./dist/cli.js","type":"module","types":"./dist/cli.d.ts","gitHead":"041d58425ecc95197fdd0c669f5853d670371eac","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"npm run build && node --test dist/__tests__/*.test.js","build":"tsc -p tsconfig.json","start":"node dist/cli.js"},"_npmUser":{"name":"amber2209","email":"amberanand.work@gmail.com"},"_npmVersion":"11.7.0","description":"A11yEco CLI — WCAG 2.2 accessibility scanner for URLs and local HTML files","directories":{},"_nodeVersion":"24.8.0","dependencies":{"axe-core":"^4.10.0","playwright":"^1.40.0","@a11yeco/core":"^0.2.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.3.0_1786737626284_0.26018621182763835","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@a11yeco/cli","version":"0.4.0","_id":"@a11yeco/cli@0.4.0","maintainers":[{"name":"amber2209","email":"amberanand.work@gmail.com"}],"bin":{"a11yeco":"dist/cli.js"},"dist":{"shasum":"4e28f08b59b3786c8b885a74bd601ad2c0c0ad93","tarball":"https://registry.npmjs.org/@a11yeco/cli/-/cli-0.4.0.tgz","fileCount":28,"integrity":"sha512-8wqZg0bnOSdNCE/0L8BHxPGkmx7dnaHWWkyKEDnNaFySs4yoHVPrUF0UOmmQyoN356FoCmXOHoJ1Ham+IFyFTQ==","signatures":[{"sig":"MEUCICvrVTLMt4Txf0eCXK87IFq62obt9TuYrTd/fhs2xWzdAiEAsXIImFLjXqXaCs9GVfaLDz/vyXzFyg8c/ZOqd8D3fUw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85700},"main":"./dist/cli.js","type":"module","types":"./dist/cli.d.ts","gitHead":"c898ead4d70b201bafac1a8537225d81a500bbfa","scripts":{"dev":"tsc -p tsconfig.json --watch","test":"npm run build && node --test dist/__tests__/*.test.js","build":"tsc -p tsconfig.json","start":"node dist/cli.js"},"_npmUser":{"name":"amber2209","email":"amberanand.work@gmail.com"},"_npmVersion":"11.7.0","description":"A11yEco CLI — WCAG 2.2 accessibility scanner for URLs and local HTML files","directories":{},"_nodeVersion":"24.8.0","dependencies":{"axe-core":"^4.10.0","playwright":"^1.40.0","@a11yeco/core":"^0.3.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5","@types/node":"^20"},"_npmOperationalInternal":{"tmp":"tmp/cli_0.4.0_1786991069450_0.7495565391876244","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@a11yeco/cli","version":"0.5.0","description":"A11yEco CLI — WCAG 2.2 accessibility scanner for URLs and local HTML files","bin":{"a11yeco":"dist/cli.js"},"type":"module","main":"./dist/cli.js","types":"./dist/cli.d.ts","scripts":{"build":"tsc -p tsconfig.json","dev":"tsc -p tsconfig.json --watch","start":"node dist/cli.js","test":"npm run build && node --test dist/__tests__/*.test.js"},"dependencies":{"@a11yeco/core":"^0.4.0","axe-core":"^4.10.0","playwright":"^1.40.0"},"devDependencies":{"@types/node":"^20","typescript":"^5"},"gitHead":"ffaa2f0b6eaa746ef34d0c92f6675c2c950e915b","_id":"@a11yeco/cli@0.5.0","_nodeVersion":"24.8.0","_npmVersion":"11.7.0","dist":{"integrity":"sha512-1a6wlcKhLXulwoqLSQ+9rqHKZ/Dobs71td9yD9evXiSXYPL4g/zxfLdBTZGTlxIrOk02YCGwSzwGdSnVIgCxHQ==","shasum":"9000652cff21ea80eebb10c07693c0698719a726","tarball":"https://registry.npmjs.org/@a11yeco/cli/-/cli-0.5.0.tgz","fileCount":28,"unpackedSize":88189,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAsAyLz2t4/+tUREezJhtjWWGT39hJ2tXyy5YYir5o51AiB4s3Rlt+zKGTiOMrK0hJqtt8yOVniHw7vc4wCt3R1W2g=="}]},"_npmUser":{"name":"amber2209","email":"amberanand.work@gmail.com"},"directories":{},"maintainers":[{"name":"amber2209","email":"amberanand.work@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cli_0.5.0_1787168204935_0.0667111879436475"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-20T18:13:38.542Z","modified":"2026-08-19T19:36:45.291Z","0.1.0":"2026-05-20T18:13:38.811Z","0.1.1":"2026-05-20T18:17:57.818Z","0.1.2":"2026-07-28T03:46:07.296Z","0.1.3":"2026-07-28T15:51:13.448Z","0.2.0":"2026-08-14T18:47:55.887Z","0.3.0":"2026-08-14T20:00:26.484Z","0.4.0":"2026-08-17T18:24:29.588Z","0.5.0":"2026-08-19T19:36:45.106Z"},"description":"A11yEco CLI — WCAG 2.2 accessibility scanner for URLs and local HTML files","maintainers":[{"name":"amber2209","email":"amberanand.work@gmail.com"}],"readme":"# @a11yeco/cli\n\n**WCAG 2.2 accessibility scanner for your terminal.** Scan any URL or HTML file for\naccessibility violations, crawl entire sites, and output JSON, Markdown, or SARIF\nfor CI/CD pipelines.\n\n```\nnpm install -g @a11yeco/cli\n```\n\nPowered by [Playwright](https://playwright.dev) (headless Chromium) and\n[axe-core](https://www.deque.com/axe/). The browser installs automatically on\nfirst run — no manual setup needed.\n\n📖 **Full documentation:** [a11yeco.com/products/cli](https://a11yeco.com/products/cli)\n\n---\n\n## Quick start\n\n```bash\n# Scan a single page\na11yeco https://mysite.com\n\n# Scan with JSON output\na11yeco https://mysite.com --format json\n\n# Crawl an entire site via link discovery\na11yeco https://mysite.com --crawl links --max-pages 20\n\n# Output SARIF for GitHub Code Scanning\na11yeco https://mysite.com --format sarif --output results.sarif\n\n# Output a shareable HTML audit report\na11yeco https://mysite.com --format html --output report.html\n\n# Fail the build on serious or critical violations\na11yeco https://mysite.com --fail-on serious\n\n# Seed a baseline, then fail only on NEW violations (regression gating)\na11yeco https://mysite.com --crawl links --save-baseline .a11yeco/baseline.json\na11yeco https://mysite.com --crawl links --baseline .a11yeco/baseline.json --fail-on-new\n```\n\n---\n\n## Installation\n\n### Global install (recommended)\n\n```bash\nnpm install -g @a11yeco/cli\n```\n\nThe `a11yeco` command is then available everywhere. On first run it downloads\nChromium automatically if missing.\n\n### Run without installing\n\n```bash\nnpx @a11yeco/cli https://mysite.com\n```\n\n---\n\n## Usage\n\n```\na11yeco <url> [url...] [options]\n```\n\n### Options\n\n| Flag                    | Values                    | Default     | Description                                       |\n|-------------------------|---------------------------|-------------|---------------------------------------------------|\n| `--format, -f`          | `json`, `markdown`, `sarif`, `html` | `markdown`  | Output format                             |\n| `--level, -l`           | `A`, `AA`, `AAA`          | `A,AA`      | WCAG levels to check                             |\n| `--best-practices`      | —                         | `true`      | Include best-practice rules                       |\n| `--experimental`        | —                         | `false`     | Include experimental rules                        |\n| `--fail-on`             | `critical`, `serious`, `moderate`, `minor` | — | Exit 1 if violations at this severity or above |\n| `--baseline`            | `<path>`               | —           | Compare this scan against a baseline JSON file and report what changed |\n| `--save-baseline`       | `<path>`               | —           | Write the current scan as a new baseline. Refuses to write when any gate fails or a scan errors |\n| `--fail-on-new`         | `critical`, `serious`, `moderate`, `minor` (optional) | any | Exit 1 on violations not in the baseline — new violations, severity increases, and new pages. Requires `--baseline` |\n| `--output, -o`          | `<path>`                  | stdout      | Write report to a file                            |\n| `--quiet, -q`           | —                         | `false`     | Suppress progress output (stderr)                 |\n| `--verbose, -v`         | —                         | `false`     | Show per-page violation details in multi-page reports. Auto-enabled when writing to a file with `--output` |\n| `--crawl`               | `links`, `sitemap`        | —           | Enable multi-page crawling                        |\n| `--sitemap`             | `<url>`                   | —           | Sitemap URL (required with `--crawl sitemap`)     |\n| `--max-pages`           | `<number>`                | `50`        | Max pages to scan when crawling                   |\n| `--concurrency`         | `<number>`                | `1`         | Max pages scanned in parallel (max 32). One browser with concurrent pages — much faster for large sites |\n| `--selector`            | `<css>`                   | —           | Scan only the matching subtree of each URL — component-level scans for component libraries and focused regression gates |\n| `--bypass-csp`          | —                         | `false`     | Bypass Content Security Policy (needed when CSP blocks axe-core injection) |\n| `--help, -h`            | —                         | —           | Show help                                         |\n\n### Examples\n\n**Single URL scan**\n\n```bash\na11yeco https://mysite.com\n```\n\n**Multiple URLs**\n\n```bash\na11yeco https://mysite.com https://mysite.com/about https://mysite.com/contact\n```\n\n**Crawl — link discovery**\n\nStarts from the homepage and follows every internal link using breadth-first search,\nstaying within the same domain:\n\n```bash\na11yeco https://mysite.com --crawl links\na11yeco https://mysite.com --crawl links --max-pages 20\n\n# Large sites: scan pages in parallel (one browser, concurrent pages)\na11yeco https://mysite.com --crawl links --max-pages 1000 --concurrency 12\n```\n\n**Scan a single component**\n\nComponent-level scans for component libraries (React, Vue, Angular) and focused\nregression gates — only the subtree matching the selector is evaluated:\n\n```bash\n# Only the checkout form's violations\na11yeco https://mysite.com/checkout --selector \".checkout-form\"\n\n# Component-scoped regression gate\na11yeco https://mysite.com --baseline .a11yeco/baseline.json --fail-on-new --selector \".checkout-form\"\n```\n\n**Crawl — sitemap**\n\nParses a `sitemap.xml` (including sitemap index files) for an authoritative list\nof pages:\n\n```bash\na11yeco https://mysite.com --crawl sitemap --sitemap https://mysite.com/sitemap.xml\n```\n\n**Save report to file**\n\n```bash\na11yeco https://mysite.com --output report.md\na11yeco https://mysite.com --format json --output report.json\na11yeco https://mysite.com --format sarif --output results.sarif\n```\n\n---\n\n## Baseline regression gating\n\nA plain `--fail-on` gate punishes your whole backlog: if the site already has 40\nknown violations, the build fails on all of them, every time. Baseline gating\nflips the question — **did anything get worse?**\n\nA baseline file records the current state of your site (per page, per element)\nas the \"known accepted\" set of violations. Later scans compare against it and\nfail on anything not in it:\n\n1. **New violations** on known pages (matched per-element by stable fingerprints)\n2. **Severity increases** (e.g. moderate → serious)\n3. **Violations on newly discovered pages**\n\nCommit the baseline file to your repo like a lockfile — it's small, and diffs\ncleanly in code review.\n\n```bash\n# 1. Seed the baseline from a state you're happy with\na11yeco https://mysite.com --crawl links --save-baseline .a11yeco/baseline.json\n\n# 2. Gate CI: fail on any new violation (or loosen with --fail-on-new serious)\na11yeco https://mysite.com --crawl links --baseline .a11yeco/baseline.json --fail-on-new\n```\n\n### Nightly monitor (gate + auto-refresh)\n\n```bash\na11yeco https://mysite.com --crawl links \\\n  --baseline .a11yeco/baseline.json \\\n  --fail-on-new \\\n  --save-baseline .a11yeco/baseline.json\n```\n\n`--save-baseline` **refuses to write when any gate fails** — a regressing state\ncan never be blessed into the baseline. On a clean run, newly discovered pages\nare added to the baseline automatically, and pages that disappear from the crawl\nare dropped (both reported on stderr). The baseline converges to \"the set of\npages that pass the gate\".\n\n`--fail-on` still works as the absolute quality bar and can be combined — the\nbuild fails if either gate fires. Scan profile and axe engine version are stored\nin the baseline; drift produces a warning suggesting a deliberate re-baseline.\n\n📖 **Full guide:** [Baseline Regression Gating](https://a11yeco.com/learn/cli-baseline-regression-gating)\n\n---\n\n## Output formats\n\n### Markdown (default)\n\nHuman-readable report with a summary table, per-page scores, and violation details\nwith HTML snippets and WCAG references.\n\n```\n# A11yEco Accessibility Report\n\n## Summary\n| URL | Score | Violations | Passes | Incomplete |\n|-----|------:|----------:|-------:|----------:|\n| https://mysite.com | ✅ 96 | 1 | 14 | 0 |\n\n## Violations\n#### 🟠 color-contrast (serious)\n**Elements must meet minimum color contrast ratio thresholds**\nWCAG: 1.4.3\nNodes affected: **3**\n...\n```\n\n### JSON\n\nStructured array — one object per scanned URL. Use it for post-processing,\nfeeding dashboards, or custom reports.\n\n### HTML\n\nSelf-contained audit report — open it, email it, or attach it to an issue.\nIncludes the accessibility score, a POUR health breakdown (Perceivable /\nOperable / Understandable / Robust), priority-ordered violations with WCAG\nreferences and code locations, and a baseline diff section when\n`--baseline` is supplied:\n\n```bash\na11yeco https://mysite.com --format html --output report.html\n```\n\n### SARIF 2.1.0\n\nStatic Analysis Results Interchange Format, natively supported by\n[GitHub Code Scanning](https://docs.github.com/en/code-security/code-scanning),\n[Azure DevOps](https://learn.microsoft.com/en-us/azure/devops/), and most CI platforms.\n\n---\n\n## CI/CD integration\n\n### GitHub Actions\n\nDrop this workflow into `.github/workflows/a11y.yml`:\n\n```yaml\nname: Accessibility scan\non:\n  pull_request:\n  push:\n    branches: [main]\n\njobs:\n  a11y:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 20\n\n      - name: Install A11yEco CLI\n        run: npm install -g @a11yeco/cli\n\n      - name: Scan site\n        run: |\n          a11yeco https://yoursite.com \\\n            --crawl links \\\n            --format sarif \\\n            --output results.sarif \\\n            --fail-on serious\n\n      - name: Upload SARIF to GitHub Code Scanning\n        uses: github/codeql-action/upload-sarif@v3\n        if: always()\n        with:\n          sarif_file: results.sarif\n```\n\nThe `--fail-on serious` flag causes the job to exit with code 1 if any serious or\ncritical violation is found, blocking the merge. SARIF output is uploaded regardless\n(`if: always()`) so you can inspect results even on failure.\n\n### Fail only on new violations (baseline gating)\n\nTo gate on *regressions* instead of the whole backlog, commit a baseline and use\n`--fail-on-new`. Check out the repo first so the committed baseline is available:\n\n```yaml\nname: Accessibility scan (baseline gated)\non:\n  pull_request:\n\njobs:\n  a11y:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 20\n\n      - name: Install A11yEco CLI\n        run: npm install -g @a11yeco/cli\n\n      - name: Scan site and fail on new violations\n        run: |\n          a11yeco https://yoursite.com \\\n            --crawl links \\\n            --baseline .a11yeco/baseline.json \\\n            --fail-on-new \\\n            --fail-on serious \\\n            --format sarif \\\n            --output results.sarif\n\n      - name: Upload SARIF to GitHub Code Scanning\n        uses: github/codeql-action/upload-sarif@v3\n        if: always()\n        with:\n          sarif_file: results.sarif\n```\n\n### Other CI platforms\n\nAny CI system that can run Node.js can use `@a11yeco/cli`:\n\n```bash\nnpm install -g @a11yeco/cli\na11yeco https://mysite.com --format sarif --output results.sarif --fail-on critical\n```\n\nSARIF output integrates with Azure DevOps, GitLab, Jenkins, and other tools\nthat support the SARIF format.\n\n---\n\n## Bypassing Content Security Policy\n\nIf a site's CSP blocks axe-core from loading, use `--bypass-csp`:\n\n```bash\na11yeco https://mysite.com --bypass-csp\n```\n\nThis tells Playwright to ignore CSP when injecting the axe-core script. It\ndoesn't alter any server-side headers.\n\n---\n\n## WCAG levels\n\nControl which levels to check with `--level`:\n\n```bash\n# WCAG 2.2 Level A only\na11yeco https://mysite.com --level A\n\n# Full coverage: A, AA, and AAA\na11yeco https://mysite.com --level A,AA,AAA\n```\n\nDefaults to `A,AA`, which covers legal compliance requirements for most regions.\n\n---\n\n## How it works\n\n1. A headless Chromium browser (managed by Playwright) opens each URL.\n2. [axe-core](https://www.deque.com/axe/) is injected and executed against the\n   rendered page.\n3. Results are mapped through [`@a11yeco/core`](https://www.npmjs.com/package/@a11yeco/core) —\n   the same engine that powers the Chrome extension and VS Code extension.\n4. Scores, fingerprints, and WCAG references are consistent across every tool\n   in the A11yEco ecosystem.\n\n---\n\n## Development\n\n```bash\n# Build from source\nnpm run build\n\n# Run tests\nnpm test\n\n# Watch mode\nnpm run dev\n\n# Run locally during development\nnode dist/cli.js https://mysite.com\n```\n","readmeFilename":"README.md"}