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,64 @@
|
|
|
1
|
+
<!-- domain:INFRA | layer:reference | ssot:true | updated:2026-06-04 -->
|
|
2
|
+
# Dockerfile Optimization — Size, Cache, Base Images
|
|
3
|
+
|
|
4
|
+
> P: Make images small, builds fast, and layers cacheable.
|
|
5
|
+
> R: Writing or shrinking a Dockerfile; a build is slow or the image is huge.
|
|
6
|
+
> S: Orchestration / registry / CI — that's [deployment-cicd](../../deployment-cicd/SKILL.md).
|
|
7
|
+
> N: [SKILL.md](../SKILL.md), [compose-patterns.md](compose-patterns.md)
|
|
8
|
+
|
|
9
|
+
> Nav: [Skill](../SKILL.md)
|
|
10
|
+
|
|
11
|
+
## Base image — smaller is safer
|
|
12
|
+
|
|
13
|
+
| Base | Size | Use when |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `*-alpine` | ~5–50 MB | static binaries, Go; musl libc (watch glibc-only deps) |
|
|
16
|
+
| `*-slim` (Debian) | ~50–120 MB | most apps; glibc, no build tools |
|
|
17
|
+
| `distroless` | ~20–50 MB | runtime only, no shell — hardest to exploit |
|
|
18
|
+
| full (`ubuntu`, `node`) | 300 MB–1 GB | build stage only, never runtime |
|
|
19
|
+
|
|
20
|
+
Pin a digest or exact version (`node:26.0.0-slim`), never `latest` — a moving
|
|
21
|
+
base breaks reproducibility and silently changes your runtime.
|
|
22
|
+
|
|
23
|
+
## Multi-stage — the size lever
|
|
24
|
+
|
|
25
|
+
The runtime stage `COPY --from=build` only the artifact (binary, `dist/`,
|
|
26
|
+
wheels). Compilers, dev dependencies, and build caches stay in the discarded
|
|
27
|
+
build stage. For compiled languages the runtime can be `distroless` or `scratch`
|
|
28
|
+
+ a static binary — single-digit MB.
|
|
29
|
+
|
|
30
|
+
## Layer cache — order + atomic RUNs
|
|
31
|
+
|
|
32
|
+
- Order least-volatile → most-volatile: base → system packages → dependency
|
|
33
|
+
manifest + install → source. A change invalidates its layer and all after it.
|
|
34
|
+
- One logical step per `RUN`, chained with `&&`, cleaning in the same layer:
|
|
35
|
+
|
|
36
|
+
```dockerfile
|
|
37
|
+
RUN apt-get update \
|
|
38
|
+
&& apt-get install -y --no-install-recommends ca-certificates \
|
|
39
|
+
&& rm -rf /var/lib/apt/lists/* # cleanup in the SAME layer or it still ships
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Cleanup in a *later* `RUN` doesn't shrink the image — the earlier layer already
|
|
43
|
+
recorded the files. BuildKit cache mounts (`--mount=type=cache,target=/root/.cache`)
|
|
44
|
+
keep package caches across builds without baking them in.
|
|
45
|
+
|
|
46
|
+
## `.dockerignore` is not optional
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
.git
|
|
50
|
+
node_modules
|
|
51
|
+
**/*.log
|
|
52
|
+
.env
|
|
53
|
+
dist
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The build context is tar'd and sent to the daemon; without `.dockerignore` it
|
|
57
|
+
includes `.git` (history!), local `node_modules`, and possibly `.env` secrets —
|
|
58
|
+
slowing the build and risking a leak. Mirror `.gitignore` plus build outputs.
|
|
59
|
+
|
|
60
|
+
## Measure
|
|
61
|
+
|
|
62
|
+
`docker build` shows per-step timing; `docker history <image>` shows per-layer
|
|
63
|
+
size — find the fat layer. `docker images` shows the total. A web app runtime
|
|
64
|
+
over ~250 MB usually means the build stage leaked into runtime, or no `-slim`.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# lint_dockerfile.sh — PURPOSE: flag a Dockerfile against the image-craft rules.
|
|
3
|
+
# INPUT: one Dockerfile path. OUTPUT: findings on stderr, "<n> issue(s)" on
|
|
4
|
+
# stdout; exit 1 if any. DEPS: grep, awk. NOTES: heuristic, fail-closed; a clean
|
|
5
|
+
# pass is necessary not sufficient. Spec: docs/playbooks/skill-authoring.md.
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
IFS=$'\n\t'
|
|
8
|
+
|
|
9
|
+
log() { printf '%s\n' "$*" >&2; }
|
|
10
|
+
[[ $# -eq 1 ]] || { echo "usage: $0 <Dockerfile>" >&2; exit 2; }
|
|
11
|
+
f="$1"
|
|
12
|
+
[[ -f "$f" ]] || { echo "error: $f not found" >&2; exit 2; }
|
|
13
|
+
|
|
14
|
+
issues=0
|
|
15
|
+
flag() { log " ✗ $1"; issues=$((issues + 1)); }
|
|
16
|
+
|
|
17
|
+
# Untagged or :latest base image.
|
|
18
|
+
if grep -iE '^[[:space:]]*FROM[[:space:]]+[^[:space:]]+(:latest)?[[:space:]]*($|AS)' "$f" \
|
|
19
|
+
| grep -ivqE ':[a-z0-9._-]+'; then
|
|
20
|
+
flag "FROM has no version tag (or uses :latest) — pin an explicit version"
|
|
21
|
+
fi
|
|
22
|
+
grep -iqE '^[[:space:]]*FROM[^:]*:latest' "$f" && flag "FROM uses :latest — pin a version"
|
|
23
|
+
|
|
24
|
+
# Runs as root: no USER directive at all.
|
|
25
|
+
grep -iqE '^[[:space:]]*USER[[:space:]]' "$f" || flag "no USER directive — container runs as root"
|
|
26
|
+
|
|
27
|
+
# Secret baked via ARG/ENV (heuristic on common secret names).
|
|
28
|
+
if grep -iE '^[[:space:]]*(ARG|ENV)[[:space:]]' "$f" \
|
|
29
|
+
| grep -iqE '(secret|token|password|passwd|api[_-]?key|private[_-]?key)'; then
|
|
30
|
+
flag "secret-shaped ARG/ENV — bakes the secret into image history; use --mount=type=secret"
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# ADD of a local path where COPY is correct (ADD line without a URL).
|
|
34
|
+
if grep -iE '^[[:space:]]*ADD[[:space:]]' "$f" | grep -ivqE 'https?://'; then
|
|
35
|
+
flag "ADD used for a local file — prefer COPY (ADD auto-extracts + fetches URLs)"
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
# apt update without cleanup in the same/any RUN.
|
|
39
|
+
if grep -iqE 'apt(-get)?[[:space:]]+(update|install)' "$f" \
|
|
40
|
+
&& ! grep -iqE 'rm[[:space:]]+-rf[[:space:]]+/var/lib/apt/lists' "$f"; then
|
|
41
|
+
flag "apt install without 'rm -rf /var/lib/apt/lists/*' — ships the package index"
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
# .dockerignore alongside the Dockerfile.
|
|
45
|
+
[[ -f "$(dirname "$f")/.dockerignore" ]] || log " · no .dockerignore next to $f (ships .git/node_modules into context)"
|
|
46
|
+
|
|
47
|
+
printf '%d issue(s)\n' "$issues"
|
|
48
|
+
[[ "$issues" -eq 0 ]]
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"docker-engine": {
|
|
3
|
+
"ecosystem": "github",
|
|
4
|
+
"package": "moby/moby",
|
|
5
|
+
"version": "29.5.3",
|
|
6
|
+
"source": "https://github.com/moby/moby/releases",
|
|
7
|
+
"checked": "2026-06-05"
|
|
8
|
+
},
|
|
9
|
+
"docker-compose": {
|
|
10
|
+
"ecosystem": "github",
|
|
11
|
+
"package": "docker/compose",
|
|
12
|
+
"version": "5.1.4",
|
|
13
|
+
"source": "https://github.com/docker/compose/releases",
|
|
14
|
+
"checked": "2026-06-05"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: end-to-end-testing
|
|
3
|
+
tier: quality
|
|
4
|
+
domain: [frontend, mobile]
|
|
5
|
+
description: Write reliable end-to-end tests that exercise real user journeys — Playwright for web, Maestro for mobile — without the flakiness that makes teams ignore them. Use when adding an end-to-end test, debugging a flaky test, choosing what to cover end-to-end vs unit/integration, setting up CI for browser/device tests, or replacing hard sleeps and brittle selectors with reliable ones. Triggers — "end-to-end test", "e2e", "Playwright", "Maestro", "the test is flaky", "browser test", "user flow test", "test the signup flow". Pairs with testing-strategy (which test type to pick — end-to-end is the top of the pyramid, used sparingly), a11y (accessible locators double as test locators), frontend-fundamentals + mobile-fundamentals.
|
|
6
|
+
globs: ""
|
|
7
|
+
paths: []
|
|
8
|
+
last_reviewed: "2026-06-04"
|
|
9
|
+
versions_ref: versions.json
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# End-to-End Testing
|
|
13
|
+
|
|
14
|
+
End-to-end tests are the most valuable and the most expensive tests — they prove a real user journey works across the whole stack, and they break for unrelated reasons if written carelessly. The discipline: **few but critical** journeys, **semantic** locators, **zero hard sleeps**, and **isolated** data. A flaky end-to-end suite is worse than none — teams learn to ignore red.
|
|
15
|
+
|
|
16
|
+
> Lint Playwright specs for flakiness anti-patterns:
|
|
17
|
+
> `python3 scripts/lint_e2e.py tests/**/*.spec.ts`
|
|
18
|
+
|
|
19
|
+
## Cover journeys, not units (it's the tip of the pyramid)
|
|
20
|
+
|
|
21
|
+
End-to-end tests are slow and broad — reserve them for the handful of journeys
|
|
22
|
+
that, if broken, mean the product is down: sign up → log in, add to cart →
|
|
23
|
+
checkout, the core create→read→update path. Everything else (edge cases, error
|
|
24
|
+
states, validation) is cheaper and more reliable as unit/integration tests.
|
|
25
|
+
Which test type for a given change is owned by
|
|
26
|
+
[testing-strategy](../testing-strategy/SKILL.md) — this skill is how to write the
|
|
27
|
+
end-to-end ones well.
|
|
28
|
+
|
|
29
|
+
## Playwright — locators + auto-wait (web)
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
// Wrong — brittle selector + a hard sleep = flaky and slow
|
|
33
|
+
await page.waitForTimeout(3000);
|
|
34
|
+
await page.click(".btn-primary.css-1x2y3z"); // generated class, breaks on rebuild
|
|
35
|
+
|
|
36
|
+
// Correct — semantic locator + auto-waiting assertion
|
|
37
|
+
await page.getByRole("button", { name: "Sign in" }).click(); // waits for actionable
|
|
38
|
+
await expect(page.getByText("Welcome")).toBeVisible(); // retries until true or times out
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Playwright **auto-waits** for elements to be actionable — `getByRole`/`getByLabel`/
|
|
42
|
+
`getByText` plus web-first `expect` assertions retry automatically. A
|
|
43
|
+
`waitForTimeout` is always wrong: either too short (flaky) or too long (slow).
|
|
44
|
+
Prefer role/label/text locators (they double as accessibility checks — see
|
|
45
|
+
[a11y](../a11y/SKILL.md)) over CSS/XPath. Detail → [references/playwright.md](references/playwright.md).
|
|
46
|
+
|
|
47
|
+
## Maestro — flows for mobile
|
|
48
|
+
|
|
49
|
+
```yaml
|
|
50
|
+
# flows/login.yaml
|
|
51
|
+
appId: com.example.app
|
|
52
|
+
---
|
|
53
|
+
- launchApp
|
|
54
|
+
- tapOn: "Email"
|
|
55
|
+
- inputText: "user@example.com"
|
|
56
|
+
- tapOn: "Sign in"
|
|
57
|
+
- assertVisible: "Welcome"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Maestro drives real iOS/Android (or emulators) from a declarative YAML flow. It
|
|
61
|
+
has built-in retry/wait — no manual sleeps. Select by accessible text/id, not
|
|
62
|
+
pixel coordinates. Detail → [references/maestro.md](references/maestro.md).
|
|
63
|
+
|
|
64
|
+
## Kill flakiness at the source
|
|
65
|
+
|
|
66
|
+
| Flake cause | Fix |
|
|
67
|
+
|---|---|
|
|
68
|
+
| hard sleep (`waitForTimeout`) | auto-waiting locator + web-first `expect` |
|
|
69
|
+
| brittle selector (CSS class, nth-child) | `getByRole`/`getByTestId`/accessible text |
|
|
70
|
+
| shared/leftover data between tests | each test seeds + tears down its own data |
|
|
71
|
+
| test order dependence | full isolation — any test runs alone |
|
|
72
|
+
| real network to third parties | mock/route external calls; control the clock |
|
|
73
|
+
| race on navigation | `await` the action; let auto-wait handle readiness |
|
|
74
|
+
|
|
75
|
+
A test must pass **alone and in any order**. If it needs a previous test to have
|
|
76
|
+
run, it's not a test — it's a step in a script.
|
|
77
|
+
|
|
78
|
+
## CI
|
|
79
|
+
|
|
80
|
+
Run headless, sharded across workers (`--workers`, Playwright `--shard`),
|
|
81
|
+
retries = 1–2 for true environment blips only (not to paper over flake). On
|
|
82
|
+
failure, capture the **trace** (Playwright `trace: on-first-retry`) / Maestro
|
|
83
|
+
recording — debugging a CI-only failure without a trace is guesswork. Pin
|
|
84
|
+
versions ([versions.json](versions.json)); browsers via `playwright install`.
|
|
85
|
+
|
|
86
|
+
## Anti-patterns (reject on sight)
|
|
87
|
+
|
|
88
|
+
- `waitForTimeout` / `sleep` anywhere → auto-waiting assertion instead.
|
|
89
|
+
- CSS/XPath selectors tied to styling or generated classes → semantic locators.
|
|
90
|
+
- A test that depends on another test's data or order → isolate it.
|
|
91
|
+
- Hitting real third-party APIs in an end-to-end test → mock the boundary.
|
|
92
|
+
- A test with no assertion (only actions) → it proves nothing.
|
|
93
|
+
- Hundreds of end-to-end tests covering edge cases → push those down to unit/integration.
|
|
94
|
+
- Retries cranked to 5 to hide flake → fix the root cause.
|
|
95
|
+
|
|
96
|
+
## See also
|
|
97
|
+
|
|
98
|
+
- [references/playwright.md](references/playwright.md) — locators, fixtures, network mocking, traces, parallelism.
|
|
99
|
+
- [references/maestro.md](references/maestro.md) — flows, selectors, CI, device matrix.
|
|
100
|
+
- [assets/e2e-checklist.md](assets/e2e-checklist.md) — the ship gate.
|
|
101
|
+
- [testing-strategy](../testing-strategy/SKILL.md) · [a11y](../a11y/SKILL.md).
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<!-- domain:FRONTEND | layer:asset | ssot:false | updated:2026-06-04 -->
|
|
2
|
+
# End-to-End Test Ship Checklist
|
|
3
|
+
|
|
4
|
+
Run before adding or merging an end-to-end test.
|
|
5
|
+
|
|
6
|
+
## Scope
|
|
7
|
+
- [ ] Covers a critical user journey (sign-up/login, checkout, core CRUD) — not an edge case.
|
|
8
|
+
- [ ] Edge cases / validation / error states pushed down to unit/integration tests.
|
|
9
|
+
- [ ] The suite stays small enough to run on every PR.
|
|
10
|
+
|
|
11
|
+
## Reliability
|
|
12
|
+
- [ ] Zero `waitForTimeout`/`sleep` — auto-waiting locators + web-first `expect` (or Maestro implicit waits).
|
|
13
|
+
- [ ] Semantic locators (`getByRole`/`getByLabel`/text / accessibility id) — no CSS-class/nth-child/coordinate selectors.
|
|
14
|
+
- [ ] Each test seeds + tears down its own data; passes alone and in any order.
|
|
15
|
+
- [ ] Third-party/flaky endpoints mocked (Playwright `route`) — no real external calls.
|
|
16
|
+
- [ ] Every test has at least one assertion.
|
|
17
|
+
- [ ] `python3 scripts/lint_e2e.py <spec files>` → `clean`.
|
|
18
|
+
|
|
19
|
+
## CI
|
|
20
|
+
- [ ] Headless, parallel/sharded; `retries` ≤ 2 for real blips only.
|
|
21
|
+
- [ ] Trace on failure (Playwright `trace: on-first-retry` / Maestro recording).
|
|
22
|
+
- [ ] Browsers/devices provisioned (`playwright install`, emulators); versions pinned.
|
|
23
|
+
- [ ] `make skills-check-versions` — Playwright/Maestro pins current.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<!-- domain:MOBILE | layer:reference | ssot:true | updated:2026-06-04 -->
|
|
2
|
+
# Maestro — Mobile End-to-End Flows
|
|
3
|
+
|
|
4
|
+
> P: Drive real iOS/Android user journeys with declarative, retry-built-in flows.
|
|
5
|
+
> R: Authoring or debugging a mobile end-to-end test.
|
|
6
|
+
> S: Web tests — see [playwright.md](playwright.md).
|
|
7
|
+
> N: [SKILL.md](../SKILL.md), [e2e-checklist.md](../assets/e2e-checklist.md)
|
|
8
|
+
|
|
9
|
+
> Nav: [Skill](../SKILL.md)
|
|
10
|
+
|
|
11
|
+
## A flow is declarative YAML
|
|
12
|
+
|
|
13
|
+
```yaml
|
|
14
|
+
# flows/checkout.yaml
|
|
15
|
+
appId: com.example.app
|
|
16
|
+
---
|
|
17
|
+
- launchApp:
|
|
18
|
+
clearState: true # isolation: start from a known state
|
|
19
|
+
- tapOn: "Add to cart"
|
|
20
|
+
- tapOn:
|
|
21
|
+
id: "checkout_button" # prefer accessibility id over visible text when ambiguous
|
|
22
|
+
- assertVisible: "Order confirmed"
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Each step waits for the UI implicitly — Maestro retries `tapOn`/`assertVisible`
|
|
26
|
+
until the element appears or it times out. No manual sleeps. `clearState: true`
|
|
27
|
+
gives test isolation (fresh app data per flow).
|
|
28
|
+
|
|
29
|
+
## Select by accessibility, not pixels
|
|
30
|
+
|
|
31
|
+
```yaml
|
|
32
|
+
- tapOn: "Sign in" # visible text
|
|
33
|
+
- tapOn:
|
|
34
|
+
id: "email_field" # accessibilityIdentifier / resource-id (most stable)
|
|
35
|
+
- inputText: "user@example.com"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Use text or the platform accessibility id (`accessibilityIdentifier` on iOS,
|
|
39
|
+
`resource-id`/`contentDescription` on Android). Never tap by coordinates — it
|
|
40
|
+
breaks on any layout or device change. Accessible labels make the app testable
|
|
41
|
+
*and* usable (see [a11y](../../a11y/SKILL.md)).
|
|
42
|
+
|
|
43
|
+
## Reuse + parameterize
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
# login.yaml as a subflow
|
|
47
|
+
- runFlow: login.yaml
|
|
48
|
+
- runFlow:
|
|
49
|
+
file: checkout.yaml
|
|
50
|
+
env: { PRODUCT: "Book" }
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Extract shared steps (login) into subflows; pass `env` to parameterize. Keep each
|
|
54
|
+
flow one journey — a 60-step mega-flow is hard to debug when step 47 fails.
|
|
55
|
+
|
|
56
|
+
## CI + debugging
|
|
57
|
+
|
|
58
|
+
- `maestro test flows/` runs the suite; `maestro cloud` runs across a device
|
|
59
|
+
matrix. Record with `maestro record` to get a video of a failure.
|
|
60
|
+
- Run against emulators/simulators in CI; pin the Maestro CLI version
|
|
61
|
+
([versions.json](../versions.json)).
|
|
62
|
+
- Built-in retry handles real UI timing — don't add sleeps. If a flow is flaky,
|
|
63
|
+
the selector is ambiguous or the app has a real race; fix the root cause.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<!-- domain:FRONTEND | layer:reference | ssot:true | updated:2026-06-04 -->
|
|
2
|
+
# Playwright — Locators, Fixtures, Network, Traces
|
|
3
|
+
|
|
4
|
+
> P: Write reliable web end-to-end tests with auto-waiting locators and isolated state.
|
|
5
|
+
> R: Authoring or debugging a Playwright test.
|
|
6
|
+
> S: Mobile flows — see [maestro.md](maestro.md). Test-type choice — [testing-strategy](../../testing-strategy/SKILL.md).
|
|
7
|
+
> N: [SKILL.md](../SKILL.md), [e2e-checklist.md](../assets/e2e-checklist.md)
|
|
8
|
+
|
|
9
|
+
> Nav: [Skill](../SKILL.md)
|
|
10
|
+
|
|
11
|
+
## Locator priority (most → least reliable)
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
page.getByRole("button", { name: "Submit" }) // 1. role + accessible name (best)
|
|
15
|
+
page.getByLabel("Email") // 2. form labels
|
|
16
|
+
page.getByText("Welcome back") // 3. visible text
|
|
17
|
+
page.getByTestId("checkout-cta") // 4. explicit data-testid (when no semantic anchor)
|
|
18
|
+
page.locator("button.btn") // 5. CSS — last resort, brittle
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Role/label/text locators also verify accessibility (a missing accessible name
|
|
22
|
+
fails the test) — they couple correctness and a11y. Reserve `getByTestId` for
|
|
23
|
+
elements with no semantic anchor; never select on generated CSS classes.
|
|
24
|
+
|
|
25
|
+
## Auto-wait + web-first assertions
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
await page.getByRole("button", { name: "Save" }).click(); // waits until actionable
|
|
29
|
+
await expect(page.getByText("Saved")).toBeVisible(); // retries up to the timeout
|
|
30
|
+
await expect(page).toHaveURL(/dashboard/);
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Every action auto-waits for the element to be visible, stable, and enabled;
|
|
34
|
+
`expect(locator)` retries until the condition holds. This is why
|
|
35
|
+
`waitForTimeout` is never needed — the framework already waits for the *right*
|
|
36
|
+
condition instead of a guessed duration.
|
|
37
|
+
|
|
38
|
+
## Isolation via fixtures
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
test.beforeEach(async ({ page }) => { await seedUser(); });
|
|
42
|
+
test.afterEach(async () => { await cleanupUser(); });
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Each test gets a fresh browser context (cookies/storage isolated) by default.
|
|
46
|
+
Seed the data the test needs and tear it down — never rely on data a prior test
|
|
47
|
+
created. Use `storageState` to skip login UI by injecting an authenticated
|
|
48
|
+
session once.
|
|
49
|
+
|
|
50
|
+
## Mock the boundary
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
await page.route("**/api/payments", (route) =>
|
|
54
|
+
route.fulfill({ json: { status: "ok" } }));
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Route third-party/flaky endpoints so the test controls the response — an
|
|
58
|
+
end-to-end test of *your* app shouldn't fail because Stripe's sandbox is slow.
|
|
59
|
+
Control time with `page.clock` for timeout/animation logic.
|
|
60
|
+
|
|
61
|
+
## Debug + CI
|
|
62
|
+
|
|
63
|
+
- `trace: "on-first-retry"` in config → a full DOM/network/console timeline on
|
|
64
|
+
failure; open with `npx playwright show-trace`. Debugging CI flake without it
|
|
65
|
+
is guesswork.
|
|
66
|
+
- Parallelize with `fullyParallel: true` + `--workers`; shard across CI machines
|
|
67
|
+
with `--shard=1/4`. `retries: 1` for genuine blips only — not to mask flake.
|
|
68
|
+
- Browsers: `npx playwright install --with-deps` in CI; pin the Playwright version.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""Lint Playwright spec files for the common flakiness anti-patterns.
|
|
2
|
+
|
|
3
|
+
PURPOSE: Flag hard sleeps, brittle selectors, and assertion-free tests so a
|
|
4
|
+
suite stays reliable instead of teaching the team to ignore red.
|
|
5
|
+
INPUT: one or more Playwright spec paths (*.spec.ts / *.ts). [--json]
|
|
6
|
+
OUTPUT: Findings (file:line) on stderr; "clean"/"N finding(s)" on stdout.
|
|
7
|
+
Exit 0 clean, 1 if findings, 2 usage.
|
|
8
|
+
DEPENDENCIES: stdlib only. Static regex scan.
|
|
9
|
+
NOTES: Heuristic — necessary not sufficient. Pure scan_text() is
|
|
10
|
+
unit-testable. Spec: docs/playbooks/skill-authoring.md; craft: ../SKILL.md.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import argparse
|
|
16
|
+
import json
|
|
17
|
+
import re
|
|
18
|
+
import sys
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
LINE_RULES: list[tuple[re.Pattern, str]] = [
|
|
22
|
+
(
|
|
23
|
+
re.compile(r"\bwaitForTimeout\s*\("),
|
|
24
|
+
"waitForTimeout (hard sleep) — use an auto-waiting expect",
|
|
25
|
+
),
|
|
26
|
+
(
|
|
27
|
+
re.compile(r"\b(setTimeout|sleep)\s*\("),
|
|
28
|
+
"manual sleep — use an auto-waiting locator/assertion",
|
|
29
|
+
),
|
|
30
|
+
(
|
|
31
|
+
re.compile(r"page\.(click|fill|type)\s*\(\s*['\"](\.|#)[\w-]*\d"),
|
|
32
|
+
"CSS selector with a generated/positional class — use getByRole/getByTestId",
|
|
33
|
+
),
|
|
34
|
+
(
|
|
35
|
+
re.compile(r"locator\(\s*['\"][^'\"]*:nth-child"),
|
|
36
|
+
"nth-child selector — brittle; use a semantic locator",
|
|
37
|
+
),
|
|
38
|
+
(re.compile(r"\bpage\.\$x?\("), "page.$ / page.$x (deprecated, no auto-wait) — use locators"),
|
|
39
|
+
(
|
|
40
|
+
re.compile(r"\bxpath=|\bpage\.\$x\("),
|
|
41
|
+
"XPath selector — brittle; use a role/label/text locator",
|
|
42
|
+
),
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
TEST_DECL = re.compile(r"\b(test|it)\s*\(\s*['\"]")
|
|
46
|
+
HAS_ASSERT = re.compile(r"\bexpect\s*\(")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def scan_text(text: str, *, filename: str = "?") -> list[str]:
|
|
50
|
+
findings: list[str] = []
|
|
51
|
+
for n, line in enumerate(text.splitlines(), 1):
|
|
52
|
+
stripped = line.lstrip()
|
|
53
|
+
if stripped.startswith(("//", "*", "/*")):
|
|
54
|
+
continue
|
|
55
|
+
for pattern, msg in LINE_RULES:
|
|
56
|
+
if pattern.search(line):
|
|
57
|
+
findings.append(f"{filename}:{n}: {msg}")
|
|
58
|
+
# A spec file with test blocks but no expect() asserts nothing.
|
|
59
|
+
if TEST_DECL.search(text) and not HAS_ASSERT.search(text):
|
|
60
|
+
findings.append(f"{filename}: test(s) with no expect() — the test asserts nothing")
|
|
61
|
+
return findings
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def main(argv: list[str]) -> int:
|
|
65
|
+
parser = argparse.ArgumentParser(description=__doc__.split("\n")[0])
|
|
66
|
+
parser.add_argument("files", nargs="+")
|
|
67
|
+
parser.add_argument("--json", action="store_true", dest="as_json")
|
|
68
|
+
args = parser.parse_args(argv)
|
|
69
|
+
|
|
70
|
+
all_findings: list[str] = []
|
|
71
|
+
for path in args.files:
|
|
72
|
+
try:
|
|
73
|
+
all_findings.extend(scan_text(Path(path).read_text(encoding="utf-8"), filename=path))
|
|
74
|
+
except FileNotFoundError:
|
|
75
|
+
print(f"error: {path} not found", file=sys.stderr)
|
|
76
|
+
return 2
|
|
77
|
+
|
|
78
|
+
for f in all_findings:
|
|
79
|
+
print(f" ✗ {f}", file=sys.stderr)
|
|
80
|
+
if args.as_json:
|
|
81
|
+
print(json.dumps({"findings": all_findings, "count": len(all_findings)}))
|
|
82
|
+
else:
|
|
83
|
+
print("clean" if not all_findings else f"{len(all_findings)} finding(s)")
|
|
84
|
+
return 1 if all_findings else 0
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
if __name__ == "__main__":
|
|
88
|
+
raise SystemExit(main(sys.argv[1:]))
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"playwright": {
|
|
3
|
+
"ecosystem": "npm",
|
|
4
|
+
"package": "playwright",
|
|
5
|
+
"version": "1.60.0",
|
|
6
|
+
"source": "https://www.npmjs.com/package/playwright",
|
|
7
|
+
"checked": "2026-06-04"
|
|
8
|
+
},
|
|
9
|
+
"maestro": {
|
|
10
|
+
"ecosystem": "github",
|
|
11
|
+
"package": "mobile-dev-inc/maestro",
|
|
12
|
+
"version": "2.6.0",
|
|
13
|
+
"source": "https://github.com/mobile-dev-inc/maestro/releases",
|
|
14
|
+
"checked": "2026-06-04"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-design
|
|
3
|
+
tier: quality
|
|
4
|
+
domain: [frontend]
|
|
5
|
+
description: Create distinctive, production-grade visual interfaces — design principles that apply to ANY frontend (React, Next.js, Vue, Svelte, plain HTML/CSS, React Native). Use when the aesthetic direction matters — building a component, page, landing site, or app where it must look intentional, not generic "AI slop". Covers visual hierarchy, spacing/rhythm, typography, color + contrast, layout, and design tokens — independent of framework. Triggers — "make this look good", "design", "UI", "landing page", "the spacing feels off", "color palette", "it looks generic/AI". Pairs with frontend-fundamentals (implementation patterns), a11y (accessibility — aesthetic without it is a lawsuit), state-management.
|
|
6
|
+
globs: ""
|
|
7
|
+
paths: []
|
|
8
|
+
last_reviewed: "2026-06-04"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Frontend Design
|
|
12
|
+
|
|
13
|
+
Good design looks *intentional* — every spacing value, type size, and color is a decision, not a default. This skill is the aesthetic direction, and it is **framework-independent**: the same principles apply whether you write React, Vue, Svelte, React Native, or hand-written HTML/CSS. The implementation patterns are owned by [frontend-fundamentals](../frontend-fundamentals/SKILL.md); accessibility by [a11y](../a11y/SKILL.md) — load all three for real UI work (aesthetic without a11y is a lawsuit; aesthetic without patterns is tech debt).
|
|
14
|
+
|
|
15
|
+
> Check a color pair against WCAG contrast (design + a11y in one):
|
|
16
|
+
> `python3 scripts/check_contrast.py "#1a1a1a" "#ffffff"`
|
|
17
|
+
|
|
18
|
+
## Avoid "AI slop" — the generic look
|
|
19
|
+
|
|
20
|
+
The default generic interface: even gray borders everywhere, centered everything,
|
|
21
|
+
one font weight, purple-to-blue gradients, emoji as iconography, no hierarchy. It
|
|
22
|
+
reads as "no decisions were made". Distinctive design makes deliberate choices: a
|
|
23
|
+
real type scale, intentional asymmetry, a restrained palette with one accent,
|
|
24
|
+
generous or deliberately tight spacing — consistently applied.
|
|
25
|
+
|
|
26
|
+
## The principles (framework-agnostic)
|
|
27
|
+
|
|
28
|
+
1. **Hierarchy** — the eye should land on the most important thing first. Achieve
|
|
29
|
+
it with size, weight, color, and space — not by making everything bold.
|
|
30
|
+
2. **Spacing rhythm** — use a scale (4/8px base: 4, 8, 12, 16, 24, 32, 48, 64),
|
|
31
|
+
never arbitrary values. Consistent spacing is most of what "looks polished" is.
|
|
32
|
+
3. **Typography** — a type scale (not 14 random sizes); limited weights; line-height
|
|
33
|
+
~1.5 for body, tighter for headings; measure (line length) ~45–75 characters.
|
|
34
|
+
4. **Color** — a small palette: a neutral ramp + one or two accents. Define
|
|
35
|
+
semantic roles (surface, text, primary, danger), not raw hex scattered in code.
|
|
36
|
+
Every text/background pair must pass contrast — `check_contrast.py`.
|
|
37
|
+
5. **Layout** — align to a grid; respect proximity (related things close, unrelated
|
|
38
|
+
apart); use whitespace as a tool, not filler.
|
|
39
|
+
|
|
40
|
+
Full treatment → [references/design-principles.md](references/design-principles.md).
|
|
41
|
+
|
|
42
|
+
## Design tokens — one source of truth
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
// tokens (CSS vars / a theme object) — the SSOT for the look
|
|
46
|
+
--space-1: 4px; --space-2: 8px; ... --radius: 8px;
|
|
47
|
+
--color-surface: #fff; --color-text: #1a1a1a; --color-primary: #2563eb;
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Define spacing, color, radius, type as **tokens**, reference them everywhere —
|
|
51
|
+
never hardcode `margin: 13px` or `#3b82f6` inline. Tokens make the design
|
|
52
|
+
consistent and themeable (dark mode = swap the token values). This is the
|
|
53
|
+
api-contract-discipline principle applied to visual values.
|
|
54
|
+
|
|
55
|
+
## Responsive + state, by default
|
|
56
|
+
|
|
57
|
+
Design mobile-first and scale up; test the real breakpoints, not just a desktop
|
|
58
|
+
width. Every interactive element needs its full state set: default, hover, focus
|
|
59
|
+
(visible — a11y), active, disabled, loading, and the empty/error data states.
|
|
60
|
+
A design that only shows the happy, populated, desktop view is half-designed.
|
|
61
|
+
|
|
62
|
+
## Anti-patterns (reject on sight)
|
|
63
|
+
|
|
64
|
+
- Arbitrary spacing (`margin: 13px`, `gap: 7px`) instead of a scale.
|
|
65
|
+
- Raw hex/px scattered in components instead of tokens.
|
|
66
|
+
- One font size/weight for everything → no hierarchy.
|
|
67
|
+
- Centered everything, gray borders, generic gradient → AI slop.
|
|
68
|
+
- Color pairs that fail contrast (looks fine to you, invisible to many).
|
|
69
|
+
- Missing focus styles (removed `outline` with no replacement) → inaccessible.
|
|
70
|
+
- Only the happy/populated/desktop state designed.
|
|
71
|
+
|
|
72
|
+
## See also
|
|
73
|
+
|
|
74
|
+
- [references/design-principles.md](references/design-principles.md) — hierarchy, spacing, type, color, layout in depth.
|
|
75
|
+
- [assets/design-checklist.md](assets/design-checklist.md) — the review gate.
|
|
76
|
+
- [frontend-fundamentals](../frontend-fundamentals/SKILL.md) — implementation patterns · [a11y](../a11y/SKILL.md) — accessibility · [performance](../performance/SKILL.md).
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<!-- domain:FRONTEND | layer:asset | ssot:false | updated:2026-06-04 -->
|
|
2
|
+
# Design Review Checklist
|
|
3
|
+
|
|
4
|
+
Run when reviewing the look of an interface (any framework).
|
|
5
|
+
|
|
6
|
+
## Hierarchy & layout
|
|
7
|
+
- [ ] One clear primary action; secondary actions visibly quieter.
|
|
8
|
+
- [ ] The eye lands on the most important thing first.
|
|
9
|
+
- [ ] Elements aligned to a grid; related items grouped by proximity.
|
|
10
|
+
- [ ] Responsive, mobile-first; real breakpoints tested.
|
|
11
|
+
|
|
12
|
+
## Spacing & type
|
|
13
|
+
- [ ] All spacing from a scale (4/8 base) — no arbitrary values.
|
|
14
|
+
- [ ] One type scale, limited weights; body line-height ~1.5; measure 45–75 chars.
|
|
15
|
+
|
|
16
|
+
## Color & contrast
|
|
17
|
+
- [ ] Small palette: neutral ramp + 1–2 accents.
|
|
18
|
+
- [ ] Semantic color roles (tokens), not raw hex in components.
|
|
19
|
+
- [ ] Every text/background pair passes WCAG AA — `python3 scripts/check_contrast.py <fg> <bg>` → `pass`.
|
|
20
|
+
- [ ] Meaning not conveyed by color alone.
|
|
21
|
+
|
|
22
|
+
## Tokens & states
|
|
23
|
+
- [ ] Spacing/color/radius/type defined as tokens (one source of truth; themeable).
|
|
24
|
+
- [ ] Every interactive element has default/hover/focus(visible)/active/disabled/loading states.
|
|
25
|
+
- [ ] Empty + error data states designed, not just the populated happy path.
|
|
26
|
+
|
|
27
|
+
## Polish
|
|
28
|
+
- [ ] Doesn't read as generic "AI slop" (centered-everything, gray borders, one weight).
|
|
29
|
+
- [ ] Motion (if any) communicates, is fast, respects prefers-reduced-motion.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<!-- domain:FRONTEND | layer:reference | ssot:true | updated:2026-06-04 -->
|
|
2
|
+
# Design Principles — Hierarchy, Spacing, Type, Color, Layout
|
|
3
|
+
|
|
4
|
+
> P: The visual-design fundamentals, framework-independent, that separate "intentional" from "AI slop".
|
|
5
|
+
> R: Designing or reviewing any interface's look and feel.
|
|
6
|
+
> S: Implementation/perf of the UI — that's [frontend-fundamentals](../../frontend-fundamentals/SKILL.md).
|
|
7
|
+
> N: [SKILL.md](../SKILL.md), [design-checklist.md](../assets/design-checklist.md)
|
|
8
|
+
|
|
9
|
+
> Nav: [Skill](../SKILL.md)
|
|
10
|
+
|
|
11
|
+
## Hierarchy — guide the eye
|
|
12
|
+
|
|
13
|
+
The user should know where to look first without thinking. Tools, in order of
|
|
14
|
+
power: **size** (bigger = more important), **weight** (bold draws), **color**
|
|
15
|
+
(contrast/accent draws), **space** (isolation draws). Use the *fewest* tools that
|
|
16
|
+
work — making everything bold and big destroys hierarchy. One clear primary
|
|
17
|
+
action per view; secondary actions visibly quieter.
|
|
18
|
+
|
|
19
|
+
## Spacing — a scale, consistently
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
4 · 8 · 12 · 16 · 24 · 32 · 48 · 64 (a 4/8px base scale)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Most of "looks polished" is consistent spacing. Pick a scale and never use a
|
|
26
|
+
value off it (`margin: 13px` is the tell of unconsidered design). **Proximity**
|
|
27
|
+
groups: related elements close, unrelated elements far. Whitespace is structure,
|
|
28
|
+
not waste — crowding everything to "fit more" reads as cheap.
|
|
29
|
+
|
|
30
|
+
## Typography
|
|
31
|
+
|
|
32
|
+
- **One type scale** (e.g. 12, 14, 16, 20, 24, 32, 48) — not 14 arbitrary sizes.
|
|
33
|
+
- **Limited weights** (regular + semibold/bold) — more looks chaotic.
|
|
34
|
+
- **Line height** ~1.5 for body, ~1.1–1.25 for headings.
|
|
35
|
+
- **Measure** (line length) 45–75 characters — longer is tiring, shorter is choppy.
|
|
36
|
+
- **One or two typefaces** max; pair a display face with a readable body face.
|
|
37
|
+
|
|
38
|
+
## Color
|
|
39
|
+
|
|
40
|
+
- A **neutral ramp** (5–9 grays from near-white to near-black) carries most of the
|
|
41
|
+
UI; **one or two accents** for action/brand. Restraint reads as confident.
|
|
42
|
+
- Define **semantic roles** (`surface`, `text`, `text-muted`, `primary`, `danger`,
|
|
43
|
+
`border`) — components reference roles, not raw hex.
|
|
44
|
+
- **Contrast is non-negotiable**: body text ≥ 4.5:1, large text ≥ 3:1 (WCAG AA).
|
|
45
|
+
`check_contrast.py` verifies a pair. A palette that fails contrast isn't a
|
|
46
|
+
palette, it's a bug ([a11y](../../a11y/SKILL.md)).
|
|
47
|
+
- Don't rely on color alone to convey meaning (color-blind users) — pair with
|
|
48
|
+
icon/text.
|
|
49
|
+
|
|
50
|
+
## Layout
|
|
51
|
+
|
|
52
|
+
- **Grid + alignment** — align edges; misalignment by a few px reads as sloppy
|
|
53
|
+
even when the viewer can't name why.
|
|
54
|
+
- **Responsive, mobile-first** — design the small screen first, enhance up; test
|
|
55
|
+
the real breakpoints.
|
|
56
|
+
- **Visual weight balance** — distribute so the composition doesn't feel lopsided;
|
|
57
|
+
intentional asymmetry beats lazy centering.
|
|
58
|
+
- **Consistency** — the same component looks and behaves the same everywhere; a
|
|
59
|
+
design system / token set enforces this.
|
|
60
|
+
|
|
61
|
+
## Motion (use sparingly)
|
|
62
|
+
|
|
63
|
+
Animate to communicate (state change, spatial relationship), not to decorate.
|
|
64
|
+
Fast (150–250ms), eased, and respect `prefers-reduced-motion`. Gratuitous motion
|
|
65
|
+
is the animated cousin of AI slop.
|