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,56 @@
|
|
|
1
|
+
<!-- domain:FRONTEND | layer:reference | ssot:true | updated:2026-03-23 -->
|
|
2
|
+
# Accessibility (a11y) Checklist — WCAG 2.1 AA
|
|
3
|
+
|
|
4
|
+
Purpose: Living checklist for accessibility compliance across the frontend.
|
|
5
|
+
Read when: Building or reviewing any interactive component.
|
|
6
|
+
Skip when: Working on backend-only tasks.
|
|
7
|
+
Read next: `./frontend-rules.md` for general frontend conventions.
|
|
8
|
+
|
|
9
|
+
> Nav: [Docs Index](../00-index.md) | [Frontend Rules](./frontend-rules.md)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Interactive Elements
|
|
14
|
+
|
|
15
|
+
- All icon-only buttons MUST have `aria-label` describing the action
|
|
16
|
+
- All form inputs MUST have associated `<label>` elements (htmlFor + id)
|
|
17
|
+
- Required form fields MUST have `aria-required="true"`
|
|
18
|
+
- Form validation errors MUST be linked to inputs via `aria-describedby`
|
|
19
|
+
- Custom interactive elements (drawers, modals, dropdowns) MUST have `role` attributes
|
|
20
|
+
- Modal/drawer close buttons MUST have `aria-label="Close"`
|
|
21
|
+
|
|
22
|
+
## Dynamic Content
|
|
23
|
+
|
|
24
|
+
- Toast notifications use Sonner which provides aria-live regions automatically
|
|
25
|
+
- Cart count badge changes should be announced via `aria-live="polite"`
|
|
26
|
+
- Form error messages should use `aria-live="assertive"`
|
|
27
|
+
|
|
28
|
+
## Keyboard Navigation
|
|
29
|
+
|
|
30
|
+
- Tab order follows logical reading order (no `tabindex > 0`)
|
|
31
|
+
- All interactive elements activatable via Enter or Space
|
|
32
|
+
- Escape closes modals and drawers
|
|
33
|
+
- Focus trap active inside open modals
|
|
34
|
+
- Visible focus indicator on all interactive elements (`:focus-visible`)
|
|
35
|
+
|
|
36
|
+
## Color Contrast (WCAG AA)
|
|
37
|
+
|
|
38
|
+
- Normal text (< 18px): 4.5:1 minimum contrast ratio
|
|
39
|
+
- Large text (>= 18px bold or >= 24px): 3:1 minimum contrast ratio
|
|
40
|
+
- Interactive elements: 3:1 against adjacent colors
|
|
41
|
+
- Focus indicators: 3:1 against background
|
|
42
|
+
|
|
43
|
+
## Current Status
|
|
44
|
+
|
|
45
|
+
- 26 files with aria-label attributes
|
|
46
|
+
- Sonner toast library provides built-in aria-live support
|
|
47
|
+
- shadcn/ui components include keyboard navigation by default
|
|
48
|
+
- Cookie consent banner has `role="dialog"` and `aria-label`
|
|
49
|
+
- Honeypot field has `aria-hidden="true"` and `tabindex="-1"`
|
|
50
|
+
|
|
51
|
+
## Remaining Items
|
|
52
|
+
|
|
53
|
+
- Audit form inputs for missing aria-required on required fields
|
|
54
|
+
- Verify Tab order on checkout flow
|
|
55
|
+
- Color contrast verification with automated tool (axe-core or Lighthouse)
|
|
56
|
+
- Add skip-to-content link at top of page
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
<!-- domain:PRODUCT | layer:policy | ssot:true | updated:2026-03-16 -->
|
|
2
|
+
|
|
3
|
+
# Copywriting Standard
|
|
4
|
+
|
|
5
|
+
Purpose: Define the quality bar, tone rules, and review rubric for all user-facing copy across ExampleApp.
|
|
6
|
+
Read when: Writing or reviewing marketing copy, product descriptions, docs copy, UI text, legal language, or CTAs.
|
|
7
|
+
Skip when: Working on code, infra, or backend-only tasks with no user-facing strings.
|
|
8
|
+
Read next: `../pages-content-spec/00-index.md`, `../../STYLE_GUIDE.md`
|
|
9
|
+
|
|
10
|
+
> Nav: [Docs Index](../00-index.md) | [Content Specs Index](../pages-content-spec/00-index.md)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Why/What/How Framework
|
|
15
|
+
|
|
16
|
+
Every piece of copy must answer three questions in the user's mind:
|
|
17
|
+
|
|
18
|
+
> **Why** — Why does the user care? What pain point or aspiration does this address?
|
|
19
|
+
> **What** — What is being offered? (product, feature, benefit, action)
|
|
20
|
+
> **How** — How does the user get it? (clear next step, CTA, or process)
|
|
21
|
+
|
|
22
|
+
Copy that skips any of these three leaves friction.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Quality Rubric (Target: 9/10)
|
|
27
|
+
|
|
28
|
+
Evaluate all user-facing copy against these five dimensions:
|
|
29
|
+
|
|
30
|
+
- Clarity → 2pts: instantly understandable, no jargon, reader knows what to do
|
|
31
|
+
- Tone-fit → 2pts: matches context (formal=docs, conversational=marketing, clear=errors, plain=legal)
|
|
32
|
+
- SEO → 2pts: target keywords natural, meta descriptions compelling, headings signal hierarchy
|
|
33
|
+
- Persuasion → 2pts: creates desire, addresses objections, clear CTA, tangible benefits
|
|
34
|
+
- Correctness → 1pt: no grammar/spelling/factual errors, verifiable statements, consistent tone
|
|
35
|
+
|
|
36
|
+
A score of 9 means one minor flaw that doesn't block understanding or action.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Brand Voice & Tone
|
|
41
|
+
|
|
42
|
+
**ExampleApp is: premium but accessible, expert but friendly, modern but trustworthy.**
|
|
43
|
+
|
|
44
|
+
- **Premium** → polished, confident, quality-first. No typos, no filler, no bargain-bin energy.
|
|
45
|
+
- **Accessible** → no gatekeeping language or jargon. A high schooler should understand pricing and value props.
|
|
46
|
+
- **Expert** → back claims with specifics. Show domain knowledge in templates, design, AI, digital tools.
|
|
47
|
+
- **Friendly** → conversational. Contractions okay. Personality welcome.
|
|
48
|
+
- **Modern** → current references, clean language, no outdated metaphors.
|
|
49
|
+
- **Trustworthy** → clarity over hype. Tell the truth about limitations. Don't overpromise.
|
|
50
|
+
|
|
51
|
+
Tone depends on context — keep it consistent within a page or section:
|
|
52
|
+
|
|
53
|
+
- **Marketing** (landing pages, product cards, emails) → conversational, confident, benefit-focused. Use "you." Create desire without being pushy.
|
|
54
|
+
- **Documentation** (guides, API docs, onboarding) → formal, precise, action-oriented. Use imperative voice.
|
|
55
|
+
- **Error messages** (validation, failures, warnings) → clear, helpful, non-blaming. Always include recovery action.
|
|
56
|
+
- **Legal** (ToS, Privacy, Disclaimers) → formal, factual, plain language. Be exhaustive but readable.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Copy Rules
|
|
61
|
+
|
|
62
|
+
1. **Active voice** over passive. "Download your template" not "Your template can be downloaded."
|
|
63
|
+
2. **Second person ("you")** for user-facing copy. "You get lifetime access" not "Users get lifetime access."
|
|
64
|
+
3. **Short sentences.** Average max 25 words. Vary length to maintain rhythm.
|
|
65
|
+
4. **Heading case:** H1 & H2 → Title Case; H3+ → Sentence case.
|
|
66
|
+
5. **CTAs use imperative verbs.** "Get started," "Download now," "Browse templates" — not "Click here" or "Learn more" alone.
|
|
67
|
+
6. **No unsupported superlatives.** Not "the best templates on the web" — instead "templates rated 4.9/5 by 12K+ creators."
|
|
68
|
+
7. **Price display:** Always show currency symbol. Omit cents for round numbers ("$29/mo" not "$29.00/mo").
|
|
69
|
+
8. **Avoid:** generic AI-sounding copy ("leverage synergies"), clickbait without substance, excessive exclamation marks (max one per section), unexplained buzzwords.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Examples: Good vs Bad
|
|
74
|
+
|
|
75
|
+
- Bad: "This template helps you. It has lots of features." → Good: "Save 8 hours on your next project. 40+ pre-built blocks, customizable themes, and Figma source files. Get started in under 5 minutes."
|
|
76
|
+
- Bad: "Invalid email. Error." → Good: "That email is already linked to an account. Log in, or try a different email."
|
|
77
|
+
- Bad: "The best AI templates platform. We help creators achieve amazing things." → Good: "Design faster. 10,000+ creators save 12 hours per project with ExampleApp templates. Explore free — no credit card required."
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
### Error Messages
|
|
82
|
+
|
|
83
|
+
- Error messages are user-facing copy — they must be clear, non-technical, and actionable.
|
|
84
|
+
- Good: "Email already registered. Try logging in instead."
|
|
85
|
+
- Bad: "Duplicate entry in users table for email field."
|
|
86
|
+
- Always tell the user what to do next, not just what went wrong.
|
|
87
|
+
- Empty state messages should be encouraging, not negative: "No reviews yet — be the first!" not "No data found."
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Checklist Before Publishing
|
|
92
|
+
|
|
93
|
+
- [ ] Copy passes 9/10 rubric (or documented exception)
|
|
94
|
+
- [ ] Why/What/How framework is complete
|
|
95
|
+
- [ ] Tone matches context (marketing/docs/error/legal)
|
|
96
|
+
- [ ] Active voice is primary
|
|
97
|
+
- [ ] Shortest sentence average is <25 words
|
|
98
|
+
- [ ] CTA is clear and imperative
|
|
99
|
+
- [ ] No superlatives without supporting evidence
|
|
100
|
+
- [ ] No grammar, spelling, or factual errors
|
|
101
|
+
- [ ] Brand voice is consistent (premium, accessible, expert, friendly)
|
|
102
|
+
- [ ] SEO keywords appear naturally (if applicable)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
<!-- domain:DOCS | layer:policy | ssot:true | updated:2026-03-18 -->
|
|
2
|
+
# Documentation Formatting Rules
|
|
3
|
+
|
|
4
|
+
Purpose: Token-efficient formatting standards for all project documentation.
|
|
5
|
+
Read when: Creating or editing any .md file in the docs system.
|
|
6
|
+
Skip when: File content is unchanged and formatting is not in scope.
|
|
7
|
+
Read next: `docs-system.md` for layer model and naming rules.
|
|
8
|
+
> Nav: [Docs Index](../00-index.md) | [Docs System](../governance/docs-system.md)
|
|
9
|
+
|
|
10
|
+
## File Standard
|
|
11
|
+
|
|
12
|
+
Every `.md` file in `docs/` starts with a UFS header:
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<!-- domain:DOMAIN | layer:LAYER | ssot:true|ref | updated:YYYY-MM-DD -->
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Domain values:** ALL, AUTH, CATALOG, COMMERCE, PAYMENTS, DOWNLOADS, CONTENT, EMAIL, REVIEWS, ANALYTICS, ADMIN, INFRA, DOCS
|
|
19
|
+
|
|
20
|
+
**Layer values:** index, playbook, spec, policy, reference, adr, task
|
|
21
|
+
|
|
22
|
+
**ssot values:**
|
|
23
|
+
- `true` → canonical source for its topic
|
|
24
|
+
- `ref` → references other SSOT files
|
|
25
|
+
|
|
26
|
+
## Format Conversion Rules
|
|
27
|
+
|
|
28
|
+
### Rule 1 — Two-column data: Arrow notation
|
|
29
|
+
|
|
30
|
+
```markdown
|
|
31
|
+
<!-- Prefer arrow notation -->
|
|
32
|
+
- Name → Django
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Rule 2 — Settings/config: Annotated code blocks
|
|
36
|
+
|
|
37
|
+
```python
|
|
38
|
+
# Before: | SECURE_SSL_REDIRECT | True | Force HTTPS |
|
|
39
|
+
# After:
|
|
40
|
+
SECURE_SSL_REDIRECT = True # Force HTTPS
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Rule 3 — Package/dependency lists: Structured bullets
|
|
44
|
+
|
|
45
|
+
```markdown
|
|
46
|
+
- `django-environ` 0.13.x — CRITICAL
|
|
47
|
+
Loads env vars, parses DATABASE_URL.
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Rule 4 — Tables ARE justified when
|
|
51
|
+
|
|
52
|
+
- Schema definitions (column name, type, constraints, description)
|
|
53
|
+
- Comparison matrices (3+ items x 3+ dimensions)
|
|
54
|
+
- Status/enum mappings with 3+ fields
|
|
55
|
+
|
|
56
|
+
### Rule 5 — Collapse completed sections
|
|
57
|
+
|
|
58
|
+
Use `<details>` for any section that is 100% completed but kept for reference.
|
|
59
|
+
|
|
60
|
+
## General Rules
|
|
61
|
+
|
|
62
|
+
- Use bullet lists over tables when data has ≤ 2 columns.
|
|
63
|
+
- Keep GitHub-flavored Markdown; no HTML unless rendering requires it.
|
|
64
|
+
- Prefer `key → value` arrow notation for two-column mappings.
|
|
65
|
+
- File size limit: **300 lines max**. Split into sub-files with index if exceeded.
|
|
66
|
+
- Relative links only — no absolute paths to local files.
|
|
67
|
+
|
|
68
|
+
## File Header Format
|
|
69
|
+
|
|
70
|
+
Every `.md` file in `docs/` starts with a UFS metadata header (see `docs/governance/docs-system.md` for the full contract):
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<!-- domain:DOMAIN | layer:LAYER | ssot:true|ref | updated:YYYY-MM-DD -->
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Immediately after the H1 heading, include the opening block: `Purpose`, `Read when`, `Skip when`, `Read next`. These lines let an agent decide within the first screenful whether to keep reading.
|
|
77
|
+
|
|
78
|
+
## Script Output Format
|
|
79
|
+
|
|
80
|
+
All infrastructure scripts source `_lib.sh` and use standardized prefixes:
|
|
81
|
+
|
|
82
|
+
| Prefix | Use | Stream |
|
|
83
|
+
| --- | --- | --- |
|
|
84
|
+
| `OK:` | Success result | stdout |
|
|
85
|
+
| `INFO:` | Informational data | stdout |
|
|
86
|
+
| `WARN:` | Non-fatal warning | stderr |
|
|
87
|
+
| `ERROR:` | Fatal error (exits) | stderr |
|
|
88
|
+
|
|
89
|
+
Scripts that produce structured output begin with a `=== script-name ===` header line.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
<!-- domain:ALL | layer:policy | ssot:true | updated:2026-03-16 -->
|
|
2
|
+
# Frontend Rendering Rules
|
|
3
|
+
|
|
4
|
+
Purpose: Canonical server-first rendering, data-fetching, performance, and testing policy for the frontend.
|
|
5
|
+
Read when: A task affects rendering strategy, data access, caching, or test scope.
|
|
6
|
+
Skip when: You only need dependency or styling rules.
|
|
7
|
+
Read next: `frontend-rules.md` for the broader frontend guardrails.
|
|
8
|
+
|
|
9
|
+
> Nav: [Frontend Rules](./frontend-rules.md) | [Docs Index](../00-index.md)
|
|
10
|
+
|
|
11
|
+
## 4) Rendering & Data Strategy (Server-First)
|
|
12
|
+
|
|
13
|
+
Prefer:
|
|
14
|
+
|
|
15
|
+
- Server Components for pages, layouts, and data fetching.
|
|
16
|
+
- Route-level UX files: `loading.tsx`, `error.tsx`, and `not-found.tsx`.
|
|
17
|
+
- `Suspense` boundaries for streaming where beneficial.
|
|
18
|
+
- Server Actions for mutations and form submissions.
|
|
19
|
+
- A data-access layer in `@/lib/server/data-access.ts`.
|
|
20
|
+
- React 19 hooks like `use()` and `useOptimistic()` where appropriate.
|
|
21
|
+
- URL search params for filter/pagination state instead of unnecessary client state.
|
|
22
|
+
|
|
23
|
+
### 4.1 API Client Architecture
|
|
24
|
+
|
|
25
|
+
**Server-Side Client (`lib/api/server.ts`)** — Server Components & Route Handlers.
|
|
26
|
+
Reads JWT from `cookies()`, forwards as `Authorization: Bearer`. Base URL: `BACKEND_INTERNAL_URL` (Docker internal). Error handling: 401 → redirect `/login`, 403 → throw `ForbiddenError`, 404 → `notFound()`, 5xx → throw `ServerError`. Generic typed responses: `apiGet<T>(path)`, `apiPost<T>(path, body)`. No CSRF (server-to-server).
|
|
27
|
+
|
|
28
|
+
**Client-Side Client (`lib/api/client.ts`)** — Client Components (`'use client'`).
|
|
29
|
+
Browser sends JWT via httpOnly cookie (`credentials: 'include'`). Base URL: relative (`/api/v1/...`). CSRF: read `csrftoken` cookie → send as `X-CSRFToken` on mutating methods. Token refresh: on 401 → `POST /api/v1/auth/token/refresh/` → retry once → else redirect `/login`. Rate limit (429): exponential backoff (1s, 2s, 4s), max 3 retries. Timeout: 10s default, 30s uploads.
|
|
30
|
+
|
|
31
|
+
**Shared Error Handler (`lib/api/errors.ts`)** — Parses API error format per `docs/api-contracts/error-format.md`. Maps to i18n user-friendly messages. Toast for recoverable (400, 422), redirect for auth (401, 403), PostHog `api_error` for 5xx.
|
|
32
|
+
|
|
33
|
+
**SSE Client (`lib/sse/useEventStream.ts`)** — React hook wrapping `EventSource`. Auto-reconnect; fallback to polling after 5 consecutive failures. Auth via `withCredentials: true`. Ref: `docs/architecture/11-realtime-sse.md`.
|
|
34
|
+
|
|
35
|
+
**Type Safety** — API response types from backend OpenAPI schema (future: `/api/v1/schema/`); until then manually in `lib/api/types.ts` matching `docs/api-contracts/shared-types-contract.md`. All API functions return typed responses. Never expose Django or Stripe secrets to client bundle.
|
|
36
|
+
|
|
37
|
+
### 4.2 Client Component Rules
|
|
38
|
+
|
|
39
|
+
Avoid unless necessary: `'use client'` at page/layout level, `useEffect` for primary data fetching, global client state for server-derived data.
|
|
40
|
+
|
|
41
|
+
When client components are required: keep them small and isolated, pass server-fetched data down, wrap expensive UI in lightweight suspense boundaries, use `next/dynamic` only when client-only loading is required.
|
|
42
|
+
|
|
43
|
+
### 4.3 Rendering Strategy Matrix
|
|
44
|
+
|
|
45
|
+
| Page Type | Strategy | Implementation | Revalidation |
|
|
46
|
+
| :------------------- | :-------- | :------------------------------------ | :------------ |
|
|
47
|
+
| **Home** | ISR | `export const revalidate = 3600` | 1 hour |
|
|
48
|
+
| **Product LP** | ISR | `export const revalidate = 3600` | 1 hour |
|
|
49
|
+
| **Products Catalog** | ISR | `export const revalidate = 1800` | 30 min |
|
|
50
|
+
| **Blog Posts** | SSG + ISR | `generateStaticParams()` + revalidate | On publish |
|
|
51
|
+
| **Blog Hub** | ISR | `export const revalidate = 1800` | 30 min |
|
|
52
|
+
| **Cart** | SSR | `dynamic = 'force-dynamic'` | Every request |
|
|
53
|
+
| **Checkout** | SSR | `dynamic = 'force-dynamic'` | Every request |
|
|
54
|
+
| **Account Pages** | SSR | Cookie-based auth required | Every request |
|
|
55
|
+
| **Admin Pages** | SSR | Protected, real-time data | Every request |
|
|
56
|
+
| **Legal Pages** | SSG | Build-time only | On deploy |
|
|
57
|
+
| **404 / Error** | SSG | Build-time only | On deploy |
|
|
58
|
+
|
|
59
|
+
### 4.4 Rendering Implementation Patterns
|
|
60
|
+
|
|
61
|
+
- **ISR** (marketing pages): Set `export const revalidate = <seconds>` at route level. Use `generateStaticParams()` for dynamic slugs.
|
|
62
|
+
- **SSR** (dynamic/protected pages): Set `export const dynamic = 'force-dynamic'`. Fetch authenticated data in the server component, pass to client views.
|
|
63
|
+
- **SSG** (static legal pages): Plain component export, no data fetching. Rebuilt on deploy only.
|
|
64
|
+
- **On-demand revalidation**: Call `revalidatePath()` or `revalidateTag()` inside Server Actions after mutations.
|
|
65
|
+
|
|
66
|
+
## 5) Performance & Robustness
|
|
67
|
+
|
|
68
|
+
- Minimize client bundle size and isolate `'use client'`.
|
|
69
|
+
- Optimize images through `next/image` with explicit `sizes` and good formats.
|
|
70
|
+
- Choose caching/revalidation strategy deliberately.
|
|
71
|
+
- Wrap external calls in `try/catch`; handle timeouts, null data, and permission edges.
|
|
72
|
+
- Handle errors per rendering strategy: SSR pages show `error.tsx`, ISR pages show stale-while-revalidate fallback, client fetches show inline error with retry.
|
|
73
|
+
- Null/undefined data from API must be guarded — use optional chaining and nullish coalescing, never trust API response shape.
|
|
74
|
+
- If proposing optimization, include a measurement plan such as Lighthouse or bundle analysis.
|
|
75
|
+
|
|
76
|
+
## 6) Testing (Only Where It Pays)
|
|
77
|
+
|
|
78
|
+
- Add unit tests for critical or fragile logic.
|
|
79
|
+
- Do not add trivial tests for static markup.
|
|
80
|
+
- Prioritize checkout, auth, entitlement, and other security-relevant flows.
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
<!-- domain:ALL | layer:policy | ssot:ref | updated:2026-03-16 -->
|
|
2
|
+
# Frontend Engineering Rules
|
|
3
|
+
|
|
4
|
+
Purpose: Routing hub for frontend implementation policy, dependency discipline, code style, and rendering rules.
|
|
5
|
+
Read when: A frontend task needs canonical engineering guidance.
|
|
6
|
+
Skip when: A narrower frontend sub-file already answers the question.
|
|
7
|
+
Read next: This file for core guardrails, then `frontend-rendering-rules.md` for rendering/data strategy.
|
|
8
|
+
|
|
9
|
+
> Nav: [Docs Index](../00-index.md) | [Code Style](../../CodeStyle.md) | [STYLE_GUIDE](../../STYLE_GUIDE.md)
|
|
10
|
+
|
|
11
|
+
## 1) Non-Negotiables (Frontend)
|
|
12
|
+
|
|
13
|
+
- Follow requirements exactly; if details are missing, log assumptions and choose safe defaults.
|
|
14
|
+
- Output complete working code: no TODOs, placeholders, or missing edge cases.
|
|
15
|
+
- Prefer readability and correctness over cleverness.
|
|
16
|
+
- Use strict TypeScript everywhere; avoid `any`.
|
|
17
|
+
- Prefer Server Components and SSR/streaming; isolate `'use client'`.
|
|
18
|
+
- Always include loading, error, and empty states.
|
|
19
|
+
- Use semantic HTML and accessible interactions.
|
|
20
|
+
- Styling: Tailwind only unless the task explicitly requires custom CSS.
|
|
21
|
+
- Validate inputs with Zod and never leak secrets.
|
|
22
|
+
- New greenfield apps use `create-next-app` with TypeScript and Tailwind.
|
|
23
|
+
|
|
24
|
+
### Mandatory Engineering Rules
|
|
25
|
+
|
|
26
|
+
- **Money** → use integer cents only
|
|
27
|
+
- **Truth** → webhooks are the source of truth for payments and entitlements
|
|
28
|
+
- **Idempotency** → payment and webhook handlers must be idempotent
|
|
29
|
+
- **Secrets** → never expose backend or Stripe secrets to the browser
|
|
30
|
+
- **Cookie security** → `httpOnly`, `secure` in production, `sameSite: strict`
|
|
31
|
+
- **Dynamic settings** → operational toggles belong in DB-backed `site_settings`
|
|
32
|
+
|
|
33
|
+
## 2) Dependency Discipline
|
|
34
|
+
|
|
35
|
+
Before adding a library: explain need, list built-in alternative, confirm RSC/SSR compat, check redundancy, keep count minimal. Use the MCP server for shadcn/ui component operations; plan with higher-level blocks before atoms.
|
|
36
|
+
|
|
37
|
+
### Dependency Selection by Category
|
|
38
|
+
|
|
39
|
+
| Purpose | Recommended | Why | Avoid |
|
|
40
|
+
| ----------------- | --------------------- | ----------------------------------- | ---------------- |
|
|
41
|
+
| **UI Components** | shadcn/ui v3 + Radix | Copy-paste, no lock-in | MUI, Chakra |
|
|
42
|
+
| **Form Ops** | React Hook Form + Zod | Minimal, best DX | Formik |
|
|
43
|
+
| **Auth** | Django + allauth headless (ADR-019) | API-first, built-in JWT | NextAuth |
|
|
44
|
+
| **Date** | date-fns / Day.js | Modular, lightweight | moment.js |
|
|
45
|
+
| **Icons** | Iconify (Solar) | PRD standard | Font Awesome |
|
|
46
|
+
| **Animation** | Framer Motion | PRD standard | jQuery, GSAP |
|
|
47
|
+
| **Editor** | Tiptap | Headless, ProseMirror-based | Quill, Draft.js |
|
|
48
|
+
| **Captcha** | react-turnstile | Privacy-friendly | ReCaptcha |
|
|
49
|
+
|
|
50
|
+
## 3) Code Style & Tailwind
|
|
51
|
+
|
|
52
|
+
- Functional, declarative TypeScript; avoid classes. Use guard clauses and early returns.
|
|
53
|
+
- Prefer `const fn = () => {}`; type explicitly when it improves clarity.
|
|
54
|
+
- Organize imports: React/Next → third-party → internal → utils/types.
|
|
55
|
+
- Avoid unnecessary abstractions; components should have a single clear responsibility.
|
|
56
|
+
- Mobile-first responsive layout. Avoid ternaries inside `className`; use a `cn()` helper.
|
|
57
|
+
- Keep UI consistent via shadcn/ui components and design tokens.
|
|
58
|
+
- Primary CTAs must remain prominent, accessible, and mobile-friendly.
|
|
59
|
+
- Prefer logical properties for RTL compatibility.
|
|
60
|
+
- Use RGB CSS variables from `globals.css` so Tailwind opacity modifiers work.
|
|
61
|
+
- Sort classes as layout → box-model → typography → visuals → misc.
|
|
62
|
+
- Shared UI must stay reusable and composable.
|
|
63
|
+
- For mission-critical layout components (header, footer, nav): use explicit CSS classes in `globals.css` with raw media queries, not only Tailwind responsive classes — avoids silent breakage from config drift.
|
|
64
|
+
|
|
65
|
+
## 4) Comments
|
|
66
|
+
|
|
67
|
+
- Comment **why**, not **what**. If the code is self-evident, no comment is needed.
|
|
68
|
+
- Use `TODO: TASK-###` with a task number. Bare TODOs without a task reference are not allowed.
|
|
69
|
+
- Comment non-obvious logic, security constraints, and rendering boundary decisions (e.g. `// 'use client' — needs useState for accordion`).
|
|
70
|
+
- Do not add JSDoc that restates the component name or props type.
|
|
71
|
+
|
|
72
|
+
## 5) Auth Middleware Pattern
|
|
73
|
+
|
|
74
|
+
Auth middleware and token refresh: see `frontend-rendering-rules.md` § 4.1.
|
|
75
|
+
|
|
76
|
+
## 6) Error Handling
|
|
77
|
+
|
|
78
|
+
- Every async operation must handle loading, error, and empty states explicitly.
|
|
79
|
+
- Use Error Boundaries at route level minimum (`error.tsx` per route group).
|
|
80
|
+
- Map API `error_code` to i18n key: `errors.<domain>.<ERROR_CODE>` — never show raw server messages.
|
|
81
|
+
- Provide retry action for recoverable errors (network, timeout).
|
|
82
|
+
- Use toast for transient errors, inline display for form validation errors.
|
|
83
|
+
- Network errors: show retry button, not just "error occurred".
|
|
84
|
+
- Never let a failed API call result in a blank screen — always show fallback UI.
|
|
85
|
+
|
|
86
|
+
## 7) Edge Case Testing
|
|
87
|
+
|
|
88
|
+
- Test network failure scenarios (API returns 500, timeout, no response).
|
|
89
|
+
- Test empty states (no data, empty arrays, null responses).
|
|
90
|
+
- Test loading states (verify skeleton/spinner shows before data arrives).
|
|
91
|
+
- Test form validation with invalid input, empty required fields, boundary values.
|
|
92
|
+
- Test race conditions: rapid navigation, double-click submit, stale data after navigation.
|
|
93
|
+
- Never write a test that asserts "renders without crashing" — assert visible content or behavior.
|
|
94
|
+
|
|
95
|
+
## 8) E2E Testing (Playwright)
|
|
96
|
+
|
|
97
|
+
E2E tests live in `src/frontend/e2e/` and are split into two layers:
|
|
98
|
+
|
|
99
|
+
### Test Pyramid
|
|
100
|
+
|
|
101
|
+
**UI Tests** (`e2e/ui/`) — no backend needed:
|
|
102
|
+
|
|
103
|
+
- Page loads, form rendering, navigation, responsive layout
|
|
104
|
+
- Run with: `make test-frontend`
|
|
105
|
+
- Always pass regardless of backend state
|
|
106
|
+
- Use `waitUntil: 'domcontentloaded'` for navigation
|
|
107
|
+
|
|
108
|
+
**Integration Tests** (`e2e/integration/`) — backend REQUIRED:
|
|
109
|
+
|
|
110
|
+
- Real API calls verified with `page.waitForResponse()`
|
|
111
|
+
- HTTP status asserted (`expect(response.status()).toBeLessThan(400)`)
|
|
112
|
+
- Use `requireBackend()` — tests FAIL (not skip) when backend is down
|
|
113
|
+
- Run with: `make test-frontend-integration`
|
|
114
|
+
|
|
115
|
+
### When to write which type
|
|
116
|
+
|
|
117
|
+
- **UI test**: page loads correctly, form fields render, client-side validation, navigation links work
|
|
118
|
+
- **Integration test**: form submit hits API and gets 200, data appears after action, redirect after auth
|
|
119
|
+
|
|
120
|
+
### Patterns
|
|
121
|
+
|
|
122
|
+
- Use `waitUntil: 'domcontentloaded'` for navigation — never `'load'` or `'networkidle'`.
|
|
123
|
+
- Use `requireBackend()` in integration tests — never `skipIfNoBackend()` or `backendAvailable` branching.
|
|
124
|
+
- Use `page.waitForResponse()` to intercept and verify API responses.
|
|
125
|
+
- Use `generateTestEmail()` for unique test data per run.
|
|
126
|
+
- Prefer `page.getByRole()` and `page.locator('#id')` over fragile CSS selectors.
|
|
127
|
+
- Tests must pass without Stripe keys or Turnstile — these are env-var gated.
|
|
128
|
+
- Use `attachPageDiagnostics()` to capture console errors, network failures, API calls.
|
|
129
|
+
|
|
130
|
+
### Network Guard (MANDATORY for integration tests)
|
|
131
|
+
|
|
132
|
+
**Every integration test MUST use `attachNetworkGuard()`** — a test that passes while the Network tab has errors is a lying test.
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
import { attachNetworkGuard } from '../helpers';
|
|
136
|
+
|
|
137
|
+
test('my integration test', async ({ page }) => {
|
|
138
|
+
const guard = attachNetworkGuard(page);
|
|
139
|
+
|
|
140
|
+
// ... test actions ...
|
|
141
|
+
|
|
142
|
+
// MUST be the last assertion — fails if unexpected network errors occurred
|
|
143
|
+
guard.assertNoUnexpectedErrors();
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**How it works:**
|
|
148
|
+
|
|
149
|
+
- Monitors ALL network responses (4xx, 5xx) and request failures (CSP, timeouts, aborts)
|
|
150
|
+
- Compares against a whitelist of expected errors (e.g., guest 401 on `/api/auth/user`)
|
|
151
|
+
- Fails with a detailed report showing exactly which requests failed
|
|
152
|
+
|
|
153
|
+
**To whitelist test-specific expected errors:**
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
const guard = attachNetworkGuard(page, [
|
|
157
|
+
{ urlPattern: /\/api\/v1\/some-endpoint/, status: 404 },
|
|
158
|
+
]);
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**Default whitelist** (always allowed):
|
|
162
|
+
|
|
163
|
+
- `GET /api/auth/user` — guest users always get 401, this is expected
|
|
164
|
+
- `lh3.googleusercontent.com` CSP — Google-hosted images blocked by CSP in dev
|
|
165
|
+
- `/_next/image` 400 — missing local images in dev mode
|
|
166
|
+
|
|
167
|
+
### Running
|
|
168
|
+
|
|
169
|
+
- `make test-frontend` — UI tests only (no backend)
|
|
170
|
+
- `make test-frontend-integration` — integration tests (backend required)
|
|
171
|
+
- `make test-frontend-headed` — visible browser
|
|
172
|
+
- `make ci-gate` — full pipeline: lint → backend → UI → integration → diagnose
|
|
173
|
+
|
|
174
|
+
## Sub-File Routing
|
|
175
|
+
|
|
176
|
+
- [frontend-rendering-rules.md](./frontend-rendering-rules.md)
|
|
177
|
+
Server-first rendering strategy, API client boundaries, performance, and testing guidance.
|
|
178
|
+
|
|
179
|
+
## Quick Routing
|
|
180
|
+
|
|
181
|
+
- Dependency choice or package fit → this file
|
|
182
|
+
- Shared component style or Tailwind rule → this file
|
|
183
|
+
- Server vs client rendering, SSR/ISR/SSG, caching, or tests → `frontend-rendering-rules.md`
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<!-- domain:ALL | layer:policy | ssot:true | updated:2026-03-16 -->
|
|
2
|
+
# Internationalization Policy
|
|
3
|
+
|
|
4
|
+
Purpose: Locale support, message-key naming, ICU format rules, and src/frontend/backend i18n contracts.
|
|
5
|
+
Read when: Adding translatable strings, setting up new locales, or reviewing i18n contracts.
|
|
6
|
+
Skip when: Working within existing locale without adding new message keys.
|
|
7
|
+
Read next: `architecture/10-blog-content-i18n.md` for content backend, `copywriting-standard.md` for tone.
|
|
8
|
+
|
|
9
|
+
> Nav: [Docs Index](../00-index.md) | [Blog & i18n Architecture](../architecture/10-blog-content-i18n.md)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Supported Locales
|
|
14
|
+
|
|
15
|
+
- `en` → Active (default, fallback for all missing keys)
|
|
16
|
+
- `es` → Planned (Americas + Spain)
|
|
17
|
+
- `fa` → Planned (Iran + Farsi-speaking regions)
|
|
18
|
+
- `de` → Planned (DACH region)
|
|
19
|
+
- `fr` → Planned (France + Francophone)
|
|
20
|
+
|
|
21
|
+
Format: BCP 47 lowercase, no region subtags unless required by regulation.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Message Key Naming
|
|
26
|
+
|
|
27
|
+
Format: `<page>.<section>.<key>` — all lowercase, dot-separated, no camelCase or underscores.
|
|
28
|
+
|
|
29
|
+
- Page prefix matches content-spec filename slug: `home.*`, `checkout.*`, `shared.*` (header/footer), `errors.*`
|
|
30
|
+
- Section groups by UI region: `home.hero.*`, `checkout.payment.*`
|
|
31
|
+
- Key names the specific element: `checkout.payment.card-label`, `shared.nav.home`
|
|
32
|
+
|
|
33
|
+
Examples: `home.hero.title` → "Welcome to ExampleApp" | `errors.not-found.heading` → "Page not found"
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Message Files
|
|
38
|
+
|
|
39
|
+
Location: `src/frontend/messages/{locale}.json` — nested JSON matching dot-separated keys.
|
|
40
|
+
|
|
41
|
+
Example: `{ "home": { "hero": { "title": "Welcome to ExampleApp", "cta": "Start browsing" } }, "checkout": { "summary": { "total": "Total", "item-count": "{count, plural, one {# item} other {# items}}" } } }`
|
|
42
|
+
|
|
43
|
+
Required: `en.json` must have all keys. Other locales may be incomplete — `next-intl` falls back to English.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## ICU Message Format
|
|
48
|
+
|
|
49
|
+
- **Variables** → `{count}` — wrap variable names in curly braces.
|
|
50
|
+
- **Pluralization** → `"{count, plural, =0 {No items} one {# item} other {# items}}"` — use `=0`, `one`, `other`.
|
|
51
|
+
- **Date/Time** → `"{date, date, long}"` — backend provides ISO 8601, frontend formats via next-intl.
|
|
52
|
+
- **Currency** → `"{amount, number, currency}"` — use `Intl.NumberFormat` in components or ICU format.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Frontend Setup
|
|
57
|
+
|
|
58
|
+
- Library: `next-intl` (App Router) | Config: `src/frontend/next-intl.config.ts`
|
|
59
|
+
- URL structure: `/[locale]/page` (e.g., `/en/home`, `/es/checkout`)
|
|
60
|
+
- Locale detection: `Accept-Language` header → fallback `en`
|
|
61
|
+
- Usage: `const t = useTranslations(); return <h1>{t('home.hero.title')}</h1>;`
|
|
62
|
+
- With variables: `t('cart.item-count', { count: items.length })`
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Backend i18n
|
|
67
|
+
|
|
68
|
+
- **Django Admin** → `gettext_lazy` for model labels, help text. Files in `locale/{locale}/LC_MESSAGES/`.
|
|
69
|
+
- **DRF API** → English-only error messages with machine-readable error codes (e.g., `{ "error_code": "INVALID_CARD", "message": "Invalid card number" }`). Frontend maps `error_code` → localized message via `errors.<feature>.{error_code}` key.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Hardcoded vs i18n Rule
|
|
74
|
+
|
|
75
|
+
**ALL user-facing text must use message keys:** headings, labels, buttons, links, form messages, tooltips, email templates, meta descriptions.
|
|
76
|
+
|
|
77
|
+
**Hardcoded English allowed only for:** console logs, code comments, variable names, migration descriptions, git commits.
|
|
78
|
+
|
|
79
|
+
- All user-facing error messages must use i18n message keys (`errors.<domain>.<ERROR_CODE>`), never hardcoded English strings.
|
|
80
|
+
- Backend error responses use `error_code` only — frontend maps to localized message via `messages/{locale}.json`.
|
|
81
|
+
|
|
82
|
+
**Enforcement phasing:** Content-spec files marked `format:i18n-keys` must stay lint-clean. Frontend runtime surfaces are still migrating — `make docs-lint` inventories remaining hardcoded text without failing. Admin-only surfaces and editor/demo code stay out of docs-lint gating until a dedicated migration task promotes them.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Adding a New Locale
|
|
87
|
+
|
|
88
|
+
1. Copy `en.json` → `{new-locale}.json`
|
|
89
|
+
2. Update `next-intl.config.ts` to register locale
|
|
90
|
+
3. Add to this policy's supported locales list
|
|
91
|
+
4. Translate all keys — no blank values in production
|
|
92
|
+
5. Test language switcher and URL routing
|
|
93
|
+
6. Update `changes.log`
|
|
94
|
+
|
|
95
|
+
## Validation
|
|
96
|
+
|
|
97
|
+
- Missing keys → compare key depth between `en.json` and target locale
|
|
98
|
+
- Hardcoded text → `rg '">` in `src/frontend/components/`
|
|
99
|
+
- Key format → `rg '\.[a-z]+\.[a-z]+\.' src/frontend/` to validate
|