axl is a Rust workspace for accessibility linting of JSX/TSX code.
Current v0.2 focus:
- runnable CLI (
axl_cli) - parser/discovery pipeline (
axl_parser) - shared diagnostics/rule engine interfaces (
axl_core) - initial ARIA/name/focus rules (
axl_rules,axl_aria) - early contrast and pattern analysis scaffolding (
axl_contrast,axl_patterns)
axl_cli: command line entry point and output formattingaxl_parser: TSX/JSX target collection and OXC parse validationaxl_core: shared lint data model (Diagnostic,Rule,Severity, etc.)axl_aria: ARIA role and accessible-name helpersaxl_rules: active lint rules and rule registryaxl_config:axl.config.jsonloadingaxl_contrast: WCAG contrast math and color helpers (scaffold)axl_patterns: UI pattern detector API + dialog placeholder (scaffold)
Requirements:
- Rust toolchain (
cargo)
Run checks:
cargo testDetailed docs:
docs/testing.mddocs/publishing.md
Lint current directory:
cargo run -p axl_cli -- .JSON output:
cargo run -p axl_cli -- . --format jsonFilter categories:
cargo run -p axl_cli -- . --only roles,naming,focusUse explicit config path:
cargo run -p axl_cli -- src --config axl.config.jsonApply basic autofix (currently focus/tabindex-positive only):
cargo run -p axl_cli -- . --fixroles/abstract-role-usage(error)naming/empty-accessible-name(error)focus/tabindex-positive(warning)
axl loads axl.config.json by default (or the file from --config).
Supported top-level fields (minimal v0.1 support):
extends: string arraycomponents: object maprules: object mapignore: glob patterns to skip files
Example:
{
"extends": ["recommended"],
"components": {
"Link": "a"
},
"rules": {
"focus/tabindex-positive": "warn"
},
"ignore": ["**/*.test.tsx"]
}- no full AccName 1.2 implementation
- no context-dependent implicit role algorithm
- no CSS parsing/resolution
- no cross-file component tree analysis
- limited autofix scope (currently
focus/tabindex-positiveonly)