coding-os 0.3.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- adapters/claude/README.md +6 -0
- adapters/claude/_install_helpers/extract_stacks.py +43 -0
- adapters/claude/_install_helpers/update_mcp_json.py +75 -0
- adapters/claude/adapter.yaml +164 -0
- adapters/claude/hooks/README.md +40 -0
- adapters/claude/hooks/agent_memory_sync.py +131 -0
- adapters/claude/hooks/ensure-agent-memory-link.sh +36 -0
- adapters/claude/hooks/sync-agent-memory.sh +21 -0
- adapters/claude/install.sh +86 -0
- adapters/claude/sdk_dispatcher.py +871 -0
- adapters/claude/settings.local.template.json +31 -0
- adapters/claude/settings.template.json +808 -0
- adapters/claude/update_mcp_json.py +85 -0
- adapters/codex/adapter.yaml +254 -0
- adapters/codex/chat_provider.py +230 -0
- adapters/codex/commands/formula-f1.md +129 -0
- adapters/codex/commands/formula-f10.md +100 -0
- adapters/codex/commands/formula-f11.md +123 -0
- adapters/codex/commands/formula-f2.md +139 -0
- adapters/codex/commands/formula-f3.md +127 -0
- adapters/codex/commands/formula-f4.md +101 -0
- adapters/codex/commands/formula-f5.md +135 -0
- adapters/codex/commands/formula-f6.md +147 -0
- adapters/codex/commands/formula-f7.md +111 -0
- adapters/codex/commands/formula-f8.md +133 -0
- adapters/codex/commands/formula-f9.md +112 -0
- adapters/codex/enable_codex_hooks.py +94 -0
- adapters/codex/ensure_codex_mcp.py +124 -0
- adapters/codex/hooks/codex-merge-hook-output.py +72 -0
- adapters/codex/hooks/codex-normalize-edit.py +96 -0
- adapters/codex/hooks/codex-postedit-dispatch.sh +75 -0
- adapters/codex/hooks/codex-posttool-dispatch.sh +70 -0
- adapters/codex/hooks/codex-preedit-dispatch.sh +83 -0
- adapters/codex/hooks/codex-pretool-dispatch.sh +82 -0
- adapters/codex/hooks/codex-sessionend-dispatch.sh +20 -0
- adapters/codex/hooks/codex-sessionstart-dispatch.sh +68 -0
- adapters/codex/hooks/codex-stop-dispatch.sh +73 -0
- adapters/codex/hooks/codex-userpromptsubmit-dispatch.sh +74 -0
- adapters/codex/hooks.template.json +208 -0
- adapters/codex/install.sh +83 -0
- adapters/codex/sdk_dispatcher.py +449 -0
- board_os/__init__.py +39 -0
- board_os/_agent_runtime.py +256 -0
- board_os/config.py +421 -0
- board_os/git_coherence.py +107 -0
- board_os/hub_adapter_manifest.py +140 -0
- board_os/mcp_tools.py +3228 -0
- board_os/migration.py +166 -0
- board_os/parser.py +317 -0
- board_os/presence.py +156 -0
- board_os/sync.py +320 -0
- board_os/transition_gates.py +224 -0
- board_os/transition_gates_cli.py +272 -0
- board_os/transition_gates_validator.py +551 -0
- board_os/verify_suites.py +126 -0
- board_os/verify_suites_cli.py +328 -0
- board_os/workflow.py +967 -0
- cli/__init__.py +0 -0
- cli/_data_types.py +248 -0
- cli/_init_helpers.py +587 -0
- cli/_resources.py +100 -0
- cli/adapter_registry.py +239 -0
- cli/add_stack.py +315 -0
- cli/aggregator.py +438 -0
- cli/board_commands.py +1218 -0
- cli/brain_commands.py +255 -0
- cli/cognition.py +345 -0
- cli/config_composer.py +349 -0
- cli/core_version.py +41 -0
- cli/cron_commands.py +278 -0
- cli/db_reset.py +298 -0
- cli/doc_commands.py +111 -0
- cli/doctor.py +2953 -0
- cli/doctor_board.py +365 -0
- cli/doctor_extras.py +1121 -0
- cli/doctor_graph.py +608 -0
- cli/doctor_tokens.py +254 -0
- cli/graph_commands.py +1265 -0
- cli/hook_renderer.py +393 -0
- cli/hub_commands.py +580 -0
- cli/list_adapters.py +79 -0
- cli/list_stacks.py +105 -0
- cli/logs_commands.py +89 -0
- cli/main.py +3070 -0
- cli/materialize_file.py +65 -0
- cli/mcp_start.py +153 -0
- cli/module_commands.py +513 -0
- cli/pr_commands.py +2024 -0
- cli/preset_commands.py +126 -0
- cli/preset_registry.py +171 -0
- cli/project_overrides.py +119 -0
- cli/registry.py +365 -0
- cli/remove_stack.py +492 -0
- cli/renderer.py +620 -0
- cli/setup.py +464 -0
- cli/skill_commands.py +689 -0
- cli/skill_registry.py +235 -0
- cli/skills_list.py +332 -0
- cli/stack_lint.py +351 -0
- cli/stack_registry.py +688 -0
- cli/subsystems.py +335 -0
- cli/sync_all.py +310 -0
- cli/tail_command.py +410 -0
- cli/update.py +608 -0
- cli/verify_since_edit.py +439 -0
- coding_os-0.3.2.dist-info/METADATA +508 -0
- coding_os-0.3.2.dist-info/RECORD +1304 -0
- coding_os-0.3.2.dist-info/WHEEL +5 -0
- coding_os-0.3.2.dist-info/entry_points.txt +5 -0
- coding_os-0.3.2.dist-info/licenses/LICENSE +201 -0
- coding_os-0.3.2.dist-info/top_level.txt +10 -0
- core/__init__.py +0 -0
- core/board_os/__init__.py +39 -0
- core/board_os/_agent_runtime.py +256 -0
- core/board_os/config.py +421 -0
- core/board_os/git_coherence.py +107 -0
- core/board_os/hub_adapter_manifest.py +140 -0
- core/board_os/mcp_tools.py +3228 -0
- core/board_os/migration.py +166 -0
- core/board_os/parser.py +317 -0
- core/board_os/presence.py +156 -0
- core/board_os/sync.py +320 -0
- core/board_os/transition-gates.yaml +176 -0
- core/board_os/transition_gates.py +224 -0
- core/board_os/transition_gates_cli.py +272 -0
- core/board_os/transition_gates_validator.py +551 -0
- core/board_os/verify-suites.yaml +113 -0
- core/board_os/verify_suites.py +126 -0
- core/board_os/verify_suites_cli.py +328 -0
- core/board_os/workflow.py +967 -0
- core/commands/board.md +27 -0
- core/commands/classify.md +23 -0
- core/commands/compose.md +23 -0
- core/commands/daily.md +31 -0
- core/commands/diagnose.md +7 -0
- core/commands/memory-search.md +23 -0
- core/commands/new-project.md +33 -0
- core/commands/retro.md +38 -0
- core/commands/review.md +14 -0
- core/commands/task.md +17 -0
- core/commands/verify.md +34 -0
- core/docs/thinking_os-final-edition.md +1449 -0
- core/doctor-config.yaml +74 -0
- core/graph_os/__init__.py +29 -0
- core/graph_os/backend.py +233 -0
- core/graph_os/backends/__init__.py +13 -0
- core/graph_os/backends/sqlite_backend.py +1053 -0
- core/graph_os/bench/__init__.py +17 -0
- core/graph_os/bench/fixtures.py +56 -0
- core/graph_os/bench/harness.py +95 -0
- core/graph_os/bench/persian_precision.py +142 -0
- core/graph_os/bench/scale_500k.py +120 -0
- core/graph_os/bench/token_cost.py +170 -0
- core/graph_os/bench/viewer_fps.py +110 -0
- core/graph_os/communities.py +410 -0
- core/graph_os/enterprise.py +218 -0
- core/graph_os/entry_points.py +226 -0
- core/graph_os/extractors/__init__.py +25 -0
- core/graph_os/extractors/code_generic.py +914 -0
- core/graph_os/extractors/code_go.py +1422 -0
- core/graph_os/extractors/code_json.py +340 -0
- core/graph_os/extractors/code_php.py +979 -0
- core/graph_os/extractors/code_python.py +1454 -0
- core/graph_os/extractors/code_shell.py +538 -0
- core/graph_os/extractors/code_toml.py +302 -0
- core/graph_os/extractors/code_ts.py +1665 -0
- core/graph_os/extractors/code_yaml.py +394 -0
- core/graph_os/extractors/contracts.py +1592 -0
- core/graph_os/extractors/md_links.py +890 -0
- core/graph_os/extractors/task_deps.py +345 -0
- core/graph_os/groups/__init__.py +22 -0
- core/graph_os/groups/cross_repo.py +156 -0
- core/graph_os/groups/manifest.py +141 -0
- core/graph_os/ingest/__init__.py +19 -0
- core/graph_os/ingest/base.py +306 -0
- core/graph_os/ingest/github.py +112 -0
- core/graph_os/ingest/zip.py +95 -0
- core/graph_os/toolchain.py +393 -0
- core/graph_os/tools/__init__.py +9 -0
- core/graph_os/tools/graph.py +5573 -0
- core/graph_os/tools/reindex_dispatch.py +730 -0
- core/graph_os/tree_sitter_overlay.py +235 -0
- core/graph_os/types.py +252 -0
- core/graph_os/vec_index.py +277 -0
- core/graph_os/viewer/__init__.py +12 -0
- core/graph_os/viewer/exporter.py +93 -0
- core/graph_os/viewer/template.py +189 -0
- core/hooks/_helpers/_paths.py +40 -0
- core/hooks/_helpers/advance_role.py +72 -0
- core/hooks/_helpers/auto_compose.py +228 -0
- core/hooks/_helpers/auto_validate_lessons.py +55 -0
- core/hooks/_helpers/branch_guard_check.py +796 -0
- core/hooks/_helpers/check_commit_message.py +108 -0
- core/hooks/_helpers/check_dangerous_rm.py +80 -0
- core/hooks/_helpers/check_git_bypass.py +154 -0
- core/hooks/_helpers/check_git_destructive.py +77 -0
- core/hooks/_helpers/check_settings_write.py +97 -0
- core/hooks/_helpers/consume_override.py +51 -0
- core/hooks/_helpers/context_budget.py +77 -0
- core/hooks/_helpers/cos_say_json.py +103 -0
- core/hooks/_helpers/destructive_edit_check.py +163 -0
- core/hooks/_helpers/detect_status_transition.py +82 -0
- core/hooks/_helpers/digest_regen.py +56 -0
- core/hooks/_helpers/doc_sync_check.py +498 -0
- core/hooks/_helpers/drain_embedding_outbox.py +52 -0
- core/hooks/_helpers/extract_additional_context.py +51 -0
- core/hooks/_helpers/extract_commit_msg_arg.py +74 -0
- core/hooks/_helpers/git_command_parse.py +424 -0
- core/hooks/_helpers/git_settings_fields.py +47 -0
- core/hooks/_helpers/graph_context_match.py +37 -0
- core/hooks/_helpers/graph_marker_check.py +70 -0
- core/hooks/_helpers/jit_recall.py +56 -0
- core/hooks/_helpers/json_field.py +41 -0
- core/hooks/_helpers/narrative_signal.py +59 -0
- core/hooks/_helpers/observation_count.py +31 -0
- core/hooks/_helpers/pre_commit_batch.py +177 -0
- core/hooks/_helpers/pre_commit_fake_input.py +42 -0
- core/hooks/_helpers/presence_gc.py +102 -0
- core/hooks/_helpers/presence_write.py +167 -0
- core/hooks/_helpers/recover_indirect.py +35 -0
- core/hooks/_helpers/routing_evolution.py +104 -0
- core/hooks/_helpers/session_recap.py +72 -0
- core/hooks/_helpers/skill_primer.py +229 -0
- core/hooks/_helpers/task_sync.py +59 -0
- core/hooks/_helpers/tool_failure_capture.py +147 -0
- core/hooks/_helpers/trajectory_autosnap.py +278 -0
- core/hooks/_helpers/trajectory_startup.py +62 -0
- core/hooks/_helpers/turn_summary.py +82 -0
- core/hooks/_helpers/validate_task_frontmatter.py +98 -0
- core/hooks/_helpers/wip_limit_check.py +103 -0
- core/hooks/_helpers/wip_lines.py +53 -0
- core/hooks/_helpers/work_log_append.py +89 -0
- core/hooks/_helpers/wrap_dispatch_output.py +82 -0
- core/hooks/advance-role.sh +48 -0
- core/hooks/agent-presence.sh +179 -0
- core/hooks/auto-brain-decay.sh +184 -0
- core/hooks/auto-compose-roles.sh +83 -0
- core/hooks/auto-graph-reconcile-shell.sh +119 -0
- core/hooks/auto-regen-doc-index.sh +120 -0
- core/hooks/auto-reindex-docs.sh +130 -0
- core/hooks/auto-task-sync.sh +56 -0
- core/hooks/auto-trace-rotate.sh +88 -0
- core/hooks/block-bad-patterns.sh +212 -0
- core/hooks/block-dangerous-commands.sh +182 -0
- core/hooks/block-hardcoded-literals.sh +90 -0
- core/hooks/block-migration-conflict.sh +114 -0
- core/hooks/block-protected-files.sh +129 -0
- core/hooks/block-secrets.sh +185 -0
- core/hooks/block-shared-tree-edit.sh +75 -0
- core/hooks/block-uv-heredoc.sh +78 -0
- core/hooks/branch-guard.sh +122 -0
- core/hooks/capture-observation.sh +76 -0
- core/hooks/capture-tool-failure.sh +24 -0
- core/hooks/capture-work-log.sh +89 -0
- core/hooks/check-agents-md-refs.sh +75 -0
- core/hooks/check-agents-md-size.sh +49 -0
- core/hooks/check-capture-worked.sh +148 -0
- core/hooks/check-doc-size.sh +61 -0
- core/hooks/check-mcp-extras.sh +92 -0
- core/hooks/check-state.sh +87 -0
- core/hooks/classify-task-mode.sh +103 -0
- core/hooks/cos-env.sh +1301 -0
- core/hooks/drain-embedding-outbox.sh +24 -0
- core/hooks/enforce-anti-ambiguity.sh +74 -0
- core/hooks/enforce-commit-message.sh +73 -0
- core/hooks/enforce-doc-anchor.sh +224 -0
- core/hooks/enforce-doc-sync.sh +206 -0
- core/hooks/enforce-graph-context.sh +89 -0
- core/hooks/enforce-graph-first-read.sh +94 -0
- core/hooks/enforce-memory-check.sh +128 -0
- core/hooks/enforce-rename-plan.sh +78 -0
- core/hooks/enforce-scaffold-boundary.sh +68 -0
- core/hooks/enforce-skill.sh +125 -0
- core/hooks/enforce-task-body.sh +52 -0
- core/hooks/enforce-task-start.sh +81 -0
- core/hooks/enforce-task-transition.sh +75 -0
- core/hooks/enforce-template.sh +143 -0
- core/hooks/enforce-verify.sh +112 -0
- core/hooks/enforce-wip-limit.sh +43 -0
- core/hooks/enforce-zoom.sh +69 -0
- core/hooks/ensure-hub-up.sh +67 -0
- core/hooks/inject-mcp-caller-session.sh +70 -0
- core/hooks/jit-recall.sh +65 -0
- core/hooks/link-commit-to-task.sh +143 -0
- core/hooks/lint-task.sh +40 -0
- core/hooks/nudge-docs-first.sh +71 -0
- core/hooks/nudge-git-mode.sh +29 -0
- core/hooks/nudge-graph-os.sh +118 -0
- core/hooks/nudge-learn-narrative.sh +36 -0
- core/hooks/nudge-model-routing.sh +32 -0
- core/hooks/nudge-reentry.sh +101 -0
- core/hooks/nudge-reuse-first.sh +68 -0
- core/hooks/nudge-task-discovery.sh +81 -0
- core/hooks/nudge-thinking-os.sh +109 -0
- core/hooks/pr-reap.sh +23 -0
- core/hooks/reclaim-sweep.sh +58 -0
- core/hooks/record-verify-auto.sh +77 -0
- core/hooks/record-verify.sh +74 -0
- core/hooks/regen-reminder.sh +104 -0
- core/hooks/registry.yaml +1262 -0
- core/hooks/remind-daily.sh +27 -0
- core/hooks/remind-dogfood.sh +70 -0
- core/hooks/remind-learn-validate.sh +94 -0
- core/hooks/rules-primer.sh +50 -0
- core/hooks/search-enforce-inventory.sh +108 -0
- core/hooks/search-verify-remaining.sh +132 -0
- core/hooks/session-context.sh +729 -0
- core/hooks/session-end.sh +145 -0
- core/hooks/session-skill-primer.sh +43 -0
- core/hooks/snapshot-transcript.sh +56 -0
- core/hooks/sync-task-current.sh +85 -0
- core/hooks/test-first-reminder.sh +120 -0
- core/hooks/test-governor.sh +173 -0
- core/hooks/thinking_os-gate.sh +52 -0
- core/hooks/track-backtrack.sh +35 -0
- core/hooks/track-discovery.sh +121 -0
- core/hooks/track-skill.sh +53 -0
- core/hooks/validate-task-frontmatter.sh +49 -0
- core/hooks/verify-rename-callers.sh +119 -0
- core/hooks/warn-abandoned-task.sh +99 -0
- core/hooks/warn-destructive-edit.sh +64 -0
- core/hooks/warn-diff-size.sh +43 -0
- core/hooks/warn-graph-empty.sh +81 -0
- core/hooks/warn-mcp-down.sh +190 -0
- core/hooks/write-state.sh +55 -0
- core/logging_os/__init__.py +33 -0
- core/logging_os/api.py +127 -0
- core/logging_os/bridge.py +80 -0
- core/logging_os/config.py +172 -0
- core/logging_os/fingerprint.py +25 -0
- core/logging_os/redact.py +53 -0
- core/logging_os/render.py +83 -0
- core/logging_os/sinks.py +164 -0
- core/rules/anti-overengineering.md +44 -0
- core/rules/api-contract-discipline.md +41 -0
- core/rules/dimension-registry.md +155 -0
- core/rules/git-workflow.md +57 -0
- core/rules/memory.md +46 -0
- core/rules/model-routing.md +22 -0
- core/rules/skill-enforcement.md +75 -0
- core/rules/test-discipline.md +38 -0
- core/rules/thinking_os.md +48 -0
- core/rules/transparency-banner.md +37 -0
- core/runtime_paths.yaml +36 -0
- core/scaffold_manifest.json +14430 -0
- core/scheduled/__init__.py +0 -0
- core/scheduled/_activity.py +126 -0
- core/scheduled/_state.py +113 -0
- core/scheduled/config.py +86 -0
- core/scheduled/dep_reconcile.py +135 -0
- core/scheduled/error_sweep.py +137 -0
- core/scheduled/nightly.py +930 -0
- core/scheduled/responsive_extract.py +65 -0
- core/schemas/adapter.schema.json +269 -0
- core/schemas/preset.schema.json +50 -0
- core/schemas/skill.schema.json +81 -0
- core/schemas/stack.schema.json +404 -0
- core/scripts/_lib.sh +9 -0
- core/scripts/docs-lint.sh +228 -0
- core/scripts/docs-nav-fix.sh +133 -0
- core/scripts/docs-staleness-check.sh +154 -0
- core/scripts/install-adapter.sh +266 -0
- core/scripts/link-stack-skills.sh +52 -0
- core/scripts/log-latest.sh +106 -0
- core/scripts/log-search.sh +89 -0
- core/scripts/log-write.sh +134 -0
- core/scripts/ref-resolve.sh +71 -0
- core/skills/a11y/SKILL.md +305 -0
- core/skills/a11y/assets/a11y-checklist.md +137 -0
- core/skills/a11y/references/aria-and-focus.md +247 -0
- core/skills/a11y/references/rn-accessibility.md +343 -0
- core/skills/a11y/references/screen-reader-testing.md +190 -0
- core/skills/agent-memory/SKILL.md +191 -0
- core/skills/agent-memory/assets/memory-checklist.md +21 -0
- core/skills/agent-memory/references/memory-recipes.md +57 -0
- core/skills/api-design/SKILL.md +232 -0
- core/skills/api-design/assets/api-design-checklist.md +110 -0
- core/skills/api-design/references/error-envelope.md +381 -0
- core/skills/api-design/references/idempotency-pagination.md +312 -0
- core/skills/api-design/references/rest-contracts.md +426 -0
- core/skills/auth-patterns/SKILL.md +352 -0
- core/skills/auth-patterns/assets/auth-checklist.md +118 -0
- core/skills/auth-patterns/references/jwt-and-service-tokens.md +343 -0
- core/skills/auth-patterns/references/passkeys-2fa.md +289 -0
- core/skills/auth-patterns/references/sessions-vs-jwt.md +230 -0
- core/skills/auth-patterns/scripts/cookie-flag-check.py +146 -0
- core/skills/backend-fundamentals/SKILL.md +238 -0
- core/skills/backend-fundamentals/assets/backend-checklist.md +27 -0
- core/skills/backend-fundamentals/references/backend-patterns.md +56 -0
- core/skills/backend-fundamentals/scripts/check_layering.py +83 -0
- core/skills/clean-code/SKILL.md +642 -0
- core/skills/clean-code/scripts/audit-fail-closed.py +167 -0
- core/skills/codebase-explorer/SKILL.md +89 -0
- core/skills/codebase-explorer/assets/reading-checklist.md +24 -0
- core/skills/codebase-explorer/references/reading-strategies.md +52 -0
- core/skills/codebase-explorer/scripts/outline.py +99 -0
- core/skills/db-design/SKILL.md +327 -0
- core/skills/db-design/assets/migration-template.sql +49 -0
- core/skills/db-design/references/migration-discipline.md +290 -0
- core/skills/db-design/references/postgres-patterns.md +340 -0
- core/skills/db-design/scripts/migration-safety.sh +150 -0
- core/skills/deployment-cicd/SKILL.md +260 -0
- core/skills/deployment-cicd/assets/deploy-checklist.md +26 -0
- core/skills/deployment-cicd/references/pipeline-and-release.md +54 -0
- core/skills/deployment-cicd/scripts/lint_workflow.py +79 -0
- core/skills/docker/SKILL.md +114 -0
- core/skills/docker/assets/dockerfile-checklist.md +31 -0
- core/skills/docker/references/compose-patterns.md +66 -0
- core/skills/docker/references/dockerfile-optimization.md +64 -0
- core/skills/docker/scripts/lint_dockerfile.sh +48 -0
- core/skills/docker/versions.json +16 -0
- core/skills/end-to-end-testing/SKILL.md +101 -0
- core/skills/end-to-end-testing/assets/e2e-checklist.md +23 -0
- core/skills/end-to-end-testing/references/maestro.md +63 -0
- core/skills/end-to-end-testing/references/playwright.md +68 -0
- core/skills/end-to-end-testing/scripts/lint_e2e.py +88 -0
- core/skills/end-to-end-testing/versions.json +16 -0
- core/skills/frontend-design/SKILL.md +76 -0
- core/skills/frontend-design/assets/design-checklist.md +29 -0
- core/skills/frontend-design/references/design-principles.md +65 -0
- core/skills/frontend-design/scripts/check_contrast.py +89 -0
- core/skills/frontend-fundamentals/SKILL.md +213 -0
- core/skills/frontend-fundamentals/assets/frontend-checklist.md +25 -0
- core/skills/frontend-fundamentals/references/rendering-and-state.md +66 -0
- core/skills/frontend-fundamentals/scripts/check_frontend.py +86 -0
- core/skills/graph-explorer/SKILL.md +215 -0
- core/skills/graph-explorer/scripts/explain-impact.sh +64 -0
- core/skills/graphql/SKILL.md +187 -0
- core/skills/grpc-microservices/SKILL.md +174 -0
- core/skills/hexagonal-architecture/SKILL.md +199 -0
- core/skills/hexagonal-architecture/assets/folder-scaffold.md +233 -0
- core/skills/hexagonal-architecture/references/anti-patterns.md +129 -0
- core/skills/hexagonal-architecture/references/go-fiber-layout.md +429 -0
- core/skills/hexagonal-architecture/references/python-fastapi-layout.md +453 -0
- core/skills/hexagonal-architecture/references/react-native-layout.md +428 -0
- core/skills/i18n/SKILL.md +126 -0
- core/skills/incident-response/SKILL.md +225 -0
- core/skills/incident-response/assets/incident-checklist.md +29 -0
- core/skills/incident-response/references/severity-and-runbook.md +53 -0
- core/skills/incident-response/scripts/classify_severity.py +86 -0
- core/skills/linux-sysadmin/SKILL.md +115 -0
- core/skills/linux-sysadmin/assets/hardening-checklist.md +29 -0
- core/skills/linux-sysadmin/references/ssh-hardening.md +62 -0
- core/skills/linux-sysadmin/references/systemd-and-services.md +77 -0
- core/skills/linux-sysadmin/scripts/triage.sh +50 -0
- core/skills/linux-sysadmin/versions.json +17 -0
- core/skills/llm-patterns/SKILL.md +410 -0
- core/skills/llm-patterns/assets/llm-feature-checklist.md +26 -0
- core/skills/llm-patterns/references/rag-and-evals.md +59 -0
- core/skills/llm-patterns/scripts/estimate_tokens.py +75 -0
- core/skills/messaging-queues/SKILL.md +142 -0
- core/skills/mobile-fundamentals/SKILL.md +406 -0
- core/skills/mobile-fundamentals/assets/mobile-launch-checklist.md +130 -0
- core/skills/mobile-fundamentals/references/navigation-and-deep-links.md +337 -0
- core/skills/mobile-fundamentals/references/offline-sync.md +339 -0
- core/skills/node-backend/SKILL.md +114 -0
- core/skills/node-backend/assets/node-checklist.md +25 -0
- core/skills/node-backend/references/async-and-errors.md +67 -0
- core/skills/node-backend/references/event-loop.md +65 -0
- core/skills/node-backend/scripts/check_package.py +78 -0
- core/skills/node-backend/versions.json +17 -0
- core/skills/observability/SKILL.md +289 -0
- core/skills/observability/assets/observability-checklist.md +27 -0
- core/skills/observability/references/instrumentation.md +57 -0
- core/skills/observability/scripts/lint_logging.py +77 -0
- core/skills/payments/SKILL.md +102 -0
- core/skills/performance/SKILL.md +305 -0
- core/skills/performance/assets/perf-checklist.md +143 -0
- core/skills/performance/references/mobile-performance.md +249 -0
- core/skills/performance/references/web-vitals.md +209 -0
- core/skills/php/SKILL.md +116 -0
- core/skills/php/assets/php-checklist.md +26 -0
- core/skills/php/references/modern-php.md +64 -0
- core/skills/php/references/security.md +72 -0
- core/skills/php/scripts/scan_php_smells.py +99 -0
- core/skills/php/versions.json +9 -0
- core/skills/pr-mode-driver/SKILL.md +65 -0
- core/skills/realtime-websockets/SKILL.md +152 -0
- core/skills/redis/SKILL.md +105 -0
- core/skills/redis/assets/redis-checklist.md +27 -0
- core/skills/redis/references/operations.md +66 -0
- core/skills/redis/references/patterns.md +62 -0
- core/skills/redis/scripts/analyze_info.py +101 -0
- core/skills/redis/versions.json +9 -0
- core/skills/search/SKILL.md +91 -0
- core/skills/search/references/grep.md +76 -0
- core/skills/search/scripts/verify-count.sh +73 -0
- core/skills/search-infra/SKILL.md +109 -0
- core/skills/security-mobile/SKILL.md +394 -0
- core/skills/security-mobile/assets/mobile-security-checklist.md +117 -0
- core/skills/security-mobile/references/masvs-l1-checklist.md +127 -0
- core/skills/security-web/SKILL.md +217 -0
- core/skills/security-web/assets/security-web-checklist.md +167 -0
- core/skills/security-web/references/owasp-top-10.md +551 -0
- core/skills/security-web/references/supply-chain.md +179 -0
- core/skills/security-web/scripts/csp-check.sh +153 -0
- core/skills/shell-scripting/SKILL.md +128 -0
- core/skills/shell-scripting/assets/script-checklist.md +33 -0
- core/skills/shell-scripting/references/argument-parsing.md +84 -0
- core/skills/shell-scripting/references/bash-robustness.md +78 -0
- core/skills/shell-scripting/scripts/lint_script.sh +53 -0
- core/skills/shell-scripting/scripts/new_script.py +131 -0
- core/skills/shell-scripting/versions.json +23 -0
- core/skills/sql-authoring/SKILL.md +104 -0
- core/skills/sql-authoring/assets/query-review-checklist.md +26 -0
- core/skills/sql-authoring/references/query-patterns.md +89 -0
- core/skills/sql-authoring/references/reading-explain.md +52 -0
- core/skills/sql-authoring/scripts/analyze_plan.py +100 -0
- core/skills/sql-authoring/versions.json +17 -0
- core/skills/state-management/SKILL.md +428 -0
- core/skills/state-management/references/tanstack-query-recipes.md +301 -0
- core/skills/state-management/references/zustand-recipes.md +364 -0
- core/skills/supabase/SKILL.md +108 -0
- core/skills/supabase/assets/supabase-checklist.md +26 -0
- core/skills/supabase/references/realtime-and-storage.md +55 -0
- core/skills/supabase/references/rls-and-auth.md +65 -0
- core/skills/supabase/scripts/check_rls.py +88 -0
- core/skills/supabase/versions.json +9 -0
- core/skills/task-driver/SKILL.md +272 -0
- core/skills/task-driver/scripts/task-lint.sh +163 -0
- core/skills/technical-writing/SKILL.md +85 -0
- core/skills/technical-writing/assets/doc-checklist.md +29 -0
- core/skills/technical-writing/references/doc-anatomy.md +53 -0
- core/skills/technical-writing/references/writing-craft.md +59 -0
- core/skills/technical-writing/scripts/new_doc.py +81 -0
- core/skills/terraform-k8s/SKILL.md +133 -0
- core/skills/testing-strategy/SKILL.md +266 -0
- core/skills/testing-strategy/assets/test-review-checklist.md +25 -0
- core/skills/testing-strategy/references/test-types.md +52 -0
- core/skills/testing-strategy/scripts/coverage_gate.py +79 -0
- core/skills/thinking_os/SKILL.md +288 -0
- core/skills/thinking_os/scripts/classify.sh +122 -0
- core/skills/typescript/SKILL.md +110 -0
- core/skills/typescript/assets/typescript-checklist.md +24 -0
- core/skills/typescript/references/strictness.md +53 -0
- core/skills/typescript/references/type-system.md +86 -0
- core/skills/typescript/scripts/check_tsconfig.py +92 -0
- core/skills/typescript/versions.json +9 -0
- core/subsystems.yaml +202 -0
- core/thinking_os/__init__.py +1 -0
- core/thinking_os/_agent_markers.py +32 -0
- core/thinking_os/agents/README.md +71 -0
- core/thinking_os/agents/analyst.md +139 -0
- core/thinking_os/agents/architect.md +127 -0
- core/thinking_os/agents/debugger.md +111 -0
- core/thinking_os/agents/deployer.md +112 -0
- core/thinking_os/agents/distiller.md +28 -0
- core/thinking_os/agents/documenter.md +101 -0
- core/thinking_os/agents/implementer.md +135 -0
- core/thinking_os/agents/internal/session_observer.md +39 -0
- core/thinking_os/agents/observer.md +100 -0
- core/thinking_os/agents/onboarder.md +81 -0
- core/thinking_os/agents/refactorer.md +123 -0
- core/thinking_os/agents/repairer.md +47 -0
- core/thinking_os/agents/researcher.md +129 -0
- core/thinking_os/agents/reviewer.md +147 -0
- core/thinking_os/agents/security_auditor.md +133 -0
- core/thinking_os/background.py +405 -0
- core/thinking_os/bootstrap_outcomes.py +200 -0
- core/thinking_os/budget.py +302 -0
- core/thinking_os/capture.py +495 -0
- core/thinking_os/cognition.py +516 -0
- core/thinking_os/cognition_schemas.py +517 -0
- core/thinking_os/compress.py +192 -0
- core/thinking_os/concepts.py +233 -0
- core/thinking_os/dashboard.py +159 -0
- core/thinking_os/database.py +2883 -0
- core/thinking_os/decay.py +393 -0
- core/thinking_os/digest.py +295 -0
- core/thinking_os/dispatcher.py +192 -0
- core/thinking_os/dispatcher_helpers.py +48 -0
- core/thinking_os/dispatchers/__init__.py +3 -0
- core/thinking_os/dispatchers/default.py +47 -0
- core/thinking_os/distill.py +192 -0
- core/thinking_os/doc_indexer.py +905 -0
- core/thinking_os/embeddings.py +943 -0
- core/thinking_os/formula_composer.py +556 -0
- core/thinking_os/gate_marker.py +75 -0
- core/thinking_os/graph.py +296 -0
- core/thinking_os/graph_indexer.py +360 -0
- core/thinking_os/health_check.py +517 -0
- core/thinking_os/impact.py +119 -0
- core/thinking_os/memory_gc.py +356 -0
- core/thinking_os/migrator_embeddings.py +318 -0
- core/thinking_os/precision.py +194 -0
- core/thinking_os/presets/registry.yaml +127 -0
- core/thinking_os/record_outcome.py +399 -0
- core/thinking_os/repair.py +105 -0
- core/thinking_os/retrieval_quality.py +239 -0
- core/thinking_os/roles/analyst.yaml +83 -0
- core/thinking_os/roles/architect.yaml +88 -0
- core/thinking_os/roles/debugger.yaml +71 -0
- core/thinking_os/roles/deployer.yaml +71 -0
- core/thinking_os/roles/documenter.yaml +72 -0
- core/thinking_os/roles/implementer.yaml +83 -0
- core/thinking_os/roles/observer.yaml +70 -0
- core/thinking_os/roles/refactorer.yaml +71 -0
- core/thinking_os/roles/researcher.yaml +72 -0
- core/thinking_os/roles/reviewer.yaml +79 -0
- core/thinking_os/roles/security_auditor.yaml +83 -0
- core/thinking_os/roles_state.py +168 -0
- core/thinking_os/sanitizer.py +320 -0
- core/thinking_os/server.py +3160 -0
- core/thinking_os/session_enrich.py +272 -0
- core/thinking_os/session_observe_worker.py +111 -0
- core/thinking_os/session_startup.py +74 -0
- core/thinking_os/session_summary.py +245 -0
- core/thinking_os/situations/registry.yaml +99 -0
- core/thinking_os/task_analyzer.py +462 -0
- core/thinking_os/task_parser.py +342 -0
- core/thinking_os/task_sync.py +73 -0
- core/thinking_os/tools/__init__.py +6 -0
- core/thinking_os/tools/_shared.py +947 -0
- core/thinking_os/tools/cognition.py +1867 -0
- core/thinking_os/tools/docs.py +770 -0
- core/thinking_os/tools/learning.py +2078 -0
- core/thinking_os/tools/logs.py +79 -0
- core/thinking_os/tools/memory.py +840 -0
- core/thinking_os/tools/metrics.py +200 -0
- core/thinking_os/tools/retrieve.py +415 -0
- core/thinking_os/tools/routing.py +658 -0
- core/thinking_os/tools/tasks.py +449 -0
- core/thinking_os/tools/trajectory.py +181 -0
- core/thinking_os/tracing.py +235 -0
- core/web/__init__.py +5 -0
- core/web/_cache.py +118 -0
- core/web/_deps.py +56 -0
- core/web/_envelope.py +85 -0
- core/web/_project_context.py +140 -0
- core/web/chat_providers.py +108 -0
- core/web/init_jobs.py +216 -0
- core/web/routes/__init__.py +25 -0
- core/web/routes/_bounded_read.py +76 -0
- core/web/routes/board.py +1089 -0
- core/web/routes/cognition.py +1838 -0
- core/web/routes/config.py +635 -0
- core/web/routes/graph.py +513 -0
- core/web/routes/health.py +180 -0
- core/web/routes/hooks.py +288 -0
- core/web/routes/hub.py +1219 -0
- core/web/routes/logs.py +374 -0
- core/web/routes/metrics.py +43 -0
- core/web/routes/observability.py +400 -0
- core/web/routes/patterns.py +227 -0
- core/web/routes/presence.py +609 -0
- core/web/routes/roles.py +446 -0
- core/web/routes/scheduled.py +261 -0
- core/web/routes/search.py +238 -0
- core/web/routes/sessions.py +220 -0
- core/web/routes/settings.py +363 -0
- core/web/routes/stream.py +547 -0
- core/web/security.py +157 -0
- core/web/server.py +283 -0
- graph_os/__init__.py +29 -0
- graph_os/backend.py +233 -0
- graph_os/backends/__init__.py +13 -0
- graph_os/backends/sqlite_backend.py +1053 -0
- graph_os/communities.py +410 -0
- graph_os/enterprise.py +218 -0
- graph_os/entry_points.py +226 -0
- graph_os/extractors/__init__.py +25 -0
- graph_os/extractors/code_generic.py +914 -0
- graph_os/extractors/code_go.py +1422 -0
- graph_os/extractors/code_json.py +340 -0
- graph_os/extractors/code_php.py +979 -0
- graph_os/extractors/code_python.py +1454 -0
- graph_os/extractors/code_shell.py +538 -0
- graph_os/extractors/code_toml.py +302 -0
- graph_os/extractors/code_ts.py +1665 -0
- graph_os/extractors/code_yaml.py +394 -0
- graph_os/extractors/contracts.py +1592 -0
- graph_os/extractors/md_links.py +890 -0
- graph_os/extractors/task_deps.py +345 -0
- graph_os/groups/__init__.py +22 -0
- graph_os/groups/cross_repo.py +156 -0
- graph_os/groups/manifest.py +141 -0
- graph_os/ingest/__init__.py +19 -0
- graph_os/ingest/base.py +306 -0
- graph_os/ingest/github.py +112 -0
- graph_os/ingest/zip.py +95 -0
- graph_os/toolchain.py +393 -0
- graph_os/tools/__init__.py +9 -0
- graph_os/tools/graph.py +5573 -0
- graph_os/tools/reindex_dispatch.py +730 -0
- graph_os/tree_sitter_overlay.py +235 -0
- graph_os/types.py +252 -0
- graph_os/vec_index.py +277 -0
- graph_os/viewer/__init__.py +12 -0
- graph_os/viewer/exporter.py +93 -0
- graph_os/viewer/template.py +189 -0
- scheduled/__init__.py +0 -0
- scheduled/_activity.py +126 -0
- scheduled/_state.py +113 -0
- scheduled/config.py +86 -0
- scheduled/dep_reconcile.py +135 -0
- scheduled/error_sweep.py +137 -0
- scheduled/nightly.py +930 -0
- scheduled/responsive_extract.py +65 -0
- scripts/__init__.py +4 -0
- scripts/_commit_msg_body.sh +31 -0
- scripts/_post_commit_body.sh +49 -0
- scripts/_pre_commit_body.sh +121 -0
- scripts/_prepare_commit_msg_body.sh +53 -0
- scripts/audit_mcp_tools.py +693 -0
- scripts/bench_sdk_dispatcher.py +177 -0
- scripts/capture_golden.py +169 -0
- scripts/check_graph_phantoms.py +75 -0
- scripts/dev/audit_doc_links.py +359 -0
- scripts/dev/audit_scaffold_module_tags.py +107 -0
- scripts/dev/backfill_doc_headers.py +328 -0
- scripts/dev/backfill_nav_lines.py +119 -0
- scripts/dev/fix_nav_placement.py +106 -0
- scripts/dev/inspect_sdk_options.py +45 -0
- scripts/dev/migrate_check_ids.py +170 -0
- scripts/dev/strip_purpose_blocks.py +154 -0
- scripts/dump_openapi.py +66 -0
- scripts/e2e_dispatch_tool.py +195 -0
- scripts/generate_manifest.py +166 -0
- scripts/golden_sections.py +20 -0
- scripts/graph_demo.py +161 -0
- scripts/install-git-hooks.sh +47 -0
- scripts/migrate_embeddings_minilm_to_bge_m3.py +84 -0
- scripts/operational_eval.py +445 -0
- scripts/probe_agent_session_resolver.py +59 -0
- scripts/prune_deleted_path.py +127 -0
- scripts/refactor_agent_dual_mode.py +171 -0
- scripts/refresh_skill_versions.py +302 -0
- scripts/regen_doc_index.py +209 -0
- scripts/regen_doctor_schema.py +62 -0
- scripts/regen_rules.py +94 -0
- scripts/rename_formulas_to_semantic.py +241 -0
- scripts/smoke_db_connections.py +183 -0
- scripts/smoke_doc_header.py +72 -0
- scripts/smoke_graph_e2e.py +374 -0
- scripts/smoke_sdk_dispatch.py +84 -0
- scripts/smoke_uid_resolver.py +164 -0
- scripts/verify_dispatchers.py +244 -0
- scripts/verify_phase_c_e2e.py +436 -0
- templates/__init__.py +6 -0
- templates/_base/Makefile.base +353 -0
- templates/_base/base.yaml +59 -0
- templates/_base/coding-os.yaml.template +39 -0
- templates/_base/dimension-registry.template.md +68 -0
- templates/_base/domain-config.template.json +46 -0
- templates/_base/fragments/anatomy-map.md.tmpl +11 -0
- templates/_base/fragments/context-discipline.md.tmpl +3 -0
- templates/_base/fragments/core-loop.md.tmpl +52 -0
- templates/_base/fragments/engineering-routing.md.tmpl +3 -0
- templates/_base/fragments/header.md.tmpl +6 -0
- templates/_base/fragments/identity.md.tmpl +3 -0
- templates/_base/fragments/principles.md.tmpl +3 -0
- templates/_base/fragments/retrieval-routing.md.tmpl +23 -0
- templates/_base/fragments/session-handoff.md.tmpl +3 -0
- templates/_base/fragments/skills.md.tmpl +3 -0
- templates/_base/fragments/ssot-map.md.tmpl +3 -0
- templates/_base/fragments/stop-conditions.md.tmpl +3 -0
- templates/_base/fragments/subagent-dispatch.md.tmpl +3 -0
- templates/_base/fragments/task-authoring.md.tmpl +69 -0
- templates/_base/fragments/task-logging.md.tmpl +8 -0
- templates/_base/fragments/tool-routing.md.tmpl +9 -0
- templates/_base/fragments/verification-matrix.md.tmpl +12 -0
- templates/_base/lang/dart/analysis_options.yaml +7 -0
- templates/_base/lang/php/phpcs.xml.dist +10 -0
- templates/_base/lang/python/pyproject.toml +19 -0
- templates/_base/lang/rust/clippy.toml +5 -0
- templates/_base/lang/rust/rustfmt.toml +3 -0
- templates/_base/lang/typescript/eslint.config.js +26 -0
- templates/_base/lang/typescript/tsconfig.json +15 -0
- templates/_base/lang/typescript/vitest.config.ts +10 -0
- templates/_base/scaffold/changes.log +1 -0
- templates/_base/scaffold/docs/00-index.md +55 -0
- templates/_base/scaffold/docs/_meta/feature-dependency-tree.md +30 -0
- templates/_base/scaffold/docs/_meta/foundation-map.md +56 -0
- templates/_base/scaffold/docs/_meta/questions.md +8 -0
- templates/_base/scaffold/docs/_meta/roadmap.md +33 -0
- templates/_base/scaffold/docs/api-contracts/00-index.md +58 -0
- templates/_base/scaffold/docs/api-contracts/error-format.md +58 -0
- templates/_base/scaffold/docs/architecture/00-index.md +42 -0
- templates/_base/scaffold/docs/architecture/adr/00-index.md +39 -0
- templates/_base/scaffold/docs/engineering/00-index.md +9 -0
- templates/_base/scaffold/docs/governance/00-index.md +55 -0
- templates/_base/scaffold/docs/governance/_templates/doc-cheat-sheet.md +202 -0
- templates/_base/scaffold/docs/governance/_templates/playbook-template.md +81 -0
- templates/_base/scaffold/docs/governance/_templates/post-mortem-template.md +85 -0
- templates/_base/scaffold/docs/governance/_templates/runbook-template.md +88 -0
- templates/_base/scaffold/docs/governance/_templates/security-review-template.md +111 -0
- templates/_base/scaffold/docs/governance/_templates/task-detail.md +61 -0
- templates/_base/scaffold/docs/governance/agent-workflow.md +101 -0
- templates/_base/scaffold/docs/governance/anatomy-contract.md +150 -0
- templates/_base/scaffold/docs/governance/critical-rules.md +224 -0
- templates/_base/scaffold/docs/governance/decision-records.md +58 -0
- templates/_base/scaffold/docs/governance/docs-first-protocol.md +157 -0
- templates/_base/scaffold/docs/governance/docs-system.md +151 -0
- templates/_base/scaffold/docs/governance/gdpr-compliance.md +66 -0
- templates/_base/scaffold/docs/governance/mcp-tool-inventory.md +112 -0
- templates/_base/scaffold/docs/governance/risk-register.md +26 -0
- templates/_base/scaffold/docs/governance/scaffold-boundary-contract.md +161 -0
- templates/_base/scaffold/docs/governance/task-lifecycle.md +125 -0
- templates/_base/scaffold/docs/governance/wrapper-derivation.md +50 -0
- templates/_base/scaffold/docs/insights/00-index.md +17 -0
- templates/_base/scaffold/docs/ops/00-index.md +59 -0
- templates/_base/scaffold/docs/ops/runbooks/00-index.md +9 -0
- templates/_base/scaffold/docs/playbooks/00-index.md +12 -0
- templates/_base/scaffold/docs/playbooks/research-validation.md +29 -0
- templates/_base/scaffold/docs/playbooks/security-review.md +41 -0
- templates/_base/scaffold/docs/prd/00-index.md +43 -0
- templates/_base/scaffold/docs/prd/01-snapshot-vision.md +56 -0
- templates/_base/scaffold/docs/workflow/workflow-guide.md +138 -0
- templates/_base/scaffold/src/shared/README.md +23 -0
- templates/_base/skill-enforcement.template.md +14 -0
- templates/_base/task-detail.template.md +61 -0
- templates/_presets/ai-saas.yaml +9 -0
- templates/_presets/django-next.yaml +8 -0
- templates/_presets/dotnet-react.yaml +8 -0
- templates/_presets/flutter-baas.yaml +8 -0
- templates/_presets/go-react.yaml +8 -0
- templates/_presets/hexagonal-product.yaml +16 -0
- templates/_presets/jamstack.yaml +8 -0
- templates/_presets/laravel-vue.yaml +8 -0
- templates/_presets/mean.yaml +8 -0
- templates/_presets/mern.yaml +9 -0
- templates/_presets/nest-angular.yaml +8 -0
- templates/_presets/nextjs-fastapi.yaml +10 -0
- templates/_presets/nuxt-fullstack.yaml +9 -0
- templates/_presets/pern.yaml +9 -0
- templates/_presets/rails-react.yaml +8 -0
- templates/_presets/rn-api.yaml +8 -0
- templates/_presets/rust-svelte.yaml +8 -0
- templates/_presets/spring-react.yaml +8 -0
- templates/_presets/t3-style.yaml +9 -0
- templates/_presets/tall.yaml +8 -0
- templates/_presets/wordpress-cms.yaml +8 -0
- templates/angular/rules/frontend.md +19 -0
- templates/angular/scaffold/docs/engineering/accessibility.md +46 -0
- templates/angular/scaffold/docs/engineering/angular-rules.md +35 -0
- templates/angular/scaffold/docs/playbooks/angular-app.md +42 -0
- templates/angular/scaffold/src/frontend/angular.json +52 -0
- templates/angular/scaffold/src/frontend/package.json +28 -0
- templates/angular/scaffold/src/frontend/src/app/app.component.ts +19 -0
- templates/angular/scaffold/src/frontend/src/app/app.config.ts +22 -0
- templates/angular/scaffold/src/frontend/src/app/app.routes.ts +8 -0
- templates/angular/scaffold/src/frontend/src/app/core/global-error-handler.ts +12 -0
- templates/angular/scaffold/src/frontend/src/app/health/health.component.ts +14 -0
- templates/angular/scaffold/src/frontend/src/app/health/health.service.spec.ts +16 -0
- templates/angular/scaffold/src/frontend/src/app/health/health.service.ts +10 -0
- templates/angular/scaffold/src/frontend/src/index.html +11 -0
- templates/angular/scaffold/src/frontend/src/main.ts +9 -0
- templates/angular/scaffold/src/frontend/src/styles.css +14 -0
- templates/angular/scaffold/src/frontend/tsconfig.app.json +8 -0
- templates/angular/scaffold/src/frontend/tsconfig.json +27 -0
- templates/angular/scaffold/src/frontend/tsconfig.spec.json +8 -0
- templates/angular/scaffold-boundary.yaml +27 -0
- templates/angular/skills/angular/SKILL.md +79 -0
- templates/angular/skills/angular/references/anatomy.md +69 -0
- templates/angular/stack.yaml +75 -0
- templates/aspnet-core/rules/backend.md +20 -0
- templates/aspnet-core/scaffold/docs/engineering/aspnet-core-rules.md +36 -0
- templates/aspnet-core/scaffold/docs/playbooks/aspnet-core-service.md +40 -0
- templates/aspnet-core/scaffold/src/backend/Backend.csproj +11 -0
- templates/aspnet-core/scaffold/src/backend/Backend.sln +27 -0
- templates/aspnet-core/scaffold/src/backend/Common/ExceptionHandlingMiddleware.cs +35 -0
- templates/aspnet-core/scaffold/src/backend/Features/Health/HealthEndpoints.cs +10 -0
- templates/aspnet-core/scaffold/src/backend/Features/Health/HealthService.cs +9 -0
- templates/aspnet-core/scaffold/src/backend/Program.cs +22 -0
- templates/aspnet-core/scaffold/src/backend/tests/Backend.Tests/Backend.Tests.csproj +22 -0
- templates/aspnet-core/scaffold/src/backend/tests/Backend.Tests/HealthServiceTests.cs +15 -0
- templates/aspnet-core/scaffold-boundary.yaml +24 -0
- templates/aspnet-core/skills/aspnet-core/SKILL.md +80 -0
- templates/aspnet-core/skills/aspnet-core/references/anatomy.md +65 -0
- templates/aspnet-core/stack.yaml +68 -0
- templates/astro/rules/frontend.md +20 -0
- templates/astro/scaffold/docs/engineering/astro-rules.md +40 -0
- templates/astro/scaffold/docs/playbooks/astro-app.md +57 -0
- templates/astro/scaffold/docs/playbooks/content-seo.md +37 -0
- templates/astro/scaffold/src/frontend/astro.config.mjs +10 -0
- templates/astro/scaffold/src/frontend/package.json +23 -0
- templates/astro/scaffold/src/frontend/src/components/Greeting.astro +13 -0
- templates/astro/scaffold/src/frontend/src/content/posts/hello.md +10 -0
- templates/astro/scaffold/src/frontend/src/content.config.ts +19 -0
- templates/astro/scaffold/src/frontend/src/lib/problem.test.ts +39 -0
- templates/astro/scaffold/src/frontend/src/lib/problem.ts +30 -0
- templates/astro/scaffold/src/frontend/src/pages/api/health.ts +13 -0
- templates/astro/scaffold/src/frontend/src/pages/index.astro +21 -0
- templates/astro/scaffold/src/frontend/tsconfig.json +9 -0
- templates/astro/scaffold/src/frontend/vitest.config.ts +10 -0
- templates/astro/scaffold-boundary.yaml +28 -0
- templates/astro/skills/astro/SKILL.md +71 -0
- templates/astro/skills/astro/references/anatomy.md +66 -0
- templates/astro/stack.yaml +75 -0
- templates/csharp-plain/scaffold/src/backend/Backend.csproj +12 -0
- templates/csharp-plain/scaffold/src/backend/Program.cs +1 -0
- templates/csharp-plain/scaffold-boundary.yaml +23 -0
- templates/csharp-plain/stack.yaml +50 -0
- templates/django/rules/backend.md +18 -0
- templates/django/scaffold/docs/engineering/anti-ambiguity.md +74 -0
- templates/django/scaffold/docs/engineering/backend-rules.md +133 -0
- templates/django/scaffold/docs/engineering/glossary.md +51 -0
- templates/django/scaffold/docs/engineering/logging-standards.md +107 -0
- templates/django/scaffold/docs/engineering/naming-conventions.md +68 -0
- templates/django/scaffold/docs/engineering/secrets-rotation-runbook.md +142 -0
- templates/django/scaffold/docs/playbooks/backend-api.md +119 -0
- templates/django/scaffold/src/backend/config/__init__.py +0 -0
- templates/django/scaffold/src/backend/config/settings.py +31 -0
- templates/django/scaffold/src/backend/config/urls.py +11 -0
- templates/django/scaffold/src/backend/config/wsgi.py +6 -0
- templates/django/scaffold/src/backend/manage.py +14 -0
- templates/django/scaffold/src/backend/pyproject.toml +37 -0
- templates/django/scaffold/src/backend/tests/test_health.py +4 -0
- templates/django/scaffold-boundary.yaml +25 -0
- templates/django/skills/python-django/SKILL.md +450 -0
- templates/django/skills/python-django/references/anatomy.md +117 -0
- templates/django/skills/python-django/scripts/new_endpoint.py +89 -0
- templates/django/stack.yaml +73 -0
- templates/fastapi/rules/backend.md +18 -0
- templates/fastapi/scaffold/docs/engineering/fastapi-rules.md +37 -0
- templates/fastapi/scaffold/docs/playbooks/fastapi-service.md +30 -0
- templates/fastapi/scaffold/src/backend/app/__init__.py +0 -0
- templates/fastapi/scaffold/src/backend/app/main.py +8 -0
- templates/fastapi/scaffold/src/backend/pyproject.toml +39 -0
- templates/fastapi/scaffold/src/backend/tests/test_health.py +11 -0
- templates/fastapi/scaffold-boundary.yaml +25 -0
- templates/fastapi/skills/python-fastapi/SKILL.md +75 -0
- templates/fastapi/skills/python-fastapi/references/anatomy.md +117 -0
- templates/fastapi/skills/python-fastapi/scripts/new_endpoint.py +101 -0
- templates/fastapi/stack.yaml +57 -0
- templates/flutter/rules/mobile.md +26 -0
- templates/flutter/scaffold/docs/engineering/flutter-rules.md +35 -0
- templates/flutter/scaffold/docs/playbooks/flutter-app.md +45 -0
- templates/flutter/scaffold/src/mobile/lib/core/error_mapper.dart +17 -0
- templates/flutter/scaffold/src/mobile/lib/core/router.dart +13 -0
- templates/flutter/scaffold/src/mobile/lib/main.dart +22 -0
- templates/flutter/scaffold/src/mobile/lib/screens/health_screen.dart +32 -0
- templates/flutter/scaffold/src/mobile/lib/services/health_service.dart +11 -0
- templates/flutter/scaffold/src/mobile/lib/state/health_provider.dart +13 -0
- templates/flutter/scaffold/src/mobile/pubspec.yaml +22 -0
- templates/flutter/scaffold/src/mobile/test/health_provider_test.dart +90 -0
- templates/flutter/scaffold-boundary.yaml +28 -0
- templates/flutter/skills/flutter/SKILL.md +76 -0
- templates/flutter/skills/flutter/references/anatomy.md +64 -0
- templates/flutter/stack.yaml +70 -0
- templates/go/rules/backend.md +19 -0
- templates/go/scaffold/docs/engineering/go-rules.md +45 -0
- templates/go/scaffold/docs/playbooks/go-service.md +30 -0
- templates/go/scaffold/src/backend/cmd/api/main.go +22 -0
- templates/go/scaffold/src/backend/cmd/api/main_test.go +20 -0
- templates/go/scaffold/src/backend/go.mod +3 -0
- templates/go/scaffold-boundary.yaml +25 -0
- templates/go/skills/go-patterns/SKILL.md +68 -0
- templates/go/skills/go-patterns/assets/go-checklist.md +29 -0
- templates/go/skills/go-patterns/references/anatomy.md +115 -0
- templates/go/skills/go-patterns/references/go-2026-idioms.md +92 -0
- templates/go/skills/go-patterns/scripts/new_endpoint.py +117 -0
- templates/go/skills/go-patterns/versions.json +16 -0
- templates/go/stack.yaml +54 -0
- templates/go-fiber/rules/backend.md +20 -0
- templates/go-fiber/scaffold/docs/engineering/fiber-rules.md +97 -0
- templates/go-fiber/scaffold/docs/playbooks/fiber-service.md +149 -0
- templates/go-fiber/scaffold/src/backend/cmd/api/main.go +21 -0
- templates/go-fiber/scaffold/src/backend/cmd/api/main_test.go +17 -0
- templates/go-fiber/scaffold/src/backend/go.mod +23 -0
- templates/go-fiber/scaffold/src/backend/go.sum +49 -0
- templates/go-fiber/scaffold-boundary.yaml +26 -0
- templates/go-fiber/skills/go-fiber/SKILL.md +203 -0
- templates/go-fiber/skills/go-fiber/assets/fiber-checklist.md +26 -0
- templates/go-fiber/skills/go-fiber/references/anatomy.md +116 -0
- templates/go-fiber/skills/go-fiber/references/fiber-v3-patterns.md +89 -0
- templates/go-fiber/skills/go-fiber/scripts/new_endpoint.py +107 -0
- templates/go-fiber/skills/go-fiber/versions.json +16 -0
- templates/go-fiber/stack.yaml +59 -0
- templates/go-plain/scaffold/src/backend/go.mod +3 -0
- templates/go-plain/scaffold/src/backend/main.go +7 -0
- templates/go-plain/scaffold-boundary.yaml +22 -0
- templates/go-plain/stack.yaml +51 -0
- templates/java-plain/scaffold/src/backend/mvnw +302 -0
- templates/java-plain/scaffold/src/backend/pom.xml +41 -0
- templates/java-plain/scaffold/src/backend/src/main/java/com/example/app/Main.java +10 -0
- templates/java-plain/scaffold-boundary.yaml +23 -0
- templates/java-plain/stack.yaml +51 -0
- templates/laravel/rules/backend.md +20 -0
- templates/laravel/scaffold/docs/engineering/laravel-rules.md +28 -0
- templates/laravel/scaffold/docs/playbooks/laravel-service.md +28 -0
- templates/laravel/scaffold/src/backend/app/Exceptions/Handler.php +27 -0
- templates/laravel/scaffold/src/backend/app/Http/Controllers/HealthController.php +15 -0
- templates/laravel/scaffold/src/backend/app/Support/HealthStatus.php +14 -0
- templates/laravel/scaffold/src/backend/composer.json +24 -0
- templates/laravel/scaffold/src/backend/phpunit.xml +10 -0
- templates/laravel/scaffold/src/backend/public/index.php +8 -0
- templates/laravel/scaffold/src/backend/routes/api.php +7 -0
- templates/laravel/scaffold/src/backend/tests/Unit/HealthStatusTest.php +16 -0
- templates/laravel/scaffold-boundary.yaml +23 -0
- templates/laravel/skills/laravel/SKILL.md +56 -0
- templates/laravel/skills/laravel/references/anatomy.md +65 -0
- templates/laravel/stack.yaml +66 -0
- templates/meta/rules/graph-first.md +27 -0
- templates/meta/rules/hook-author.md +19 -0
- templates/meta/rules/mcp-tool-author.md +18 -0
- templates/meta/rules/meta-engineering.md +17 -0
- templates/meta/scaffold-boundary.yaml +55 -0
- templates/meta/skills/claude-sdk-integration/SKILL.md +163 -0
- templates/meta/skills/claude-sdk-integration/assets/sdk-checklist.md +27 -0
- templates/meta/skills/claude-sdk-integration/scripts/check_model_ids.py +97 -0
- templates/meta/skills/graph-os-authoring/SKILL.md +278 -0
- templates/meta/skills/graph-os-authoring/assets/graph-os-checklist.md +25 -0
- templates/meta/skills/graph-os-authoring/scripts/new_extractor.py +76 -0
- templates/meta/skills/hook-authoring/SKILL.md +292 -0
- templates/meta/skills/hook-authoring/assets/hook-checklist.md +30 -0
- templates/meta/skills/hook-authoring/scripts/new_hook.sh +75 -0
- templates/meta/skills/mcp-tool-authoring/SKILL.md +301 -0
- templates/meta/skills/mcp-tool-authoring/assets/mcp-tool-checklist.md +29 -0
- templates/meta/skills/mcp-tool-authoring/scripts/new_tool.py +74 -0
- templates/meta/skills/meta-engineering/SKILL.md +151 -0
- templates/meta/skills/meta-engineering/assets/meta-edit-checklist.md +28 -0
- templates/meta/skills/meta-engineering/scripts/which_layer.py +61 -0
- templates/meta/skills/python-meta-server/SKILL.md +162 -0
- templates/meta/skills/python-meta-server/assets/meta-server-checklist.md +28 -0
- templates/meta/skills/python-meta-server/scripts/check_envelope.py +91 -0
- templates/meta/skills/react-vite-hub/SKILL.md +140 -0
- templates/meta/skills/react-vite-hub/assets/hub-ui-checklist.md +23 -0
- templates/meta/skills/react-vite-hub/scripts/check_vite_env.py +73 -0
- templates/meta/stack.yaml +119 -0
- templates/nestjs/rules/backend.md +20 -0
- templates/nestjs/scaffold/docs/engineering/nestjs-rules.md +33 -0
- templates/nestjs/scaffold/docs/playbooks/nestjs-service.md +39 -0
- templates/nestjs/scaffold/src/backend/nest-cli.json +5 -0
- templates/nestjs/scaffold/src/backend/package.json +28 -0
- templates/nestjs/scaffold/src/backend/src/app.module.ts +9 -0
- templates/nestjs/scaffold/src/backend/src/common/all-exceptions.filter.ts +59 -0
- templates/nestjs/scaffold/src/backend/src/health/health.controller.ts +14 -0
- templates/nestjs/scaffold/src/backend/src/health/health.module.ts +10 -0
- templates/nestjs/scaffold/src/backend/src/health/health.service.spec.ts +21 -0
- templates/nestjs/scaffold/src/backend/src/health/health.service.ts +9 -0
- templates/nestjs/scaffold/src/backend/src/main.ts +26 -0
- templates/nestjs/scaffold/src/backend/tsconfig.json +16 -0
- templates/nestjs/scaffold/src/backend/vitest.config.ts +9 -0
- templates/nestjs/scaffold-boundary.yaml +25 -0
- templates/nestjs/skills/nestjs/SKILL.md +67 -0
- templates/nestjs/skills/nestjs/references/anatomy.md +65 -0
- templates/nestjs/stack.yaml +68 -0
- templates/nextjs/rules/frontend.md +18 -0
- templates/nextjs/scaffold/docs/design/00-index.md +23 -0
- templates/nextjs/scaffold/docs/design/colors-tokens.md +141 -0
- templates/nextjs/scaffold/docs/design/components-patterns.md +159 -0
- templates/nextjs/scaffold/docs/design/motion-accessibility.md +137 -0
- templates/nextjs/scaffold/docs/design/typography-spacing.md +107 -0
- templates/nextjs/scaffold/docs/engineering/accessibility-web.md +56 -0
- templates/nextjs/scaffold/docs/engineering/copywriting-standard.md +102 -0
- templates/nextjs/scaffold/docs/engineering/formatting-rules.md +89 -0
- templates/nextjs/scaffold/docs/engineering/frontend-rendering-rules.md +80 -0
- templates/nextjs/scaffold/docs/engineering/frontend-rules.md +183 -0
- templates/nextjs/scaffold/docs/engineering/i18n-policy.md +99 -0
- templates/nextjs/scaffold/docs/pages-content-spec/00-index.md +78 -0
- templates/nextjs/scaffold/docs/playbooks/content-seo.md +55 -0
- templates/nextjs/scaffold/docs/playbooks/docs-governance.md +51 -0
- templates/nextjs/scaffold/docs/playbooks/frontend-ui.md +63 -0
- templates/nextjs/scaffold/src/frontend/app/layout.tsx +14 -0
- templates/nextjs/scaffold/src/frontend/app/page.tsx +3 -0
- templates/nextjs/scaffold/src/frontend/eslint.config.js +17 -0
- templates/nextjs/scaffold/src/frontend/lib/greeting.test.ts +9 -0
- templates/nextjs/scaffold/src/frontend/lib/greeting.ts +3 -0
- templates/nextjs/scaffold/src/frontend/package.json +28 -0
- templates/nextjs/scaffold/src/frontend/tsconfig.json +18 -0
- templates/nextjs/scaffold/src/frontend/vitest.config.ts +10 -0
- templates/nextjs/scaffold-boundary.yaml +30 -0
- templates/nextjs/skills/nextjs-react/SKILL.md +485 -0
- templates/nextjs/skills/nextjs-react/references/anatomy.md +116 -0
- templates/nextjs/skills/nextjs-react/scripts/new_component.py +72 -0
- templates/nextjs/stack.yaml +81 -0
- templates/node-express/rules/backend.md +20 -0
- templates/node-express/scaffold/docs/engineering/express-rules.md +30 -0
- templates/node-express/scaffold/docs/playbooks/express-service.md +35 -0
- templates/node-express/scaffold/src/backend/package.json +24 -0
- templates/node-express/scaffold/src/backend/src/index.ts +17 -0
- templates/node-express/scaffold/src/backend/src/middleware/error-handler.ts +12 -0
- templates/node-express/scaffold/src/backend/src/routes/health.test.ts +33 -0
- templates/node-express/scaffold/src/backend/src/routes/health.ts +7 -0
- templates/node-express/scaffold/src/backend/tsconfig.json +15 -0
- templates/node-express/scaffold/src/backend/types/express-bootstrap.d.ts +21 -0
- templates/node-express/scaffold-boundary.yaml +25 -0
- templates/node-express/skills/node-express/SKILL.md +70 -0
- templates/node-express/skills/node-express/references/anatomy.md +63 -0
- templates/node-express/stack.yaml +63 -0
- templates/python/scaffold/docs/engineering/python-rules.md +27 -0
- templates/python/scaffold/docs/playbooks/python-library.md +35 -0
- templates/python/stack.yaml +60 -0
- templates/rails/rules/backend.md +10 -0
- templates/rails/scaffold/docs/engineering/rails-rules.md +33 -0
- templates/rails/scaffold/docs/playbooks/rails-service.md +42 -0
- templates/rails/scaffold/src/backend/Gemfile +12 -0
- templates/rails/scaffold/src/backend/app/controllers/application_controller.rb +26 -0
- templates/rails/scaffold/src/backend/app/controllers/health_controller.rb +6 -0
- templates/rails/scaffold/src/backend/app/models/health.rb +6 -0
- templates/rails/scaffold/src/backend/config/application.rb +12 -0
- templates/rails/scaffold/src/backend/config/boot.rb +3 -0
- templates/rails/scaffold/src/backend/config/routes.rb +4 -0
- templates/rails/scaffold/src/backend/config.ru +5 -0
- templates/rails/scaffold/src/backend/spec/rails_helper.rb +18 -0
- templates/rails/scaffold/src/backend/spec/requests/health_spec.rb +24 -0
- templates/rails/scaffold-boundary.yaml +25 -0
- templates/rails/skills/rails/SKILL.md +62 -0
- templates/rails/skills/rails/references/anatomy.md +71 -0
- templates/rails/stack.yaml +72 -0
- templates/react-native/rules/mobile.md +26 -0
- templates/react-native/scaffold/docs/engineering/accessibility-mobile.md +95 -0
- templates/react-native/scaffold/docs/engineering/mobile-rules.md +56 -0
- templates/react-native/scaffold/docs/engineering/offline-first.md +61 -0
- templates/react-native/scaffold/docs/playbooks/mobile-app.md +49 -0
- templates/react-native/scaffold/src/mobile/App.tsx +9 -0
- templates/react-native/scaffold/src/mobile/eslint.config.js +17 -0
- templates/react-native/scaffold/src/mobile/package.json +23 -0
- templates/react-native/scaffold/src/mobile/src/greeting.test.ts +9 -0
- templates/react-native/scaffold/src/mobile/src/greeting.ts +3 -0
- templates/react-native/scaffold/src/mobile/tsconfig.json +17 -0
- templates/react-native/scaffold/src/mobile/vitest.config.ts +10 -0
- templates/react-native/scaffold-boundary.yaml +30 -0
- templates/react-native/skills/react-native-mobile/SKILL.md +119 -0
- templates/react-native/skills/react-native-mobile/assets/rn-mobile-checklist.md +28 -0
- templates/react-native/skills/react-native-mobile/references/anatomy.md +140 -0
- templates/react-native/skills/react-native-mobile/references/rn-2026-practices.md +54 -0
- templates/react-native/skills/react-native-mobile/scripts/new_screen.py +73 -0
- templates/react-native/skills/react-native-mobile/versions.json +16 -0
- templates/react-native/skills/react-native-patterns/SKILL.md +512 -0
- templates/react-native/skills/react-native-patterns/assets/rn-review-checklist.md +26 -0
- templates/react-native/skills/react-native-patterns/references/anatomy.md +62 -0
- templates/react-native/skills/react-native-patterns/references/list-performance.md +70 -0
- templates/react-native/skills/react-native-patterns/scripts/scan_rn_perf.py +77 -0
- templates/react-native/stack.yaml +70 -0
- templates/ruby-plain/scaffold/src/backend/Gemfile +8 -0
- templates/ruby-plain/scaffold/src/backend/main.rb +3 -0
- templates/ruby-plain/scaffold-boundary.yaml +23 -0
- templates/ruby-plain/stack.yaml +50 -0
- templates/rust-axum/rules/backend.md +20 -0
- templates/rust-axum/scaffold/docs/engineering/rust-axum-rules.md +35 -0
- templates/rust-axum/scaffold/docs/playbooks/rust-axum-service.md +43 -0
- templates/rust-axum/scaffold/src/backend/Cargo.toml +20 -0
- templates/rust-axum/scaffold/src/backend/src/app.rs +12 -0
- templates/rust-axum/scaffold/src/backend/src/error.rs +48 -0
- templates/rust-axum/scaffold/src/backend/src/main.rs +24 -0
- templates/rust-axum/scaffold/src/backend/src/routes/health.rs +37 -0
- templates/rust-axum/scaffold/src/backend/src/routes/mod.rs +2 -0
- templates/rust-axum/scaffold-boundary.yaml +25 -0
- templates/rust-axum/skills/rust/SKILL.md +73 -0
- templates/rust-axum/skills/rust/references/anatomy.md +63 -0
- templates/rust-axum/stack.yaml +65 -0
- templates/rust-plain/scaffold/src/backend/Cargo.toml +6 -0
- templates/rust-plain/scaffold/src/backend/src/main.rs +3 -0
- templates/rust-plain/scaffold-boundary.yaml +23 -0
- templates/rust-plain/stack.yaml +51 -0
- templates/spring-boot/rules/backend.md +20 -0
- templates/spring-boot/scaffold/docs/engineering/spring-boot-rules.md +35 -0
- templates/spring-boot/scaffold/docs/playbooks/spring-boot-service.md +45 -0
- templates/spring-boot/scaffold/src/backend/mvnw +302 -0
- templates/spring-boot/scaffold/src/backend/pom.xml +69 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/Application.java +16 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/common/GlobalExceptionHandler.java +31 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthController.java +22 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthService.java +12 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthStatus.java +4 -0
- templates/spring-boot/scaffold/src/backend/src/test/java/com/example/app/health/HealthServiceTest.java +15 -0
- templates/spring-boot/scaffold-boundary.yaml +26 -0
- templates/spring-boot/skills/spring-boot/SKILL.md +84 -0
- templates/spring-boot/skills/spring-boot/references/anatomy.md +63 -0
- templates/spring-boot/stack.yaml +65 -0
- templates/svelte-sveltekit/rules/frontend.md +20 -0
- templates/svelte-sveltekit/scaffold/docs/engineering/svelte-sveltekit-rules.md +37 -0
- templates/svelte-sveltekit/scaffold/docs/playbooks/svelte-sveltekit-app.md +36 -0
- templates/svelte-sveltekit/scaffold/src/frontend/package.json +22 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/app.html +12 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/hooks.server.ts +14 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/lib/components/Greeting.svelte +6 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/lib/stores/count.test.ts +26 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/lib/stores/count.ts +4 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+layout.svelte +24 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+page.svelte +9 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+page.ts +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/health/+server.ts +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/svelte.config.js +10 -0
- templates/svelte-sveltekit/scaffold/src/frontend/tsconfig.json +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/vite.config.ts +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/vitest.config.ts +11 -0
- templates/svelte-sveltekit/scaffold-boundary.yaml +29 -0
- templates/svelte-sveltekit/skills/svelte/SKILL.md +90 -0
- templates/svelte-sveltekit/skills/svelte/references/anatomy.md +62 -0
- templates/svelte-sveltekit/stack.yaml +70 -0
- templates/typescript-plain/scaffold/src/index.ts +3 -0
- templates/typescript-plain/scaffold/tsconfig.json +13 -0
- templates/typescript-plain/scaffold-boundary.yaml +22 -0
- templates/typescript-plain/stack.yaml +44 -0
- templates/vue-nuxt/rules/frontend.md +19 -0
- templates/vue-nuxt/scaffold/docs/engineering/nuxt-rules.md +30 -0
- templates/vue-nuxt/scaffold/docs/playbooks/nuxt-app.md +29 -0
- templates/vue-nuxt/scaffold/src/frontend/app.vue +3 -0
- templates/vue-nuxt/scaffold/src/frontend/nuxt.config.ts +11 -0
- templates/vue-nuxt/scaffold/src/frontend/package.json +20 -0
- templates/vue-nuxt/scaffold/src/frontend/pages/index.test.ts +19 -0
- templates/vue-nuxt/scaffold/src/frontend/pages/index.vue +11 -0
- templates/vue-nuxt/scaffold/src/frontend/vitest.config.ts +12 -0
- templates/vue-nuxt/scaffold-boundary.yaml +26 -0
- templates/vue-nuxt/skills/vue-nuxt/SKILL.md +57 -0
- templates/vue-nuxt/skills/vue-nuxt/references/anatomy.md +60 -0
- templates/vue-nuxt/stack.yaml +61 -0
- templates/wordpress/rules/backend.md +19 -0
- templates/wordpress/scaffold/docs/engineering/wordpress-rules.md +28 -0
- templates/wordpress/scaffold/docs/playbooks/wordpress-service.md +29 -0
- templates/wordpress/scaffold/src/backend/composer.json +17 -0
- templates/wordpress/scaffold/src/backend/phpcs.xml.dist +11 -0
- templates/wordpress/scaffold/src/backend/phpunit.xml +10 -0
- templates/wordpress/scaffold/src/backend/plugin/inc/health.php +8 -0
- templates/wordpress/scaffold/src/backend/plugin/plugin.php +28 -0
- templates/wordpress/scaffold/src/backend/tests/HealthStatusTest.php +15 -0
- templates/wordpress/scaffold/src/backend/theme/functions.php +18 -0
- templates/wordpress/scaffold/src/backend/theme/style.css +11 -0
- templates/wordpress/scaffold-boundary.yaml +23 -0
- templates/wordpress/skills/wordpress/SKILL.md +110 -0
- templates/wordpress/skills/wordpress/assets/wp-checklist.md +28 -0
- templates/wordpress/skills/wordpress/references/wp-development.md +75 -0
- templates/wordpress/skills/wordpress/references/wp-security.md +68 -0
- templates/wordpress/skills/wordpress/scripts/scan_wp_smells.py +91 -0
- templates/wordpress/skills/wordpress/versions.json +16 -0
- templates/wordpress/stack.yaml +60 -0
- thinking_os/__init__.py +1 -0
- thinking_os/_agent_markers.py +32 -0
- thinking_os/background.py +405 -0
- thinking_os/bootstrap_outcomes.py +200 -0
- thinking_os/budget.py +302 -0
- thinking_os/capture.py +495 -0
- thinking_os/cognition.py +516 -0
- thinking_os/cognition_schemas.py +517 -0
- thinking_os/compress.py +192 -0
- thinking_os/concepts.py +233 -0
- thinking_os/dashboard.py +159 -0
- thinking_os/database.py +2883 -0
- thinking_os/decay.py +393 -0
- thinking_os/digest.py +295 -0
- thinking_os/dispatcher.py +192 -0
- thinking_os/dispatcher_helpers.py +48 -0
- thinking_os/dispatchers/__init__.py +3 -0
- thinking_os/dispatchers/default.py +47 -0
- thinking_os/distill.py +192 -0
- thinking_os/doc_indexer.py +905 -0
- thinking_os/embeddings.py +943 -0
- thinking_os/formula_composer.py +556 -0
- thinking_os/gate_marker.py +75 -0
- thinking_os/graph.py +296 -0
- thinking_os/graph_indexer.py +360 -0
- thinking_os/health_check.py +517 -0
- thinking_os/impact.py +119 -0
- thinking_os/memory_gc.py +356 -0
- thinking_os/migrator_embeddings.py +318 -0
- thinking_os/precision.py +194 -0
- thinking_os/record_outcome.py +399 -0
- thinking_os/repair.py +105 -0
- thinking_os/retrieval_quality.py +239 -0
- thinking_os/roles_state.py +168 -0
- thinking_os/sanitizer.py +320 -0
- thinking_os/server.py +3160 -0
- thinking_os/session_enrich.py +272 -0
- thinking_os/session_observe_worker.py +111 -0
- thinking_os/session_startup.py +74 -0
- thinking_os/session_summary.py +245 -0
- thinking_os/task_analyzer.py +462 -0
- thinking_os/task_parser.py +342 -0
- thinking_os/task_sync.py +73 -0
- thinking_os/tools/__init__.py +6 -0
- thinking_os/tools/_shared.py +947 -0
- thinking_os/tools/cognition.py +1867 -0
- thinking_os/tools/docs.py +770 -0
- thinking_os/tools/learning.py +2078 -0
- thinking_os/tools/logs.py +79 -0
- thinking_os/tools/memory.py +840 -0
- thinking_os/tools/metrics.py +200 -0
- thinking_os/tools/retrieve.py +415 -0
- thinking_os/tools/routing.py +658 -0
- thinking_os/tools/tasks.py +449 -0
- thinking_os/tools/trajectory.py +181 -0
- thinking_os/tracing.py +235 -0
- web/__init__.py +5 -0
- web/_cache.py +118 -0
- web/_deps.py +56 -0
- web/_envelope.py +85 -0
- web/_project_context.py +140 -0
- web/chat_providers.py +108 -0
- web/init_jobs.py +216 -0
- web/routes/__init__.py +25 -0
- web/routes/_bounded_read.py +76 -0
- web/routes/board.py +1089 -0
- web/routes/cognition.py +1838 -0
- web/routes/config.py +635 -0
- web/routes/graph.py +513 -0
- web/routes/health.py +180 -0
- web/routes/hooks.py +288 -0
- web/routes/hub.py +1219 -0
- web/routes/logs.py +374 -0
- web/routes/metrics.py +43 -0
- web/routes/observability.py +400 -0
- web/routes/patterns.py +227 -0
- web/routes/presence.py +609 -0
- web/routes/roles.py +446 -0
- web/routes/scheduled.py +261 -0
- web/routes/search.py +238 -0
- web/routes/sessions.py +220 -0
- web/routes/settings.py +363 -0
- web/routes/stream.py +547 -0
- web/security.py +157 -0
- web/server.py +283 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: performance
|
|
3
|
+
tier: cross-cutting
|
|
4
|
+
domain: [performance]
|
|
5
|
+
description: Application performance for backend (Go+Fiber, Python+FastAPI), web frontends, and React Native mobile clients. Use when measuring or improving Web Vitals (LCP / INP / CLS), mobile FPS / TTI / memory, image/font/code-split optimization, profiling, or interpreting Lighthouse / Reanimated / Hermes / Flipper traces. Pairs with frontend-fundamentals + react-native-patterns + db-design.
|
|
6
|
+
last_reviewed: "2026-05-11"
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Performance — Web + Backend + Mobile
|
|
11
|
+
|
|
12
|
+
A practical playbook for measuring, profiling, and improving performance across the project's stack. Covers Web Vitals (Google's user-experience metrics), mobile perf budgets (FPS / TTI / memory), backend latency (P95 / P99 / saturation), with concrete tools per surface.
|
|
13
|
+
|
|
14
|
+
## When to Use This Skill
|
|
15
|
+
|
|
16
|
+
- Adding a perf budget to a new feature.
|
|
17
|
+
- Investigating a Lighthouse / Web Vitals regression.
|
|
18
|
+
- Mobile users report jank, slow app launch, battery drain.
|
|
19
|
+
- Backend P95 latency exceeds SLO.
|
|
20
|
+
- Bundle size jumped 30% after a release.
|
|
21
|
+
- Lists scroll poorly; animations stutter.
|
|
22
|
+
- Choosing between perf tools (when each pays off).
|
|
23
|
+
|
|
24
|
+
## The Three Performance Surfaces
|
|
25
|
+
|
|
26
|
+
| Surface | Primary metrics | Tools |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| **Backend** | P50 / P95 / P99 latency, throughput, error rate, saturation (CPU / mem / IO) | OpenTelemetry, Datadog APM, pprof (Go), py-spy (Python), pgbadger (Postgres) |
|
|
29
|
+
| **Web frontend** | LCP, INP, CLS (Core Web Vitals), TTI, TBT, bundle size | Lighthouse, Chrome DevTools Performance, WebPageTest, web-vitals JS lib |
|
|
30
|
+
| **Mobile** | FPS (60/120), TTI, memory, bundle size, native render time | Flipper, React DevTools Profiler, Hermes Sampling Profiler, Xcode Instruments, Android Profiler, FlashList Recorder |
|
|
31
|
+
|
|
32
|
+
Each has its own measurement approach; conflate them at your peril.
|
|
33
|
+
|
|
34
|
+
## Measurement First, Optimization Second
|
|
35
|
+
|
|
36
|
+
The cardinal rule: don't optimize without numbers. The biggest performance regressions in the wild come from devs "fixing" something that wasn't slow.
|
|
37
|
+
|
|
38
|
+
**Workflow**:
|
|
39
|
+
|
|
40
|
+
1. Establish a budget (e.g., LCP < 2.5s P75, list scroll 60 FPS, P95 < 200ms).
|
|
41
|
+
2. Measure on real conditions (real device, real network, real data volume).
|
|
42
|
+
3. Identify the bottleneck via profiling.
|
|
43
|
+
4. Fix the bottleneck.
|
|
44
|
+
5. Re-measure to confirm improvement.
|
|
45
|
+
6. Pin a regression test if possible (CI bundle-size gate, k6 load test).
|
|
46
|
+
|
|
47
|
+
## Web Vitals (2026 — current Google ranking signals)
|
|
48
|
+
|
|
49
|
+
| Metric | What it measures | Good | Needs improvement | Poor |
|
|
50
|
+
|---|---|---|---|---|
|
|
51
|
+
| **LCP** (Largest Contentful Paint) | Time until largest element renders | ≤ 2.5s | 2.5–4.0s | > 4.0s |
|
|
52
|
+
| **INP** (Interaction to Next Paint) | Worst interaction latency in session — replaced FID March 2024 | ≤ 200ms | 200–500ms | > 500ms |
|
|
53
|
+
| **CLS** (Cumulative Layout Shift) | Visual stability over the page lifetime | ≤ 0.1 | 0.1–0.25 | > 0.25 |
|
|
54
|
+
| TTFB (Time to First Byte) | Server response start | ≤ 0.8s | 0.8–1.8s | > 1.8s |
|
|
55
|
+
|
|
56
|
+
Measure on REAL devices via the `web-vitals` library; aggregate at P75 across users (Google's threshold).
|
|
57
|
+
|
|
58
|
+
```html
|
|
59
|
+
<script type="module">
|
|
60
|
+
import { onLCP, onINP, onCLS } from 'https://unpkg.com/web-vitals?module';
|
|
61
|
+
onLCP((metric) => sendToAnalytics('LCP', metric));
|
|
62
|
+
onINP((metric) => sendToAnalytics('INP', metric));
|
|
63
|
+
onCLS((metric) => sendToAnalytics('CLS', metric));
|
|
64
|
+
</script>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
For per-metric optimization tactics (image priorities for LCP, JS chunking for INP, reserved space for CLS), see [references/web-vitals.md](references/web-vitals.md).
|
|
68
|
+
|
|
69
|
+
## Mobile Perf Budgets
|
|
70
|
+
|
|
71
|
+
| Metric | Target | Hard fail |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| App cold start (TTI) | < 1.5s on mid-tier device | > 3s |
|
|
74
|
+
| App warm start | < 500ms | > 1s |
|
|
75
|
+
| Frame rate during scroll | 60 FPS (or 120 on ProMotion) | < 50 FPS |
|
|
76
|
+
| Frame rate during animation | same | jank visible |
|
|
77
|
+
| Memory after 5 min use | < 250MB | > 400MB |
|
|
78
|
+
| JS bundle size | < 4MB uncompressed | > 8MB |
|
|
79
|
+
| Native size (per platform) | < 50MB download | > 100MB |
|
|
80
|
+
| Battery drain (1 hr active use) | < 5% | > 10% |
|
|
81
|
+
|
|
82
|
+
Measure on a **mid-tier device** (Pixel 6a, iPhone 12 mini), not the top of the line. Real users have older phones.
|
|
83
|
+
|
|
84
|
+
For RN-specific patterns (Hermes optimizations, FlashList, Reanimated worklets, native module trade-offs, bundle analysis), see [references/mobile-performance.md](references/mobile-performance.md).
|
|
85
|
+
|
|
86
|
+
## Backend Perf Budgets
|
|
87
|
+
|
|
88
|
+
| Metric | Target | Hard fail |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| P50 latency | < 100ms | > 300ms |
|
|
91
|
+
| P95 latency | < 300ms | > 1s |
|
|
92
|
+
| P99 latency | < 1s | > 3s |
|
|
93
|
+
| Error rate | < 0.1% | > 1% |
|
|
94
|
+
| CPU utilization | < 70% sustained | > 90% |
|
|
95
|
+
| Memory utilization | < 70% sustained | > 90% |
|
|
96
|
+
| DB connection pool usage | < 60% | > 90% |
|
|
97
|
+
| Cache hit rate (where applicable) | > 90% | < 70% |
|
|
98
|
+
|
|
99
|
+
P95 / P99 matter more than P50 — the slow tail is the user experience for the unlucky users.
|
|
100
|
+
|
|
101
|
+
Per-language tools:
|
|
102
|
+
|
|
103
|
+
- **Go**: `pprof` for CPU / heap / goroutine profiles. `runtime/trace` for execution traces. `httptrace` to dissect outbound calls.
|
|
104
|
+
- **Python**: `py-spy` for sampling profiler. `cProfile` for deterministic. `tracemalloc` for memory leaks. `asyncio` debug mode for slow awaits.
|
|
105
|
+
- **Node**: `--prof` + `--prof-process`. Clinic.js for flame graphs.
|
|
106
|
+
|
|
107
|
+
## Image Optimization (Web + Mobile)
|
|
108
|
+
|
|
109
|
+
The single biggest leverage in most apps. Modern formats + sizing rules:
|
|
110
|
+
|
|
111
|
+
| Use case | Format | Notes |
|
|
112
|
+
|---|---|---|
|
|
113
|
+
| Photos (web) | AVIF (2026 default), WebP fallback | 30-50% smaller than JPEG |
|
|
114
|
+
| Photos (RN) | WebP | iOS 14+ & Android natively |
|
|
115
|
+
| Graphics / icons | SVG | Inline for critical above-fold |
|
|
116
|
+
| Animation | WebP / animated AVIF | Avoid GIF (huge) |
|
|
117
|
+
| Logos | SVG | Crisp at any density |
|
|
118
|
+
| Charts | SVG (small) / Canvas (large) | DOM cost vs raster |
|
|
119
|
+
|
|
120
|
+
**Sizing**:
|
|
121
|
+
|
|
122
|
+
- Serve at the size the device displays. Don't serve a 4000px JPG to a 400px container.
|
|
123
|
+
- Web: `<img srcset>` with multiple resolutions + `sizes` hint.
|
|
124
|
+
- RN: `react-native-fast-image` with explicit `style={{ width, height }}` + remote CDN that supports `?w=` resize.
|
|
125
|
+
|
|
126
|
+
**Loading**:
|
|
127
|
+
|
|
128
|
+
- `loading="lazy"` on below-fold images (web).
|
|
129
|
+
- `fetchpriority="high"` on the LCP image.
|
|
130
|
+
- Preconnect to the image CDN: `<link rel="preconnect" href="https://cdn.app.com">`.
|
|
131
|
+
|
|
132
|
+
**CDN**:
|
|
133
|
+
|
|
134
|
+
- Cloudflare Images, ImageKit, Imgix, Cloudinary — auto-format + auto-resize.
|
|
135
|
+
- Cache headers: `Cache-Control: public, max-age=31536000, immutable` for hashed asset URLs.
|
|
136
|
+
|
|
137
|
+
## Code Splitting
|
|
138
|
+
|
|
139
|
+
Web (Vite / Webpack / Next):
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
// Lazy-load a route-scoped component
|
|
143
|
+
const Settings = lazy(() => import('./Settings'));
|
|
144
|
+
|
|
145
|
+
<Suspense fallback={<Spinner />}>
|
|
146
|
+
<Settings />
|
|
147
|
+
</Suspense>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Rules:
|
|
151
|
+
|
|
152
|
+
- Split per route at minimum.
|
|
153
|
+
- Split large components (charts, rich-text editors, video players) on demand.
|
|
154
|
+
- Don't split things smaller than ~30KB — overhead outweighs.
|
|
155
|
+
- Preload the next likely route on hover / link visibility.
|
|
156
|
+
|
|
157
|
+
RN: 0.76+ bundle is one file by default; use Hermes lazy parse + tree-shake aggressively.
|
|
158
|
+
|
|
159
|
+
## Font Loading
|
|
160
|
+
|
|
161
|
+
Fonts are render-blocking. Best practices:
|
|
162
|
+
|
|
163
|
+
```css
|
|
164
|
+
@font-face {
|
|
165
|
+
font-family: 'Inter';
|
|
166
|
+
font-style: normal;
|
|
167
|
+
font-weight: 400 700; /* variable font, single file */
|
|
168
|
+
font-display: swap; /* show fallback immediately, swap when ready */
|
|
169
|
+
src: url('/fonts/inter.woff2') format('woff2');
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
```html
|
|
174
|
+
<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin>
|
|
175
|
+
<link rel="preconnect" href="https://fonts.app.com">
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
- Variable fonts (one file, all weights) over multiple static fonts.
|
|
179
|
+
- Subset fonts to characters you actually use (latin / latin-ext / etc.).
|
|
180
|
+
- `font-display: swap` — never block on font.
|
|
181
|
+
- Self-host critical fonts; don't depend on Google Fonts CDN for first paint.
|
|
182
|
+
|
|
183
|
+
## JavaScript Cost (Web)
|
|
184
|
+
|
|
185
|
+
The biggest INP / TTI killer. Defenses:
|
|
186
|
+
|
|
187
|
+
- **Bundle budget**: < 200KB compressed JS for the initial page.
|
|
188
|
+
- **Tree-shake aggressively**. `import { foo } from 'lib'` not `import * as lib`.
|
|
189
|
+
- **Avoid large UI libraries**: a custom dropdown is 100x smaller than `react-select`.
|
|
190
|
+
- **Defer non-critical scripts**: analytics, A/B testing, cookie banner load AFTER LCP.
|
|
191
|
+
- **Web workers** for heavy computation (PDF parse, CSV processing).
|
|
192
|
+
- **Streaming SSR** (React 19+) — TTFB drops, hydration starts earlier.
|
|
193
|
+
|
|
194
|
+
Lint rule: `no-default-export` for UI lib modules — easier tree-shake.
|
|
195
|
+
|
|
196
|
+
## Database Performance (cross-references db-design)
|
|
197
|
+
|
|
198
|
+
Most backend slowness is the database. Default fixes:
|
|
199
|
+
|
|
200
|
+
1. **Find the slow query** with `pg_stat_statements`:
|
|
201
|
+
```sql
|
|
202
|
+
SELECT query, mean_exec_time, calls, total_exec_time
|
|
203
|
+
FROM pg_stat_statements
|
|
204
|
+
ORDER BY mean_exec_time DESC LIMIT 20;
|
|
205
|
+
```
|
|
206
|
+
2. **Run EXPLAIN (ANALYZE, BUFFERS)** on it.
|
|
207
|
+
3. **Add the missing index** (per `db-design`).
|
|
208
|
+
4. **N+1**: use eager loading or batch the lookup.
|
|
209
|
+
5. **Connection pool sized correctly** (per `db-design`).
|
|
210
|
+
6. **Add a cache layer** (Redis) for hot reads if DB is the bottleneck after indexing.
|
|
211
|
+
|
|
212
|
+
For Postgres-specific perf tools, see `db-design::postgres-patterns.md`.
|
|
213
|
+
|
|
214
|
+
## Caching Layers
|
|
215
|
+
|
|
216
|
+
| Layer | Tool | Use case |
|
|
217
|
+
|---|---|---|
|
|
218
|
+
| HTTP / CDN | Cloudflare, Fastly | Public, cacheable responses (homepage, static) |
|
|
219
|
+
| Reverse proxy | Nginx, Varnish | Same, on your edge |
|
|
220
|
+
| Application | Redis, Memcached | Hot reads, session data, rate-limit counters |
|
|
221
|
+
| Database query cache | (Postgres has no real query cache; use materialized views) | Aggregates that change infrequently |
|
|
222
|
+
| Service worker | Browser | Offline-first PWAs |
|
|
223
|
+
| Client-side | TanStack Query | Per-user request dedup + SWR |
|
|
224
|
+
|
|
225
|
+
Rules:
|
|
226
|
+
|
|
227
|
+
- **Cache invalidation is hard**. Pick TTL conservatively; explicit invalidate on writes.
|
|
228
|
+
- **Cache headers** must be set deliberately on EVERY endpoint (`no-store` for sensitive).
|
|
229
|
+
- **Edge cache** for anything that can be public.
|
|
230
|
+
- **Don't cache PII** at the edge (CDN).
|
|
231
|
+
|
|
232
|
+
## Profiling Workflow
|
|
233
|
+
|
|
234
|
+
### Backend (Go example)
|
|
235
|
+
|
|
236
|
+
```go
|
|
237
|
+
import _ "net/http/pprof"
|
|
238
|
+
go func() { _ = http.ListenAndServe("localhost:6060", nil) }()
|
|
239
|
+
|
|
240
|
+
// Then:
|
|
241
|
+
// go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30 (CPU)
|
|
242
|
+
// go tool pprof http://localhost:6060/debug/pprof/heap (heap)
|
|
243
|
+
// go tool pprof http://localhost:6060/debug/pprof/goroutine (goroutine count)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Web Frontend
|
|
247
|
+
|
|
248
|
+
- Chrome DevTools → Performance tab → record while reproducing.
|
|
249
|
+
- Look for: long tasks (> 50ms), layout shifts, render-blocking resources.
|
|
250
|
+
- Lighthouse → Performance audit → "Diagnostics" + "Opportunities".
|
|
251
|
+
|
|
252
|
+
### React Native
|
|
253
|
+
|
|
254
|
+
- Flipper → React DevTools profiler (component re-renders).
|
|
255
|
+
- Hermes Sampling Profiler (`hermes -enable-eval -sample-profiler`).
|
|
256
|
+
- Xcode Instruments (iOS) → Time Profiler / Allocations.
|
|
257
|
+
- Android Studio Profiler → CPU / Memory / Network.
|
|
258
|
+
|
|
259
|
+
## Performance Regressions in CI
|
|
260
|
+
|
|
261
|
+
Catch them before users do:
|
|
262
|
+
|
|
263
|
+
- **Bundle size budget** in webpack/vite config; fails build if bundle grows > 5%.
|
|
264
|
+
- **Lighthouse CI** (`@lhci/cli`) per PR on key pages; fails build on Performance score drop.
|
|
265
|
+
- **k6 load tests** weekly against staging; alert on P95 regression.
|
|
266
|
+
- **Detox / Maestro perf check** on mobile — startup time + first frame.
|
|
267
|
+
|
|
268
|
+
```yaml
|
|
269
|
+
# .github/workflows/perf.yml
|
|
270
|
+
- run: npm run build
|
|
271
|
+
- run: npx bundlesize # fails if any chunk over budget
|
|
272
|
+
- run: npx @lhci/cli autorun --collect.url=https://staging.app.com/
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Common Performance Mistakes
|
|
276
|
+
|
|
277
|
+
1. **Optimizing without measuring** — guesswork; usually wrong.
|
|
278
|
+
2. **Hand-rolled caching** when TanStack Query / SWR exists.
|
|
279
|
+
3. **Re-renders ignored** — log re-render counts in dev; profile with React DevTools.
|
|
280
|
+
4. **N+1 queries unnoticed** until prod — add `pg_stat_statements` early.
|
|
281
|
+
5. **Big JPGs served everywhere** — modern formats + responsive `srcset`.
|
|
282
|
+
6. **Synchronous render-blocking script** in `<head>` — defer/async or load late.
|
|
283
|
+
7. **No `font-display: swap`** — invisible text until font loads.
|
|
284
|
+
8. **CSS `@import`** — serial loading. Use `<link>` for parallel.
|
|
285
|
+
9. **No connection pooling** to the DB — every request a new TCP handshake.
|
|
286
|
+
10. **Memory leaks**: unsubscribed listeners, retained closures, big arrays in module scope.
|
|
287
|
+
11. **Mobile: inline functions in render** of long lists — use `useCallback` + memoize rows.
|
|
288
|
+
12. **Mobile: AsyncStorage on app start** for big data — use MMKV (synchronous, 30x faster).
|
|
289
|
+
13. **Mobile: too many native module calls in render** — batch or move to lifecycle hooks.
|
|
290
|
+
14. **Backend: blocking I/O in async runtime** — measure with the runtime's debug mode.
|
|
291
|
+
15. **Backend: serialization-heavy responses** — Pydantic v2 is fast; v1 was a bottleneck.
|
|
292
|
+
|
|
293
|
+
## Pre-Launch Performance Checklist
|
|
294
|
+
|
|
295
|
+
See [assets/perf-checklist.md](assets/perf-checklist.md). Each item: a concrete metric or technique.
|
|
296
|
+
|
|
297
|
+
## Source Material
|
|
298
|
+
|
|
299
|
+
- *web.dev — Core Web Vitals*: <https://web.dev/articles/vitals>
|
|
300
|
+
- *Web Performance — Brendan Gregg* (book + blog): <https://www.brendangregg.com/>
|
|
301
|
+
- *Callstack — Ultimate Guide to React Native Optimization* (definitive RN perf reference).
|
|
302
|
+
- *Addy Osmani — Image Optimization*: <https://images.guide/>
|
|
303
|
+
- *Lighthouse Performance Scoring*: <https://developer.chrome.com/docs/lighthouse/performance/performance-scoring>
|
|
304
|
+
- *PostgreSQL — Performance Tips*: <https://www.postgresql.org/docs/current/performance-tips.html>
|
|
305
|
+
- *Go performance — uber-go/guide* and *cmd/pprof docs*.
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Performance Pre-Launch Checklist
|
|
2
|
+
|
|
3
|
+
Run before each release. Each item is a concrete metric or technique. Uncheck = fix or document waiver.
|
|
4
|
+
|
|
5
|
+
## Web Vitals (web client)
|
|
6
|
+
|
|
7
|
+
- [ ] **LCP** at P75 ≤ 2.5s on a real 4G mid-tier device.
|
|
8
|
+
- [ ] **INP** at P75 ≤ 200ms.
|
|
9
|
+
- [ ] **CLS** at P75 ≤ 0.1.
|
|
10
|
+
- [ ] **TTFB** at P75 ≤ 800ms.
|
|
11
|
+
- [ ] Lighthouse Performance score ≥ 90 on critical pages.
|
|
12
|
+
- [ ] `web-vitals` JS lib reporting to RUM (real-user monitoring).
|
|
13
|
+
|
|
14
|
+
## Image Optimization
|
|
15
|
+
|
|
16
|
+
- [ ] Modern format (AVIF/WebP) for raster images.
|
|
17
|
+
- [ ] Responsive `srcset` + `sizes` (web) OR CDN resize parameters (mobile).
|
|
18
|
+
- [ ] Every `<img>` has explicit `width` + `height` (or `aspect-ratio`).
|
|
19
|
+
- [ ] LCP image: `fetchpriority="high"` + `<link rel="preload">`.
|
|
20
|
+
- [ ] Below-fold images: `loading="lazy"`.
|
|
21
|
+
- [ ] CDN configured with `Cache-Control: public, max-age=31536000, immutable` for hashed URLs.
|
|
22
|
+
|
|
23
|
+
## Fonts
|
|
24
|
+
|
|
25
|
+
- [ ] Variable font (single file) over multi-weight static fonts.
|
|
26
|
+
- [ ] `font-display: swap`.
|
|
27
|
+
- [ ] Critical fonts preloaded (`<link rel="preload" as="font" crossorigin>`).
|
|
28
|
+
- [ ] Font subset to actual character set (no full Unicode for Latin-only sites).
|
|
29
|
+
- [ ] No render-blocking external font CSS (Google Fonts) for above-fold.
|
|
30
|
+
|
|
31
|
+
## JavaScript
|
|
32
|
+
|
|
33
|
+
- [ ] Initial JS bundle ≤ 200KB compressed.
|
|
34
|
+
- [ ] Code-split per route (web).
|
|
35
|
+
- [ ] Tree-shaking verified (named imports, ESM, no barrel re-exports).
|
|
36
|
+
- [ ] Heavy dependencies replaced (Moment → date-fns, full Lodash → individual functions).
|
|
37
|
+
- [ ] No render-blocking analytics / tag-manager script in `<head>`.
|
|
38
|
+
- [ ] Long tasks (> 50ms) profiled; broken up if found in critical path.
|
|
39
|
+
|
|
40
|
+
## Mobile (React Native)
|
|
41
|
+
|
|
42
|
+
- [ ] Hermes enabled both platforms.
|
|
43
|
+
- [ ] R8 / ProGuard enabled in Android release.
|
|
44
|
+
- [ ] App cold-start time ≤ 1.5s on Pixel 6a / iPhone 12 mini.
|
|
45
|
+
- [ ] App warm-start ≤ 500ms.
|
|
46
|
+
- [ ] Scroll FPS ≥ 60 on long lists (FlashList used).
|
|
47
|
+
- [ ] Animation FPS ≥ 60 (Reanimated worklets).
|
|
48
|
+
- [ ] Memory after 5 minutes' use ≤ 250MB.
|
|
49
|
+
- [ ] Bundle size: JS uncompressed ≤ 4MB.
|
|
50
|
+
- [ ] Native size per platform ≤ 50MB download.
|
|
51
|
+
- [ ] FastImage used for any image-heavy list.
|
|
52
|
+
- [ ] No `console.*` in release bundle (`babel-plugin-transform-remove-console`).
|
|
53
|
+
- [ ] Splash screen kept until first useful frame (`react-native-bootsplash`).
|
|
54
|
+
- [ ] Non-critical init deferred via `InteractionManager.runAfterInteractions`.
|
|
55
|
+
|
|
56
|
+
## Backend
|
|
57
|
+
|
|
58
|
+
- [ ] P50 latency ≤ 100ms; P95 ≤ 300ms; P99 ≤ 1s.
|
|
59
|
+
- [ ] Error rate ≤ 0.1% under normal load.
|
|
60
|
+
- [ ] CPU < 70% sustained, memory < 70% sustained at peak.
|
|
61
|
+
- [ ] DB connection pool < 60% utilization at peak.
|
|
62
|
+
- [ ] No N+1 queries in hot paths (verified with `pg_stat_statements`).
|
|
63
|
+
- [ ] All hot queries have appropriate indexes (verified with EXPLAIN ANALYZE).
|
|
64
|
+
- [ ] Cache hit rate > 90% for cached endpoints.
|
|
65
|
+
- [ ] APM / tracing wired up (OpenTelemetry → Datadog / Honeycomb / Tempo).
|
|
66
|
+
|
|
67
|
+
## Database (cross-references db-design)
|
|
68
|
+
|
|
69
|
+
- [ ] `pg_stat_statements` enabled and reviewed weekly.
|
|
70
|
+
- [ ] `auto_explain` on with 500ms threshold; logs reviewed.
|
|
71
|
+
- [ ] Connection pooling correct (per `db-design`).
|
|
72
|
+
- [ ] No long-running idle transactions (`idle_in_transaction_session_timeout` set).
|
|
73
|
+
- [ ] Backups verified by quarterly restore test.
|
|
74
|
+
|
|
75
|
+
## Caching
|
|
76
|
+
|
|
77
|
+
- [ ] CDN in front of static assets + cacheable endpoints.
|
|
78
|
+
- [ ] Cache headers explicit on every endpoint (`no-store` for sensitive).
|
|
79
|
+
- [ ] Application cache (Redis) for hot reads.
|
|
80
|
+
- [ ] Cache invalidation strategy documented per cached resource.
|
|
81
|
+
- [ ] No PII cached at edge (CDN).
|
|
82
|
+
|
|
83
|
+
## Network
|
|
84
|
+
|
|
85
|
+
- [ ] HTTP/2 or HTTP/3 enabled.
|
|
86
|
+
- [ ] Gzip / Brotli compression for responses > 1KB.
|
|
87
|
+
- [ ] `Connection: keep-alive` enabled.
|
|
88
|
+
- [ ] Preconnect to critical third-party origins.
|
|
89
|
+
- [ ] `<link rel="dns-prefetch">` for less-critical third-party origins.
|
|
90
|
+
|
|
91
|
+
## CI Regression Gates
|
|
92
|
+
|
|
93
|
+
- [ ] **Bundle-size budget** in CI; fails if any chunk > 5% larger.
|
|
94
|
+
- [ ] **Lighthouse CI** per PR on key pages; fails on Performance score drop.
|
|
95
|
+
- [ ] **k6 load test** weekly against staging; alerts on P95 regression.
|
|
96
|
+
- [ ] **Mobile**: cold-start time tracked per release.
|
|
97
|
+
- [ ] **APM**: p95 latency dashboards reviewed weekly; alerts on drift.
|
|
98
|
+
|
|
99
|
+
## Observability
|
|
100
|
+
|
|
101
|
+
- [ ] OpenTelemetry traces propagated end-to-end (RN client → backend → DB).
|
|
102
|
+
- [ ] RUM collects Web Vitals + custom metrics.
|
|
103
|
+
- [ ] Per-endpoint metrics: count, P50/P95/P99 latency, error rate.
|
|
104
|
+
- [ ] Slow-query log threshold set (~500ms).
|
|
105
|
+
- [ ] Per-screen mobile perf reported (cold-start, render time, error rate).
|
|
106
|
+
|
|
107
|
+
## Common Anti-Patterns Audit
|
|
108
|
+
|
|
109
|
+
- [ ] No optimization without measurement attached.
|
|
110
|
+
- [ ] No hand-rolled caching when TanStack Query / SWR exists.
|
|
111
|
+
- [ ] No re-renders ignored (React DevTools profiler reviewed for hot screens).
|
|
112
|
+
- [ ] No N+1 queries unnoticed.
|
|
113
|
+
- [ ] No giant JPEG hero images.
|
|
114
|
+
- [ ] No synchronous render-blocking script in `<head>`.
|
|
115
|
+
- [ ] No `font-display: block`.
|
|
116
|
+
- [ ] No `@import` in CSS.
|
|
117
|
+
- [ ] No connection-per-request to DB.
|
|
118
|
+
|
|
119
|
+
## Pre-Launch Smoke
|
|
120
|
+
|
|
121
|
+
- [ ] Cold-start measured on real mid-tier device (Pixel 6a / iPhone 12 mini).
|
|
122
|
+
- [ ] Critical user flow timed end-to-end.
|
|
123
|
+
- [ ] Network throttled to 4G slow → app still usable.
|
|
124
|
+
- [ ] CPU throttled 4× → no jank.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
If any box is unchecked, document the reason in a tracking issue with an ETA.
|
|
129
|
+
|
|
130
|
+
## Per-Surface Quick Reference
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
Web:
|
|
134
|
+
LCP ≤ 2.5s INP ≤ 200ms CLS ≤ 0.1 TTFB ≤ 800ms
|
|
135
|
+
|
|
136
|
+
Mobile (RN):
|
|
137
|
+
Cold start ≤ 1.5s Scroll FPS = 60 Memory ≤ 250MB
|
|
138
|
+
JS bundle ≤ 4MB Native size ≤ 50MB
|
|
139
|
+
|
|
140
|
+
Backend:
|
|
141
|
+
P50 ≤ 100ms P95 ≤ 300ms P99 ≤ 1s Errors ≤ 0.1%
|
|
142
|
+
CPU ≤ 70% Memory ≤ 70% Pool ≤ 60%
|
|
143
|
+
```
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
# Mobile Performance — React Native Specific
|
|
2
|
+
|
|
3
|
+
The actual playbook for keeping a React Native app fast on real devices. Pulls from Callstack's optimization guide + Hermes / FlashList / Reanimated documentation.
|
|
4
|
+
|
|
5
|
+
## Three Categories of Slowness
|
|
6
|
+
|
|
7
|
+
| Category | Symptom | Where to look |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| **Startup** | Cold launch > 2s | Hermes lazy parse, native init, Metro bundle, splash screen |
|
|
10
|
+
| **Runtime jank** | Scroll < 60 FPS, animations stutter | JS thread blocks, heavy renders, bridge traffic |
|
|
11
|
+
| **Memory / battery** | App killed in background, drains battery | Memory leaks, native modules, unsubscribed listeners |
|
|
12
|
+
|
|
13
|
+
Each has different tools + fixes. Diagnose first.
|
|
14
|
+
|
|
15
|
+
## Startup Time (TTI)
|
|
16
|
+
|
|
17
|
+
### Measure
|
|
18
|
+
|
|
19
|
+
- **iOS**: Xcode → Instruments → "App Launch" template. Or `xcrun simctl launch --console <bundle-id>` and time it.
|
|
20
|
+
- **Android**: `adb shell am start -W com.app/.MainActivity` reports `TotalTime`.
|
|
21
|
+
- **In-app**: log `Date.now()` in `index.js` first line and again in `App.tsx`'s first render — diff is JS startup.
|
|
22
|
+
|
|
23
|
+
### Optimization
|
|
24
|
+
|
|
25
|
+
1. **Hermes enabled** — required. Both platforms.
|
|
26
|
+
2. **Pre-compiled bytecode** — Hermes ships `.hbc` files; Metro builds them in release mode automatically.
|
|
27
|
+
3. **Lazy parsing** — Hermes parses functions on first call by default. Don't disable.
|
|
28
|
+
4. **Reduce initial bundle**:
|
|
29
|
+
- `import` only what you need (tree-shake).
|
|
30
|
+
- Defer non-critical screens with React Navigation's lazy `getComponent`.
|
|
31
|
+
- Defer non-critical libraries: load analytics / push setup AFTER first render.
|
|
32
|
+
5. **Defer native module init** that's not needed at launch.
|
|
33
|
+
6. **Splash screen kept until first useful frame** (`react-native-bootsplash`). Better UX than launching to white.
|
|
34
|
+
7. **InteractionManager.runAfterInteractions** for non-essential work after navigation.
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
// In App.tsx
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
// Defer heavy init until after first paint.
|
|
40
|
+
InteractionManager.runAfterInteractions(() => {
|
|
41
|
+
initAnalytics();
|
|
42
|
+
setupPushHandlers();
|
|
43
|
+
prefetchNextScreens();
|
|
44
|
+
});
|
|
45
|
+
}, []);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Frame Rate (60 / 120 FPS)
|
|
49
|
+
|
|
50
|
+
### Measure
|
|
51
|
+
|
|
52
|
+
- **In-app**: enable React Native's perf monitor (Cmd+M / Cmd+D → Show Perf Monitor). Shows JS + UI thread FPS.
|
|
53
|
+
- **Flipper**: React DevTools Profiler — see component re-renders.
|
|
54
|
+
- **Hermes Sampling Profiler**: `hermes -enable-eval -sample-profiler`. Shows where JS time is spent.
|
|
55
|
+
|
|
56
|
+
### Diagnose
|
|
57
|
+
|
|
58
|
+
- Drops in **JS thread FPS** during scroll → JS work blocking (re-renders, sync I/O).
|
|
59
|
+
- Drops in **UI thread FPS** during animation → native animation issue (rare with Reanimated worklets).
|
|
60
|
+
- Stutter only on first scroll → cold native rendering; warm up via FlashList scroll-to-end on mount.
|
|
61
|
+
|
|
62
|
+
### Optimization
|
|
63
|
+
|
|
64
|
+
1. **FlashList for any list > 50 items** (per `react-native-patterns`). FlatList = old, slow. FlashList recycles row instances; 10–50× faster.
|
|
65
|
+
2. **`useCallback` and `useMemo` aggressively** in row components.
|
|
66
|
+
3. **`React.memo`** on row component, with custom equality if needed.
|
|
67
|
+
4. **`useNativeDriver: true`** on legacy `Animated` (or use Reanimated, which is always native).
|
|
68
|
+
5. **Reanimated 3 worklets** for any gesture-driven animation. Worklets run on UI thread; no bridge involvement.
|
|
69
|
+
6. **Avoid `setState` in scroll handlers** without throttle / debounce.
|
|
70
|
+
7. **`removeClippedSubviews={true}`** on long ScrollView (Android only; iOS is fine without).
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
// Reanimated 3 worklet — runs on UI thread, 60 FPS guaranteed
|
|
74
|
+
import Animated, { useSharedValue, useAnimatedStyle, withSpring } from 'react-native-reanimated';
|
|
75
|
+
|
|
76
|
+
const scale = useSharedValue(1);
|
|
77
|
+
const animatedStyle = useAnimatedStyle(() => ({
|
|
78
|
+
transform: [{ scale: scale.value }],
|
|
79
|
+
}));
|
|
80
|
+
|
|
81
|
+
<Animated.View style={animatedStyle}>...</Animated.View>
|
|
82
|
+
<Pressable
|
|
83
|
+
onPressIn={() => { scale.value = withSpring(0.95); }}
|
|
84
|
+
onPressOut={() => { scale.value = withSpring(1); }}>
|
|
85
|
+
...
|
|
86
|
+
</Pressable>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## JS Thread — Don't Block
|
|
90
|
+
|
|
91
|
+
The JS thread runs all React work. Block it = drop frames.
|
|
92
|
+
|
|
93
|
+
**Measure**: JS FPS drops during scroll / animation in the perf monitor.
|
|
94
|
+
|
|
95
|
+
**Defenses**:
|
|
96
|
+
|
|
97
|
+
- **No sync JSON parse > 100KB** in render. Move to `InteractionManager.runAfterInteractions` or a worker.
|
|
98
|
+
- **Use `react-native-mmkv`** (synchronous, ~30x faster than AsyncStorage) for small data; AsyncStorage offloads to native thread but has overhead per call.
|
|
99
|
+
- **Defer heavy computation**:
|
|
100
|
+
```typescript
|
|
101
|
+
InteractionManager.runAfterInteractions(() => {
|
|
102
|
+
const result = heavyComputation();
|
|
103
|
+
setState(result);
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
- **`useDeferredValue`** in React 18+ for low-priority updates.
|
|
107
|
+
- **Background thread** for crypto / image processing: `react-native-fast-tflite` etc. spawn off-thread.
|
|
108
|
+
|
|
109
|
+
## Bundle Size
|
|
110
|
+
|
|
111
|
+
### Measure
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Install:
|
|
115
|
+
yarn add -D react-native-bundle-visualizer
|
|
116
|
+
|
|
117
|
+
# Run:
|
|
118
|
+
yarn react-native-bundle-visualizer
|
|
119
|
+
# Opens the bundle in browser; click into chunks.
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Diagnose
|
|
123
|
+
|
|
124
|
+
Common offenders:
|
|
125
|
+
|
|
126
|
+
- **Moment.js** → swap for `date-fns` (tree-shakable) or native `Intl`.
|
|
127
|
+
- **Lodash** → `import { debounce } from 'lodash-es'` (tree-shake) OR write your own.
|
|
128
|
+
- **lottie-react-native + animations** → keep animation files small (Lottie JSON can balloon).
|
|
129
|
+
- **All locale files of i18n libs** — only import the locales you ship.
|
|
130
|
+
|
|
131
|
+
### Reduce
|
|
132
|
+
|
|
133
|
+
1. **Tree-shaking**: ESM imports (`import { foo }`), not CJS (`require('lib')`).
|
|
134
|
+
2. **Dead-code-elimination** via Metro's minifier.
|
|
135
|
+
3. **Avoid barrel exports** (`index.ts` re-exports everything) — they defeat tree-shake.
|
|
136
|
+
4. **Hermes pre-compile**: bytecode is smaller than minified JS in many cases.
|
|
137
|
+
|
|
138
|
+
## Image Performance (RN)
|
|
139
|
+
|
|
140
|
+
Images are usually the biggest perf cost on mobile.
|
|
141
|
+
|
|
142
|
+
### Tools
|
|
143
|
+
|
|
144
|
+
- **`react-native-fast-image`** — uses SDWebImage (iOS) / Glide (Android). Disk + memory cache. Faster decoding.
|
|
145
|
+
- Always `style={{ width, height }}` — fixed dimensions.
|
|
146
|
+
- **Resize on the server** (CDN) — never download a 4000px image to a 400px display.
|
|
147
|
+
- **WebP** format on both platforms (native support since iOS 14 / Android API 14).
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
import FastImage from 'react-native-fast-image';
|
|
151
|
+
|
|
152
|
+
<FastImage
|
|
153
|
+
source={{ uri: `https://cdn.app.com/photos/${id}?w=600&fmt=webp`,
|
|
154
|
+
priority: FastImage.priority.normal,
|
|
155
|
+
cache: FastImage.cacheControl.immutable }}
|
|
156
|
+
style={{ width: 200, height: 200 }}
|
|
157
|
+
resizeMode={FastImage.resizeMode.cover}
|
|
158
|
+
/>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Image-Heavy Lists
|
|
162
|
+
|
|
163
|
+
- Pre-fetch images for next-N rows: `FastImage.preload([{ uri: ... }])`.
|
|
164
|
+
- Resize / thumbnail on the server; never client-resize a giant image.
|
|
165
|
+
|
|
166
|
+
## Native Modules — Bridge Cost
|
|
167
|
+
|
|
168
|
+
Every JS↔native call costs ~50-200µs in the legacy bridge. TurboModules (default in 0.76+ New Architecture) is much faster but still not free.
|
|
169
|
+
|
|
170
|
+
**Defenses**:
|
|
171
|
+
|
|
172
|
+
- **Batch calls** — `NativeModule.processMany(items)` instead of N calls.
|
|
173
|
+
- **TurboModules** for sync calls when needed (legacy bridge is async-only).
|
|
174
|
+
- **JSI** for hot paths — direct C++ binding, near-zero overhead. Use `react-native-mmkv`, `react-native-reanimated`, `react-native-fast-image` patterns.
|
|
175
|
+
|
|
176
|
+
## Memory + Leaks
|
|
177
|
+
|
|
178
|
+
### Measure
|
|
179
|
+
|
|
180
|
+
- **Xcode Instruments → Allocations / Leaks**.
|
|
181
|
+
- **Android Studio → Profiler → Memory**.
|
|
182
|
+
- **React DevTools profiler** — see what's still mounted that shouldn't be.
|
|
183
|
+
|
|
184
|
+
### Common Leak Sources
|
|
185
|
+
|
|
186
|
+
1. **Subscriptions not cleaned up** in `useEffect` return.
|
|
187
|
+
2. **Timers** not cleared.
|
|
188
|
+
3. **Event listeners** not removed.
|
|
189
|
+
4. **Module-scope arrays / maps** that grow forever.
|
|
190
|
+
5. **Closures retaining big objects** — captured `data` lives as long as the closure.
|
|
191
|
+
6. **Circular refs** in JS (rare; GC handles most).
|
|
192
|
+
7. **Native side**: image cache too large, native module retaining buffers.
|
|
193
|
+
|
|
194
|
+
### Fix
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
useEffect(() => {
|
|
198
|
+
const sub = SomeAPI.subscribe(...);
|
|
199
|
+
const timer = setInterval(...);
|
|
200
|
+
const listener = AppState.addEventListener('change', ...);
|
|
201
|
+
|
|
202
|
+
return () => {
|
|
203
|
+
sub.remove();
|
|
204
|
+
clearInterval(timer);
|
|
205
|
+
listener.remove();
|
|
206
|
+
};
|
|
207
|
+
}, [...stable deps]);
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Battery Drain
|
|
211
|
+
|
|
212
|
+
The user-visible measure of inefficient code.
|
|
213
|
+
|
|
214
|
+
**Common drains**:
|
|
215
|
+
|
|
216
|
+
- Background polls / GPS / Bluetooth that don't pause when app backgrounded.
|
|
217
|
+
- WebSocket reconnect storms.
|
|
218
|
+
- Repeated wakeups by push notifications without coalescing.
|
|
219
|
+
- Long video / audio playback without proper buffering.
|
|
220
|
+
|
|
221
|
+
**Test**:
|
|
222
|
+
|
|
223
|
+
- iOS: leave app open 30 min; check Battery section in Settings → Battery for your app's CPU%.
|
|
224
|
+
- Android: Battery Historian (`adb bugreport`) or Settings → Battery → Battery usage.
|
|
225
|
+
|
|
226
|
+
## Per-Phase Tactics
|
|
227
|
+
|
|
228
|
+
### Pre-launch
|
|
229
|
+
|
|
230
|
+
- Bundle analyzer run; nothing surprising.
|
|
231
|
+
- Hermes + R8/ProGuard enabled.
|
|
232
|
+
- FastImage configured.
|
|
233
|
+
- Critical screens use FlashList.
|
|
234
|
+
|
|
235
|
+
### Post-launch monitoring
|
|
236
|
+
|
|
237
|
+
- Sentry / Crashlytics with performance monitoring (perf traces per screen).
|
|
238
|
+
- Real-device cold-start time tracked.
|
|
239
|
+
- Bundle size budgeted; CI fails on > 5% growth.
|
|
240
|
+
|
|
241
|
+
## Source Material
|
|
242
|
+
|
|
243
|
+
- Callstack — *Ultimate Guide to React Native Optimization*.
|
|
244
|
+
- React Native — *Performance Overview*: <https://reactnative.dev/docs/performance>
|
|
245
|
+
- Hermes docs — Sampling profiler usage.
|
|
246
|
+
- Reanimated 3 docs — worklet patterns.
|
|
247
|
+
- Shopify FlashList — internals + optimization guide.
|
|
248
|
+
- Apple — *Energy Efficiency Guide for iOS*.
|
|
249
|
+
- Android — *Battery and Memory Optimization*.
|