coding-os 0.3.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- adapters/claude/README.md +6 -0
- adapters/claude/_install_helpers/extract_stacks.py +43 -0
- adapters/claude/_install_helpers/update_mcp_json.py +75 -0
- adapters/claude/adapter.yaml +164 -0
- adapters/claude/hooks/README.md +40 -0
- adapters/claude/hooks/agent_memory_sync.py +131 -0
- adapters/claude/hooks/ensure-agent-memory-link.sh +36 -0
- adapters/claude/hooks/sync-agent-memory.sh +21 -0
- adapters/claude/install.sh +86 -0
- adapters/claude/sdk_dispatcher.py +871 -0
- adapters/claude/settings.local.template.json +31 -0
- adapters/claude/settings.template.json +808 -0
- adapters/claude/update_mcp_json.py +85 -0
- adapters/codex/adapter.yaml +254 -0
- adapters/codex/chat_provider.py +230 -0
- adapters/codex/commands/formula-f1.md +129 -0
- adapters/codex/commands/formula-f10.md +100 -0
- adapters/codex/commands/formula-f11.md +123 -0
- adapters/codex/commands/formula-f2.md +139 -0
- adapters/codex/commands/formula-f3.md +127 -0
- adapters/codex/commands/formula-f4.md +101 -0
- adapters/codex/commands/formula-f5.md +135 -0
- adapters/codex/commands/formula-f6.md +147 -0
- adapters/codex/commands/formula-f7.md +111 -0
- adapters/codex/commands/formula-f8.md +133 -0
- adapters/codex/commands/formula-f9.md +112 -0
- adapters/codex/enable_codex_hooks.py +94 -0
- adapters/codex/ensure_codex_mcp.py +124 -0
- adapters/codex/hooks/codex-merge-hook-output.py +72 -0
- adapters/codex/hooks/codex-normalize-edit.py +96 -0
- adapters/codex/hooks/codex-postedit-dispatch.sh +75 -0
- adapters/codex/hooks/codex-posttool-dispatch.sh +70 -0
- adapters/codex/hooks/codex-preedit-dispatch.sh +83 -0
- adapters/codex/hooks/codex-pretool-dispatch.sh +82 -0
- adapters/codex/hooks/codex-sessionend-dispatch.sh +20 -0
- adapters/codex/hooks/codex-sessionstart-dispatch.sh +68 -0
- adapters/codex/hooks/codex-stop-dispatch.sh +73 -0
- adapters/codex/hooks/codex-userpromptsubmit-dispatch.sh +74 -0
- adapters/codex/hooks.template.json +208 -0
- adapters/codex/install.sh +83 -0
- adapters/codex/sdk_dispatcher.py +449 -0
- board_os/__init__.py +39 -0
- board_os/_agent_runtime.py +256 -0
- board_os/config.py +421 -0
- board_os/git_coherence.py +107 -0
- board_os/hub_adapter_manifest.py +140 -0
- board_os/mcp_tools.py +3228 -0
- board_os/migration.py +166 -0
- board_os/parser.py +317 -0
- board_os/presence.py +156 -0
- board_os/sync.py +320 -0
- board_os/transition_gates.py +224 -0
- board_os/transition_gates_cli.py +272 -0
- board_os/transition_gates_validator.py +551 -0
- board_os/verify_suites.py +126 -0
- board_os/verify_suites_cli.py +328 -0
- board_os/workflow.py +967 -0
- cli/__init__.py +0 -0
- cli/_data_types.py +248 -0
- cli/_init_helpers.py +587 -0
- cli/_resources.py +100 -0
- cli/adapter_registry.py +239 -0
- cli/add_stack.py +315 -0
- cli/aggregator.py +438 -0
- cli/board_commands.py +1218 -0
- cli/brain_commands.py +255 -0
- cli/cognition.py +345 -0
- cli/config_composer.py +349 -0
- cli/core_version.py +41 -0
- cli/cron_commands.py +278 -0
- cli/db_reset.py +298 -0
- cli/doc_commands.py +111 -0
- cli/doctor.py +2953 -0
- cli/doctor_board.py +365 -0
- cli/doctor_extras.py +1121 -0
- cli/doctor_graph.py +608 -0
- cli/doctor_tokens.py +254 -0
- cli/graph_commands.py +1265 -0
- cli/hook_renderer.py +393 -0
- cli/hub_commands.py +580 -0
- cli/list_adapters.py +79 -0
- cli/list_stacks.py +105 -0
- cli/logs_commands.py +89 -0
- cli/main.py +3070 -0
- cli/materialize_file.py +65 -0
- cli/mcp_start.py +153 -0
- cli/module_commands.py +513 -0
- cli/pr_commands.py +2024 -0
- cli/preset_commands.py +126 -0
- cli/preset_registry.py +171 -0
- cli/project_overrides.py +119 -0
- cli/registry.py +365 -0
- cli/remove_stack.py +492 -0
- cli/renderer.py +620 -0
- cli/setup.py +464 -0
- cli/skill_commands.py +689 -0
- cli/skill_registry.py +235 -0
- cli/skills_list.py +332 -0
- cli/stack_lint.py +351 -0
- cli/stack_registry.py +688 -0
- cli/subsystems.py +335 -0
- cli/sync_all.py +310 -0
- cli/tail_command.py +410 -0
- cli/update.py +608 -0
- cli/verify_since_edit.py +439 -0
- coding_os-0.3.2.dist-info/METADATA +508 -0
- coding_os-0.3.2.dist-info/RECORD +1304 -0
- coding_os-0.3.2.dist-info/WHEEL +5 -0
- coding_os-0.3.2.dist-info/entry_points.txt +5 -0
- coding_os-0.3.2.dist-info/licenses/LICENSE +201 -0
- coding_os-0.3.2.dist-info/top_level.txt +10 -0
- core/__init__.py +0 -0
- core/board_os/__init__.py +39 -0
- core/board_os/_agent_runtime.py +256 -0
- core/board_os/config.py +421 -0
- core/board_os/git_coherence.py +107 -0
- core/board_os/hub_adapter_manifest.py +140 -0
- core/board_os/mcp_tools.py +3228 -0
- core/board_os/migration.py +166 -0
- core/board_os/parser.py +317 -0
- core/board_os/presence.py +156 -0
- core/board_os/sync.py +320 -0
- core/board_os/transition-gates.yaml +176 -0
- core/board_os/transition_gates.py +224 -0
- core/board_os/transition_gates_cli.py +272 -0
- core/board_os/transition_gates_validator.py +551 -0
- core/board_os/verify-suites.yaml +113 -0
- core/board_os/verify_suites.py +126 -0
- core/board_os/verify_suites_cli.py +328 -0
- core/board_os/workflow.py +967 -0
- core/commands/board.md +27 -0
- core/commands/classify.md +23 -0
- core/commands/compose.md +23 -0
- core/commands/daily.md +31 -0
- core/commands/diagnose.md +7 -0
- core/commands/memory-search.md +23 -0
- core/commands/new-project.md +33 -0
- core/commands/retro.md +38 -0
- core/commands/review.md +14 -0
- core/commands/task.md +17 -0
- core/commands/verify.md +34 -0
- core/docs/thinking_os-final-edition.md +1449 -0
- core/doctor-config.yaml +74 -0
- core/graph_os/__init__.py +29 -0
- core/graph_os/backend.py +233 -0
- core/graph_os/backends/__init__.py +13 -0
- core/graph_os/backends/sqlite_backend.py +1053 -0
- core/graph_os/bench/__init__.py +17 -0
- core/graph_os/bench/fixtures.py +56 -0
- core/graph_os/bench/harness.py +95 -0
- core/graph_os/bench/persian_precision.py +142 -0
- core/graph_os/bench/scale_500k.py +120 -0
- core/graph_os/bench/token_cost.py +170 -0
- core/graph_os/bench/viewer_fps.py +110 -0
- core/graph_os/communities.py +410 -0
- core/graph_os/enterprise.py +218 -0
- core/graph_os/entry_points.py +226 -0
- core/graph_os/extractors/__init__.py +25 -0
- core/graph_os/extractors/code_generic.py +914 -0
- core/graph_os/extractors/code_go.py +1422 -0
- core/graph_os/extractors/code_json.py +340 -0
- core/graph_os/extractors/code_php.py +979 -0
- core/graph_os/extractors/code_python.py +1454 -0
- core/graph_os/extractors/code_shell.py +538 -0
- core/graph_os/extractors/code_toml.py +302 -0
- core/graph_os/extractors/code_ts.py +1665 -0
- core/graph_os/extractors/code_yaml.py +394 -0
- core/graph_os/extractors/contracts.py +1592 -0
- core/graph_os/extractors/md_links.py +890 -0
- core/graph_os/extractors/task_deps.py +345 -0
- core/graph_os/groups/__init__.py +22 -0
- core/graph_os/groups/cross_repo.py +156 -0
- core/graph_os/groups/manifest.py +141 -0
- core/graph_os/ingest/__init__.py +19 -0
- core/graph_os/ingest/base.py +306 -0
- core/graph_os/ingest/github.py +112 -0
- core/graph_os/ingest/zip.py +95 -0
- core/graph_os/toolchain.py +393 -0
- core/graph_os/tools/__init__.py +9 -0
- core/graph_os/tools/graph.py +5573 -0
- core/graph_os/tools/reindex_dispatch.py +730 -0
- core/graph_os/tree_sitter_overlay.py +235 -0
- core/graph_os/types.py +252 -0
- core/graph_os/vec_index.py +277 -0
- core/graph_os/viewer/__init__.py +12 -0
- core/graph_os/viewer/exporter.py +93 -0
- core/graph_os/viewer/template.py +189 -0
- core/hooks/_helpers/_paths.py +40 -0
- core/hooks/_helpers/advance_role.py +72 -0
- core/hooks/_helpers/auto_compose.py +228 -0
- core/hooks/_helpers/auto_validate_lessons.py +55 -0
- core/hooks/_helpers/branch_guard_check.py +796 -0
- core/hooks/_helpers/check_commit_message.py +108 -0
- core/hooks/_helpers/check_dangerous_rm.py +80 -0
- core/hooks/_helpers/check_git_bypass.py +154 -0
- core/hooks/_helpers/check_git_destructive.py +77 -0
- core/hooks/_helpers/check_settings_write.py +97 -0
- core/hooks/_helpers/consume_override.py +51 -0
- core/hooks/_helpers/context_budget.py +77 -0
- core/hooks/_helpers/cos_say_json.py +103 -0
- core/hooks/_helpers/destructive_edit_check.py +163 -0
- core/hooks/_helpers/detect_status_transition.py +82 -0
- core/hooks/_helpers/digest_regen.py +56 -0
- core/hooks/_helpers/doc_sync_check.py +498 -0
- core/hooks/_helpers/drain_embedding_outbox.py +52 -0
- core/hooks/_helpers/extract_additional_context.py +51 -0
- core/hooks/_helpers/extract_commit_msg_arg.py +74 -0
- core/hooks/_helpers/git_command_parse.py +424 -0
- core/hooks/_helpers/git_settings_fields.py +47 -0
- core/hooks/_helpers/graph_context_match.py +37 -0
- core/hooks/_helpers/graph_marker_check.py +70 -0
- core/hooks/_helpers/jit_recall.py +56 -0
- core/hooks/_helpers/json_field.py +41 -0
- core/hooks/_helpers/narrative_signal.py +59 -0
- core/hooks/_helpers/observation_count.py +31 -0
- core/hooks/_helpers/pre_commit_batch.py +177 -0
- core/hooks/_helpers/pre_commit_fake_input.py +42 -0
- core/hooks/_helpers/presence_gc.py +102 -0
- core/hooks/_helpers/presence_write.py +167 -0
- core/hooks/_helpers/recover_indirect.py +35 -0
- core/hooks/_helpers/routing_evolution.py +104 -0
- core/hooks/_helpers/session_recap.py +72 -0
- core/hooks/_helpers/skill_primer.py +229 -0
- core/hooks/_helpers/task_sync.py +59 -0
- core/hooks/_helpers/tool_failure_capture.py +147 -0
- core/hooks/_helpers/trajectory_autosnap.py +278 -0
- core/hooks/_helpers/trajectory_startup.py +62 -0
- core/hooks/_helpers/turn_summary.py +82 -0
- core/hooks/_helpers/validate_task_frontmatter.py +98 -0
- core/hooks/_helpers/wip_limit_check.py +103 -0
- core/hooks/_helpers/wip_lines.py +53 -0
- core/hooks/_helpers/work_log_append.py +89 -0
- core/hooks/_helpers/wrap_dispatch_output.py +82 -0
- core/hooks/advance-role.sh +48 -0
- core/hooks/agent-presence.sh +179 -0
- core/hooks/auto-brain-decay.sh +184 -0
- core/hooks/auto-compose-roles.sh +83 -0
- core/hooks/auto-graph-reconcile-shell.sh +119 -0
- core/hooks/auto-regen-doc-index.sh +120 -0
- core/hooks/auto-reindex-docs.sh +130 -0
- core/hooks/auto-task-sync.sh +56 -0
- core/hooks/auto-trace-rotate.sh +88 -0
- core/hooks/block-bad-patterns.sh +212 -0
- core/hooks/block-dangerous-commands.sh +182 -0
- core/hooks/block-hardcoded-literals.sh +90 -0
- core/hooks/block-migration-conflict.sh +114 -0
- core/hooks/block-protected-files.sh +129 -0
- core/hooks/block-secrets.sh +185 -0
- core/hooks/block-shared-tree-edit.sh +75 -0
- core/hooks/block-uv-heredoc.sh +78 -0
- core/hooks/branch-guard.sh +122 -0
- core/hooks/capture-observation.sh +76 -0
- core/hooks/capture-tool-failure.sh +24 -0
- core/hooks/capture-work-log.sh +89 -0
- core/hooks/check-agents-md-refs.sh +75 -0
- core/hooks/check-agents-md-size.sh +49 -0
- core/hooks/check-capture-worked.sh +148 -0
- core/hooks/check-doc-size.sh +61 -0
- core/hooks/check-mcp-extras.sh +92 -0
- core/hooks/check-state.sh +87 -0
- core/hooks/classify-task-mode.sh +103 -0
- core/hooks/cos-env.sh +1301 -0
- core/hooks/drain-embedding-outbox.sh +24 -0
- core/hooks/enforce-anti-ambiguity.sh +74 -0
- core/hooks/enforce-commit-message.sh +73 -0
- core/hooks/enforce-doc-anchor.sh +224 -0
- core/hooks/enforce-doc-sync.sh +206 -0
- core/hooks/enforce-graph-context.sh +89 -0
- core/hooks/enforce-graph-first-read.sh +94 -0
- core/hooks/enforce-memory-check.sh +128 -0
- core/hooks/enforce-rename-plan.sh +78 -0
- core/hooks/enforce-scaffold-boundary.sh +68 -0
- core/hooks/enforce-skill.sh +125 -0
- core/hooks/enforce-task-body.sh +52 -0
- core/hooks/enforce-task-start.sh +81 -0
- core/hooks/enforce-task-transition.sh +75 -0
- core/hooks/enforce-template.sh +143 -0
- core/hooks/enforce-verify.sh +112 -0
- core/hooks/enforce-wip-limit.sh +43 -0
- core/hooks/enforce-zoom.sh +69 -0
- core/hooks/ensure-hub-up.sh +67 -0
- core/hooks/inject-mcp-caller-session.sh +70 -0
- core/hooks/jit-recall.sh +65 -0
- core/hooks/link-commit-to-task.sh +143 -0
- core/hooks/lint-task.sh +40 -0
- core/hooks/nudge-docs-first.sh +71 -0
- core/hooks/nudge-git-mode.sh +29 -0
- core/hooks/nudge-graph-os.sh +118 -0
- core/hooks/nudge-learn-narrative.sh +36 -0
- core/hooks/nudge-model-routing.sh +32 -0
- core/hooks/nudge-reentry.sh +101 -0
- core/hooks/nudge-reuse-first.sh +68 -0
- core/hooks/nudge-task-discovery.sh +81 -0
- core/hooks/nudge-thinking-os.sh +109 -0
- core/hooks/pr-reap.sh +23 -0
- core/hooks/reclaim-sweep.sh +58 -0
- core/hooks/record-verify-auto.sh +77 -0
- core/hooks/record-verify.sh +74 -0
- core/hooks/regen-reminder.sh +104 -0
- core/hooks/registry.yaml +1262 -0
- core/hooks/remind-daily.sh +27 -0
- core/hooks/remind-dogfood.sh +70 -0
- core/hooks/remind-learn-validate.sh +94 -0
- core/hooks/rules-primer.sh +50 -0
- core/hooks/search-enforce-inventory.sh +108 -0
- core/hooks/search-verify-remaining.sh +132 -0
- core/hooks/session-context.sh +729 -0
- core/hooks/session-end.sh +145 -0
- core/hooks/session-skill-primer.sh +43 -0
- core/hooks/snapshot-transcript.sh +56 -0
- core/hooks/sync-task-current.sh +85 -0
- core/hooks/test-first-reminder.sh +120 -0
- core/hooks/test-governor.sh +173 -0
- core/hooks/thinking_os-gate.sh +52 -0
- core/hooks/track-backtrack.sh +35 -0
- core/hooks/track-discovery.sh +121 -0
- core/hooks/track-skill.sh +53 -0
- core/hooks/validate-task-frontmatter.sh +49 -0
- core/hooks/verify-rename-callers.sh +119 -0
- core/hooks/warn-abandoned-task.sh +99 -0
- core/hooks/warn-destructive-edit.sh +64 -0
- core/hooks/warn-diff-size.sh +43 -0
- core/hooks/warn-graph-empty.sh +81 -0
- core/hooks/warn-mcp-down.sh +190 -0
- core/hooks/write-state.sh +55 -0
- core/logging_os/__init__.py +33 -0
- core/logging_os/api.py +127 -0
- core/logging_os/bridge.py +80 -0
- core/logging_os/config.py +172 -0
- core/logging_os/fingerprint.py +25 -0
- core/logging_os/redact.py +53 -0
- core/logging_os/render.py +83 -0
- core/logging_os/sinks.py +164 -0
- core/rules/anti-overengineering.md +44 -0
- core/rules/api-contract-discipline.md +41 -0
- core/rules/dimension-registry.md +155 -0
- core/rules/git-workflow.md +57 -0
- core/rules/memory.md +46 -0
- core/rules/model-routing.md +22 -0
- core/rules/skill-enforcement.md +75 -0
- core/rules/test-discipline.md +38 -0
- core/rules/thinking_os.md +48 -0
- core/rules/transparency-banner.md +37 -0
- core/runtime_paths.yaml +36 -0
- core/scaffold_manifest.json +14430 -0
- core/scheduled/__init__.py +0 -0
- core/scheduled/_activity.py +126 -0
- core/scheduled/_state.py +113 -0
- core/scheduled/config.py +86 -0
- core/scheduled/dep_reconcile.py +135 -0
- core/scheduled/error_sweep.py +137 -0
- core/scheduled/nightly.py +930 -0
- core/scheduled/responsive_extract.py +65 -0
- core/schemas/adapter.schema.json +269 -0
- core/schemas/preset.schema.json +50 -0
- core/schemas/skill.schema.json +81 -0
- core/schemas/stack.schema.json +404 -0
- core/scripts/_lib.sh +9 -0
- core/scripts/docs-lint.sh +228 -0
- core/scripts/docs-nav-fix.sh +133 -0
- core/scripts/docs-staleness-check.sh +154 -0
- core/scripts/install-adapter.sh +266 -0
- core/scripts/link-stack-skills.sh +52 -0
- core/scripts/log-latest.sh +106 -0
- core/scripts/log-search.sh +89 -0
- core/scripts/log-write.sh +134 -0
- core/scripts/ref-resolve.sh +71 -0
- core/skills/a11y/SKILL.md +305 -0
- core/skills/a11y/assets/a11y-checklist.md +137 -0
- core/skills/a11y/references/aria-and-focus.md +247 -0
- core/skills/a11y/references/rn-accessibility.md +343 -0
- core/skills/a11y/references/screen-reader-testing.md +190 -0
- core/skills/agent-memory/SKILL.md +191 -0
- core/skills/agent-memory/assets/memory-checklist.md +21 -0
- core/skills/agent-memory/references/memory-recipes.md +57 -0
- core/skills/api-design/SKILL.md +232 -0
- core/skills/api-design/assets/api-design-checklist.md +110 -0
- core/skills/api-design/references/error-envelope.md +381 -0
- core/skills/api-design/references/idempotency-pagination.md +312 -0
- core/skills/api-design/references/rest-contracts.md +426 -0
- core/skills/auth-patterns/SKILL.md +352 -0
- core/skills/auth-patterns/assets/auth-checklist.md +118 -0
- core/skills/auth-patterns/references/jwt-and-service-tokens.md +343 -0
- core/skills/auth-patterns/references/passkeys-2fa.md +289 -0
- core/skills/auth-patterns/references/sessions-vs-jwt.md +230 -0
- core/skills/auth-patterns/scripts/cookie-flag-check.py +146 -0
- core/skills/backend-fundamentals/SKILL.md +238 -0
- core/skills/backend-fundamentals/assets/backend-checklist.md +27 -0
- core/skills/backend-fundamentals/references/backend-patterns.md +56 -0
- core/skills/backend-fundamentals/scripts/check_layering.py +83 -0
- core/skills/clean-code/SKILL.md +642 -0
- core/skills/clean-code/scripts/audit-fail-closed.py +167 -0
- core/skills/codebase-explorer/SKILL.md +89 -0
- core/skills/codebase-explorer/assets/reading-checklist.md +24 -0
- core/skills/codebase-explorer/references/reading-strategies.md +52 -0
- core/skills/codebase-explorer/scripts/outline.py +99 -0
- core/skills/db-design/SKILL.md +327 -0
- core/skills/db-design/assets/migration-template.sql +49 -0
- core/skills/db-design/references/migration-discipline.md +290 -0
- core/skills/db-design/references/postgres-patterns.md +340 -0
- core/skills/db-design/scripts/migration-safety.sh +150 -0
- core/skills/deployment-cicd/SKILL.md +260 -0
- core/skills/deployment-cicd/assets/deploy-checklist.md +26 -0
- core/skills/deployment-cicd/references/pipeline-and-release.md +54 -0
- core/skills/deployment-cicd/scripts/lint_workflow.py +79 -0
- core/skills/docker/SKILL.md +114 -0
- core/skills/docker/assets/dockerfile-checklist.md +31 -0
- core/skills/docker/references/compose-patterns.md +66 -0
- core/skills/docker/references/dockerfile-optimization.md +64 -0
- core/skills/docker/scripts/lint_dockerfile.sh +48 -0
- core/skills/docker/versions.json +16 -0
- core/skills/end-to-end-testing/SKILL.md +101 -0
- core/skills/end-to-end-testing/assets/e2e-checklist.md +23 -0
- core/skills/end-to-end-testing/references/maestro.md +63 -0
- core/skills/end-to-end-testing/references/playwright.md +68 -0
- core/skills/end-to-end-testing/scripts/lint_e2e.py +88 -0
- core/skills/end-to-end-testing/versions.json +16 -0
- core/skills/frontend-design/SKILL.md +76 -0
- core/skills/frontend-design/assets/design-checklist.md +29 -0
- core/skills/frontend-design/references/design-principles.md +65 -0
- core/skills/frontend-design/scripts/check_contrast.py +89 -0
- core/skills/frontend-fundamentals/SKILL.md +213 -0
- core/skills/frontend-fundamentals/assets/frontend-checklist.md +25 -0
- core/skills/frontend-fundamentals/references/rendering-and-state.md +66 -0
- core/skills/frontend-fundamentals/scripts/check_frontend.py +86 -0
- core/skills/graph-explorer/SKILL.md +215 -0
- core/skills/graph-explorer/scripts/explain-impact.sh +64 -0
- core/skills/graphql/SKILL.md +187 -0
- core/skills/grpc-microservices/SKILL.md +174 -0
- core/skills/hexagonal-architecture/SKILL.md +199 -0
- core/skills/hexagonal-architecture/assets/folder-scaffold.md +233 -0
- core/skills/hexagonal-architecture/references/anti-patterns.md +129 -0
- core/skills/hexagonal-architecture/references/go-fiber-layout.md +429 -0
- core/skills/hexagonal-architecture/references/python-fastapi-layout.md +453 -0
- core/skills/hexagonal-architecture/references/react-native-layout.md +428 -0
- core/skills/i18n/SKILL.md +126 -0
- core/skills/incident-response/SKILL.md +225 -0
- core/skills/incident-response/assets/incident-checklist.md +29 -0
- core/skills/incident-response/references/severity-and-runbook.md +53 -0
- core/skills/incident-response/scripts/classify_severity.py +86 -0
- core/skills/linux-sysadmin/SKILL.md +115 -0
- core/skills/linux-sysadmin/assets/hardening-checklist.md +29 -0
- core/skills/linux-sysadmin/references/ssh-hardening.md +62 -0
- core/skills/linux-sysadmin/references/systemd-and-services.md +77 -0
- core/skills/linux-sysadmin/scripts/triage.sh +50 -0
- core/skills/linux-sysadmin/versions.json +17 -0
- core/skills/llm-patterns/SKILL.md +410 -0
- core/skills/llm-patterns/assets/llm-feature-checklist.md +26 -0
- core/skills/llm-patterns/references/rag-and-evals.md +59 -0
- core/skills/llm-patterns/scripts/estimate_tokens.py +75 -0
- core/skills/messaging-queues/SKILL.md +142 -0
- core/skills/mobile-fundamentals/SKILL.md +406 -0
- core/skills/mobile-fundamentals/assets/mobile-launch-checklist.md +130 -0
- core/skills/mobile-fundamentals/references/navigation-and-deep-links.md +337 -0
- core/skills/mobile-fundamentals/references/offline-sync.md +339 -0
- core/skills/node-backend/SKILL.md +114 -0
- core/skills/node-backend/assets/node-checklist.md +25 -0
- core/skills/node-backend/references/async-and-errors.md +67 -0
- core/skills/node-backend/references/event-loop.md +65 -0
- core/skills/node-backend/scripts/check_package.py +78 -0
- core/skills/node-backend/versions.json +17 -0
- core/skills/observability/SKILL.md +289 -0
- core/skills/observability/assets/observability-checklist.md +27 -0
- core/skills/observability/references/instrumentation.md +57 -0
- core/skills/observability/scripts/lint_logging.py +77 -0
- core/skills/payments/SKILL.md +102 -0
- core/skills/performance/SKILL.md +305 -0
- core/skills/performance/assets/perf-checklist.md +143 -0
- core/skills/performance/references/mobile-performance.md +249 -0
- core/skills/performance/references/web-vitals.md +209 -0
- core/skills/php/SKILL.md +116 -0
- core/skills/php/assets/php-checklist.md +26 -0
- core/skills/php/references/modern-php.md +64 -0
- core/skills/php/references/security.md +72 -0
- core/skills/php/scripts/scan_php_smells.py +99 -0
- core/skills/php/versions.json +9 -0
- core/skills/pr-mode-driver/SKILL.md +65 -0
- core/skills/realtime-websockets/SKILL.md +152 -0
- core/skills/redis/SKILL.md +105 -0
- core/skills/redis/assets/redis-checklist.md +27 -0
- core/skills/redis/references/operations.md +66 -0
- core/skills/redis/references/patterns.md +62 -0
- core/skills/redis/scripts/analyze_info.py +101 -0
- core/skills/redis/versions.json +9 -0
- core/skills/search/SKILL.md +91 -0
- core/skills/search/references/grep.md +76 -0
- core/skills/search/scripts/verify-count.sh +73 -0
- core/skills/search-infra/SKILL.md +109 -0
- core/skills/security-mobile/SKILL.md +394 -0
- core/skills/security-mobile/assets/mobile-security-checklist.md +117 -0
- core/skills/security-mobile/references/masvs-l1-checklist.md +127 -0
- core/skills/security-web/SKILL.md +217 -0
- core/skills/security-web/assets/security-web-checklist.md +167 -0
- core/skills/security-web/references/owasp-top-10.md +551 -0
- core/skills/security-web/references/supply-chain.md +179 -0
- core/skills/security-web/scripts/csp-check.sh +153 -0
- core/skills/shell-scripting/SKILL.md +128 -0
- core/skills/shell-scripting/assets/script-checklist.md +33 -0
- core/skills/shell-scripting/references/argument-parsing.md +84 -0
- core/skills/shell-scripting/references/bash-robustness.md +78 -0
- core/skills/shell-scripting/scripts/lint_script.sh +53 -0
- core/skills/shell-scripting/scripts/new_script.py +131 -0
- core/skills/shell-scripting/versions.json +23 -0
- core/skills/sql-authoring/SKILL.md +104 -0
- core/skills/sql-authoring/assets/query-review-checklist.md +26 -0
- core/skills/sql-authoring/references/query-patterns.md +89 -0
- core/skills/sql-authoring/references/reading-explain.md +52 -0
- core/skills/sql-authoring/scripts/analyze_plan.py +100 -0
- core/skills/sql-authoring/versions.json +17 -0
- core/skills/state-management/SKILL.md +428 -0
- core/skills/state-management/references/tanstack-query-recipes.md +301 -0
- core/skills/state-management/references/zustand-recipes.md +364 -0
- core/skills/supabase/SKILL.md +108 -0
- core/skills/supabase/assets/supabase-checklist.md +26 -0
- core/skills/supabase/references/realtime-and-storage.md +55 -0
- core/skills/supabase/references/rls-and-auth.md +65 -0
- core/skills/supabase/scripts/check_rls.py +88 -0
- core/skills/supabase/versions.json +9 -0
- core/skills/task-driver/SKILL.md +272 -0
- core/skills/task-driver/scripts/task-lint.sh +163 -0
- core/skills/technical-writing/SKILL.md +85 -0
- core/skills/technical-writing/assets/doc-checklist.md +29 -0
- core/skills/technical-writing/references/doc-anatomy.md +53 -0
- core/skills/technical-writing/references/writing-craft.md +59 -0
- core/skills/technical-writing/scripts/new_doc.py +81 -0
- core/skills/terraform-k8s/SKILL.md +133 -0
- core/skills/testing-strategy/SKILL.md +266 -0
- core/skills/testing-strategy/assets/test-review-checklist.md +25 -0
- core/skills/testing-strategy/references/test-types.md +52 -0
- core/skills/testing-strategy/scripts/coverage_gate.py +79 -0
- core/skills/thinking_os/SKILL.md +288 -0
- core/skills/thinking_os/scripts/classify.sh +122 -0
- core/skills/typescript/SKILL.md +110 -0
- core/skills/typescript/assets/typescript-checklist.md +24 -0
- core/skills/typescript/references/strictness.md +53 -0
- core/skills/typescript/references/type-system.md +86 -0
- core/skills/typescript/scripts/check_tsconfig.py +92 -0
- core/skills/typescript/versions.json +9 -0
- core/subsystems.yaml +202 -0
- core/thinking_os/__init__.py +1 -0
- core/thinking_os/_agent_markers.py +32 -0
- core/thinking_os/agents/README.md +71 -0
- core/thinking_os/agents/analyst.md +139 -0
- core/thinking_os/agents/architect.md +127 -0
- core/thinking_os/agents/debugger.md +111 -0
- core/thinking_os/agents/deployer.md +112 -0
- core/thinking_os/agents/distiller.md +28 -0
- core/thinking_os/agents/documenter.md +101 -0
- core/thinking_os/agents/implementer.md +135 -0
- core/thinking_os/agents/internal/session_observer.md +39 -0
- core/thinking_os/agents/observer.md +100 -0
- core/thinking_os/agents/onboarder.md +81 -0
- core/thinking_os/agents/refactorer.md +123 -0
- core/thinking_os/agents/repairer.md +47 -0
- core/thinking_os/agents/researcher.md +129 -0
- core/thinking_os/agents/reviewer.md +147 -0
- core/thinking_os/agents/security_auditor.md +133 -0
- core/thinking_os/background.py +405 -0
- core/thinking_os/bootstrap_outcomes.py +200 -0
- core/thinking_os/budget.py +302 -0
- core/thinking_os/capture.py +495 -0
- core/thinking_os/cognition.py +516 -0
- core/thinking_os/cognition_schemas.py +517 -0
- core/thinking_os/compress.py +192 -0
- core/thinking_os/concepts.py +233 -0
- core/thinking_os/dashboard.py +159 -0
- core/thinking_os/database.py +2883 -0
- core/thinking_os/decay.py +393 -0
- core/thinking_os/digest.py +295 -0
- core/thinking_os/dispatcher.py +192 -0
- core/thinking_os/dispatcher_helpers.py +48 -0
- core/thinking_os/dispatchers/__init__.py +3 -0
- core/thinking_os/dispatchers/default.py +47 -0
- core/thinking_os/distill.py +192 -0
- core/thinking_os/doc_indexer.py +905 -0
- core/thinking_os/embeddings.py +943 -0
- core/thinking_os/formula_composer.py +556 -0
- core/thinking_os/gate_marker.py +75 -0
- core/thinking_os/graph.py +296 -0
- core/thinking_os/graph_indexer.py +360 -0
- core/thinking_os/health_check.py +517 -0
- core/thinking_os/impact.py +119 -0
- core/thinking_os/memory_gc.py +356 -0
- core/thinking_os/migrator_embeddings.py +318 -0
- core/thinking_os/precision.py +194 -0
- core/thinking_os/presets/registry.yaml +127 -0
- core/thinking_os/record_outcome.py +399 -0
- core/thinking_os/repair.py +105 -0
- core/thinking_os/retrieval_quality.py +239 -0
- core/thinking_os/roles/analyst.yaml +83 -0
- core/thinking_os/roles/architect.yaml +88 -0
- core/thinking_os/roles/debugger.yaml +71 -0
- core/thinking_os/roles/deployer.yaml +71 -0
- core/thinking_os/roles/documenter.yaml +72 -0
- core/thinking_os/roles/implementer.yaml +83 -0
- core/thinking_os/roles/observer.yaml +70 -0
- core/thinking_os/roles/refactorer.yaml +71 -0
- core/thinking_os/roles/researcher.yaml +72 -0
- core/thinking_os/roles/reviewer.yaml +79 -0
- core/thinking_os/roles/security_auditor.yaml +83 -0
- core/thinking_os/roles_state.py +168 -0
- core/thinking_os/sanitizer.py +320 -0
- core/thinking_os/server.py +3160 -0
- core/thinking_os/session_enrich.py +272 -0
- core/thinking_os/session_observe_worker.py +111 -0
- core/thinking_os/session_startup.py +74 -0
- core/thinking_os/session_summary.py +245 -0
- core/thinking_os/situations/registry.yaml +99 -0
- core/thinking_os/task_analyzer.py +462 -0
- core/thinking_os/task_parser.py +342 -0
- core/thinking_os/task_sync.py +73 -0
- core/thinking_os/tools/__init__.py +6 -0
- core/thinking_os/tools/_shared.py +947 -0
- core/thinking_os/tools/cognition.py +1867 -0
- core/thinking_os/tools/docs.py +770 -0
- core/thinking_os/tools/learning.py +2078 -0
- core/thinking_os/tools/logs.py +79 -0
- core/thinking_os/tools/memory.py +840 -0
- core/thinking_os/tools/metrics.py +200 -0
- core/thinking_os/tools/retrieve.py +415 -0
- core/thinking_os/tools/routing.py +658 -0
- core/thinking_os/tools/tasks.py +449 -0
- core/thinking_os/tools/trajectory.py +181 -0
- core/thinking_os/tracing.py +235 -0
- core/web/__init__.py +5 -0
- core/web/_cache.py +118 -0
- core/web/_deps.py +56 -0
- core/web/_envelope.py +85 -0
- core/web/_project_context.py +140 -0
- core/web/chat_providers.py +108 -0
- core/web/init_jobs.py +216 -0
- core/web/routes/__init__.py +25 -0
- core/web/routes/_bounded_read.py +76 -0
- core/web/routes/board.py +1089 -0
- core/web/routes/cognition.py +1838 -0
- core/web/routes/config.py +635 -0
- core/web/routes/graph.py +513 -0
- core/web/routes/health.py +180 -0
- core/web/routes/hooks.py +288 -0
- core/web/routes/hub.py +1219 -0
- core/web/routes/logs.py +374 -0
- core/web/routes/metrics.py +43 -0
- core/web/routes/observability.py +400 -0
- core/web/routes/patterns.py +227 -0
- core/web/routes/presence.py +609 -0
- core/web/routes/roles.py +446 -0
- core/web/routes/scheduled.py +261 -0
- core/web/routes/search.py +238 -0
- core/web/routes/sessions.py +220 -0
- core/web/routes/settings.py +363 -0
- core/web/routes/stream.py +547 -0
- core/web/security.py +157 -0
- core/web/server.py +283 -0
- graph_os/__init__.py +29 -0
- graph_os/backend.py +233 -0
- graph_os/backends/__init__.py +13 -0
- graph_os/backends/sqlite_backend.py +1053 -0
- graph_os/communities.py +410 -0
- graph_os/enterprise.py +218 -0
- graph_os/entry_points.py +226 -0
- graph_os/extractors/__init__.py +25 -0
- graph_os/extractors/code_generic.py +914 -0
- graph_os/extractors/code_go.py +1422 -0
- graph_os/extractors/code_json.py +340 -0
- graph_os/extractors/code_php.py +979 -0
- graph_os/extractors/code_python.py +1454 -0
- graph_os/extractors/code_shell.py +538 -0
- graph_os/extractors/code_toml.py +302 -0
- graph_os/extractors/code_ts.py +1665 -0
- graph_os/extractors/code_yaml.py +394 -0
- graph_os/extractors/contracts.py +1592 -0
- graph_os/extractors/md_links.py +890 -0
- graph_os/extractors/task_deps.py +345 -0
- graph_os/groups/__init__.py +22 -0
- graph_os/groups/cross_repo.py +156 -0
- graph_os/groups/manifest.py +141 -0
- graph_os/ingest/__init__.py +19 -0
- graph_os/ingest/base.py +306 -0
- graph_os/ingest/github.py +112 -0
- graph_os/ingest/zip.py +95 -0
- graph_os/toolchain.py +393 -0
- graph_os/tools/__init__.py +9 -0
- graph_os/tools/graph.py +5573 -0
- graph_os/tools/reindex_dispatch.py +730 -0
- graph_os/tree_sitter_overlay.py +235 -0
- graph_os/types.py +252 -0
- graph_os/vec_index.py +277 -0
- graph_os/viewer/__init__.py +12 -0
- graph_os/viewer/exporter.py +93 -0
- graph_os/viewer/template.py +189 -0
- scheduled/__init__.py +0 -0
- scheduled/_activity.py +126 -0
- scheduled/_state.py +113 -0
- scheduled/config.py +86 -0
- scheduled/dep_reconcile.py +135 -0
- scheduled/error_sweep.py +137 -0
- scheduled/nightly.py +930 -0
- scheduled/responsive_extract.py +65 -0
- scripts/__init__.py +4 -0
- scripts/_commit_msg_body.sh +31 -0
- scripts/_post_commit_body.sh +49 -0
- scripts/_pre_commit_body.sh +121 -0
- scripts/_prepare_commit_msg_body.sh +53 -0
- scripts/audit_mcp_tools.py +693 -0
- scripts/bench_sdk_dispatcher.py +177 -0
- scripts/capture_golden.py +169 -0
- scripts/check_graph_phantoms.py +75 -0
- scripts/dev/audit_doc_links.py +359 -0
- scripts/dev/audit_scaffold_module_tags.py +107 -0
- scripts/dev/backfill_doc_headers.py +328 -0
- scripts/dev/backfill_nav_lines.py +119 -0
- scripts/dev/fix_nav_placement.py +106 -0
- scripts/dev/inspect_sdk_options.py +45 -0
- scripts/dev/migrate_check_ids.py +170 -0
- scripts/dev/strip_purpose_blocks.py +154 -0
- scripts/dump_openapi.py +66 -0
- scripts/e2e_dispatch_tool.py +195 -0
- scripts/generate_manifest.py +166 -0
- scripts/golden_sections.py +20 -0
- scripts/graph_demo.py +161 -0
- scripts/install-git-hooks.sh +47 -0
- scripts/migrate_embeddings_minilm_to_bge_m3.py +84 -0
- scripts/operational_eval.py +445 -0
- scripts/probe_agent_session_resolver.py +59 -0
- scripts/prune_deleted_path.py +127 -0
- scripts/refactor_agent_dual_mode.py +171 -0
- scripts/refresh_skill_versions.py +302 -0
- scripts/regen_doc_index.py +209 -0
- scripts/regen_doctor_schema.py +62 -0
- scripts/regen_rules.py +94 -0
- scripts/rename_formulas_to_semantic.py +241 -0
- scripts/smoke_db_connections.py +183 -0
- scripts/smoke_doc_header.py +72 -0
- scripts/smoke_graph_e2e.py +374 -0
- scripts/smoke_sdk_dispatch.py +84 -0
- scripts/smoke_uid_resolver.py +164 -0
- scripts/verify_dispatchers.py +244 -0
- scripts/verify_phase_c_e2e.py +436 -0
- templates/__init__.py +6 -0
- templates/_base/Makefile.base +353 -0
- templates/_base/base.yaml +59 -0
- templates/_base/coding-os.yaml.template +39 -0
- templates/_base/dimension-registry.template.md +68 -0
- templates/_base/domain-config.template.json +46 -0
- templates/_base/fragments/anatomy-map.md.tmpl +11 -0
- templates/_base/fragments/context-discipline.md.tmpl +3 -0
- templates/_base/fragments/core-loop.md.tmpl +52 -0
- templates/_base/fragments/engineering-routing.md.tmpl +3 -0
- templates/_base/fragments/header.md.tmpl +6 -0
- templates/_base/fragments/identity.md.tmpl +3 -0
- templates/_base/fragments/principles.md.tmpl +3 -0
- templates/_base/fragments/retrieval-routing.md.tmpl +23 -0
- templates/_base/fragments/session-handoff.md.tmpl +3 -0
- templates/_base/fragments/skills.md.tmpl +3 -0
- templates/_base/fragments/ssot-map.md.tmpl +3 -0
- templates/_base/fragments/stop-conditions.md.tmpl +3 -0
- templates/_base/fragments/subagent-dispatch.md.tmpl +3 -0
- templates/_base/fragments/task-authoring.md.tmpl +69 -0
- templates/_base/fragments/task-logging.md.tmpl +8 -0
- templates/_base/fragments/tool-routing.md.tmpl +9 -0
- templates/_base/fragments/verification-matrix.md.tmpl +12 -0
- templates/_base/lang/dart/analysis_options.yaml +7 -0
- templates/_base/lang/php/phpcs.xml.dist +10 -0
- templates/_base/lang/python/pyproject.toml +19 -0
- templates/_base/lang/rust/clippy.toml +5 -0
- templates/_base/lang/rust/rustfmt.toml +3 -0
- templates/_base/lang/typescript/eslint.config.js +26 -0
- templates/_base/lang/typescript/tsconfig.json +15 -0
- templates/_base/lang/typescript/vitest.config.ts +10 -0
- templates/_base/scaffold/changes.log +1 -0
- templates/_base/scaffold/docs/00-index.md +55 -0
- templates/_base/scaffold/docs/_meta/feature-dependency-tree.md +30 -0
- templates/_base/scaffold/docs/_meta/foundation-map.md +56 -0
- templates/_base/scaffold/docs/_meta/questions.md +8 -0
- templates/_base/scaffold/docs/_meta/roadmap.md +33 -0
- templates/_base/scaffold/docs/api-contracts/00-index.md +58 -0
- templates/_base/scaffold/docs/api-contracts/error-format.md +58 -0
- templates/_base/scaffold/docs/architecture/00-index.md +42 -0
- templates/_base/scaffold/docs/architecture/adr/00-index.md +39 -0
- templates/_base/scaffold/docs/engineering/00-index.md +9 -0
- templates/_base/scaffold/docs/governance/00-index.md +55 -0
- templates/_base/scaffold/docs/governance/_templates/doc-cheat-sheet.md +202 -0
- templates/_base/scaffold/docs/governance/_templates/playbook-template.md +81 -0
- templates/_base/scaffold/docs/governance/_templates/post-mortem-template.md +85 -0
- templates/_base/scaffold/docs/governance/_templates/runbook-template.md +88 -0
- templates/_base/scaffold/docs/governance/_templates/security-review-template.md +111 -0
- templates/_base/scaffold/docs/governance/_templates/task-detail.md +61 -0
- templates/_base/scaffold/docs/governance/agent-workflow.md +101 -0
- templates/_base/scaffold/docs/governance/anatomy-contract.md +150 -0
- templates/_base/scaffold/docs/governance/critical-rules.md +224 -0
- templates/_base/scaffold/docs/governance/decision-records.md +58 -0
- templates/_base/scaffold/docs/governance/docs-first-protocol.md +157 -0
- templates/_base/scaffold/docs/governance/docs-system.md +151 -0
- templates/_base/scaffold/docs/governance/gdpr-compliance.md +66 -0
- templates/_base/scaffold/docs/governance/mcp-tool-inventory.md +112 -0
- templates/_base/scaffold/docs/governance/risk-register.md +26 -0
- templates/_base/scaffold/docs/governance/scaffold-boundary-contract.md +161 -0
- templates/_base/scaffold/docs/governance/task-lifecycle.md +125 -0
- templates/_base/scaffold/docs/governance/wrapper-derivation.md +50 -0
- templates/_base/scaffold/docs/insights/00-index.md +17 -0
- templates/_base/scaffold/docs/ops/00-index.md +59 -0
- templates/_base/scaffold/docs/ops/runbooks/00-index.md +9 -0
- templates/_base/scaffold/docs/playbooks/00-index.md +12 -0
- templates/_base/scaffold/docs/playbooks/research-validation.md +29 -0
- templates/_base/scaffold/docs/playbooks/security-review.md +41 -0
- templates/_base/scaffold/docs/prd/00-index.md +43 -0
- templates/_base/scaffold/docs/prd/01-snapshot-vision.md +56 -0
- templates/_base/scaffold/docs/workflow/workflow-guide.md +138 -0
- templates/_base/scaffold/src/shared/README.md +23 -0
- templates/_base/skill-enforcement.template.md +14 -0
- templates/_base/task-detail.template.md +61 -0
- templates/_presets/ai-saas.yaml +9 -0
- templates/_presets/django-next.yaml +8 -0
- templates/_presets/dotnet-react.yaml +8 -0
- templates/_presets/flutter-baas.yaml +8 -0
- templates/_presets/go-react.yaml +8 -0
- templates/_presets/hexagonal-product.yaml +16 -0
- templates/_presets/jamstack.yaml +8 -0
- templates/_presets/laravel-vue.yaml +8 -0
- templates/_presets/mean.yaml +8 -0
- templates/_presets/mern.yaml +9 -0
- templates/_presets/nest-angular.yaml +8 -0
- templates/_presets/nextjs-fastapi.yaml +10 -0
- templates/_presets/nuxt-fullstack.yaml +9 -0
- templates/_presets/pern.yaml +9 -0
- templates/_presets/rails-react.yaml +8 -0
- templates/_presets/rn-api.yaml +8 -0
- templates/_presets/rust-svelte.yaml +8 -0
- templates/_presets/spring-react.yaml +8 -0
- templates/_presets/t3-style.yaml +9 -0
- templates/_presets/tall.yaml +8 -0
- templates/_presets/wordpress-cms.yaml +8 -0
- templates/angular/rules/frontend.md +19 -0
- templates/angular/scaffold/docs/engineering/accessibility.md +46 -0
- templates/angular/scaffold/docs/engineering/angular-rules.md +35 -0
- templates/angular/scaffold/docs/playbooks/angular-app.md +42 -0
- templates/angular/scaffold/src/frontend/angular.json +52 -0
- templates/angular/scaffold/src/frontend/package.json +28 -0
- templates/angular/scaffold/src/frontend/src/app/app.component.ts +19 -0
- templates/angular/scaffold/src/frontend/src/app/app.config.ts +22 -0
- templates/angular/scaffold/src/frontend/src/app/app.routes.ts +8 -0
- templates/angular/scaffold/src/frontend/src/app/core/global-error-handler.ts +12 -0
- templates/angular/scaffold/src/frontend/src/app/health/health.component.ts +14 -0
- templates/angular/scaffold/src/frontend/src/app/health/health.service.spec.ts +16 -0
- templates/angular/scaffold/src/frontend/src/app/health/health.service.ts +10 -0
- templates/angular/scaffold/src/frontend/src/index.html +11 -0
- templates/angular/scaffold/src/frontend/src/main.ts +9 -0
- templates/angular/scaffold/src/frontend/src/styles.css +14 -0
- templates/angular/scaffold/src/frontend/tsconfig.app.json +8 -0
- templates/angular/scaffold/src/frontend/tsconfig.json +27 -0
- templates/angular/scaffold/src/frontend/tsconfig.spec.json +8 -0
- templates/angular/scaffold-boundary.yaml +27 -0
- templates/angular/skills/angular/SKILL.md +79 -0
- templates/angular/skills/angular/references/anatomy.md +69 -0
- templates/angular/stack.yaml +75 -0
- templates/aspnet-core/rules/backend.md +20 -0
- templates/aspnet-core/scaffold/docs/engineering/aspnet-core-rules.md +36 -0
- templates/aspnet-core/scaffold/docs/playbooks/aspnet-core-service.md +40 -0
- templates/aspnet-core/scaffold/src/backend/Backend.csproj +11 -0
- templates/aspnet-core/scaffold/src/backend/Backend.sln +27 -0
- templates/aspnet-core/scaffold/src/backend/Common/ExceptionHandlingMiddleware.cs +35 -0
- templates/aspnet-core/scaffold/src/backend/Features/Health/HealthEndpoints.cs +10 -0
- templates/aspnet-core/scaffold/src/backend/Features/Health/HealthService.cs +9 -0
- templates/aspnet-core/scaffold/src/backend/Program.cs +22 -0
- templates/aspnet-core/scaffold/src/backend/tests/Backend.Tests/Backend.Tests.csproj +22 -0
- templates/aspnet-core/scaffold/src/backend/tests/Backend.Tests/HealthServiceTests.cs +15 -0
- templates/aspnet-core/scaffold-boundary.yaml +24 -0
- templates/aspnet-core/skills/aspnet-core/SKILL.md +80 -0
- templates/aspnet-core/skills/aspnet-core/references/anatomy.md +65 -0
- templates/aspnet-core/stack.yaml +68 -0
- templates/astro/rules/frontend.md +20 -0
- templates/astro/scaffold/docs/engineering/astro-rules.md +40 -0
- templates/astro/scaffold/docs/playbooks/astro-app.md +57 -0
- templates/astro/scaffold/docs/playbooks/content-seo.md +37 -0
- templates/astro/scaffold/src/frontend/astro.config.mjs +10 -0
- templates/astro/scaffold/src/frontend/package.json +23 -0
- templates/astro/scaffold/src/frontend/src/components/Greeting.astro +13 -0
- templates/astro/scaffold/src/frontend/src/content/posts/hello.md +10 -0
- templates/astro/scaffold/src/frontend/src/content.config.ts +19 -0
- templates/astro/scaffold/src/frontend/src/lib/problem.test.ts +39 -0
- templates/astro/scaffold/src/frontend/src/lib/problem.ts +30 -0
- templates/astro/scaffold/src/frontend/src/pages/api/health.ts +13 -0
- templates/astro/scaffold/src/frontend/src/pages/index.astro +21 -0
- templates/astro/scaffold/src/frontend/tsconfig.json +9 -0
- templates/astro/scaffold/src/frontend/vitest.config.ts +10 -0
- templates/astro/scaffold-boundary.yaml +28 -0
- templates/astro/skills/astro/SKILL.md +71 -0
- templates/astro/skills/astro/references/anatomy.md +66 -0
- templates/astro/stack.yaml +75 -0
- templates/csharp-plain/scaffold/src/backend/Backend.csproj +12 -0
- templates/csharp-plain/scaffold/src/backend/Program.cs +1 -0
- templates/csharp-plain/scaffold-boundary.yaml +23 -0
- templates/csharp-plain/stack.yaml +50 -0
- templates/django/rules/backend.md +18 -0
- templates/django/scaffold/docs/engineering/anti-ambiguity.md +74 -0
- templates/django/scaffold/docs/engineering/backend-rules.md +133 -0
- templates/django/scaffold/docs/engineering/glossary.md +51 -0
- templates/django/scaffold/docs/engineering/logging-standards.md +107 -0
- templates/django/scaffold/docs/engineering/naming-conventions.md +68 -0
- templates/django/scaffold/docs/engineering/secrets-rotation-runbook.md +142 -0
- templates/django/scaffold/docs/playbooks/backend-api.md +119 -0
- templates/django/scaffold/src/backend/config/__init__.py +0 -0
- templates/django/scaffold/src/backend/config/settings.py +31 -0
- templates/django/scaffold/src/backend/config/urls.py +11 -0
- templates/django/scaffold/src/backend/config/wsgi.py +6 -0
- templates/django/scaffold/src/backend/manage.py +14 -0
- templates/django/scaffold/src/backend/pyproject.toml +37 -0
- templates/django/scaffold/src/backend/tests/test_health.py +4 -0
- templates/django/scaffold-boundary.yaml +25 -0
- templates/django/skills/python-django/SKILL.md +450 -0
- templates/django/skills/python-django/references/anatomy.md +117 -0
- templates/django/skills/python-django/scripts/new_endpoint.py +89 -0
- templates/django/stack.yaml +73 -0
- templates/fastapi/rules/backend.md +18 -0
- templates/fastapi/scaffold/docs/engineering/fastapi-rules.md +37 -0
- templates/fastapi/scaffold/docs/playbooks/fastapi-service.md +30 -0
- templates/fastapi/scaffold/src/backend/app/__init__.py +0 -0
- templates/fastapi/scaffold/src/backend/app/main.py +8 -0
- templates/fastapi/scaffold/src/backend/pyproject.toml +39 -0
- templates/fastapi/scaffold/src/backend/tests/test_health.py +11 -0
- templates/fastapi/scaffold-boundary.yaml +25 -0
- templates/fastapi/skills/python-fastapi/SKILL.md +75 -0
- templates/fastapi/skills/python-fastapi/references/anatomy.md +117 -0
- templates/fastapi/skills/python-fastapi/scripts/new_endpoint.py +101 -0
- templates/fastapi/stack.yaml +57 -0
- templates/flutter/rules/mobile.md +26 -0
- templates/flutter/scaffold/docs/engineering/flutter-rules.md +35 -0
- templates/flutter/scaffold/docs/playbooks/flutter-app.md +45 -0
- templates/flutter/scaffold/src/mobile/lib/core/error_mapper.dart +17 -0
- templates/flutter/scaffold/src/mobile/lib/core/router.dart +13 -0
- templates/flutter/scaffold/src/mobile/lib/main.dart +22 -0
- templates/flutter/scaffold/src/mobile/lib/screens/health_screen.dart +32 -0
- templates/flutter/scaffold/src/mobile/lib/services/health_service.dart +11 -0
- templates/flutter/scaffold/src/mobile/lib/state/health_provider.dart +13 -0
- templates/flutter/scaffold/src/mobile/pubspec.yaml +22 -0
- templates/flutter/scaffold/src/mobile/test/health_provider_test.dart +90 -0
- templates/flutter/scaffold-boundary.yaml +28 -0
- templates/flutter/skills/flutter/SKILL.md +76 -0
- templates/flutter/skills/flutter/references/anatomy.md +64 -0
- templates/flutter/stack.yaml +70 -0
- templates/go/rules/backend.md +19 -0
- templates/go/scaffold/docs/engineering/go-rules.md +45 -0
- templates/go/scaffold/docs/playbooks/go-service.md +30 -0
- templates/go/scaffold/src/backend/cmd/api/main.go +22 -0
- templates/go/scaffold/src/backend/cmd/api/main_test.go +20 -0
- templates/go/scaffold/src/backend/go.mod +3 -0
- templates/go/scaffold-boundary.yaml +25 -0
- templates/go/skills/go-patterns/SKILL.md +68 -0
- templates/go/skills/go-patterns/assets/go-checklist.md +29 -0
- templates/go/skills/go-patterns/references/anatomy.md +115 -0
- templates/go/skills/go-patterns/references/go-2026-idioms.md +92 -0
- templates/go/skills/go-patterns/scripts/new_endpoint.py +117 -0
- templates/go/skills/go-patterns/versions.json +16 -0
- templates/go/stack.yaml +54 -0
- templates/go-fiber/rules/backend.md +20 -0
- templates/go-fiber/scaffold/docs/engineering/fiber-rules.md +97 -0
- templates/go-fiber/scaffold/docs/playbooks/fiber-service.md +149 -0
- templates/go-fiber/scaffold/src/backend/cmd/api/main.go +21 -0
- templates/go-fiber/scaffold/src/backend/cmd/api/main_test.go +17 -0
- templates/go-fiber/scaffold/src/backend/go.mod +23 -0
- templates/go-fiber/scaffold/src/backend/go.sum +49 -0
- templates/go-fiber/scaffold-boundary.yaml +26 -0
- templates/go-fiber/skills/go-fiber/SKILL.md +203 -0
- templates/go-fiber/skills/go-fiber/assets/fiber-checklist.md +26 -0
- templates/go-fiber/skills/go-fiber/references/anatomy.md +116 -0
- templates/go-fiber/skills/go-fiber/references/fiber-v3-patterns.md +89 -0
- templates/go-fiber/skills/go-fiber/scripts/new_endpoint.py +107 -0
- templates/go-fiber/skills/go-fiber/versions.json +16 -0
- templates/go-fiber/stack.yaml +59 -0
- templates/go-plain/scaffold/src/backend/go.mod +3 -0
- templates/go-plain/scaffold/src/backend/main.go +7 -0
- templates/go-plain/scaffold-boundary.yaml +22 -0
- templates/go-plain/stack.yaml +51 -0
- templates/java-plain/scaffold/src/backend/mvnw +302 -0
- templates/java-plain/scaffold/src/backend/pom.xml +41 -0
- templates/java-plain/scaffold/src/backend/src/main/java/com/example/app/Main.java +10 -0
- templates/java-plain/scaffold-boundary.yaml +23 -0
- templates/java-plain/stack.yaml +51 -0
- templates/laravel/rules/backend.md +20 -0
- templates/laravel/scaffold/docs/engineering/laravel-rules.md +28 -0
- templates/laravel/scaffold/docs/playbooks/laravel-service.md +28 -0
- templates/laravel/scaffold/src/backend/app/Exceptions/Handler.php +27 -0
- templates/laravel/scaffold/src/backend/app/Http/Controllers/HealthController.php +15 -0
- templates/laravel/scaffold/src/backend/app/Support/HealthStatus.php +14 -0
- templates/laravel/scaffold/src/backend/composer.json +24 -0
- templates/laravel/scaffold/src/backend/phpunit.xml +10 -0
- templates/laravel/scaffold/src/backend/public/index.php +8 -0
- templates/laravel/scaffold/src/backend/routes/api.php +7 -0
- templates/laravel/scaffold/src/backend/tests/Unit/HealthStatusTest.php +16 -0
- templates/laravel/scaffold-boundary.yaml +23 -0
- templates/laravel/skills/laravel/SKILL.md +56 -0
- templates/laravel/skills/laravel/references/anatomy.md +65 -0
- templates/laravel/stack.yaml +66 -0
- templates/meta/rules/graph-first.md +27 -0
- templates/meta/rules/hook-author.md +19 -0
- templates/meta/rules/mcp-tool-author.md +18 -0
- templates/meta/rules/meta-engineering.md +17 -0
- templates/meta/scaffold-boundary.yaml +55 -0
- templates/meta/skills/claude-sdk-integration/SKILL.md +163 -0
- templates/meta/skills/claude-sdk-integration/assets/sdk-checklist.md +27 -0
- templates/meta/skills/claude-sdk-integration/scripts/check_model_ids.py +97 -0
- templates/meta/skills/graph-os-authoring/SKILL.md +278 -0
- templates/meta/skills/graph-os-authoring/assets/graph-os-checklist.md +25 -0
- templates/meta/skills/graph-os-authoring/scripts/new_extractor.py +76 -0
- templates/meta/skills/hook-authoring/SKILL.md +292 -0
- templates/meta/skills/hook-authoring/assets/hook-checklist.md +30 -0
- templates/meta/skills/hook-authoring/scripts/new_hook.sh +75 -0
- templates/meta/skills/mcp-tool-authoring/SKILL.md +301 -0
- templates/meta/skills/mcp-tool-authoring/assets/mcp-tool-checklist.md +29 -0
- templates/meta/skills/mcp-tool-authoring/scripts/new_tool.py +74 -0
- templates/meta/skills/meta-engineering/SKILL.md +151 -0
- templates/meta/skills/meta-engineering/assets/meta-edit-checklist.md +28 -0
- templates/meta/skills/meta-engineering/scripts/which_layer.py +61 -0
- templates/meta/skills/python-meta-server/SKILL.md +162 -0
- templates/meta/skills/python-meta-server/assets/meta-server-checklist.md +28 -0
- templates/meta/skills/python-meta-server/scripts/check_envelope.py +91 -0
- templates/meta/skills/react-vite-hub/SKILL.md +140 -0
- templates/meta/skills/react-vite-hub/assets/hub-ui-checklist.md +23 -0
- templates/meta/skills/react-vite-hub/scripts/check_vite_env.py +73 -0
- templates/meta/stack.yaml +119 -0
- templates/nestjs/rules/backend.md +20 -0
- templates/nestjs/scaffold/docs/engineering/nestjs-rules.md +33 -0
- templates/nestjs/scaffold/docs/playbooks/nestjs-service.md +39 -0
- templates/nestjs/scaffold/src/backend/nest-cli.json +5 -0
- templates/nestjs/scaffold/src/backend/package.json +28 -0
- templates/nestjs/scaffold/src/backend/src/app.module.ts +9 -0
- templates/nestjs/scaffold/src/backend/src/common/all-exceptions.filter.ts +59 -0
- templates/nestjs/scaffold/src/backend/src/health/health.controller.ts +14 -0
- templates/nestjs/scaffold/src/backend/src/health/health.module.ts +10 -0
- templates/nestjs/scaffold/src/backend/src/health/health.service.spec.ts +21 -0
- templates/nestjs/scaffold/src/backend/src/health/health.service.ts +9 -0
- templates/nestjs/scaffold/src/backend/src/main.ts +26 -0
- templates/nestjs/scaffold/src/backend/tsconfig.json +16 -0
- templates/nestjs/scaffold/src/backend/vitest.config.ts +9 -0
- templates/nestjs/scaffold-boundary.yaml +25 -0
- templates/nestjs/skills/nestjs/SKILL.md +67 -0
- templates/nestjs/skills/nestjs/references/anatomy.md +65 -0
- templates/nestjs/stack.yaml +68 -0
- templates/nextjs/rules/frontend.md +18 -0
- templates/nextjs/scaffold/docs/design/00-index.md +23 -0
- templates/nextjs/scaffold/docs/design/colors-tokens.md +141 -0
- templates/nextjs/scaffold/docs/design/components-patterns.md +159 -0
- templates/nextjs/scaffold/docs/design/motion-accessibility.md +137 -0
- templates/nextjs/scaffold/docs/design/typography-spacing.md +107 -0
- templates/nextjs/scaffold/docs/engineering/accessibility-web.md +56 -0
- templates/nextjs/scaffold/docs/engineering/copywriting-standard.md +102 -0
- templates/nextjs/scaffold/docs/engineering/formatting-rules.md +89 -0
- templates/nextjs/scaffold/docs/engineering/frontend-rendering-rules.md +80 -0
- templates/nextjs/scaffold/docs/engineering/frontend-rules.md +183 -0
- templates/nextjs/scaffold/docs/engineering/i18n-policy.md +99 -0
- templates/nextjs/scaffold/docs/pages-content-spec/00-index.md +78 -0
- templates/nextjs/scaffold/docs/playbooks/content-seo.md +55 -0
- templates/nextjs/scaffold/docs/playbooks/docs-governance.md +51 -0
- templates/nextjs/scaffold/docs/playbooks/frontend-ui.md +63 -0
- templates/nextjs/scaffold/src/frontend/app/layout.tsx +14 -0
- templates/nextjs/scaffold/src/frontend/app/page.tsx +3 -0
- templates/nextjs/scaffold/src/frontend/eslint.config.js +17 -0
- templates/nextjs/scaffold/src/frontend/lib/greeting.test.ts +9 -0
- templates/nextjs/scaffold/src/frontend/lib/greeting.ts +3 -0
- templates/nextjs/scaffold/src/frontend/package.json +28 -0
- templates/nextjs/scaffold/src/frontend/tsconfig.json +18 -0
- templates/nextjs/scaffold/src/frontend/vitest.config.ts +10 -0
- templates/nextjs/scaffold-boundary.yaml +30 -0
- templates/nextjs/skills/nextjs-react/SKILL.md +485 -0
- templates/nextjs/skills/nextjs-react/references/anatomy.md +116 -0
- templates/nextjs/skills/nextjs-react/scripts/new_component.py +72 -0
- templates/nextjs/stack.yaml +81 -0
- templates/node-express/rules/backend.md +20 -0
- templates/node-express/scaffold/docs/engineering/express-rules.md +30 -0
- templates/node-express/scaffold/docs/playbooks/express-service.md +35 -0
- templates/node-express/scaffold/src/backend/package.json +24 -0
- templates/node-express/scaffold/src/backend/src/index.ts +17 -0
- templates/node-express/scaffold/src/backend/src/middleware/error-handler.ts +12 -0
- templates/node-express/scaffold/src/backend/src/routes/health.test.ts +33 -0
- templates/node-express/scaffold/src/backend/src/routes/health.ts +7 -0
- templates/node-express/scaffold/src/backend/tsconfig.json +15 -0
- templates/node-express/scaffold/src/backend/types/express-bootstrap.d.ts +21 -0
- templates/node-express/scaffold-boundary.yaml +25 -0
- templates/node-express/skills/node-express/SKILL.md +70 -0
- templates/node-express/skills/node-express/references/anatomy.md +63 -0
- templates/node-express/stack.yaml +63 -0
- templates/python/scaffold/docs/engineering/python-rules.md +27 -0
- templates/python/scaffold/docs/playbooks/python-library.md +35 -0
- templates/python/stack.yaml +60 -0
- templates/rails/rules/backend.md +10 -0
- templates/rails/scaffold/docs/engineering/rails-rules.md +33 -0
- templates/rails/scaffold/docs/playbooks/rails-service.md +42 -0
- templates/rails/scaffold/src/backend/Gemfile +12 -0
- templates/rails/scaffold/src/backend/app/controllers/application_controller.rb +26 -0
- templates/rails/scaffold/src/backend/app/controllers/health_controller.rb +6 -0
- templates/rails/scaffold/src/backend/app/models/health.rb +6 -0
- templates/rails/scaffold/src/backend/config/application.rb +12 -0
- templates/rails/scaffold/src/backend/config/boot.rb +3 -0
- templates/rails/scaffold/src/backend/config/routes.rb +4 -0
- templates/rails/scaffold/src/backend/config.ru +5 -0
- templates/rails/scaffold/src/backend/spec/rails_helper.rb +18 -0
- templates/rails/scaffold/src/backend/spec/requests/health_spec.rb +24 -0
- templates/rails/scaffold-boundary.yaml +25 -0
- templates/rails/skills/rails/SKILL.md +62 -0
- templates/rails/skills/rails/references/anatomy.md +71 -0
- templates/rails/stack.yaml +72 -0
- templates/react-native/rules/mobile.md +26 -0
- templates/react-native/scaffold/docs/engineering/accessibility-mobile.md +95 -0
- templates/react-native/scaffold/docs/engineering/mobile-rules.md +56 -0
- templates/react-native/scaffold/docs/engineering/offline-first.md +61 -0
- templates/react-native/scaffold/docs/playbooks/mobile-app.md +49 -0
- templates/react-native/scaffold/src/mobile/App.tsx +9 -0
- templates/react-native/scaffold/src/mobile/eslint.config.js +17 -0
- templates/react-native/scaffold/src/mobile/package.json +23 -0
- templates/react-native/scaffold/src/mobile/src/greeting.test.ts +9 -0
- templates/react-native/scaffold/src/mobile/src/greeting.ts +3 -0
- templates/react-native/scaffold/src/mobile/tsconfig.json +17 -0
- templates/react-native/scaffold/src/mobile/vitest.config.ts +10 -0
- templates/react-native/scaffold-boundary.yaml +30 -0
- templates/react-native/skills/react-native-mobile/SKILL.md +119 -0
- templates/react-native/skills/react-native-mobile/assets/rn-mobile-checklist.md +28 -0
- templates/react-native/skills/react-native-mobile/references/anatomy.md +140 -0
- templates/react-native/skills/react-native-mobile/references/rn-2026-practices.md +54 -0
- templates/react-native/skills/react-native-mobile/scripts/new_screen.py +73 -0
- templates/react-native/skills/react-native-mobile/versions.json +16 -0
- templates/react-native/skills/react-native-patterns/SKILL.md +512 -0
- templates/react-native/skills/react-native-patterns/assets/rn-review-checklist.md +26 -0
- templates/react-native/skills/react-native-patterns/references/anatomy.md +62 -0
- templates/react-native/skills/react-native-patterns/references/list-performance.md +70 -0
- templates/react-native/skills/react-native-patterns/scripts/scan_rn_perf.py +77 -0
- templates/react-native/stack.yaml +70 -0
- templates/ruby-plain/scaffold/src/backend/Gemfile +8 -0
- templates/ruby-plain/scaffold/src/backend/main.rb +3 -0
- templates/ruby-plain/scaffold-boundary.yaml +23 -0
- templates/ruby-plain/stack.yaml +50 -0
- templates/rust-axum/rules/backend.md +20 -0
- templates/rust-axum/scaffold/docs/engineering/rust-axum-rules.md +35 -0
- templates/rust-axum/scaffold/docs/playbooks/rust-axum-service.md +43 -0
- templates/rust-axum/scaffold/src/backend/Cargo.toml +20 -0
- templates/rust-axum/scaffold/src/backend/src/app.rs +12 -0
- templates/rust-axum/scaffold/src/backend/src/error.rs +48 -0
- templates/rust-axum/scaffold/src/backend/src/main.rs +24 -0
- templates/rust-axum/scaffold/src/backend/src/routes/health.rs +37 -0
- templates/rust-axum/scaffold/src/backend/src/routes/mod.rs +2 -0
- templates/rust-axum/scaffold-boundary.yaml +25 -0
- templates/rust-axum/skills/rust/SKILL.md +73 -0
- templates/rust-axum/skills/rust/references/anatomy.md +63 -0
- templates/rust-axum/stack.yaml +65 -0
- templates/rust-plain/scaffold/src/backend/Cargo.toml +6 -0
- templates/rust-plain/scaffold/src/backend/src/main.rs +3 -0
- templates/rust-plain/scaffold-boundary.yaml +23 -0
- templates/rust-plain/stack.yaml +51 -0
- templates/spring-boot/rules/backend.md +20 -0
- templates/spring-boot/scaffold/docs/engineering/spring-boot-rules.md +35 -0
- templates/spring-boot/scaffold/docs/playbooks/spring-boot-service.md +45 -0
- templates/spring-boot/scaffold/src/backend/mvnw +302 -0
- templates/spring-boot/scaffold/src/backend/pom.xml +69 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/Application.java +16 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/common/GlobalExceptionHandler.java +31 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthController.java +22 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthService.java +12 -0
- templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthStatus.java +4 -0
- templates/spring-boot/scaffold/src/backend/src/test/java/com/example/app/health/HealthServiceTest.java +15 -0
- templates/spring-boot/scaffold-boundary.yaml +26 -0
- templates/spring-boot/skills/spring-boot/SKILL.md +84 -0
- templates/spring-boot/skills/spring-boot/references/anatomy.md +63 -0
- templates/spring-boot/stack.yaml +65 -0
- templates/svelte-sveltekit/rules/frontend.md +20 -0
- templates/svelte-sveltekit/scaffold/docs/engineering/svelte-sveltekit-rules.md +37 -0
- templates/svelte-sveltekit/scaffold/docs/playbooks/svelte-sveltekit-app.md +36 -0
- templates/svelte-sveltekit/scaffold/src/frontend/package.json +22 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/app.html +12 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/hooks.server.ts +14 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/lib/components/Greeting.svelte +6 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/lib/stores/count.test.ts +26 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/lib/stores/count.ts +4 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+layout.svelte +24 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+page.svelte +9 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+page.ts +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/src/routes/health/+server.ts +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/svelte.config.js +10 -0
- templates/svelte-sveltekit/scaffold/src/frontend/tsconfig.json +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/vite.config.ts +7 -0
- templates/svelte-sveltekit/scaffold/src/frontend/vitest.config.ts +11 -0
- templates/svelte-sveltekit/scaffold-boundary.yaml +29 -0
- templates/svelte-sveltekit/skills/svelte/SKILL.md +90 -0
- templates/svelte-sveltekit/skills/svelte/references/anatomy.md +62 -0
- templates/svelte-sveltekit/stack.yaml +70 -0
- templates/typescript-plain/scaffold/src/index.ts +3 -0
- templates/typescript-plain/scaffold/tsconfig.json +13 -0
- templates/typescript-plain/scaffold-boundary.yaml +22 -0
- templates/typescript-plain/stack.yaml +44 -0
- templates/vue-nuxt/rules/frontend.md +19 -0
- templates/vue-nuxt/scaffold/docs/engineering/nuxt-rules.md +30 -0
- templates/vue-nuxt/scaffold/docs/playbooks/nuxt-app.md +29 -0
- templates/vue-nuxt/scaffold/src/frontend/app.vue +3 -0
- templates/vue-nuxt/scaffold/src/frontend/nuxt.config.ts +11 -0
- templates/vue-nuxt/scaffold/src/frontend/package.json +20 -0
- templates/vue-nuxt/scaffold/src/frontend/pages/index.test.ts +19 -0
- templates/vue-nuxt/scaffold/src/frontend/pages/index.vue +11 -0
- templates/vue-nuxt/scaffold/src/frontend/vitest.config.ts +12 -0
- templates/vue-nuxt/scaffold-boundary.yaml +26 -0
- templates/vue-nuxt/skills/vue-nuxt/SKILL.md +57 -0
- templates/vue-nuxt/skills/vue-nuxt/references/anatomy.md +60 -0
- templates/vue-nuxt/stack.yaml +61 -0
- templates/wordpress/rules/backend.md +19 -0
- templates/wordpress/scaffold/docs/engineering/wordpress-rules.md +28 -0
- templates/wordpress/scaffold/docs/playbooks/wordpress-service.md +29 -0
- templates/wordpress/scaffold/src/backend/composer.json +17 -0
- templates/wordpress/scaffold/src/backend/phpcs.xml.dist +11 -0
- templates/wordpress/scaffold/src/backend/phpunit.xml +10 -0
- templates/wordpress/scaffold/src/backend/plugin/inc/health.php +8 -0
- templates/wordpress/scaffold/src/backend/plugin/plugin.php +28 -0
- templates/wordpress/scaffold/src/backend/tests/HealthStatusTest.php +15 -0
- templates/wordpress/scaffold/src/backend/theme/functions.php +18 -0
- templates/wordpress/scaffold/src/backend/theme/style.css +11 -0
- templates/wordpress/scaffold-boundary.yaml +23 -0
- templates/wordpress/skills/wordpress/SKILL.md +110 -0
- templates/wordpress/skills/wordpress/assets/wp-checklist.md +28 -0
- templates/wordpress/skills/wordpress/references/wp-development.md +75 -0
- templates/wordpress/skills/wordpress/references/wp-security.md +68 -0
- templates/wordpress/skills/wordpress/scripts/scan_wp_smells.py +91 -0
- templates/wordpress/skills/wordpress/versions.json +16 -0
- templates/wordpress/stack.yaml +60 -0
- thinking_os/__init__.py +1 -0
- thinking_os/_agent_markers.py +32 -0
- thinking_os/background.py +405 -0
- thinking_os/bootstrap_outcomes.py +200 -0
- thinking_os/budget.py +302 -0
- thinking_os/capture.py +495 -0
- thinking_os/cognition.py +516 -0
- thinking_os/cognition_schemas.py +517 -0
- thinking_os/compress.py +192 -0
- thinking_os/concepts.py +233 -0
- thinking_os/dashboard.py +159 -0
- thinking_os/database.py +2883 -0
- thinking_os/decay.py +393 -0
- thinking_os/digest.py +295 -0
- thinking_os/dispatcher.py +192 -0
- thinking_os/dispatcher_helpers.py +48 -0
- thinking_os/dispatchers/__init__.py +3 -0
- thinking_os/dispatchers/default.py +47 -0
- thinking_os/distill.py +192 -0
- thinking_os/doc_indexer.py +905 -0
- thinking_os/embeddings.py +943 -0
- thinking_os/formula_composer.py +556 -0
- thinking_os/gate_marker.py +75 -0
- thinking_os/graph.py +296 -0
- thinking_os/graph_indexer.py +360 -0
- thinking_os/health_check.py +517 -0
- thinking_os/impact.py +119 -0
- thinking_os/memory_gc.py +356 -0
- thinking_os/migrator_embeddings.py +318 -0
- thinking_os/precision.py +194 -0
- thinking_os/record_outcome.py +399 -0
- thinking_os/repair.py +105 -0
- thinking_os/retrieval_quality.py +239 -0
- thinking_os/roles_state.py +168 -0
- thinking_os/sanitizer.py +320 -0
- thinking_os/server.py +3160 -0
- thinking_os/session_enrich.py +272 -0
- thinking_os/session_observe_worker.py +111 -0
- thinking_os/session_startup.py +74 -0
- thinking_os/session_summary.py +245 -0
- thinking_os/task_analyzer.py +462 -0
- thinking_os/task_parser.py +342 -0
- thinking_os/task_sync.py +73 -0
- thinking_os/tools/__init__.py +6 -0
- thinking_os/tools/_shared.py +947 -0
- thinking_os/tools/cognition.py +1867 -0
- thinking_os/tools/docs.py +770 -0
- thinking_os/tools/learning.py +2078 -0
- thinking_os/tools/logs.py +79 -0
- thinking_os/tools/memory.py +840 -0
- thinking_os/tools/metrics.py +200 -0
- thinking_os/tools/retrieve.py +415 -0
- thinking_os/tools/routing.py +658 -0
- thinking_os/tools/tasks.py +449 -0
- thinking_os/tools/trajectory.py +181 -0
- thinking_os/tracing.py +235 -0
- web/__init__.py +5 -0
- web/_cache.py +118 -0
- web/_deps.py +56 -0
- web/_envelope.py +85 -0
- web/_project_context.py +140 -0
- web/chat_providers.py +108 -0
- web/init_jobs.py +216 -0
- web/routes/__init__.py +25 -0
- web/routes/_bounded_read.py +76 -0
- web/routes/board.py +1089 -0
- web/routes/cognition.py +1838 -0
- web/routes/config.py +635 -0
- web/routes/graph.py +513 -0
- web/routes/health.py +180 -0
- web/routes/hooks.py +288 -0
- web/routes/hub.py +1219 -0
- web/routes/logs.py +374 -0
- web/routes/metrics.py +43 -0
- web/routes/observability.py +400 -0
- web/routes/patterns.py +227 -0
- web/routes/presence.py +609 -0
- web/routes/roles.py +446 -0
- web/routes/scheduled.py +261 -0
- web/routes/search.py +238 -0
- web/routes/sessions.py +220 -0
- web/routes/settings.py +363 -0
- web/routes/stream.py +547 -0
- web/security.py +157 -0
- web/server.py +283 -0
|
@@ -0,0 +1,729 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# SessionStart hook: Re-inject critical workflow context after compaction, resume, or startup.
|
|
3
|
+
# Agent-aware: session-id + volatile state live in COS_AGENT_DIR so two agents
|
|
4
|
+
# on the same project never share ephemeral state. Shared artifacts (DB, log)
|
|
5
|
+
# stay at COS_STATE_DIR. Full design in docs/engineering/state-files.md.
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
source "$(dirname "$0")/cos-env.sh" 2>/dev/null || true
|
|
9
|
+
if ! command -v cos_log_hook >/dev/null 2>&1; then cos_log_hook() { :; }; fi
|
|
10
|
+
|
|
11
|
+
# Resolve physical hooks dir — required for consumer projects where
|
|
12
|
+
# .claude/hooks/ is a real dir but each hook FILE is a symlink to
|
|
13
|
+
# src/core/hooks/. pwd -P only resolves symlinked directories, not files,
|
|
14
|
+
# so dirname+"$0" stays in .claude/hooks/ and ../thinking_os misses.
|
|
15
|
+
# BASH_SOURCE[0]+readlink follows the file symlink to its physical target.
|
|
16
|
+
_cos_src="${BASH_SOURCE[0]}"
|
|
17
|
+
while [ -L "$_cos_src" ]; do
|
|
18
|
+
_cos_dir="$(cd -P "$(dirname "$_cos_src")" && pwd)"
|
|
19
|
+
_cos_src="$(readlink "$_cos_src")"
|
|
20
|
+
[[ "$_cos_src" != /* ]] && _cos_src="${_cos_dir}/${_cos_src}"
|
|
21
|
+
done
|
|
22
|
+
_COS_HOOKS_PHYS="$(cd -P "$(dirname "$_cos_src")" && pwd)"
|
|
23
|
+
unset _cos_src _cos_dir
|
|
24
|
+
|
|
25
|
+
INPUT="$(cos_read_stdin_bounded 2)"
|
|
26
|
+
|
|
27
|
+
# Upgrade panel-id from stdin session_id BEFORE any state file is touched.
|
|
28
|
+
# After this call, $COS_PANEL_ID / $COS_PANEL_DIR / $COS_SESSION_FILE reflect
|
|
29
|
+
# the strongest available signal (Claude/Codex hook payload UUID).
|
|
30
|
+
# All subsequent reads/writes in this hook target the right panel dir.
|
|
31
|
+
cos_panel_upgrade_from_payload "$INPUT" 2>/dev/null || true
|
|
32
|
+
|
|
33
|
+
COS_HOOK_RUNTIME_MODEL="$(printf '%s' "$INPUT" | jq -r '.model // empty' 2>/dev/null || true)"
|
|
34
|
+
export COS_HOOK_RUNTIME_MODEL
|
|
35
|
+
|
|
36
|
+
# Persist the model so hooks that don't receive it in stdin (PostToolUse
|
|
37
|
+
# that dispatches an async worker, CLI-originated task-done, etc.) can
|
|
38
|
+
# stamp task_outcomes.model and feed routing_weights. File is truncated
|
|
39
|
+
# each write — only the latest signal matters.
|
|
40
|
+
if [[ -n "$COS_HOOK_RUNTIME_MODEL" ]] && [[ -n "${COS_AGENT_DIR:-}" ]]; then
|
|
41
|
+
mkdir -p "$COS_AGENT_DIR" 2>/dev/null || true
|
|
42
|
+
printf '%s' "$COS_HOOK_RUNTIME_MODEL" > "$COS_AGENT_DIR/.model" 2>/dev/null || true
|
|
43
|
+
fi
|
|
44
|
+
# SessionStart payloads carry `.source`; UserPromptSubmit carries `.prompt`.
|
|
45
|
+
# Treat prompt submits as their own source so Codex doesn't rotate session-id
|
|
46
|
+
# or clear volatile state on every prompt.
|
|
47
|
+
SOURCE=$(echo "$INPUT" | jq -r '
|
|
48
|
+
if has("source") and (.source | type == "string") then .source
|
|
49
|
+
elif has("prompt") then "user-prompt-submit"
|
|
50
|
+
else "startup"
|
|
51
|
+
end
|
|
52
|
+
' 2>/dev/null || echo "startup")
|
|
53
|
+
cos_log_hook session-context fire "source=${SOURCE}"
|
|
54
|
+
|
|
55
|
+
# Ensure all dirs exist — COS_STATE_DIR for shared, COS_AGENT_DIR for
|
|
56
|
+
# per-agent shared, COS_PANEL_DIR for per-panel private.
|
|
57
|
+
mkdir -p "$COS_STATE_DIR" "$COS_AGENT_DIR" "$COS_PANEL_DIR"
|
|
58
|
+
|
|
59
|
+
# Loud, debounced collision diagnostic (TASK-288): when the panel id fell back
|
|
60
|
+
# to a PPID hash (no runtime session-id var exported), two sibling panels that
|
|
61
|
+
# share a PPID can collide on this one panel dir and clobber each other's
|
|
62
|
+
# task/gate/skill state. Surface it ONCE per session — a silent collision is
|
|
63
|
+
# the failure mode this converts into an observed, fail-safe event.
|
|
64
|
+
if [[ "${COS_PANEL_ID_SOURCE:-}" == "ppid" ]]; then
|
|
65
|
+
_ppid_marker="${COS_PANEL_DIR}/.ppid-collision-warned"
|
|
66
|
+
if [[ ! -f "$_ppid_marker" ]]; then
|
|
67
|
+
echo "warning: coding-os panel id resolved via PPID fallback ('${COS_PANEL_ID}') — no runtime session-id var (CLAUDE_CODE_SESSION_ID / CODEX_SESSION_ID) exported. Sibling panels sharing this PPID may collide on one state dir and clobber task/gate/skill state. See docs/engineering/state-files.md." >&2
|
|
68
|
+
printf 'panel_id=%s reason=no-runtime-session-id\n' "$COS_PANEL_ID" > "$_ppid_marker" 2>/dev/null || true
|
|
69
|
+
cos_log_hook session-context warn "reason=ppid-fallback panel=${COS_PANEL_ID}" || true
|
|
70
|
+
fi
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# Refresh the .agent marker whenever cos-env.sh detected the runtime.
|
|
74
|
+
# Stale markers (e.g. `codex` left over after switching to Claude) mis-route
|
|
75
|
+
# fallback paths in capture.py — rewrite on every session
|
|
76
|
+
# boundary so the *last* adapter to start is authoritative.
|
|
77
|
+
if [[ -n "${COS_AGENT:-}" ]] && [[ "$COS_AGENT" != "unknown" ]]; then
|
|
78
|
+
_AGENT_MARKER="$COS_STATE_DIR/.agent"
|
|
79
|
+
if [[ ! -f "$_AGENT_MARKER" ]] || [[ "$(cat "$_AGENT_MARKER" 2>/dev/null)" != "$COS_AGENT" ]]; then
|
|
80
|
+
printf '%s' "$COS_AGENT" > "$_AGENT_MARKER" 2>/dev/null || true
|
|
81
|
+
cos_log_hook session-context agent-refresh "agent=${COS_AGENT}"
|
|
82
|
+
fi
|
|
83
|
+
unset _AGENT_MARKER
|
|
84
|
+
fi
|
|
85
|
+
|
|
86
|
+
# Refresh the agent-level "latest active session" pointer that the
|
|
87
|
+
# long-lived MCP server reads for attribution (it has no $COS_PANEL_DIR,
|
|
88
|
+
# so it cannot read the strict per-panel session-id). On a non-startup
|
|
89
|
+
# prompt the panel session-id already exists; mirror it here so a task
|
|
90
|
+
# created via MCP this turn is attributed to the live session, not a
|
|
91
|
+
# stale fossil. Last-writer-wins across concurrent panels — documented
|
|
92
|
+
# approximation in docs/engineering/state-files.md. Startup writes it
|
|
93
|
+
# after id generation below.
|
|
94
|
+
if [[ "$SOURCE" != "startup" ]] && [[ -n "${COS_SESSION_FILE:-}" ]] && [[ -f "$COS_SESSION_FILE" ]]; then
|
|
95
|
+
tr -d '\n\r' < "$COS_SESSION_FILE" > "$COS_AGENT_DIR/.active-session" 2>/dev/null || true
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
# Generate session ID ONLY on fresh startup — NOT on compact or resume.
|
|
99
|
+
if [[ "$SOURCE" == "startup" ]]; then
|
|
100
|
+
# Orphan recovery: if the PREVIOUS session in THIS PANEL had observations
|
|
101
|
+
# but never got a clean Stop, its session_summaries row was never built.
|
|
102
|
+
# We rebuild it here before the ID is overwritten. session_summary.py is
|
|
103
|
+
# idempotent (UPSERT) so this is a no-op when Stop fired cleanly.
|
|
104
|
+
# Falls back to legacy flat $COS_AGENT_DIR/session-id during the
|
|
105
|
+
# migration window.
|
|
106
|
+
PREV_SESSION_ID=""
|
|
107
|
+
if [ -f "$COS_SESSION_FILE" ]; then
|
|
108
|
+
PREV_SESSION_ID=$(cat "$COS_SESSION_FILE" 2>/dev/null || true)
|
|
109
|
+
elif [ -f "${COS_AGENT_DIR}/session-id" ]; then
|
|
110
|
+
PREV_SESSION_ID=$(cat "${COS_AGENT_DIR}/session-id" 2>/dev/null || true)
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
if [ -n "$PREV_SESSION_ID" ] && [ -f "$COS_DB_PATH" ]; then
|
|
114
|
+
SUMMARY_PY="${_COS_HOOKS_PHYS}/../thinking_os/session_summary.py"
|
|
115
|
+
if [ -f "$SUMMARY_PY" ]; then
|
|
116
|
+
python3 "$SUMMARY_PY" "$PREV_SESSION_ID" "" "$COS_DB_PATH" >/dev/null 2>&1 || true
|
|
117
|
+
cos_log_hook session-context recovered "prev_session=${PREV_SESSION_ID}"
|
|
118
|
+
fi
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
# Session-id is agent-prefixed so logs and state files are self-describing.
|
|
122
|
+
# Format: ses-<agent>-YYYYMMDD-HHMMSS-xxxx. Two agents (Claude+Codex) on
|
|
123
|
+
# the same repo get distinct ids; two PANELS of the same agent get
|
|
124
|
+
# distinct ids too because each panel writes to its own $COS_SESSION_FILE
|
|
125
|
+
# (which now lives in $COS_PANEL_DIR, not $COS_AGENT_DIR).
|
|
126
|
+
SESSION_ID="ses-${COS_AGENT}-$(date +%Y%m%d-%H%M%S)-$(head -c 4 /dev/urandom | xxd -p | head -c 4)"
|
|
127
|
+
echo "$SESSION_ID" > "$COS_SESSION_FILE"
|
|
128
|
+
# Seed the agent-level active-session pointer for the MCP server (see
|
|
129
|
+
# the non-startup refresh above for rationale).
|
|
130
|
+
printf '%s' "$SESSION_ID" > "$COS_AGENT_DIR/.active-session" 2>/dev/null || true
|
|
131
|
+
|
|
132
|
+
# Clear volatile markers from previous sessions. Scope is THIS PANEL's
|
|
133
|
+
# private dir — sibling panels of the same agent are untouched, and the
|
|
134
|
+
# other agent's state is also untouched. NOT cleared: agent-shared
|
|
135
|
+
# (.model, .swimlane, .last-verify) and self-refreshing (.task-mode is
|
|
136
|
+
# now per-panel but rewritten every prompt by classify-task-mode).
|
|
137
|
+
CLEARED=0
|
|
138
|
+
for STATE_FILE in \
|
|
139
|
+
"${COS_PANEL_DIR}/.thinking_os-gate" \
|
|
140
|
+
"${COS_PANEL_DIR}/.task-current" \
|
|
141
|
+
"${COS_PANEL_DIR}/.zoom-checkpoint" \
|
|
142
|
+
"${COS_PANEL_DIR}/.active-skill" \
|
|
143
|
+
"${COS_PANEL_DIR}/.doc-anchor" \
|
|
144
|
+
"${COS_PANEL_DIR}/.memory-check" \
|
|
145
|
+
"${COS_PANEL_DIR}/.learn-suggestions" \
|
|
146
|
+
"${COS_PANEL_DIR}/.active-formula" \
|
|
147
|
+
"${COS_PANEL_DIR}/.doc-anchor-override" \
|
|
148
|
+
"${COS_PANEL_DIR}/.memory-check-override" \
|
|
149
|
+
"${COS_PANEL_DIR}/.uv-heredoc-override" \
|
|
150
|
+
"${COS_PANEL_DIR}/.zoom-prompt-suggested" \
|
|
151
|
+
"${COS_PANEL_DIR}/.docs-first-nudged" \
|
|
152
|
+
"${COS_PANEL_DIR}/.git-mode-nudged" \
|
|
153
|
+
"${COS_PANEL_DIR}/.roles-composed" \
|
|
154
|
+
"${COS_PANEL_DIR}/.roles" \
|
|
155
|
+
"${COS_PANEL_DIR}/.role" \
|
|
156
|
+
"${COS_PANEL_DIR}/.graph-call-seen" \
|
|
157
|
+
"${COS_PANEL_DIR}/.abandoned-task-warned" \
|
|
158
|
+
"${COS_PANEL_DIR}/.graph-empty-warning-shown" \
|
|
159
|
+
"${COS_PANEL_DIR}/.last-discovery-reminder" \
|
|
160
|
+
"${COS_STATE_DIR}/.capture-errors.log"; do
|
|
161
|
+
if [ -e "$STATE_FILE" ]; then
|
|
162
|
+
rm -f "$STATE_FILE"
|
|
163
|
+
CLEARED=$((CLEARED + 1))
|
|
164
|
+
fi
|
|
165
|
+
done
|
|
166
|
+
# Per-panel nudge debounce DIRECTORIES — rm -rf, they hold
|
|
167
|
+
# one file per matched pattern/leg, not a single marker.
|
|
168
|
+
for STATE_DIR_MARK in \
|
|
169
|
+
"${COS_PANEL_DIR}/.graph-nudge" \
|
|
170
|
+
"${COS_PANEL_DIR}/.task-nudge" \
|
|
171
|
+
"${COS_PANEL_DIR}/.jit-nudge" \
|
|
172
|
+
"${COS_PANEL_DIR}/.test-first-reminded"; do
|
|
173
|
+
if [ -d "$STATE_DIR_MARK" ]; then
|
|
174
|
+
rm -rf "$STATE_DIR_MARK"
|
|
175
|
+
CLEARED=$((CLEARED + 1))
|
|
176
|
+
fi
|
|
177
|
+
done
|
|
178
|
+
# Agent-scoped graph consult markers (.graph/ctx-* / plan-*). Prune by age,
|
|
179
|
+
# not wholesale: other live panels share this dir, and freshness binding
|
|
180
|
+
# already invalidates a marker whose file changed. 12h keeps a session warm.
|
|
181
|
+
if [ -d "${COS_AGENT_DIR}/.graph" ]; then
|
|
182
|
+
find "${COS_AGENT_DIR}/.graph" -type f -mmin +720 -delete 2>/dev/null || true
|
|
183
|
+
fi
|
|
184
|
+
cos_log_hook session-context reset "cleared=${CLEARED} panel=${COS_PANEL_ID}"
|
|
185
|
+
fi
|
|
186
|
+
|
|
187
|
+
# ---------------------------------------------------------------------------
|
|
188
|
+
# SessionStart cognitive emission — channel split (spec:
|
|
189
|
+
# src/core/rules/transparency-banner.md § SessionStart emission). Two buffers:
|
|
190
|
+
# SS_HIDDEN — agent context (recovery rules, [Session State], [MCP Prime],
|
|
191
|
+
# [Agent Digest]). Claude -> ONE hidden additionalContext envelope
|
|
192
|
+
# (operator never sees it). Codex -> folded into the delegate's
|
|
193
|
+
# plain text (the dispatcher merges 2>&1 + re-wraps the card).
|
|
194
|
+
# SS_VISIBLE — operator alerts that MUST stay in the chat ([Uncommitted Work],
|
|
195
|
+
# active-tasks). Claude -> stderr (visible, like warn-mcp-down's
|
|
196
|
+
# banner). Codex -> folded in with the rest.
|
|
197
|
+
SS_HIDDEN=""
|
|
198
|
+
SS_VISIBLE=""
|
|
199
|
+
_ss_append() {
|
|
200
|
+
local _name="$1" _txt="$2"
|
|
201
|
+
if [[ -n "$_txt" ]]; then
|
|
202
|
+
if [[ -z "${!_name}" ]]; then
|
|
203
|
+
printf -v "$_name" '%s' "$_txt"
|
|
204
|
+
else
|
|
205
|
+
printf -v "$_name" '%s\n%s' "${!_name}" "$_txt"
|
|
206
|
+
fi
|
|
207
|
+
fi
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
# On compact or resume: re-inject critical workflow reminders + current state
|
|
211
|
+
# snapshot (HIDDEN — agent recovery context, not operator noise).
|
|
212
|
+
if [[ "$SOURCE" == "compact" ]] || [[ "$SOURCE" == "resume" ]]; then
|
|
213
|
+
_recovery="$(printf '%s\n' \
|
|
214
|
+
'[Session Context Recovery]' \
|
|
215
|
+
'' \
|
|
216
|
+
'CRITICAL WORKFLOW RULES:' \
|
|
217
|
+
'1. Task lifecycle — cos task-start/move/done (NEVER hand-edit status:/checkboxes; enforce-task-transition BLOCKS it). Look up via cos task-show / cos_task_search, not ls/grep.' \
|
|
218
|
+
'2. Verification Matrix — run domain verification BEFORE marking done' \
|
|
219
|
+
'3. Complexity Gate — record gate before writing code (thinking_os-gate.sh BLOCKS without it)' \
|
|
220
|
+
'4. Domain skill — invoke matching skill before writing code' \
|
|
221
|
+
'5. MCP tools deferred — ToolSearch("select:mcp__coding-os__cos_task_move,mcp__coding-os__cos_task_show,mcp__coding-os__cos_task_search,mcp__coding-os__cos_supervise_record_output") before first use each session')"
|
|
222
|
+
|
|
223
|
+
# Emit dynamic state snapshot so agent knows WHERE it is after compaction.
|
|
224
|
+
source "$(dirname "$0")/check-state.sh" 2>/dev/null || true
|
|
225
|
+
# Helper: panel file ONLY. Reading the agent-dir fossil here would leak
|
|
226
|
+
# another panel's compact/resume snapshot into this panel.
|
|
227
|
+
_panel_or_agent() {
|
|
228
|
+
local base="$1"
|
|
229
|
+
if [[ -f "${COS_PANEL_DIR}/${base}" ]]; then
|
|
230
|
+
echo "${COS_PANEL_DIR}/${base}"
|
|
231
|
+
fi
|
|
232
|
+
}
|
|
233
|
+
_GATE_STATUS="not recorded"
|
|
234
|
+
_GATE_FILE="$(_panel_or_agent .thinking_os-gate)"
|
|
235
|
+
if [[ -n "$_GATE_FILE" ]]; then
|
|
236
|
+
check_state "$_GATE_FILE" 7200
|
|
237
|
+
if [[ "$STATE_VALID" == "true" ]]; then
|
|
238
|
+
_GATE_STATUS="$STATE_VALUE (valid)"
|
|
239
|
+
else
|
|
240
|
+
_GATE_STATUS="STALE — ${STATE_REASON} — re-record: write-state.sh .thinking_os-gate \"CLEAR 1\""
|
|
241
|
+
fi
|
|
242
|
+
fi
|
|
243
|
+
_TASK_CURRENT=""
|
|
244
|
+
_TASK_FILE="$(_panel_or_agent .task-current)"
|
|
245
|
+
if [[ -n "$_TASK_FILE" ]]; then
|
|
246
|
+
_TASK_CURRENT=$(cat "$_TASK_FILE" 2>/dev/null | head -1 | cut -d' ' -f2- || true)
|
|
247
|
+
fi
|
|
248
|
+
_ACTIVE_SKILL=""
|
|
249
|
+
_SKILL_FILE="$(_panel_or_agent .active-skill)"
|
|
250
|
+
if [[ -n "$_SKILL_FILE" ]]; then
|
|
251
|
+
_ACTIVE_SKILL=$(cat "$_SKILL_FILE" 2>/dev/null | head -1 | cut -d' ' -f2- || true)
|
|
252
|
+
fi
|
|
253
|
+
|
|
254
|
+
_recovery="${_recovery}"$'\n'"[Session State] gate=${_GATE_STATUS} | task=${_TASK_CURRENT:-none} | skill=${_ACTIVE_SKILL:-none}"
|
|
255
|
+
_ss_append SS_HIDDEN "$_recovery"
|
|
256
|
+
fi
|
|
257
|
+
|
|
258
|
+
# On startup: show active in-progress tasks (Scrumban) so the agent
|
|
259
|
+
# inherits open work without having to query the board first.
|
|
260
|
+
if [[ "$SOURCE" == "startup" ]]; then
|
|
261
|
+
if [ -d "docs/tasks" ] && [ -f "$COS_DB_PATH" ]; then
|
|
262
|
+
# bash 5.3.9 deadlocks `$(python3 - <<HEREDOC)`. Form B (separate
|
|
263
|
+
# .py file invoked as `python3 path/to/file.py`) is the only
|
|
264
|
+
# deadlock-immune pattern. Resolve via readlink so symlinked install
|
|
265
|
+
# paths still find _helpers/.
|
|
266
|
+
_src="${BASH_SOURCE[0]}"
|
|
267
|
+
while [ -L "$_src" ]; do
|
|
268
|
+
_dir="$(cd -P "$(dirname "$_src")" && pwd)"
|
|
269
|
+
_src="$(readlink "$_src")"
|
|
270
|
+
[[ "$_src" != /* ]] && _src="$_dir/$_src"
|
|
271
|
+
done
|
|
272
|
+
HSRC="$(cd -P "$(dirname "$_src")" && pwd)"
|
|
273
|
+
unset _src _dir
|
|
274
|
+
WIP_HELPER="${HSRC}/_helpers/wip_lines.py"
|
|
275
|
+
if [[ -f "$WIP_HELPER" ]]; then
|
|
276
|
+
WIP_LINES=$(python3 "$WIP_HELPER" "$COS_DB_PATH" 2>/dev/null || true)
|
|
277
|
+
else
|
|
278
|
+
WIP_LINES=""
|
|
279
|
+
fi
|
|
280
|
+
# Active in-progress work is an operator-facing status signal (VISIBLE).
|
|
281
|
+
if [ -n "$WIP_LINES" ]; then
|
|
282
|
+
_ss_append SS_VISIBLE "[Session Start] Active tasks (in_progress / testing):
|
|
283
|
+
${WIP_LINES}
|
|
284
|
+
Resume with: cos task-show TASK-NNN | cos board"
|
|
285
|
+
fi
|
|
286
|
+
fi
|
|
287
|
+
|
|
288
|
+
# Surface an uncommitted working tree — a prior session may have been
|
|
289
|
+
# abandoned mid-task. The agent must NOT blind-commit another session's
|
|
290
|
+
# WIP (see src/core/rules/git-workflow.md § Concurrent sessions).
|
|
291
|
+
# Read-only; never blocks. Operator-facing safety alert (VISIBLE).
|
|
292
|
+
if command -v git >/dev/null 2>&1 && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
293
|
+
DIRTY=$(git status --porcelain 2>/dev/null | head -20 || true)
|
|
294
|
+
if [ -n "$DIRTY" ]; then
|
|
295
|
+
DIRTY_N=$(printf '%s\n' "$DIRTY" | wc -l | tr -d ' ')
|
|
296
|
+
_ss_append SS_VISIBLE "[Uncommitted Work] ${DIRTY_N} file(s) modified — possibly a prior session's WIP:
|
|
297
|
+
$(printf '%s\n' "$DIRTY" | sed 's/^/ /')
|
|
298
|
+
Commit with EXPLICIT paths only — never a bare 'git commit'."
|
|
299
|
+
fi
|
|
300
|
+
fi
|
|
301
|
+
|
|
302
|
+
# Prime the hot task-tool family once. These cos_* tools are deferred
|
|
303
|
+
# (Claude-harness-side, not repo-controllable — see mcp-schema-traps.md),
|
|
304
|
+
# so front-loading one ToolSearch avoids mid-task InputValidationError
|
|
305
|
+
# round-trips that push the agent back to raw Edit/Bash. Agent-only (HIDDEN).
|
|
306
|
+
_ss_append SS_HIDDEN "[MCP Prime] Hot tools are deferred — load the task family ONCE now so you don't fall back to raw Edit/Bash for task ops:
|
|
307
|
+
ToolSearch(\"select:mcp__coding-os__cos_task_move,mcp__coding-os__cos_task_show,mcp__coding-os__cos_task_board,mcp__coding-os__cos_task_search,mcp__coding-os__cos_supervise_record_output,mcp__coding-os__cos_classify_prompt\")"
|
|
308
|
+
fi
|
|
309
|
+
|
|
310
|
+
# Agent digest = memory inheritance (HIDDEN). Runs on a FRESH process only —
|
|
311
|
+
# startup or resume. A same-session auto-compact (Claude-only source) keeps the
|
|
312
|
+
# digest in working memory, so re-emitting it there is the wasted re-dump that
|
|
313
|
+
# put a multi-thousand-token wall mid-chat; suppress it on compact
|
|
314
|
+
# (src/core/rules/transparency-banner.md § SessionStart emission, state-files.md §S5).
|
|
315
|
+
if [[ "$SOURCE" == "startup" || "$SOURCE" == "resume" ]]; then
|
|
316
|
+
# Constitution slice = the values layer the rules derive from (HIDDEN). Same
|
|
317
|
+
# startup/resume gate as the digest (suppressed on compact — the slice is
|
|
318
|
+
# already in working memory). SSOT is docs/governance/constitution.md; we
|
|
319
|
+
# surface only the delimited slice so the file stays the single source (TASK-491).
|
|
320
|
+
CONSTITUTION_DOC="${COS_PROJECT_ROOT:-$(pwd)}/docs/governance/constitution.md"
|
|
321
|
+
if [ -f "$CONSTITUTION_DOC" ] && grep -q '<!-- SLICE:START -->' "$CONSTITUTION_DOC" 2>/dev/null && grep -q '<!-- SLICE:END -->' "$CONSTITUTION_DOC" 2>/dev/null; then
|
|
322
|
+
# Both markers required: a missing SLICE:END would make sed dump the rest of
|
|
323
|
+
# the file into the injection (unbounded tokens) — guard before extracting.
|
|
324
|
+
CONSTITUTION_SLICE=$(sed -n '/<!-- SLICE:START -->/,/<!-- SLICE:END -->/p' "$CONSTITUTION_DOC" 2>/dev/null | grep -vE 'SLICE:(START|END)' || true)
|
|
325
|
+
if [ -n "$CONSTITUTION_SLICE" ]; then
|
|
326
|
+
_ss_append SS_HIDDEN "[Constitution] (values the rules derive from — full: docs/governance/constitution.md)
|
|
327
|
+
${CONSTITUTION_SLICE}"
|
|
328
|
+
fi
|
|
329
|
+
fi
|
|
330
|
+
|
|
331
|
+
# Agent digest: the always-active working-memory snapshot
|
|
332
|
+
# (identity, top domains, beliefs, fading patterns, breakthroughs). The
|
|
333
|
+
# digest was printed but never regenerated (cos_digest_regenerate had no
|
|
334
|
+
# hook caller, so digest.md never existed) — regenerate it here first so
|
|
335
|
+
# the agent inherits a FRESH memory summary each session. The regen is a
|
|
336
|
+
# side-effect (writes digest.md); its stdout is not agent content -> /dev/null.
|
|
337
|
+
if [ -f "$COS_DB_PATH" ]; then
|
|
338
|
+
DIGEST_REGEN="${_COS_HOOKS_PHYS}/_helpers/digest_regen.py"
|
|
339
|
+
if [ -f "$DIGEST_REGEN" ]; then
|
|
340
|
+
python3 "$DIGEST_REGEN" "$COS_DB_PATH" "${COS_PROJECT_ROOT:-$(pwd)}" >/dev/null 2>&1 || true
|
|
341
|
+
fi
|
|
342
|
+
fi
|
|
343
|
+
DIGEST_PATH="${COS_STATE_DIR:-.coding-os}/digest.md"
|
|
344
|
+
if [ -f "$DIGEST_PATH" ]; then
|
|
345
|
+
_ss_append SS_HIDDEN "[Agent Digest]
|
|
346
|
+
$(cat "$DIGEST_PATH")"
|
|
347
|
+
fi
|
|
348
|
+
|
|
349
|
+
# Project Trajectory: inject latest trajectory snapshot so the
|
|
350
|
+
# agent knows WHERE the project is heading (not just what tasks are open).
|
|
351
|
+
# The trajectory section is already embedded in digest.md when present;
|
|
352
|
+
# this helper also surfaces it as a standalone block for emphasis.
|
|
353
|
+
if [ -f "$COS_DB_PATH" ]; then
|
|
354
|
+
TRAJ_HELPER="${_COS_HOOKS_PHYS}/_helpers/trajectory_startup.py"
|
|
355
|
+
if [ -f "$TRAJ_HELPER" ]; then
|
|
356
|
+
_ss_append SS_HIDDEN "$(python3 "$TRAJ_HELPER" "$COS_DB_PATH" 2>/dev/null || true)"
|
|
357
|
+
fi
|
|
358
|
+
fi
|
|
359
|
+
|
|
360
|
+
# Autonomous Routing Evolution: detect stale routing weights
|
|
361
|
+
# and auto-trigger recalculate_weights when N=15 new outcomes accumulated.
|
|
362
|
+
if [ -f "$COS_DB_PATH" ]; then
|
|
363
|
+
ROUTING_HELPER="${_COS_HOOKS_PHYS}/_helpers/routing_evolution.py"
|
|
364
|
+
if [ -f "$ROUTING_HELPER" ]; then
|
|
365
|
+
_ss_append SS_HIDDEN "$(python3 "$ROUTING_HELPER" "$COS_DB_PATH" 2>/dev/null || true)"
|
|
366
|
+
fi
|
|
367
|
+
fi
|
|
368
|
+
|
|
369
|
+
# Token economics display — informational, non-blocking
|
|
370
|
+
if [ -f "$COS_DB_PATH" ]; then
|
|
371
|
+
STARTUP_PY="${_COS_HOOKS_PHYS}/../thinking_os/session_startup.py"
|
|
372
|
+
if [ -f "$STARTUP_PY" ]; then
|
|
373
|
+
_ss_append SS_HIDDEN "$(python3 "$STARTUP_PY" "$COS_DB_PATH" 2>/dev/null || true)"
|
|
374
|
+
fi
|
|
375
|
+
fi
|
|
376
|
+
fi
|
|
377
|
+
|
|
378
|
+
# Emit the accumulated SessionStart blocks on the right channel. Claude: alerts
|
|
379
|
+
# to stderr (operator-visible, not injected); agent context as ONE hidden
|
|
380
|
+
# additionalContext envelope on stdout (the primers' idiom, mirrors the
|
|
381
|
+
# user-prompt-submit branch below). Codex: the dispatcher captures each delegate
|
|
382
|
+
# 2>&1 and runs one json.loads, so a JSON envelope merged with a stray stderr
|
|
383
|
+
# line would surface literal JSON — emit plain text only and let the dispatcher
|
|
384
|
+
# re-wrap the whole card (Codex has no operator-visible SessionStart chat).
|
|
385
|
+
if [[ "$SOURCE" == "startup" || "$SOURCE" == "compact" || "$SOURCE" == "resume" ]]; then
|
|
386
|
+
if [[ "${COS_AGENT:-}" == "codex" ]]; then
|
|
387
|
+
_all="$SS_VISIBLE"
|
|
388
|
+
_ss_append _all "$SS_HIDDEN"
|
|
389
|
+
if [[ -n "$_all" ]]; then printf '%s\n' "$_all"; fi
|
|
390
|
+
else
|
|
391
|
+
if [[ -n "$SS_VISIBLE" ]]; then printf '%s\n' "$SS_VISIBLE" >&2; fi
|
|
392
|
+
if [[ -n "$SS_HIDDEN" ]]; then
|
|
393
|
+
printf '%s' "{\"hookSpecificOutput\":{\"hookEventName\":\"SessionStart\",\"additionalContext\":$(printf '%s' "$SS_HIDDEN" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))')}}"
|
|
394
|
+
fi
|
|
395
|
+
fi
|
|
396
|
+
fi
|
|
397
|
+
|
|
398
|
+
# On user-prompt-submit: emit a compact per-turn workflow state via the
|
|
399
|
+
# Claude Code hookSpecificOutput JSON format so the operator sees the
|
|
400
|
+
# system pulse on every prompt (active task, complexity gate, board WIP,
|
|
401
|
+
# session-id tail). Mirrors the caveman-mode-tracker.js pattern so the UI
|
|
402
|
+
# renders this as a compact labeled "additionalContext" block.
|
|
403
|
+
if [[ "$SOURCE" == "user-prompt-submit" ]]; then
|
|
404
|
+
# State files written by write-state.sh have format "<session-id> <value>".
|
|
405
|
+
# Verify session ownership before returning the value. Resolution order:
|
|
406
|
+
# 1. panel-private $COS_SESSION_FILE (per-panel SSOT)
|
|
407
|
+
# 2. agent-level legacy $COS_AGENT_DIR/session-id (transition compat —
|
|
408
|
+
# old write-state.sh / non-panel-aware writers land here)
|
|
409
|
+
# Without the fallback, a panel that never ran SessionStart:startup
|
|
410
|
+
# (resumed conversation, no panel session-id file) shows ses=? · all-
|
|
411
|
+
# state-rejected. Mirrors cos_current_session() in cos-env.sh.
|
|
412
|
+
_CURRENT_SESSION=""
|
|
413
|
+
if [ -n "${COS_SESSION_FILE:-}" ] && [ -f "$COS_SESSION_FILE" ]; then
|
|
414
|
+
_CURRENT_SESSION=$(head -1 "$COS_SESSION_FILE" 2>/dev/null | tr -d '\n\r')
|
|
415
|
+
fi
|
|
416
|
+
# Synthesise from panel-id when no session-id file exists yet (resumed
|
|
417
|
+
# panel that never fired SessionStart:startup, or fresh panel where the
|
|
418
|
+
# startup hook hasn't run). Without this, banner collapses to ses=?.
|
|
419
|
+
# NEVER fall back to $COS_AGENT_DIR/session-id — that file is a fossil
|
|
420
|
+
# belonging to a different panel and trusting it leaks state across
|
|
421
|
+
# panels (cos-env.sh + check-state.sh now reject
|
|
422
|
+
# the legacy file by the same rule).
|
|
423
|
+
if [ -z "$_CURRENT_SESSION" ] && [ -n "${COS_PANEL_ID:-}" ]; then
|
|
424
|
+
_CURRENT_SESSION="$COS_PANEL_ID"
|
|
425
|
+
fi
|
|
426
|
+
# Idempotently seed the panel session-id file when missing, so subsequent
|
|
427
|
+
# hooks read a stable ownership token instead of recomputing the fallback.
|
|
428
|
+
if [ -n "${COS_SESSION_FILE:-}" ] && [ ! -f "$COS_SESSION_FILE" ] && [ -n "$_CURRENT_SESSION" ]; then
|
|
429
|
+
mkdir -p "$(dirname "$COS_SESSION_FILE")" 2>/dev/null || true
|
|
430
|
+
printf '%s' "$_CURRENT_SESSION" > "$COS_SESSION_FILE" 2>/dev/null || true
|
|
431
|
+
fi
|
|
432
|
+
_read_state() {
|
|
433
|
+
local file_input="$1" cap="$2"
|
|
434
|
+
# STRICTLY panel-scoped for files in $COS_PER_PANEL_FILES — never
|
|
435
|
+
# fall back to $COS_AGENT_DIR (cross-panel leak protection).
|
|
436
|
+
local file=""
|
|
437
|
+
local base
|
|
438
|
+
base="$(basename "$file_input")"
|
|
439
|
+
case " ${COS_PER_PANEL_FILES:-} " in
|
|
440
|
+
*" $base "*)
|
|
441
|
+
if [ -f "${COS_PANEL_DIR}/${base}" ]; then
|
|
442
|
+
file="${COS_PANEL_DIR}/${base}"
|
|
443
|
+
fi
|
|
444
|
+
;;
|
|
445
|
+
*)
|
|
446
|
+
file="$file_input"
|
|
447
|
+
;;
|
|
448
|
+
esac
|
|
449
|
+
[ -n "$file" ] && [ -f "$file" ] || { echo ""; return; }
|
|
450
|
+
# If we can't determine the current session-id, NEVER trust any state
|
|
451
|
+
# file (could be a fossil from a different session). Fail-empty.
|
|
452
|
+
if [ -z "$_CURRENT_SESSION" ]; then
|
|
453
|
+
echo ""; return
|
|
454
|
+
fi
|
|
455
|
+
local line file_session value
|
|
456
|
+
line=$(head -1 "$file" 2>/dev/null) || { echo ""; return; }
|
|
457
|
+
file_session=$(echo "$line" | awk '{print $1}')
|
|
458
|
+
# Must match THIS panel's session-id exactly OR the agent-level
|
|
459
|
+
# legacy id (transition window: pre-panel writers stamp with agent
|
|
460
|
+
# session-id; panel-aware writers stamp with panel session-id; the
|
|
461
|
+
# banner accepts both as owned by this panel until all writers have
|
|
462
|
+
# been upgraded).
|
|
463
|
+
if [ -z "$file_session" ]; then
|
|
464
|
+
echo ""; return
|
|
465
|
+
fi
|
|
466
|
+
if [ "$file_session" != "$_CURRENT_SESSION" ]; then
|
|
467
|
+
echo ""; return
|
|
468
|
+
fi
|
|
469
|
+
# Truncate by char count (-c is char-aware in GNU and BSD cut),
|
|
470
|
+
# falling back to head -c for byte limit. Prefer cut so multi-byte
|
|
471
|
+
# utf-8 (e.g. Persian skill names) doesn't get sliced mid-codepoint.
|
|
472
|
+
value=$(echo "$line" | cut -d' ' -f2- | tr -d '\n\r')
|
|
473
|
+
if command -v cut >/dev/null 2>&1; then
|
|
474
|
+
value=$(printf '%s' "$value" | cut -c1-"$cap" 2>/dev/null || printf '%s' "$value" | head -c "$cap")
|
|
475
|
+
else
|
|
476
|
+
value=$(printf '%s' "$value" | head -c "$cap")
|
|
477
|
+
fi
|
|
478
|
+
echo "$value"
|
|
479
|
+
}
|
|
480
|
+
TASK_CUR=$(_read_state ".task-current" 32)
|
|
481
|
+
GATE_STATE=$(_read_state ".thinking_os-gate" 24)
|
|
482
|
+
SKILL_CUR=$(_read_state ".active-skill" 48)
|
|
483
|
+
|
|
484
|
+
# The gate carries a 120-min TTL (check-state.sh). _read_state only checks
|
|
485
|
+
# session-ownership, not age — so a long session would show an EXPIRED gate
|
|
486
|
+
# as valid, then the next Write/Edit BLOCKs on "gate stale". Flag staleness
|
|
487
|
+
# here so the banner tells the truth. Override: COS_GATE_TTL_SECONDS.
|
|
488
|
+
if [ -n "$GATE_STATE" ] && [ -f "${COS_PANEL_DIR}/.thinking_os-gate" ]; then
|
|
489
|
+
_GATE_MTIME=$(stat -c %Y "${COS_PANEL_DIR}/.thinking_os-gate" 2>/dev/null || stat -f %m "${COS_PANEL_DIR}/.thinking_os-gate" 2>/dev/null || echo 0)
|
|
490
|
+
_GATE_AGE=$(( $(date +%s) - _GATE_MTIME ))
|
|
491
|
+
if [ "$_GATE_AGE" -gt "${COS_GATE_TTL_SECONDS:-7200}" ]; then
|
|
492
|
+
GATE_STATE="${GATE_STATE} ⌛stale"
|
|
493
|
+
fi
|
|
494
|
+
fi
|
|
495
|
+
|
|
496
|
+
# Composed role chain — surface the ACTIVE role + its position in the chain
|
|
497
|
+
# so the banner tracks what the agent is DOING, not a frozen lead.
|
|
498
|
+
# advance-role.sh moves .role along .roles by work phase. Both files are
|
|
499
|
+
# panel-scoped (written panel-first by roles_state); read panel-first with an
|
|
500
|
+
# agent-level fallback. Format: "<active> N/M" e.g. "implementer 3/4".
|
|
501
|
+
ROLES_LEAD=""
|
|
502
|
+
_ROLES_FILE="${COS_PANEL_DIR}/.roles"
|
|
503
|
+
[ -f "$_ROLES_FILE" ] || _ROLES_FILE="${COS_AGENT_DIR}/.roles"
|
|
504
|
+
_ROLE_FILE="${COS_PANEL_DIR}/.role"
|
|
505
|
+
[ -f "$_ROLE_FILE" ] || _ROLE_FILE="${COS_AGENT_DIR}/.role"
|
|
506
|
+
if [ -f "$_ROLES_FILE" ]; then
|
|
507
|
+
ROLES_LEAD=$(python3 -c '
|
|
508
|
+
import json, sys
|
|
509
|
+
try:
|
|
510
|
+
chain = json.load(open(sys.argv[1]))
|
|
511
|
+
if not isinstance(chain, list) or not chain:
|
|
512
|
+
sys.exit(0)
|
|
513
|
+
active = ""
|
|
514
|
+
try:
|
|
515
|
+
active = open(sys.argv[2]).read().strip()
|
|
516
|
+
except OSError:
|
|
517
|
+
pass
|
|
518
|
+
if active not in chain:
|
|
519
|
+
active = str(chain[0])
|
|
520
|
+
pos = chain.index(active) + 1
|
|
521
|
+
print(f"{active} {pos}/{len(chain)}")
|
|
522
|
+
except Exception:
|
|
523
|
+
pass
|
|
524
|
+
' "$_ROLES_FILE" "$_ROLE_FILE" 2>/dev/null | head -c 32 || true)
|
|
525
|
+
fi
|
|
526
|
+
|
|
527
|
+
# Task mode (classify-task-mode.sh writes this on every UserPromptSubmit
|
|
528
|
+
# via a separate hook). NOT session-prefixed — it's a single token per
|
|
529
|
+
# the writer's contract. Values: formal | query | adhoc | chore |
|
|
530
|
+
# system | gov-required | propose-formal. Drives banner verbosity:
|
|
531
|
+
# casual modes get a minimal banner, formal modes get the full one.
|
|
532
|
+
TASK_MODE=""
|
|
533
|
+
# panel-first: .task-mode is per-panel; agent-dir is the
|
|
534
|
+
# back-compat fallback for a panel that hasn't re-written it yet.
|
|
535
|
+
_TASK_MODE_FILE="${COS_PANEL_DIR:-$COS_AGENT_DIR}/.task-mode"
|
|
536
|
+
[ -f "$_TASK_MODE_FILE" ] || _TASK_MODE_FILE="${COS_AGENT_DIR}/.task-mode"
|
|
537
|
+
if [ -f "$_TASK_MODE_FILE" ]; then
|
|
538
|
+
TASK_MODE=$(head -1 "$_TASK_MODE_FILE" 2>/dev/null | tr -d '\n\r' | head -c 16)
|
|
539
|
+
fi
|
|
540
|
+
WIP_TOTAL=""
|
|
541
|
+
if [ -f "$COS_DB_PATH" ] && command -v python3 >/dev/null 2>&1; then
|
|
542
|
+
WIP_TOTAL=$(python3 -c "
|
|
543
|
+
import sqlite3, sys
|
|
544
|
+
try:
|
|
545
|
+
c = sqlite3.connect('$COS_DB_PATH').cursor()
|
|
546
|
+
n = c.execute(\"SELECT COUNT(*) FROM tasks WHERE status IN ('in_progress','testing')\").fetchone()[0]
|
|
547
|
+
print(n)
|
|
548
|
+
except Exception:
|
|
549
|
+
pass
|
|
550
|
+
" 2>/dev/null | head -c 6)
|
|
551
|
+
fi
|
|
552
|
+
# SES_TAIL: prefer env var (set by some adapters), fall back to the
|
|
553
|
+
# session-id file we just read into _CURRENT_SESSION. Last 8 chars are
|
|
554
|
+
# the random suffix that distinguishes panels of the same agent.
|
|
555
|
+
SES_TAIL=""
|
|
556
|
+
if [ -n "${COS_SESSION_ID:-}" ]; then
|
|
557
|
+
SES_TAIL="${COS_SESSION_ID: -8}"
|
|
558
|
+
elif [ -n "${_CURRENT_SESSION:-}" ]; then
|
|
559
|
+
SES_TAIL="${_CURRENT_SESSION: -8}"
|
|
560
|
+
fi
|
|
561
|
+
|
|
562
|
+
# Recent block events from the hook log (last ~5 min). Surfaces hook
|
|
563
|
+
# activity so the operator sees what's happening behind the scenes —
|
|
564
|
+
# mirrors the caveman-mode-tracker visibility pattern.
|
|
565
|
+
BLK_RECENT=""
|
|
566
|
+
if [ -f "${COS_HOOK_LOG:-${COS_STATE_DIR}/.hooks.log}" ] && command -v python3 >/dev/null 2>&1; then
|
|
567
|
+
BLK_RECENT=$(python3 -c "
|
|
568
|
+
import re, sys
|
|
569
|
+
from datetime import datetime, timedelta, timezone
|
|
570
|
+
log = '${COS_HOOK_LOG:-${COS_STATE_DIR}/.hooks.log}'
|
|
571
|
+
cutoff = datetime.now(timezone.utc) - timedelta(minutes=5)
|
|
572
|
+
n = 0
|
|
573
|
+
last_rules = []
|
|
574
|
+
try:
|
|
575
|
+
with open(log) as f:
|
|
576
|
+
for line in f.readlines()[-200:]:
|
|
577
|
+
m = re.match(r'\[(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z)\]\s+\[([^\]]+)\]\s+\[block\]\s+(.*)', line)
|
|
578
|
+
if not m: continue
|
|
579
|
+
try:
|
|
580
|
+
ts = datetime.strptime(m.group(1), '%Y-%m-%dT%H:%M:%SZ').replace(tzinfo=timezone.utc)
|
|
581
|
+
except ValueError: continue
|
|
582
|
+
if ts < cutoff: continue
|
|
583
|
+
n += 1
|
|
584
|
+
rm = re.search(r'rule=(\S+)', m.group(3) or '')
|
|
585
|
+
if rm: last_rules.append(rm.group(1))
|
|
586
|
+
if n:
|
|
587
|
+
last = last_rules[-1] if last_rules else m.group(2)
|
|
588
|
+
print(f'{n}({last})')
|
|
589
|
+
except OSError:
|
|
590
|
+
pass
|
|
591
|
+
" 2>/dev/null | head -c 32 || true)
|
|
592
|
+
fi
|
|
593
|
+
|
|
594
|
+
PARTS="agent=${COS_AGENT:-?}"
|
|
595
|
+
[[ -n "$SES_TAIL" ]] && PARTS="${PARTS} ses=${SES_TAIL}"
|
|
596
|
+
[[ -n "$TASK_CUR" ]] && PARTS="${PARTS} task=${TASK_CUR}" || PARTS="${PARTS} task=none"
|
|
597
|
+
[[ -n "$GATE_STATE" ]] && PARTS="${PARTS} gate=${GATE_STATE}" || PARTS="${PARTS} gate=unset"
|
|
598
|
+
[[ -n "$WIP_TOTAL" ]] && PARTS="${PARTS} wip=${WIP_TOTAL}"
|
|
599
|
+
[[ -n "$SKILL_CUR" ]] && PARTS="${PARTS} skill=${SKILL_CUR}"
|
|
600
|
+
[[ -n "$ROLES_LEAD" ]] && PARTS="${PARTS} roles=${ROLES_LEAD}"
|
|
601
|
+
[[ -n "$BLK_RECENT" ]] && PARTS="${PARTS} blocks=${BLK_RECENT}"
|
|
602
|
+
|
|
603
|
+
# verify-state: the most-recently-recorded matrix suite + result from the
|
|
604
|
+
# verify ledger, so the agent sees whether the close-gate is already
|
|
605
|
+
# satisfied without re-running. Agent-facing pulse only; one short field;
|
|
606
|
+
# fail-open (a missing/garbled ledger just omits it).
|
|
607
|
+
if [[ -f "${COS_STATE_DIR}/.last-verify.json" ]] && command -v jq >/dev/null 2>&1; then
|
|
608
|
+
_VERIFY=$(jq -r 'to_entries|map(select(.value.ts))|sort_by(.value.ts)|last|"\(.key)=\(.value.status)"' "${COS_STATE_DIR}/.last-verify.json" 2>/dev/null || true)
|
|
609
|
+
[[ -n "$_VERIFY" && "$_VERIFY" != "null=null" ]] && PARTS="${PARTS} verify=${_VERIFY}"
|
|
610
|
+
fi
|
|
611
|
+
|
|
612
|
+
# Aggregated PostToolUse activity since the previous prompt — Claude Code
|
|
613
|
+
# does not render PostToolUse stdout, so each PostToolUse hook calls
|
|
614
|
+
# `cos_record_activity` (cos-env.sh) which appends to .turn-activity.log.
|
|
615
|
+
# turn_summary.py reads + clears it, returning a compact string like
|
|
616
|
+
# `memory:5 graph:3 task:TASK-NNN skill:clean-code` for inclusion below.
|
|
617
|
+
ACTIVITY=""
|
|
618
|
+
ACTIVITY_HELPER="${_COS_HOOKS_PHYS}/_helpers/turn_summary.py"
|
|
619
|
+
if [ -f "$ACTIVITY_HELPER" ] && command -v python3 >/dev/null 2>&1; then
|
|
620
|
+
# || true: the banner is the operator's only transparency surface and MUST
|
|
621
|
+
# be fail-open — a non-zero helper (or head -c closing the pipe early) under
|
|
622
|
+
# `set -euo pipefail` must never abort the hook before the banner is emitted.
|
|
623
|
+
ACTIVITY=$(python3 "$ACTIVITY_HELPER" 2>/dev/null | head -c 256 || true)
|
|
624
|
+
fi
|
|
625
|
+
[[ -n "$ACTIVITY" ]] && PARTS="${PARTS} | ${ACTIVITY}"
|
|
626
|
+
|
|
627
|
+
# User-visible transparency banner. Verbosity is driven by .task-mode
|
|
628
|
+
# (classify-task-mode.sh writes one of: formal | query | adhoc | chore |
|
|
629
|
+
# system | gov-required | propose-formal). Casual modes collapse to a
|
|
630
|
+
# minimal banner so chit-chat doesn't get drowned in noise; formal modes
|
|
631
|
+
# render the full cognitive state. system mode suppresses entirely
|
|
632
|
+
# (reserved for hook-internal Bash, never user-facing).
|
|
633
|
+
#
|
|
634
|
+
# ⚠️ markers surface inconsistencies (e.g. WIP=N but .task-current=none)
|
|
635
|
+
# so the agent re-binds before the next edit.
|
|
636
|
+
WIP_NUM="${WIP_TOTAL:-0}"
|
|
637
|
+
WARN=""
|
|
638
|
+
if [ -n "$WIP_NUM" ] && [ "$WIP_NUM" -gt 0 ] 2>/dev/null && [ -z "$TASK_CUR" ]; then
|
|
639
|
+
WARN=" ⚠️ wip=${WIP_NUM} but task=none — cos task-start <ID>"
|
|
640
|
+
fi
|
|
641
|
+
|
|
642
|
+
# State-misroute (TASK-585b): cos-env.sh exports COS_STATE_MISROUTE=1 when a
|
|
643
|
+
# command inside a worktree cannot resolve its main repo, so cognitive state
|
|
644
|
+
# (board, task, presence, work-log) binds to a quarantine dir invisible to the
|
|
645
|
+
# Hub and to siblings. cos-env warns only ONCE to stderr; surface it on EVERY
|
|
646
|
+
# turn so the operator fixes the misconfig instead of silently diverging.
|
|
647
|
+
if [ "${COS_STATE_MISROUTE:-0}" = "1" ]; then
|
|
648
|
+
WARN="${WARN} ⚠️ state misrouted — board/task state is going to a quarantine dir; export COS_PROJECT_ROOT=<main-repo>"
|
|
649
|
+
fi
|
|
650
|
+
|
|
651
|
+
# CLEAR-1 self-bypass count (TASK-494): surface how many times this session
|
|
652
|
+
# self-exempted from the enforcement gates via a manual "CLEAR 1" gate write,
|
|
653
|
+
# so the cost of bypassing is visible rather than silent. Fail-open.
|
|
654
|
+
BYPASS_LOG="${COS_PANEL_DIR:-$COS_AGENT_DIR}/.clear1-bypass-log"
|
|
655
|
+
if [ -f "$BYPASS_LOG" ]; then
|
|
656
|
+
# Count only THIS session's bypass lines (col 1 = session id); the log stays
|
|
657
|
+
# append-only across sessions for /retro audit — don't truncate it (TASK-510).
|
|
658
|
+
_CUR_SID=$(tr -d '\n\r' < "${COS_SESSION_FILE:-/nonexistent}" 2>/dev/null || true)
|
|
659
|
+
if [ -n "$_CUR_SID" ]; then
|
|
660
|
+
BYPASS_N=$(grep -cF "${_CUR_SID}$(printf '\t')" "$BYPASS_LOG" 2>/dev/null || true)
|
|
661
|
+
else
|
|
662
|
+
BYPASS_N=$(wc -l < "$BYPASS_LOG" 2>/dev/null | tr -d ' ' || true)
|
|
663
|
+
fi
|
|
664
|
+
[ -z "$BYPASS_N" ] && BYPASS_N=0
|
|
665
|
+
if [ -n "$BYPASS_N" ] && [ "$BYPASS_N" -gt 0 ] 2>/dev/null; then
|
|
666
|
+
WARN="${WARN} ℹ️ bypasses=${BYPASS_N} self-issued CLEAR-1"
|
|
667
|
+
fi
|
|
668
|
+
fi
|
|
669
|
+
|
|
670
|
+
# Context-budget signal: the last usage record in the live transcript is
|
|
671
|
+
# the session's true context size. Over COS_CONTEXT_BUDGET (default 200K)
|
|
672
|
+
# surface an informational /compact hint to the USER — never a stop
|
|
673
|
+
# directive (the agent keeps working through related/queued tasks; see
|
|
674
|
+
# transparency-banner.md). Helper prints e.g. '412k>200k' or nothing; fail-open.
|
|
675
|
+
TRANSCRIPT_PATH="$(printf '%s' "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null || true)"
|
|
676
|
+
CTX_OVER=""
|
|
677
|
+
if [[ -n "$TRANSCRIPT_PATH" ]] && [ -f "${_COS_HOOKS_PHYS}/_helpers/context_budget.py" ] && command -v python3 >/dev/null 2>&1; then
|
|
678
|
+
CTX_OVER=$(python3 "${_COS_HOOKS_PHYS}/_helpers/context_budget.py" "$TRANSCRIPT_PATH" 2>/dev/null | head -c 24 || true)
|
|
679
|
+
fi
|
|
680
|
+
if [[ -n "$CTX_OVER" ]]; then
|
|
681
|
+
WARN="${WARN} ℹ️ ctx=${CTX_OVER} — optional /compact; /clear only between unrelated tasks"
|
|
682
|
+
fi
|
|
683
|
+
|
|
684
|
+
if [ -z "${SES_TAIL:-}" ]; then
|
|
685
|
+
# Fresh/unresolved panel: session-id not seeded yet, so _read_state rejects
|
|
686
|
+
# every state file. A banner here renders 'ses=? · task=none · gate=unset …',
|
|
687
|
+
# indistinguishable from a hung agent — the worst possible first impression.
|
|
688
|
+
# Suppress it; transparency-banner tells the agent to skip the banner when it
|
|
689
|
+
# is absent (and never fabricate one), which is the correct turn-1 behaviour.
|
|
690
|
+
USER_BANNER=""
|
|
691
|
+
else
|
|
692
|
+
# pr-mode is the operator-relevant deviation from the trunk default, so surface
|
|
693
|
+
# it in the banner only when on (TASK-615); trunk stays uncluttered.
|
|
694
|
+
GIT_MODE_SEG=""
|
|
695
|
+
[ "${COS_GIT_WORKFLOW:-trunk}" = "pr" ] && GIT_MODE_SEG=" · git=pr"
|
|
696
|
+
case "$TASK_MODE" in
|
|
697
|
+
system)
|
|
698
|
+
USER_BANNER=""
|
|
699
|
+
;;
|
|
700
|
+
query|adhoc|chore)
|
|
701
|
+
USER_BANNER="🔔 ses=${SES_TAIL} · mode=${TASK_MODE}${GIT_MODE_SEG}${WARN}"
|
|
702
|
+
;;
|
|
703
|
+
*)
|
|
704
|
+
USER_BANNER="🔔 ses=${SES_TAIL} · mode=${TASK_MODE:-formal} · task=${TASK_CUR:-none} · gate=${GATE_STATE:-unset} · skill=${SKILL_CUR:--} · roles=${ROLES_LEAD:--}${GIT_MODE_SEG}${WARN}"
|
|
705
|
+
;;
|
|
706
|
+
esac
|
|
707
|
+
fi
|
|
708
|
+
|
|
709
|
+
# TASK-668: fold the TASK-622 test-cadence policy into the agent-only pulse so
|
|
710
|
+
# it is seen in-band (agents skip test-discipline.md). Formal work only — casual
|
|
711
|
+
# chat never runs suites, so the reminder would be noise. Additive; the visible
|
|
712
|
+
# banner + its extraction marker are untouched (appended AFTER the banner line).
|
|
713
|
+
CADENCE=""
|
|
714
|
+
case "${TASK_MODE:-formal}" in
|
|
715
|
+
query|adhoc|chore|system) ;;
|
|
716
|
+
*) CADENCE="
|
|
717
|
+
[test-cadence] targeted test during dev · matrix suite ONCE at close · background heavy (>60s) suites, never idle-wait · full sweep is pre-merge only" ;;
|
|
718
|
+
esac
|
|
719
|
+
|
|
720
|
+
if [ -n "$USER_BANNER" ]; then
|
|
721
|
+
CONTEXT="[coding-os pulse] ${PARTS}
|
|
722
|
+
USER_BANNER (rule transparency-banner — echo as FIRST line of visible reply): ${USER_BANNER}${CADENCE}"
|
|
723
|
+
else
|
|
724
|
+
CONTEXT="[coding-os pulse] ${PARTS}${CADENCE}"
|
|
725
|
+
fi
|
|
726
|
+
printf '%s' "{\"hookSpecificOutput\":{\"hookEventName\":\"UserPromptSubmit\",\"additionalContext\":$(printf '%s' "$CONTEXT" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))')}}"
|
|
727
|
+
fi
|
|
728
|
+
|
|
729
|
+
exit 0
|