coding-os 0.3.2__py3-none-any.whl
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.
- adapters/claude/README.md +6 -0
- adapters/claude/_install_helpers/extract_stacks.py +43 -0
- adapters/claude/_install_helpers/update_mcp_json.py +75 -0
- adapters/claude/adapter.yaml +164 -0
- adapters/claude/hooks/README.md +40 -0
- adapters/claude/hooks/agent_memory_sync.py +131 -0
- adapters/claude/hooks/ensure-agent-memory-link.sh +36 -0
- adapters/claude/hooks/sync-agent-memory.sh +21 -0
- adapters/claude/install.sh +86 -0
- adapters/claude/sdk_dispatcher.py +871 -0
- adapters/claude/settings.local.template.json +31 -0
- adapters/claude/settings.template.json +808 -0
- adapters/claude/update_mcp_json.py +85 -0
- adapters/codex/adapter.yaml +254 -0
- adapters/codex/chat_provider.py +230 -0
- adapters/codex/commands/formula-f1.md +129 -0
- adapters/codex/commands/formula-f10.md +100 -0
- adapters/codex/commands/formula-f11.md +123 -0
- adapters/codex/commands/formula-f2.md +139 -0
- adapters/codex/commands/formula-f3.md +127 -0
- adapters/codex/commands/formula-f4.md +101 -0
- adapters/codex/commands/formula-f5.md +135 -0
- adapters/codex/commands/formula-f6.md +147 -0
- adapters/codex/commands/formula-f7.md +111 -0
- adapters/codex/commands/formula-f8.md +133 -0
- adapters/codex/commands/formula-f9.md +112 -0
- adapters/codex/enable_codex_hooks.py +94 -0
- adapters/codex/ensure_codex_mcp.py +124 -0
- adapters/codex/hooks/codex-merge-hook-output.py +72 -0
- adapters/codex/hooks/codex-normalize-edit.py +96 -0
- adapters/codex/hooks/codex-postedit-dispatch.sh +75 -0
- adapters/codex/hooks/codex-posttool-dispatch.sh +70 -0
- adapters/codex/hooks/codex-preedit-dispatch.sh +83 -0
- adapters/codex/hooks/codex-pretool-dispatch.sh +82 -0
- adapters/codex/hooks/codex-sessionend-dispatch.sh +20 -0
- adapters/codex/hooks/codex-sessionstart-dispatch.sh +68 -0
- adapters/codex/hooks/codex-stop-dispatch.sh +73 -0
- adapters/codex/hooks/codex-userpromptsubmit-dispatch.sh +74 -0
- adapters/codex/hooks.template.json +208 -0
- adapters/codex/install.sh +83 -0
- adapters/codex/sdk_dispatcher.py +449 -0
- board_os/__init__.py +39 -0
- board_os/_agent_runtime.py +256 -0
- board_os/config.py +421 -0
- board_os/git_coherence.py +107 -0
- board_os/hub_adapter_manifest.py +140 -0
- board_os/mcp_tools.py +3228 -0
- board_os/migration.py +166 -0
- board_os/parser.py +317 -0
- board_os/presence.py +156 -0
- board_os/sync.py +320 -0
- board_os/transition_gates.py +224 -0
- board_os/transition_gates_cli.py +272 -0
- board_os/transition_gates_validator.py +551 -0
- board_os/verify_suites.py +126 -0
- board_os/verify_suites_cli.py +328 -0
- board_os/workflow.py +967 -0
- cli/__init__.py +0 -0
- cli/_data_types.py +248 -0
- cli/_init_helpers.py +587 -0
- cli/_resources.py +100 -0
- cli/adapter_registry.py +239 -0
- cli/add_stack.py +315 -0
- cli/aggregator.py +438 -0
- cli/board_commands.py +1218 -0
- cli/brain_commands.py +255 -0
- cli/cognition.py +345 -0
- cli/config_composer.py +349 -0
- cli/core_version.py +41 -0
- cli/cron_commands.py +278 -0
- cli/db_reset.py +298 -0
- cli/doc_commands.py +111 -0
- cli/doctor.py +2953 -0
- cli/doctor_board.py +365 -0
- cli/doctor_extras.py +1121 -0
- cli/doctor_graph.py +608 -0
- cli/doctor_tokens.py +254 -0
- cli/graph_commands.py +1265 -0
- cli/hook_renderer.py +393 -0
- cli/hub_commands.py +580 -0
- cli/list_adapters.py +79 -0
- cli/list_stacks.py +105 -0
- cli/logs_commands.py +89 -0
- cli/main.py +3070 -0
- cli/materialize_file.py +65 -0
- cli/mcp_start.py +153 -0
- cli/module_commands.py +513 -0
- cli/pr_commands.py +2024 -0
- cli/preset_commands.py +126 -0
- cli/preset_registry.py +171 -0
- cli/project_overrides.py +119 -0
- cli/registry.py +365 -0
- cli/remove_stack.py +492 -0
- cli/renderer.py +620 -0
- cli/setup.py +464 -0
- cli/skill_commands.py +689 -0
- cli/skill_registry.py +235 -0
- cli/skills_list.py +332 -0
- cli/stack_lint.py +351 -0
- cli/stack_registry.py +688 -0
- cli/subsystems.py +335 -0
- cli/sync_all.py +310 -0
- cli/tail_command.py +410 -0
- cli/update.py +608 -0
- cli/verify_since_edit.py +439 -0
- coding_os-0.3.2.dist-info/METADATA +508 -0
- coding_os-0.3.2.dist-info/RECORD +1304 -0
- coding_os-0.3.2.dist-info/WHEEL +5 -0
- coding_os-0.3.2.dist-info/entry_points.txt +5 -0
- coding_os-0.3.2.dist-info/licenses/LICENSE +201 -0
- coding_os-0.3.2.dist-info/top_level.txt +10 -0
- core/__init__.py +0 -0
- core/board_os/__init__.py +39 -0
- core/board_os/_agent_runtime.py +256 -0
- core/board_os/config.py +421 -0
- core/board_os/git_coherence.py +107 -0
- core/board_os/hub_adapter_manifest.py +140 -0
- core/board_os/mcp_tools.py +3228 -0
- core/board_os/migration.py +166 -0
- core/board_os/parser.py +317 -0
- core/board_os/presence.py +156 -0
- core/board_os/sync.py +320 -0
- core/board_os/transition-gates.yaml +176 -0
- core/board_os/transition_gates.py +224 -0
- core/board_os/transition_gates_cli.py +272 -0
- core/board_os/transition_gates_validator.py +551 -0
- core/board_os/verify-suites.yaml +113 -0
- core/board_os/verify_suites.py +126 -0
- core/board_os/verify_suites_cli.py +328 -0
- core/board_os/workflow.py +967 -0
- core/commands/board.md +27 -0
- core/commands/classify.md +23 -0
- core/commands/compose.md +23 -0
- core/commands/daily.md +31 -0
- core/commands/diagnose.md +7 -0
- core/commands/memory-search.md +23 -0
- core/commands/new-project.md +33 -0
- core/commands/retro.md +38 -0
- core/commands/review.md +14 -0
- core/commands/task.md +17 -0
- core/commands/verify.md +34 -0
- core/docs/thinking_os-final-edition.md +1449 -0
- core/doctor-config.yaml +74 -0
- core/graph_os/__init__.py +29 -0
- core/graph_os/backend.py +233 -0
- core/graph_os/backends/__init__.py +13 -0
- core/graph_os/backends/sqlite_backend.py +1053 -0
- core/graph_os/bench/__init__.py +17 -0
- core/graph_os/bench/fixtures.py +56 -0
- core/graph_os/bench/harness.py +95 -0
- core/graph_os/bench/persian_precision.py +142 -0
- core/graph_os/bench/scale_500k.py +120 -0
- core/graph_os/bench/token_cost.py +170 -0
- core/graph_os/bench/viewer_fps.py +110 -0
- core/graph_os/communities.py +410 -0
- core/graph_os/enterprise.py +218 -0
- core/graph_os/entry_points.py +226 -0
- core/graph_os/extractors/__init__.py +25 -0
- core/graph_os/extractors/code_generic.py +914 -0
- core/graph_os/extractors/code_go.py +1422 -0
- core/graph_os/extractors/code_json.py +340 -0
- core/graph_os/extractors/code_php.py +979 -0
- core/graph_os/extractors/code_python.py +1454 -0
- core/graph_os/extractors/code_shell.py +538 -0
- core/graph_os/extractors/code_toml.py +302 -0
- core/graph_os/extractors/code_ts.py +1665 -0
- core/graph_os/extractors/code_yaml.py +394 -0
- core/graph_os/extractors/contracts.py +1592 -0
- core/graph_os/extractors/md_links.py +890 -0
- core/graph_os/extractors/task_deps.py +345 -0
- core/graph_os/groups/__init__.py +22 -0
- core/graph_os/groups/cross_repo.py +156 -0
- core/graph_os/groups/manifest.py +141 -0
- core/graph_os/ingest/__init__.py +19 -0
- core/graph_os/ingest/base.py +306 -0
- core/graph_os/ingest/github.py +112 -0
- core/graph_os/ingest/zip.py +95 -0
- core/graph_os/toolchain.py +393 -0
- core/graph_os/tools/__init__.py +9 -0
- core/graph_os/tools/graph.py +5573 -0
- core/graph_os/tools/reindex_dispatch.py +730 -0
- core/graph_os/tree_sitter_overlay.py +235 -0
- core/graph_os/types.py +252 -0
- core/graph_os/vec_index.py +277 -0
- core/graph_os/viewer/__init__.py +12 -0
- core/graph_os/viewer/exporter.py +93 -0
- core/graph_os/viewer/template.py +189 -0
- core/hooks/_helpers/_paths.py +40 -0
- core/hooks/_helpers/advance_role.py +72 -0
- core/hooks/_helpers/auto_compose.py +228 -0
- core/hooks/_helpers/auto_validate_lessons.py +55 -0
- core/hooks/_helpers/branch_guard_check.py +796 -0
- core/hooks/_helpers/check_commit_message.py +108 -0
- core/hooks/_helpers/check_dangerous_rm.py +80 -0
- core/hooks/_helpers/check_git_bypass.py +154 -0
- core/hooks/_helpers/check_git_destructive.py +77 -0
- core/hooks/_helpers/check_settings_write.py +97 -0
- core/hooks/_helpers/consume_override.py +51 -0
- core/hooks/_helpers/context_budget.py +77 -0
- core/hooks/_helpers/cos_say_json.py +103 -0
- core/hooks/_helpers/destructive_edit_check.py +163 -0
- core/hooks/_helpers/detect_status_transition.py +82 -0
- core/hooks/_helpers/digest_regen.py +56 -0
- core/hooks/_helpers/doc_sync_check.py +498 -0
- core/hooks/_helpers/drain_embedding_outbox.py +52 -0
- core/hooks/_helpers/extract_additional_context.py +51 -0
- core/hooks/_helpers/extract_commit_msg_arg.py +74 -0
- core/hooks/_helpers/git_command_parse.py +424 -0
- core/hooks/_helpers/git_settings_fields.py +47 -0
- core/hooks/_helpers/graph_context_match.py +37 -0
- core/hooks/_helpers/graph_marker_check.py +70 -0
- core/hooks/_helpers/jit_recall.py +56 -0
- core/hooks/_helpers/json_field.py +41 -0
- core/hooks/_helpers/narrative_signal.py +59 -0
- core/hooks/_helpers/observation_count.py +31 -0
- core/hooks/_helpers/pre_commit_batch.py +177 -0
- core/hooks/_helpers/pre_commit_fake_input.py +42 -0
- core/hooks/_helpers/presence_gc.py +102 -0
- core/hooks/_helpers/presence_write.py +167 -0
- core/hooks/_helpers/recover_indirect.py +35 -0
- core/hooks/_helpers/routing_evolution.py +104 -0
- core/hooks/_helpers/session_recap.py +72 -0
- core/hooks/_helpers/skill_primer.py +229 -0
- core/hooks/_helpers/task_sync.py +59 -0
- core/hooks/_helpers/tool_failure_capture.py +147 -0
- core/hooks/_helpers/trajectory_autosnap.py +278 -0
- core/hooks/_helpers/trajectory_startup.py +62 -0
- core/hooks/_helpers/turn_summary.py +82 -0
- core/hooks/_helpers/validate_task_frontmatter.py +98 -0
- core/hooks/_helpers/wip_limit_check.py +103 -0
- core/hooks/_helpers/wip_lines.py +53 -0
- core/hooks/_helpers/work_log_append.py +89 -0
- core/hooks/_helpers/wrap_dispatch_output.py +82 -0
- core/hooks/advance-role.sh +48 -0
- core/hooks/agent-presence.sh +179 -0
- core/hooks/auto-brain-decay.sh +184 -0
- core/hooks/auto-compose-roles.sh +83 -0
- core/hooks/auto-graph-reconcile-shell.sh +119 -0
- core/hooks/auto-regen-doc-index.sh +120 -0
- core/hooks/auto-reindex-docs.sh +130 -0
- core/hooks/auto-task-sync.sh +56 -0
- core/hooks/auto-trace-rotate.sh +88 -0
- core/hooks/block-bad-patterns.sh +212 -0
- core/hooks/block-dangerous-commands.sh +182 -0
- core/hooks/block-hardcoded-literals.sh +90 -0
- core/hooks/block-migration-conflict.sh +114 -0
- core/hooks/block-protected-files.sh +129 -0
- core/hooks/block-secrets.sh +185 -0
- core/hooks/block-shared-tree-edit.sh +75 -0
- core/hooks/block-uv-heredoc.sh +78 -0
- core/hooks/branch-guard.sh +122 -0
- core/hooks/capture-observation.sh +76 -0
- core/hooks/capture-tool-failure.sh +24 -0
- core/hooks/capture-work-log.sh +89 -0
- core/hooks/check-agents-md-refs.sh +75 -0
- core/hooks/check-agents-md-size.sh +49 -0
- core/hooks/check-capture-worked.sh +148 -0
- core/hooks/check-doc-size.sh +61 -0
- core/hooks/check-mcp-extras.sh +92 -0
- core/hooks/check-state.sh +87 -0
- core/hooks/classify-task-mode.sh +103 -0
- core/hooks/cos-env.sh +1301 -0
- core/hooks/drain-embedding-outbox.sh +24 -0
- core/hooks/enforce-anti-ambiguity.sh +74 -0
- core/hooks/enforce-commit-message.sh +73 -0
- core/hooks/enforce-doc-anchor.sh +224 -0
- core/hooks/enforce-doc-sync.sh +206 -0
- core/hooks/enforce-graph-context.sh +89 -0
- core/hooks/enforce-graph-first-read.sh +94 -0
- core/hooks/enforce-memory-check.sh +128 -0
- core/hooks/enforce-rename-plan.sh +78 -0
- core/hooks/enforce-scaffold-boundary.sh +68 -0
- core/hooks/enforce-skill.sh +125 -0
- core/hooks/enforce-task-body.sh +52 -0
- core/hooks/enforce-task-start.sh +81 -0
- core/hooks/enforce-task-transition.sh +75 -0
- core/hooks/enforce-template.sh +143 -0
- core/hooks/enforce-verify.sh +112 -0
- core/hooks/enforce-wip-limit.sh +43 -0
- core/hooks/enforce-zoom.sh +69 -0
- core/hooks/ensure-hub-up.sh +67 -0
- core/hooks/inject-mcp-caller-session.sh +70 -0
- core/hooks/jit-recall.sh +65 -0
- core/hooks/link-commit-to-task.sh +143 -0
- core/hooks/lint-task.sh +40 -0
- core/hooks/nudge-docs-first.sh +71 -0
- core/hooks/nudge-git-mode.sh +29 -0
- core/hooks/nudge-graph-os.sh +118 -0
- core/hooks/nudge-learn-narrative.sh +36 -0
- core/hooks/nudge-model-routing.sh +32 -0
- core/hooks/nudge-reentry.sh +101 -0
- core/hooks/nudge-reuse-first.sh +68 -0
- core/hooks/nudge-task-discovery.sh +81 -0
- core/hooks/nudge-thinking-os.sh +109 -0
- core/hooks/pr-reap.sh +23 -0
- core/hooks/reclaim-sweep.sh +58 -0
- core/hooks/record-verify-auto.sh +77 -0
- core/hooks/record-verify.sh +74 -0
- core/hooks/regen-reminder.sh +104 -0
- core/hooks/registry.yaml +1262 -0
- core/hooks/remind-daily.sh +27 -0
- core/hooks/remind-dogfood.sh +70 -0
- core/hooks/remind-learn-validate.sh +94 -0
- core/hooks/rules-primer.sh +50 -0
- core/hooks/search-enforce-inventory.sh +108 -0
- core/hooks/search-verify-remaining.sh +132 -0
- core/hooks/session-context.sh +729 -0
- core/hooks/session-end.sh +145 -0
- core/hooks/session-skill-primer.sh +43 -0
- core/hooks/snapshot-transcript.sh +56 -0
- core/hooks/sync-task-current.sh +85 -0
- core/hooks/test-first-reminder.sh +120 -0
- core/hooks/test-governor.sh +173 -0
- core/hooks/thinking_os-gate.sh +52 -0
- core/hooks/track-backtrack.sh +35 -0
- core/hooks/track-discovery.sh +121 -0
- core/hooks/track-skill.sh +53 -0
- core/hooks/validate-task-frontmatter.sh +49 -0
- core/hooks/verify-rename-callers.sh +119 -0
- core/hooks/warn-abandoned-task.sh +99 -0
- core/hooks/warn-destructive-edit.sh +64 -0
- core/hooks/warn-diff-size.sh +43 -0
- core/hooks/warn-graph-empty.sh +81 -0
- core/hooks/warn-mcp-down.sh +190 -0
- core/hooks/write-state.sh +55 -0
- core/logging_os/__init__.py +33 -0
- core/logging_os/api.py +127 -0
- core/logging_os/bridge.py +80 -0
- core/logging_os/config.py +172 -0
- core/logging_os/fingerprint.py +25 -0
- core/logging_os/redact.py +53 -0
- core/logging_os/render.py +83 -0
- core/logging_os/sinks.py +164 -0
- core/rules/anti-overengineering.md +44 -0
- core/rules/api-contract-discipline.md +41 -0
- core/rules/dimension-registry.md +155 -0
- core/rules/git-workflow.md +57 -0
- core/rules/memory.md +46 -0
- core/rules/model-routing.md +22 -0
- core/rules/skill-enforcement.md +75 -0
- core/rules/test-discipline.md +38 -0
- core/rules/thinking_os.md +48 -0
- core/rules/transparency-banner.md +37 -0
- core/runtime_paths.yaml +36 -0
- core/scaffold_manifest.json +14430 -0
- core/scheduled/__init__.py +0 -0
- core/scheduled/_activity.py +126 -0
- core/scheduled/_state.py +113 -0
- core/scheduled/config.py +86 -0
- core/scheduled/dep_reconcile.py +135 -0
- core/scheduled/error_sweep.py +137 -0
- core/scheduled/nightly.py +930 -0
- core/scheduled/responsive_extract.py +65 -0
- core/schemas/adapter.schema.json +269 -0
- core/schemas/preset.schema.json +50 -0
- core/schemas/skill.schema.json +81 -0
- core/schemas/stack.schema.json +404 -0
- core/scripts/_lib.sh +9 -0
- core/scripts/docs-lint.sh +228 -0
- core/scripts/docs-nav-fix.sh +133 -0
- core/scripts/docs-staleness-check.sh +154 -0
- core/scripts/install-adapter.sh +266 -0
- core/scripts/link-stack-skills.sh +52 -0
- core/scripts/log-latest.sh +106 -0
- core/scripts/log-search.sh +89 -0
- core/scripts/log-write.sh +134 -0
- core/scripts/ref-resolve.sh +71 -0
- core/skills/a11y/SKILL.md +305 -0
- core/skills/a11y/assets/a11y-checklist.md +137 -0
- core/skills/a11y/references/aria-and-focus.md +247 -0
- core/skills/a11y/references/rn-accessibility.md +343 -0
- core/skills/a11y/references/screen-reader-testing.md +190 -0
- core/skills/agent-memory/SKILL.md +191 -0
- core/skills/agent-memory/assets/memory-checklist.md +21 -0
- core/skills/agent-memory/references/memory-recipes.md +57 -0
- core/skills/api-design/SKILL.md +232 -0
- core/skills/api-design/assets/api-design-checklist.md +110 -0
- core/skills/api-design/references/error-envelope.md +381 -0
- core/skills/api-design/references/idempotency-pagination.md +312 -0
- core/skills/api-design/references/rest-contracts.md +426 -0
- core/skills/auth-patterns/SKILL.md +352 -0
- core/skills/auth-patterns/assets/auth-checklist.md +118 -0
- core/skills/auth-patterns/references/jwt-and-service-tokens.md +343 -0
- core/skills/auth-patterns/references/passkeys-2fa.md +289 -0
- core/skills/auth-patterns/references/sessions-vs-jwt.md +230 -0
- core/skills/auth-patterns/scripts/cookie-flag-check.py +146 -0
- core/skills/backend-fundamentals/SKILL.md +238 -0
- core/skills/backend-fundamentals/assets/backend-checklist.md +27 -0
- core/skills/backend-fundamentals/references/backend-patterns.md +56 -0
- core/skills/backend-fundamentals/scripts/check_layering.py +83 -0
- core/skills/clean-code/SKILL.md +642 -0
- core/skills/clean-code/scripts/audit-fail-closed.py +167 -0
- core/skills/codebase-explorer/SKILL.md +89 -0
- core/skills/codebase-explorer/assets/reading-checklist.md +24 -0
- core/skills/codebase-explorer/references/reading-strategies.md +52 -0
- core/skills/codebase-explorer/scripts/outline.py +99 -0
- core/skills/db-design/SKILL.md +327 -0
- core/skills/db-design/assets/migration-template.sql +49 -0
- core/skills/db-design/references/migration-discipline.md +290 -0
- core/skills/db-design/references/postgres-patterns.md +340 -0
- core/skills/db-design/scripts/migration-safety.sh +150 -0
- core/skills/deployment-cicd/SKILL.md +260 -0
- core/skills/deployment-cicd/assets/deploy-checklist.md +26 -0
- core/skills/deployment-cicd/references/pipeline-and-release.md +54 -0
- core/skills/deployment-cicd/scripts/lint_workflow.py +79 -0
- core/skills/docker/SKILL.md +114 -0
- core/skills/docker/assets/dockerfile-checklist.md +31 -0
- core/skills/docker/references/compose-patterns.md +66 -0
- core/skills/docker/references/dockerfile-optimization.md +64 -0
- core/skills/docker/scripts/lint_dockerfile.sh +48 -0
- core/skills/docker/versions.json +16 -0
- core/skills/end-to-end-testing/SKILL.md +101 -0
- core/skills/end-to-end-testing/assets/e2e-checklist.md +23 -0
- core/skills/end-to-end-testing/references/maestro.md +63 -0
- core/skills/end-to-end-testing/references/playwright.md +68 -0
- core/skills/end-to-end-testing/scripts/lint_e2e.py +88 -0
- core/skills/end-to-end-testing/versions.json +16 -0
- core/skills/frontend-design/SKILL.md +76 -0
- core/skills/frontend-design/assets/design-checklist.md +29 -0
- core/skills/frontend-design/references/design-principles.md +65 -0
- core/skills/frontend-design/scripts/check_contrast.py +89 -0
- core/skills/frontend-fundamentals/SKILL.md +213 -0
- core/skills/frontend-fundamentals/assets/frontend-checklist.md +25 -0
- core/skills/frontend-fundamentals/references/rendering-and-state.md +66 -0
- core/skills/frontend-fundamentals/scripts/check_frontend.py +86 -0
- core/skills/graph-explorer/SKILL.md +215 -0
- core/skills/graph-explorer/scripts/explain-impact.sh +64 -0
- core/skills/graphql/SKILL.md +187 -0
- core/skills/grpc-microservices/SKILL.md +174 -0
- core/skills/hexagonal-architecture/SKILL.md +199 -0
- core/skills/hexagonal-architecture/assets/folder-scaffold.md +233 -0
- core/skills/hexagonal-architecture/references/anti-patterns.md +129 -0
- core/skills/hexagonal-architecture/references/go-fiber-layout.md +429 -0
- core/skills/hexagonal-architecture/references/python-fastapi-layout.md +453 -0
- core/skills/hexagonal-architecture/references/react-native-layout.md +428 -0
- core/skills/i18n/SKILL.md +126 -0
- core/skills/incident-response/SKILL.md +225 -0
- core/skills/incident-response/assets/incident-checklist.md +29 -0
- core/skills/incident-response/references/severity-and-runbook.md +53 -0
- core/skills/incident-response/scripts/classify_severity.py +86 -0
- core/skills/linux-sysadmin/SKILL.md +115 -0
- core/skills/linux-sysadmin/assets/hardening-checklist.md +29 -0
- core/skills/linux-sysadmin/references/ssh-hardening.md +62 -0
- core/skills/linux-sysadmin/references/systemd-and-services.md +77 -0
- core/skills/linux-sysadmin/scripts/triage.sh +50 -0
- core/skills/linux-sysadmin/versions.json +17 -0
- core/skills/llm-patterns/SKILL.md +410 -0
- core/skills/llm-patterns/assets/llm-feature-checklist.md +26 -0
- core/skills/llm-patterns/references/rag-and-evals.md +59 -0
- core/skills/llm-patterns/scripts/estimate_tokens.py +75 -0
- core/skills/messaging-queues/SKILL.md +142 -0
- core/skills/mobile-fundamentals/SKILL.md +406 -0
- core/skills/mobile-fundamentals/assets/mobile-launch-checklist.md +130 -0
- core/skills/mobile-fundamentals/references/navigation-and-deep-links.md +337 -0
- core/skills/mobile-fundamentals/references/offline-sync.md +339 -0
- core/skills/node-backend/SKILL.md +114 -0
- core/skills/node-backend/assets/node-checklist.md +25 -0
- core/skills/node-backend/references/async-and-errors.md +67 -0
- core/skills/node-backend/references/event-loop.md +65 -0
- core/skills/node-backend/scripts/check_package.py +78 -0
- core/skills/node-backend/versions.json +17 -0
- core/skills/observability/SKILL.md +289 -0
- core/skills/observability/assets/observability-checklist.md +27 -0
- core/skills/observability/references/instrumentation.md +57 -0
- core/skills/observability/scripts/lint_logging.py +77 -0
- core/skills/payments/SKILL.md +102 -0
- core/skills/performance/SKILL.md +305 -0
- core/skills/performance/assets/perf-checklist.md +143 -0
- core/skills/performance/references/mobile-performance.md +249 -0
- core/skills/performance/references/web-vitals.md +209 -0
- core/skills/php/SKILL.md +116 -0
- core/skills/php/assets/php-checklist.md +26 -0
- core/skills/php/references/modern-php.md +64 -0
- core/skills/php/references/security.md +72 -0
- core/skills/php/scripts/scan_php_smells.py +99 -0
- core/skills/php/versions.json +9 -0
- core/skills/pr-mode-driver/SKILL.md +65 -0
- core/skills/realtime-websockets/SKILL.md +152 -0
- core/skills/redis/SKILL.md +105 -0
- core/skills/redis/assets/redis-checklist.md +27 -0
- core/skills/redis/references/operations.md +66 -0
- core/skills/redis/references/patterns.md +62 -0
- core/skills/redis/scripts/analyze_info.py +101 -0
- core/skills/redis/versions.json +9 -0
- core/skills/search/SKILL.md +91 -0
- core/skills/search/references/grep.md +76 -0
- core/skills/search/scripts/verify-count.sh +73 -0
- core/skills/search-infra/SKILL.md +109 -0
- core/skills/security-mobile/SKILL.md +394 -0
- core/skills/security-mobile/assets/mobile-security-checklist.md +117 -0
- core/skills/security-mobile/references/masvs-l1-checklist.md +127 -0
- core/skills/security-web/SKILL.md +217 -0
- core/skills/security-web/assets/security-web-checklist.md +167 -0
- core/skills/security-web/references/owasp-top-10.md +551 -0
- core/skills/security-web/references/supply-chain.md +179 -0
- core/skills/security-web/scripts/csp-check.sh +153 -0
- core/skills/shell-scripting/SKILL.md +128 -0
- core/skills/shell-scripting/assets/script-checklist.md +33 -0
- core/skills/shell-scripting/references/argument-parsing.md +84 -0
- core/skills/shell-scripting/references/bash-robustness.md +78 -0
- core/skills/shell-scripting/scripts/lint_script.sh +53 -0
- core/skills/shell-scripting/scripts/new_script.py +131 -0
- core/skills/shell-scripting/versions.json +23 -0
- core/skills/sql-authoring/SKILL.md +104 -0
- core/skills/sql-authoring/assets/query-review-checklist.md +26 -0
- core/skills/sql-authoring/references/query-patterns.md +89 -0
- core/skills/sql-authoring/references/reading-explain.md +52 -0
- core/skills/sql-authoring/scripts/analyze_plan.py +100 -0
- core/skills/sql-authoring/versions.json +17 -0
- core/skills/state-management/SKILL.md +428 -0
- core/skills/state-management/references/tanstack-query-recipes.md +301 -0
- core/skills/state-management/references/zustand-recipes.md +364 -0
- core/skills/supabase/SKILL.md +108 -0
- core/skills/supabase/assets/supabase-checklist.md +26 -0
- core/skills/supabase/references/realtime-and-storage.md +55 -0
- core/skills/supabase/references/rls-and-auth.md +65 -0
- core/skills/supabase/scripts/check_rls.py +88 -0
- core/skills/supabase/versions.json +9 -0
- core/skills/task-driver/SKILL.md +272 -0
- core/skills/task-driver/scripts/task-lint.sh +163 -0
- core/skills/technical-writing/SKILL.md +85 -0
- core/skills/technical-writing/assets/doc-checklist.md +29 -0
- core/skills/technical-writing/references/doc-anatomy.md +53 -0
- core/skills/technical-writing/references/writing-craft.md +59 -0
- core/skills/technical-writing/scripts/new_doc.py +81 -0
- core/skills/terraform-k8s/SKILL.md +133 -0
- core/skills/testing-strategy/SKILL.md +266 -0
- core/skills/testing-strategy/assets/test-review-checklist.md +25 -0
- core/skills/testing-strategy/references/test-types.md +52 -0
- core/skills/testing-strategy/scripts/coverage_gate.py +79 -0
- core/skills/thinking_os/SKILL.md +288 -0
- core/skills/thinking_os/scripts/classify.sh +122 -0
- core/skills/typescript/SKILL.md +110 -0
- core/skills/typescript/assets/typescript-checklist.md +24 -0
- core/skills/typescript/references/strictness.md +53 -0
- core/skills/typescript/references/type-system.md +86 -0
- core/skills/typescript/scripts/check_tsconfig.py +92 -0
- core/skills/typescript/versions.json +9 -0
- core/subsystems.yaml +202 -0
- core/thinking_os/__init__.py +1 -0
- core/thinking_os/_agent_markers.py +32 -0
- core/thinking_os/agents/README.md +71 -0
- core/thinking_os/agents/analyst.md +139 -0
- core/thinking_os/agents/architect.md +127 -0
- core/thinking_os/agents/debugger.md +111 -0
- core/thinking_os/agents/deployer.md +112 -0
- core/thinking_os/agents/distiller.md +28 -0
- core/thinking_os/agents/documenter.md +101 -0
- core/thinking_os/agents/implementer.md +135 -0
- core/thinking_os/agents/internal/session_observer.md +39 -0
- core/thinking_os/agents/observer.md +100 -0
- core/thinking_os/agents/onboarder.md +81 -0
- core/thinking_os/agents/refactorer.md +123 -0
- core/thinking_os/agents/repairer.md +47 -0
- core/thinking_os/agents/researcher.md +129 -0
- core/thinking_os/agents/reviewer.md +147 -0
- core/thinking_os/agents/security_auditor.md +133 -0
- core/thinking_os/background.py +405 -0
- core/thinking_os/bootstrap_outcomes.py +200 -0
- core/thinking_os/budget.py +302 -0
- core/thinking_os/capture.py +495 -0
- core/thinking_os/cognition.py +516 -0
- core/thinking_os/cognition_schemas.py +517 -0
- core/thinking_os/compress.py +192 -0
- core/thinking_os/concepts.py +233 -0
- core/thinking_os/dashboard.py +159 -0
- core/thinking_os/database.py +2883 -0
- core/thinking_os/decay.py +393 -0
- core/thinking_os/digest.py +295 -0
- core/thinking_os/dispatcher.py +192 -0
- core/thinking_os/dispatcher_helpers.py +48 -0
- core/thinking_os/dispatchers/__init__.py +3 -0
- core/thinking_os/dispatchers/default.py +47 -0
- core/thinking_os/distill.py +192 -0
- core/thinking_os/doc_indexer.py +905 -0
- core/thinking_os/embeddings.py +943 -0
- core/thinking_os/formula_composer.py +556 -0
- core/thinking_os/gate_marker.py +75 -0
- core/thinking_os/graph.py +296 -0
- core/thinking_os/graph_indexer.py +360 -0
- core/thinking_os/health_check.py +517 -0
- core/thinking_os/impact.py +119 -0
- core/thinking_os/memory_gc.py +356 -0
- core/thinking_os/migrator_embeddings.py +318 -0
- core/thinking_os/precision.py +194 -0
- core/thinking_os/presets/registry.yaml +127 -0
- core/thinking_os/record_outcome.py +399 -0
- core/thinking_os/repair.py +105 -0
- core/thinking_os/retrieval_quality.py +239 -0
- core/thinking_os/roles/analyst.yaml +83 -0
- core/thinking_os/roles/architect.yaml +88 -0
- core/thinking_os/roles/debugger.yaml +71 -0
- core/thinking_os/roles/deployer.yaml +71 -0
- core/thinking_os/roles/documenter.yaml +72 -0
- core/thinking_os/roles/implementer.yaml +83 -0
- core/thinking_os/roles/observer.yaml +70 -0
- core/thinking_os/roles/refactorer.yaml +71 -0
- core/thinking_os/roles/researcher.yaml +72 -0
- core/thinking_os/roles/reviewer.yaml +79 -0
- core/thinking_os/roles/security_auditor.yaml +83 -0
- core/thinking_os/roles_state.py +168 -0
- core/thinking_os/sanitizer.py +320 -0
- core/thinking_os/server.py +3160 -0
- core/thinking_os/session_enrich.py +272 -0
- core/thinking_os/session_observe_worker.py +111 -0
- core/thinking_os/session_startup.py +74 -0
- core/thinking_os/session_summary.py +245 -0
- core/thinking_os/situations/registry.yaml +99 -0
- core/thinking_os/task_analyzer.py +462 -0
- core/thinking_os/task_parser.py +342 -0
- core/thinking_os/task_sync.py +73 -0
- core/thinking_os/tools/__init__.py +6 -0
- core/thinking_os/tools/_shared.py +947 -0
- core/thinking_os/tools/cognition.py +1867 -0
- core/thinking_os/tools/docs.py +770 -0
- core/thinking_os/tools/learning.py +2078 -0
- core/thinking_os/tools/logs.py +79 -0
- core/thinking_os/tools/memory.py +840 -0
- core/thinking_os/tools/metrics.py +200 -0
- core/thinking_os/tools/retrieve.py +415 -0
- core/thinking_os/tools/routing.py +658 -0
- core/thinking_os/tools/tasks.py +449 -0
- core/thinking_os/tools/trajectory.py +181 -0
- core/thinking_os/tracing.py +235 -0
- core/web/__init__.py +5 -0
- core/web/_cache.py +118 -0
- core/web/_deps.py +56 -0
- core/web/_envelope.py +85 -0
- core/web/_project_context.py +140 -0
- core/web/chat_providers.py +108 -0
- core/web/init_jobs.py +216 -0
- core/web/routes/__init__.py +25 -0
- core/web/routes/_bounded_read.py +76 -0
- core/web/routes/board.py +1089 -0
- core/web/routes/cognition.py +1838 -0
- core/web/routes/config.py +635 -0
- core/web/routes/graph.py +513 -0
- core/web/routes/health.py +180 -0
- core/web/routes/hooks.py +288 -0
- core/web/routes/hub.py +1219 -0
- core/web/routes/logs.py +374 -0
- core/web/routes/metrics.py +43 -0
- core/web/routes/observability.py +400 -0
- core/web/routes/patterns.py +227 -0
- core/web/routes/presence.py +609 -0
- core/web/routes/roles.py +446 -0
- core/web/routes/scheduled.py +261 -0
- core/web/routes/search.py +238 -0
- core/web/routes/sessions.py +220 -0
- core/web/routes/settings.py +363 -0
- core/web/routes/stream.py +547 -0
- core/web/security.py +157 -0
- core/web/server.py +283 -0
- graph_os/__init__.py +29 -0
- graph_os/backend.py +233 -0
- graph_os/backends/__init__.py +13 -0
- graph_os/backends/sqlite_backend.py +1053 -0
- graph_os/communities.py +410 -0
- graph_os/enterprise.py +218 -0
- graph_os/entry_points.py +226 -0
- graph_os/extractors/__init__.py +25 -0
- graph_os/extractors/code_generic.py +914 -0
- graph_os/extractors/code_go.py +1422 -0
- graph_os/extractors/code_json.py +340 -0
- graph_os/extractors/code_php.py +979 -0
- graph_os/extractors/code_python.py +1454 -0
- graph_os/extractors/code_shell.py +538 -0
- graph_os/extractors/code_toml.py +302 -0
- graph_os/extractors/code_ts.py +1665 -0
- graph_os/extractors/code_yaml.py +394 -0
- graph_os/extractors/contracts.py +1592 -0
- graph_os/extractors/md_links.py +890 -0
- graph_os/extractors/task_deps.py +345 -0
- graph_os/groups/__init__.py +22 -0
- graph_os/groups/cross_repo.py +156 -0
- graph_os/groups/manifest.py +141 -0
- graph_os/ingest/__init__.py +19 -0
- graph_os/ingest/base.py +306 -0
- graph_os/ingest/github.py +112 -0
- graph_os/ingest/zip.py +95 -0
- graph_os/toolchain.py +393 -0
- graph_os/tools/__init__.py +9 -0
- graph_os/tools/graph.py +5573 -0
- graph_os/tools/reindex_dispatch.py +730 -0
- graph_os/tree_sitter_overlay.py +235 -0
- graph_os/types.py +252 -0
- graph_os/vec_index.py +277 -0
- graph_os/viewer/__init__.py +12 -0
- graph_os/viewer/exporter.py +93 -0
- graph_os/viewer/template.py +189 -0
- scheduled/__init__.py +0 -0
- scheduled/_activity.py +126 -0
- scheduled/_state.py +113 -0
- scheduled/config.py +86 -0
- scheduled/dep_reconcile.py +135 -0
- scheduled/error_sweep.py +137 -0
- scheduled/nightly.py +930 -0
- scheduled/responsive_extract.py +65 -0
- scripts/__init__.py +4 -0
- scripts/_commit_msg_body.sh +31 -0
- scripts/_post_commit_body.sh +49 -0
- scripts/_pre_commit_body.sh +121 -0
- scripts/_prepare_commit_msg_body.sh +53 -0
- scripts/audit_mcp_tools.py +693 -0
- scripts/bench_sdk_dispatcher.py +177 -0
- scripts/capture_golden.py +169 -0
- scripts/check_graph_phantoms.py +75 -0
- scripts/dev/audit_doc_links.py +359 -0
- scripts/dev/audit_scaffold_module_tags.py +107 -0
- scripts/dev/backfill_doc_headers.py +328 -0
- scripts/dev/backfill_nav_lines.py +119 -0
- scripts/dev/fix_nav_placement.py +106 -0
- scripts/dev/inspect_sdk_options.py +45 -0
- scripts/dev/migrate_check_ids.py +170 -0
- scripts/dev/strip_purpose_blocks.py +154 -0
- scripts/dump_openapi.py +66 -0
- scripts/e2e_dispatch_tool.py +195 -0
- scripts/generate_manifest.py +166 -0
- scripts/golden_sections.py +20 -0
- scripts/graph_demo.py +161 -0
- scripts/install-git-hooks.sh +47 -0
- scripts/migrate_embeddings_minilm_to_bge_m3.py +84 -0
- scripts/operational_eval.py +445 -0
- scripts/probe_agent_session_resolver.py +59 -0
- scripts/prune_deleted_path.py +127 -0
- scripts/refactor_agent_dual_mode.py +171 -0
- scripts/refresh_skill_versions.py +302 -0
- scripts/regen_doc_index.py +209 -0
- scripts/regen_doctor_schema.py +62 -0
- scripts/regen_rules.py +94 -0
- scripts/rename_formulas_to_semantic.py +241 -0
- scripts/smoke_db_connections.py +183 -0
- scripts/smoke_doc_header.py +72 -0
- scripts/smoke_graph_e2e.py +374 -0
- scripts/smoke_sdk_dispatch.py +84 -0
- scripts/smoke_uid_resolver.py +164 -0
- scripts/verify_dispatchers.py +244 -0
- scripts/verify_phase_c_e2e.py +436 -0
- templates/__init__.py +6 -0
- templates/_base/Makefile.base +353 -0
- templates/_base/base.yaml +59 -0
- templates/_base/coding-os.yaml.template +39 -0
- templates/_base/dimension-registry.template.md +68 -0
- templates/_base/domain-config.template.json +46 -0
- templates/_base/fragments/anatomy-map.md.tmpl +11 -0
- templates/_base/fragments/context-discipline.md.tmpl +3 -0
- templates/_base/fragments/core-loop.md.tmpl +52 -0
- templates/_base/fragments/engineering-routing.md.tmpl +3 -0
- templates/_base/fragments/header.md.tmpl +6 -0
- templates/_base/fragments/identity.md.tmpl +3 -0
- templates/_base/fragments/principles.md.tmpl +3 -0
- templates/_base/fragments/retrieval-routing.md.tmpl +23 -0
- templates/_base/fragments/session-handoff.md.tmpl +3 -0
- templates/_base/fragments/skills.md.tmpl +3 -0
- templates/_base/fragments/ssot-map.md.tmpl +3 -0
- templates/_base/fragments/stop-conditions.md.tmpl +3 -0
- templates/_base/fragments/subagent-dispatch.md.tmpl +3 -0
- templates/_base/fragments/task-authoring.md.tmpl +69 -0
- templates/_base/fragments/task-logging.md.tmpl +8 -0
- templates/_base/fragments/tool-routing.md.tmpl +9 -0
- templates/_base/fragments/verification-matrix.md.tmpl +12 -0
- templates/_base/lang/dart/analysis_options.yaml +7 -0
- templates/_base/lang/php/phpcs.xml.dist +10 -0
- templates/_base/lang/python/pyproject.toml +19 -0
- templates/_base/lang/rust/clippy.toml +5 -0
- templates/_base/lang/rust/rustfmt.toml +3 -0
- templates/_base/lang/typescript/eslint.config.js +26 -0
- templates/_base/lang/typescript/tsconfig.json +15 -0
- templates/_base/lang/typescript/vitest.config.ts +10 -0
- templates/_base/scaffold/changes.log +1 -0
- templates/_base/scaffold/docs/00-index.md +55 -0
- templates/_base/scaffold/docs/_meta/feature-dependency-tree.md +30 -0
- templates/_base/scaffold/docs/_meta/foundation-map.md +56 -0
- templates/_base/scaffold/docs/_meta/questions.md +8 -0
- templates/_base/scaffold/docs/_meta/roadmap.md +33 -0
- templates/_base/scaffold/docs/api-contracts/00-index.md +58 -0
- templates/_base/scaffold/docs/api-contracts/error-format.md +58 -0
- templates/_base/scaffold/docs/architecture/00-index.md +42 -0
- templates/_base/scaffold/docs/architecture/adr/00-index.md +39 -0
- templates/_base/scaffold/docs/engineering/00-index.md +9 -0
- templates/_base/scaffold/docs/governance/00-index.md +55 -0
- templates/_base/scaffold/docs/governance/_templates/doc-cheat-sheet.md +202 -0
- templates/_base/scaffold/docs/governance/_templates/playbook-template.md +81 -0
- templates/_base/scaffold/docs/governance/_templates/post-mortem-template.md +85 -0
- templates/_base/scaffold/docs/governance/_templates/runbook-template.md +88 -0
- templates/_base/scaffold/docs/governance/_templates/security-review-template.md +111 -0
- templates/_base/scaffold/docs/governance/_templates/task-detail.md +61 -0
- templates/_base/scaffold/docs/governance/agent-workflow.md +101 -0
- templates/_base/scaffold/docs/governance/anatomy-contract.md +150 -0
- templates/_base/scaffold/docs/governance/critical-rules.md +224 -0
- templates/_base/scaffold/docs/governance/decision-records.md +58 -0
- templates/_base/scaffold/docs/governance/docs-first-protocol.md +157 -0
- templates/_base/scaffold/docs/governance/docs-system.md +151 -0
- templates/_base/scaffold/docs/governance/gdpr-compliance.md +66 -0
- templates/_base/scaffold/docs/governance/mcp-tool-inventory.md +112 -0
- templates/_base/scaffold/docs/governance/risk-register.md +26 -0
- templates/_base/scaffold/docs/governance/scaffold-boundary-contract.md +161 -0
- templates/_base/scaffold/docs/governance/task-lifecycle.md +125 -0
- templates/_base/scaffold/docs/governance/wrapper-derivation.md +50 -0
- templates/_base/scaffold/docs/insights/00-index.md +17 -0
- templates/_base/scaffold/docs/ops/00-index.md +59 -0
- templates/_base/scaffold/docs/ops/runbooks/00-index.md +9 -0
- templates/_base/scaffold/docs/playbooks/00-index.md +12 -0
- templates/_base/scaffold/docs/playbooks/research-validation.md +29 -0
- templates/_base/scaffold/docs/playbooks/security-review.md +41 -0
- templates/_base/scaffold/docs/prd/00-index.md +43 -0
- templates/_base/scaffold/docs/prd/01-snapshot-vision.md +56 -0
- templates/_base/scaffold/docs/workflow/workflow-guide.md +138 -0
- templates/_base/scaffold/src/shared/README.md +23 -0
- templates/_base/skill-enforcement.template.md +14 -0
- templates/_base/task-detail.template.md +61 -0
- templates/_presets/ai-saas.yaml +9 -0
- templates/_presets/django-next.yaml +8 -0
- templates/_presets/dotnet-react.yaml +8 -0
- templates/_presets/flutter-baas.yaml +8 -0
- templates/_presets/go-react.yaml +8 -0
- templates/_presets/hexagonal-product.yaml +16 -0
- templates/_presets/jamstack.yaml +8 -0
- templates/_presets/laravel-vue.yaml +8 -0
- templates/_presets/mean.yaml +8 -0
- templates/_presets/mern.yaml +9 -0
- templates/_presets/nest-angular.yaml +8 -0
- templates/_presets/nextjs-fastapi.yaml +10 -0
- templates/_presets/nuxt-fullstack.yaml +9 -0
- templates/_presets/pern.yaml +9 -0
- templates/_presets/rails-react.yaml +8 -0
- templates/_presets/rn-api.yaml +8 -0
- templates/_presets/rust-svelte.yaml +8 -0
- templates/_presets/spring-react.yaml +8 -0
- templates/_presets/t3-style.yaml +9 -0
- templates/_presets/tall.yaml +8 -0
- templates/_presets/wordpress-cms.yaml +8 -0
- templates/angular/rules/frontend.md +19 -0
- templates/angular/scaffold/docs/engineering/accessibility.md +46 -0
- templates/angular/scaffold/docs/engineering/angular-rules.md +35 -0
- templates/angular/scaffold/docs/playbooks/angular-app.md +42 -0
- templates/angular/scaffold/src/frontend/angular.json +52 -0
- templates/angular/scaffold/src/frontend/package.json +28 -0
- templates/angular/scaffold/src/frontend/src/app/app.component.ts +19 -0
- templates/angular/scaffold/src/frontend/src/app/app.config.ts +22 -0
- templates/angular/scaffold/src/frontend/src/app/app.routes.ts +8 -0
- templates/angular/scaffold/src/frontend/src/app/core/global-error-handler.ts +12 -0
- templates/angular/scaffold/src/frontend/src/app/health/health.component.ts +14 -0
- templates/angular/scaffold/src/frontend/src/app/health/health.service.spec.ts +16 -0
- templates/angular/scaffold/src/frontend/src/app/health/health.service.ts +10 -0
- templates/angular/scaffold/src/frontend/src/index.html +11 -0
- templates/angular/scaffold/src/frontend/src/main.ts +9 -0
- templates/angular/scaffold/src/frontend/src/styles.css +14 -0
- templates/angular/scaffold/src/frontend/tsconfig.app.json +8 -0
- templates/angular/scaffold/src/frontend/tsconfig.json +27 -0
- templates/angular/scaffold/src/frontend/tsconfig.spec.json +8 -0
- templates/angular/scaffold-boundary.yaml +27 -0
- templates/angular/skills/angular/SKILL.md +79 -0
- templates/angular/skills/angular/references/anatomy.md +69 -0
- templates/angular/stack.yaml +75 -0
- templates/aspnet-core/rules/backend.md +20 -0
- templates/aspnet-core/scaffold/docs/engineering/aspnet-core-rules.md +36 -0
- templates/aspnet-core/scaffold/docs/playbooks/aspnet-core-service.md +40 -0
- templates/aspnet-core/scaffold/src/backend/Backend.csproj +11 -0
- templates/aspnet-core/scaffold/src/backend/Backend.sln +27 -0
- templates/aspnet-core/scaffold/src/backend/Common/ExceptionHandlingMiddleware.cs +35 -0
- templates/aspnet-core/scaffold/src/backend/Features/Health/HealthEndpoints.cs +10 -0
- templates/aspnet-core/scaffold/src/backend/Features/Health/HealthService.cs +9 -0
- templates/aspnet-core/scaffold/src/backend/Program.cs +22 -0
- templates/aspnet-core/scaffold/src/backend/tests/Backend.Tests/Backend.Tests.csproj +22 -0
- templates/aspnet-core/scaffold/src/backend/tests/Backend.Tests/HealthServiceTests.cs +15 -0
- templates/aspnet-core/scaffold-boundary.yaml +24 -0
- templates/aspnet-core/skills/aspnet-core/SKILL.md +80 -0
- templates/aspnet-core/skills/aspnet-core/references/anatomy.md +65 -0
- templates/aspnet-core/stack.yaml +68 -0
- templates/astro/rules/frontend.md +20 -0
- templates/astro/scaffold/docs/engineering/astro-rules.md +40 -0
- templates/astro/scaffold/docs/playbooks/astro-app.md +57 -0
- templates/astro/scaffold/docs/playbooks/content-seo.md +37 -0
- templates/astro/scaffold/src/frontend/astro.config.mjs +10 -0
- templates/astro/scaffold/src/frontend/package.json +23 -0
- templates/astro/scaffold/src/frontend/src/components/Greeting.astro +13 -0
- templates/astro/scaffold/src/frontend/src/content/posts/hello.md +10 -0
- templates/astro/scaffold/src/frontend/src/content.config.ts +19 -0
- templates/astro/scaffold/src/frontend/src/lib/problem.test.ts +39 -0
- templates/astro/scaffold/src/frontend/src/lib/problem.ts +30 -0
- templates/astro/scaffold/src/frontend/src/pages/api/health.ts +13 -0
- templates/astro/scaffold/src/frontend/src/pages/index.astro +21 -0
- templates/astro/scaffold/src/frontend/tsconfig.json +9 -0
- templates/astro/scaffold/src/frontend/vitest.config.ts +10 -0
- templates/astro/scaffold-boundary.yaml +28 -0
- templates/astro/skills/astro/SKILL.md +71 -0
- templates/astro/skills/astro/references/anatomy.md +66 -0
- templates/astro/stack.yaml +75 -0
- templates/csharp-plain/scaffold/src/backend/Backend.csproj +12 -0
- templates/csharp-plain/scaffold/src/backend/Program.cs +1 -0
- templates/csharp-plain/scaffold-boundary.yaml +23 -0
- templates/csharp-plain/stack.yaml +50 -0
- templates/django/rules/backend.md +18 -0
- templates/django/scaffold/docs/engineering/anti-ambiguity.md +74 -0
- templates/django/scaffold/docs/engineering/backend-rules.md +133 -0
- templates/django/scaffold/docs/engineering/glossary.md +51 -0
- templates/django/scaffold/docs/engineering/logging-standards.md +107 -0
- templates/django/scaffold/docs/engineering/naming-conventions.md +68 -0
- templates/django/scaffold/docs/engineering/secrets-rotation-runbook.md +142 -0
- templates/django/scaffold/docs/playbooks/backend-api.md +119 -0
- templates/django/scaffold/src/backend/config/__init__.py +0 -0
- templates/django/scaffold/src/backend/config/settings.py +31 -0
- templates/django/scaffold/src/backend/config/urls.py +11 -0
- templates/django/scaffold/src/backend/config/wsgi.py +6 -0
- templates/django/scaffold/src/backend/manage.py +14 -0
- templates/django/scaffold/src/backend/pyproject.toml +37 -0
- templates/django/scaffold/src/backend/tests/test_health.py +4 -0
- templates/django/scaffold-boundary.yaml +25 -0
- templates/django/skills/python-django/SKILL.md +450 -0
- templates/django/skills/python-django/references/anatomy.md +117 -0
- templates/django/skills/python-django/scripts/new_endpoint.py +89 -0
- templates/django/stack.yaml +73 -0
- templates/fastapi/rules/backend.md +18 -0
- templates/fastapi/scaffold/docs/engineering/fastapi-rules.md +37 -0
- templates/fastapi/scaffold/docs/playbooks/fastapi-service.md +30 -0
- templates/fastapi/scaffold/src/backend/app/__init__.py +0 -0
- templates/fastapi/scaffold/src/backend/app/main.py +8 -0
- templates/fastapi/scaffold/src/backend/pyproject.toml +39 -0
- templates/fastapi/scaffold/src/backend/tests/test_health.py +11 -0
- templates/fastapi/scaffold-boundary.yaml +25 -0
- templates/fastapi/skills/python-fastapi/SKILL.md +75 -0
- templates/fastapi/skills/python-fastapi/references/anatomy.md +117 -0
- templates/fastapi/skills/python-fastapi/scripts/new_endpoint.py +101 -0
- templates/fastapi/stack.yaml +57 -0
- templates/flutter/rules/mobile.md +26 -0
- templates/flutter/scaffold/docs/engineering/flutter-rules.md +35 -0
- templates/flutter/scaffold/docs/playbooks/flutter-app.md +45 -0
- templates/flutter/scaffold/src/mobile/lib/core/error_mapper.dart +17 -0
- templates/flutter/scaffold/src/mobile/lib/core/router.dart +13 -0
- templates/flutter/scaffold/src/mobile/lib/main.dart +22 -0
- templates/flutter/scaffold/src/mobile/lib/screens/health_screen.dart +32 -0
- templates/flutter/scaffold/src/mobile/lib/services/health_service.dart +11 -0
- templates/flutter/scaffold/src/mobile/lib/state/health_provider.dart +13 -0
- templates/flutter/scaffold/src/mobile/pubspec.yaml +22 -0
- templates/flutter/scaffold/src/mobile/test/health_provider_test.dart +90 -0
- templates/flutter/scaffold-boundary.yaml +28 -0
- templates/flutter/skills/flutter/SKILL.md +76 -0
- templates/flutter/skills/flutter/references/anatomy.md +64 -0
- templates/flutter/stack.yaml +70 -0
- templates/go/rules/backend.md +19 -0
- templates/go/scaffold/docs/engineering/go-rules.md +45 -0
- templates/go/scaffold/docs/playbooks/go-service.md +30 -0
- templates/go/scaffold/src/backend/cmd/api/main.go +22 -0
- templates/go/scaffold/src/backend/cmd/api/main_test.go +20 -0
- templates/go/scaffold/src/backend/go.mod +3 -0
- templates/go/scaffold-boundary.yaml +25 -0
- templates/go/skills/go-patterns/SKILL.md +68 -0
- templates/go/skills/go-patterns/assets/go-checklist.md +29 -0
- templates/go/skills/go-patterns/references/anatomy.md +115 -0
- templates/go/skills/go-patterns/references/go-2026-idioms.md +92 -0
- templates/go/skills/go-patterns/scripts/new_endpoint.py +117 -0
- templates/go/skills/go-patterns/versions.json +16 -0
- templates/go/stack.yaml +54 -0
- templates/go-fiber/rules/backend.md +20 -0
- templates/go-fiber/scaffold/docs/engineering/fiber-rules.md +97 -0
- templates/go-fiber/scaffold/docs/playbooks/fiber-service.md +149 -0
- templates/go-fiber/scaffold/src/backend/cmd/api/main.go +21 -0
- templates/go-fiber/scaffold/src/backend/cmd/api/main_test.go +17 -0
- templates/go-fiber/scaffold/src/backend/go.mod +23 -0
- templates/go-fiber/scaffold/src/backend/go.sum +49 -0
- templates/go-fiber/scaffold-boundary.yaml +26 -0
- templates/go-fiber/skills/go-fiber/SKILL.md +203 -0
- templates/go-fiber/skills/go-fiber/assets/fiber-checklist.md +26 -0
- templates/go-fiber/skills/go-fiber/references/anatomy.md +116 -0
- templates/go-fiber/skills/go-fiber/references/fiber-v3-patterns.md +89 -0
- templates/go-fiber/skills/go-fiber/scripts/new_endpoint.py +107 -0
- templates/go-fiber/skills/go-fiber/versions.json +16 -0
- templates/go-fiber/stack.yaml +59 -0
- templates/go-plain/scaffold/src/backend/go.mod +3 -0
- templates/go-plain/scaffold/src/backend/main.go +7 -0
- templates/go-plain/scaffold-boundary.yaml +22 -0
- templates/go-plain/stack.yaml +51 -0
- templates/java-plain/scaffold/src/backend/mvnw +302 -0
- templates/java-plain/scaffold/src/backend/pom.xml +41 -0
- templates/java-plain/scaffold/src/backend/src/main/java/com/example/app/Main.java +10 -0
- templates/java-plain/scaffold-boundary.yaml +23 -0
- templates/java-plain/stack.yaml +51 -0
- templates/laravel/rules/backend.md +20 -0
- templates/laravel/scaffold/docs/engineering/laravel-rules.md +28 -0
- templates/laravel/scaffold/docs/playbooks/laravel-service.md +28 -0
- templates/laravel/scaffold/src/backend/app/Exceptions/Handler.php +27 -0
- templates/laravel/scaffold/src/backend/app/Http/Controllers/HealthController.php +15 -0
- templates/laravel/scaffold/src/backend/app/Support/HealthStatus.php +14 -0
- templates/laravel/scaffold/src/backend/composer.json +24 -0
- templates/laravel/scaffold/src/backend/phpunit.xml +10 -0
- templates/laravel/scaffold/src/backend/public/index.php +8 -0
- templates/laravel/scaffold/src/backend/routes/api.php +7 -0
- templates/laravel/scaffold/src/backend/tests/Unit/HealthStatusTest.php +16 -0
- templates/laravel/scaffold-boundary.yaml +23 -0
- templates/laravel/skills/laravel/SKILL.md +56 -0
- templates/laravel/skills/laravel/references/anatomy.md +65 -0
- templates/laravel/stack.yaml +66 -0
- templates/meta/rules/graph-first.md +27 -0
- templates/meta/rules/hook-author.md +19 -0
- templates/meta/rules/mcp-tool-author.md +18 -0
- templates/meta/rules/meta-engineering.md +17 -0
- templates/meta/scaffold-boundary.yaml +55 -0
- templates/meta/skills/claude-sdk-integration/SKILL.md +163 -0
- templates/meta/skills/claude-sdk-integration/assets/sdk-checklist.md +27 -0
- templates/meta/skills/claude-sdk-integration/scripts/check_model_ids.py +97 -0
- templates/meta/skills/graph-os-authoring/SKILL.md +278 -0
- templates/meta/skills/graph-os-authoring/assets/graph-os-checklist.md +25 -0
- templates/meta/skills/graph-os-authoring/scripts/new_extractor.py +76 -0
- templates/meta/skills/hook-authoring/SKILL.md +292 -0
- templates/meta/skills/hook-authoring/assets/hook-checklist.md +30 -0
- templates/meta/skills/hook-authoring/scripts/new_hook.sh +75 -0
- templates/meta/skills/mcp-tool-authoring/SKILL.md +301 -0
- templates/meta/skills/mcp-tool-authoring/assets/mcp-tool-checklist.md +29 -0
- templates/meta/skills/mcp-tool-authoring/scripts/new_tool.py +74 -0
- templates/meta/skills/meta-engineering/SKILL.md +151 -0
- templates/meta/skills/meta-engineering/assets/meta-edit-checklist.md +28 -0
- templates/meta/skills/meta-engineering/scripts/which_layer.py +61 -0
- templates/meta/skills/python-meta-server/SKILL.md +162 -0
- templates/meta/skills/python-meta-server/assets/meta-server-checklist.md +28 -0
- templates/meta/skills/python-meta-server/scripts/check_envelope.py +91 -0
- templates/meta/skills/react-vite-hub/SKILL.md +140 -0
- templates/meta/skills/react-vite-hub/assets/hub-ui-checklist.md +23 -0
- templates/meta/skills/react-vite-hub/scripts/check_vite_env.py +73 -0
- templates/meta/stack.yaml +119 -0
- templates/nestjs/rules/backend.md +20 -0
- templates/nestjs/scaffold/docs/engineering/nestjs-rules.md +33 -0
- templates/nestjs/scaffold/docs/playbooks/nestjs-service.md +39 -0
- templates/nestjs/scaffold/src/backend/nest-cli.json +5 -0
- templates/nestjs/scaffold/src/backend/package.json +28 -0
- templates/nestjs/scaffold/src/backend/src/app.module.ts +9 -0
- templates/nestjs/scaffold/src/backend/src/common/all-exceptions.filter.ts +59 -0
- templates/nestjs/scaffold/src/backend/src/health/health.controller.ts +14 -0
- templates/nestjs/scaffold/src/backend/src/health/health.module.ts +10 -0
- templates/nestjs/scaffold/src/backend/src/health/health.service.spec.ts +21 -0
- templates/nestjs/scaffold/src/backend/src/health/health.service.ts +9 -0
- templates/nestjs/scaffold/src/backend/src/main.ts +26 -0
- templates/nestjs/scaffold/src/backend/tsconfig.json +16 -0
- templates/nestjs/scaffold/src/backend/vitest.config.ts +9 -0
- templates/nestjs/scaffold-boundary.yaml +25 -0
- templates/nestjs/skills/nestjs/SKILL.md +67 -0
- templates/nestjs/skills/nestjs/references/anatomy.md +65 -0
- templates/nestjs/stack.yaml +68 -0
- templates/nextjs/rules/frontend.md +18 -0
- templates/nextjs/scaffold/docs/design/00-index.md +23 -0
- templates/nextjs/scaffold/docs/design/colors-tokens.md +141 -0
- templates/nextjs/scaffold/docs/design/components-patterns.md +159 -0
- templates/nextjs/scaffold/docs/design/motion-accessibility.md +137 -0
- templates/nextjs/scaffold/docs/design/typography-spacing.md +107 -0
- templates/nextjs/scaffold/docs/engineering/accessibility-web.md +56 -0
- templates/nextjs/scaffold/docs/engineering/copywriting-standard.md +102 -0
- templates/nextjs/scaffold/docs/engineering/formatting-rules.md +89 -0
- templates/nextjs/scaffold/docs/engineering/frontend-rendering-rules.md +80 -0
- templates/nextjs/scaffold/docs/engineering/frontend-rules.md +183 -0
- templates/nextjs/scaffold/docs/engineering/i18n-policy.md +99 -0
- templates/nextjs/scaffold/docs/pages-content-spec/00-index.md +78 -0
- templates/nextjs/scaffold/docs/playbooks/content-seo.md +55 -0
- templates/nextjs/scaffold/docs/playbooks/docs-governance.md +51 -0
- templates/nextjs/scaffold/docs/playbooks/frontend-ui.md +63 -0
- templates/nextjs/scaffold/src/frontend/app/layout.tsx +14 -0
- templates/nextjs/scaffold/src/frontend/app/page.tsx +3 -0
- templates/nextjs/scaffold/src/frontend/eslint.config.js +17 -0
- templates/nextjs/scaffold/src/frontend/lib/greeting.test.ts +9 -0
- templates/nextjs/scaffold/src/frontend/lib/greeting.ts +3 -0
- templates/nextjs/scaffold/src/frontend/package.json +28 -0
- templates/nextjs/scaffold/src/frontend/tsconfig.json +18 -0
- templates/nextjs/scaffold/src/frontend/vitest.config.ts +10 -0
- templates/nextjs/scaffold-boundary.yaml +30 -0
- templates/nextjs/skills/nextjs-react/SKILL.md +485 -0
- templates/nextjs/skills/nextjs-react/references/anatomy.md +116 -0
- templates/nextjs/skills/nextjs-react/scripts/new_component.py +72 -0
- templates/nextjs/stack.yaml +81 -0
- templates/node-express/rules/backend.md +20 -0
- templates/node-express/scaffold/docs/engineering/express-rules.md +30 -0
- templates/node-express/scaffold/docs/playbooks/express-service.md +35 -0
- templates/node-express/scaffold/src/backend/package.json +24 -0
- templates/node-express/scaffold/src/backend/src/index.ts +17 -0
- templates/node-express/scaffold/src/backend/src/middleware/error-handler.ts +12 -0
- templates/node-express/scaffold/src/backend/src/routes/health.test.ts +33 -0
- templates/node-express/scaffold/src/backend/src/routes/health.ts +7 -0
- templates/node-express/scaffold/src/backend/tsconfig.json +15 -0
- templates/node-express/scaffold/src/backend/types/express-bootstrap.d.ts +21 -0
- templates/node-express/scaffold-boundary.yaml +25 -0
- templates/node-express/skills/node-express/SKILL.md +70 -0
- templates/node-express/skills/node-express/references/anatomy.md +63 -0
- templates/node-express/stack.yaml +63 -0
- templates/python/scaffold/docs/engineering/python-rules.md +27 -0
- templates/python/scaffold/docs/playbooks/python-library.md +35 -0
- templates/python/stack.yaml +60 -0
- templates/rails/rules/backend.md +10 -0
- templates/rails/scaffold/docs/engineering/rails-rules.md +33 -0
- templates/rails/scaffold/docs/playbooks/rails-service.md +42 -0
- templates/rails/scaffold/src/backend/Gemfile +12 -0
- templates/rails/scaffold/src/backend/app/controllers/application_controller.rb +26 -0
- templates/rails/scaffold/src/backend/app/controllers/health_controller.rb +6 -0
- templates/rails/scaffold/src/backend/app/models/health.rb +6 -0
- templates/rails/scaffold/src/backend/config/application.rb +12 -0
- templates/rails/scaffold/src/backend/config/boot.rb +3 -0
- templates/rails/scaffold/src/backend/config/routes.rb +4 -0
- templates/rails/scaffold/src/backend/config.ru +5 -0
- templates/rails/scaffold/src/backend/spec/rails_helper.rb +18 -0
- templates/rails/scaffold/src/backend/spec/requests/health_spec.rb +24 -0
- templates/rails/scaffold-boundary.yaml +25 -0
- templates/rails/skills/rails/SKILL.md +62 -0
- templates/rails/skills/rails/references/anatomy.md +71 -0
- templates/rails/stack.yaml +72 -0
- templates/react-native/rules/mobile.md +26 -0
- templates/react-native/scaffold/docs/engineering/accessibility-mobile.md +95 -0
- templates/react-native/scaffold/docs/engineering/mobile-rules.md +56 -0
- templates/react-native/scaffold/docs/engineering/offline-first.md +61 -0
- templates/react-native/scaffold/docs/playbooks/mobile-app.md +49 -0
- templates/react-native/scaffold/src/mobile/App.tsx +9 -0
- templates/react-native/scaffold/src/mobile/eslint.config.js +17 -0
- templates/react-native/scaffold/src/mobile/package.json +23 -0
- templates/react-native/scaffold/src/mobile/src/greeting.test.ts +9 -0
- templates/react-native/scaffold/src/mobile/src/greeting.ts +3 -0
- templates/react-native/scaffold/src/mobile/tsconfig.json +17 -0
- templates/react-native/scaffold/src/mobile/vitest.config.ts +10 -0
- templates/react-native/scaffold-boundary.yaml +30 -0
- templates/react-native/skills/react-native-mobile/SKILL.md +119 -0
- templates/react-native/skills/react-native-mobile/assets/rn-mobile-checklist.md +28 -0
- templates/react-native/skills/react-native-mobile/references/anatomy.md +140 -0
- templates/react-native/skills/react-native-mobile/references/rn-2026-practices.md +54 -0
- templates/react-native/skills/react-native-mobile/scripts/new_screen.py +73 -0
- templates/react-native/skills/react-native-mobile/versions.json +16 -0
- templates/react-native/skills/react-native-patterns/SKILL.md +512 -0
- templates/react-native/skills/react-native-patterns/assets/rn-review-checklist.md +26 -0
- templates/react-native/skills/react-native-patterns/references/anatomy.md +62 -0
- templates/react-native/skills/react-native-patterns/references/list-performance.md +70 -0
- templates/react-native/skills/react-native-patterns/scripts/scan_rn_perf.py +77 -0
- templates/react-native/stack.yaml +70 -0
- templates/ruby-plain/scaffold/src/backend/Gemfile +8 -0
- templates/ruby-plain/scaffold/src/backend/main.rb +3 -0
- templates/ruby-plain/scaffold-boundary.yaml +23 -0
- templates/ruby-plain/stack.yaml +50 -0
- templates/rust-axum/rules/backend.md +20 -0
- templates/rust-axum/scaffold/docs/engineering/rust-axum-rules.md +35 -0
- templates/rust-axum/scaffold/docs/playbooks/rust-axum-service.md +43 -0
- templates/rust-axum/scaffold/src/backend/Cargo.toml +20 -0
- templates/rust-axum/scaffold/src/backend/src/app.rs +12 -0
- templates/rust-axum/scaffold/src/backend/src/error.rs +48 -0
- templates/rust-axum/scaffold/src/backend/src/main.rs +24 -0
- templates/rust-axum/scaffold/src/backend/src/routes/health.rs +37 -0
- templates/rust-axum/scaffold/src/backend/src/routes/mod.rs +2 -0
- templates/rust-axum/scaffold-boundary.yaml +25 -0
- templates/rust-axum/skills/rust/SKILL.md +73 -0
- templates/rust-axum/skills/rust/references/anatomy.md +63 -0
- templates/rust-axum/stack.yaml +65 -0
- templates/rust-plain/scaffold/src/backend/Cargo.toml +6 -0
- templates/rust-plain/scaffold/src/backend/src/main.rs +3 -0
- templates/rust-plain/scaffold-boundary.yaml +23 -0
- templates/rust-plain/stack.yaml +51 -0
- templates/spring-boot/rules/backend.md +20 -0
- templates/spring-boot/scaffold/docs/engineering/spring-boot-rules.md +35 -0
- templates/spring-boot/scaffold/docs/playbooks/spring-boot-service.md +45 -0
- templates/spring-boot/scaffold/src/backend/mvnw +302 -0
- templates/spring-boot/scaffold/src/backend/pom.xml +69 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/Application.java +16 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/common/GlobalExceptionHandler.java +31 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthController.java +22 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthService.java +12 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthStatus.java +4 -0
- templates/spring-boot/scaffold/src/backend/src/test/java/com/example/app/health/HealthServiceTest.java +15 -0
- templates/spring-boot/scaffold-boundary.yaml +26 -0
- templates/spring-boot/skills/spring-boot/SKILL.md +84 -0
- templates/spring-boot/skills/spring-boot/references/anatomy.md +63 -0
- templates/spring-boot/stack.yaml +65 -0
- templates/svelte-sveltekit/rules/frontend.md +20 -0
- templates/svelte-sveltekit/scaffold/docs/engineering/svelte-sveltekit-rules.md +37 -0
- templates/svelte-sveltekit/scaffold/docs/playbooks/svelte-sveltekit-app.md +36 -0
- templates/svelte-sveltekit/scaffold/src/frontend/package.json +22 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/app.html +12 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/hooks.server.ts +14 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/lib/components/Greeting.svelte +6 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/lib/stores/count.test.ts +26 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/lib/stores/count.ts +4 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+layout.svelte +24 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+page.svelte +9 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+page.ts +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/health/+server.ts +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/svelte.config.js +10 -0
- templates/svelte-sveltekit/scaffold/src/frontend/tsconfig.json +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/vite.config.ts +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/vitest.config.ts +11 -0
- templates/svelte-sveltekit/scaffold-boundary.yaml +29 -0
- templates/svelte-sveltekit/skills/svelte/SKILL.md +90 -0
- templates/svelte-sveltekit/skills/svelte/references/anatomy.md +62 -0
- templates/svelte-sveltekit/stack.yaml +70 -0
- templates/typescript-plain/scaffold/src/index.ts +3 -0
- templates/typescript-plain/scaffold/tsconfig.json +13 -0
- templates/typescript-plain/scaffold-boundary.yaml +22 -0
- templates/typescript-plain/stack.yaml +44 -0
- templates/vue-nuxt/rules/frontend.md +19 -0
- templates/vue-nuxt/scaffold/docs/engineering/nuxt-rules.md +30 -0
- templates/vue-nuxt/scaffold/docs/playbooks/nuxt-app.md +29 -0
- templates/vue-nuxt/scaffold/src/frontend/app.vue +3 -0
- templates/vue-nuxt/scaffold/src/frontend/nuxt.config.ts +11 -0
- templates/vue-nuxt/scaffold/src/frontend/package.json +20 -0
- templates/vue-nuxt/scaffold/src/frontend/pages/index.test.ts +19 -0
- templates/vue-nuxt/scaffold/src/frontend/pages/index.vue +11 -0
- templates/vue-nuxt/scaffold/src/frontend/vitest.config.ts +12 -0
- templates/vue-nuxt/scaffold-boundary.yaml +26 -0
- templates/vue-nuxt/skills/vue-nuxt/SKILL.md +57 -0
- templates/vue-nuxt/skills/vue-nuxt/references/anatomy.md +60 -0
- templates/vue-nuxt/stack.yaml +61 -0
- templates/wordpress/rules/backend.md +19 -0
- templates/wordpress/scaffold/docs/engineering/wordpress-rules.md +28 -0
- templates/wordpress/scaffold/docs/playbooks/wordpress-service.md +29 -0
- templates/wordpress/scaffold/src/backend/composer.json +17 -0
- templates/wordpress/scaffold/src/backend/phpcs.xml.dist +11 -0
- templates/wordpress/scaffold/src/backend/phpunit.xml +10 -0
- templates/wordpress/scaffold/src/backend/plugin/inc/health.php +8 -0
- templates/wordpress/scaffold/src/backend/plugin/plugin.php +28 -0
- templates/wordpress/scaffold/src/backend/tests/HealthStatusTest.php +15 -0
- templates/wordpress/scaffold/src/backend/theme/functions.php +18 -0
- templates/wordpress/scaffold/src/backend/theme/style.css +11 -0
- templates/wordpress/scaffold-boundary.yaml +23 -0
- templates/wordpress/skills/wordpress/SKILL.md +110 -0
- templates/wordpress/skills/wordpress/assets/wp-checklist.md +28 -0
- templates/wordpress/skills/wordpress/references/wp-development.md +75 -0
- templates/wordpress/skills/wordpress/references/wp-security.md +68 -0
- templates/wordpress/skills/wordpress/scripts/scan_wp_smells.py +91 -0
- templates/wordpress/skills/wordpress/versions.json +16 -0
- templates/wordpress/stack.yaml +60 -0
- thinking_os/__init__.py +1 -0
- thinking_os/_agent_markers.py +32 -0
- thinking_os/background.py +405 -0
- thinking_os/bootstrap_outcomes.py +200 -0
- thinking_os/budget.py +302 -0
- thinking_os/capture.py +495 -0
- thinking_os/cognition.py +516 -0
- thinking_os/cognition_schemas.py +517 -0
- thinking_os/compress.py +192 -0
- thinking_os/concepts.py +233 -0
- thinking_os/dashboard.py +159 -0
- thinking_os/database.py +2883 -0
- thinking_os/decay.py +393 -0
- thinking_os/digest.py +295 -0
- thinking_os/dispatcher.py +192 -0
- thinking_os/dispatcher_helpers.py +48 -0
- thinking_os/dispatchers/__init__.py +3 -0
- thinking_os/dispatchers/default.py +47 -0
- thinking_os/distill.py +192 -0
- thinking_os/doc_indexer.py +905 -0
- thinking_os/embeddings.py +943 -0
- thinking_os/formula_composer.py +556 -0
- thinking_os/gate_marker.py +75 -0
- thinking_os/graph.py +296 -0
- thinking_os/graph_indexer.py +360 -0
- thinking_os/health_check.py +517 -0
- thinking_os/impact.py +119 -0
- thinking_os/memory_gc.py +356 -0
- thinking_os/migrator_embeddings.py +318 -0
- thinking_os/precision.py +194 -0
- thinking_os/record_outcome.py +399 -0
- thinking_os/repair.py +105 -0
- thinking_os/retrieval_quality.py +239 -0
- thinking_os/roles_state.py +168 -0
- thinking_os/sanitizer.py +320 -0
- thinking_os/server.py +3160 -0
- thinking_os/session_enrich.py +272 -0
- thinking_os/session_observe_worker.py +111 -0
- thinking_os/session_startup.py +74 -0
- thinking_os/session_summary.py +245 -0
- thinking_os/task_analyzer.py +462 -0
- thinking_os/task_parser.py +342 -0
- thinking_os/task_sync.py +73 -0
- thinking_os/tools/__init__.py +6 -0
- thinking_os/tools/_shared.py +947 -0
- thinking_os/tools/cognition.py +1867 -0
- thinking_os/tools/docs.py +770 -0
- thinking_os/tools/learning.py +2078 -0
- thinking_os/tools/logs.py +79 -0
- thinking_os/tools/memory.py +840 -0
- thinking_os/tools/metrics.py +200 -0
- thinking_os/tools/retrieve.py +415 -0
- thinking_os/tools/routing.py +658 -0
- thinking_os/tools/tasks.py +449 -0
- thinking_os/tools/trajectory.py +181 -0
- thinking_os/tracing.py +235 -0
- web/__init__.py +5 -0
- web/_cache.py +118 -0
- web/_deps.py +56 -0
- web/_envelope.py +85 -0
- web/_project_context.py +140 -0
- web/chat_providers.py +108 -0
- web/init_jobs.py +216 -0
- web/routes/__init__.py +25 -0
- web/routes/_bounded_read.py +76 -0
- web/routes/board.py +1089 -0
- web/routes/cognition.py +1838 -0
- web/routes/config.py +635 -0
- web/routes/graph.py +513 -0
- web/routes/health.py +180 -0
- web/routes/hooks.py +288 -0
- web/routes/hub.py +1219 -0
- web/routes/logs.py +374 -0
- web/routes/metrics.py +43 -0
- web/routes/observability.py +400 -0
- web/routes/patterns.py +227 -0
- web/routes/presence.py +609 -0
- web/routes/roles.py +446 -0
- web/routes/scheduled.py +261 -0
- web/routes/search.py +238 -0
- web/routes/sessions.py +220 -0
- web/routes/settings.py +363 -0
- web/routes/stream.py +547 -0
- web/security.py +157 -0
- web/server.py +283 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: a11y
|
|
3
|
+
tier: cross-cutting
|
|
4
|
+
domain: [frontend, mobile]
|
|
5
|
+
description: Accessibility (a11y) for web + mobile per WCAG 2.2 AA. Use when writing or reviewing UI code (React, React Native, Vue, Svelte) — screens, components, forms, modals, toasts, navigation. Covers semantic HTML / RN AccessibilityInfo props, ARIA patterns (use natives first), keyboard navigation, focus management, screen reader testing (VoiceOver / TalkBack / NVDA), color contrast, motion sensitivity, accessible forms with error handling, live regions, automated tooling (axe-core, Lighthouse, Playwright). Pairs with frontend-fundamentals (generic UI patterns).
|
|
6
|
+
last_reviewed: "2026-05-11"
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Accessibility — WCAG 2.2 AA
|
|
11
|
+
|
|
12
|
+
A practical playbook for making UI usable by people with disabilities. WCAG 2.2 (October 2023, current standard) at AA level is the legal compliance bar in most jurisdictions and the right minimum for any app shipping in 2026.
|
|
13
|
+
|
|
14
|
+
## When to Use This Skill
|
|
15
|
+
|
|
16
|
+
- Writing or reviewing any screen / component / form / modal.
|
|
17
|
+
- Adding interactive UI (buttons, menus, dropdowns, tabs).
|
|
18
|
+
- Setting up navigation (skip links, focus trap in modals).
|
|
19
|
+
- Choosing colors / typography for the design system.
|
|
20
|
+
- Auditing the app before launch.
|
|
21
|
+
- Responding to accessibility user feedback / lawsuit risk assessment.
|
|
22
|
+
|
|
23
|
+
For the cross-platform mobile concerns, see `mobile-fundamentals`. For component patterns, see `react-native-patterns` (RN) or `frontend-fundamentals` (web).
|
|
24
|
+
|
|
25
|
+
## The Four POUR Principles (WCAG)
|
|
26
|
+
|
|
27
|
+
WCAG organizes everything around four principles. Memorize the acronym; it's the lens for every UI decision.
|
|
28
|
+
|
|
29
|
+
1. **Perceivable** — Users must be able to perceive the content. Text alternatives for images, captions for video, sufficient color contrast, no info conveyed by color alone.
|
|
30
|
+
2. **Operable** — Users must be able to operate the UI. Keyboard accessible, enough time, no seizure-inducing flashes, navigable.
|
|
31
|
+
3. **Understandable** — Users must be able to understand the content + UI. Readable language, predictable behavior, helpful error messages.
|
|
32
|
+
4. **Robust** — Content works with current AND future assistive tech. Semantic markup, valid code, ARIA used correctly.
|
|
33
|
+
|
|
34
|
+
## Use Native Elements First
|
|
35
|
+
|
|
36
|
+
The most common a11y mistake: rebuilding a `<button>` as `<div onClick>`. The native element ships with:
|
|
37
|
+
|
|
38
|
+
- Keyboard accessibility (Enter/Space to activate).
|
|
39
|
+
- Focus indicator (browser default).
|
|
40
|
+
- Role announcement to screen readers ("button").
|
|
41
|
+
- Disabled state semantics.
|
|
42
|
+
- Form integration (submit, reset).
|
|
43
|
+
|
|
44
|
+
```html
|
|
45
|
+
<!-- WRONG — div + onClick. Loses everything. -->
|
|
46
|
+
<div onClick={handleClick}>Save</div>
|
|
47
|
+
|
|
48
|
+
<!-- RIGHT -->
|
|
49
|
+
<button type="button" onClick={handleClick}>Save</button>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
{/* React Native — use Pressable, not View + onPress */}
|
|
54
|
+
<Pressable
|
|
55
|
+
accessibilityRole="button"
|
|
56
|
+
accessibilityLabel="Save changes"
|
|
57
|
+
onPress={handlePress}>
|
|
58
|
+
<Text>Save</Text>
|
|
59
|
+
</Pressable>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
ARIA exists to fill gaps where native doesn't cover the pattern. The first rule of ARIA: don't use ARIA. The second rule: if you must, copy the pattern from the W3C ARIA Authoring Practices Guide (APG) — don't invent.
|
|
63
|
+
|
|
64
|
+
## Color + Contrast (WCAG 1.4.3, 1.4.11)
|
|
65
|
+
|
|
66
|
+
| Content | Minimum contrast ratio (AA) | Better (AAA) |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| Body text (< 18pt) | **4.5 : 1** | 7 : 1 |
|
|
69
|
+
| Large text (≥ 18pt or 14pt bold) | **3 : 1** | 4.5 : 1 |
|
|
70
|
+
| UI components, graphics (1.4.11) | **3 : 1** | n/a |
|
|
71
|
+
|
|
72
|
+
Tools:
|
|
73
|
+
|
|
74
|
+
- **Browser DevTools** — color picker shows contrast ratio inline.
|
|
75
|
+
- **Stark** (Figma plugin) — design-time check.
|
|
76
|
+
- **axe DevTools** (Chrome extension) — runtime audit.
|
|
77
|
+
|
|
78
|
+
**Don't convey info by color alone** (1.4.1). A red border for "error" is fine, but pair with an icon + text. Color-blind users won't see the red.
|
|
79
|
+
|
|
80
|
+
## Typography
|
|
81
|
+
|
|
82
|
+
- **Minimum body size**: 16px on web; the platform default on mobile.
|
|
83
|
+
- **Line height**: ≥ 1.5 (WCAG 1.4.12).
|
|
84
|
+
- **Letter spacing**: ≥ 0.12em for body text.
|
|
85
|
+
- **Don't disable user zoom** on mobile (`maximum-scale=1.0` in viewport meta is an a11y violation).
|
|
86
|
+
- **RN: support Dynamic Type** — text uses `allowFontScaling={true}` (default); test at the largest accessibility setting.
|
|
87
|
+
|
|
88
|
+
## Keyboard Navigation (WCAG 2.1)
|
|
89
|
+
|
|
90
|
+
Every interactive element must be reachable + operable via keyboard alone.
|
|
91
|
+
|
|
92
|
+
- **Tab order matches visual order** — DOM order is the default; avoid `tabindex` > 0.
|
|
93
|
+
- **Visible focus indicator** — never `outline: none` without a replacement. Use a 2-3px outline OR `:focus-visible` for keyboard-only focus.
|
|
94
|
+
- **Skip link** at the top of the page: "Skip to main content" — visible on focus.
|
|
95
|
+
- **No keyboard traps** — user can always Tab/Esc out.
|
|
96
|
+
- **Custom widgets** (autocomplete, tabs, accordion) — implement keyboard interactions per W3C ARIA APG patterns.
|
|
97
|
+
|
|
98
|
+
```css
|
|
99
|
+
/* Good visible focus */
|
|
100
|
+
button:focus-visible,
|
|
101
|
+
a:focus-visible,
|
|
102
|
+
[role="button"]:focus-visible {
|
|
103
|
+
outline: 2px solid #2563eb;
|
|
104
|
+
outline-offset: 2px;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/* Skip link */
|
|
108
|
+
.skip-link {
|
|
109
|
+
position: absolute;
|
|
110
|
+
left: -9999px;
|
|
111
|
+
}
|
|
112
|
+
.skip-link:focus {
|
|
113
|
+
left: 1rem;
|
|
114
|
+
top: 1rem;
|
|
115
|
+
z-index: 100;
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Focus Management (WCAG 2.4.3, 3.2.2)
|
|
120
|
+
|
|
121
|
+
When the UI changes, move focus deliberately:
|
|
122
|
+
|
|
123
|
+
- **Modal opens** → focus first interactive element. Esc closes. Focus restored on close.
|
|
124
|
+
- **Route change** → focus the new page's `<h1>` (or main landmark). Screen reader re-announces.
|
|
125
|
+
- **Form submit error** → focus the first invalid field (or the error summary).
|
|
126
|
+
- **Toast / alert appears** → use `role="status"` (polite) or `role="alert"` (assertive) — DON'T move focus unless interaction is required.
|
|
127
|
+
|
|
128
|
+
For the full focus-trap implementation in React + RN, see [references/aria-and-focus.md](references/aria-and-focus.md).
|
|
129
|
+
|
|
130
|
+
## Forms — Get These Right or You Lose Users
|
|
131
|
+
|
|
132
|
+
Most accessibility failures are in forms. The fixes are simple:
|
|
133
|
+
|
|
134
|
+
1. **Every input has a `<label>`** — or `aria-label` / `aria-labelledby` if visually hidden.
|
|
135
|
+
2. **`htmlFor` matches `id`** so clicking the label focuses the input.
|
|
136
|
+
3. **`required` attribute** + `aria-required="true"` (some screen readers don't announce HTML required).
|
|
137
|
+
4. **Inline errors** with `aria-describedby` pointing to the error message + `aria-invalid="true"` on the input.
|
|
138
|
+
5. **Submit error summary** at the top — `role="alert"`, focusable, links to each invalid field.
|
|
139
|
+
6. **`autocomplete` attribute** for known fields (`name`, `email`, `tel`, `street-address`, `cc-number`, `current-password`, `new-password`, `one-time-code`).
|
|
140
|
+
7. **Group related fields** with `<fieldset>` + `<legend>`.
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
<label htmlFor="email">Email</label>
|
|
144
|
+
<input
|
|
145
|
+
id="email"
|
|
146
|
+
type="email"
|
|
147
|
+
required
|
|
148
|
+
aria-required="true"
|
|
149
|
+
autoComplete="email"
|
|
150
|
+
aria-invalid={!!errors.email}
|
|
151
|
+
aria-describedby={errors.email ? 'email-error' : undefined}
|
|
152
|
+
{...register('email')}
|
|
153
|
+
/>
|
|
154
|
+
{errors.email && (
|
|
155
|
+
<span id="email-error" role="alert">{errors.email.message}</span>
|
|
156
|
+
)}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## React Native — AccessibilityInfo Props
|
|
160
|
+
|
|
161
|
+
RN uses `accessibility*` props on every component. The minimum:
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
<Pressable
|
|
165
|
+
accessibilityRole="button" // button | link | header | image | text | search | ...
|
|
166
|
+
accessibilityLabel="Save changes" // what VoiceOver/TalkBack announces
|
|
167
|
+
accessibilityHint="Saves the form and returns to the previous screen" // optional secondary
|
|
168
|
+
accessibilityState={{ disabled: isSaving }}
|
|
169
|
+
onPress={handleSave}>
|
|
170
|
+
<Text>Save</Text>
|
|
171
|
+
</Pressable>
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Other essentials:
|
|
175
|
+
|
|
176
|
+
- **`accessibilityRole`** for non-`<Text>`/`<Pressable>` containers (header, list, none).
|
|
177
|
+
- **`accessibilityLabel`** for icons and image-only buttons (otherwise SR reads nothing).
|
|
178
|
+
- **`accessibilityElementsHidden={true}`** + **`importantForAccessibility="no-hide-descendants"`** to hide decorative views.
|
|
179
|
+
- **`accessibilityLiveRegion="polite"`** (Android) / RN `AccessibilityInfo.announceForAccessibility(...)` (iOS) — for status updates.
|
|
180
|
+
|
|
181
|
+
For the full RN-specific patterns including FlashList / form / modal / focus management, see [references/rn-accessibility.md](references/rn-accessibility.md).
|
|
182
|
+
|
|
183
|
+
## Motion + Animation (WCAG 2.3.3)
|
|
184
|
+
|
|
185
|
+
Some users get motion sickness from parallax, slide transitions, autoplay video. Respect `prefers-reduced-motion`.
|
|
186
|
+
|
|
187
|
+
```css
|
|
188
|
+
/* Disable transitions for users who request reduced motion */
|
|
189
|
+
@media (prefers-reduced-motion: reduce) {
|
|
190
|
+
*, *::before, *::after {
|
|
191
|
+
animation-duration: 0.01ms !important;
|
|
192
|
+
animation-iteration-count: 1 !important;
|
|
193
|
+
transition-duration: 0.01ms !important;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
```tsx
|
|
199
|
+
// React Native
|
|
200
|
+
import { AccessibilityInfo } from 'react-native';
|
|
201
|
+
|
|
202
|
+
const [reduceMotion, setReduceMotion] = useState(false);
|
|
203
|
+
useEffect(() => {
|
|
204
|
+
AccessibilityInfo.isReduceMotionEnabled().then(setReduceMotion);
|
|
205
|
+
const sub = AccessibilityInfo.addEventListener('reduceMotionChanged', setReduceMotion);
|
|
206
|
+
return () => sub.remove();
|
|
207
|
+
}, []);
|
|
208
|
+
|
|
209
|
+
// Then conditionally:
|
|
210
|
+
const transition = reduceMotion ? { duration: 0 } : { duration: 250 };
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Auto-play video: must have a way to pause/stop within 5 seconds (WCAG 2.2.2).
|
|
214
|
+
|
|
215
|
+
## Screen Reader Testing — How
|
|
216
|
+
|
|
217
|
+
You MUST test with a screen reader. Reading WCAG isn't enough.
|
|
218
|
+
|
|
219
|
+
| Platform | Screen reader | Activation |
|
|
220
|
+
|---|---|---|
|
|
221
|
+
| macOS | VoiceOver | Cmd+F5 |
|
|
222
|
+
| Windows | NVDA (free) | Ctrl+Alt+N after install |
|
|
223
|
+
| iOS | VoiceOver | Settings → Accessibility → VoiceOver → On (or triple-press home/side) |
|
|
224
|
+
| Android | TalkBack | Settings → Accessibility → TalkBack → On |
|
|
225
|
+
| Chrome (dev) | ChromeVox | Extension |
|
|
226
|
+
|
|
227
|
+
Test the critical flows: sign-in, add-to-cart / start-lesson, checkout / pay, settings, sign-out. If you can complete each flow eyes-closed using only the screen reader, the app is in good shape.
|
|
228
|
+
|
|
229
|
+
For the testing protocol + per-flow checklist, see [references/screen-reader-testing.md](references/screen-reader-testing.md).
|
|
230
|
+
|
|
231
|
+
## Automated Tooling
|
|
232
|
+
|
|
233
|
+
Catch the easy wins automatically. None of these replace manual testing.
|
|
234
|
+
|
|
235
|
+
- **axe-core** — runs in browser DevTools, in Playwright tests, in CI. The most thorough automated audit available.
|
|
236
|
+
- **Lighthouse** — built into Chrome; lower fidelity than axe but gives a score.
|
|
237
|
+
- **eslint-plugin-jsx-a11y** — catches anti-patterns at lint time (img without alt, click handler on non-interactive).
|
|
238
|
+
- **eslint-plugin-react-native-a11y** — RN-specific lint rules.
|
|
239
|
+
- **Playwright + @axe-core/playwright** — `await new AxeBuilder({ page }).analyze()` per critical page in CI.
|
|
240
|
+
- **react-axe / @axe-core/react** — runs axe on every render in dev mode.
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
// Playwright a11y test in CI
|
|
244
|
+
import { test, expect } from '@playwright/test';
|
|
245
|
+
import AxeBuilder from '@axe-core/playwright';
|
|
246
|
+
|
|
247
|
+
test('home page is accessible', async ({ page }) => {
|
|
248
|
+
await page.goto('/');
|
|
249
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
250
|
+
expect(results.violations).toEqual([]);
|
|
251
|
+
});
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
Fail the build on serious + critical violations.
|
|
255
|
+
|
|
256
|
+
## Common a11y Failures (and Fixes)
|
|
257
|
+
|
|
258
|
+
1. **`<div onClick>` instead of `<button>`** — use button.
|
|
259
|
+
2. **Color-only error indicator** — add icon + text.
|
|
260
|
+
3. **Missing alt on image** — `<img alt="...">` (or `alt=""` for decorative).
|
|
261
|
+
4. **Modal opens, focus stays elsewhere** — focus first input on open.
|
|
262
|
+
5. **Modal closes, focus disappears** — restore to the trigger.
|
|
263
|
+
6. **No keyboard support for custom widget** — implement per ARIA APG.
|
|
264
|
+
7. **Form input without label** — every input gets a `<label>`.
|
|
265
|
+
8. **Error message only visible (not announced)** — use `aria-describedby` or `role="alert"`.
|
|
266
|
+
9. **`outline: none`** — replace with `:focus-visible` styles.
|
|
267
|
+
10. **`maximum-scale=1.0`** in viewport — remove.
|
|
268
|
+
11. **Auto-play video / parallax without `prefers-reduced-motion`** — gate it.
|
|
269
|
+
12. **Tab order doesn't match visual** — fix DOM order; avoid `tabindex>0`.
|
|
270
|
+
13. **`tabindex="-1"` on something users need to reach** — remove.
|
|
271
|
+
14. **Decorative icon without `aria-hidden="true"`** — SR reads "image".
|
|
272
|
+
15. **RN button without `accessibilityLabel`** — SR reads nothing useful.
|
|
273
|
+
16. **No skip link** — keyboard users tab through nav on every page.
|
|
274
|
+
17. **Insufficient touch target** — WCAG 2.5.8 says min 24×24 CSS px (mobile usually wants 44×44).
|
|
275
|
+
18. **No language attribute** on `<html>` — set `<html lang="en">`.
|
|
276
|
+
19. **Page title same on every route** — set per page (`<title>` on web, `accessibilityViewIsModal` + announce on RN).
|
|
277
|
+
|
|
278
|
+
## WCAG 2.2 — New AA Criteria (vs 2.1)
|
|
279
|
+
|
|
280
|
+
WCAG 2.2 added 6 success criteria worth knowing:
|
|
281
|
+
|
|
282
|
+
- **2.4.11 Focus Not Obscured (Min)** — focused element NOT entirely hidden by sticky header / cookie banner.
|
|
283
|
+
- **2.4.12 Focus Not Obscured (Enh.)** — AAA — fully visible.
|
|
284
|
+
- **2.5.7 Dragging Movements** — every drag has a non-drag alternative (e.g., re-order list also via long-press menu).
|
|
285
|
+
- **2.5.8 Target Size (Minimum)** — 24×24 CSS px minimum (mobile patterns + density permitting).
|
|
286
|
+
- **3.2.6 Consistent Help** — help link in same place across pages.
|
|
287
|
+
- **3.3.7 Redundant Entry** — autofill prior info; don't make user re-type.
|
|
288
|
+
- **3.3.8 Accessible Authentication** — no "type 4 random characters from your password" puzzles.
|
|
289
|
+
- **3.3.9 Accessible Authentication (Enh.)** — AAA.
|
|
290
|
+
|
|
291
|
+
Most apps already do these; check explicitly.
|
|
292
|
+
|
|
293
|
+
## Pre-Launch a11y Checklist
|
|
294
|
+
|
|
295
|
+
See [assets/a11y-checklist.md](assets/a11y-checklist.md). Each item is a concrete check; uncheck → fix or document waiver.
|
|
296
|
+
|
|
297
|
+
## Source Material
|
|
298
|
+
|
|
299
|
+
- *WCAG 2.2*: <https://www.w3.org/TR/WCAG22/>
|
|
300
|
+
- *ARIA Authoring Practices Guide (APG)*: <https://www.w3.org/WAI/ARIA/apg/> — copy-paste patterns for combobox, tabs, etc.
|
|
301
|
+
- *WebAIM*: <https://webaim.org/> — practical articles + free contrast checker.
|
|
302
|
+
- *Inclusive Components* (Heydon Pickering) — book + blog with deep component patterns.
|
|
303
|
+
- *axe-core docs*: <https://github.com/dequelabs/axe-core>
|
|
304
|
+
- *Apple HIG — Accessibility*: <https://developer.apple.com/design/human-interface-guidelines/accessibility>
|
|
305
|
+
- *Android Accessibility*: <https://developer.android.com/guide/topics/ui/accessibility>
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Accessibility Pre-Launch Checklist (WCAG 2.2 AA)
|
|
2
|
+
|
|
3
|
+
Run before each release. Each item is a concrete check; uncheck → fix or document waiver with reason + ETA.
|
|
4
|
+
|
|
5
|
+
## Semantic Structure
|
|
6
|
+
|
|
7
|
+
- [ ] Single `<h1>` per page; nested headings (h1 > h2 > h3) without skipping levels.
|
|
8
|
+
- [ ] Landmark regions used (`<header>`, `<nav>`, `<main>`, `<footer>`, `<aside>`) on web.
|
|
9
|
+
- [ ] React Native: `accessibilityRole="header"` on titles; `accessibilityRole="button"` on Pressables; `accessibilityRole="link"` on cross-app links.
|
|
10
|
+
- [ ] Lists use `<ul>` / `<ol>`; nav menus use `<nav>` + `<ul>`.
|
|
11
|
+
- [ ] No `<div onClick>` instead of `<button>` / `<Pressable>`.
|
|
12
|
+
|
|
13
|
+
## Keyboard
|
|
14
|
+
|
|
15
|
+
- [ ] Every interactive element reachable via Tab.
|
|
16
|
+
- [ ] Tab order matches visual order.
|
|
17
|
+
- [ ] No keyboard traps (can always Tab/Esc out).
|
|
18
|
+
- [ ] Visible focus indicator on all focusable elements.
|
|
19
|
+
- [ ] Skip link to main content (web).
|
|
20
|
+
- [ ] Custom widgets (combobox, tabs, menu) follow ARIA APG keyboard pattern.
|
|
21
|
+
- [ ] Modal traps focus; Esc closes; focus restored on close.
|
|
22
|
+
- [ ] Touch target ≥ 24×24 CSS px (WCAG 2.5.8); mobile typically 44×44.
|
|
23
|
+
|
|
24
|
+
## Color + Contrast
|
|
25
|
+
|
|
26
|
+
- [ ] Body text contrast ≥ 4.5:1 on every background it appears on.
|
|
27
|
+
- [ ] Large text (≥18pt or 14pt bold) ≥ 3:1.
|
|
28
|
+
- [ ] UI components + meaningful graphics ≥ 3:1.
|
|
29
|
+
- [ ] Focus indicator ≥ 3:1 against surrounding background.
|
|
30
|
+
- [ ] No info conveyed by color alone (every red border has an icon + text).
|
|
31
|
+
- [ ] Dark mode AND light mode both pass contrast checks.
|
|
32
|
+
|
|
33
|
+
## Forms
|
|
34
|
+
|
|
35
|
+
- [ ] Every input has a visible `<label>` or `accessibilityLabel`.
|
|
36
|
+
- [ ] `htmlFor` matches `id`; clicking label focuses input.
|
|
37
|
+
- [ ] `required` + `aria-required="true"` on required fields.
|
|
38
|
+
- [ ] `autoComplete` set on known fields (`email`, `current-password`, `new-password`, `name`, `tel`, `street-address`, `cc-number`, `one-time-code`).
|
|
39
|
+
- [ ] Inline error message: `aria-describedby` on input, `aria-invalid="true"`, `role="alert"` on the error.
|
|
40
|
+
- [ ] Submit error: focus first invalid field OR error summary at top.
|
|
41
|
+
- [ ] Field grouping with `<fieldset>` + `<legend>` where appropriate.
|
|
42
|
+
- [ ] No CAPTCHAs without an accessible alternative (audio CAPTCHA / reCAPTCHA v3 / passkey).
|
|
43
|
+
|
|
44
|
+
## Images + Media
|
|
45
|
+
|
|
46
|
+
- [ ] Every `<img>` has `alt=""` (decorative) or descriptive `alt="..."`.
|
|
47
|
+
- [ ] React Native `<Image>` decorative: `accessible={false}` + `accessibilityElementsHidden={true}`.
|
|
48
|
+
- [ ] `<Image>` informative: `accessibilityLabel="..."`.
|
|
49
|
+
- [ ] Video has captions OR is decorative + auto-pauses within 5 sec.
|
|
50
|
+
- [ ] Audio has transcripts.
|
|
51
|
+
- [ ] No autoplay video / audio (or muted + ≤ 5 sec).
|
|
52
|
+
|
|
53
|
+
## Motion + Animation
|
|
54
|
+
|
|
55
|
+
- [ ] `prefers-reduced-motion` media query respected (web).
|
|
56
|
+
- [ ] React Native: check `AccessibilityInfo.isReduceMotionEnabled()` and disable / shorten animations.
|
|
57
|
+
- [ ] No flashing > 3 times per second (seizure trigger).
|
|
58
|
+
- [ ] Parallax / auto-scroll has stop control.
|
|
59
|
+
|
|
60
|
+
## Modals + Dialogs
|
|
61
|
+
|
|
62
|
+
- [ ] Use native `<dialog>` (web) or React Navigation modal preset (RN).
|
|
63
|
+
- [ ] Focus moves to first interactive (or dialog itself) on open.
|
|
64
|
+
- [ ] Focus trap inside; Esc / back button closes.
|
|
65
|
+
- [ ] Focus returns to trigger on close.
|
|
66
|
+
- [ ] `aria-labelledby` or `accessibilityLabel` on the dialog.
|
|
67
|
+
- [ ] Backdrop click dismisses (or has documented reason not to).
|
|
68
|
+
|
|
69
|
+
## Navigation
|
|
70
|
+
|
|
71
|
+
- [ ] Page title set per route (`<title>` on web; React Navigation `headerTitle` or `accessibilityViewIsModal` + `announceForAccessibility` on RN).
|
|
72
|
+
- [ ] Skip link at top (web).
|
|
73
|
+
- [ ] Active nav item visually + programmatically marked (`aria-current="page"` or `accessibilityState={{ selected: true }}`).
|
|
74
|
+
- [ ] Breadcrumb navigation (when used) marked with `aria-label="Breadcrumb"`.
|
|
75
|
+
|
|
76
|
+
## Live Regions / Status
|
|
77
|
+
|
|
78
|
+
- [ ] Async loading announced: `role="status"` (web) / `accessibilityLiveRegion="polite"` + `announceForAccessibility` (RN).
|
|
79
|
+
- [ ] Errors announced: `role="alert"` (web) / `announceForAccessibility` (RN).
|
|
80
|
+
- [ ] Toast notifications announced + auto-dismissed after enough time to read.
|
|
81
|
+
|
|
82
|
+
## RN-Specific
|
|
83
|
+
|
|
84
|
+
- [ ] `accessibilityRole` set on every Pressable / View used as a control.
|
|
85
|
+
- [ ] `accessibilityLabel` on icon buttons.
|
|
86
|
+
- [ ] `accessibilityState` reflects disabled / selected / busy / checked / expanded.
|
|
87
|
+
- [ ] Decorative views: `accessibilityElementsHidden={true}` + `importantForAccessibility="no-hide-descendants"`.
|
|
88
|
+
- [ ] Group cohesive content with `accessible={true}` + combined `accessibilityLabel`.
|
|
89
|
+
- [ ] Focus management on route change + modal open via `AccessibilityInfo.setAccessibilityFocus`.
|
|
90
|
+
- [ ] Dynamic Type tested at AX5; layout doesn't break.
|
|
91
|
+
- [ ] `maxFontSizeMultiplier` set on tight UI elements.
|
|
92
|
+
|
|
93
|
+
## Internationalization (if multi-language)
|
|
94
|
+
|
|
95
|
+
- [ ] `<html lang="...">` set per page.
|
|
96
|
+
- [ ] React Navigation header titles localized.
|
|
97
|
+
- [ ] RTL support tested (Arabic / Hebrew / Persian if shipping).
|
|
98
|
+
- [ ] Locale-aware date / number formatting (`Intl.NumberFormat` / `Intl.DateTimeFormat`).
|
|
99
|
+
|
|
100
|
+
## Automated Tooling
|
|
101
|
+
|
|
102
|
+
- [ ] `eslint-plugin-jsx-a11y` (web) / `eslint-plugin-react-native-a11y` (RN) passes.
|
|
103
|
+
- [ ] Lighthouse accessibility score ≥ 95 on key pages.
|
|
104
|
+
- [ ] axe-core passes (zero serious + critical violations) via Playwright integration test.
|
|
105
|
+
- [ ] `react-axe` enabled in dev for every PR.
|
|
106
|
+
|
|
107
|
+
## Manual Testing
|
|
108
|
+
|
|
109
|
+
- [ ] **VoiceOver (iOS)** complete sign-in / browse / start-task / settings / sign-out flows.
|
|
110
|
+
- [ ] **TalkBack (Android)** same flows.
|
|
111
|
+
- [ ] **VoiceOver (macOS)** if web client.
|
|
112
|
+
- [ ] **NVDA (Windows)** if web client.
|
|
113
|
+
- [ ] **Keyboard-only** complete same flows on web (no mouse/trackpad).
|
|
114
|
+
- [ ] **iOS Dynamic Type AX5** — layout doesn't break on critical screens.
|
|
115
|
+
- [ ] **OS color filters** (Grayscale, Inverted Colors) tested on home screen.
|
|
116
|
+
|
|
117
|
+
## Pre-Launch Smoke
|
|
118
|
+
|
|
119
|
+
- [ ] All critical flows pass screen-reader test on iOS + Android.
|
|
120
|
+
- [ ] axe-core CI step is green.
|
|
121
|
+
- [ ] No serious / critical Lighthouse a11y violations.
|
|
122
|
+
- [ ] Real-user accessibility tester (employee / consultant) runs the flows once.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
If any box is unchecked, document the reason in a tracking issue. Accessibility bugs ship for the lifetime of the app version.
|
|
127
|
+
|
|
128
|
+
## WCAG 2.2 — New Criteria (vs 2.1)
|
|
129
|
+
|
|
130
|
+
Verify these explicitly:
|
|
131
|
+
|
|
132
|
+
- [ ] **2.4.11 Focus Not Obscured (Min)** — focused element NOT entirely hidden by sticky header / cookie banner / floating buttons.
|
|
133
|
+
- [ ] **2.5.7 Dragging Movements** — every drag has a non-drag alternative (e.g., re-order list also via long-press menu).
|
|
134
|
+
- [ ] **2.5.8 Target Size (Min)** — 24×24 CSS px minimum.
|
|
135
|
+
- [ ] **3.2.6 Consistent Help** — help link in same place across pages.
|
|
136
|
+
- [ ] **3.3.7 Redundant Entry** — autofill prior info; don't make user re-type.
|
|
137
|
+
- [ ] **3.3.8 Accessible Authentication** — no "type 4 random characters from your password" puzzles.
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# ARIA Patterns + Focus Management
|
|
2
|
+
|
|
3
|
+
The two areas where small mistakes cause big a11y failures. Both have correct patterns; both reward following them exactly.
|
|
4
|
+
|
|
5
|
+
## The Three Rules of ARIA
|
|
6
|
+
|
|
7
|
+
1. **Don't use ARIA**. Use semantic HTML (`<button>`, `<nav>`, `<main>`, `<dialog>`) first.
|
|
8
|
+
2. **If you must, follow the W3C ARIA Authoring Practices Guide patterns exactly.** Don't invent.
|
|
9
|
+
3. **Test with a screen reader.** ARIA is broken without verification.
|
|
10
|
+
|
|
11
|
+
## Common Patterns — Use These Exactly
|
|
12
|
+
|
|
13
|
+
### Disclosure Button (Show/Hide Section)
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<button
|
|
17
|
+
aria-expanded="false"
|
|
18
|
+
aria-controls="more-info">
|
|
19
|
+
More info
|
|
20
|
+
</button>
|
|
21
|
+
<div id="more-info" hidden>
|
|
22
|
+
Additional content
|
|
23
|
+
</div>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
JS toggles `aria-expanded` AND `hidden`. SR announces "expanded" / "collapsed".
|
|
27
|
+
|
|
28
|
+
### Modal Dialog
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
<dialog
|
|
32
|
+
open
|
|
33
|
+
aria-modal="true"
|
|
34
|
+
aria-labelledby="dlg-title"
|
|
35
|
+
aria-describedby="dlg-desc">
|
|
36
|
+
<h2 id="dlg-title">Confirm delete</h2>
|
|
37
|
+
<p id="dlg-desc">This action cannot be undone.</p>
|
|
38
|
+
<button>Cancel</button>
|
|
39
|
+
<button>Delete</button>
|
|
40
|
+
</dialog>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The native `<dialog>` element handles modal semantics + Esc + backdrop click. Use it instead of div-with-overlay where possible.
|
|
44
|
+
|
|
45
|
+
### Tabs (W3C APG pattern)
|
|
46
|
+
|
|
47
|
+
```html
|
|
48
|
+
<div role="tablist" aria-label="Account">
|
|
49
|
+
<button role="tab" aria-selected="true" aria-controls="tab1-panel" id="tab1" tabindex="0">Profile</button>
|
|
50
|
+
<button role="tab" aria-selected="false" aria-controls="tab2-panel" id="tab2" tabindex="-1">Security</button>
|
|
51
|
+
</div>
|
|
52
|
+
<div role="tabpanel" id="tab1-panel" aria-labelledby="tab1">...</div>
|
|
53
|
+
<div role="tabpanel" id="tab2-panel" aria-labelledby="tab2" hidden>...</div>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Keyboard:
|
|
57
|
+
|
|
58
|
+
- **Tab** → moves into / out of the tablist.
|
|
59
|
+
- **Arrow Left / Right** → moves between tabs (with `tabindex` rotation).
|
|
60
|
+
- **Home / End** → first / last tab.
|
|
61
|
+
- **Enter / Space** → activate (or auto-activate on focus, your choice — auto is more common in 2026).
|
|
62
|
+
|
|
63
|
+
### Combobox (Autocomplete)
|
|
64
|
+
|
|
65
|
+
This is the gnarliest. Use a library: `react-aria` (Adobe), `headlessui`, `radix-ui`. Don't roll your own.
|
|
66
|
+
|
|
67
|
+
If you must, follow the APG combobox pattern exactly: <https://www.w3.org/WAI/ARIA/apg/patterns/combobox/>
|
|
68
|
+
|
|
69
|
+
### Menu (Context Menu / Dropdown)
|
|
70
|
+
|
|
71
|
+
```html
|
|
72
|
+
<button
|
|
73
|
+
aria-haspopup="menu"
|
|
74
|
+
aria-expanded="false"
|
|
75
|
+
aria-controls="actions-menu">
|
|
76
|
+
Actions
|
|
77
|
+
</button>
|
|
78
|
+
<ul role="menu" id="actions-menu" hidden>
|
|
79
|
+
<li role="menuitem"><a href="/edit">Edit</a></li>
|
|
80
|
+
<li role="menuitem"><a href="/delete">Delete</a></li>
|
|
81
|
+
</ul>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Keyboard: Down arrow opens; arrows navigate; Esc closes.
|
|
85
|
+
|
|
86
|
+
### Live Regions
|
|
87
|
+
|
|
88
|
+
For dynamic updates (toast, status change, search results count) without moving focus:
|
|
89
|
+
|
|
90
|
+
```html
|
|
91
|
+
<!-- Polite: SR finishes current sentence first. -->
|
|
92
|
+
<div role="status" aria-live="polite">3 results found</div>
|
|
93
|
+
|
|
94
|
+
<!-- Assertive: SR interrupts. Use sparingly — for errors/alerts. -->
|
|
95
|
+
<div role="alert" aria-live="assertive">Failed to save</div>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
The element MUST exist on initial render (empty); update its text content. Adding the element AND content at the same time is missed by some SR.
|
|
99
|
+
|
|
100
|
+
### Loading States
|
|
101
|
+
|
|
102
|
+
```html
|
|
103
|
+
<button aria-busy="true" aria-describedby="status">Save</button>
|
|
104
|
+
<span id="status" role="status" aria-live="polite">Saving…</span>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
SR announces "Saving…" without losing focus.
|
|
108
|
+
|
|
109
|
+
## Focus Management — Patterns
|
|
110
|
+
|
|
111
|
+
### Modal Open / Close
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
const previousFocus = useRef<HTMLElement | null>(null);
|
|
115
|
+
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
116
|
+
|
|
117
|
+
function open() {
|
|
118
|
+
previousFocus.current = document.activeElement as HTMLElement;
|
|
119
|
+
dialogRef.current?.showModal();
|
|
120
|
+
// Focus the first interactive element OR the dialog itself.
|
|
121
|
+
const first = dialogRef.current?.querySelector<HTMLElement>(
|
|
122
|
+
'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
|
|
123
|
+
);
|
|
124
|
+
first?.focus();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function close() {
|
|
128
|
+
dialogRef.current?.close();
|
|
129
|
+
previousFocus.current?.focus();
|
|
130
|
+
previousFocus.current = null;
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Native `<dialog>` does Esc + backdrop dismiss for free. Use it.
|
|
135
|
+
|
|
136
|
+
### Focus Trap
|
|
137
|
+
|
|
138
|
+
In a modal, Tab + Shift+Tab must cycle within the dialog. Native `<dialog open>` handles this automatically. For custom overlays, use `focus-trap-react` or `react-focus-lock`.
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
import FocusTrap from 'focus-trap-react';
|
|
142
|
+
|
|
143
|
+
{isOpen && (
|
|
144
|
+
<FocusTrap focusTrapOptions={{ escapeDeactivates: true, onDeactivate: close }}>
|
|
145
|
+
<div role="dialog" aria-modal="true">
|
|
146
|
+
...
|
|
147
|
+
</div>
|
|
148
|
+
</FocusTrap>
|
|
149
|
+
)}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Route Change
|
|
153
|
+
|
|
154
|
+
In a SPA, the browser doesn't announce a navigation. Move focus to the new page:
|
|
155
|
+
|
|
156
|
+
```tsx
|
|
157
|
+
function Page({ title }: { title: string }) {
|
|
158
|
+
const h1Ref = useRef<HTMLHeadingElement>(null);
|
|
159
|
+
useEffect(() => {
|
|
160
|
+
h1Ref.current?.focus();
|
|
161
|
+
}, []);
|
|
162
|
+
return <h1 ref={h1Ref} tabIndex={-1}>{title}</h1>;
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
`tabIndex={-1}` lets the element receive focus programmatically without entering the tab order.
|
|
167
|
+
|
|
168
|
+
Or announce via live region:
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
const { setAnnouncement } = useAnnouncer();
|
|
172
|
+
useEffect(() => {
|
|
173
|
+
setAnnouncement(`Navigated to ${title}`);
|
|
174
|
+
}, [title]);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Form Submit Error
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
async function onSubmit(data) {
|
|
181
|
+
try {
|
|
182
|
+
await submit(data);
|
|
183
|
+
} catch (err) {
|
|
184
|
+
setErrors(err.fields);
|
|
185
|
+
// Focus the first invalid field (or the error summary).
|
|
186
|
+
requestAnimationFrame(() => {
|
|
187
|
+
document.querySelector<HTMLElement>('[aria-invalid="true"]')?.focus();
|
|
188
|
+
// OR: errorSummaryRef.current?.focus();
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Use `requestAnimationFrame` so focus moves AFTER the DOM update.
|
|
195
|
+
|
|
196
|
+
### Async Content Load
|
|
197
|
+
|
|
198
|
+
```tsx
|
|
199
|
+
{isLoading ? (
|
|
200
|
+
<p role="status" aria-live="polite">Loading lessons…</p>
|
|
201
|
+
) : (
|
|
202
|
+
<ul>{...}</ul>
|
|
203
|
+
)}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
SR announces "Loading lessons…" without focus jump. When loaded, the list becomes available; user can navigate to it via headings.
|
|
207
|
+
|
|
208
|
+
## React Native — Focus Management
|
|
209
|
+
|
|
210
|
+
```tsx
|
|
211
|
+
import { AccessibilityInfo, findNodeHandle, View } from 'react-native';
|
|
212
|
+
|
|
213
|
+
const ref = useRef<View>(null);
|
|
214
|
+
|
|
215
|
+
useEffect(() => {
|
|
216
|
+
if (isModalOpen) {
|
|
217
|
+
const reactTag = findNodeHandle(ref.current);
|
|
218
|
+
if (reactTag) AccessibilityInfo.setAccessibilityFocus(reactTag);
|
|
219
|
+
}
|
|
220
|
+
}, [isModalOpen]);
|
|
221
|
+
|
|
222
|
+
<View ref={ref} accessible={true} accessibilityLabel="Confirm delete">
|
|
223
|
+
...
|
|
224
|
+
</View>
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
For VoiceOver / TalkBack focus on a specific element after a UI change, `AccessibilityInfo.setAccessibilityFocus(reactTag)` is the API. Do it inside `requestAnimationFrame` or after `InteractionManager.runAfterInteractions`.
|
|
228
|
+
|
|
229
|
+
## ARIA Don'ts
|
|
230
|
+
|
|
231
|
+
1. **`role="button"` on a `<button>`** — redundant; remove.
|
|
232
|
+
2. **`aria-label="Submit"`** on a button that has visible text "Submit" — redundant; remove.
|
|
233
|
+
3. **`aria-hidden="true"`** on a focusable element — SR can't read but tab still lands → confused user. Either hide both or neither.
|
|
234
|
+
4. **`tabindex` > 0** — breaks the natural tab order. Use 0 (in order) or -1 (programmatic only).
|
|
235
|
+
5. **`role="presentation"`** + interactive children — strips semantics from the parent but children become unreachable.
|
|
236
|
+
6. **Multiple `aria-live` regions** firing at once — they queue + interrupt each other.
|
|
237
|
+
7. **`role="alert"` for non-urgent updates** — interrupts the SR; only for errors / time-sensitive.
|
|
238
|
+
8. **Updating an `aria-live` element by replacing its DOM node** — SR misses the change. Update text content instead.
|
|
239
|
+
|
|
240
|
+
## Source Material
|
|
241
|
+
|
|
242
|
+
- *WAI-ARIA Authoring Practices Guide (APG)*: <https://www.w3.org/WAI/ARIA/apg/>
|
|
243
|
+
- *Inclusive Components* (Heydon Pickering) — patterns for tabs, modals, menus.
|
|
244
|
+
- *react-aria*: <https://react-spectrum.adobe.com/react-aria/> — battle-tested hooks.
|
|
245
|
+
- *Headless UI*: <https://headlessui.com/> — pre-built unstyled accessible components.
|
|
246
|
+
- *Radix UI*: <https://www.radix-ui.com/> — same idea, slightly different API.
|
|
247
|
+
- *focus-trap-react*: <https://github.com/focus-trap/focus-trap-react>
|