wicked-garden 12.27.0
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/.claude-plugin/archetypes.json +166 -0
- package/.claude-plugin/components.json +75 -0
- package/.claude-plugin/marketplace.json +15 -0
- package/.claude-plugin/plugin.json +174 -0
- package/.claude-plugin/specialist.json +48 -0
- package/.claude-plugin/stack-registry.json +96 -0
- package/AGENTS.md +13 -0
- package/CHANGELOG.md +712 -0
- package/CONTRIBUTING.md +99 -0
- package/ETHOS.md +83 -0
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/WICKED_GARDEN_BUS_EVENTS.md +149 -0
- package/agents/agentic/architect.md +449 -0
- package/agents/agentic/performance-analyst.md +702 -0
- package/agents/agentic/safety-reviewer.md +662 -0
- package/agents/crew/implementer.md +163 -0
- package/agents/crew/researcher.md +94 -0
- package/agents/crew/reviewer.md +184 -0
- package/agents/data/data-engineer.md +227 -0
- package/agents/engineering/api-documentarian.md +440 -0
- package/agents/engineering/migration-engineer.md +301 -0
- package/agents/engineering/solution-architect.md +208 -0
- package/agents/jam/brainstorm-facilitator.md +297 -0
- package/agents/jam/council.md +322 -0
- package/agents/jam/quick-facilitator.md +85 -0
- package/agents/persona/persona-agent.md +121 -0
- package/agents/platform/compliance-officer.md +266 -0
- package/agents/platform/privacy-expert.md +496 -0
- package/agents/platform/security-engineer.md +287 -0
- package/agents/product/a11y-expert.md +323 -0
- package/agents/product/requirements-analyst.md +238 -0
- package/agents/product/ui-reviewer.md +180 -0
- package/agents/product/ux-designer.md +199 -0
- package/agents/product/value-strategist.md +269 -0
- package/agents/qe/semantic-reviewer.md +78 -0
- package/commands/agentic/audit.md +24 -0
- package/commands/agentic/design.md +24 -0
- package/commands/agentic/frameworks.md +25 -0
- package/commands/agentic/review.md +27 -0
- package/commands/archetype/build.md +12 -0
- package/commands/archetype/decide.md +12 -0
- package/commands/archetype/explore.md +12 -0
- package/commands/archetype/incident.md +12 -0
- package/commands/archetype/migrate.md +12 -0
- package/commands/archetype/modernize.md +12 -0
- package/commands/archetype/review.md +14 -0
- package/commands/archetype/ship.md +12 -0
- package/commands/archetype/specify.md +12 -0
- package/commands/archetype/triage.md +12 -0
- package/commands/compile.md +37 -0
- package/commands/data/analyze.md +18 -0
- package/commands/data/data.md +21 -0
- package/commands/data/ml.md +18 -0
- package/commands/data/ontology.md +22 -0
- package/commands/data/pipeline.md +17 -0
- package/commands/deliberate.md +181 -0
- package/commands/engineering/add-field.md +77 -0
- package/commands/engineering/apply.md +58 -0
- package/commands/engineering/arch.md +26 -0
- package/commands/engineering/debug.md +27 -0
- package/commands/engineering/docs.md +27 -0
- package/commands/engineering/new-generator.md +257 -0
- package/commands/engineering/patch-plan.md +59 -0
- package/commands/engineering/plan.md +29 -0
- package/commands/engineering/remove.md +48 -0
- package/commands/engineering/rename.md +44 -0
- package/commands/engineering/review.md +32 -0
- package/commands/help.md +128 -0
- package/commands/install.md +118 -0
- package/commands/intent.md +54 -0
- package/commands/jam/brainstorm.md +37 -0
- package/commands/jam/council.md +49 -0
- package/commands/jam/quick.md +21 -0
- package/commands/jam/revisit.md +79 -0
- package/commands/persona/as.md +136 -0
- package/commands/persona/define.md +24 -0
- package/commands/persona/list.md +118 -0
- package/commands/platform/actions.md +20 -0
- package/commands/platform/assert.md +18 -0
- package/commands/platform/audit.md +23 -0
- package/commands/platform/compliance.md +20 -0
- package/commands/platform/gh.md +22 -0
- package/commands/platform/health.md +22 -0
- package/commands/platform/incident.md +23 -0
- package/commands/platform/infra.md +24 -0
- package/commands/platform/peer-health.md +103 -0
- package/commands/platform/plugin-health.md +58 -0
- package/commands/platform/security.md +38 -0
- package/commands/platform/toolchain.md +96 -0
- package/commands/platform/traces.md +20 -0
- package/commands/product/a11y.md +19 -0
- package/commands/product/acceptance.md +19 -0
- package/commands/product/align.md +20 -0
- package/commands/product/analyze.md +23 -0
- package/commands/product/elicit.md +19 -0
- package/commands/product/listen.md +24 -0
- package/commands/product/mockup.md +20 -0
- package/commands/product/screenshot.md +19 -0
- package/commands/product/strategy.md +40 -0
- package/commands/product/synthesize.md +23 -0
- package/commands/product/ux-review.md +42 -0
- package/commands/product/ux.md +20 -0
- package/commands/product/visual-direction.md +34 -0
- package/commands/prove.md +47 -0
- package/commands/report-issue.md +243 -0
- package/commands/reset.md +144 -0
- package/commands/search/blast-radius.md +58 -0
- package/commands/search/hotspots.md +55 -0
- package/commands/search/index.md +38 -0
- package/commands/search/lineage.md +47 -0
- package/commands/search/service-map.md +79 -0
- package/commands/setup.md +363 -0
- package/commands/smaht/briefing.md +200 -0
- package/commands/smaht/events-import.md +95 -0
- package/commands/smaht/state.md +19 -0
- package/commands/where-am-i.md +58 -0
- package/docs/README.md +32 -0
- package/docs/adr/0001-code-relationship-graph-engine.md +116 -0
- package/docs/adr/0002-major-cleanup-keep-cut.md +91 -0
- package/docs/adr/0003-peers-gate-required-layers-optin.md +41 -0
- package/docs/adr/0004-code-graph-moves-to-wicked-brain.md +47 -0
- package/docs/brain-chunk-format.md +135 -0
- package/docs/compiler.md +95 -0
- package/docs/daemon-api.md +70 -0
- package/docs/domains.md +197 -0
- package/docs/getting-started.md +208 -0
- package/docs/plans/2026-06-08-wicked-loom-conduct.md +1337 -0
- package/docs/plans/2026-06-08-wicked-loom-contract.md +638 -0
- package/docs/plans/2026-06-08-wicked-loom-cutover.md +1300 -0
- package/docs/plans/2026-06-08-wicked-loom-expand-compose.md +843 -0
- package/docs/plans/2026-06-08-wicked-loom-flow-cutover.md +403 -0
- package/docs/plans/2026-06-10-codegraph-to-brain-phase1a-graph-core.md +838 -0
- package/docs/plans/2026-06-10-codegraph-to-brain-phase1b-injected-edges.md +44 -0
- package/docs/required-peers.md +60 -0
- package/docs/specs/2026-06-08-wicked-loom-extraction.md +225 -0
- package/docs/specs/2026-06-10-codegraph-to-brain-migration.md +168 -0
- package/docs/v11/archetypes.md +231 -0
- package/hooks/hooks.json +275 -0
- package/hooks/scripts/bootstrap.py +1797 -0
- package/hooks/scripts/invoke.py +62 -0
- package/hooks/scripts/notification.py +166 -0
- package/hooks/scripts/permission_request.py +223 -0
- package/hooks/scripts/post_tool.py +1374 -0
- package/hooks/scripts/pre_compact.py +272 -0
- package/hooks/scripts/pre_tool.py +1278 -0
- package/hooks/scripts/prompt_submit.py +1109 -0
- package/hooks/scripts/session_end.py +95 -0
- package/hooks/scripts/stop.py +624 -0
- package/hooks/scripts/subagent_lifecycle.py +464 -0
- package/hooks/scripts/subscribers/on_gate_decided.py +84 -0
- package/hooks/scripts/task_completed.py +322 -0
- package/hooks/scripts/worktree_guard.py +148 -0
- package/hooks/subscriptions/on_gate_decided.json +9 -0
- package/install.mjs +128 -0
- package/package.json +41 -0
- package/pyproject.toml +59 -0
- package/schemas/README.md +32 -0
- package/schemas/assert_contracts.json +37 -0
- package/schemas/health_probe.json +46 -0
- package/schemas/plugin_status.json +37 -0
- package/scripts/_adapters/__init__.py +166 -0
- package/scripts/_adapters/jira_adapter.py +18 -0
- package/scripts/_adapters/linear_adapter.py +18 -0
- package/scripts/_adapters/miro_adapter.py +18 -0
- package/scripts/_adapters/notion_adapter.py +18 -0
- package/scripts/_agents.py +357 -0
- package/scripts/_brain_ingest/__init__.py +2 -0
- package/scripts/_brain_ingest/session_fact_extractor.py +341 -0
- package/scripts/_brain_port.py +163 -0
- package/scripts/_bus.py +1081 -0
- package/scripts/_bus_catalog_gen.py +93 -0
- package/scripts/_bus_consumers.json +46 -0
- package/scripts/_bus_emit.py +43 -0
- package/scripts/_capability_registry.py +334 -0
- package/scripts/_capability_resolver.py +322 -0
- package/scripts/_domain_store.py +559 -0
- package/scripts/_event_log_reader.py +154 -0
- package/scripts/_event_schema.py +305 -0
- package/scripts/_event_store.py +397 -0
- package/scripts/_heavy_cadence.py +324 -0
- package/scripts/_integration_resolver.py +321 -0
- package/scripts/_logger.py +151 -0
- package/scripts/_loom.py +482 -0
- package/scripts/_paths.py +133 -0
- package/scripts/_python.sh +22 -0
- package/scripts/_run.py +137 -0
- package/scripts/_session.py +502 -0
- package/scripts/_validate_registry.py +1042 -0
- package/scripts/_wicked_testing_probe.py +277 -0
- package/scripts/agentic/analyze_agents.py +391 -0
- package/scripts/agentic/detect_framework.py +420 -0
- package/scripts/agentic/issue_taxonomy.py +357 -0
- package/scripts/agentic/pattern_scorer.py +434 -0
- package/scripts/classify/persist.py +169 -0
- package/scripts/compiler/compile.py +552 -0
- package/scripts/compiler/phase0/VERDICT.md +60 -0
- package/scripts/compiler/phase0/detect.py +292 -0
- package/scripts/compiler/phase0/emit.py +228 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.bindings.json +30 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/.wg/evidence/honest-tests.txt +2 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/Enterprise-AISDLC.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/command_iq.bindings.json +45 -0
- package/scripts/compiler/phase0/evidence/command_iq.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/.projects/evidence-domain/phase-1-clarify/evidence/honest-tests.txt +3 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/command_iq.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/memos.bindings.json +28 -0
- package/scripts/compiler/phase0/evidence/memos.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/memos.stage/.wg/evidence/honest-tests.txt +2 -0
- package/scripts/compiler/phase0/evidence/memos.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/memos.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/verdict.json +104 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.bindings.json +29 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.lint-output.txt +17 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/failing-tests.txt +4 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/coverage/honest-tests.txt +3 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-fail.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/fab-missing.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/honest.build.md +8 -0
- package/scripts/compiler/phase0/evidence/wicked-bus.stage/wg_check_claims.py +174 -0
- package/scripts/compiler/phase0/evidence/wire-vault-transcript.txt +60 -0
- package/scripts/compiler/phase0/run_probe.py +234 -0
- package/scripts/compiler/phase0/wire_vault.py +310 -0
- package/scripts/crew/__init__.py +0 -0
- package/scripts/crew/_task_audit_writer.py +243 -0
- package/scripts/crew/_task_reader.py +389 -0
- package/scripts/crew/archetypes_v11.py +348 -0
- package/scripts/crew/detectors/__init__.py +12 -0
- package/scripts/crew/flow_compiler.py +121 -0
- package/scripts/crew/phase_manager.py +703 -0
- package/scripts/crew/scope_delta.py +264 -0
- package/scripts/crew/specialist_resolver.py +218 -0
- package/scripts/crew/stack_registry.py +189 -0
- package/scripts/data/data_profiler.py +271 -0
- package/scripts/data/ontology_recommender.py +231 -0
- package/scripts/data/schema_validator.py +267 -0
- package/scripts/delivery/drift.py +739 -0
- package/scripts/delivery/telemetry.py +614 -0
- package/scripts/engineering/patch/codegraph_db.py +125 -0
- package/scripts/engineering/patch/generators/__init__.py +56 -0
- package/scripts/engineering/patch/generators/base.py +373 -0
- package/scripts/engineering/patch/generators/csharp_generator.py +494 -0
- package/scripts/engineering/patch/generators/go_generator.py +430 -0
- package/scripts/engineering/patch/generators/java_generator.py +928 -0
- package/scripts/engineering/patch/generators/jsp_generator.py +454 -0
- package/scripts/engineering/patch/generators/kotlin_generator.py +561 -0
- package/scripts/engineering/patch/generators/perl_generator.py +510 -0
- package/scripts/engineering/patch/generators/php_generator.py +644 -0
- package/scripts/engineering/patch/generators/propagation_engine.py +929 -0
- package/scripts/engineering/patch/generators/python_generator.py +487 -0
- package/scripts/engineering/patch/generators/ruby_generator.py +463 -0
- package/scripts/engineering/patch/generators/rust_generator.py +400 -0
- package/scripts/engineering/patch/generators/sql_generator.py +594 -0
- package/scripts/engineering/patch/generators/typescript_generator.py +439 -0
- package/scripts/engineering/patch/patch.py +800 -0
- package/scripts/engineering/patch/safety.py +429 -0
- package/scripts/jam/__init__.py +0 -0
- package/scripts/jam/_bus_consumers.py +271 -0
- package/scripts/jam/agentic_cli_registry.py +703 -0
- package/scripts/jam/consensus.py +737 -0
- package/scripts/jam/detect_clis.py +409 -0
- package/scripts/jam/jam.py +283 -0
- package/scripts/jam/save_transcript.py +171 -0
- package/scripts/loom/__init__.py +22 -0
- package/scripts/loom/cli.py +170 -0
- package/scripts/loom/compose.py +180 -0
- package/scripts/loom/gate.py +120 -0
- package/scripts/loom/manifest.py +140 -0
- package/scripts/loom/resolve.py +59 -0
- package/scripts/persona/__init__.py +0 -0
- package/scripts/persona/registry.py +688 -0
- package/scripts/platform/guard_pipeline.py +1214 -0
- package/scripts/platform/guard_profiles.py +216 -0
- package/scripts/platform/observability/assert_contracts.py +434 -0
- package/scripts/platform/observability/health_probe.py +915 -0
- package/scripts/platform/observability/ops_log_viewer.py +209 -0
- package/scripts/platform/prereq_doctor.py +567 -0
- package/scripts/qe/conditions_manifest.py +260 -0
- package/scripts/qe/content_sanitizer.py +160 -0
- package/scripts/qe/coverage_tracker.py +535 -0
- package/scripts/qe/discover_scenarios.py +243 -0
- package/scripts/qe/evidence_tracker.py +232 -0
- package/scripts/qe/prove.py +196 -0
- package/scripts/qe/registry_lookup.py +80 -0
- package/scripts/qe/registry_store.py +176 -0
- package/scripts/qe/semantic_review.py +1005 -0
- package/scripts/qe/vault_gate.py +382 -0
- package/scripts/qe/verdict_audit.py +175 -0
- package/scripts/qe/verdict_schema.py +335 -0
- package/scripts/reset.py +220 -0
- package/scripts/resolve_path.py +22 -0
- package/scripts/sentinel/invariants.py +402 -0
- package/scripts/sentinel/pre_push.py +73 -0
- package/scripts/setup/__init__.py +1 -0
- package/scripts/setup/detect_state.py +114 -0
- package/scripts/setup/migrate_legacy.py +67 -0
- package/scripts/setup/migrate_v6_projects.py +232 -0
- package/scripts/setup/onboarding.py +114 -0
- package/scripts/smaht/_bus_consumers.py +98 -0
- package/scripts/smaht/adapters/__init__.py +83 -0
- package/scripts/smaht/adapters/brain_adapter.py +254 -0
- package/scripts/smaht/adapters/context7_adapter.py +438 -0
- package/scripts/smaht/adapters/delegation_adapter.py +104 -0
- package/scripts/smaht/adapters/domain_adapter.py +206 -0
- package/scripts/smaht/adapters/events_adapter.py +231 -0
- package/scripts/smaht/adapters/tools_adapter.py +49 -0
- package/scripts/smaht/cheatsheet_store.py +236 -0
- package/scripts/smaht/context_package.py +386 -0
- package/scripts/smaht/knowledge_graph.py +395 -0
- package/scripts/smaht/propose_skills.py +856 -0
- package/scripts/smaht/test_cheatsheet_store.py +428 -0
- package/scripts/statusline.py +151 -0
- package/scripts/where_am_i.py +236 -0
- package/skills/agentic/agentic-patterns/SKILL.md +91 -0
- package/skills/agentic/agentic-patterns/refs/anti-patterns-design.md +283 -0
- package/skills/agentic/agentic-patterns/refs/anti-patterns-operational.md +216 -0
- package/skills/agentic/agentic-patterns/refs/pattern-catalog.md +329 -0
- package/skills/agentic/context-engineering/SKILL.md +142 -0
- package/skills/agentic/context-engineering/refs/caching-and-optimization.md +251 -0
- package/skills/agentic/context-engineering/refs/compression-techniques.md +171 -0
- package/skills/agentic/context-engineering/refs/cost-calculation-budget.md +250 -0
- package/skills/agentic/context-engineering/refs/cost-optimization-reporting.md +300 -0
- package/skills/agentic/context-engineering/refs/selective-loading.md +179 -0
- package/skills/agentic/frameworks/SKILL.md +191 -0
- package/skills/agentic/frameworks/refs/framework-profiles-1.md +209 -0
- package/skills/agentic/frameworks/refs/framework-profiles-2.md +214 -0
- package/skills/agentic/frameworks/refs/migration-patterns-paths.md +267 -0
- package/skills/agentic/frameworks/refs/migration-patterns-testing.md +208 -0
- package/skills/agentic/refs/audit.md +134 -0
- package/skills/agentic/refs/design.md +137 -0
- package/skills/agentic/refs/frameworks.md +102 -0
- package/skills/agentic/refs/review.md +160 -0
- package/skills/agentic/review-methodology/SKILL.md +186 -0
- package/skills/agentic/review-methodology/refs/deliverable-templates.md +246 -0
- package/skills/agentic/review-methodology/refs/issue-taxonomy-quality-testing.md +277 -0
- package/skills/agentic/review-methodology/refs/issue-taxonomy-reliability-safety.md +253 -0
- package/skills/agentic/trust-and-safety/SKILL.md +177 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-actions.md +246 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-input-output.md +238 -0
- package/skills/agentic/trust-and-safety/refs/guardrails-resources.md +209 -0
- package/skills/agentic/trust-and-safety/refs/safety-checklist-advanced.md +209 -0
- package/skills/agentic/trust-and-safety/refs/safety-checklist-core.md +215 -0
- package/skills/archetype/SKILL.md +104 -0
- package/skills/archetype/refs/build.md +142 -0
- package/skills/archetype/refs/decide.md +117 -0
- package/skills/archetype/refs/explore.md +66 -0
- package/skills/archetype/refs/incident.md +149 -0
- package/skills/archetype/refs/migrate.md +170 -0
- package/skills/archetype/refs/modernize.md +187 -0
- package/skills/archetype/refs/review.md +145 -0
- package/skills/archetype/refs/ship.md +117 -0
- package/skills/archetype/refs/specify.md +108 -0
- package/skills/archetype/refs/triage.md +62 -0
- package/skills/classify/SKILL.md +157 -0
- package/skills/data/analysis/SKILL.md +125 -0
- package/skills/data/analysis/refs/templates.md +170 -0
- package/skills/data/data/SKILL.md +118 -0
- package/skills/data/data/refs/examples.md +235 -0
- package/skills/data/ml/SKILL.md +125 -0
- package/skills/data/ml/refs/templates.md +172 -0
- package/skills/data/pipeline/SKILL.md +136 -0
- package/skills/data/pipeline/refs/templates.md +175 -0
- package/skills/data/refs/analyze.md +123 -0
- package/skills/data/refs/data.md +95 -0
- package/skills/data/refs/ml.md +118 -0
- package/skills/data/refs/pipeline.md +92 -0
- package/skills/deliberate/SKILL.md +125 -0
- package/skills/deliberate/refs/architecture-lens.md +37 -0
- package/skills/deliberate/refs/assumptions-lens.md +43 -0
- package/skills/deliberate/refs/code-lens.md +38 -0
- package/skills/deliberate/refs/content-lens.md +37 -0
- package/skills/deliberate/refs/data-lens.md +43 -0
- package/skills/deliberate/refs/design-lens.md +37 -0
- package/skills/deliberate/refs/opportunity-patterns.md +107 -0
- package/skills/deliberate/refs/ops-lens.md +43 -0
- package/skills/deliberate/refs/product-lens.md +46 -0
- package/skills/deliberate/refs/rethink-framework.md +77 -0
- package/skills/deliberate/refs/security-lens.md +47 -0
- package/skills/deliberate/refs/testing-lens.md +45 -0
- package/skills/deliberate/refs/timing-lens.md +42 -0
- package/skills/engineering/architecture/SKILL.md +177 -0
- package/skills/engineering/architecture/refs/adr-template.md +268 -0
- package/skills/engineering/architecture/refs/architecture-template-deployment.md +176 -0
- package/skills/engineering/architecture/refs/architecture-template-design.md +300 -0
- package/skills/engineering/architecture/refs/examples-ecommerce-analytics.md +299 -0
- package/skills/engineering/architecture/refs/examples-saas-trading.md +291 -0
- package/skills/engineering/architecture/refs/patterns-advanced.md +238 -0
- package/skills/engineering/architecture/refs/patterns-structural.md +303 -0
- package/skills/engineering/backend/SKILL.md +102 -0
- package/skills/engineering/backend/refs/checklists.md +146 -0
- package/skills/engineering/backend/refs/patterns.md +181 -0
- package/skills/engineering/debugging/SKILL.md +99 -0
- package/skills/engineering/debugging/refs/patterns.md +248 -0
- package/skills/engineering/debugging/refs/process.md +203 -0
- package/skills/engineering/docs/SKILL.md +97 -0
- package/skills/engineering/engineering/SKILL.md +88 -0
- package/skills/engineering/engineering/refs/checklists.md +91 -0
- package/skills/engineering/engineering/refs/templates.md +71 -0
- package/skills/engineering/frontend/SKILL.md +92 -0
- package/skills/engineering/frontend/refs/checklists.md +96 -0
- package/skills/engineering/frontend/refs/patterns.md +167 -0
- package/skills/engineering/integration/SKILL.md +183 -0
- package/skills/engineering/integration/refs/error-handling-best-practices.md +139 -0
- package/skills/engineering/integration/refs/error-handling-error-classes-typescript.md +212 -0
- package/skills/engineering/integration/refs/error-handling-error-response-format.md +301 -0
- package/skills/engineering/integration/refs/error-handling-retry-strategies.md +190 -0
- package/skills/engineering/integration/refs/event-schemas-best-practices.md +225 -0
- package/skills/engineering/integration/refs/event-schemas-event-naming-conventions.md +303 -0
- package/skills/engineering/integration/refs/event-schemas-event-structure.md +288 -0
- package/skills/engineering/integration/refs/graphql-best-practices.md +138 -0
- package/skills/engineering/integration/refs/graphql-error-handling.md +198 -0
- package/skills/engineering/integration/refs/graphql-graphql-basics.md +197 -0
- package/skills/engineering/integration/refs/graphql-query-examples.md +226 -0
- package/skills/engineering/integration/refs/graphql-schema-design-patterns.md +280 -0
- package/skills/engineering/integration/refs/grpc-grpc-overview.md +246 -0
- package/skills/engineering/integration/refs/grpc-implementation-examples.md +269 -0
- package/skills/engineering/integration/refs/grpc-metadata-headers.md +304 -0
- package/skills/engineering/integration/refs/grpc-testing.md +49 -0
- package/skills/engineering/integration/refs/openapi-template.yaml +682 -0
- package/skills/engineering/integration/refs/resilience-best-practices.md +109 -0
- package/skills/engineering/integration/refs/resilience-circuit-breaker-pattern.md +302 -0
- package/skills/engineering/integration/refs/resilience-rate-limiting.md +245 -0
- package/skills/engineering/integration/refs/resilience-timeout-pattern.md +212 -0
- package/skills/engineering/integration/refs/rest-api-fundamentals.md +299 -0
- package/skills/engineering/integration/refs/rest-api-responses-security.md +302 -0
- package/skills/engineering/integration/refs/versioning-breaking-changes.md +237 -0
- package/skills/engineering/integration/refs/versioning-migration-strategies.md +257 -0
- package/skills/engineering/integration/refs/versioning-versioning-strategies.md +296 -0
- package/skills/engineering/large-scale-migration/SKILL.md +65 -0
- package/skills/engineering/patch/SKILL.md +184 -0
- package/skills/engineering/refs/arch.md +126 -0
- package/skills/engineering/refs/debug.md +142 -0
- package/skills/engineering/refs/docs.md +190 -0
- package/skills/engineering/refs/plan.md +109 -0
- package/skills/engineering/refs/review.md +138 -0
- package/skills/engineering/system-design/SKILL.md +154 -0
- package/skills/engineering/system-design/refs/anti-patterns-big-ball-of-mud.md +254 -0
- package/skills/engineering/system-design/refs/anti-patterns-circular-dependencies.md +241 -0
- package/skills/engineering/system-design/refs/anti-patterns-feature-envy.md +168 -0
- package/skills/engineering/system-design/refs/anti-patterns-god-object.md +247 -0
- package/skills/engineering/system-design/refs/component-template-lifecycle.md +210 -0
- package/skills/engineering/system-design/refs/component-template-maintenance.md +219 -0
- package/skills/engineering/system-design/refs/component-template-structure.md +276 -0
- package/skills/engineering/system-design/refs/dependencies-best-practices.md +260 -0
- package/skills/engineering/system-design/refs/dependencies-dependency-principles.md +295 -0
- package/skills/engineering/system-design/refs/dependencies-dependency-tracking.md +261 -0
- package/skills/engineering/system-design/refs/interface-template-lifecycle.md +211 -0
- package/skills/engineering/system-design/refs/interface-template-maintenance.md +212 -0
- package/skills/engineering/system-design/refs/interface-template-structure.md +269 -0
- package/skills/engineering/system-design/refs/patterns-dependency-injection.md +151 -0
- package/skills/engineering/system-design/refs/patterns-facade-pattern.md +257 -0
- package/skills/engineering/system-design/refs/patterns-layered-pattern.md +204 -0
- package/skills/engineering/system-design/refs/patterns-plugin-architecture.md +229 -0
- package/skills/engineering/unit-test-quality/SKILL.md +194 -0
- package/skills/ground/SKILL.md +130 -0
- package/skills/integration-discovery/SKILL.md +168 -0
- package/skills/integration-discovery/refs/capabilities.md +282 -0
- package/skills/integration-discovery/refs/cli-detection.md +295 -0
- package/skills/integration-discovery/refs/discovery-sources.md +233 -0
- package/skills/integration-discovery/refs/task-patterns.md +206 -0
- package/skills/jam/SKILL.md +45 -0
- package/skills/jam/refs/facilitation-patterns.md +125 -0
- package/skills/jam/refs/quick.md +64 -0
- package/skills/jam/refs/synthesis-patterns.md +114 -0
- package/skills/multi-model/SKILL.md +168 -0
- package/skills/multi-model/refs/aichat.md +119 -0
- package/skills/multi-model/refs/aider.md +100 -0
- package/skills/multi-model/refs/auditability.md +238 -0
- package/skills/multi-model/refs/codex.md +169 -0
- package/skills/multi-model/refs/context.md +306 -0
- package/skills/multi-model/refs/copilot.md +161 -0
- package/skills/multi-model/refs/examples.md +224 -0
- package/skills/multi-model/refs/gemini.md +185 -0
- package/skills/multi-model/refs/goose.md +112 -0
- package/skills/multi-model/refs/llm.md +124 -0
- package/skills/multi-model/refs/opencode.md +196 -0
- package/skills/multi-model/refs/orchestration.md +188 -0
- package/skills/multi-model/refs/pi.md +208 -0
- package/skills/persona/SKILL.md +144 -0
- package/skills/persona/refs/define.md +133 -0
- package/skills/platform/actions/refs/actions.md +114 -0
- package/skills/platform/audit/SKILL.md +174 -0
- package/skills/platform/audit/refs/audit.md +145 -0
- package/skills/platform/audit/refs/checklists-evidence-operations.md +144 -0
- package/skills/platform/audit/refs/checklists-gdpr-pci-evidence.md +213 -0
- package/skills/platform/audit/refs/checklists-soc2-hipaa.md +120 -0
- package/skills/platform/audit/refs/frameworks-gdpr-pci.md +225 -0
- package/skills/platform/audit/refs/frameworks-soc2-hipaa.md +228 -0
- package/skills/platform/compliance/SKILL.md +169 -0
- package/skills/platform/compliance/refs/checklists.md +303 -0
- package/skills/platform/compliance/refs/compliance.md +117 -0
- package/skills/platform/compliance/refs/frameworks.md +282 -0
- package/skills/platform/errors/SKILL.md +183 -0
- package/skills/platform/errors/refs/patterns.md +271 -0
- package/skills/platform/errors/refs/severity.md +264 -0
- package/skills/platform/gate-benchmark-rebaseline/SKILL.md +108 -0
- package/skills/platform/gh/refs/gh.md +105 -0
- package/skills/platform/gh-cli/SKILL.md +120 -0
- package/skills/platform/gh-cli/refs/automation.md +63 -0
- package/skills/platform/gh-cli/refs/gh-ops.md +103 -0
- package/skills/platform/gh-cli/refs/patterns.md +132 -0
- package/skills/platform/gh-cli/scripts/gh_ops.py +454 -0
- package/skills/platform/github-actions/SKILL.md +159 -0
- package/skills/platform/github-actions/refs/security.md +150 -0
- package/skills/platform/github-actions/refs/templates.md +230 -0
- package/skills/platform/github-actions/refs/troubleshooting.md +174 -0
- package/skills/platform/github-actions/scripts/workflow_gen.py +215 -0
- package/skills/platform/gitlab-ci/SKILL.md +140 -0
- package/skills/platform/gitlab-ci/refs/templates.md +223 -0
- package/skills/platform/gitlab-ci/refs/troubleshooting.md +213 -0
- package/skills/platform/glab-cli/SKILL.md +133 -0
- package/skills/platform/glab-cli/refs/ci-debugging.md +95 -0
- package/skills/platform/glab-cli/refs/glab-ops.md +78 -0
- package/skills/platform/glab-cli/refs/patterns.md +131 -0
- package/skills/platform/glab-cli/scripts/glab_ops.py +313 -0
- package/skills/platform/health/SKILL.md +177 -0
- package/skills/platform/health/refs/health.md +72 -0
- package/skills/platform/health/refs/sources.md +302 -0
- package/skills/platform/incident/refs/incident.md +136 -0
- package/skills/platform/infra/refs/infra.md +104 -0
- package/skills/platform/observability/SKILL.md +128 -0
- package/skills/platform/observability/refs/toolchain-discovery.md +243 -0
- package/skills/platform/prereq-doctor/SKILL.md +57 -0
- package/skills/platform/prereq-doctor/refs/tool-registry.md +58 -0
- package/skills/platform/traces/refs/traces.md +101 -0
- package/skills/product/acceptance-criteria/SKILL.md +193 -0
- package/skills/product/acceptance-criteria/refs/ac-anti-patterns.md +291 -0
- package/skills/product/acceptance-criteria/refs/ac-examples.md +277 -0
- package/skills/product/accessibility/SKILL.md +197 -0
- package/skills/product/accessibility/refs/aria-patterns-basics.md +250 -0
- package/skills/product/accessibility/refs/aria-patterns-dynamic.md +187 -0
- package/skills/product/accessibility/refs/aria-patterns-interactive.md +246 -0
- package/skills/product/accessibility/refs/audit-report-findings.md +248 -0
- package/skills/product/accessibility/refs/audit-report-results.md +276 -0
- package/skills/product/accessibility/refs/common-violations-html-css.md +270 -0
- package/skills/product/accessibility/refs/common-violations-interactive.md +303 -0
- package/skills/product/accessibility/refs/keyboard-testing-basics.md +222 -0
- package/skills/product/accessibility/refs/keyboard-testing-patterns.md +173 -0
- package/skills/product/accessibility/refs/screen-reader-testing-advanced.md +294 -0
- package/skills/product/accessibility/refs/screen-reader-testing-commands.md +255 -0
- package/skills/product/accessibility/refs/wcag-checklist.md +262 -0
- package/skills/product/analyze/SKILL.md +164 -0
- package/skills/product/analyze/refs/algorithms.md +238 -0
- package/skills/product/analyze/refs/sentiment-patterns.md +180 -0
- package/skills/product/imagery/SKILL.md +97 -0
- package/skills/product/imagery/alter/SKILL.md +105 -0
- package/skills/product/imagery/alter/refs/editing-reference.md +146 -0
- package/skills/product/imagery/create/SKILL.md +109 -0
- package/skills/product/imagery/create/refs/prompt-engineering.md +112 -0
- package/skills/product/imagery/create/refs/provider-reference.md +219 -0
- package/skills/product/imagery/review/SKILL.md +101 -0
- package/skills/product/imagery/review/refs/analysis-lenses.md +136 -0
- package/skills/product/imagery/review/refs/quality-gates.md +153 -0
- package/skills/product/imagery/scripts/analyze.sh +23 -0
- package/skills/product/imagery/scripts/edit.sh +14 -0
- package/skills/product/imagery/scripts/generate.sh +13 -0
- package/skills/product/imagery/scripts/provider.py +787 -0
- package/skills/product/listen/SKILL.md +175 -0
- package/skills/product/listen/refs/channels.md +220 -0
- package/skills/product/mockup/SKILL.md +106 -0
- package/skills/product/mockup/refs/templates.md +95 -0
- package/skills/product/refs/a11y.md +109 -0
- package/skills/product/refs/acceptance.md +79 -0
- package/skills/product/refs/align.md +67 -0
- package/skills/product/refs/analyze.md +77 -0
- package/skills/product/refs/elicit.md +67 -0
- package/skills/product/refs/listen.md +58 -0
- package/skills/product/refs/mockup.md +77 -0
- package/skills/product/refs/screenshot.md +59 -0
- package/skills/product/refs/strategy.md +77 -0
- package/skills/product/refs/synthesize.md +54 -0
- package/skills/product/refs/ux-review.md +68 -0
- package/skills/product/refs/ux.md +101 -0
- package/skills/product/requirements-analysis/SKILL.md +136 -0
- package/skills/product/requirements-analysis/refs/requirements-example-auth.md +264 -0
- package/skills/product/requirements-analysis/refs/requirements-example-export-integration.md +88 -0
- package/skills/product/requirements-analysis/refs/requirements-output-format-template.md +247 -0
- package/skills/product/requirements-analysis/refs/user-story-guide.md +296 -0
- package/skills/product/requirements-graph/SKILL.md +155 -0
- package/skills/product/requirements-graph/refs/examples.md +223 -0
- package/skills/product/requirements-graph/refs/schema.md +162 -0
- package/skills/product/requirements-migrate/SKILL.md +90 -0
- package/skills/product/requirements-navigate/SKILL.md +141 -0
- package/skills/product/requirements-navigate/refs/meta-templates.md +141 -0
- package/skills/product/screenshot/SKILL.md +147 -0
- package/skills/product/strategy/SKILL.md +198 -0
- package/skills/product/strategy/refs/frameworks.md +295 -0
- package/skills/product/strategy/refs/templates-competitive-market.md +299 -0
- package/skills/product/strategy/refs/templates-roi-value.md +207 -0
- package/skills/product/synthesize/SKILL.md +116 -0
- package/skills/product/synthesize/refs/journey-mapping.md +212 -0
- package/skills/product/synthesize/refs/prioritization.md +193 -0
- package/skills/product/ux-review/SKILL.md +164 -0
- package/skills/product/visual-direction/SKILL.md +137 -0
- package/skills/product/visual-review/SKILL.md +131 -0
- package/skills/runtime-exec/SKILL.md +138 -0
- package/skills/search/codebase-narrator/SKILL.md +131 -0
- package/skills/search/codebase-narrator/refs/output-template.md +100 -0
- package/skills/smaht/SKILL.md +72 -0
- package/skills/smaht/discovery/SKILL.md +65 -0
- package/skills/smaht/intent/SKILL.md +89 -0
- package/skills/smaht/propose-skills/SKILL.md +142 -0
- package/skills/smaht/refs/state.md +76 -0
- package/skills/swarm/SKILL.md +132 -0
- package/skills/swarm/refs/fan-out.md +104 -0
- package/skills/swarm/refs/independent-verification.md +86 -0
- package/skills/swarm/refs/receipts-and-evidence.md +69 -0
- package/skills/swarm/refs/recon-synthesis.md +87 -0
- package/skills/swarm/refs/ship-discipline.md +90 -0
- package/skills/wickedizer/SKILL.md +147 -0
- package/skills/wickedizer/refs/artifact-types.md +238 -0
- package/skills/wickedizer/refs/complexity.md +278 -0
- package/skills/wickedizer/refs/de-ai-pass.md +140 -0
- package/skills/wickedizer/refs/failure-modes.md +249 -0
- package/skills/wickedizer/refs/patterns.md +282 -0
- package/skills/wickedizer/refs/review.md +221 -0
- package/skills/wickedizer/refs/structure.md +282 -0
- package/skills/wickedizer/refs/voice-profile.md +125 -0
- package/skills/workflow/SKILL.md +132 -0
- package/skills/workflow/refs/archetype-adjustments.md +205 -0
- package/skills/workflow/refs/evidence.md +58 -0
- package/skills/workflow/refs/integration.md +130 -0
- package/skills/workflow/refs/risk-dimension-signals.md +260 -0
- package/skills/workflow/refs/scoring-rubric.md +49 -0
- package/skills/workflow/refs/signal-keywords.md +176 -0
- package/skills/workflow/refs/specialist-routing-rules.md +159 -0
- package/skills/worktrees/SKILL.md +87 -0
- package/skills/worktrees/refs/recipes.md +96 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase_relevance: ["clarify", "design", "review"]
|
|
3
|
+
archetype_relevance: ["*"]
|
|
4
|
+
---
|
|
5
|
+
# Common Accessibility Violations: Interactive Components
|
|
6
|
+
|
|
7
|
+
Violations in custom components, forms, keyboard navigation, dynamic content, and headings with fixes.
|
|
8
|
+
|
|
9
|
+
## 6. Inaccessible Custom Components
|
|
10
|
+
|
|
11
|
+
### Modal Without Proper ARIA
|
|
12
|
+
|
|
13
|
+
```html
|
|
14
|
+
<!-- ✗ VIOLATION -->
|
|
15
|
+
<div class="modal">
|
|
16
|
+
<div class="modal-content">
|
|
17
|
+
<h2>Confirm</h2>
|
|
18
|
+
<button>OK</button>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
<!-- ✓ FIX -->
|
|
23
|
+
<div class="modal"
|
|
24
|
+
role="dialog"
|
|
25
|
+
aria-modal="true"
|
|
26
|
+
aria-labelledby="modal-title">
|
|
27
|
+
<div class="modal-content">
|
|
28
|
+
<h2 id="modal-title">Confirm</h2>
|
|
29
|
+
<button>OK</button>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Dropdown Menu
|
|
35
|
+
|
|
36
|
+
```html
|
|
37
|
+
<!-- ✗ VIOLATION -->
|
|
38
|
+
<button onclick="toggleMenu()">Menu</button>
|
|
39
|
+
<div id="menu" style="display:none">
|
|
40
|
+
<a href="/home">Home</a>
|
|
41
|
+
<a href="/about">About</a>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<!-- ✓ FIX -->
|
|
45
|
+
<button onclick="toggleMenu()"
|
|
46
|
+
aria-expanded="false"
|
|
47
|
+
aria-controls="menu">
|
|
48
|
+
Menu
|
|
49
|
+
</button>
|
|
50
|
+
<div id="menu" hidden>
|
|
51
|
+
<a href="/home">Home</a>
|
|
52
|
+
<a href="/about">About</a>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<script>
|
|
56
|
+
function toggleMenu() {
|
|
57
|
+
const button = document.querySelector('[aria-controls="menu"]');
|
|
58
|
+
const menu = document.getElementById('menu');
|
|
59
|
+
const isExpanded = button.getAttribute('aria-expanded') === 'true';
|
|
60
|
+
|
|
61
|
+
button.setAttribute('aria-expanded', !isExpanded);
|
|
62
|
+
menu.hidden = isExpanded;
|
|
63
|
+
}
|
|
64
|
+
</script>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Tabs Without ARIA
|
|
68
|
+
|
|
69
|
+
```html
|
|
70
|
+
<!-- ✗ VIOLATION -->
|
|
71
|
+
<div class="tabs">
|
|
72
|
+
<button onclick="showTab(1)">Tab 1</button>
|
|
73
|
+
<button onclick="showTab(2)">Tab 2</button>
|
|
74
|
+
</div>
|
|
75
|
+
<div id="panel1">Content 1</div>
|
|
76
|
+
<div id="panel2" hidden>Content 2</div>
|
|
77
|
+
|
|
78
|
+
<!-- ✓ FIX -->
|
|
79
|
+
<div class="tabs" role="tablist">
|
|
80
|
+
<button role="tab"
|
|
81
|
+
aria-selected="true"
|
|
82
|
+
aria-controls="panel1"
|
|
83
|
+
id="tab1">
|
|
84
|
+
Tab 1
|
|
85
|
+
</button>
|
|
86
|
+
<button role="tab"
|
|
87
|
+
aria-selected="false"
|
|
88
|
+
aria-controls="panel2"
|
|
89
|
+
id="tab2">
|
|
90
|
+
Tab 2
|
|
91
|
+
</button>
|
|
92
|
+
</div>
|
|
93
|
+
<div id="panel1" role="tabpanel" aria-labelledby="tab1">
|
|
94
|
+
Content 1
|
|
95
|
+
</div>
|
|
96
|
+
<div id="panel2" role="tabpanel" aria-labelledby="tab2" hidden>
|
|
97
|
+
Content 2
|
|
98
|
+
</div>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 7. Form Validation Errors
|
|
102
|
+
|
|
103
|
+
**WCAG**: 3.3.1 Error Identification, 3.3.3 Error Suggestion (Level A, AA)
|
|
104
|
+
**Impact**: Users don't know what's wrong or how to fix it
|
|
105
|
+
|
|
106
|
+
### Error Not Announced
|
|
107
|
+
|
|
108
|
+
```html
|
|
109
|
+
<!-- ✗ VIOLATION - Error shown visually only -->
|
|
110
|
+
<input type="email" id="email">
|
|
111
|
+
<span class="error" style="display:none;">Invalid email</span>
|
|
112
|
+
|
|
113
|
+
<!-- ✓ FIX -->
|
|
114
|
+
<label for="email">Email</label>
|
|
115
|
+
<input type="email"
|
|
116
|
+
id="email"
|
|
117
|
+
aria-describedby="email-error"
|
|
118
|
+
aria-invalid="true">
|
|
119
|
+
<span id="email-error" role="alert" class="error">
|
|
120
|
+
Please enter a valid email address
|
|
121
|
+
</span>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Inline Validation
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
// ✗ VIOLATION - No ARIA update
|
|
128
|
+
input.addEventListener('blur', () => {
|
|
129
|
+
if (!isValid(input.value)) {
|
|
130
|
+
errorDiv.style.display = 'block';
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// ✓ FIX - ARIA attributes + live region
|
|
135
|
+
input.addEventListener('blur', () => {
|
|
136
|
+
if (!isValid(input.value)) {
|
|
137
|
+
input.setAttribute('aria-invalid', 'true');
|
|
138
|
+
input.setAttribute('aria-describedby', 'error-id');
|
|
139
|
+
errorDiv.setAttribute('role', 'alert');
|
|
140
|
+
errorDiv.textContent = 'Please enter a valid value';
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 8. Keyboard Navigation Issues
|
|
146
|
+
|
|
147
|
+
### Keyboard Trap
|
|
148
|
+
|
|
149
|
+
```javascript
|
|
150
|
+
// ✗ VIOLATION - Can't exit modal with keyboard
|
|
151
|
+
function openModal() {
|
|
152
|
+
modal.style.display = 'block';
|
|
153
|
+
modal.querySelector('button').focus();
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// ✓ FIX - Escape key closes modal
|
|
157
|
+
modal.addEventListener('keydown', (e) => {
|
|
158
|
+
if (e.key === 'Escape') {
|
|
159
|
+
closeModal();
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Missing Tab Index
|
|
165
|
+
|
|
166
|
+
```html
|
|
167
|
+
<!-- ✗ VIOLATION - Custom control not focusable -->
|
|
168
|
+
<div onclick="toggle()">Toggle</div>
|
|
169
|
+
|
|
170
|
+
<!-- ✓ FIX -->
|
|
171
|
+
<div tabindex="0"
|
|
172
|
+
role="button"
|
|
173
|
+
onclick="toggle()"
|
|
174
|
+
onkeydown="if(event.key==='Enter'||event.key===' ')toggle()">
|
|
175
|
+
Toggle
|
|
176
|
+
</div>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## 9. Dynamic Content Not Announced
|
|
180
|
+
|
|
181
|
+
**WCAG**: 4.1.3 Status Messages (Level AA)
|
|
182
|
+
**Impact**: Screen reader users miss important updates
|
|
183
|
+
|
|
184
|
+
### Loading State
|
|
185
|
+
|
|
186
|
+
```javascript
|
|
187
|
+
// ✗ VIOLATION - Visual spinner only
|
|
188
|
+
button.innerHTML = '<span class="spinner"></span>';
|
|
189
|
+
|
|
190
|
+
// ✓ FIX - Announce loading state
|
|
191
|
+
button.innerHTML = '<span role="status" aria-live="polite">Loading...</span>';
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Success Message
|
|
195
|
+
|
|
196
|
+
```javascript
|
|
197
|
+
// ✗ VIOLATION - Not announced
|
|
198
|
+
document.getElementById('message').textContent = 'Saved successfully';
|
|
199
|
+
|
|
200
|
+
// ✓ FIX - Use alert role
|
|
201
|
+
const message = document.getElementById('message');
|
|
202
|
+
message.setAttribute('role', 'alert');
|
|
203
|
+
message.textContent = 'Saved successfully';
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Live Region for Updates
|
|
207
|
+
|
|
208
|
+
```html
|
|
209
|
+
<!-- ✗ VIOLATION -->
|
|
210
|
+
<div id="results">
|
|
211
|
+
<!-- Results updated via JS, but not announced -->
|
|
212
|
+
</div>
|
|
213
|
+
|
|
214
|
+
<!-- ✓ FIX -->
|
|
215
|
+
<div id="results" role="region" aria-live="polite" aria-atomic="true">
|
|
216
|
+
<!-- Results announced when updated -->
|
|
217
|
+
</div>
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## 10. Heading Structure Issues
|
|
221
|
+
|
|
222
|
+
**WCAG**: 2.4.6 Headings and Labels (Level AA)
|
|
223
|
+
**Impact**: Screen reader users can't navigate page structure
|
|
224
|
+
|
|
225
|
+
### Skipped Heading Levels
|
|
226
|
+
|
|
227
|
+
```html
|
|
228
|
+
<!-- ✗ VIOLATION - Skips from h1 to h3 -->
|
|
229
|
+
<h1>Page Title</h1>
|
|
230
|
+
<h3>Section Title</h3>
|
|
231
|
+
|
|
232
|
+
<!-- ✓ FIX -->
|
|
233
|
+
<h1>Page Title</h1>
|
|
234
|
+
<h2>Section Title</h2>
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Multiple H1s
|
|
238
|
+
|
|
239
|
+
```html
|
|
240
|
+
<!-- ✗ VIOLATION - Multiple h1s confuse page structure -->
|
|
241
|
+
<h1>Site Name</h1>
|
|
242
|
+
<h1>Page Title</h1>
|
|
243
|
+
|
|
244
|
+
<!-- ✓ FIX - Single h1 per page -->
|
|
245
|
+
<div class="site-name">Site Name</div>
|
|
246
|
+
<h1>Page Title</h1>
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Non-Descriptive Headings
|
|
250
|
+
|
|
251
|
+
```html
|
|
252
|
+
<!-- ✗ VIOLATION -->
|
|
253
|
+
<h2>Click Here</h2>
|
|
254
|
+
|
|
255
|
+
<!-- ✓ FIX -->
|
|
256
|
+
<h2>Download Annual Report</h2>
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Quick Testing Checklist
|
|
260
|
+
|
|
261
|
+
Use this checklist to catch most violations:
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
□ All images have alt text (or alt="" if decorative)
|
|
265
|
+
□ All form inputs have associated labels
|
|
266
|
+
□ Color contrast meets 4.5:1 (normal text) or 3:1 (large text)
|
|
267
|
+
□ All interactive elements use semantic HTML or ARIA
|
|
268
|
+
□ Focus indicators visible on all focusable elements
|
|
269
|
+
□ Custom components have proper ARIA roles and states
|
|
270
|
+
□ Form errors announced and linked to fields
|
|
271
|
+
□ No keyboard traps (can Tab through and Escape modals)
|
|
272
|
+
□ Dynamic updates use role="alert" or aria-live
|
|
273
|
+
□ Heading structure logical (single h1, no skipped levels)
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## Automated Tools
|
|
277
|
+
|
|
278
|
+
Catch many of these violations automatically:
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
# Browser extensions
|
|
282
|
+
- axe DevTools
|
|
283
|
+
- WAVE
|
|
284
|
+
- Lighthouse
|
|
285
|
+
|
|
286
|
+
# CLI tools
|
|
287
|
+
npx @axe-core/cli https://example.com
|
|
288
|
+
npx pa11y https://example.com
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## Priority Fixes
|
|
292
|
+
|
|
293
|
+
If you have limited time, fix these first:
|
|
294
|
+
|
|
295
|
+
1. **Missing alt text** - Screen readers completely miss content
|
|
296
|
+
2. **Form labels** - Users can't complete tasks
|
|
297
|
+
3. **Color contrast** - Text unreadable for many users
|
|
298
|
+
4. **Keyboard access** - Blocks keyboard-only users
|
|
299
|
+
5. **Focus indicators** - Users get lost
|
|
300
|
+
|
|
301
|
+
## Resources
|
|
302
|
+
|
|
303
|
+
WebAIM WCAG Checklist · A11Y Style Guide (a11y-style-guide.com) · Inclusive Components (inclusive-components.design)
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase_relevance: ["clarify", "design", "review"]
|
|
3
|
+
archetype_relevance: ["*"]
|
|
4
|
+
---
|
|
5
|
+
# Keyboard Testing Guide: Basics
|
|
6
|
+
|
|
7
|
+
Core keyboard navigation testing for WCAG 2.1 compliance.
|
|
8
|
+
|
|
9
|
+
## Core Keyboard Requirements
|
|
10
|
+
|
|
11
|
+
All interactive functionality must be operable through keyboard alone (WCAG 2.1.1).
|
|
12
|
+
|
|
13
|
+
### Essential Keys
|
|
14
|
+
|
|
15
|
+
- **Tab**: Move forward through interactive elements
|
|
16
|
+
- **Shift+Tab**: Move backward through interactive elements
|
|
17
|
+
- **Enter**: Activate buttons, links, form submissions
|
|
18
|
+
- **Space**: Toggle checkboxes, activate buttons, scroll page
|
|
19
|
+
- **Arrow Keys**: Navigate within menus, radio groups, sliders, tabs
|
|
20
|
+
- **Escape**: Close modals, cancel operations, dismiss popovers
|
|
21
|
+
- **Home/End**: Jump to first/last item in lists or text inputs
|
|
22
|
+
|
|
23
|
+
## Comprehensive Testing Checklist
|
|
24
|
+
|
|
25
|
+
### 1. Tab Order Test
|
|
26
|
+
|
|
27
|
+
**Goal**: Verify logical tab sequence and no missing interactive elements.
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
[] Tab through entire page from top to bottom
|
|
31
|
+
[] Tab order matches visual layout (left-to-right, top-to-bottom)
|
|
32
|
+
[] All interactive elements are reachable
|
|
33
|
+
[] No unexpected tab stops on non-interactive elements
|
|
34
|
+
[] Skip links (if present) appear first
|
|
35
|
+
[] Tab order within complex components is logical
|
|
36
|
+
[] Form fields follow a natural sequence
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### 2. Focus Visibility Test
|
|
40
|
+
|
|
41
|
+
**Goal**: Ensure focus is always clearly visible (WCAG 2.4.7).
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
[] Focus indicator visible on ALL interactive elements
|
|
45
|
+
[] Focus ring contrast meets 3:1 minimum
|
|
46
|
+
[] Focus indicator not obscured by other elements
|
|
47
|
+
[] Focus indicator clearly distinguishable from hover state
|
|
48
|
+
[] Focus visible in both light and dark modes
|
|
49
|
+
[] Custom focus styles meet visibility standards
|
|
50
|
+
[] Focus visible on all form controls
|
|
51
|
+
[] Focus visible on custom components
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Common Issues:**
|
|
55
|
+
```css
|
|
56
|
+
/* BAD - Removes focus indicator */
|
|
57
|
+
button:focus { outline: none; }
|
|
58
|
+
|
|
59
|
+
/* GOOD - Custom accessible focus */
|
|
60
|
+
button:focus-visible {
|
|
61
|
+
outline: 2px solid #0066cc;
|
|
62
|
+
outline-offset: 2px;
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### 3. Keyboard Trap Test
|
|
67
|
+
|
|
68
|
+
**Goal**: Ensure users can always move focus away (WCAG 2.1.2).
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
[] Can exit all modals with Escape
|
|
72
|
+
[] Can tab out of custom widgets
|
|
73
|
+
[] No infinite tab loops
|
|
74
|
+
[] Can exit autocomplete/dropdown menus
|
|
75
|
+
[] Can leave embedded iframes
|
|
76
|
+
[] Modal focus management returns to trigger element
|
|
77
|
+
[] No focus lost into hidden elements
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 4. Interactive Element Test
|
|
81
|
+
|
|
82
|
+
**Goal**: All interactive elements work with keyboard.
|
|
83
|
+
|
|
84
|
+
#### Buttons
|
|
85
|
+
```
|
|
86
|
+
[] Activate with Enter
|
|
87
|
+
[] Activate with Space
|
|
88
|
+
[] Both <button> and role="button" work
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
#### Links
|
|
92
|
+
```
|
|
93
|
+
[] Activate with Enter
|
|
94
|
+
[] Space scrolls page (doesn't activate)
|
|
95
|
+
[] Fragment links (#) work correctly
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
#### Form Controls
|
|
99
|
+
```
|
|
100
|
+
[] Text inputs: Type, navigate with arrows
|
|
101
|
+
[] Checkboxes: Toggle with Space
|
|
102
|
+
[] Radio buttons: Select with Arrow keys
|
|
103
|
+
[] Select dropdowns: Open with Space/Enter, navigate with Arrows
|
|
104
|
+
[] Textareas: Enter creates new line (doesn't submit form)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
#### Custom Components
|
|
108
|
+
```
|
|
109
|
+
[] Tabs: Arrow keys navigate, Enter/Space activate
|
|
110
|
+
[] Accordions: Enter/Space toggle, Arrow keys navigate
|
|
111
|
+
[] Carousels: Arrow keys navigate slides
|
|
112
|
+
[] Sliders: Arrow keys adjust value
|
|
113
|
+
[] Menus: Arrow keys navigate, Enter selects, Escape closes
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 5. Modal and Dialog Test
|
|
117
|
+
|
|
118
|
+
**Goal**: Proper focus management in overlay interfaces.
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
[] Focus moves to modal when opened
|
|
122
|
+
[] Tab cycles within modal only (focus trap)
|
|
123
|
+
[] First focusable element receives focus on open
|
|
124
|
+
[] Escape closes modal
|
|
125
|
+
[] Focus returns to trigger element on close
|
|
126
|
+
[] Background content is inert (can't tab to it)
|
|
127
|
+
[] Modal can be operated entirely by keyboard
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Example Implementation:**
|
|
131
|
+
```javascript
|
|
132
|
+
// Focus trap in modal
|
|
133
|
+
modal.addEventListener('keydown', (e) => {
|
|
134
|
+
if (e.key === 'Escape') closeModal();
|
|
135
|
+
|
|
136
|
+
if (e.key === 'Tab') {
|
|
137
|
+
const focusable = modal.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
|
|
138
|
+
const first = focusable[0];
|
|
139
|
+
const last = focusable[focusable.length - 1];
|
|
140
|
+
|
|
141
|
+
if (e.shiftKey && document.activeElement === first) {
|
|
142
|
+
last.focus();
|
|
143
|
+
e.preventDefault();
|
|
144
|
+
} else if (!e.shiftKey && document.activeElement === last) {
|
|
145
|
+
first.focus();
|
|
146
|
+
e.preventDefault();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 6. Dropdown and Menu Test
|
|
153
|
+
|
|
154
|
+
**Goal**: Keyboard-accessible menu navigation.
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
[] Open with Enter or Space
|
|
158
|
+
[] Arrow Down: Move to next item
|
|
159
|
+
[] Arrow Up: Move to previous item
|
|
160
|
+
[] Home: Jump to first item
|
|
161
|
+
[] End: Jump to last item
|
|
162
|
+
[] Type to search/filter items
|
|
163
|
+
[] Enter: Select item and close
|
|
164
|
+
[] Escape: Close without selecting
|
|
165
|
+
[] Tab: Close and move to next element
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### 7. Skip Links Test
|
|
169
|
+
|
|
170
|
+
**Goal**: Efficient navigation for keyboard users.
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
[] "Skip to main content" link is first tab stop
|
|
174
|
+
[] Skip link becomes visible on focus
|
|
175
|
+
[] Skip link actually moves focus to main content
|
|
176
|
+
[] Additional skip links for repetitive navigation
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
**Example:**
|
|
180
|
+
```html
|
|
181
|
+
<a href="#main-content" class="skip-link">Skip to main content</a>
|
|
182
|
+
|
|
183
|
+
<style>
|
|
184
|
+
.skip-link {
|
|
185
|
+
position: absolute;
|
|
186
|
+
top: -40px;
|
|
187
|
+
left: 0;
|
|
188
|
+
background: #000;
|
|
189
|
+
color: #fff;
|
|
190
|
+
padding: 8px;
|
|
191
|
+
z-index: 100;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.skip-link:focus {
|
|
195
|
+
top: 0;
|
|
196
|
+
}
|
|
197
|
+
</style>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 8. Form Validation Test
|
|
201
|
+
|
|
202
|
+
**Goal**: Keyboard users can identify and fix errors.
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
[] Error messages appear without requiring mouse
|
|
206
|
+
[] Focus moves to first error on submit
|
|
207
|
+
[] Inline validation doesn't break keyboard flow
|
|
208
|
+
[] Error messages are keyboard-accessible
|
|
209
|
+
[] Success messages are announced
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### 9. Dynamic Content Test
|
|
213
|
+
|
|
214
|
+
**Goal**: Keyboard users aren't lost when content changes.
|
|
215
|
+
|
|
216
|
+
```
|
|
217
|
+
[] Focus maintained when content updates
|
|
218
|
+
[] Loading states don't trap focus
|
|
219
|
+
[] Infinite scroll accessible via keyboard
|
|
220
|
+
[] Lazy-loaded content is reachable
|
|
221
|
+
[] AJAX updates don't break tab order
|
|
222
|
+
```
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
phase_relevance: ["clarify", "design", "review"]
|
|
3
|
+
archetype_relevance: ["*"]
|
|
4
|
+
---
|
|
5
|
+
# Keyboard Testing Guide: Patterns & Tools
|
|
6
|
+
|
|
7
|
+
Testing workflows, common violations with fixes, tools, and quick reference.
|
|
8
|
+
|
|
9
|
+
## Testing Workflow
|
|
10
|
+
|
|
11
|
+
### Basic Test (5 minutes)
|
|
12
|
+
1. Close your mouse/trackpad
|
|
13
|
+
2. Tab through the page
|
|
14
|
+
3. Try to complete primary user action
|
|
15
|
+
4. Can you do everything without a mouse?
|
|
16
|
+
|
|
17
|
+
### Comprehensive Test (20 minutes)
|
|
18
|
+
1. Test all checklist items from keyboard-testing-basics.md
|
|
19
|
+
2. Try each interactive element
|
|
20
|
+
3. Test modal/overlay interactions
|
|
21
|
+
4. Test form submission flow
|
|
22
|
+
5. Test error states and recovery
|
|
23
|
+
|
|
24
|
+
### Advanced Test (Browser DevTools)
|
|
25
|
+
```javascript
|
|
26
|
+
// Find all tabbable elements
|
|
27
|
+
document.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')
|
|
28
|
+
|
|
29
|
+
// Highlight focus order
|
|
30
|
+
let tabIndex = 0;
|
|
31
|
+
document.addEventListener('focus', (e) => {
|
|
32
|
+
e.target.dataset.tabOrder = ++tabIndex;
|
|
33
|
+
console.log(`Tab ${tabIndex}:`, e.target);
|
|
34
|
+
}, true);
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Common Violations and Fixes
|
|
38
|
+
|
|
39
|
+
### 1. Missing Tabindex on Custom Controls
|
|
40
|
+
|
|
41
|
+
```html
|
|
42
|
+
<!-- BAD: Not keyboard accessible -->
|
|
43
|
+
<div onclick="handleClick()">Click me</div>
|
|
44
|
+
|
|
45
|
+
<!-- GOOD: Keyboard accessible -->
|
|
46
|
+
<button onclick="handleClick()">Click me</button>
|
|
47
|
+
|
|
48
|
+
<!-- If div required, add role and tabindex -->
|
|
49
|
+
<div role="button" tabindex="0" onclick="handleClick()"
|
|
50
|
+
onkeydown="if(event.key==='Enter'||event.key===' ')handleClick()">
|
|
51
|
+
Click me
|
|
52
|
+
</div>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 2. Invisible Focus Indicator
|
|
56
|
+
|
|
57
|
+
```css
|
|
58
|
+
/* BAD */
|
|
59
|
+
*:focus { outline: none; }
|
|
60
|
+
|
|
61
|
+
/* GOOD */
|
|
62
|
+
*:focus-visible {
|
|
63
|
+
outline: 2px solid var(--focus-color);
|
|
64
|
+
outline-offset: 2px;
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 3. Keyboard Trap in Modal
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
// BAD - Focus escapes modal
|
|
72
|
+
<div class="modal">...</div>
|
|
73
|
+
|
|
74
|
+
// GOOD - Focus trapped in modal
|
|
75
|
+
function trapFocus(modal) {
|
|
76
|
+
const focusable = modal.querySelectorAll(
|
|
77
|
+
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
|
|
78
|
+
);
|
|
79
|
+
const first = focusable[0];
|
|
80
|
+
const last = focusable[focusable.length - 1];
|
|
81
|
+
|
|
82
|
+
modal.addEventListener('keydown', (e) => {
|
|
83
|
+
if (e.key === 'Tab') {
|
|
84
|
+
if (e.shiftKey) {
|
|
85
|
+
if (document.activeElement === first) {
|
|
86
|
+
last.focus();
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
if (document.activeElement === last) {
|
|
91
|
+
first.focus();
|
|
92
|
+
e.preventDefault();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
first.focus();
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 4. Incorrect Tab Order
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<!-- BAD - Positive tabindex -->
|
|
106
|
+
<button tabindex="3">Third</button>
|
|
107
|
+
<button tabindex="1">First</button>
|
|
108
|
+
<button tabindex="2">Second</button>
|
|
109
|
+
|
|
110
|
+
<!-- GOOD - Natural DOM order -->
|
|
111
|
+
<button>First</button>
|
|
112
|
+
<button>Second</button>
|
|
113
|
+
<button>Third</button>
|
|
114
|
+
|
|
115
|
+
<!-- ACCEPTABLE - Only 0 and -1 -->
|
|
116
|
+
<div tabindex="0">Focusable</div>
|
|
117
|
+
<div tabindex="-1">Programmatically focusable</div>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Testing Tools
|
|
121
|
+
|
|
122
|
+
### Browser Extensions
|
|
123
|
+
- **Tab Order Viewer**: Visualize tab sequence
|
|
124
|
+
- **Accessibility Insights**: Automated and guided tests
|
|
125
|
+
- **axe DevTools**: Keyboard accessibility checks
|
|
126
|
+
|
|
127
|
+
### Manual Testing
|
|
128
|
+
- Disconnect mouse/trackpad
|
|
129
|
+
- Use browser without extensions
|
|
130
|
+
- Test on actual keyboard (not just Tab)
|
|
131
|
+
|
|
132
|
+
### Automated Checks
|
|
133
|
+
```bash
|
|
134
|
+
# axe-core includes keyboard checks
|
|
135
|
+
npx @axe-core/cli https://example.com
|
|
136
|
+
|
|
137
|
+
# pa11y
|
|
138
|
+
npx pa11y https://example.com
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Quick Reference Card
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
Action | Keys
|
|
145
|
+
------------------------|------------------------
|
|
146
|
+
Navigate forward | Tab
|
|
147
|
+
Navigate backward | Shift+Tab
|
|
148
|
+
Activate button/link | Enter (or Space for buttons)
|
|
149
|
+
Toggle checkbox | Space
|
|
150
|
+
Select radio button | Arrow keys
|
|
151
|
+
Open dropdown | Space or Enter
|
|
152
|
+
Navigate menu | Arrow keys
|
|
153
|
+
Close modal/menu | Escape
|
|
154
|
+
Submit form | Enter (in text input)
|
|
155
|
+
Scroll page | Space, Arrow keys, Page Up/Down
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Success Criteria
|
|
159
|
+
|
|
160
|
+
**Pass if:**
|
|
161
|
+
- All interactive elements reachable via Tab
|
|
162
|
+
- Focus always visible
|
|
163
|
+
- No keyboard traps
|
|
164
|
+
- All functionality works via keyboard
|
|
165
|
+
- Tab order is logical
|
|
166
|
+
- Enter/Space activate elements appropriately
|
|
167
|
+
|
|
168
|
+
**Fail if:**
|
|
169
|
+
- Any interactive element unreachable
|
|
170
|
+
- Focus invisible at any point
|
|
171
|
+
- User gets stuck anywhere
|
|
172
|
+
- Primary action requires mouse
|
|
173
|
+
- Tab order confusing or broken
|