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
core/hooks/jit-recall.sh
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# jit-recall.sh — PreToolUse Write|Edit just-in-time recall.
|
|
3
|
+
#
|
|
4
|
+
# Right before an edit, surface (1) a past friction lesson about THIS file and
|
|
5
|
+
# (2) any convention-rule one-liner mapped to the path in jit-rules.tsv, so the
|
|
6
|
+
# reminder lands at the moment it matters. Warn-only (exit 0, stderr), debounced
|
|
7
|
+
# per (file, session) / (rule, session). Fail-open: never blocks a tool call.
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
source "$(dirname "$0")/cos-env.sh" 2>/dev/null || true
|
|
11
|
+
if ! command -v cos_log_hook >/dev/null 2>&1; then cos_log_hook() { :; }; fi
|
|
12
|
+
|
|
13
|
+
INPUT="$(cos_read_stdin_bounded 2)"
|
|
14
|
+
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null || echo "")
|
|
15
|
+
[[ -z "$FILE_PATH" ]] && exit 0
|
|
16
|
+
|
|
17
|
+
# Debounce markers live in the .jit-nudge/ dir so session-context.sh prunes
|
|
18
|
+
# them wholesale each session (same convention as .graph-nudge/ .task-nudge/).
|
|
19
|
+
NUDGE_DIR="${COS_PANEL_DIR:-${COS_AGENT_DIR:-.coding-os}}/.jit-nudge"
|
|
20
|
+
[[ -d "$NUDGE_DIR" ]] || mkdir -p "$NUDGE_DIR" 2>/dev/null || true
|
|
21
|
+
|
|
22
|
+
# Resolve the PHYSICAL hooks dir — consumers symlink the .sh files but not
|
|
23
|
+
# sibling data/helpers, so $(dirname "$0") lands in a dir without them.
|
|
24
|
+
if command -v _cos_helpers_dir >/dev/null 2>&1; then
|
|
25
|
+
HOOKS_PHYS_DIR="$(dirname "$(_cos_helpers_dir)")"
|
|
26
|
+
else
|
|
27
|
+
HOOKS_PHYS_DIR="$(dirname "$0")"
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# Convention-rule reminders: glob<TAB>rule_id<TAB>message, once per (rule, session).
|
|
31
|
+
# Globs assume a leading slash; normalize relative paths (Codex apply_patch).
|
|
32
|
+
MATCH_PATH="$FILE_PATH"
|
|
33
|
+
[[ "$MATCH_PATH" != /* ]] && MATCH_PATH="/$MATCH_PATH"
|
|
34
|
+
RULES_MAP="$HOOKS_PHYS_DIR/jit-rules.tsv"
|
|
35
|
+
if [[ -f "$RULES_MAP" ]]; then
|
|
36
|
+
while IFS=$'\t' read -r pattern rule_id message; do
|
|
37
|
+
[[ -z "$pattern" || "$pattern" == \#* || -z "$rule_id" || -z "$message" ]] && continue
|
|
38
|
+
# shellcheck disable=SC2053 # unquoted RHS is the point: pattern is a glob
|
|
39
|
+
if [[ "$MATCH_PATH" == $pattern ]]; then
|
|
40
|
+
RULE_MARKER="$NUDGE_DIR/rule-${rule_id}"
|
|
41
|
+
[[ -f "$RULE_MARKER" ]] && continue
|
|
42
|
+
: > "$RULE_MARKER" 2>/dev/null || true
|
|
43
|
+
printf 'warning: 📏 [rule] %s\n' "$message" >&2
|
|
44
|
+
cos_log_hook jit-recall rule-surfaced || true
|
|
45
|
+
fi
|
|
46
|
+
done < "$RULES_MAP"
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# Debounce once per (file, session) — only set the marker when we actually surface.
|
|
50
|
+
FILE_HASH=$(printf '%s' "$FILE_PATH" | shasum 2>/dev/null | cut -c1-12 || echo "nohash")
|
|
51
|
+
MARKER="$NUDGE_DIR/file-${FILE_HASH}"
|
|
52
|
+
[[ -f "$MARKER" ]] && exit 0
|
|
53
|
+
|
|
54
|
+
DB="${COS_DB_PATH:-${COS_STATE_DIR:-.coding-os}/coding-os.db}"
|
|
55
|
+
[[ -f "$DB" ]] || exit 0
|
|
56
|
+
|
|
57
|
+
LESSON="$(python3 "$HOOKS_PHYS_DIR/_helpers/jit_recall.py" "$DB" "$FILE_PATH" 2>/dev/null || true)"
|
|
58
|
+
if [[ -n "$LESSON" ]]; then
|
|
59
|
+
: > "$MARKER" 2>/dev/null || true
|
|
60
|
+
printf 'warning: 🧠 [recall] past lesson for this file — %s\n' "$LESSON" >&2
|
|
61
|
+
cos_log_hook jit-recall warn || true
|
|
62
|
+
exit 0
|
|
63
|
+
fi
|
|
64
|
+
cos_log_hook jit-recall ok || true
|
|
65
|
+
exit 0
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# link-commit-to-task.sh (PostToolUse Bash) — after a real `git commit`, append
|
|
3
|
+
# the new HEAD sha + subject to the active task's Work Log, so cos_task_history
|
|
4
|
+
# surfaces the CODE commits, not just the commits that touched the task .md
|
|
5
|
+
# (TASK-273). cos_task_history::_git_commits_from_worklog greps the work log for
|
|
6
|
+
# 7-40 hex SHAs and links them, so recording the sha here is the whole contract.
|
|
7
|
+
#
|
|
8
|
+
# Fire-and-forget: dedups by sha, fail-open (exit 0) on any error, never blocks.
|
|
9
|
+
# Claude-only in practice (Codex lacks reliable PostToolUse delivery; it records
|
|
10
|
+
# commits via cos_work_log_append explicitly).
|
|
11
|
+
set -eu # NOT -o pipefail — tolerate soft failures.
|
|
12
|
+
source "$(dirname "$0")/cos-env.sh" 2>/dev/null || true
|
|
13
|
+
if ! command -v cos_log_hook >/dev/null 2>&1; then cos_log_hook() { :; }; fi
|
|
14
|
+
|
|
15
|
+
cos_log_hook "link-commit-to-task" "entry" 2>/dev/null || true
|
|
16
|
+
|
|
17
|
+
payload="$(cos_read_stdin_bounded 5)"
|
|
18
|
+
|
|
19
|
+
# Fast-path: this hook fires on EVERY Bash command, so the common (non-commit)
|
|
20
|
+
# case must cost a single string match, not two python3 spawns. If the raw
|
|
21
|
+
# payload doesn't even mention a commit, bail before parsing.
|
|
22
|
+
case "$payload" in
|
|
23
|
+
*"git commit"*) ;;
|
|
24
|
+
*) exit 0 ;;
|
|
25
|
+
esac
|
|
26
|
+
|
|
27
|
+
# Parse tool_name + command + the sha THIS command minted, in one spawn.
|
|
28
|
+
# The sha comes from the git output line "[branch abc1234] subject" inside
|
|
29
|
+
# tool_response — never from a bare rev-parse HEAD: under concurrent
|
|
30
|
+
# sessions HEAD is whoever committed last, and the old HEAD read cross-
|
|
31
|
+
# linked sibling sessions' commits (TASK-340 repro, 2026-06-10 15:59).
|
|
32
|
+
mapfile -t _parsed < <(echo "$payload" | python3 -c '
|
|
33
|
+
import json, re, sys
|
|
34
|
+
try:
|
|
35
|
+
d = json.load(sys.stdin)
|
|
36
|
+
ti = d.get("tool_input", {}) or {}
|
|
37
|
+
tr = d.get("tool_response", "") or ""
|
|
38
|
+
if isinstance(tr, dict):
|
|
39
|
+
out = " ".join(str(tr.get(k, "") or "") for k in ("stdout", "output", "stderr"))
|
|
40
|
+
else:
|
|
41
|
+
out = str(tr)
|
|
42
|
+
m = re.search(r"\[[^]\n]+ ([0-9a-f]{7,40})\]", out)
|
|
43
|
+
print(d.get("tool_name", ""))
|
|
44
|
+
print((ti.get("command", "") or "").replace("\n", " "))
|
|
45
|
+
print(m.group(1) if m else "")
|
|
46
|
+
except Exception:
|
|
47
|
+
print(""); print(""); print("")
|
|
48
|
+
' 2>/dev/null)
|
|
49
|
+
tool_name="${_parsed[0]:-}"
|
|
50
|
+
command="${_parsed[1]:-}"
|
|
51
|
+
sha="${_parsed[2]:-}"
|
|
52
|
+
|
|
53
|
+
[[ "$tool_name" == "Bash" ]] || exit 0
|
|
54
|
+
case "$command" in
|
|
55
|
+
*"git commit"*) ;;
|
|
56
|
+
*) exit 0 ;;
|
|
57
|
+
esac
|
|
58
|
+
# A dry-run / help invocation creates no commit — don't link the prior HEAD.
|
|
59
|
+
case "$command" in
|
|
60
|
+
*--dry-run*|*--help*) exit 0 ;;
|
|
61
|
+
esac
|
|
62
|
+
|
|
63
|
+
# Upgrade panel resolution from the payload's session_id — env-derived
|
|
64
|
+
# COS_PANEL_DIR can be a ppid-* fallback that misses this panel's state.
|
|
65
|
+
cos_panel_upgrade_from_payload "$payload" 2>/dev/null || true
|
|
66
|
+
|
|
67
|
+
# Resolve active task (panel-first: .task-current is per-panel) and verify
|
|
68
|
+
# OWNERSHIP: write-state.sh stamps "<session-id> <value>"; a marker stamped
|
|
69
|
+
# by a different session is another panel's fossil — linking to it would
|
|
70
|
+
# attribute this commit to a task this session never started.
|
|
71
|
+
task_current_file="${COS_PANEL_DIR:-${COS_AGENT_DIR:-.coding-os/claude}}/.task-current"
|
|
72
|
+
[[ -f "$task_current_file" ]] || exit 0
|
|
73
|
+
task_line="$(head -n 1 "$task_current_file" 2>/dev/null || true)"
|
|
74
|
+
owner="${task_line%% *}"
|
|
75
|
+
case "$owner" in
|
|
76
|
+
ses-*|ppid-*)
|
|
77
|
+
current_session="$(cos_current_session 2>/dev/null || true)"
|
|
78
|
+
[[ -n "$current_session" && "$owner" == "$current_session" ]] || exit 0
|
|
79
|
+
;;
|
|
80
|
+
esac
|
|
81
|
+
task_id="$(echo "$task_line" | grep -oE 'TASK-([A-Z][A-Z0-9]*-)?[0-9]+' | head -1 || true)"
|
|
82
|
+
[[ -n "$task_id" ]] || exit 0
|
|
83
|
+
|
|
84
|
+
root="${COS_PROJECT_ROOT:-$PWD}"
|
|
85
|
+
if [[ -z "$sha" ]]; then
|
|
86
|
+
# Output was piped/filtered (e.g. `git commit … | tail -1`) so the
|
|
87
|
+
# "[branch sha]" line is gone. Safe fallback: the single commit minted
|
|
88
|
+
# recently — 5 min because this repo's pre/post-commit hook suite can
|
|
89
|
+
# hold the Bash call for minutes after the object lands. Two or more
|
|
90
|
+
# candidates = a sibling session is also committing — skip rather than
|
|
91
|
+
# guess (a missing link beats a wrong one).
|
|
92
|
+
mapfile -t _recent < <(git -C "$root" log --format='%h' --since='5 minutes ago' -n 2 2>/dev/null || true)
|
|
93
|
+
[[ ${#_recent[@]} -eq 1 && -n "${_recent[0]:-}" ]] || exit 0
|
|
94
|
+
sha="${_recent[0]}"
|
|
95
|
+
fi
|
|
96
|
+
sha="$(git -C "$root" rev-parse --short=10 "$sha" 2>/dev/null || true)"
|
|
97
|
+
[[ -n "$sha" ]] || exit 0
|
|
98
|
+
subject="$(git -C "$root" log -1 --format=%s "$sha" 2>/dev/null || true)"
|
|
99
|
+
|
|
100
|
+
# Dedup: skip when this commit is already in the task's Work Log. Match a
|
|
101
|
+
# 7-char prefix so an entry the git post-commit hook (TASK-175) wrote with a
|
|
102
|
+
# shorter `--short` sha is still recognised — avoids a double link.
|
|
103
|
+
task_file="$(ls "$root"/docs/tasks/"${task_id}"-*.md 2>/dev/null | head -1 || true)"
|
|
104
|
+
if [[ -n "$task_file" ]] && grep -q "${sha:0:7}" "$task_file" 2>/dev/null; then
|
|
105
|
+
exit 0
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
summary="commit ${sha} — ${subject}"
|
|
109
|
+
summary="${summary:0:120}"
|
|
110
|
+
|
|
111
|
+
# bash 5.3.9 deadlocks `python3 - <<HEREDOC`; reuse _helpers/work_log_append.py.
|
|
112
|
+
_src="${BASH_SOURCE[0]}"
|
|
113
|
+
while [ -L "$_src" ]; do
|
|
114
|
+
_dir="$(cd -P "$(dirname "$_src")" && pwd)"
|
|
115
|
+
_src="$(readlink "$_src")"
|
|
116
|
+
[[ "$_src" != /* ]] && _src="$_dir/$_src"
|
|
117
|
+
done
|
|
118
|
+
HSRC="$(cd -P "$(dirname "$_src")" && pwd)"
|
|
119
|
+
unset _src _dir
|
|
120
|
+
# COS_WORKLOG_HELPER override keeps the append mechanism stubbable in tests
|
|
121
|
+
# (same seam as the git post-commit body, src/scripts/_post_commit_body.sh).
|
|
122
|
+
# SYNCHRONOUS on purpose: a `… &` here can die with the hook process before
|
|
123
|
+
# the append lands — the "linked" log line lied while the Work Log stayed
|
|
124
|
+
# empty (TASK-340). Locking lives inside the helper (fcntl — flock(1) does
|
|
125
|
+
# not exist on macOS); the append costs ms and commits are infrequent.
|
|
126
|
+
HELPER="${COS_WORKLOG_HELPER:-${HSRC}/_helpers/work_log_append.py}"
|
|
127
|
+
linked="false"
|
|
128
|
+
if [[ -f "$HELPER" ]]; then
|
|
129
|
+
if COS_PROJECT_ROOT="${COS_PROJECT_ROOT:-$PWD}" \
|
|
130
|
+
python3 "$HELPER" "$task_id" "$summary" >/dev/null 2>&1; then
|
|
131
|
+
linked="true"
|
|
132
|
+
fi
|
|
133
|
+
fi
|
|
134
|
+
if [[ "$linked" != "true" ]]; then
|
|
135
|
+
cos_log_hook "link-commit-to-task" "append-failed ${sha}" 2>/dev/null || true
|
|
136
|
+
exit 0
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
cos_log_hook "link-commit-to-task" "linked ${sha}" 2>/dev/null || true
|
|
140
|
+
cos_record_activity worklog "commit ${sha} ${task_id}" 2>/dev/null || true
|
|
141
|
+
printf '%s' "{\"systemMessage\":\"[worklog] commit ${sha} → ${task_id}\"}"
|
|
142
|
+
|
|
143
|
+
exit 0
|
core/hooks/lint-task.sh
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# PostToolUse: Rule 15 — tasks are pointers, not specs.
|
|
3
|
+
# Warns task bodies > 1.5k tokens; blocks > 3k tokens.
|
|
4
|
+
# Token estimate: word_count * 1.3.
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
source "$(dirname "$0")/cos-env.sh" 2>/dev/null || true
|
|
8
|
+
if ! command -v cos_log_hook >/dev/null 2>&1; then cos_log_hook() { :; }; fi
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
cos_log_hook "lint-task" "entry" 2>/dev/null || true
|
|
12
|
+
|
|
13
|
+
payload="$(cos_read_stdin_bounded 5)"
|
|
14
|
+
file_path="$(echo "$payload" | python3 -c '
|
|
15
|
+
import json, sys
|
|
16
|
+
try:
|
|
17
|
+
print(json.load(sys.stdin).get("tool_input", {}).get("file_path", ""))
|
|
18
|
+
except Exception:
|
|
19
|
+
print("")
|
|
20
|
+
' 2>/dev/null || echo "")"
|
|
21
|
+
|
|
22
|
+
if [[ "$file_path" != *"docs/tasks/"*.md ]] || [[ ! -f "$file_path" ]]; then
|
|
23
|
+
exit 0
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
# Estimate tokens = words × 1.3
|
|
27
|
+
word_count=$(wc -w < "$file_path" 2>/dev/null || echo 0)
|
|
28
|
+
tokens=$(( word_count * 13 / 10 ))
|
|
29
|
+
|
|
30
|
+
if (( tokens >= 3000 )); then
|
|
31
|
+
echo "ERROR lint-task: $file_path is ~${tokens} tokens (cap 3000)." >&2
|
|
32
|
+
echo " Rule 15: tasks are pointers, not specs. Link to docs; don't inline." >&2
|
|
33
|
+
exit 2
|
|
34
|
+
elif (( tokens >= 1500 )); then
|
|
35
|
+
echo "WARN lint-task: $file_path is ~${tokens} tokens (soft limit 1500)." >&2
|
|
36
|
+
echo " Consider moving content to a doc + linking (Rule 15)." >&2
|
|
37
|
+
fi
|
|
38
|
+
|
|
39
|
+
cos_log_hook "lint-task" "ok tokens=$tokens" 2>/dev/null || true
|
|
40
|
+
exit 0
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# UserPromptSubmit hook — Docs-first nudge.
|
|
3
|
+
#
|
|
4
|
+
# Purpose: When the user's prompt looks like a code-edit intent (refactor,
|
|
5
|
+
# rename, fix bug, add feature, change function, etc.) AND the session has
|
|
6
|
+
# no .doc-anchor populated yet, surface a one-line additional-context block
|
|
7
|
+
# telling the agent: docs are SSOT, locate the doc first via
|
|
8
|
+
# cos_doc_search / cos_doc_header before touching code.
|
|
9
|
+
#
|
|
10
|
+
# Closes the gap where enforce-doc-anchor.sh fires only on Write/Edit but
|
|
11
|
+
# the user-prompt phase already signals intent — agents that get the nudge
|
|
12
|
+
# at prompt time avoid the BLOCK at edit time.
|
|
13
|
+
#
|
|
14
|
+
# Debounced per session via marker file. Always exits 0.
|
|
15
|
+
# Bilingual: matches both English + Persian intent patterns.
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
source "$(dirname "$0")/cos-env.sh" 2>/dev/null || true
|
|
19
|
+
if ! command -v cos_log_hook >/dev/null 2>&1; then cos_log_hook() { :; }; fi
|
|
20
|
+
|
|
21
|
+
INPUT="$(cos_read_stdin_bounded 2)"
|
|
22
|
+
PROMPT=$(echo "$INPUT" | jq -r '.prompt // empty' 2>/dev/null || echo "")
|
|
23
|
+
|
|
24
|
+
LEN=${#PROMPT}
|
|
25
|
+
if [[ "$LEN" -lt 15 ]]; then
|
|
26
|
+
exit 0
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
# Session-scoped debounce — one nudge per session is enough.
|
|
30
|
+
MARKER="${COS_PANEL_DIR:-$COS_AGENT_DIR}/.docs-first-nudged" # panel-first: matches session-context panel-scope clear
|
|
31
|
+
if [[ -f "$MARKER" ]]; then
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# If the doc-anchor already exists for this session, the agent has already
|
|
36
|
+
# done the right thing — skip silently.
|
|
37
|
+
ANCHOR="${COS_PANEL_DIR:-$COS_AGENT_DIR}/.doc-anchor" # panel-first: write-state routes .doc-anchor to the panel dir
|
|
38
|
+
if [[ -f "$ANCHOR" ]] && [[ -s "$ANCHOR" ]]; then
|
|
39
|
+
exit 0
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
# Skip if task-mode marker says this is a query / chore / adhoc — those
|
|
43
|
+
# bypass the doc-anchor requirement anyway.
|
|
44
|
+
MODE_FILE="${COS_PANEL_DIR:-$COS_AGENT_DIR}/.task-mode" # panel-first: .task-mode is per-panel
|
|
45
|
+
if [[ -f "$MODE_FILE" ]]; then
|
|
46
|
+
MODE=$(cat "$MODE_FILE" 2>/dev/null | head -1 | tr -d '[:space:]')
|
|
47
|
+
case "$MODE" in
|
|
48
|
+
query|chore|adhoc) exit 0 ;;
|
|
49
|
+
esac
|
|
50
|
+
fi
|
|
51
|
+
|
|
52
|
+
# Lowercase prompt for matching.
|
|
53
|
+
PL=$(printf '%s' "$PROMPT" | tr '[:upper:]' '[:lower:]')
|
|
54
|
+
|
|
55
|
+
# Code-edit intent patterns (English). Conservative: only fire on
|
|
56
|
+
# unambiguous mutation verbs paired with code targets. Asking a question
|
|
57
|
+
# or reading code does NOT trigger.
|
|
58
|
+
CODE_INTENT_RE='(\b(refactor|rename|implement|add|fix|change|modify|update|extend|patch|migrate|replace|remove|delete|introduce|wire|integrate)\b.*\b(function|method|class|module|endpoint|route|handler|component|hook|tool|test|adapter|skill|api|schema|migration|config)\b)|(\.(py|ts|tsx|go|js|jsx|rs|sh)\b)'
|
|
59
|
+
|
|
60
|
+
if ! printf '%s' "$PL" | grep -qE "$CODE_INTENT_RE" 2>/dev/null; then
|
|
61
|
+
exit 0
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
cos_log_hook nudge-docs-first fire "len=${LEN}"
|
|
65
|
+
touch "$MARKER" 2>/dev/null || true
|
|
66
|
+
|
|
67
|
+
CONTEXT="[docs-first] Code-edit intent detected — docs are SSOT (Rule 0 + 19). BEFORE touching code: (1) cos_doc_search \"<topic>\" or cos_doc_header(path) to locate the spec, (2) read it, (3) record the anchor: write-state.sh .doc-anchor \"<doc-path> § <section>\". Procedure: docs/governance/docs-first-protocol.md."
|
|
68
|
+
|
|
69
|
+
printf '%s' "{\"hookSpecificOutput\":{\"hookEventName\":\"UserPromptSubmit\",\"additionalContext\":$(printf '%s' "$CONTEXT" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))')}}"
|
|
70
|
+
|
|
71
|
+
exit 0
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# UserPromptSubmit hook — pr-mode directive injector (TASK-615).
|
|
3
|
+
#
|
|
4
|
+
# Config propagation is reactive: nothing tells the agent the project runs
|
|
5
|
+
# pr-mode — it only finds out when block-shared-tree-edit BLOCKs its first
|
|
6
|
+
# shared-tree edit, and a mid-session toggle flip changes the rails with no
|
|
7
|
+
# warning. When COS_GIT_WORKFLOW=pr, inject a ONE-LINE directive (once per
|
|
8
|
+
# session) so the agent starts with `cos pr open` and edits inside the
|
|
9
|
+
# worktree. Trunk (default) = silent exit before any output: zero injected
|
|
10
|
+
# tokens, zero behavior change. Fail-open: never blocks a prompt.
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
source "$(dirname "$0")/cos-env.sh" 2>/dev/null || true
|
|
14
|
+
if ! command -v cos_log_hook >/dev/null 2>&1; then cos_log_hook() { :; }; fi
|
|
15
|
+
|
|
16
|
+
[[ "${COS_GIT_WORKFLOW:-trunk}" == "pr" ]] || exit 0
|
|
17
|
+
|
|
18
|
+
# Once per session — same marker family as the other nudges; the panel dir is
|
|
19
|
+
# session-scoped (cleared at SessionStart) so a new session re-injects once.
|
|
20
|
+
MARKER="${COS_PANEL_DIR:-$COS_AGENT_DIR}/.git-mode-nudged"
|
|
21
|
+
[[ -f "$MARKER" ]] && exit 0
|
|
22
|
+
touch "$MARKER" 2>/dev/null || true
|
|
23
|
+
|
|
24
|
+
CONTEXT="[pr-mode ON] This project's git workflow is pr (COS_GIT_WORKFLOW=pr): do NOT edit the shared checkout — start with 'cos pr open' (or --adhoc), work INSIDE the worktree, then 'cos pr submit' and drive CI with Skill pr-mode-driver. Direct edits/commits to the shared tree are branch-guard / block-shared-tree-edit BLOCKed. Contract: docs/playbooks/pr-workflow.md"
|
|
25
|
+
|
|
26
|
+
cos_log_hook nudge-git-mode ok || true
|
|
27
|
+
printf '%s' "{\"hookSpecificOutput\":{\"hookEventName\":\"UserPromptSubmit\",\"additionalContext\":$(printf '%s' "$CONTEXT" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))')}}"
|
|
28
|
+
|
|
29
|
+
exit 0
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# UserPromptSubmit hook — heuristic graph_os discovery nudge.
|
|
3
|
+
#
|
|
4
|
+
# Purpose: Surface the right cos_graph_* tool when the prompt asks a
|
|
5
|
+
# structural question (callers, blast radius, rename, contracts, trace,
|
|
6
|
+
# similarity, cycles, dead-code, test-gaps, centrality, ranking) OR a
|
|
7
|
+
# conceptual "how does X work / explain / what is" question. Closes the
|
|
8
|
+
# dogfood gap where the agent never reaches the graph layer because no
|
|
9
|
+
# other hook surfaces it — the conceptual case is the one that used to
|
|
10
|
+
# fall through to silence and let the agent default to memory.
|
|
11
|
+
#
|
|
12
|
+
# Debounced per session via marker file. Always exits 0.
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
source "$(dirname "$0")/cos-env.sh" 2>/dev/null || true
|
|
16
|
+
if ! command -v cos_log_hook >/dev/null 2>&1; then cos_log_hook() { :; }; fi
|
|
17
|
+
|
|
18
|
+
INPUT="$(cos_read_stdin_bounded 2)"
|
|
19
|
+
PROMPT=$(echo "$INPUT" | jq -r '.prompt // empty' 2>/dev/null || echo "")
|
|
20
|
+
|
|
21
|
+
LEN=${#PROMPT}
|
|
22
|
+
if [[ "$LEN" -lt 15 ]]; then
|
|
23
|
+
exit 0
|
|
24
|
+
fi
|
|
25
|
+
|
|
26
|
+
# Per-pattern marker — different structural questions get different
|
|
27
|
+
# nudges. Same pattern asked twice in one session stays silent.
|
|
28
|
+
MARKER_DIR="${COS_PANEL_DIR:-$COS_AGENT_DIR}/.graph-nudge" # panel-first: cleared at panel scope each SessionStart
|
|
29
|
+
mkdir -p "$MARKER_DIR" 2>/dev/null || true
|
|
30
|
+
|
|
31
|
+
# Lowercase, whitespace-collapsed for matching.
|
|
32
|
+
PL=$(printf '%s' "$PROMPT" | tr '[:upper:]' '[:lower:]')
|
|
33
|
+
|
|
34
|
+
# Each pattern → recommended cos_graph_* tool. First match wins, so
|
|
35
|
+
# more-specific patterns come BEFORE more-generic siblings (e.g.
|
|
36
|
+
# detect_changes before impact, doctor before export).
|
|
37
|
+
# English structural-question patterns (English-default pre-classifier).
|
|
38
|
+
declare -a PATTERNS=(
|
|
39
|
+
# graph health / why empty / why broken — must precede generic graph words
|
|
40
|
+
"graph (is |seems |looks |went )?(empty|broken|stale|down|dead)|why .* graph|graph health:cos_graph_doctor"
|
|
41
|
+
# detect changes / pre-commit / diff impact / what did i change — before impact
|
|
42
|
+
"pre.?commit|what did i change|diff impact|since last commit|impact of (my )?change|recent change|recent commit:cos_graph_detect_changes"
|
|
43
|
+
# diff of a git range / PR review — before impact, after detect_changes
|
|
44
|
+
"diff between|compare .* (commit|branch|ref|sha)|pr review|review (the )?(pr|diff|range)|blast radius of (the )?(pr|diff):cos_graph_diff"
|
|
45
|
+
# rename — rename_plan
|
|
46
|
+
"rename|renaming|rename plan:cos_graph_rename_plan"
|
|
47
|
+
# symbol DEFINITION lookup ("defined", not "called") — before references
|
|
48
|
+
"where (is|are) .* defined|defined where|find (the )?(symbol|function|class|method)|symbol named|function named|class named:cos_graph_query"
|
|
49
|
+
# who calls / references / used by — references
|
|
50
|
+
"who calls|who uses|where (is|are) .* (called|used|referenced)|callers of|references to|used by|^references|usages|call.?sites?:cos_graph_references"
|
|
51
|
+
# blast radius / impact / what breaks — impact
|
|
52
|
+
"blast radius|impact|what breaks|what will break|downstream|upstream|affected:cos_graph_impact"
|
|
53
|
+
# circular dependencies / cycles / SCC
|
|
54
|
+
"circular (dependency|dependencies|import|imports)|dependency cycle|cyclic|import cycle|\\bscc\\b:cos_graph_cycles"
|
|
55
|
+
# dead / unused / unreferenced code
|
|
56
|
+
"dead code|unused (code|function|symbol)|unreferenced|never (called|used)|can i (delete|remove)|safe to (delete|remove):cos_graph_dead_code"
|
|
57
|
+
# test coverage gaps / untested
|
|
58
|
+
"test gap|test coverage|untested|missing tests|coverage gap|not tested|lacks tests:cos_graph_test_gap"
|
|
59
|
+
# most-connected / hub / chokepoint — centrality
|
|
60
|
+
"most connected|chokepoint|bottleneck node|hub node|central node|centrality:cos_graph_centrality"
|
|
61
|
+
# importance ranking / pagerank
|
|
62
|
+
"most important|importance ranking|pagerank|rank .* by importance|key files:cos_graph_ranking"
|
|
63
|
+
# contracts / api surface / endpoints / mcp tools
|
|
64
|
+
"api surface|all endpoints|all routes|all mcp tools|all handlers|contract surface:cos_graph_contracts"
|
|
65
|
+
# trace / data flow / execution path — before path (trace pattern is more
|
|
66
|
+
# explicit; "from X to Y" appears in both, so put trace first when the
|
|
67
|
+
# word "trace" or "execution path" or "data flow" is present)
|
|
68
|
+
"^trace |trace the |trace .* execution|execution path|data flow|how does .* flow|step.?by.?step from:cos_graph_trace"
|
|
69
|
+
# path between / shortest / how connected
|
|
70
|
+
"shortest path|path from .* to|path between|how .* connected|how .* reach:cos_graph_path"
|
|
71
|
+
# similar / duplicate / near-clone
|
|
72
|
+
"similar|near.?duplicate|clone|equivalent|like .* but:cos_graph_similar"
|
|
73
|
+
# subsystems / clusters / communities / map of
|
|
74
|
+
"subsystem|cluster|community|map of|architecture map|onboard:cos_graph_communities"
|
|
75
|
+
# context / surrounding / depend on this
|
|
76
|
+
"context around|surrounding|neighbour|neighbor|depend on this|surrounding context:cos_graph_context"
|
|
77
|
+
# entry points / where does it start
|
|
78
|
+
"entry point|where does .* start|main entry|how do users:cos_graph_entrypoints"
|
|
79
|
+
# resolve a label / path / partial id to a canonical uid
|
|
80
|
+
"canonical uid|resolve .* to .* uid|which uid|partial uid:cos_graph_resolve"
|
|
81
|
+
# diagram / mermaid / dot
|
|
82
|
+
"diagram|mermaid|dot graph|visualize:cos_graph_export"
|
|
83
|
+
# CONCEPTUAL "how does X work / explain / what is / overview" — GENERIC,
|
|
84
|
+
# placed LAST so every specific structural pattern wins first. This is the
|
|
85
|
+
# case that used to fall through to silence (and the agent defaulted to
|
|
86
|
+
# memory). Route it to free-text code search; codebase-explorer is the
|
|
87
|
+
# paired skill for end-to-end conceptual reading.
|
|
88
|
+
"how (does|do|is|are) .*(work|works|implemented|structured|organi[sz]ed)|^explain |^what is |overview of|walk me through|understand (how|the):cos_graph_search"
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
MATCHED_TOOL=""
|
|
92
|
+
for entry in "${PATTERNS[@]}"; do
|
|
93
|
+
re="${entry%:*}"
|
|
94
|
+
tool="${entry##*:}"
|
|
95
|
+
if printf '%s' "$PL" | grep -qE "$re" 2>/dev/null; then
|
|
96
|
+
MATCHED_TOOL="$tool"
|
|
97
|
+
break
|
|
98
|
+
fi
|
|
99
|
+
done
|
|
100
|
+
|
|
101
|
+
if [[ -z "$MATCHED_TOOL" ]]; then
|
|
102
|
+
exit 0
|
|
103
|
+
fi
|
|
104
|
+
|
|
105
|
+
# Per-pattern debounce — silent only if THIS specific tool already
|
|
106
|
+
# nudged in this session. New structural pattern → new nudge.
|
|
107
|
+
PATTERN_MARKER="${MARKER_DIR}/${MATCHED_TOOL}"
|
|
108
|
+
if [[ -f "$PATTERN_MARKER" ]]; then
|
|
109
|
+
exit 0
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
cos_log_hook nudge-graph-os fire "tool=${MATCHED_TOOL} len=${LEN}"
|
|
113
|
+
touch "$PATTERN_MARKER" 2>/dev/null || true
|
|
114
|
+
|
|
115
|
+
CONTEXT="[graph_os nudge] Structural/conceptual code question detected — call ${MATCHED_TOOL} BEFORE Read/grep (for end-to-end conceptual reading, the codebase-explorer skill pairs with it). The graph is the code retrieval layer; one envelope (~300 tok) replaces 5–10 file reads. See docs/engineering/graph-hallucination-cures.md."
|
|
116
|
+
printf '%s' "{\"hookSpecificOutput\":{\"hookEventName\":\"UserPromptSubmit\",\"additionalContext\":$(printf '%s' "$CONTEXT" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))')}}"
|
|
117
|
+
|
|
118
|
+
exit 0
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# nudge-learn-narrative.sh (Phase O) — Stop hook (the C path).
|
|
3
|
+
#
|
|
4
|
+
# When a session shows REAL learning signal (a file reworked >=3x, or a
|
|
5
|
+
# backtrack), nudge the agent ONCE to record a structured lesson via
|
|
6
|
+
# cos_learn_narrative (→ docs/insights/ + memory) — the channel for the deep
|
|
7
|
+
# engineering knowledge that auto-mining (friction/commit subjects) can't capture.
|
|
8
|
+
# Signal-gated (silent on trivial sessions), debounced once per session,
|
|
9
|
+
# warn-only, fail-open (Stop never blocks). Contract: docs/engineering/learning-extraction.md.
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
|
|
12
|
+
source "$(dirname "$0")/cos-env.sh" 2>/dev/null || true
|
|
13
|
+
if ! command -v cos_log_hook >/dev/null 2>&1; then cos_log_hook() { :; }; fi
|
|
14
|
+
|
|
15
|
+
cos_log_hook nudge-learn-narrative enter || true
|
|
16
|
+
|
|
17
|
+
SESSION="$(cos_current_session 2>/dev/null || echo "")"
|
|
18
|
+
[[ -z "$SESSION" || "$SESSION" == "?" ]] && exit 0
|
|
19
|
+
|
|
20
|
+
# Debounce once per session (per-panel marker, session-tail keyed).
|
|
21
|
+
MARKER="${COS_PANEL_DIR:-${COS_AGENT_DIR:-.coding-os}}/.narrative-nudged-${SESSION##*-}"
|
|
22
|
+
[[ -f "$MARKER" ]] && exit 0
|
|
23
|
+
|
|
24
|
+
DB="${COS_DB_PATH:-${COS_STATE_DIR:-.coding-os}/coding-os.db}"
|
|
25
|
+
[[ -f "$DB" ]] || exit 0
|
|
26
|
+
|
|
27
|
+
REASON="$(python3 "$(dirname "$0")/_helpers/narrative_signal.py" "$DB" "$SESSION" 2>/dev/null || true)"
|
|
28
|
+
if [[ -n "$REASON" ]]; then
|
|
29
|
+
: > "$MARKER" 2>/dev/null || true
|
|
30
|
+
printf 'warning: 🧠 [learn] This session hit real friction (%s). If you solved something non-obvious, record ONE lesson so a future session reuses it:\n' "$REASON" >&2
|
|
31
|
+
printf ' cos_learn_narrative(task_id, what_failed, what_worked, key_insight) — files to docs/insights/ + memory. Be specific (situation -> why -> rule).\n' >&2
|
|
32
|
+
cos_log_hook nudge-learn-narrative warn || true
|
|
33
|
+
exit 0
|
|
34
|
+
fi
|
|
35
|
+
cos_log_hook nudge-learn-narrative ok || true
|
|
36
|
+
exit 0
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# UserPromptSubmit hook — model-routing directive injector (TASK-319).
|
|
3
|
+
#
|
|
4
|
+
# When hub-settings.json::model_routing.enabled is true, inject a ONE-LINE
|
|
5
|
+
# directive (once per session) telling the agent to consult cos_route_model
|
|
6
|
+
# at Classify and honor it at dispatch — CLI/VSCode parity with the hub
|
|
7
|
+
# chat Auto option. Toggle off = exit silently before any output: zero
|
|
8
|
+
# injected tokens, zero behavior change. Fail-open: never blocks a prompt.
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
source "$(dirname "$0")/cos-env.sh" 2>/dev/null || true
|
|
12
|
+
if ! command -v cos_log_hook >/dev/null 2>&1; then cos_log_hook() { :; }; fi
|
|
13
|
+
|
|
14
|
+
SETTINGS_FILE="${COS_STATE_DIR:-.coding-os}/hub-settings.json"
|
|
15
|
+
[[ -f "$SETTINGS_FILE" ]] || exit 0
|
|
16
|
+
|
|
17
|
+
ENABLED=$(jq -r '.model_routing.enabled // false' "$SETTINGS_FILE" 2>/dev/null || echo "false")
|
|
18
|
+
[[ "$ENABLED" == "true" ]] || exit 0
|
|
19
|
+
|
|
20
|
+
# Once per session — same marker family as the other nudges; the panel dir
|
|
21
|
+
# is cleared at SessionStart so a new session re-injects exactly once.
|
|
22
|
+
MARKER="${COS_PANEL_DIR:-$COS_AGENT_DIR}/.model-routing-nudged"
|
|
23
|
+
[[ -f "$MARKER" ]] && exit 0
|
|
24
|
+
touch "$MARKER" 2>/dev/null || true
|
|
25
|
+
|
|
26
|
+
ORCH=$(jq -r '.model_routing.orchestrator_model // ""' "$SETTINGS_FILE" 2>/dev/null || echo "")
|
|
27
|
+
CONTEXT="[model-routing ON] After recording the gate (cos_classify_prompt), call cos_route_model(complexity=<gate>) and honor it at dispatch (pass model+complexity to cos_dispatch_formula_run). Cold history -> orchestrator_model '${ORCH}' (settings), else adapter default. Contract: src/core/rules/model-routing.md"
|
|
28
|
+
|
|
29
|
+
cos_log_hook nudge-model-routing ok || true
|
|
30
|
+
printf '%s' "{\"hookSpecificOutput\":{\"hookEventName\":\"UserPromptSubmit\",\"additionalContext\":$(printf '%s' "$CONTEXT" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))')}}"
|
|
31
|
+
|
|
32
|
+
exit 0
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# nudge-reentry.sh — UserPromptSubmit hook.
|
|
3
|
+
#
|
|
4
|
+
# Softly reminds the agent, once per (session, open-set), when a new prompt
|
|
5
|
+
# arrives while THIS session holds an in_progress task not bound to
|
|
6
|
+
# .task-current. Closes the re-entry blind spot the Stop-time
|
|
7
|
+
# warn-abandoned-task cannot cover — a turn that never reached Stop, or
|
|
8
|
+
# .task-current drifting from the DB (common on Codex, whose MCP task-moves
|
|
9
|
+
# fire no .task-current sync). Session-scoped (agent_session), so a sibling
|
|
10
|
+
# session's WIP never false-triggers — the board-global banner wip= count
|
|
11
|
+
# cannot make that distinction. Fail-open: emits one additionalContext line
|
|
12
|
+
# and exits 0, never blocks. Debounced per (session, in_progress-set).
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
|
|
15
|
+
source "$(dirname "$0")/cos-env.sh" 2>/dev/null || true
|
|
16
|
+
if ! command -v cos_log_hook >/dev/null 2>&1; then cos_log_hook() { :; }; fi
|
|
17
|
+
|
|
18
|
+
cos_log_hook nudge-reentry enter || true
|
|
19
|
+
|
|
20
|
+
[ -f "${COS_DB_PATH:-}" ] || exit 0
|
|
21
|
+
command -v sqlite3 >/dev/null 2>&1 || exit 0
|
|
22
|
+
|
|
23
|
+
# Upgrade panel id from the payload so $COS_SESSION_FILE / $COS_PANEL_DIR
|
|
24
|
+
# resolve THIS panel; fall back to stdin session_id then legacy agent-dir.
|
|
25
|
+
INPUT="$(cos_read_stdin_bounded 2 2>/dev/null || true)"
|
|
26
|
+
command -v cos_panel_upgrade_from_payload >/dev/null 2>&1 && cos_panel_upgrade_from_payload "$INPUT" 2>/dev/null || true
|
|
27
|
+
SESSION_ID="$(cat "${COS_SESSION_FILE:-}" 2>/dev/null || true)"
|
|
28
|
+
if [ -z "$SESSION_ID" ] && [ -n "$INPUT" ] && command -v jq >/dev/null 2>&1; then
|
|
29
|
+
SESSION_ID=$(printf '%s' "$INPUT" | jq -r '.session_id // .sessionId // empty' 2>/dev/null || true)
|
|
30
|
+
fi
|
|
31
|
+
if [ -z "$SESSION_ID" ] && [ -f "${COS_AGENT_DIR}/session-id" ]; then
|
|
32
|
+
SESSION_ID=$(cat "${COS_AGENT_DIR}/session-id" 2>/dev/null || true)
|
|
33
|
+
fi
|
|
34
|
+
[ -n "$SESSION_ID" ] || exit 0
|
|
35
|
+
# Session-id is alnum + dash only; reject anything else before it reaches SQL.
|
|
36
|
+
case "$SESSION_ID" in
|
|
37
|
+
*[!A-Za-z0-9-]*) exit 0 ;;
|
|
38
|
+
esac
|
|
39
|
+
|
|
40
|
+
# in_progress tasks owned by THIS session. `testing` is excluded — it is a
|
|
41
|
+
# legitimate parked state (verification running) that .task-current may not
|
|
42
|
+
# point at, so only actively-owned in_progress work counts as "unbound".
|
|
43
|
+
OPEN="$(sqlite3 "$COS_DB_PATH" \
|
|
44
|
+
"SELECT group_concat(task_id, ',') FROM tasks
|
|
45
|
+
WHERE status = 'in_progress' AND agent_session = '$SESSION_ID';" \
|
|
46
|
+
2>/dev/null || true)"
|
|
47
|
+
[ -n "$OPEN" ] || exit 0
|
|
48
|
+
|
|
49
|
+
# Bound task marker (panel-first, matching session-context's TASK_CUR read).
|
|
50
|
+
# write-state.sh prefixes a session id ("<sid> <task>"), so take the LAST
|
|
51
|
+
# whitespace field — a raw cat|head -c 32 only ever saw the 31-char sid and
|
|
52
|
+
# made this bound-check dead code in production.
|
|
53
|
+
TASK_CUR="$(awk '{print $NF}' "${COS_PANEL_DIR:-$COS_AGENT_DIR}/.task-current" 2>/dev/null | head -1 || true)"
|
|
54
|
+
[ -n "$TASK_CUR" ] || TASK_CUR="$(awk '{print $NF}' "${COS_AGENT_DIR}/.task-current" 2>/dev/null | head -1 || true)"
|
|
55
|
+
TASK_CUR="$(printf '%s' "$TASK_CUR" | tr -d '\n\r' | head -c 32)"
|
|
56
|
+
|
|
57
|
+
# Bound iff .task-current names one of the session's in_progress tasks. When it
|
|
58
|
+
# does, the agent is correctly re-entered — stay silent.
|
|
59
|
+
case ",$OPEN," in
|
|
60
|
+
*",$TASK_CUR,"*) [ -n "$TASK_CUR" ] && exit 0 ;;
|
|
61
|
+
esac
|
|
62
|
+
|
|
63
|
+
# A task bound in a LIVE sibling panel is actively driven there — drop it from
|
|
64
|
+
# this panel's nudge set. Two panels can share one session id (resumed
|
|
65
|
+
# conversation mirrors the agent-level id), and nudging the idle one about its
|
|
66
|
+
# sibling's live work invited the "rescue" parks recorded as phantom
|
|
67
|
+
# NULL-reason in_progress→icebox reverts. Real strands still nudge.
|
|
68
|
+
if command -v cos_task_bound_in_live_sibling >/dev/null 2>&1; then
|
|
69
|
+
KEEP=""
|
|
70
|
+
OLDIFS=$IFS; IFS=','
|
|
71
|
+
for t in $OPEN; do
|
|
72
|
+
[ -n "$t" ] || continue
|
|
73
|
+
if cos_task_bound_in_live_sibling "$t"; then continue; fi
|
|
74
|
+
KEEP="${KEEP:+$KEEP,}$t"
|
|
75
|
+
done
|
|
76
|
+
IFS=$OLDIFS
|
|
77
|
+
OPEN="$KEEP"
|
|
78
|
+
if [ -z "$OPEN" ]; then
|
|
79
|
+
cos_log_hook nudge-reentry skip "reason=sibling_bound" || true
|
|
80
|
+
exit 0
|
|
81
|
+
fi
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
# Debounce keyed on (session, open-set), not session alone — so the nudge
|
|
85
|
+
# re-arms when the in_progress set changes but an unchanged mismatch stays
|
|
86
|
+
# quiet (no alarm fatigue). Panel-first marker matches session-context scope.
|
|
87
|
+
MARKER="${COS_PANEL_DIR:-$COS_AGENT_DIR}/.reentry-nudged"
|
|
88
|
+
OPEN_SIG=$(printf '%s' "$OPEN" | cksum | cut -d' ' -f1)
|
|
89
|
+
DEBOUNCE_KEY="${SESSION_ID}:${OPEN_SIG}"
|
|
90
|
+
if [ -f "$MARKER" ] && grep -qF "$DEBOUNCE_KEY" "$MARKER" 2>/dev/null; then
|
|
91
|
+
exit 0
|
|
92
|
+
fi
|
|
93
|
+
echo "$DEBOUNCE_KEY" >> "$MARKER"
|
|
94
|
+
|
|
95
|
+
cos_log_hook nudge-reentry warn || true
|
|
96
|
+
MSG="[board] This session holds in_progress task(s) not bound to .task-current: ${OPEN}. Re-bind with \`cos task-start ${OPEN%%,*}\` (or park via \`cos task-move --to blocked --reason '<why>'\`) so the pulse, work-log capture, and DoD gate track the right task. Never park work you did not start this conversation."
|
|
97
|
+
printf '{"hookSpecificOutput":{"hookEventName":"UserPromptSubmit","additionalContext":%s}}\n' \
|
|
98
|
+
"$(printf '%s' "$MSG" | jq -R -s '.')"
|
|
99
|
+
|
|
100
|
+
cos_log_hook nudge-reentry ok || true
|
|
101
|
+
exit 0
|