aiox-core 5.0.3 → 5.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.aiox-core/core/execution/predictive-pipeline.js +1283 -0
- package/.aiox-core/core/memory/decision-memory.js +564 -0
- package/.aiox-core/data/entity-registry.yaml +1068 -1028
- package/.aiox-core/data/registry-update-log.jsonl +2 -2
- package/.aiox-core/development/templates/service-template/README.md.hbs +158 -158
- package/.aiox-core/development/templates/service-template/__tests__/index.test.ts.hbs +237 -237
- package/.aiox-core/development/templates/service-template/client.ts.hbs +403 -403
- package/.aiox-core/development/templates/service-template/errors.ts.hbs +182 -182
- package/.aiox-core/development/templates/service-template/index.ts.hbs +120 -120
- package/.aiox-core/development/templates/service-template/package.json.hbs +87 -87
- package/.aiox-core/development/templates/service-template/types.ts.hbs +145 -145
- package/.aiox-core/development/templates/squad-template/LICENSE +21 -21
- package/.aiox-core/infrastructure/templates/aiox-sync.yaml.template +182 -182
- package/.aiox-core/infrastructure/templates/coderabbit.yaml.template +279 -279
- package/.aiox-core/infrastructure/templates/github-workflows/ci.yml.template +169 -169
- package/.aiox-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -330
- package/.aiox-core/infrastructure/templates/github-workflows/release.yml.template +196 -196
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-aiox-base.tmpl +63 -63
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -18
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -85
- package/.aiox-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -145
- package/.aiox-core/install-manifest.yaml +63 -55
- package/.aiox-core/local-config.yaml.template +71 -71
- package/.aiox-core/monitor/hooks/lib/__init__.py +1 -1
- package/.aiox-core/monitor/hooks/lib/enrich.py +58 -58
- package/.aiox-core/monitor/hooks/lib/send_event.py +47 -47
- package/.aiox-core/monitor/hooks/notification.py +29 -29
- package/.aiox-core/monitor/hooks/post_tool_use.py +45 -45
- package/.aiox-core/monitor/hooks/pre_compact.py +29 -29
- package/.aiox-core/monitor/hooks/pre_tool_use.py +40 -40
- package/.aiox-core/monitor/hooks/stop.py +29 -29
- package/.aiox-core/monitor/hooks/subagent_stop.py +29 -29
- package/.aiox-core/monitor/hooks/user_prompt_submit.py +38 -38
- package/.aiox-core/product/templates/adr.hbs +125 -125
- package/.aiox-core/product/templates/dbdr.hbs +241 -241
- package/.aiox-core/product/templates/epic.hbs +212 -212
- package/.aiox-core/product/templates/pmdr.hbs +186 -186
- package/.aiox-core/product/templates/prd-v2.0.hbs +216 -216
- package/.aiox-core/product/templates/prd.hbs +201 -201
- package/.aiox-core/product/templates/story.hbs +263 -263
- package/.aiox-core/product/templates/task.hbs +170 -170
- package/.aiox-core/product/templates/tmpl-comment-on-examples.sql +158 -158
- package/.aiox-core/product/templates/tmpl-migration-script.sql +91 -91
- package/.aiox-core/product/templates/tmpl-rls-granular-policies.sql +104 -104
- package/.aiox-core/product/templates/tmpl-rls-kiss-policy.sql +10 -10
- package/.aiox-core/product/templates/tmpl-rls-roles.sql +135 -135
- package/.aiox-core/product/templates/tmpl-rls-simple.sql +77 -77
- package/.aiox-core/product/templates/tmpl-rls-tenant.sql +152 -152
- package/.aiox-core/product/templates/tmpl-rollback-script.sql +77 -77
- package/.aiox-core/product/templates/tmpl-seed-data.sql +140 -140
- package/.aiox-core/product/templates/tmpl-smoke-test.sql +16 -16
- package/.aiox-core/product/templates/tmpl-staging-copy-merge.sql +139 -139
- package/.aiox-core/product/templates/tmpl-stored-proc.sql +140 -140
- package/.aiox-core/product/templates/tmpl-trigger.sql +152 -152
- package/.aiox-core/product/templates/tmpl-view-materialized.sql +133 -133
- package/.aiox-core/product/templates/tmpl-view.sql +177 -177
- package/.aiox-core/scripts/pm.sh +0 -0
- package/.claude/hooks/enforce-architecture-first.py +196 -196
- package/.claude/hooks/mind-clone-governance.py +192 -192
- package/.claude/hooks/read-protection.py +151 -151
- package/.claude/hooks/slug-validation.py +176 -176
- package/.claude/hooks/sql-governance.py +182 -182
- package/.claude/hooks/write-path-validation.py +194 -194
- package/LICENSE +33 -33
- package/bin/aiox-graph.js +0 -0
- package/bin/aiox-minimal.js +0 -0
- package/bin/aiox.js +0 -0
- package/package.json +1 -1
- package/packages/aiox-install/bin/aiox-install.js +0 -0
- package/packages/aiox-install/bin/edmcp.js +0 -0
- package/packages/aiox-pro-cli/bin/aiox-pro.js +0 -0
- package/packages/installer/src/wizard/pro-setup.js +28 -0
- package/pro/README.md +66 -66
- package/pro/feature-registry.yaml +225 -223
- package/pro/license/license-api.js +701 -679
- package/pro/package.json +39 -39
- package/pro/pro-config.yaml +63 -63
- package/pro/squads/README.md +24 -24
- package/pro/squads/design/HEADLINE.md +3 -3
- package/pro/squads/design/README.md +109 -109
- package/pro/squads/design/agents/brad-frost.md +1097 -1097
- package/pro/squads/design/agents/dan-mall.md +857 -857
- package/pro/squads/design/agents/dave-malouf.md +2272 -2272
- package/pro/squads/design/agents/design-chief.md +114 -114
- package/pro/squads/design/agents/ds-foundations-lead.md +194 -194
- package/pro/squads/design/agents/ds-token-architect.md +361 -361
- package/pro/squads/design/agents/nano-banana-generator.md +162 -162
- package/pro/squads/design/agents/storybook-expert.md +809 -809
- package/pro/squads/design/checklists/atomic-refactor-checklist.md +299 -299
- package/pro/squads/design/checklists/component-adaptation-checklist.md +81 -81
- package/pro/squads/design/checklists/design-fidelity-checklist.md +283 -283
- package/pro/squads/design/checklists/design-handoff-checklist.md +55 -55
- package/pro/squads/design/checklists/design-team-health-checklist.md +454 -454
- package/pro/squads/design/checklists/designops-maturity-checklist.md +518 -518
- package/pro/squads/design/checklists/ds-a11y-release-gate-checklist.md +45 -45
- package/pro/squads/design/checklists/ds-accessibility-wcag-checklist.md +147 -147
- package/pro/squads/design/checklists/ds-component-quality-checklist.md +150 -150
- package/pro/squads/design/checklists/ds-critical-eye-review-checklist.md +147 -147
- package/pro/squads/design/checklists/ds-migration-readiness-checklist.md +99 -99
- package/pro/squads/design/checklists/ds-pattern-audit-checklist.md +164 -164
- package/pro/squads/design/checklists/reading-accessibility-checklist.md +275 -275
- package/pro/squads/design/checklists/token-mapping-checklist.md +107 -107
- package/pro/squads/design/config/coding-standards.md +286 -286
- package/pro/squads/design/config/source-tree.md +59 -59
- package/pro/squads/design/config/tech-stack.md +48 -48
- package/pro/squads/design/config.yaml +204 -204
- package/pro/squads/design/data/agentic-design-systems-guide.md +46 -46
- package/pro/squads/design/data/agentic-ds-principles.md +100 -100
- package/pro/squads/design/data/atomic-design-principles.md +108 -108
- package/pro/squads/design/data/atomic-refactor-rules.md +582 -582
- package/pro/squads/design/data/base-component-specs.md +972 -972
- package/pro/squads/design/data/brad-frost-analysis-extract-implicit.yaml +270 -270
- package/pro/squads/design/data/brad-frost-analysis-find-0.8.yaml +176 -176
- package/pro/squads/design/data/brad-frost-analysis-qa-report.yaml +168 -168
- package/pro/squads/design/data/brad-frost-dna.yaml +713 -713
- package/pro/squads/design/data/capability-tools.yaml +124 -124
- package/pro/squads/design/data/component-adaptation-changelog.md +318 -318
- package/pro/squads/design/data/consolidation-algorithms.md +168 -168
- package/pro/squads/design/data/critical-eye-scoring-rules.yaml +240 -240
- package/pro/squads/design/data/design-token-best-practices.md +107 -107
- package/pro/squads/design/data/design-tokens-spec.yaml +418 -418
- package/pro/squads/design/data/ds-reference-architectures.md +93 -93
- package/pro/squads/design/data/f2-qa-report.md +168 -168
- package/pro/squads/design/data/f3-derived-components-changelog.md +100 -100
- package/pro/squads/design/data/f3-qa-report.md +208 -208
- package/pro/squads/design/data/figma-base-components-raw.md +101 -101
- package/pro/squads/design/data/figma-tokens-raw.md +1548 -1548
- package/pro/squads/design/data/fluent2-design-principles.md +114 -114
- package/pro/squads/design/data/high-retention-reading-guide.md +349 -349
- package/pro/squads/design/data/integration-patterns.md +207 -207
- package/pro/squads/design/data/internal-quality-chain.yaml +48 -48
- package/pro/squads/design/data/motion-tokens-guide.md +202 -202
- package/pro/squads/design/data/roi-calculation-guide.md +142 -142
- package/pro/squads/design/data/token-mapping-reference.md +213 -213
- package/pro/squads/design/data/w3c-dtcg-spec-reference.md +149 -149
- package/pro/squads/design/data/wcag-compliance-guide.md +267 -267
- package/pro/squads/design/docs/AUDIT_REPORT.md +97 -97
- package/pro/squads/design/docs/DS-CURATION-PIPELINE-PROPOSAL.md +577 -577
- package/pro/squads/design/docs/UPGRADE_PLAN.md +618 -618
- package/pro/squads/design/docs/brad-frost-research-validation.md +372 -372
- package/pro/squads/design/docs/dave-malouf-research-validation.md +391 -391
- package/pro/squads/design/docs/tool-discovery-report.md +87 -87
- package/pro/squads/design/docs/tool-integration-plan.md +44 -44
- package/pro/squads/design/protocols/ai-first-governance.md +56 -56
- package/pro/squads/design/protocols/governance-execution-boundary.md +59 -59
- package/pro/squads/design/protocols/handoff.md +60 -60
- package/pro/squads/design/rules/.claude-rules.md +88 -88
- package/pro/squads/design/scripts/design-system/curate_colors.cjs +447 -447
- package/pro/squads/design/scripts/design-system/curate_components.cjs +217 -217
- package/pro/squads/design/scripts/design-system/curate_radius.cjs +190 -190
- package/pro/squads/design/scripts/design-system/curate_shadows.cjs +208 -208
- package/pro/squads/design/scripts/design-system/curate_spacing.cjs +243 -243
- package/pro/squads/design/scripts/design-system/curate_typography.cjs +404 -404
- package/pro/squads/design/scripts/design-system/design-system-metadata.test.js +49 -49
- package/pro/squads/design/scripts/design-system/design_manifest_lib.cjs +142 -142
- package/pro/squads/design/scripts/design-system/fetch_page_images.cjs +195 -195
- package/pro/squads/design/scripts/design-system/generate_components_metadata.cjs +114 -114
- package/pro/squads/design/scripts/design-system/generate_curation_report.cjs +258 -258
- package/pro/squads/design/scripts/design-system/generate_tokens.cjs +342 -342
- package/pro/squads/design/scripts/design-system/sync_design_manifest.cjs +27 -27
- package/pro/squads/design/scripts/design-system/test_mcp_tools.cjs +232 -232
- package/pro/squads/design/scripts/design-system/validate_components_metadata.cjs +96 -96
- package/pro/squads/design/scripts/design-system/validate_curation.cjs +226 -226
- package/pro/squads/design/scripts/design-system/validate_design_manifest_drift.cjs +72 -72
- package/pro/squads/design/scripts/design-system/validate_mcp_skeleton.cjs +38 -38
- package/pro/squads/design/scripts/design-system/validate_registry.cjs +186 -186
- package/pro/squads/design/scripts/design-system/validate_task_checklist_bindings.cjs +78 -78
- package/pro/squads/design/scripts/dissect-artifact.cjs +806 -806
- package/pro/squads/design/scripts/validate-a11y-integration.cjs +40 -40
- package/pro/squads/design/scripts/validate-design-squad.py +411 -411
- package/pro/squads/design/squad.yaml +714 -714
- package/pro/squads/design/tasks/a11y-audit.md +340 -340
- package/pro/squads/design/tasks/aria-audit.md +525 -525
- package/pro/squads/design/tasks/atomic-refactor-execute.md +391 -391
- package/pro/squads/design/tasks/atomic-refactor-plan.md +262 -262
- package/pro/squads/design/tasks/audit-reading-experience.md +350 -350
- package/pro/squads/design/tasks/audit-tailwind-config.md +101 -101
- package/pro/squads/design/tasks/bootstrap-shadcn-library.md +96 -96
- package/pro/squads/design/tasks/bundle-audit.md +245 -245
- package/pro/squads/design/tasks/contrast-matrix.md +373 -373
- package/pro/squads/design/tasks/create-doc.md +135 -135
- package/pro/squads/design/tasks/dead-code-detection.md +329 -329
- package/pro/squads/design/tasks/design-compare.md +414 -414
- package/pro/squads/design/tasks/design-process-optimization.md +407 -407
- package/pro/squads/design/tasks/design-review-orchestration.md +99 -99
- package/pro/squads/design/tasks/design-team-scaling.md +407 -407
- package/pro/squads/design/tasks/design-tooling-audit.md +404 -404
- package/pro/squads/design/tasks/design-triage.md +89 -89
- package/pro/squads/design/tasks/designops-maturity-assessment.md +364 -364
- package/pro/squads/design/tasks/designops-metrics-setup.md +465 -465
- package/pro/squads/design/tasks/ds-agentic-audit.md +100 -100
- package/pro/squads/design/tasks/ds-agentic-setup.md +103 -103
- package/pro/squads/design/tasks/ds-audit-codebase.md +273 -273
- package/pro/squads/design/tasks/ds-build-component.md +349 -349
- package/pro/squads/design/tasks/ds-build-mcp-server.md +84 -84
- package/pro/squads/design/tasks/ds-calculate-roi.md +282 -282
- package/pro/squads/design/tasks/ds-compose-molecule.md +106 -106
- package/pro/squads/design/tasks/ds-consolidate-patterns.md +253 -253
- package/pro/squads/design/tasks/ds-context-contract.md +194 -194
- package/pro/squads/design/tasks/ds-critical-eye-compare.md +130 -130
- package/pro/squads/design/tasks/ds-critical-eye-decide.md +139 -139
- package/pro/squads/design/tasks/ds-critical-eye-inventory.md +111 -111
- package/pro/squads/design/tasks/ds-critical-eye-report.md +101 -101
- package/pro/squads/design/tasks/ds-critical-eye-score.md +109 -109
- package/pro/squads/design/tasks/ds-designops.md +99 -99
- package/pro/squads/design/tasks/ds-extend-pattern.md +91 -91
- package/pro/squads/design/tasks/ds-extract-tokens.md +312 -312
- package/pro/squads/design/tasks/ds-figma-pipeline.md +95 -95
- package/pro/squads/design/tasks/ds-fluent-audit.md +105 -105
- package/pro/squads/design/tasks/ds-fluent-build.md +110 -110
- package/pro/squads/design/tasks/ds-generate-ai-metadata.md +81 -81
- package/pro/squads/design/tasks/ds-generate-cursor-rules.md +74 -74
- package/pro/squads/design/tasks/ds-generate-documentation.md +101 -101
- package/pro/squads/design/tasks/ds-generate-migration-strategy.md +331 -331
- package/pro/squads/design/tasks/ds-generate-shock-report.md +323 -323
- package/pro/squads/design/tasks/ds-govern-a11y-compliance.md +93 -93
- package/pro/squads/design/tasks/ds-governance.md +187 -187
- package/pro/squads/design/tasks/ds-health-metrics.md +278 -278
- package/pro/squads/design/tasks/ds-integrate-squad.md +130 -130
- package/pro/squads/design/tasks/ds-integrate-workspace.md +100 -100
- package/pro/squads/design/tasks/ds-legacy-modernization.md +302 -302
- package/pro/squads/design/tasks/ds-mcp-status.md +65 -65
- package/pro/squads/design/tasks/ds-motion-audit.md +118 -118
- package/pro/squads/design/tasks/ds-multi-framework.md +96 -96
- package/pro/squads/design/tasks/ds-parallelization-gate.md +246 -246
- package/pro/squads/design/tasks/ds-query.md +90 -90
- package/pro/squads/design/tasks/ds-rebuild-artifact.md +369 -369
- package/pro/squads/design/tasks/ds-reverse-engineer.md +194 -194
- package/pro/squads/design/tasks/ds-scan-artifact.md +131 -131
- package/pro/squads/design/tasks/ds-setup-design-system.md +297 -297
- package/pro/squads/design/tasks/ds-sync-registry.md +287 -287
- package/pro/squads/design/tasks/ds-theme-multi-brand.md +90 -90
- package/pro/squads/design/tasks/ds-token-modes.md +108 -108
- package/pro/squads/design/tasks/ds-token-w3c-extract.md +105 -105
- package/pro/squads/design/tasks/ds-validate-ai-readiness.md +69 -69
- package/pro/squads/design/tasks/ds-visual-regression.md +130 -130
- package/pro/squads/design/tasks/execute-checklist.md +141 -141
- package/pro/squads/design/tasks/export-design-tokens-dtcg.md +97 -97
- package/pro/squads/design/tasks/f1-apply-foundations.md +154 -154
- package/pro/squads/design/tasks/f1-ingest-figma-tokens.md +130 -130
- package/pro/squads/design/tasks/f1-map-tokens-to-shadcn.md +145 -145
- package/pro/squads/design/tasks/f1-qa-foundations.md +95 -95
- package/pro/squads/design/tasks/f2-adapt-shadcn-components.md +155 -155
- package/pro/squads/design/tasks/f2-ingest-base-components.md +148 -148
- package/pro/squads/design/tasks/f2-qa-base-components.md +98 -98
- package/pro/squads/design/tasks/f3-derive-components.md +145 -145
- package/pro/squads/design/tasks/f3-qa-derived-components.md +101 -101
- package/pro/squads/design/tasks/focus-order-audit.md +450 -450
- package/pro/squads/design/tasks/sb-brownfield-migrate.md +367 -367
- package/pro/squads/design/tasks/sb-brownfield-scan.md +318 -318
- package/pro/squads/design/tasks/sb-configure.md +230 -230
- package/pro/squads/design/tasks/sb-expand-shadcn.md +213 -213
- package/pro/squads/design/tasks/sb-generate-all-stories.md +288 -288
- package/pro/squads/design/tasks/sb-install.md +152 -152
- package/pro/squads/design/tasks/sb-sync-workspace.md +239 -239
- package/pro/squads/design/tasks/sb-verify.md +203 -203
- package/pro/squads/design/tasks/tailwind-upgrade.md +117 -117
- package/pro/squads/design/tasks/token-usage-analytics.md +262 -262
- package/pro/squads/design/tasks/ux-rewrite-sixth-grade.md +82 -82
- package/pro/squads/design/tasks/validate-design-fidelity.md +222 -222
- package/pro/squads/design/templates/agent-template.yaml +46 -46
- package/pro/squads/design/templates/clone-mind-template.md +352 -352
- package/pro/squads/design/templates/component-prompt-injection-tmpl.md +236 -236
- package/pro/squads/design/templates/component-visual-spec-tmpl.md +378 -378
- package/pro/squads/design/templates/critical-eye-cycle-report-tmpl.md +165 -165
- package/pro/squads/design/templates/design-fidelity-report-tmpl.md +155 -155
- package/pro/squads/design/templates/ds-ai-component-metadata-schema-tmpl.json +138 -138
- package/pro/squads/design/templates/ds-artifact-analysis.md +70 -70
- package/pro/squads/design/templates/ds-health-report-tmpl.md +236 -236
- package/pro/squads/design/templates/ds-migration-strategy-tmpl.md +524 -524
- package/pro/squads/design/templates/ds-state-persistence-tmpl.yaml +194 -194
- package/pro/squads/design/templates/ds-tokens-schema-tmpl.yaml +139 -139
- package/pro/squads/design/templates/migration-strategy-tmpl.md +524 -524
- package/pro/squads/design/templates/reading-design-tokens.css +26 -26
- package/pro/squads/design/templates/state-persistence-tmpl.yaml +219 -219
- package/pro/squads/design/templates/tokens-schema-tmpl.yaml +305 -305
- package/pro/squads/design/workflows/agentic-readiness.yaml +83 -83
- package/pro/squads/design/workflows/audit-only.yaml +198 -198
- package/pro/squads/design/workflows/brownfield-complete.yaml +257 -257
- package/pro/squads/design/workflows/critical-eye.yaml +184 -184
- package/pro/squads/design/workflows/dtcg-tokens-governance.yaml +64 -64
- package/pro/squads/design/workflows/foundations-pipeline.yaml +192 -192
- package/pro/squads/design/workflows/greenfield-new.yaml +192 -192
- package/pro/squads/design/workflows/motion-quality.yaml +65 -65
- package/pro/squads/design/workflows/self-healing-workflow.yaml +237 -237
- package/pro/squads/design/workflows/storybook-brownfield-migration.yaml +400 -400
- package/pro/squads/design/workflows/storybook-full-setup.yaml +280 -280
- package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/ARQUITETURA_COGNITIVA_DE_ALEX_HORMOZI_EXTRA/303/207/303/203O_COMPLETA.md +215 -0
- package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/A_Rotina_de_Alta_Performance_de_Alex_Hormozi_Arquitetura,_Motiva/303/247/303/265es_e_Replica/303/247/303/243o.md +309 -0
- package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/O_sistema_completo_de_cria/303/247/303/243o_de_conte/303/272do_de_Alex_Hormozi.md +416 -0
- package/pro/squads/mmos-squad/minds/alex_hormozi/artifacts/Processo_Cria/303/247/303/243o_Conte/303/272do_Hormozi.md +0 -0
- package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/DECIS/303/225ES_ESTRAT/303/211GICAS_DE_DESIGN_SYSTEMS_(2022_2025).md +1038 -0
- package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/FRAMEWORK_COMPLETO_DE_IMPLEMENTA/303/207/303/203O_ATOMIC_DESIGN.md +797 -0
- package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/O_Cemit/303/251rio_de_Design_Systems.md +447 -0
- package/pro/squads/mmos-squad/minds/brad_frost/.backup/2026-01-13/artifacts/PRINC/303/215PIOS_DE_RACIOC/303/215NIO.md +190 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/DECIS/303/225ES_ESTRAT/303/211GICAS_DE_DESIGN_SYSTEMS_(2022_2025).md +1038 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/FRAMEWORK_COMPLETO_DE_IMPLEMENTA/303/207/303/203O_ATOMIC_DESIGN.md +797 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/O_Cemit/303/251rio_de_Design_Systems.md +447 -0
- package/pro/squads/mmos-squad/minds/brad_frost/artifacts/PRINC/303/215PIOS_DE_RACIOC/303/215NIO.md +190 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/AN/303/201LISE_PSICOM/303/211TRICA_PROFUNDA_ELON_MUSK.md +291 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/ASSINATURA_LINGU/303/215STICA_ELON_MUSK.md +485 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/A_Arquitetura_Mental_de_Elon_Musk_Uma_An/303/241lise_Sistem/303/241tica_dos_Frameworks_de_Pensamento.md +907 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/Dossi/303/252_Estrat/303/251gico_A_Arquitetura_Psicol/303/263gica_de_Elon_Musk.md +252 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/Os_Padr/303/265es_de_Leitura_de_Elon_Musk_e_Sua_Influ/303/252ncia_Sistem/303/241tica.md +287 -0
- package/pro/squads/mmos-squad/minds/elon_musk/artifacts/Uma_an/303/241lise_psicol/303/263gica_abrangente.md +187 -0
- package/pro/squads/mmos-squad/minds/eugene_schwartz/artifacts/AN/303/201LISE_PSICOM/303/211TRICA_PROFUNDA_EUGENE_M._SCHWARTZ.md +790 -0
- package/pro/squads/mmos-squad/minds/eugene_schwartz/artifacts/An/303/241lise_Completa_Eugene_Schwartz_Arquitetura_Cognitiva_DEEP.md +210 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/5H_EXTRA/303/207/303/203O_COGNITIVA_COMPLETA_PEDRO_VAL/303/211RIO_LOPEZ.md +226 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_COMPARATIVA_REVISADA_PEDRO_VAL/303/211RIO_LOPEZ.md +246 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_LINGU/303/215STICA_CARIOCA_PEDRO_VAL/303/211RIO_LOPEZ.md +274 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_PSICOM/303/211TRICA_DEFINITIVA_PEDRO_VAL/303/211RIO_LOPEZ.md +821 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/AN/303/201LISE_PSICOM/303/211TRICA_PROFUNDA_PEDRO_VAL/303/211RIO.md +1844 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/C/303/201LCULO_DE_RARIDADE_ESTAT/303/215STICA_PEDRO_VAL/303/211RIO_LOPEZ.md +154 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/EXTRA/303/207/303/203O_PEDRO_VAL/303/211RIO.md +237 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/MAPEAMENTO_LINGU/303/215STICO_PROFUNDO.md +161 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/META_AXIOMAS_DE_PEDRO_VAL/303/211RIO.md +256 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/SISTEMA_IMUNOL/303/223GICO_COGNITIVO_PEDRO_VAL/303/211RIO_LOPEZ.md +586 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/SISTEMA_IMUNOL/303/223GICO_COGNITIVO_V2_/342/200/224_CLONE_IA.md +452 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/TABELA_COMPARATIVA_AN/303/201LISE_COMPLETA_DOS_CLONES_IA.md +102 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/WHATSAPP_PADR/303/225ES_LINGU/303/215STICOS_PEDRO_VAL/303/211RIO_LOPEZ.md +286 -0
- package/pro/squads/mmos-squad/minds/pedro_valerio/sources/artifacts_v1.6/heur/303/255sticas_de_decis/303/243o_e_algoritmos_mentais_/303/272nicos.md +268 -0
- package/pro/squads/mmos-squad/minds/ray_kurzweil/sources/books/PROTOCOLO_COMPLETO_DE_INTERROGA/303/207/303/203O_-_NAVAL_RAVIKANT.md +3624 -0
- package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/FRAMEWORK_COMPLETO_DE_IMPLEMENTA/303/207/303/203O_JOBS.md +488 -0
- package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/Framework_Cabe/303/247a_Steve.md +257 -0
- package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/Relat/303/263rio_Abrangente_sobre_Steve_Jobs_para_Cria/303/247/303/243o_de_Clone_de_IA.md +370 -0
- package/pro/squads/mmos-squad/minds/steve_jobs/artifacts/Steve_Jobs_An/303/241lise_Psicol/303/263gica_Profunda_e_Valida/303/247/303/243o_Comportamental.md +65 -0
- package/pro/squads/squad-creator-pro/HEADLINE.md +3 -3
- package/pro/squads/squad-creator-pro/agents/oalanicolas.md +438 -438
- package/pro/squads/squad-creator-pro/agents/squad-chief.md +1651 -1651
- package/pro/squads/squad-creator-pro/agents/thiago_finch.md +976 -976
- package/pro/squads/squad-creator-pro/assessments/axioma-assessment-wf-create-squad.yaml +325 -325
- package/pro/squads/squad-creator-pro/checklists/create-agent-checklist.md +184 -184
- package/pro/squads/squad-creator-pro/checklists/create-squad-checklist.md +219 -219
- package/pro/squads/squad-creator-pro/checklists/create-workflow-checklist.md +224 -224
- package/pro/squads/squad-creator-pro/checklists/mental-model-integration-checklist.md +95 -95
- package/pro/squads/squad-creator-pro/checklists/squad-overview-checklist.md +393 -393
- package/pro/squads/squad-creator-pro/config/model-routing.yaml +693 -693
- package/pro/squads/squad-creator-pro/config/scoring-rubric.yaml +199 -199
- package/pro/squads/squad-creator-pro/config.yaml +35 -35
- package/pro/squads/squad-creator-pro/data/internal-infrastructure-library.yaml +99 -99
- package/pro/squads/squad-creator-pro/data/mental-model-task-matrix.yaml +692 -692
- package/pro/squads/squad-creator-pro/docs/ADR-001-model-tier-qualification.md +344 -344
- package/pro/squads/squad-creator-pro/docs/AGENT-COLLABORATION.md +609 -609
- package/pro/squads/squad-creator-pro/docs/MIGRATION-PLAN-AGENT-CONFORMITY.md +861 -861
- package/pro/squads/squad-creator-pro/docs/MODEL-TIER-QUALIFICATION.md +337 -337
- package/pro/squads/squad-creator-pro/docs/optimize-v4-proposal.md +354 -354
- package/pro/squads/squad-creator-pro/docs/task-optimization-framework.md +229 -229
- package/pro/squads/squad-creator-pro/minds/oalanicolas/heuristics/AN_KE_010.md +240 -240
- package/pro/squads/squad-creator-pro/protocols/ai-first-governance.md +63 -63
- package/pro/squads/squad-creator-pro/scripts/assess-sources.sh +443 -443
- package/pro/squads/squad-creator-pro/scripts/clone-review.sh +394 -394
- package/pro/squads/squad-creator-pro/scripts/create-agent-preflight.py +243 -243
- package/pro/squads/squad-creator-pro/scripts/cross-provider/compare-results.js +281 -281
- package/pro/squads/squad-creator-pro/scripts/cross-provider/cross-provider-runner.js +462 -462
- package/pro/squads/squad-creator-pro/scripts/fidelity-score.sh +519 -519
- package/pro/squads/squad-creator-pro/scripts/generate-squad-guide.js +558 -558
- package/pro/squads/squad-creator-pro/scripts/lib/config-loader.js +151 -151
- package/pro/squads/squad-creator-pro/scripts/model-tier-validator.cjs +369 -369
- package/pro/squads/squad-creator-pro/scripts/model-usage-logger.cjs +245 -245
- package/pro/squads/squad-creator-pro/scripts/modernization-score.sh +308 -308
- package/pro/squads/squad-creator-pro/scripts/scaffold-squad.cjs +281 -281
- package/pro/squads/squad-creator-pro/scripts/security_scanner.py +378 -378
- package/pro/squads/squad-creator-pro/scripts/squad-context-loader.cjs +205 -205
- package/pro/squads/squad-creator-pro/scripts/squad-state-manager.cjs +451 -451
- package/pro/squads/squad-creator-pro/scripts/squad-workflow-runner.cjs +471 -471
- package/pro/squads/squad-creator-pro/scripts/squad_utils.py +261 -261
- package/pro/squads/squad-creator-pro/scripts/tests/run_bash_tests.sh +29 -29
- package/pro/squads/squad-creator-pro/scripts/tests/test_assess_sources.sh +216 -216
- package/pro/squads/squad-creator-pro/scripts/tests/test_clone_review.sh +239 -239
- package/pro/squads/squad-creator-pro/scripts/tests/test_coherence_validator.py +212 -212
- package/pro/squads/squad-creator-pro/scripts/tests/test_fidelity_score.sh +298 -298
- package/pro/squads/squad-creator-pro/scripts/tests/test_modernization_score.sh +211 -211
- package/pro/squads/squad-creator-pro/scripts/tests/test_security_scanner.py +354 -354
- package/pro/squads/squad-creator-pro/scripts/tests/test_validate_clone.sh +252 -252
- package/pro/squads/squad-creator-pro/squad.yaml +36 -36
- package/pro/squads/squad-creator-pro/tasks/an-compare-outputs.md +354 -354
- package/pro/squads/squad-creator-pro/tasks/create-squad.md +933 -933
- package/pro/squads/squad-creator-pro/tasks/detect-squad-context.md +81 -81
- package/pro/squads/squad-creator-pro/tasks/lookup-model.md +78 -78
- package/pro/squads/squad-creator-pro/tasks/next-squad.md +487 -487
- package/pro/squads/squad-creator-pro/tasks/optimize-workflow.md +851 -851
- package/pro/squads/squad-creator-pro/tasks/parallel-discovery.md +58 -58
- package/pro/squads/squad-creator-pro/tasks/pv-axioma-assessment-wf-clone-mind.yaml +256 -256
- package/pro/squads/squad-creator-pro/tasks/qualify-task.md +265 -265
- package/pro/squads/squad-creator-pro/tasks/reexecute-squad-phase.md +64 -64
- package/pro/squads/squad-creator-pro/tasks/smoke-test-model-routing.md +167 -167
- package/pro/squads/squad-creator-pro/tasks/squad-overview.md +683 -683
- package/pro/squads/squad-creator-pro/tasks/validate-final-artifacts.md +80 -80
- package/pro/squads/squad-creator-pro/templates/orchestrator-tmpl.md +74 -74
- package/pro/squads/squad-creator-pro/test-cases/BATCH-PROGRESS.md +268 -268
- package/pro/squads/squad-creator-pro/test-cases/QUALIFICATION-DASHBOARD.yaml +13 -13
- package/pro/squads/squad-creator-pro/test-cases/_template.yaml +147 -147
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/ASSESSMENT-SUMMARY.md +275 -275
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/ASSESSMENT_SUMMARY.md +140 -140
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/CHECKPOINT_MATRIX.md +202 -202
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/EXECUTION-REPORT.md +413 -413
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/EXECUTION_NOTES.md +358 -358
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/README-v2.2.2.md +299 -299
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/README.md +320 -320
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/TEST-REPORT-v2.1.md +351 -351
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/VERIFICATION-CHECKLIST.txt +247 -247
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/formal-qualification-report.yaml +389 -389
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-output.yaml +366 -366
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.1-output.yaml +452 -452
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.2.1-output.yaml +281 -281
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/haiku-v2.2.2-output.yaml +332 -332
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/opus-baseline.yaml +517 -517
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/qualification-report.yaml +213 -213
- package/pro/squads/squad-creator-pro/test-cases/an-assess-sources/test-case.yaml +69 -69
- package/pro/squads/squad-creator-pro/test-cases/an-clone-review/haiku-round-1.yaml +213 -213
- package/pro/squads/squad-creator-pro/test-cases/an-clone-review/opus-baseline.yaml +566 -566
- package/pro/squads/squad-creator-pro/test-cases/an-clone-review/qualification-report.yaml +82 -82
- package/pro/squads/squad-creator-pro/test-cases/an-design-clone/test-case.yaml +102 -102
- package/pro/squads/squad-creator-pro/test-cases/an-extract-dna/test-case.yaml +105 -105
- package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/haiku-round-1.yaml +262 -262
- package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/opus-baseline.yaml +266 -266
- package/pro/squads/squad-creator-pro/test-cases/an-fidelity-score/qualification-report.yaml +94 -94
- package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/haiku-round-1.yaml +282 -282
- package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/opus-baseline.yaml +470 -470
- package/pro/squads/squad-creator-pro/test-cases/an-validate-clone/qualification-report.yaml +106 -106
- package/pro/squads/squad-creator-pro/test-cases/collect-sources/test-case.yaml +105 -105
- package/pro/squads/squad-creator-pro/test-cases/create-task/test-case.yaml +104 -104
- package/pro/squads/squad-creator-pro/test-cases/cross-provider/DASHBOARD.yaml +11 -11
- package/pro/squads/squad-creator-pro/test-cases/pv-audit/test-case.yaml +106 -106
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/haiku-output.yaml +209 -209
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/opus-baseline.yaml +96 -96
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/sonnet-output.yaml +30 -30
- package/pro/squads/squad-creator-pro/test-cases/pv-axioma-assessment/test-case.yaml +129 -129
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/comparison-round-1.yaml +242 -242
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/haiku-round-1.yaml +393 -393
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/opus-baseline.yaml +488 -488
- package/pro/squads/squad-creator-pro/test-cases/pv-modernization-score/qualification-report.yaml +74 -74
- package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/haiku-round-1.yaml +292 -292
- package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/opus-baseline.yaml +603 -603
- package/pro/squads/squad-creator-pro/test-cases/qa-after-creation/qualification-report.yaml +97 -97
- package/pro/squads/squad-creator-pro/test-cases/smoke-test-model-routing/test-case.yaml +100 -100
- package/pro/squads/squad-creator-pro/test-cases/upgrade-squad/test-case.yaml +106 -106
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/comparison-round-1.yaml +223 -223
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-1-MINE.yaml +36 -36
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-1.yaml +193 -193
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-2.yaml +303 -303
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/haiku-round-3-v4-task.yaml +149 -149
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/opus-baseline.yaml +529 -529
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/opus-round-3-v4-task.yaml +132 -132
- package/pro/squads/squad-creator-pro/test-cases/validate-squad/qualification-report.yaml +104 -104
- package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/haiku-output-v2-calibrated.yaml +200 -200
- package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/haiku-output.yaml +183 -183
- package/pro/squads/squad-creator-pro/test-cases/wf-clone-mind/opus-baseline.yaml +112 -112
- package/pro/squads/squad-creator-pro/workflows/create-squad.yaml +348 -348
- package/pro/squads/squad-creator-pro/workflows/modules/module-discovery.yaml +16 -16
- package/pro/squads/squad-creator-pro/workflows/modules/module-integration.yaml +16 -16
- package/pro/squads/squad-creator-pro/workflows/modules/module-quality-gates.yaml +15 -15
- package/pro/squads/squad-creator-pro/workflows/wf-brownfield-upgrade-squad.yaml +46 -46
- package/pro/squads/squad-creator-pro/workflows/wf-context-aware-create-squad.yaml +47 -47
- package/pro/squads/squad-creator-pro/workflows/wf-create-squad.yaml +1619 -1619
- package/pro/squads/squad-creator-pro/workflows/wf-cross-provider-qualification.yaml +711 -711
- package/pro/squads/squad-creator-pro/workflows/wf-model-tier-qualification.yaml +800 -800
- package/pro/squads/squad-creator-pro/workflows/wf-optimize-squad.yaml +684 -684
- package/scripts/check-markdown-links.py +352 -352
- package/scripts/dashboard-parallel-dev.sh +0 -0
- package/scripts/dashboard-parallel-phase3.sh +0 -0
- package/scripts/dashboard-parallel-phase4.sh +0 -0
- package/scripts/install-monitor-hooks.sh +0 -0
- package/.claude/hooks/code-intel-pretool.cjs +0 -107
- package/docs/guides/aios-workflows/README.md +0 -247
- package/docs/guides/aios-workflows/bob-orchestrator-workflow.md +0 -1536
- package/scripts/glue/README.md +0 -355
- package/scripts/glue/compose-agent-prompt.cjs +0 -362
|
@@ -1,525 +1,525 @@
|
|
|
1
|
-
# Task: aria-audit
|
|
2
|
-
|
|
3
|
-
> **Command:** `*aria-audit {path}`
|
|
4
|
-
> **Agent:** Brad Frost (Design System Architect)
|
|
5
|
-
> **Purpose:** Validate ARIA usage, roles, states, and properties
|
|
6
|
-
> **Execution Type:** `Agent`
|
|
7
|
-
> **Dependencies:** depends_on: `[]` · enables: `[]` · workflow: `accessibility`
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Overview
|
|
12
|
-
|
|
13
|
-
Comprehensive ARIA (Accessible Rich Internet Applications) audit covering:
|
|
14
|
-
1. **Valid ARIA attributes** - No invalid/deprecated attributes
|
|
15
|
-
2. **Required properties** - Roles have required aria-* props
|
|
16
|
-
3. **Correct usage patterns** - ARIA used appropriately
|
|
17
|
-
4. **Redundant ARIA** - Native HTML preferred
|
|
18
|
-
5. **Live regions** - Dynamic content announced
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Input
|
|
23
|
-
|
|
24
|
-
| Parameter | Required | Description |
|
|
25
|
-
|-----------|----------|-------------|
|
|
26
|
-
| `path` | Yes | Directory to audit (e.g., `./app/components`) |
|
|
27
|
-
| `--strict` | No | Fail on warnings too (not just errors) |
|
|
28
|
-
| `--fix` | No | Auto-fix simple issues |
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Execution Steps
|
|
33
|
-
|
|
34
|
-
### Phase 1: ARIA Attribute Discovery
|
|
35
|
-
|
|
36
|
-
```typescript
|
|
37
|
-
interface AriaUsage {
|
|
38
|
-
attribute: string; // aria-label, role, etc.
|
|
39
|
-
value: string;
|
|
40
|
-
element: string; // HTML element
|
|
41
|
-
file: string;
|
|
42
|
-
line: number;
|
|
43
|
-
valid: boolean;
|
|
44
|
-
issues: AriaIssue[];
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// All ARIA attributes to scan
|
|
48
|
-
const ariaAttributes = [
|
|
49
|
-
// Roles
|
|
50
|
-
'role',
|
|
51
|
-
// States & Properties
|
|
52
|
-
'aria-activedescendant', 'aria-atomic', 'aria-autocomplete',
|
|
53
|
-
'aria-braillelabel', 'aria-brailleroledescription', 'aria-busy',
|
|
54
|
-
'aria-checked', 'aria-colcount', 'aria-colindex', 'aria-colspan',
|
|
55
|
-
'aria-controls', 'aria-current', 'aria-describedby', 'aria-description',
|
|
56
|
-
'aria-details', 'aria-disabled', 'aria-dropeffect', 'aria-errormessage',
|
|
57
|
-
'aria-expanded', 'aria-flowto', 'aria-grabbed', 'aria-haspopup',
|
|
58
|
-
'aria-hidden', 'aria-invalid', 'aria-keyshortcuts', 'aria-label',
|
|
59
|
-
'aria-labelledby', 'aria-level', 'aria-live', 'aria-modal',
|
|
60
|
-
'aria-multiline', 'aria-multiselectable', 'aria-orientation',
|
|
61
|
-
'aria-owns', 'aria-placeholder', 'aria-posinset', 'aria-pressed',
|
|
62
|
-
'aria-readonly', 'aria-relevant', 'aria-required', 'aria-roledescription',
|
|
63
|
-
'aria-rowcount', 'aria-rowindex', 'aria-rowspan', 'aria-selected',
|
|
64
|
-
'aria-setsize', 'aria-sort', 'aria-valuemax', 'aria-valuemin',
|
|
65
|
-
'aria-valuenow', 'aria-valuetext'
|
|
66
|
-
];
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### Phase 2: Role Validation
|
|
70
|
-
|
|
71
|
-
```typescript
|
|
72
|
-
interface RoleAudit {
|
|
73
|
-
role: string;
|
|
74
|
-
element: string;
|
|
75
|
-
file: string;
|
|
76
|
-
line: number;
|
|
77
|
-
checks: {
|
|
78
|
-
validRole: boolean; // Role exists in ARIA spec
|
|
79
|
-
appropriateElement: boolean; // Role appropriate for element
|
|
80
|
-
hasRequiredProps: boolean; // Required aria-* present
|
|
81
|
-
hasAllowedProps: boolean; // No disallowed aria-*
|
|
82
|
-
redundant: boolean; // Native HTML would suffice
|
|
83
|
-
};
|
|
84
|
-
requiredProps: string[]; // What's required
|
|
85
|
-
missingProps: string[]; // What's missing
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Required properties by role
|
|
89
|
-
const roleRequirements: Record<string, string[]> = {
|
|
90
|
-
'checkbox': ['aria-checked'],
|
|
91
|
-
'combobox': ['aria-expanded', 'aria-controls'],
|
|
92
|
-
'heading': ['aria-level'],
|
|
93
|
-
'meter': ['aria-valuenow'],
|
|
94
|
-
'option': [], // aria-selected recommended
|
|
95
|
-
'radio': ['aria-checked'],
|
|
96
|
-
'scrollbar': ['aria-controls', 'aria-valuenow'],
|
|
97
|
-
'separator': [], // if focusable: aria-valuenow
|
|
98
|
-
'slider': ['aria-valuenow'],
|
|
99
|
-
'spinbutton': ['aria-valuenow'],
|
|
100
|
-
'switch': ['aria-checked'],
|
|
101
|
-
'tab': [], // aria-selected recommended
|
|
102
|
-
'tabpanel': [], // aria-labelledby recommended
|
|
103
|
-
'treeitem': [], // aria-expanded if has children
|
|
104
|
-
};
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### Phase 3: Common ARIA Errors Detection
|
|
108
|
-
|
|
109
|
-
```typescript
|
|
110
|
-
type AriaIssue =
|
|
111
|
-
// Invalid usage
|
|
112
|
-
| 'invalid-role' // Role doesn't exist
|
|
113
|
-
| 'invalid-attribute' // Attribute doesn't exist
|
|
114
|
-
| 'invalid-value' // Wrong value type/format
|
|
115
|
-
|
|
116
|
-
// Missing requirements
|
|
117
|
-
| 'missing-required-prop' // Required prop not present
|
|
118
|
-
| 'missing-accessible-name' // No label, labelledby, or content
|
|
119
|
-
|
|
120
|
-
// Incorrect usage
|
|
121
|
-
| 'redundant-role' // <button role="button">
|
|
122
|
-
| 'conflicting-semantics' // <nav role="navigation">
|
|
123
|
-
| 'aria-hidden-focusable' // aria-hidden with focusable child
|
|
124
|
-
| 'aria-label-on-generic' // aria-label on div/span without role
|
|
125
|
-
| 'broken-reference' // aria-labelledby points to missing id
|
|
126
|
-
|
|
127
|
-
// Bad patterns
|
|
128
|
-
| 'aria-live-wrong-value' // aria-live="true" instead of "polite"
|
|
129
|
-
| 'role-presentation-focusable' // role="presentation" on focusable
|
|
130
|
-
| 'nested-interactive' // Interactive inside interactive
|
|
131
|
-
| 'abstract-role'; // Using abstract role (widget, landmark)
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### Phase 4: Pattern-Specific Audits
|
|
135
|
-
|
|
136
|
-
#### Modals/Dialogs
|
|
137
|
-
```typescript
|
|
138
|
-
interface ModalAriaAudit {
|
|
139
|
-
component: string;
|
|
140
|
-
checks: {
|
|
141
|
-
hasRoleDialog: boolean; // role="dialog" or "alertdialog"
|
|
142
|
-
hasAriaModal: boolean; // aria-modal="true"
|
|
143
|
-
hasLabel: boolean; // aria-label or aria-labelledby
|
|
144
|
-
inertBackground: boolean; // Background has aria-hidden or inert
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
#### Tabs
|
|
150
|
-
```typescript
|
|
151
|
-
interface TabsAriaAudit {
|
|
152
|
-
component: string;
|
|
153
|
-
checks: {
|
|
154
|
-
tablistHasRole: boolean; // role="tablist"
|
|
155
|
-
tabsHaveRole: boolean; // role="tab"
|
|
156
|
-
panelsHaveRole: boolean; // role="tabpanel"
|
|
157
|
-
tabsHaveControls: boolean; // aria-controls on tabs
|
|
158
|
-
panelsHaveLabelledby: boolean; // aria-labelledby on panels
|
|
159
|
-
selectedManaged: boolean; // aria-selected on active tab
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
#### Forms
|
|
165
|
-
```typescript
|
|
166
|
-
interface FormAriaAudit {
|
|
167
|
-
component: string;
|
|
168
|
-
checks: {
|
|
169
|
-
inputsLabeled: boolean; // aria-label or associated label
|
|
170
|
-
requiredMarked: boolean; // aria-required="true"
|
|
171
|
-
errorsDescribed: boolean; // aria-describedby for errors
|
|
172
|
-
invalidMarked: boolean; // aria-invalid when error
|
|
173
|
-
liveRegionForErrors: boolean; // aria-live for error messages
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
#### Live Regions
|
|
179
|
-
```typescript
|
|
180
|
-
interface LiveRegionAudit {
|
|
181
|
-
component: string;
|
|
182
|
-
checks: {
|
|
183
|
-
hasAriaLive: boolean;
|
|
184
|
-
liveValue: 'polite' | 'assertive' | 'off';
|
|
185
|
-
ariaAtomic: boolean; // Updates read as whole
|
|
186
|
-
ariaRelevant: string; // additions, removals, text, all
|
|
187
|
-
};
|
|
188
|
-
dynamicContent: Array<{
|
|
189
|
-
file: string;
|
|
190
|
-
line: number;
|
|
191
|
-
hasLiveRegion: boolean; // Dynamic content needs aria-live
|
|
192
|
-
}>;
|
|
193
|
-
}
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
### Phase 5: Semantic HTML vs ARIA
|
|
197
|
-
|
|
198
|
-
Detect cases where native HTML is better:
|
|
199
|
-
|
|
200
|
-
```typescript
|
|
201
|
-
interface RedundantAriaAudit {
|
|
202
|
-
pattern: string;
|
|
203
|
-
occurrences: number;
|
|
204
|
-
recommendation: string;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
const redundantPatterns = [
|
|
208
|
-
{ pattern: '<button role="button">', fix: '<button>' },
|
|
209
|
-
{ pattern: '<a href role="link">', fix: '<a href>' },
|
|
210
|
-
{ pattern: '<nav role="navigation">', fix: '<nav>' },
|
|
211
|
-
{ pattern: '<main role="main">', fix: '<main>' },
|
|
212
|
-
{ pattern: '<header role="banner">', fix: '<header>' },
|
|
213
|
-
{ pattern: '<footer role="contentinfo">', fix: '<footer>' },
|
|
214
|
-
{ pattern: '<aside role="complementary">', fix: '<aside>' },
|
|
215
|
-
{ pattern: '<article role="article">', fix: '<article>' },
|
|
216
|
-
{ pattern: '<input type="checkbox" role="checkbox">', fix: '<input type="checkbox">' },
|
|
217
|
-
{ pattern: '<input type="radio" role="radio">', fix: '<input type="radio">' },
|
|
218
|
-
];
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
---
|
|
222
|
-
|
|
223
|
-
## Output
|
|
224
|
-
|
|
225
|
-
### 1. ARIA Audit Report
|
|
226
|
-
|
|
227
|
-
```markdown
|
|
228
|
-
# ARIA Audit Report
|
|
229
|
-
|
|
230
|
-
**Path:** ./app/components
|
|
231
|
-
**Date:** 2026-01-05
|
|
232
|
-
**Components Scanned:** 156
|
|
233
|
-
|
|
234
|
-
## Summary
|
|
235
|
-
|
|
236
|
-
| Category | Issues | Critical | Serious | Moderate |
|
|
237
|
-
|----------|--------|----------|---------|----------|
|
|
238
|
-
| Invalid ARIA | 3 | 2 | 1 | 0 |
|
|
239
|
-
| Missing Props | 8 | 4 | 3 | 1 |
|
|
240
|
-
| Incorrect Usage | 12 | 3 | 6 | 3 |
|
|
241
|
-
| Redundant ARIA | 15 | 0 | 0 | 15 |
|
|
242
|
-
| Live Regions | 5 | 2 | 3 | 0 |
|
|
243
|
-
| **Total** | **43** | **11** | **13** | **19** |
|
|
244
|
-
|
|
245
|
-
## Critical Issues
|
|
246
|
-
|
|
247
|
-
### 1. ❌ Missing accessible name
|
|
248
|
-
|
|
249
|
-
**File:** `app/components/ui/IconButton.tsx:23`
|
|
250
|
-
**Element:** `<button aria-label={undefined}>`
|
|
251
|
-
**Problem:** Button has no accessible name
|
|
252
|
-
|
|
253
|
-
**Current:**
|
|
254
|
-
```tsx
|
|
255
|
-
<button onClick={onClick}>
|
|
256
|
-
<SearchIcon />
|
|
257
|
-
</button>
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
**Fix:**
|
|
261
|
-
```tsx
|
|
262
|
-
<button onClick={onClick} aria-label="Search">
|
|
263
|
-
<SearchIcon />
|
|
264
|
-
</button>
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
### 2. ❌ aria-hidden with focusable children
|
|
270
|
-
|
|
271
|
-
**File:** `app/components/modals/Sidebar.tsx:45`
|
|
272
|
-
**Element:** `<div aria-hidden="true">`
|
|
273
|
-
**Problem:** Hidden container has focusable button inside
|
|
274
|
-
|
|
275
|
-
**Current:**
|
|
276
|
-
```tsx
|
|
277
|
-
<div aria-hidden="true">
|
|
278
|
-
<button>Click me</button> {/* ❌ Focusable but hidden */}
|
|
279
|
-
</div>
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
**Fix:**
|
|
283
|
-
```tsx
|
|
284
|
-
<div aria-hidden="true" inert> {/* Add inert attribute */}
|
|
285
|
-
<button tabIndex={-1}>Click me</button>
|
|
286
|
-
</div>
|
|
287
|
-
// OR remove aria-hidden if content should be accessible
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
### 3. ❌ Missing required aria-checked
|
|
293
|
-
|
|
294
|
-
**File:** `app/components/ui/Toggle.tsx:12`
|
|
295
|
-
**Element:** `<div role="switch">`
|
|
296
|
-
**Problem:** Switch role requires aria-checked
|
|
297
|
-
|
|
298
|
-
**Current:**
|
|
299
|
-
```tsx
|
|
300
|
-
<div role="switch" onClick={toggle}>
|
|
301
|
-
{isOn ? 'On' : 'Off'}
|
|
302
|
-
</div>
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
**Fix:**
|
|
306
|
-
```tsx
|
|
307
|
-
<button
|
|
308
|
-
role="switch"
|
|
309
|
-
aria-checked={isOn}
|
|
310
|
-
onClick={toggle}
|
|
311
|
-
>
|
|
312
|
-
{isOn ? 'On' : 'Off'}
|
|
313
|
-
</button>
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
---
|
|
317
|
-
|
|
318
|
-
### 4. ❌ Broken aria-labelledby reference
|
|
319
|
-
|
|
320
|
-
**File:** `app/components/modals/ConfirmDialog.tsx:8`
|
|
321
|
-
**Element:** `<div role="dialog" aria-labelledby="dialog-title">`
|
|
322
|
-
**Problem:** No element with id="dialog-title" exists
|
|
323
|
-
|
|
324
|
-
**Fix:** Add id to heading:
|
|
325
|
-
```tsx
|
|
326
|
-
<div role="dialog" aria-labelledby="dialog-title" aria-modal="true">
|
|
327
|
-
<h2 id="dialog-title">Confirm Action</h2> {/* Add id */}
|
|
328
|
-
...
|
|
329
|
-
</div>
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
---
|
|
333
|
-
|
|
334
|
-
### 5. ❌ Dynamic content without live region
|
|
335
|
-
|
|
336
|
-
**File:** `app/components/ui/Toast.tsx:34`
|
|
337
|
-
**Problem:** Toast messages not announced to screen readers
|
|
338
|
-
|
|
339
|
-
**Current:**
|
|
340
|
-
```tsx
|
|
341
|
-
{toast && <div className="toast">{toast.message}</div>}
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
**Fix:**
|
|
345
|
-
```tsx
|
|
346
|
-
<div aria-live="polite" aria-atomic="true">
|
|
347
|
-
{toast && <div className="toast">{toast.message}</div>}
|
|
348
|
-
</div>
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
---
|
|
352
|
-
|
|
353
|
-
## Redundant ARIA (Moderate)
|
|
354
|
-
|
|
355
|
-
| Pattern | Count | Recommendation |
|
|
356
|
-
|---------|-------|----------------|
|
|
357
|
-
| `<button role="button">` | 5 | Remove role |
|
|
358
|
-
| `<nav role="navigation">` | 3 | Remove role |
|
|
359
|
-
| `<main role="main">` | 2 | Remove role |
|
|
360
|
-
| `<a href role="link">` | 4 | Remove role |
|
|
361
|
-
| `<header role="banner">` | 1 | Remove role |
|
|
362
|
-
|
|
363
|
-
**Note:** These work but are verbose. Native HTML provides the same semantics.
|
|
364
|
-
|
|
365
|
-
---
|
|
366
|
-
|
|
367
|
-
## Component-Specific Audits
|
|
368
|
-
|
|
369
|
-
### Modals/Dialogs
|
|
370
|
-
|
|
371
|
-
| Component | role=dialog | aria-modal | Labeled | Traps Focus |
|
|
372
|
-
|-----------|-------------|------------|---------|-------------|
|
|
373
|
-
| ConfirmDialog | ✓ | ✗ | ✗ | ✗ |
|
|
374
|
-
| AlertModal | ✓ | ✓ | ✓ | ✓ |
|
|
375
|
-
| Drawer | ✗ | ✗ | ✗ | ✗ |
|
|
376
|
-
|
|
377
|
-
### Tabs
|
|
378
|
-
|
|
379
|
-
| Component | tablist | tabs | panels | Controls | Labeled |
|
|
380
|
-
|-----------|---------|------|--------|----------|---------|
|
|
381
|
-
| TabGroup | ✓ | ✓ | ✓ | ✗ | ✗ |
|
|
382
|
-
| Navigation | ✗ | ✗ | N/A | N/A | N/A |
|
|
383
|
-
|
|
384
|
-
### Forms
|
|
385
|
-
|
|
386
|
-
| Component | Labeled | Required | Errors | Invalid |
|
|
387
|
-
|-----------|---------|----------|--------|---------|
|
|
388
|
-
| LoginForm | ✓ | ✓ | ✗ | ✗ |
|
|
389
|
-
| SearchInput | ✗ | N/A | N/A | N/A |
|
|
390
|
-
| ContactForm | ✓ | ✓ | ✓ | ✓ |
|
|
391
|
-
|
|
392
|
-
---
|
|
393
|
-
|
|
394
|
-
## ARIA Best Practices Reference
|
|
395
|
-
|
|
396
|
-
### First Rule of ARIA
|
|
397
|
-
> Don't use ARIA if you can use native HTML.
|
|
398
|
-
|
|
399
|
-
```tsx
|
|
400
|
-
// ❌ Bad
|
|
401
|
-
<div role="button" tabIndex={0} onClick={fn}>Click</div>
|
|
402
|
-
|
|
403
|
-
// ✅ Good
|
|
404
|
-
<button onClick={fn}>Click</button>
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
### Required Accessible Names
|
|
408
|
-
|
|
409
|
-
These elements MUST have accessible names:
|
|
410
|
-
- `role="dialog"` - via aria-label or aria-labelledby
|
|
411
|
-
- `role="alertdialog"` - via aria-label or aria-labelledby
|
|
412
|
-
- `<img>` - via alt
|
|
413
|
-
- `<button>` with icon only - via aria-label
|
|
414
|
-
- `<a>` with icon only - via aria-label
|
|
415
|
-
- Form inputs - via `<label>`, aria-label, or aria-labelledby
|
|
416
|
-
|
|
417
|
-
### Live Region Guidelines
|
|
418
|
-
|
|
419
|
-
| Urgency | Use | Example |
|
|
420
|
-
|---------|-----|---------|
|
|
421
|
-
| Polite | `aria-live="polite"` | Toast notifications, search results |
|
|
422
|
-
| Assertive | `aria-live="assertive"` | Errors, critical alerts |
|
|
423
|
-
| Off | `aria-live="off"` | Frequently updating content (stock tickers) |
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
---
|
|
427
|
-
|
|
428
|
-
## Auto-Fix (with --fix flag)
|
|
429
|
-
|
|
430
|
-
```typescript
|
|
431
|
-
// Auto-fixable patterns
|
|
432
|
-
|
|
433
|
-
// 1. Remove redundant roles
|
|
434
|
-
- <button role="button">
|
|
435
|
-
+ <button>
|
|
436
|
-
|
|
437
|
-
// 2. Add missing aria-checked to switches
|
|
438
|
-
- <div role="switch">
|
|
439
|
-
+ <div role="switch" aria-checked={value}>
|
|
440
|
-
|
|
441
|
-
// 3. Fix aria-live="true" (invalid)
|
|
442
|
-
- <div aria-live="true">
|
|
443
|
-
+ <div aria-live="polite">
|
|
444
|
-
|
|
445
|
-
// 4. Add aria-label to icon buttons
|
|
446
|
-
- <button><Icon /></button>
|
|
447
|
-
+ <button aria-label="Icon description"><Icon /></button>
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
---
|
|
451
|
-
|
|
452
|
-
## Integration
|
|
453
|
-
|
|
454
|
-
```bash
|
|
455
|
-
# Full ARIA audit
|
|
456
|
-
*aria-audit ./app/components
|
|
457
|
-
|
|
458
|
-
# Strict mode (fail on warnings)
|
|
459
|
-
*aria-audit ./app/components --strict
|
|
460
|
-
|
|
461
|
-
# Auto-fix simple issues
|
|
462
|
-
*aria-audit ./app/components --fix
|
|
463
|
-
|
|
464
|
-
# As part of full audit
|
|
465
|
-
*a11y-audit ./app/components --scope aria
|
|
466
|
-
```
|
|
467
|
-
|
|
468
|
-
---
|
|
469
|
-
|
|
470
|
-
## Failure Handling
|
|
471
|
-
|
|
472
|
-
- **ARIA attribute validation against outdated spec:** Use WAI-ARIA 1.2 as baseline. Flag attributes only in 1.3 draft as "warning" not "error"
|
|
473
|
-
- **Broken aria-labelledby references due to dynamic IDs:** Skip dynamic ID patterns (e.g., `id={uniqueId}`), log as "dynamic reference — requires runtime validation"
|
|
474
|
-
- **Live region detection misses framework-specific patterns:** Check for React portals, Vue teleport, and framework toast libraries in addition to raw aria-live attributes
|
|
475
|
-
- **Strict mode (--strict) produces excessive warnings:** Cap warnings at 50 per category, summarize remainder as "and {N} more similar warnings"
|
|
476
|
-
|
|
477
|
-
## State Update
|
|
478
|
-
|
|
479
|
-
```yaml
|
|
480
|
-
aria_audit:
|
|
481
|
-
last_run: "2026-01-05T14:30:00Z"
|
|
482
|
-
path: "./app/components"
|
|
483
|
-
results:
|
|
484
|
-
total_issues: 43
|
|
485
|
-
critical: 11
|
|
486
|
-
serious: 13
|
|
487
|
-
moderate: 19
|
|
488
|
-
categories:
|
|
489
|
-
invalid_aria: 3
|
|
490
|
-
missing_props: 8
|
|
491
|
-
incorrect_usage: 12
|
|
492
|
-
redundant: 15
|
|
493
|
-
live_regions: 5
|
|
494
|
-
patterns_found:
|
|
495
|
-
modals_without_aria_modal: 2
|
|
496
|
-
icon_buttons_without_label: 4
|
|
497
|
-
broken_references: 2
|
|
498
|
-
auto_fixed: 0
|
|
499
|
-
next_action: "Fix 11 critical ARIA issues"
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
---
|
|
503
|
-
|
|
504
|
-
## Success Criteria
|
|
505
|
-
|
|
506
|
-
- [ ] All ARIA attributes validated against WAI-ARIA 1.2 spec
|
|
507
|
-
- [ ] Zero invalid or deprecated ARIA attributes remain
|
|
508
|
-
- [ ] All interactive roles have required aria-* properties
|
|
509
|
-
- [ ] No redundant ARIA on native HTML elements (e.g., `role="button"` on `<button>`)
|
|
510
|
-
- [ ] Live regions (`aria-live`) properly configured for dynamic content
|
|
511
|
-
- [ ] Report generated with file:line references for every finding
|
|
512
|
-
- [ ] Severity classification (error/warning/info) applied to each issue
|
|
513
|
-
|
|
514
|
-
---
|
|
515
|
-
|
|
516
|
-
**Brad says:** "First rule of ARIA: Don't use ARIA. Use semantic HTML. Second rule: If you use ARIA, use it correctly."
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
## Related Checklists
|
|
520
|
-
|
|
521
|
-
- `squads/design/checklists/ds-accessibility-wcag-checklist.md`
|
|
522
|
-
- `squads/design/checklists/ds-a11y-release-gate-checklist.md`
|
|
523
|
-
|
|
524
|
-
## Process Guards
|
|
525
|
-
- **On Fail:** Stop execution, capture evidence, and return remediation steps before proceeding.
|
|
1
|
+
# Task: aria-audit
|
|
2
|
+
|
|
3
|
+
> **Command:** `*aria-audit {path}`
|
|
4
|
+
> **Agent:** Brad Frost (Design System Architect)
|
|
5
|
+
> **Purpose:** Validate ARIA usage, roles, states, and properties
|
|
6
|
+
> **Execution Type:** `Agent`
|
|
7
|
+
> **Dependencies:** depends_on: `[]` · enables: `[]` · workflow: `accessibility`
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Overview
|
|
12
|
+
|
|
13
|
+
Comprehensive ARIA (Accessible Rich Internet Applications) audit covering:
|
|
14
|
+
1. **Valid ARIA attributes** - No invalid/deprecated attributes
|
|
15
|
+
2. **Required properties** - Roles have required aria-* props
|
|
16
|
+
3. **Correct usage patterns** - ARIA used appropriately
|
|
17
|
+
4. **Redundant ARIA** - Native HTML preferred
|
|
18
|
+
5. **Live regions** - Dynamic content announced
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Input
|
|
23
|
+
|
|
24
|
+
| Parameter | Required | Description |
|
|
25
|
+
|-----------|----------|-------------|
|
|
26
|
+
| `path` | Yes | Directory to audit (e.g., `./app/components`) |
|
|
27
|
+
| `--strict` | No | Fail on warnings too (not just errors) |
|
|
28
|
+
| `--fix` | No | Auto-fix simple issues |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Execution Steps
|
|
33
|
+
|
|
34
|
+
### Phase 1: ARIA Attribute Discovery
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
interface AriaUsage {
|
|
38
|
+
attribute: string; // aria-label, role, etc.
|
|
39
|
+
value: string;
|
|
40
|
+
element: string; // HTML element
|
|
41
|
+
file: string;
|
|
42
|
+
line: number;
|
|
43
|
+
valid: boolean;
|
|
44
|
+
issues: AriaIssue[];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// All ARIA attributes to scan
|
|
48
|
+
const ariaAttributes = [
|
|
49
|
+
// Roles
|
|
50
|
+
'role',
|
|
51
|
+
// States & Properties
|
|
52
|
+
'aria-activedescendant', 'aria-atomic', 'aria-autocomplete',
|
|
53
|
+
'aria-braillelabel', 'aria-brailleroledescription', 'aria-busy',
|
|
54
|
+
'aria-checked', 'aria-colcount', 'aria-colindex', 'aria-colspan',
|
|
55
|
+
'aria-controls', 'aria-current', 'aria-describedby', 'aria-description',
|
|
56
|
+
'aria-details', 'aria-disabled', 'aria-dropeffect', 'aria-errormessage',
|
|
57
|
+
'aria-expanded', 'aria-flowto', 'aria-grabbed', 'aria-haspopup',
|
|
58
|
+
'aria-hidden', 'aria-invalid', 'aria-keyshortcuts', 'aria-label',
|
|
59
|
+
'aria-labelledby', 'aria-level', 'aria-live', 'aria-modal',
|
|
60
|
+
'aria-multiline', 'aria-multiselectable', 'aria-orientation',
|
|
61
|
+
'aria-owns', 'aria-placeholder', 'aria-posinset', 'aria-pressed',
|
|
62
|
+
'aria-readonly', 'aria-relevant', 'aria-required', 'aria-roledescription',
|
|
63
|
+
'aria-rowcount', 'aria-rowindex', 'aria-rowspan', 'aria-selected',
|
|
64
|
+
'aria-setsize', 'aria-sort', 'aria-valuemax', 'aria-valuemin',
|
|
65
|
+
'aria-valuenow', 'aria-valuetext'
|
|
66
|
+
];
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Phase 2: Role Validation
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
interface RoleAudit {
|
|
73
|
+
role: string;
|
|
74
|
+
element: string;
|
|
75
|
+
file: string;
|
|
76
|
+
line: number;
|
|
77
|
+
checks: {
|
|
78
|
+
validRole: boolean; // Role exists in ARIA spec
|
|
79
|
+
appropriateElement: boolean; // Role appropriate for element
|
|
80
|
+
hasRequiredProps: boolean; // Required aria-* present
|
|
81
|
+
hasAllowedProps: boolean; // No disallowed aria-*
|
|
82
|
+
redundant: boolean; // Native HTML would suffice
|
|
83
|
+
};
|
|
84
|
+
requiredProps: string[]; // What's required
|
|
85
|
+
missingProps: string[]; // What's missing
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Required properties by role
|
|
89
|
+
const roleRequirements: Record<string, string[]> = {
|
|
90
|
+
'checkbox': ['aria-checked'],
|
|
91
|
+
'combobox': ['aria-expanded', 'aria-controls'],
|
|
92
|
+
'heading': ['aria-level'],
|
|
93
|
+
'meter': ['aria-valuenow'],
|
|
94
|
+
'option': [], // aria-selected recommended
|
|
95
|
+
'radio': ['aria-checked'],
|
|
96
|
+
'scrollbar': ['aria-controls', 'aria-valuenow'],
|
|
97
|
+
'separator': [], // if focusable: aria-valuenow
|
|
98
|
+
'slider': ['aria-valuenow'],
|
|
99
|
+
'spinbutton': ['aria-valuenow'],
|
|
100
|
+
'switch': ['aria-checked'],
|
|
101
|
+
'tab': [], // aria-selected recommended
|
|
102
|
+
'tabpanel': [], // aria-labelledby recommended
|
|
103
|
+
'treeitem': [], // aria-expanded if has children
|
|
104
|
+
};
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Phase 3: Common ARIA Errors Detection
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
type AriaIssue =
|
|
111
|
+
// Invalid usage
|
|
112
|
+
| 'invalid-role' // Role doesn't exist
|
|
113
|
+
| 'invalid-attribute' // Attribute doesn't exist
|
|
114
|
+
| 'invalid-value' // Wrong value type/format
|
|
115
|
+
|
|
116
|
+
// Missing requirements
|
|
117
|
+
| 'missing-required-prop' // Required prop not present
|
|
118
|
+
| 'missing-accessible-name' // No label, labelledby, or content
|
|
119
|
+
|
|
120
|
+
// Incorrect usage
|
|
121
|
+
| 'redundant-role' // <button role="button">
|
|
122
|
+
| 'conflicting-semantics' // <nav role="navigation">
|
|
123
|
+
| 'aria-hidden-focusable' // aria-hidden with focusable child
|
|
124
|
+
| 'aria-label-on-generic' // aria-label on div/span without role
|
|
125
|
+
| 'broken-reference' // aria-labelledby points to missing id
|
|
126
|
+
|
|
127
|
+
// Bad patterns
|
|
128
|
+
| 'aria-live-wrong-value' // aria-live="true" instead of "polite"
|
|
129
|
+
| 'role-presentation-focusable' // role="presentation" on focusable
|
|
130
|
+
| 'nested-interactive' // Interactive inside interactive
|
|
131
|
+
| 'abstract-role'; // Using abstract role (widget, landmark)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Phase 4: Pattern-Specific Audits
|
|
135
|
+
|
|
136
|
+
#### Modals/Dialogs
|
|
137
|
+
```typescript
|
|
138
|
+
interface ModalAriaAudit {
|
|
139
|
+
component: string;
|
|
140
|
+
checks: {
|
|
141
|
+
hasRoleDialog: boolean; // role="dialog" or "alertdialog"
|
|
142
|
+
hasAriaModal: boolean; // aria-modal="true"
|
|
143
|
+
hasLabel: boolean; // aria-label or aria-labelledby
|
|
144
|
+
inertBackground: boolean; // Background has aria-hidden or inert
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
#### Tabs
|
|
150
|
+
```typescript
|
|
151
|
+
interface TabsAriaAudit {
|
|
152
|
+
component: string;
|
|
153
|
+
checks: {
|
|
154
|
+
tablistHasRole: boolean; // role="tablist"
|
|
155
|
+
tabsHaveRole: boolean; // role="tab"
|
|
156
|
+
panelsHaveRole: boolean; // role="tabpanel"
|
|
157
|
+
tabsHaveControls: boolean; // aria-controls on tabs
|
|
158
|
+
panelsHaveLabelledby: boolean; // aria-labelledby on panels
|
|
159
|
+
selectedManaged: boolean; // aria-selected on active tab
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
#### Forms
|
|
165
|
+
```typescript
|
|
166
|
+
interface FormAriaAudit {
|
|
167
|
+
component: string;
|
|
168
|
+
checks: {
|
|
169
|
+
inputsLabeled: boolean; // aria-label or associated label
|
|
170
|
+
requiredMarked: boolean; // aria-required="true"
|
|
171
|
+
errorsDescribed: boolean; // aria-describedby for errors
|
|
172
|
+
invalidMarked: boolean; // aria-invalid when error
|
|
173
|
+
liveRegionForErrors: boolean; // aria-live for error messages
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
#### Live Regions
|
|
179
|
+
```typescript
|
|
180
|
+
interface LiveRegionAudit {
|
|
181
|
+
component: string;
|
|
182
|
+
checks: {
|
|
183
|
+
hasAriaLive: boolean;
|
|
184
|
+
liveValue: 'polite' | 'assertive' | 'off';
|
|
185
|
+
ariaAtomic: boolean; // Updates read as whole
|
|
186
|
+
ariaRelevant: string; // additions, removals, text, all
|
|
187
|
+
};
|
|
188
|
+
dynamicContent: Array<{
|
|
189
|
+
file: string;
|
|
190
|
+
line: number;
|
|
191
|
+
hasLiveRegion: boolean; // Dynamic content needs aria-live
|
|
192
|
+
}>;
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Phase 5: Semantic HTML vs ARIA
|
|
197
|
+
|
|
198
|
+
Detect cases where native HTML is better:
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
interface RedundantAriaAudit {
|
|
202
|
+
pattern: string;
|
|
203
|
+
occurrences: number;
|
|
204
|
+
recommendation: string;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const redundantPatterns = [
|
|
208
|
+
{ pattern: '<button role="button">', fix: '<button>' },
|
|
209
|
+
{ pattern: '<a href role="link">', fix: '<a href>' },
|
|
210
|
+
{ pattern: '<nav role="navigation">', fix: '<nav>' },
|
|
211
|
+
{ pattern: '<main role="main">', fix: '<main>' },
|
|
212
|
+
{ pattern: '<header role="banner">', fix: '<header>' },
|
|
213
|
+
{ pattern: '<footer role="contentinfo">', fix: '<footer>' },
|
|
214
|
+
{ pattern: '<aside role="complementary">', fix: '<aside>' },
|
|
215
|
+
{ pattern: '<article role="article">', fix: '<article>' },
|
|
216
|
+
{ pattern: '<input type="checkbox" role="checkbox">', fix: '<input type="checkbox">' },
|
|
217
|
+
{ pattern: '<input type="radio" role="radio">', fix: '<input type="radio">' },
|
|
218
|
+
];
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Output
|
|
224
|
+
|
|
225
|
+
### 1. ARIA Audit Report
|
|
226
|
+
|
|
227
|
+
```markdown
|
|
228
|
+
# ARIA Audit Report
|
|
229
|
+
|
|
230
|
+
**Path:** ./app/components
|
|
231
|
+
**Date:** 2026-01-05
|
|
232
|
+
**Components Scanned:** 156
|
|
233
|
+
|
|
234
|
+
## Summary
|
|
235
|
+
|
|
236
|
+
| Category | Issues | Critical | Serious | Moderate |
|
|
237
|
+
|----------|--------|----------|---------|----------|
|
|
238
|
+
| Invalid ARIA | 3 | 2 | 1 | 0 |
|
|
239
|
+
| Missing Props | 8 | 4 | 3 | 1 |
|
|
240
|
+
| Incorrect Usage | 12 | 3 | 6 | 3 |
|
|
241
|
+
| Redundant ARIA | 15 | 0 | 0 | 15 |
|
|
242
|
+
| Live Regions | 5 | 2 | 3 | 0 |
|
|
243
|
+
| **Total** | **43** | **11** | **13** | **19** |
|
|
244
|
+
|
|
245
|
+
## Critical Issues
|
|
246
|
+
|
|
247
|
+
### 1. ❌ Missing accessible name
|
|
248
|
+
|
|
249
|
+
**File:** `app/components/ui/IconButton.tsx:23`
|
|
250
|
+
**Element:** `<button aria-label={undefined}>`
|
|
251
|
+
**Problem:** Button has no accessible name
|
|
252
|
+
|
|
253
|
+
**Current:**
|
|
254
|
+
```tsx
|
|
255
|
+
<button onClick={onClick}>
|
|
256
|
+
<SearchIcon />
|
|
257
|
+
</button>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**Fix:**
|
|
261
|
+
```tsx
|
|
262
|
+
<button onClick={onClick} aria-label="Search">
|
|
263
|
+
<SearchIcon />
|
|
264
|
+
</button>
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
### 2. ❌ aria-hidden with focusable children
|
|
270
|
+
|
|
271
|
+
**File:** `app/components/modals/Sidebar.tsx:45`
|
|
272
|
+
**Element:** `<div aria-hidden="true">`
|
|
273
|
+
**Problem:** Hidden container has focusable button inside
|
|
274
|
+
|
|
275
|
+
**Current:**
|
|
276
|
+
```tsx
|
|
277
|
+
<div aria-hidden="true">
|
|
278
|
+
<button>Click me</button> {/* ❌ Focusable but hidden */}
|
|
279
|
+
</div>
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**Fix:**
|
|
283
|
+
```tsx
|
|
284
|
+
<div aria-hidden="true" inert> {/* Add inert attribute */}
|
|
285
|
+
<button tabIndex={-1}>Click me</button>
|
|
286
|
+
</div>
|
|
287
|
+
// OR remove aria-hidden if content should be accessible
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
### 3. ❌ Missing required aria-checked
|
|
293
|
+
|
|
294
|
+
**File:** `app/components/ui/Toggle.tsx:12`
|
|
295
|
+
**Element:** `<div role="switch">`
|
|
296
|
+
**Problem:** Switch role requires aria-checked
|
|
297
|
+
|
|
298
|
+
**Current:**
|
|
299
|
+
```tsx
|
|
300
|
+
<div role="switch" onClick={toggle}>
|
|
301
|
+
{isOn ? 'On' : 'Off'}
|
|
302
|
+
</div>
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
**Fix:**
|
|
306
|
+
```tsx
|
|
307
|
+
<button
|
|
308
|
+
role="switch"
|
|
309
|
+
aria-checked={isOn}
|
|
310
|
+
onClick={toggle}
|
|
311
|
+
>
|
|
312
|
+
{isOn ? 'On' : 'Off'}
|
|
313
|
+
</button>
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
### 4. ❌ Broken aria-labelledby reference
|
|
319
|
+
|
|
320
|
+
**File:** `app/components/modals/ConfirmDialog.tsx:8`
|
|
321
|
+
**Element:** `<div role="dialog" aria-labelledby="dialog-title">`
|
|
322
|
+
**Problem:** No element with id="dialog-title" exists
|
|
323
|
+
|
|
324
|
+
**Fix:** Add id to heading:
|
|
325
|
+
```tsx
|
|
326
|
+
<div role="dialog" aria-labelledby="dialog-title" aria-modal="true">
|
|
327
|
+
<h2 id="dialog-title">Confirm Action</h2> {/* Add id */}
|
|
328
|
+
...
|
|
329
|
+
</div>
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
### 5. ❌ Dynamic content without live region
|
|
335
|
+
|
|
336
|
+
**File:** `app/components/ui/Toast.tsx:34`
|
|
337
|
+
**Problem:** Toast messages not announced to screen readers
|
|
338
|
+
|
|
339
|
+
**Current:**
|
|
340
|
+
```tsx
|
|
341
|
+
{toast && <div className="toast">{toast.message}</div>}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**Fix:**
|
|
345
|
+
```tsx
|
|
346
|
+
<div aria-live="polite" aria-atomic="true">
|
|
347
|
+
{toast && <div className="toast">{toast.message}</div>}
|
|
348
|
+
</div>
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## Redundant ARIA (Moderate)
|
|
354
|
+
|
|
355
|
+
| Pattern | Count | Recommendation |
|
|
356
|
+
|---------|-------|----------------|
|
|
357
|
+
| `<button role="button">` | 5 | Remove role |
|
|
358
|
+
| `<nav role="navigation">` | 3 | Remove role |
|
|
359
|
+
| `<main role="main">` | 2 | Remove role |
|
|
360
|
+
| `<a href role="link">` | 4 | Remove role |
|
|
361
|
+
| `<header role="banner">` | 1 | Remove role |
|
|
362
|
+
|
|
363
|
+
**Note:** These work but are verbose. Native HTML provides the same semantics.
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## Component-Specific Audits
|
|
368
|
+
|
|
369
|
+
### Modals/Dialogs
|
|
370
|
+
|
|
371
|
+
| Component | role=dialog | aria-modal | Labeled | Traps Focus |
|
|
372
|
+
|-----------|-------------|------------|---------|-------------|
|
|
373
|
+
| ConfirmDialog | ✓ | ✗ | ✗ | ✗ |
|
|
374
|
+
| AlertModal | ✓ | ✓ | ✓ | ✓ |
|
|
375
|
+
| Drawer | ✗ | ✗ | ✗ | ✗ |
|
|
376
|
+
|
|
377
|
+
### Tabs
|
|
378
|
+
|
|
379
|
+
| Component | tablist | tabs | panels | Controls | Labeled |
|
|
380
|
+
|-----------|---------|------|--------|----------|---------|
|
|
381
|
+
| TabGroup | ✓ | ✓ | ✓ | ✗ | ✗ |
|
|
382
|
+
| Navigation | ✗ | ✗ | N/A | N/A | N/A |
|
|
383
|
+
|
|
384
|
+
### Forms
|
|
385
|
+
|
|
386
|
+
| Component | Labeled | Required | Errors | Invalid |
|
|
387
|
+
|-----------|---------|----------|--------|---------|
|
|
388
|
+
| LoginForm | ✓ | ✓ | ✗ | ✗ |
|
|
389
|
+
| SearchInput | ✗ | N/A | N/A | N/A |
|
|
390
|
+
| ContactForm | ✓ | ✓ | ✓ | ✓ |
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## ARIA Best Practices Reference
|
|
395
|
+
|
|
396
|
+
### First Rule of ARIA
|
|
397
|
+
> Don't use ARIA if you can use native HTML.
|
|
398
|
+
|
|
399
|
+
```tsx
|
|
400
|
+
// ❌ Bad
|
|
401
|
+
<div role="button" tabIndex={0} onClick={fn}>Click</div>
|
|
402
|
+
|
|
403
|
+
// ✅ Good
|
|
404
|
+
<button onClick={fn}>Click</button>
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### Required Accessible Names
|
|
408
|
+
|
|
409
|
+
These elements MUST have accessible names:
|
|
410
|
+
- `role="dialog"` - via aria-label or aria-labelledby
|
|
411
|
+
- `role="alertdialog"` - via aria-label or aria-labelledby
|
|
412
|
+
- `<img>` - via alt
|
|
413
|
+
- `<button>` with icon only - via aria-label
|
|
414
|
+
- `<a>` with icon only - via aria-label
|
|
415
|
+
- Form inputs - via `<label>`, aria-label, or aria-labelledby
|
|
416
|
+
|
|
417
|
+
### Live Region Guidelines
|
|
418
|
+
|
|
419
|
+
| Urgency | Use | Example |
|
|
420
|
+
|---------|-----|---------|
|
|
421
|
+
| Polite | `aria-live="polite"` | Toast notifications, search results |
|
|
422
|
+
| Assertive | `aria-live="assertive"` | Errors, critical alerts |
|
|
423
|
+
| Off | `aria-live="off"` | Frequently updating content (stock tickers) |
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## Auto-Fix (with --fix flag)
|
|
429
|
+
|
|
430
|
+
```typescript
|
|
431
|
+
// Auto-fixable patterns
|
|
432
|
+
|
|
433
|
+
// 1. Remove redundant roles
|
|
434
|
+
- <button role="button">
|
|
435
|
+
+ <button>
|
|
436
|
+
|
|
437
|
+
// 2. Add missing aria-checked to switches
|
|
438
|
+
- <div role="switch">
|
|
439
|
+
+ <div role="switch" aria-checked={value}>
|
|
440
|
+
|
|
441
|
+
// 3. Fix aria-live="true" (invalid)
|
|
442
|
+
- <div aria-live="true">
|
|
443
|
+
+ <div aria-live="polite">
|
|
444
|
+
|
|
445
|
+
// 4. Add aria-label to icon buttons
|
|
446
|
+
- <button><Icon /></button>
|
|
447
|
+
+ <button aria-label="Icon description"><Icon /></button>
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## Integration
|
|
453
|
+
|
|
454
|
+
```bash
|
|
455
|
+
# Full ARIA audit
|
|
456
|
+
*aria-audit ./app/components
|
|
457
|
+
|
|
458
|
+
# Strict mode (fail on warnings)
|
|
459
|
+
*aria-audit ./app/components --strict
|
|
460
|
+
|
|
461
|
+
# Auto-fix simple issues
|
|
462
|
+
*aria-audit ./app/components --fix
|
|
463
|
+
|
|
464
|
+
# As part of full audit
|
|
465
|
+
*a11y-audit ./app/components --scope aria
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## Failure Handling
|
|
471
|
+
|
|
472
|
+
- **ARIA attribute validation against outdated spec:** Use WAI-ARIA 1.2 as baseline. Flag attributes only in 1.3 draft as "warning" not "error"
|
|
473
|
+
- **Broken aria-labelledby references due to dynamic IDs:** Skip dynamic ID patterns (e.g., `id={uniqueId}`), log as "dynamic reference — requires runtime validation"
|
|
474
|
+
- **Live region detection misses framework-specific patterns:** Check for React portals, Vue teleport, and framework toast libraries in addition to raw aria-live attributes
|
|
475
|
+
- **Strict mode (--strict) produces excessive warnings:** Cap warnings at 50 per category, summarize remainder as "and {N} more similar warnings"
|
|
476
|
+
|
|
477
|
+
## State Update
|
|
478
|
+
|
|
479
|
+
```yaml
|
|
480
|
+
aria_audit:
|
|
481
|
+
last_run: "2026-01-05T14:30:00Z"
|
|
482
|
+
path: "./app/components"
|
|
483
|
+
results:
|
|
484
|
+
total_issues: 43
|
|
485
|
+
critical: 11
|
|
486
|
+
serious: 13
|
|
487
|
+
moderate: 19
|
|
488
|
+
categories:
|
|
489
|
+
invalid_aria: 3
|
|
490
|
+
missing_props: 8
|
|
491
|
+
incorrect_usage: 12
|
|
492
|
+
redundant: 15
|
|
493
|
+
live_regions: 5
|
|
494
|
+
patterns_found:
|
|
495
|
+
modals_without_aria_modal: 2
|
|
496
|
+
icon_buttons_without_label: 4
|
|
497
|
+
broken_references: 2
|
|
498
|
+
auto_fixed: 0
|
|
499
|
+
next_action: "Fix 11 critical ARIA issues"
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
## Success Criteria
|
|
505
|
+
|
|
506
|
+
- [ ] All ARIA attributes validated against WAI-ARIA 1.2 spec
|
|
507
|
+
- [ ] Zero invalid or deprecated ARIA attributes remain
|
|
508
|
+
- [ ] All interactive roles have required aria-* properties
|
|
509
|
+
- [ ] No redundant ARIA on native HTML elements (e.g., `role="button"` on `<button>`)
|
|
510
|
+
- [ ] Live regions (`aria-live`) properly configured for dynamic content
|
|
511
|
+
- [ ] Report generated with file:line references for every finding
|
|
512
|
+
- [ ] Severity classification (error/warning/info) applied to each issue
|
|
513
|
+
|
|
514
|
+
---
|
|
515
|
+
|
|
516
|
+
**Brad says:** "First rule of ARIA: Don't use ARIA. Use semantic HTML. Second rule: If you use ARIA, use it correctly."
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
## Related Checklists
|
|
520
|
+
|
|
521
|
+
- `squads/design/checklists/ds-accessibility-wcag-checklist.md`
|
|
522
|
+
- `squads/design/checklists/ds-a11y-release-gate-checklist.md`
|
|
523
|
+
|
|
524
|
+
## Process Guards
|
|
525
|
+
- **On Fail:** Stop execution, capture evidence, and return remediation steps before proceeding.
|