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.
Files changed (1304) hide show
  1. adapters/claude/README.md +6 -0
  2. adapters/claude/_install_helpers/extract_stacks.py +43 -0
  3. adapters/claude/_install_helpers/update_mcp_json.py +75 -0
  4. adapters/claude/adapter.yaml +164 -0
  5. adapters/claude/hooks/README.md +40 -0
  6. adapters/claude/hooks/agent_memory_sync.py +131 -0
  7. adapters/claude/hooks/ensure-agent-memory-link.sh +36 -0
  8. adapters/claude/hooks/sync-agent-memory.sh +21 -0
  9. adapters/claude/install.sh +86 -0
  10. adapters/claude/sdk_dispatcher.py +871 -0
  11. adapters/claude/settings.local.template.json +31 -0
  12. adapters/claude/settings.template.json +808 -0
  13. adapters/claude/update_mcp_json.py +85 -0
  14. adapters/codex/adapter.yaml +254 -0
  15. adapters/codex/chat_provider.py +230 -0
  16. adapters/codex/commands/formula-f1.md +129 -0
  17. adapters/codex/commands/formula-f10.md +100 -0
  18. adapters/codex/commands/formula-f11.md +123 -0
  19. adapters/codex/commands/formula-f2.md +139 -0
  20. adapters/codex/commands/formula-f3.md +127 -0
  21. adapters/codex/commands/formula-f4.md +101 -0
  22. adapters/codex/commands/formula-f5.md +135 -0
  23. adapters/codex/commands/formula-f6.md +147 -0
  24. adapters/codex/commands/formula-f7.md +111 -0
  25. adapters/codex/commands/formula-f8.md +133 -0
  26. adapters/codex/commands/formula-f9.md +112 -0
  27. adapters/codex/enable_codex_hooks.py +94 -0
  28. adapters/codex/ensure_codex_mcp.py +124 -0
  29. adapters/codex/hooks/codex-merge-hook-output.py +72 -0
  30. adapters/codex/hooks/codex-normalize-edit.py +96 -0
  31. adapters/codex/hooks/codex-postedit-dispatch.sh +75 -0
  32. adapters/codex/hooks/codex-posttool-dispatch.sh +70 -0
  33. adapters/codex/hooks/codex-preedit-dispatch.sh +83 -0
  34. adapters/codex/hooks/codex-pretool-dispatch.sh +82 -0
  35. adapters/codex/hooks/codex-sessionend-dispatch.sh +20 -0
  36. adapters/codex/hooks/codex-sessionstart-dispatch.sh +68 -0
  37. adapters/codex/hooks/codex-stop-dispatch.sh +73 -0
  38. adapters/codex/hooks/codex-userpromptsubmit-dispatch.sh +74 -0
  39. adapters/codex/hooks.template.json +208 -0
  40. adapters/codex/install.sh +83 -0
  41. adapters/codex/sdk_dispatcher.py +449 -0
  42. board_os/__init__.py +39 -0
  43. board_os/_agent_runtime.py +256 -0
  44. board_os/config.py +421 -0
  45. board_os/git_coherence.py +107 -0
  46. board_os/hub_adapter_manifest.py +140 -0
  47. board_os/mcp_tools.py +3228 -0
  48. board_os/migration.py +166 -0
  49. board_os/parser.py +317 -0
  50. board_os/presence.py +156 -0
  51. board_os/sync.py +320 -0
  52. board_os/transition_gates.py +224 -0
  53. board_os/transition_gates_cli.py +272 -0
  54. board_os/transition_gates_validator.py +551 -0
  55. board_os/verify_suites.py +126 -0
  56. board_os/verify_suites_cli.py +328 -0
  57. board_os/workflow.py +967 -0
  58. cli/__init__.py +0 -0
  59. cli/_data_types.py +248 -0
  60. cli/_init_helpers.py +587 -0
  61. cli/_resources.py +100 -0
  62. cli/adapter_registry.py +239 -0
  63. cli/add_stack.py +315 -0
  64. cli/aggregator.py +438 -0
  65. cli/board_commands.py +1218 -0
  66. cli/brain_commands.py +255 -0
  67. cli/cognition.py +345 -0
  68. cli/config_composer.py +349 -0
  69. cli/core_version.py +41 -0
  70. cli/cron_commands.py +278 -0
  71. cli/db_reset.py +298 -0
  72. cli/doc_commands.py +111 -0
  73. cli/doctor.py +2953 -0
  74. cli/doctor_board.py +365 -0
  75. cli/doctor_extras.py +1121 -0
  76. cli/doctor_graph.py +608 -0
  77. cli/doctor_tokens.py +254 -0
  78. cli/graph_commands.py +1265 -0
  79. cli/hook_renderer.py +393 -0
  80. cli/hub_commands.py +580 -0
  81. cli/list_adapters.py +79 -0
  82. cli/list_stacks.py +105 -0
  83. cli/logs_commands.py +89 -0
  84. cli/main.py +3070 -0
  85. cli/materialize_file.py +65 -0
  86. cli/mcp_start.py +153 -0
  87. cli/module_commands.py +513 -0
  88. cli/pr_commands.py +2024 -0
  89. cli/preset_commands.py +126 -0
  90. cli/preset_registry.py +171 -0
  91. cli/project_overrides.py +119 -0
  92. cli/registry.py +365 -0
  93. cli/remove_stack.py +492 -0
  94. cli/renderer.py +620 -0
  95. cli/setup.py +464 -0
  96. cli/skill_commands.py +689 -0
  97. cli/skill_registry.py +235 -0
  98. cli/skills_list.py +332 -0
  99. cli/stack_lint.py +351 -0
  100. cli/stack_registry.py +688 -0
  101. cli/subsystems.py +335 -0
  102. cli/sync_all.py +310 -0
  103. cli/tail_command.py +410 -0
  104. cli/update.py +608 -0
  105. cli/verify_since_edit.py +439 -0
  106. coding_os-0.3.2.dist-info/METADATA +508 -0
  107. coding_os-0.3.2.dist-info/RECORD +1304 -0
  108. coding_os-0.3.2.dist-info/WHEEL +5 -0
  109. coding_os-0.3.2.dist-info/entry_points.txt +5 -0
  110. coding_os-0.3.2.dist-info/licenses/LICENSE +201 -0
  111. coding_os-0.3.2.dist-info/top_level.txt +10 -0
  112. core/__init__.py +0 -0
  113. core/board_os/__init__.py +39 -0
  114. core/board_os/_agent_runtime.py +256 -0
  115. core/board_os/config.py +421 -0
  116. core/board_os/git_coherence.py +107 -0
  117. core/board_os/hub_adapter_manifest.py +140 -0
  118. core/board_os/mcp_tools.py +3228 -0
  119. core/board_os/migration.py +166 -0
  120. core/board_os/parser.py +317 -0
  121. core/board_os/presence.py +156 -0
  122. core/board_os/sync.py +320 -0
  123. core/board_os/transition-gates.yaml +176 -0
  124. core/board_os/transition_gates.py +224 -0
  125. core/board_os/transition_gates_cli.py +272 -0
  126. core/board_os/transition_gates_validator.py +551 -0
  127. core/board_os/verify-suites.yaml +113 -0
  128. core/board_os/verify_suites.py +126 -0
  129. core/board_os/verify_suites_cli.py +328 -0
  130. core/board_os/workflow.py +967 -0
  131. core/commands/board.md +27 -0
  132. core/commands/classify.md +23 -0
  133. core/commands/compose.md +23 -0
  134. core/commands/daily.md +31 -0
  135. core/commands/diagnose.md +7 -0
  136. core/commands/memory-search.md +23 -0
  137. core/commands/new-project.md +33 -0
  138. core/commands/retro.md +38 -0
  139. core/commands/review.md +14 -0
  140. core/commands/task.md +17 -0
  141. core/commands/verify.md +34 -0
  142. core/docs/thinking_os-final-edition.md +1449 -0
  143. core/doctor-config.yaml +74 -0
  144. core/graph_os/__init__.py +29 -0
  145. core/graph_os/backend.py +233 -0
  146. core/graph_os/backends/__init__.py +13 -0
  147. core/graph_os/backends/sqlite_backend.py +1053 -0
  148. core/graph_os/bench/__init__.py +17 -0
  149. core/graph_os/bench/fixtures.py +56 -0
  150. core/graph_os/bench/harness.py +95 -0
  151. core/graph_os/bench/persian_precision.py +142 -0
  152. core/graph_os/bench/scale_500k.py +120 -0
  153. core/graph_os/bench/token_cost.py +170 -0
  154. core/graph_os/bench/viewer_fps.py +110 -0
  155. core/graph_os/communities.py +410 -0
  156. core/graph_os/enterprise.py +218 -0
  157. core/graph_os/entry_points.py +226 -0
  158. core/graph_os/extractors/__init__.py +25 -0
  159. core/graph_os/extractors/code_generic.py +914 -0
  160. core/graph_os/extractors/code_go.py +1422 -0
  161. core/graph_os/extractors/code_json.py +340 -0
  162. core/graph_os/extractors/code_php.py +979 -0
  163. core/graph_os/extractors/code_python.py +1454 -0
  164. core/graph_os/extractors/code_shell.py +538 -0
  165. core/graph_os/extractors/code_toml.py +302 -0
  166. core/graph_os/extractors/code_ts.py +1665 -0
  167. core/graph_os/extractors/code_yaml.py +394 -0
  168. core/graph_os/extractors/contracts.py +1592 -0
  169. core/graph_os/extractors/md_links.py +890 -0
  170. core/graph_os/extractors/task_deps.py +345 -0
  171. core/graph_os/groups/__init__.py +22 -0
  172. core/graph_os/groups/cross_repo.py +156 -0
  173. core/graph_os/groups/manifest.py +141 -0
  174. core/graph_os/ingest/__init__.py +19 -0
  175. core/graph_os/ingest/base.py +306 -0
  176. core/graph_os/ingest/github.py +112 -0
  177. core/graph_os/ingest/zip.py +95 -0
  178. core/graph_os/toolchain.py +393 -0
  179. core/graph_os/tools/__init__.py +9 -0
  180. core/graph_os/tools/graph.py +5573 -0
  181. core/graph_os/tools/reindex_dispatch.py +730 -0
  182. core/graph_os/tree_sitter_overlay.py +235 -0
  183. core/graph_os/types.py +252 -0
  184. core/graph_os/vec_index.py +277 -0
  185. core/graph_os/viewer/__init__.py +12 -0
  186. core/graph_os/viewer/exporter.py +93 -0
  187. core/graph_os/viewer/template.py +189 -0
  188. core/hooks/_helpers/_paths.py +40 -0
  189. core/hooks/_helpers/advance_role.py +72 -0
  190. core/hooks/_helpers/auto_compose.py +228 -0
  191. core/hooks/_helpers/auto_validate_lessons.py +55 -0
  192. core/hooks/_helpers/branch_guard_check.py +796 -0
  193. core/hooks/_helpers/check_commit_message.py +108 -0
  194. core/hooks/_helpers/check_dangerous_rm.py +80 -0
  195. core/hooks/_helpers/check_git_bypass.py +154 -0
  196. core/hooks/_helpers/check_git_destructive.py +77 -0
  197. core/hooks/_helpers/check_settings_write.py +97 -0
  198. core/hooks/_helpers/consume_override.py +51 -0
  199. core/hooks/_helpers/context_budget.py +77 -0
  200. core/hooks/_helpers/cos_say_json.py +103 -0
  201. core/hooks/_helpers/destructive_edit_check.py +163 -0
  202. core/hooks/_helpers/detect_status_transition.py +82 -0
  203. core/hooks/_helpers/digest_regen.py +56 -0
  204. core/hooks/_helpers/doc_sync_check.py +498 -0
  205. core/hooks/_helpers/drain_embedding_outbox.py +52 -0
  206. core/hooks/_helpers/extract_additional_context.py +51 -0
  207. core/hooks/_helpers/extract_commit_msg_arg.py +74 -0
  208. core/hooks/_helpers/git_command_parse.py +424 -0
  209. core/hooks/_helpers/git_settings_fields.py +47 -0
  210. core/hooks/_helpers/graph_context_match.py +37 -0
  211. core/hooks/_helpers/graph_marker_check.py +70 -0
  212. core/hooks/_helpers/jit_recall.py +56 -0
  213. core/hooks/_helpers/json_field.py +41 -0
  214. core/hooks/_helpers/narrative_signal.py +59 -0
  215. core/hooks/_helpers/observation_count.py +31 -0
  216. core/hooks/_helpers/pre_commit_batch.py +177 -0
  217. core/hooks/_helpers/pre_commit_fake_input.py +42 -0
  218. core/hooks/_helpers/presence_gc.py +102 -0
  219. core/hooks/_helpers/presence_write.py +167 -0
  220. core/hooks/_helpers/recover_indirect.py +35 -0
  221. core/hooks/_helpers/routing_evolution.py +104 -0
  222. core/hooks/_helpers/session_recap.py +72 -0
  223. core/hooks/_helpers/skill_primer.py +229 -0
  224. core/hooks/_helpers/task_sync.py +59 -0
  225. core/hooks/_helpers/tool_failure_capture.py +147 -0
  226. core/hooks/_helpers/trajectory_autosnap.py +278 -0
  227. core/hooks/_helpers/trajectory_startup.py +62 -0
  228. core/hooks/_helpers/turn_summary.py +82 -0
  229. core/hooks/_helpers/validate_task_frontmatter.py +98 -0
  230. core/hooks/_helpers/wip_limit_check.py +103 -0
  231. core/hooks/_helpers/wip_lines.py +53 -0
  232. core/hooks/_helpers/work_log_append.py +89 -0
  233. core/hooks/_helpers/wrap_dispatch_output.py +82 -0
  234. core/hooks/advance-role.sh +48 -0
  235. core/hooks/agent-presence.sh +179 -0
  236. core/hooks/auto-brain-decay.sh +184 -0
  237. core/hooks/auto-compose-roles.sh +83 -0
  238. core/hooks/auto-graph-reconcile-shell.sh +119 -0
  239. core/hooks/auto-regen-doc-index.sh +120 -0
  240. core/hooks/auto-reindex-docs.sh +130 -0
  241. core/hooks/auto-task-sync.sh +56 -0
  242. core/hooks/auto-trace-rotate.sh +88 -0
  243. core/hooks/block-bad-patterns.sh +212 -0
  244. core/hooks/block-dangerous-commands.sh +182 -0
  245. core/hooks/block-hardcoded-literals.sh +90 -0
  246. core/hooks/block-migration-conflict.sh +114 -0
  247. core/hooks/block-protected-files.sh +129 -0
  248. core/hooks/block-secrets.sh +185 -0
  249. core/hooks/block-shared-tree-edit.sh +75 -0
  250. core/hooks/block-uv-heredoc.sh +78 -0
  251. core/hooks/branch-guard.sh +122 -0
  252. core/hooks/capture-observation.sh +76 -0
  253. core/hooks/capture-tool-failure.sh +24 -0
  254. core/hooks/capture-work-log.sh +89 -0
  255. core/hooks/check-agents-md-refs.sh +75 -0
  256. core/hooks/check-agents-md-size.sh +49 -0
  257. core/hooks/check-capture-worked.sh +148 -0
  258. core/hooks/check-doc-size.sh +61 -0
  259. core/hooks/check-mcp-extras.sh +92 -0
  260. core/hooks/check-state.sh +87 -0
  261. core/hooks/classify-task-mode.sh +103 -0
  262. core/hooks/cos-env.sh +1301 -0
  263. core/hooks/drain-embedding-outbox.sh +24 -0
  264. core/hooks/enforce-anti-ambiguity.sh +74 -0
  265. core/hooks/enforce-commit-message.sh +73 -0
  266. core/hooks/enforce-doc-anchor.sh +224 -0
  267. core/hooks/enforce-doc-sync.sh +206 -0
  268. core/hooks/enforce-graph-context.sh +89 -0
  269. core/hooks/enforce-graph-first-read.sh +94 -0
  270. core/hooks/enforce-memory-check.sh +128 -0
  271. core/hooks/enforce-rename-plan.sh +78 -0
  272. core/hooks/enforce-scaffold-boundary.sh +68 -0
  273. core/hooks/enforce-skill.sh +125 -0
  274. core/hooks/enforce-task-body.sh +52 -0
  275. core/hooks/enforce-task-start.sh +81 -0
  276. core/hooks/enforce-task-transition.sh +75 -0
  277. core/hooks/enforce-template.sh +143 -0
  278. core/hooks/enforce-verify.sh +112 -0
  279. core/hooks/enforce-wip-limit.sh +43 -0
  280. core/hooks/enforce-zoom.sh +69 -0
  281. core/hooks/ensure-hub-up.sh +67 -0
  282. core/hooks/inject-mcp-caller-session.sh +70 -0
  283. core/hooks/jit-recall.sh +65 -0
  284. core/hooks/link-commit-to-task.sh +143 -0
  285. core/hooks/lint-task.sh +40 -0
  286. core/hooks/nudge-docs-first.sh +71 -0
  287. core/hooks/nudge-git-mode.sh +29 -0
  288. core/hooks/nudge-graph-os.sh +118 -0
  289. core/hooks/nudge-learn-narrative.sh +36 -0
  290. core/hooks/nudge-model-routing.sh +32 -0
  291. core/hooks/nudge-reentry.sh +101 -0
  292. core/hooks/nudge-reuse-first.sh +68 -0
  293. core/hooks/nudge-task-discovery.sh +81 -0
  294. core/hooks/nudge-thinking-os.sh +109 -0
  295. core/hooks/pr-reap.sh +23 -0
  296. core/hooks/reclaim-sweep.sh +58 -0
  297. core/hooks/record-verify-auto.sh +77 -0
  298. core/hooks/record-verify.sh +74 -0
  299. core/hooks/regen-reminder.sh +104 -0
  300. core/hooks/registry.yaml +1262 -0
  301. core/hooks/remind-daily.sh +27 -0
  302. core/hooks/remind-dogfood.sh +70 -0
  303. core/hooks/remind-learn-validate.sh +94 -0
  304. core/hooks/rules-primer.sh +50 -0
  305. core/hooks/search-enforce-inventory.sh +108 -0
  306. core/hooks/search-verify-remaining.sh +132 -0
  307. core/hooks/session-context.sh +729 -0
  308. core/hooks/session-end.sh +145 -0
  309. core/hooks/session-skill-primer.sh +43 -0
  310. core/hooks/snapshot-transcript.sh +56 -0
  311. core/hooks/sync-task-current.sh +85 -0
  312. core/hooks/test-first-reminder.sh +120 -0
  313. core/hooks/test-governor.sh +173 -0
  314. core/hooks/thinking_os-gate.sh +52 -0
  315. core/hooks/track-backtrack.sh +35 -0
  316. core/hooks/track-discovery.sh +121 -0
  317. core/hooks/track-skill.sh +53 -0
  318. core/hooks/validate-task-frontmatter.sh +49 -0
  319. core/hooks/verify-rename-callers.sh +119 -0
  320. core/hooks/warn-abandoned-task.sh +99 -0
  321. core/hooks/warn-destructive-edit.sh +64 -0
  322. core/hooks/warn-diff-size.sh +43 -0
  323. core/hooks/warn-graph-empty.sh +81 -0
  324. core/hooks/warn-mcp-down.sh +190 -0
  325. core/hooks/write-state.sh +55 -0
  326. core/logging_os/__init__.py +33 -0
  327. core/logging_os/api.py +127 -0
  328. core/logging_os/bridge.py +80 -0
  329. core/logging_os/config.py +172 -0
  330. core/logging_os/fingerprint.py +25 -0
  331. core/logging_os/redact.py +53 -0
  332. core/logging_os/render.py +83 -0
  333. core/logging_os/sinks.py +164 -0
  334. core/rules/anti-overengineering.md +44 -0
  335. core/rules/api-contract-discipline.md +41 -0
  336. core/rules/dimension-registry.md +155 -0
  337. core/rules/git-workflow.md +57 -0
  338. core/rules/memory.md +46 -0
  339. core/rules/model-routing.md +22 -0
  340. core/rules/skill-enforcement.md +75 -0
  341. core/rules/test-discipline.md +38 -0
  342. core/rules/thinking_os.md +48 -0
  343. core/rules/transparency-banner.md +37 -0
  344. core/runtime_paths.yaml +36 -0
  345. core/scaffold_manifest.json +14430 -0
  346. core/scheduled/__init__.py +0 -0
  347. core/scheduled/_activity.py +126 -0
  348. core/scheduled/_state.py +113 -0
  349. core/scheduled/config.py +86 -0
  350. core/scheduled/dep_reconcile.py +135 -0
  351. core/scheduled/error_sweep.py +137 -0
  352. core/scheduled/nightly.py +930 -0
  353. core/scheduled/responsive_extract.py +65 -0
  354. core/schemas/adapter.schema.json +269 -0
  355. core/schemas/preset.schema.json +50 -0
  356. core/schemas/skill.schema.json +81 -0
  357. core/schemas/stack.schema.json +404 -0
  358. core/scripts/_lib.sh +9 -0
  359. core/scripts/docs-lint.sh +228 -0
  360. core/scripts/docs-nav-fix.sh +133 -0
  361. core/scripts/docs-staleness-check.sh +154 -0
  362. core/scripts/install-adapter.sh +266 -0
  363. core/scripts/link-stack-skills.sh +52 -0
  364. core/scripts/log-latest.sh +106 -0
  365. core/scripts/log-search.sh +89 -0
  366. core/scripts/log-write.sh +134 -0
  367. core/scripts/ref-resolve.sh +71 -0
  368. core/skills/a11y/SKILL.md +305 -0
  369. core/skills/a11y/assets/a11y-checklist.md +137 -0
  370. core/skills/a11y/references/aria-and-focus.md +247 -0
  371. core/skills/a11y/references/rn-accessibility.md +343 -0
  372. core/skills/a11y/references/screen-reader-testing.md +190 -0
  373. core/skills/agent-memory/SKILL.md +191 -0
  374. core/skills/agent-memory/assets/memory-checklist.md +21 -0
  375. core/skills/agent-memory/references/memory-recipes.md +57 -0
  376. core/skills/api-design/SKILL.md +232 -0
  377. core/skills/api-design/assets/api-design-checklist.md +110 -0
  378. core/skills/api-design/references/error-envelope.md +381 -0
  379. core/skills/api-design/references/idempotency-pagination.md +312 -0
  380. core/skills/api-design/references/rest-contracts.md +426 -0
  381. core/skills/auth-patterns/SKILL.md +352 -0
  382. core/skills/auth-patterns/assets/auth-checklist.md +118 -0
  383. core/skills/auth-patterns/references/jwt-and-service-tokens.md +343 -0
  384. core/skills/auth-patterns/references/passkeys-2fa.md +289 -0
  385. core/skills/auth-patterns/references/sessions-vs-jwt.md +230 -0
  386. core/skills/auth-patterns/scripts/cookie-flag-check.py +146 -0
  387. core/skills/backend-fundamentals/SKILL.md +238 -0
  388. core/skills/backend-fundamentals/assets/backend-checklist.md +27 -0
  389. core/skills/backend-fundamentals/references/backend-patterns.md +56 -0
  390. core/skills/backend-fundamentals/scripts/check_layering.py +83 -0
  391. core/skills/clean-code/SKILL.md +642 -0
  392. core/skills/clean-code/scripts/audit-fail-closed.py +167 -0
  393. core/skills/codebase-explorer/SKILL.md +89 -0
  394. core/skills/codebase-explorer/assets/reading-checklist.md +24 -0
  395. core/skills/codebase-explorer/references/reading-strategies.md +52 -0
  396. core/skills/codebase-explorer/scripts/outline.py +99 -0
  397. core/skills/db-design/SKILL.md +327 -0
  398. core/skills/db-design/assets/migration-template.sql +49 -0
  399. core/skills/db-design/references/migration-discipline.md +290 -0
  400. core/skills/db-design/references/postgres-patterns.md +340 -0
  401. core/skills/db-design/scripts/migration-safety.sh +150 -0
  402. core/skills/deployment-cicd/SKILL.md +260 -0
  403. core/skills/deployment-cicd/assets/deploy-checklist.md +26 -0
  404. core/skills/deployment-cicd/references/pipeline-and-release.md +54 -0
  405. core/skills/deployment-cicd/scripts/lint_workflow.py +79 -0
  406. core/skills/docker/SKILL.md +114 -0
  407. core/skills/docker/assets/dockerfile-checklist.md +31 -0
  408. core/skills/docker/references/compose-patterns.md +66 -0
  409. core/skills/docker/references/dockerfile-optimization.md +64 -0
  410. core/skills/docker/scripts/lint_dockerfile.sh +48 -0
  411. core/skills/docker/versions.json +16 -0
  412. core/skills/end-to-end-testing/SKILL.md +101 -0
  413. core/skills/end-to-end-testing/assets/e2e-checklist.md +23 -0
  414. core/skills/end-to-end-testing/references/maestro.md +63 -0
  415. core/skills/end-to-end-testing/references/playwright.md +68 -0
  416. core/skills/end-to-end-testing/scripts/lint_e2e.py +88 -0
  417. core/skills/end-to-end-testing/versions.json +16 -0
  418. core/skills/frontend-design/SKILL.md +76 -0
  419. core/skills/frontend-design/assets/design-checklist.md +29 -0
  420. core/skills/frontend-design/references/design-principles.md +65 -0
  421. core/skills/frontend-design/scripts/check_contrast.py +89 -0
  422. core/skills/frontend-fundamentals/SKILL.md +213 -0
  423. core/skills/frontend-fundamentals/assets/frontend-checklist.md +25 -0
  424. core/skills/frontend-fundamentals/references/rendering-and-state.md +66 -0
  425. core/skills/frontend-fundamentals/scripts/check_frontend.py +86 -0
  426. core/skills/graph-explorer/SKILL.md +215 -0
  427. core/skills/graph-explorer/scripts/explain-impact.sh +64 -0
  428. core/skills/graphql/SKILL.md +187 -0
  429. core/skills/grpc-microservices/SKILL.md +174 -0
  430. core/skills/hexagonal-architecture/SKILL.md +199 -0
  431. core/skills/hexagonal-architecture/assets/folder-scaffold.md +233 -0
  432. core/skills/hexagonal-architecture/references/anti-patterns.md +129 -0
  433. core/skills/hexagonal-architecture/references/go-fiber-layout.md +429 -0
  434. core/skills/hexagonal-architecture/references/python-fastapi-layout.md +453 -0
  435. core/skills/hexagonal-architecture/references/react-native-layout.md +428 -0
  436. core/skills/i18n/SKILL.md +126 -0
  437. core/skills/incident-response/SKILL.md +225 -0
  438. core/skills/incident-response/assets/incident-checklist.md +29 -0
  439. core/skills/incident-response/references/severity-and-runbook.md +53 -0
  440. core/skills/incident-response/scripts/classify_severity.py +86 -0
  441. core/skills/linux-sysadmin/SKILL.md +115 -0
  442. core/skills/linux-sysadmin/assets/hardening-checklist.md +29 -0
  443. core/skills/linux-sysadmin/references/ssh-hardening.md +62 -0
  444. core/skills/linux-sysadmin/references/systemd-and-services.md +77 -0
  445. core/skills/linux-sysadmin/scripts/triage.sh +50 -0
  446. core/skills/linux-sysadmin/versions.json +17 -0
  447. core/skills/llm-patterns/SKILL.md +410 -0
  448. core/skills/llm-patterns/assets/llm-feature-checklist.md +26 -0
  449. core/skills/llm-patterns/references/rag-and-evals.md +59 -0
  450. core/skills/llm-patterns/scripts/estimate_tokens.py +75 -0
  451. core/skills/messaging-queues/SKILL.md +142 -0
  452. core/skills/mobile-fundamentals/SKILL.md +406 -0
  453. core/skills/mobile-fundamentals/assets/mobile-launch-checklist.md +130 -0
  454. core/skills/mobile-fundamentals/references/navigation-and-deep-links.md +337 -0
  455. core/skills/mobile-fundamentals/references/offline-sync.md +339 -0
  456. core/skills/node-backend/SKILL.md +114 -0
  457. core/skills/node-backend/assets/node-checklist.md +25 -0
  458. core/skills/node-backend/references/async-and-errors.md +67 -0
  459. core/skills/node-backend/references/event-loop.md +65 -0
  460. core/skills/node-backend/scripts/check_package.py +78 -0
  461. core/skills/node-backend/versions.json +17 -0
  462. core/skills/observability/SKILL.md +289 -0
  463. core/skills/observability/assets/observability-checklist.md +27 -0
  464. core/skills/observability/references/instrumentation.md +57 -0
  465. core/skills/observability/scripts/lint_logging.py +77 -0
  466. core/skills/payments/SKILL.md +102 -0
  467. core/skills/performance/SKILL.md +305 -0
  468. core/skills/performance/assets/perf-checklist.md +143 -0
  469. core/skills/performance/references/mobile-performance.md +249 -0
  470. core/skills/performance/references/web-vitals.md +209 -0
  471. core/skills/php/SKILL.md +116 -0
  472. core/skills/php/assets/php-checklist.md +26 -0
  473. core/skills/php/references/modern-php.md +64 -0
  474. core/skills/php/references/security.md +72 -0
  475. core/skills/php/scripts/scan_php_smells.py +99 -0
  476. core/skills/php/versions.json +9 -0
  477. core/skills/pr-mode-driver/SKILL.md +65 -0
  478. core/skills/realtime-websockets/SKILL.md +152 -0
  479. core/skills/redis/SKILL.md +105 -0
  480. core/skills/redis/assets/redis-checklist.md +27 -0
  481. core/skills/redis/references/operations.md +66 -0
  482. core/skills/redis/references/patterns.md +62 -0
  483. core/skills/redis/scripts/analyze_info.py +101 -0
  484. core/skills/redis/versions.json +9 -0
  485. core/skills/search/SKILL.md +91 -0
  486. core/skills/search/references/grep.md +76 -0
  487. core/skills/search/scripts/verify-count.sh +73 -0
  488. core/skills/search-infra/SKILL.md +109 -0
  489. core/skills/security-mobile/SKILL.md +394 -0
  490. core/skills/security-mobile/assets/mobile-security-checklist.md +117 -0
  491. core/skills/security-mobile/references/masvs-l1-checklist.md +127 -0
  492. core/skills/security-web/SKILL.md +217 -0
  493. core/skills/security-web/assets/security-web-checklist.md +167 -0
  494. core/skills/security-web/references/owasp-top-10.md +551 -0
  495. core/skills/security-web/references/supply-chain.md +179 -0
  496. core/skills/security-web/scripts/csp-check.sh +153 -0
  497. core/skills/shell-scripting/SKILL.md +128 -0
  498. core/skills/shell-scripting/assets/script-checklist.md +33 -0
  499. core/skills/shell-scripting/references/argument-parsing.md +84 -0
  500. core/skills/shell-scripting/references/bash-robustness.md +78 -0
  501. core/skills/shell-scripting/scripts/lint_script.sh +53 -0
  502. core/skills/shell-scripting/scripts/new_script.py +131 -0
  503. core/skills/shell-scripting/versions.json +23 -0
  504. core/skills/sql-authoring/SKILL.md +104 -0
  505. core/skills/sql-authoring/assets/query-review-checklist.md +26 -0
  506. core/skills/sql-authoring/references/query-patterns.md +89 -0
  507. core/skills/sql-authoring/references/reading-explain.md +52 -0
  508. core/skills/sql-authoring/scripts/analyze_plan.py +100 -0
  509. core/skills/sql-authoring/versions.json +17 -0
  510. core/skills/state-management/SKILL.md +428 -0
  511. core/skills/state-management/references/tanstack-query-recipes.md +301 -0
  512. core/skills/state-management/references/zustand-recipes.md +364 -0
  513. core/skills/supabase/SKILL.md +108 -0
  514. core/skills/supabase/assets/supabase-checklist.md +26 -0
  515. core/skills/supabase/references/realtime-and-storage.md +55 -0
  516. core/skills/supabase/references/rls-and-auth.md +65 -0
  517. core/skills/supabase/scripts/check_rls.py +88 -0
  518. core/skills/supabase/versions.json +9 -0
  519. core/skills/task-driver/SKILL.md +272 -0
  520. core/skills/task-driver/scripts/task-lint.sh +163 -0
  521. core/skills/technical-writing/SKILL.md +85 -0
  522. core/skills/technical-writing/assets/doc-checklist.md +29 -0
  523. core/skills/technical-writing/references/doc-anatomy.md +53 -0
  524. core/skills/technical-writing/references/writing-craft.md +59 -0
  525. core/skills/technical-writing/scripts/new_doc.py +81 -0
  526. core/skills/terraform-k8s/SKILL.md +133 -0
  527. core/skills/testing-strategy/SKILL.md +266 -0
  528. core/skills/testing-strategy/assets/test-review-checklist.md +25 -0
  529. core/skills/testing-strategy/references/test-types.md +52 -0
  530. core/skills/testing-strategy/scripts/coverage_gate.py +79 -0
  531. core/skills/thinking_os/SKILL.md +288 -0
  532. core/skills/thinking_os/scripts/classify.sh +122 -0
  533. core/skills/typescript/SKILL.md +110 -0
  534. core/skills/typescript/assets/typescript-checklist.md +24 -0
  535. core/skills/typescript/references/strictness.md +53 -0
  536. core/skills/typescript/references/type-system.md +86 -0
  537. core/skills/typescript/scripts/check_tsconfig.py +92 -0
  538. core/skills/typescript/versions.json +9 -0
  539. core/subsystems.yaml +202 -0
  540. core/thinking_os/__init__.py +1 -0
  541. core/thinking_os/_agent_markers.py +32 -0
  542. core/thinking_os/agents/README.md +71 -0
  543. core/thinking_os/agents/analyst.md +139 -0
  544. core/thinking_os/agents/architect.md +127 -0
  545. core/thinking_os/agents/debugger.md +111 -0
  546. core/thinking_os/agents/deployer.md +112 -0
  547. core/thinking_os/agents/distiller.md +28 -0
  548. core/thinking_os/agents/documenter.md +101 -0
  549. core/thinking_os/agents/implementer.md +135 -0
  550. core/thinking_os/agents/internal/session_observer.md +39 -0
  551. core/thinking_os/agents/observer.md +100 -0
  552. core/thinking_os/agents/onboarder.md +81 -0
  553. core/thinking_os/agents/refactorer.md +123 -0
  554. core/thinking_os/agents/repairer.md +47 -0
  555. core/thinking_os/agents/researcher.md +129 -0
  556. core/thinking_os/agents/reviewer.md +147 -0
  557. core/thinking_os/agents/security_auditor.md +133 -0
  558. core/thinking_os/background.py +405 -0
  559. core/thinking_os/bootstrap_outcomes.py +200 -0
  560. core/thinking_os/budget.py +302 -0
  561. core/thinking_os/capture.py +495 -0
  562. core/thinking_os/cognition.py +516 -0
  563. core/thinking_os/cognition_schemas.py +517 -0
  564. core/thinking_os/compress.py +192 -0
  565. core/thinking_os/concepts.py +233 -0
  566. core/thinking_os/dashboard.py +159 -0
  567. core/thinking_os/database.py +2883 -0
  568. core/thinking_os/decay.py +393 -0
  569. core/thinking_os/digest.py +295 -0
  570. core/thinking_os/dispatcher.py +192 -0
  571. core/thinking_os/dispatcher_helpers.py +48 -0
  572. core/thinking_os/dispatchers/__init__.py +3 -0
  573. core/thinking_os/dispatchers/default.py +47 -0
  574. core/thinking_os/distill.py +192 -0
  575. core/thinking_os/doc_indexer.py +905 -0
  576. core/thinking_os/embeddings.py +943 -0
  577. core/thinking_os/formula_composer.py +556 -0
  578. core/thinking_os/gate_marker.py +75 -0
  579. core/thinking_os/graph.py +296 -0
  580. core/thinking_os/graph_indexer.py +360 -0
  581. core/thinking_os/health_check.py +517 -0
  582. core/thinking_os/impact.py +119 -0
  583. core/thinking_os/memory_gc.py +356 -0
  584. core/thinking_os/migrator_embeddings.py +318 -0
  585. core/thinking_os/precision.py +194 -0
  586. core/thinking_os/presets/registry.yaml +127 -0
  587. core/thinking_os/record_outcome.py +399 -0
  588. core/thinking_os/repair.py +105 -0
  589. core/thinking_os/retrieval_quality.py +239 -0
  590. core/thinking_os/roles/analyst.yaml +83 -0
  591. core/thinking_os/roles/architect.yaml +88 -0
  592. core/thinking_os/roles/debugger.yaml +71 -0
  593. core/thinking_os/roles/deployer.yaml +71 -0
  594. core/thinking_os/roles/documenter.yaml +72 -0
  595. core/thinking_os/roles/implementer.yaml +83 -0
  596. core/thinking_os/roles/observer.yaml +70 -0
  597. core/thinking_os/roles/refactorer.yaml +71 -0
  598. core/thinking_os/roles/researcher.yaml +72 -0
  599. core/thinking_os/roles/reviewer.yaml +79 -0
  600. core/thinking_os/roles/security_auditor.yaml +83 -0
  601. core/thinking_os/roles_state.py +168 -0
  602. core/thinking_os/sanitizer.py +320 -0
  603. core/thinking_os/server.py +3160 -0
  604. core/thinking_os/session_enrich.py +272 -0
  605. core/thinking_os/session_observe_worker.py +111 -0
  606. core/thinking_os/session_startup.py +74 -0
  607. core/thinking_os/session_summary.py +245 -0
  608. core/thinking_os/situations/registry.yaml +99 -0
  609. core/thinking_os/task_analyzer.py +462 -0
  610. core/thinking_os/task_parser.py +342 -0
  611. core/thinking_os/task_sync.py +73 -0
  612. core/thinking_os/tools/__init__.py +6 -0
  613. core/thinking_os/tools/_shared.py +947 -0
  614. core/thinking_os/tools/cognition.py +1867 -0
  615. core/thinking_os/tools/docs.py +770 -0
  616. core/thinking_os/tools/learning.py +2078 -0
  617. core/thinking_os/tools/logs.py +79 -0
  618. core/thinking_os/tools/memory.py +840 -0
  619. core/thinking_os/tools/metrics.py +200 -0
  620. core/thinking_os/tools/retrieve.py +415 -0
  621. core/thinking_os/tools/routing.py +658 -0
  622. core/thinking_os/tools/tasks.py +449 -0
  623. core/thinking_os/tools/trajectory.py +181 -0
  624. core/thinking_os/tracing.py +235 -0
  625. core/web/__init__.py +5 -0
  626. core/web/_cache.py +118 -0
  627. core/web/_deps.py +56 -0
  628. core/web/_envelope.py +85 -0
  629. core/web/_project_context.py +140 -0
  630. core/web/chat_providers.py +108 -0
  631. core/web/init_jobs.py +216 -0
  632. core/web/routes/__init__.py +25 -0
  633. core/web/routes/_bounded_read.py +76 -0
  634. core/web/routes/board.py +1089 -0
  635. core/web/routes/cognition.py +1838 -0
  636. core/web/routes/config.py +635 -0
  637. core/web/routes/graph.py +513 -0
  638. core/web/routes/health.py +180 -0
  639. core/web/routes/hooks.py +288 -0
  640. core/web/routes/hub.py +1219 -0
  641. core/web/routes/logs.py +374 -0
  642. core/web/routes/metrics.py +43 -0
  643. core/web/routes/observability.py +400 -0
  644. core/web/routes/patterns.py +227 -0
  645. core/web/routes/presence.py +609 -0
  646. core/web/routes/roles.py +446 -0
  647. core/web/routes/scheduled.py +261 -0
  648. core/web/routes/search.py +238 -0
  649. core/web/routes/sessions.py +220 -0
  650. core/web/routes/settings.py +363 -0
  651. core/web/routes/stream.py +547 -0
  652. core/web/security.py +157 -0
  653. core/web/server.py +283 -0
  654. graph_os/__init__.py +29 -0
  655. graph_os/backend.py +233 -0
  656. graph_os/backends/__init__.py +13 -0
  657. graph_os/backends/sqlite_backend.py +1053 -0
  658. graph_os/communities.py +410 -0
  659. graph_os/enterprise.py +218 -0
  660. graph_os/entry_points.py +226 -0
  661. graph_os/extractors/__init__.py +25 -0
  662. graph_os/extractors/code_generic.py +914 -0
  663. graph_os/extractors/code_go.py +1422 -0
  664. graph_os/extractors/code_json.py +340 -0
  665. graph_os/extractors/code_php.py +979 -0
  666. graph_os/extractors/code_python.py +1454 -0
  667. graph_os/extractors/code_shell.py +538 -0
  668. graph_os/extractors/code_toml.py +302 -0
  669. graph_os/extractors/code_ts.py +1665 -0
  670. graph_os/extractors/code_yaml.py +394 -0
  671. graph_os/extractors/contracts.py +1592 -0
  672. graph_os/extractors/md_links.py +890 -0
  673. graph_os/extractors/task_deps.py +345 -0
  674. graph_os/groups/__init__.py +22 -0
  675. graph_os/groups/cross_repo.py +156 -0
  676. graph_os/groups/manifest.py +141 -0
  677. graph_os/ingest/__init__.py +19 -0
  678. graph_os/ingest/base.py +306 -0
  679. graph_os/ingest/github.py +112 -0
  680. graph_os/ingest/zip.py +95 -0
  681. graph_os/toolchain.py +393 -0
  682. graph_os/tools/__init__.py +9 -0
  683. graph_os/tools/graph.py +5573 -0
  684. graph_os/tools/reindex_dispatch.py +730 -0
  685. graph_os/tree_sitter_overlay.py +235 -0
  686. graph_os/types.py +252 -0
  687. graph_os/vec_index.py +277 -0
  688. graph_os/viewer/__init__.py +12 -0
  689. graph_os/viewer/exporter.py +93 -0
  690. graph_os/viewer/template.py +189 -0
  691. scheduled/__init__.py +0 -0
  692. scheduled/_activity.py +126 -0
  693. scheduled/_state.py +113 -0
  694. scheduled/config.py +86 -0
  695. scheduled/dep_reconcile.py +135 -0
  696. scheduled/error_sweep.py +137 -0
  697. scheduled/nightly.py +930 -0
  698. scheduled/responsive_extract.py +65 -0
  699. scripts/__init__.py +4 -0
  700. scripts/_commit_msg_body.sh +31 -0
  701. scripts/_post_commit_body.sh +49 -0
  702. scripts/_pre_commit_body.sh +121 -0
  703. scripts/_prepare_commit_msg_body.sh +53 -0
  704. scripts/audit_mcp_tools.py +693 -0
  705. scripts/bench_sdk_dispatcher.py +177 -0
  706. scripts/capture_golden.py +169 -0
  707. scripts/check_graph_phantoms.py +75 -0
  708. scripts/dev/audit_doc_links.py +359 -0
  709. scripts/dev/audit_scaffold_module_tags.py +107 -0
  710. scripts/dev/backfill_doc_headers.py +328 -0
  711. scripts/dev/backfill_nav_lines.py +119 -0
  712. scripts/dev/fix_nav_placement.py +106 -0
  713. scripts/dev/inspect_sdk_options.py +45 -0
  714. scripts/dev/migrate_check_ids.py +170 -0
  715. scripts/dev/strip_purpose_blocks.py +154 -0
  716. scripts/dump_openapi.py +66 -0
  717. scripts/e2e_dispatch_tool.py +195 -0
  718. scripts/generate_manifest.py +166 -0
  719. scripts/golden_sections.py +20 -0
  720. scripts/graph_demo.py +161 -0
  721. scripts/install-git-hooks.sh +47 -0
  722. scripts/migrate_embeddings_minilm_to_bge_m3.py +84 -0
  723. scripts/operational_eval.py +445 -0
  724. scripts/probe_agent_session_resolver.py +59 -0
  725. scripts/prune_deleted_path.py +127 -0
  726. scripts/refactor_agent_dual_mode.py +171 -0
  727. scripts/refresh_skill_versions.py +302 -0
  728. scripts/regen_doc_index.py +209 -0
  729. scripts/regen_doctor_schema.py +62 -0
  730. scripts/regen_rules.py +94 -0
  731. scripts/rename_formulas_to_semantic.py +241 -0
  732. scripts/smoke_db_connections.py +183 -0
  733. scripts/smoke_doc_header.py +72 -0
  734. scripts/smoke_graph_e2e.py +374 -0
  735. scripts/smoke_sdk_dispatch.py +84 -0
  736. scripts/smoke_uid_resolver.py +164 -0
  737. scripts/verify_dispatchers.py +244 -0
  738. scripts/verify_phase_c_e2e.py +436 -0
  739. templates/__init__.py +6 -0
  740. templates/_base/Makefile.base +353 -0
  741. templates/_base/base.yaml +59 -0
  742. templates/_base/coding-os.yaml.template +39 -0
  743. templates/_base/dimension-registry.template.md +68 -0
  744. templates/_base/domain-config.template.json +46 -0
  745. templates/_base/fragments/anatomy-map.md.tmpl +11 -0
  746. templates/_base/fragments/context-discipline.md.tmpl +3 -0
  747. templates/_base/fragments/core-loop.md.tmpl +52 -0
  748. templates/_base/fragments/engineering-routing.md.tmpl +3 -0
  749. templates/_base/fragments/header.md.tmpl +6 -0
  750. templates/_base/fragments/identity.md.tmpl +3 -0
  751. templates/_base/fragments/principles.md.tmpl +3 -0
  752. templates/_base/fragments/retrieval-routing.md.tmpl +23 -0
  753. templates/_base/fragments/session-handoff.md.tmpl +3 -0
  754. templates/_base/fragments/skills.md.tmpl +3 -0
  755. templates/_base/fragments/ssot-map.md.tmpl +3 -0
  756. templates/_base/fragments/stop-conditions.md.tmpl +3 -0
  757. templates/_base/fragments/subagent-dispatch.md.tmpl +3 -0
  758. templates/_base/fragments/task-authoring.md.tmpl +69 -0
  759. templates/_base/fragments/task-logging.md.tmpl +8 -0
  760. templates/_base/fragments/tool-routing.md.tmpl +9 -0
  761. templates/_base/fragments/verification-matrix.md.tmpl +12 -0
  762. templates/_base/lang/dart/analysis_options.yaml +7 -0
  763. templates/_base/lang/php/phpcs.xml.dist +10 -0
  764. templates/_base/lang/python/pyproject.toml +19 -0
  765. templates/_base/lang/rust/clippy.toml +5 -0
  766. templates/_base/lang/rust/rustfmt.toml +3 -0
  767. templates/_base/lang/typescript/eslint.config.js +26 -0
  768. templates/_base/lang/typescript/tsconfig.json +15 -0
  769. templates/_base/lang/typescript/vitest.config.ts +10 -0
  770. templates/_base/scaffold/changes.log +1 -0
  771. templates/_base/scaffold/docs/00-index.md +55 -0
  772. templates/_base/scaffold/docs/_meta/feature-dependency-tree.md +30 -0
  773. templates/_base/scaffold/docs/_meta/foundation-map.md +56 -0
  774. templates/_base/scaffold/docs/_meta/questions.md +8 -0
  775. templates/_base/scaffold/docs/_meta/roadmap.md +33 -0
  776. templates/_base/scaffold/docs/api-contracts/00-index.md +58 -0
  777. templates/_base/scaffold/docs/api-contracts/error-format.md +58 -0
  778. templates/_base/scaffold/docs/architecture/00-index.md +42 -0
  779. templates/_base/scaffold/docs/architecture/adr/00-index.md +39 -0
  780. templates/_base/scaffold/docs/engineering/00-index.md +9 -0
  781. templates/_base/scaffold/docs/governance/00-index.md +55 -0
  782. templates/_base/scaffold/docs/governance/_templates/doc-cheat-sheet.md +202 -0
  783. templates/_base/scaffold/docs/governance/_templates/playbook-template.md +81 -0
  784. templates/_base/scaffold/docs/governance/_templates/post-mortem-template.md +85 -0
  785. templates/_base/scaffold/docs/governance/_templates/runbook-template.md +88 -0
  786. templates/_base/scaffold/docs/governance/_templates/security-review-template.md +111 -0
  787. templates/_base/scaffold/docs/governance/_templates/task-detail.md +61 -0
  788. templates/_base/scaffold/docs/governance/agent-workflow.md +101 -0
  789. templates/_base/scaffold/docs/governance/anatomy-contract.md +150 -0
  790. templates/_base/scaffold/docs/governance/critical-rules.md +224 -0
  791. templates/_base/scaffold/docs/governance/decision-records.md +58 -0
  792. templates/_base/scaffold/docs/governance/docs-first-protocol.md +157 -0
  793. templates/_base/scaffold/docs/governance/docs-system.md +151 -0
  794. templates/_base/scaffold/docs/governance/gdpr-compliance.md +66 -0
  795. templates/_base/scaffold/docs/governance/mcp-tool-inventory.md +112 -0
  796. templates/_base/scaffold/docs/governance/risk-register.md +26 -0
  797. templates/_base/scaffold/docs/governance/scaffold-boundary-contract.md +161 -0
  798. templates/_base/scaffold/docs/governance/task-lifecycle.md +125 -0
  799. templates/_base/scaffold/docs/governance/wrapper-derivation.md +50 -0
  800. templates/_base/scaffold/docs/insights/00-index.md +17 -0
  801. templates/_base/scaffold/docs/ops/00-index.md +59 -0
  802. templates/_base/scaffold/docs/ops/runbooks/00-index.md +9 -0
  803. templates/_base/scaffold/docs/playbooks/00-index.md +12 -0
  804. templates/_base/scaffold/docs/playbooks/research-validation.md +29 -0
  805. templates/_base/scaffold/docs/playbooks/security-review.md +41 -0
  806. templates/_base/scaffold/docs/prd/00-index.md +43 -0
  807. templates/_base/scaffold/docs/prd/01-snapshot-vision.md +56 -0
  808. templates/_base/scaffold/docs/workflow/workflow-guide.md +138 -0
  809. templates/_base/scaffold/src/shared/README.md +23 -0
  810. templates/_base/skill-enforcement.template.md +14 -0
  811. templates/_base/task-detail.template.md +61 -0
  812. templates/_presets/ai-saas.yaml +9 -0
  813. templates/_presets/django-next.yaml +8 -0
  814. templates/_presets/dotnet-react.yaml +8 -0
  815. templates/_presets/flutter-baas.yaml +8 -0
  816. templates/_presets/go-react.yaml +8 -0
  817. templates/_presets/hexagonal-product.yaml +16 -0
  818. templates/_presets/jamstack.yaml +8 -0
  819. templates/_presets/laravel-vue.yaml +8 -0
  820. templates/_presets/mean.yaml +8 -0
  821. templates/_presets/mern.yaml +9 -0
  822. templates/_presets/nest-angular.yaml +8 -0
  823. templates/_presets/nextjs-fastapi.yaml +10 -0
  824. templates/_presets/nuxt-fullstack.yaml +9 -0
  825. templates/_presets/pern.yaml +9 -0
  826. templates/_presets/rails-react.yaml +8 -0
  827. templates/_presets/rn-api.yaml +8 -0
  828. templates/_presets/rust-svelte.yaml +8 -0
  829. templates/_presets/spring-react.yaml +8 -0
  830. templates/_presets/t3-style.yaml +9 -0
  831. templates/_presets/tall.yaml +8 -0
  832. templates/_presets/wordpress-cms.yaml +8 -0
  833. templates/angular/rules/frontend.md +19 -0
  834. templates/angular/scaffold/docs/engineering/accessibility.md +46 -0
  835. templates/angular/scaffold/docs/engineering/angular-rules.md +35 -0
  836. templates/angular/scaffold/docs/playbooks/angular-app.md +42 -0
  837. templates/angular/scaffold/src/frontend/angular.json +52 -0
  838. templates/angular/scaffold/src/frontend/package.json +28 -0
  839. templates/angular/scaffold/src/frontend/src/app/app.component.ts +19 -0
  840. templates/angular/scaffold/src/frontend/src/app/app.config.ts +22 -0
  841. templates/angular/scaffold/src/frontend/src/app/app.routes.ts +8 -0
  842. templates/angular/scaffold/src/frontend/src/app/core/global-error-handler.ts +12 -0
  843. templates/angular/scaffold/src/frontend/src/app/health/health.component.ts +14 -0
  844. templates/angular/scaffold/src/frontend/src/app/health/health.service.spec.ts +16 -0
  845. templates/angular/scaffold/src/frontend/src/app/health/health.service.ts +10 -0
  846. templates/angular/scaffold/src/frontend/src/index.html +11 -0
  847. templates/angular/scaffold/src/frontend/src/main.ts +9 -0
  848. templates/angular/scaffold/src/frontend/src/styles.css +14 -0
  849. templates/angular/scaffold/src/frontend/tsconfig.app.json +8 -0
  850. templates/angular/scaffold/src/frontend/tsconfig.json +27 -0
  851. templates/angular/scaffold/src/frontend/tsconfig.spec.json +8 -0
  852. templates/angular/scaffold-boundary.yaml +27 -0
  853. templates/angular/skills/angular/SKILL.md +79 -0
  854. templates/angular/skills/angular/references/anatomy.md +69 -0
  855. templates/angular/stack.yaml +75 -0
  856. templates/aspnet-core/rules/backend.md +20 -0
  857. templates/aspnet-core/scaffold/docs/engineering/aspnet-core-rules.md +36 -0
  858. templates/aspnet-core/scaffold/docs/playbooks/aspnet-core-service.md +40 -0
  859. templates/aspnet-core/scaffold/src/backend/Backend.csproj +11 -0
  860. templates/aspnet-core/scaffold/src/backend/Backend.sln +27 -0
  861. templates/aspnet-core/scaffold/src/backend/Common/ExceptionHandlingMiddleware.cs +35 -0
  862. templates/aspnet-core/scaffold/src/backend/Features/Health/HealthEndpoints.cs +10 -0
  863. templates/aspnet-core/scaffold/src/backend/Features/Health/HealthService.cs +9 -0
  864. templates/aspnet-core/scaffold/src/backend/Program.cs +22 -0
  865. templates/aspnet-core/scaffold/src/backend/tests/Backend.Tests/Backend.Tests.csproj +22 -0
  866. templates/aspnet-core/scaffold/src/backend/tests/Backend.Tests/HealthServiceTests.cs +15 -0
  867. templates/aspnet-core/scaffold-boundary.yaml +24 -0
  868. templates/aspnet-core/skills/aspnet-core/SKILL.md +80 -0
  869. templates/aspnet-core/skills/aspnet-core/references/anatomy.md +65 -0
  870. templates/aspnet-core/stack.yaml +68 -0
  871. templates/astro/rules/frontend.md +20 -0
  872. templates/astro/scaffold/docs/engineering/astro-rules.md +40 -0
  873. templates/astro/scaffold/docs/playbooks/astro-app.md +57 -0
  874. templates/astro/scaffold/docs/playbooks/content-seo.md +37 -0
  875. templates/astro/scaffold/src/frontend/astro.config.mjs +10 -0
  876. templates/astro/scaffold/src/frontend/package.json +23 -0
  877. templates/astro/scaffold/src/frontend/src/components/Greeting.astro +13 -0
  878. templates/astro/scaffold/src/frontend/src/content/posts/hello.md +10 -0
  879. templates/astro/scaffold/src/frontend/src/content.config.ts +19 -0
  880. templates/astro/scaffold/src/frontend/src/lib/problem.test.ts +39 -0
  881. templates/astro/scaffold/src/frontend/src/lib/problem.ts +30 -0
  882. templates/astro/scaffold/src/frontend/src/pages/api/health.ts +13 -0
  883. templates/astro/scaffold/src/frontend/src/pages/index.astro +21 -0
  884. templates/astro/scaffold/src/frontend/tsconfig.json +9 -0
  885. templates/astro/scaffold/src/frontend/vitest.config.ts +10 -0
  886. templates/astro/scaffold-boundary.yaml +28 -0
  887. templates/astro/skills/astro/SKILL.md +71 -0
  888. templates/astro/skills/astro/references/anatomy.md +66 -0
  889. templates/astro/stack.yaml +75 -0
  890. templates/csharp-plain/scaffold/src/backend/Backend.csproj +12 -0
  891. templates/csharp-plain/scaffold/src/backend/Program.cs +1 -0
  892. templates/csharp-plain/scaffold-boundary.yaml +23 -0
  893. templates/csharp-plain/stack.yaml +50 -0
  894. templates/django/rules/backend.md +18 -0
  895. templates/django/scaffold/docs/engineering/anti-ambiguity.md +74 -0
  896. templates/django/scaffold/docs/engineering/backend-rules.md +133 -0
  897. templates/django/scaffold/docs/engineering/glossary.md +51 -0
  898. templates/django/scaffold/docs/engineering/logging-standards.md +107 -0
  899. templates/django/scaffold/docs/engineering/naming-conventions.md +68 -0
  900. templates/django/scaffold/docs/engineering/secrets-rotation-runbook.md +142 -0
  901. templates/django/scaffold/docs/playbooks/backend-api.md +119 -0
  902. templates/django/scaffold/src/backend/config/__init__.py +0 -0
  903. templates/django/scaffold/src/backend/config/settings.py +31 -0
  904. templates/django/scaffold/src/backend/config/urls.py +11 -0
  905. templates/django/scaffold/src/backend/config/wsgi.py +6 -0
  906. templates/django/scaffold/src/backend/manage.py +14 -0
  907. templates/django/scaffold/src/backend/pyproject.toml +37 -0
  908. templates/django/scaffold/src/backend/tests/test_health.py +4 -0
  909. templates/django/scaffold-boundary.yaml +25 -0
  910. templates/django/skills/python-django/SKILL.md +450 -0
  911. templates/django/skills/python-django/references/anatomy.md +117 -0
  912. templates/django/skills/python-django/scripts/new_endpoint.py +89 -0
  913. templates/django/stack.yaml +73 -0
  914. templates/fastapi/rules/backend.md +18 -0
  915. templates/fastapi/scaffold/docs/engineering/fastapi-rules.md +37 -0
  916. templates/fastapi/scaffold/docs/playbooks/fastapi-service.md +30 -0
  917. templates/fastapi/scaffold/src/backend/app/__init__.py +0 -0
  918. templates/fastapi/scaffold/src/backend/app/main.py +8 -0
  919. templates/fastapi/scaffold/src/backend/pyproject.toml +39 -0
  920. templates/fastapi/scaffold/src/backend/tests/test_health.py +11 -0
  921. templates/fastapi/scaffold-boundary.yaml +25 -0
  922. templates/fastapi/skills/python-fastapi/SKILL.md +75 -0
  923. templates/fastapi/skills/python-fastapi/references/anatomy.md +117 -0
  924. templates/fastapi/skills/python-fastapi/scripts/new_endpoint.py +101 -0
  925. templates/fastapi/stack.yaml +57 -0
  926. templates/flutter/rules/mobile.md +26 -0
  927. templates/flutter/scaffold/docs/engineering/flutter-rules.md +35 -0
  928. templates/flutter/scaffold/docs/playbooks/flutter-app.md +45 -0
  929. templates/flutter/scaffold/src/mobile/lib/core/error_mapper.dart +17 -0
  930. templates/flutter/scaffold/src/mobile/lib/core/router.dart +13 -0
  931. templates/flutter/scaffold/src/mobile/lib/main.dart +22 -0
  932. templates/flutter/scaffold/src/mobile/lib/screens/health_screen.dart +32 -0
  933. templates/flutter/scaffold/src/mobile/lib/services/health_service.dart +11 -0
  934. templates/flutter/scaffold/src/mobile/lib/state/health_provider.dart +13 -0
  935. templates/flutter/scaffold/src/mobile/pubspec.yaml +22 -0
  936. templates/flutter/scaffold/src/mobile/test/health_provider_test.dart +90 -0
  937. templates/flutter/scaffold-boundary.yaml +28 -0
  938. templates/flutter/skills/flutter/SKILL.md +76 -0
  939. templates/flutter/skills/flutter/references/anatomy.md +64 -0
  940. templates/flutter/stack.yaml +70 -0
  941. templates/go/rules/backend.md +19 -0
  942. templates/go/scaffold/docs/engineering/go-rules.md +45 -0
  943. templates/go/scaffold/docs/playbooks/go-service.md +30 -0
  944. templates/go/scaffold/src/backend/cmd/api/main.go +22 -0
  945. templates/go/scaffold/src/backend/cmd/api/main_test.go +20 -0
  946. templates/go/scaffold/src/backend/go.mod +3 -0
  947. templates/go/scaffold-boundary.yaml +25 -0
  948. templates/go/skills/go-patterns/SKILL.md +68 -0
  949. templates/go/skills/go-patterns/assets/go-checklist.md +29 -0
  950. templates/go/skills/go-patterns/references/anatomy.md +115 -0
  951. templates/go/skills/go-patterns/references/go-2026-idioms.md +92 -0
  952. templates/go/skills/go-patterns/scripts/new_endpoint.py +117 -0
  953. templates/go/skills/go-patterns/versions.json +16 -0
  954. templates/go/stack.yaml +54 -0
  955. templates/go-fiber/rules/backend.md +20 -0
  956. templates/go-fiber/scaffold/docs/engineering/fiber-rules.md +97 -0
  957. templates/go-fiber/scaffold/docs/playbooks/fiber-service.md +149 -0
  958. templates/go-fiber/scaffold/src/backend/cmd/api/main.go +21 -0
  959. templates/go-fiber/scaffold/src/backend/cmd/api/main_test.go +17 -0
  960. templates/go-fiber/scaffold/src/backend/go.mod +23 -0
  961. templates/go-fiber/scaffold/src/backend/go.sum +49 -0
  962. templates/go-fiber/scaffold-boundary.yaml +26 -0
  963. templates/go-fiber/skills/go-fiber/SKILL.md +203 -0
  964. templates/go-fiber/skills/go-fiber/assets/fiber-checklist.md +26 -0
  965. templates/go-fiber/skills/go-fiber/references/anatomy.md +116 -0
  966. templates/go-fiber/skills/go-fiber/references/fiber-v3-patterns.md +89 -0
  967. templates/go-fiber/skills/go-fiber/scripts/new_endpoint.py +107 -0
  968. templates/go-fiber/skills/go-fiber/versions.json +16 -0
  969. templates/go-fiber/stack.yaml +59 -0
  970. templates/go-plain/scaffold/src/backend/go.mod +3 -0
  971. templates/go-plain/scaffold/src/backend/main.go +7 -0
  972. templates/go-plain/scaffold-boundary.yaml +22 -0
  973. templates/go-plain/stack.yaml +51 -0
  974. templates/java-plain/scaffold/src/backend/mvnw +302 -0
  975. templates/java-plain/scaffold/src/backend/pom.xml +41 -0
  976. templates/java-plain/scaffold/src/backend/src/main/java/com/example/app/Main.java +10 -0
  977. templates/java-plain/scaffold-boundary.yaml +23 -0
  978. templates/java-plain/stack.yaml +51 -0
  979. templates/laravel/rules/backend.md +20 -0
  980. templates/laravel/scaffold/docs/engineering/laravel-rules.md +28 -0
  981. templates/laravel/scaffold/docs/playbooks/laravel-service.md +28 -0
  982. templates/laravel/scaffold/src/backend/app/Exceptions/Handler.php +27 -0
  983. templates/laravel/scaffold/src/backend/app/Http/Controllers/HealthController.php +15 -0
  984. templates/laravel/scaffold/src/backend/app/Support/HealthStatus.php +14 -0
  985. templates/laravel/scaffold/src/backend/composer.json +24 -0
  986. templates/laravel/scaffold/src/backend/phpunit.xml +10 -0
  987. templates/laravel/scaffold/src/backend/public/index.php +8 -0
  988. templates/laravel/scaffold/src/backend/routes/api.php +7 -0
  989. templates/laravel/scaffold/src/backend/tests/Unit/HealthStatusTest.php +16 -0
  990. templates/laravel/scaffold-boundary.yaml +23 -0
  991. templates/laravel/skills/laravel/SKILL.md +56 -0
  992. templates/laravel/skills/laravel/references/anatomy.md +65 -0
  993. templates/laravel/stack.yaml +66 -0
  994. templates/meta/rules/graph-first.md +27 -0
  995. templates/meta/rules/hook-author.md +19 -0
  996. templates/meta/rules/mcp-tool-author.md +18 -0
  997. templates/meta/rules/meta-engineering.md +17 -0
  998. templates/meta/scaffold-boundary.yaml +55 -0
  999. templates/meta/skills/claude-sdk-integration/SKILL.md +163 -0
  1000. templates/meta/skills/claude-sdk-integration/assets/sdk-checklist.md +27 -0
  1001. templates/meta/skills/claude-sdk-integration/scripts/check_model_ids.py +97 -0
  1002. templates/meta/skills/graph-os-authoring/SKILL.md +278 -0
  1003. templates/meta/skills/graph-os-authoring/assets/graph-os-checklist.md +25 -0
  1004. templates/meta/skills/graph-os-authoring/scripts/new_extractor.py +76 -0
  1005. templates/meta/skills/hook-authoring/SKILL.md +292 -0
  1006. templates/meta/skills/hook-authoring/assets/hook-checklist.md +30 -0
  1007. templates/meta/skills/hook-authoring/scripts/new_hook.sh +75 -0
  1008. templates/meta/skills/mcp-tool-authoring/SKILL.md +301 -0
  1009. templates/meta/skills/mcp-tool-authoring/assets/mcp-tool-checklist.md +29 -0
  1010. templates/meta/skills/mcp-tool-authoring/scripts/new_tool.py +74 -0
  1011. templates/meta/skills/meta-engineering/SKILL.md +151 -0
  1012. templates/meta/skills/meta-engineering/assets/meta-edit-checklist.md +28 -0
  1013. templates/meta/skills/meta-engineering/scripts/which_layer.py +61 -0
  1014. templates/meta/skills/python-meta-server/SKILL.md +162 -0
  1015. templates/meta/skills/python-meta-server/assets/meta-server-checklist.md +28 -0
  1016. templates/meta/skills/python-meta-server/scripts/check_envelope.py +91 -0
  1017. templates/meta/skills/react-vite-hub/SKILL.md +140 -0
  1018. templates/meta/skills/react-vite-hub/assets/hub-ui-checklist.md +23 -0
  1019. templates/meta/skills/react-vite-hub/scripts/check_vite_env.py +73 -0
  1020. templates/meta/stack.yaml +119 -0
  1021. templates/nestjs/rules/backend.md +20 -0
  1022. templates/nestjs/scaffold/docs/engineering/nestjs-rules.md +33 -0
  1023. templates/nestjs/scaffold/docs/playbooks/nestjs-service.md +39 -0
  1024. templates/nestjs/scaffold/src/backend/nest-cli.json +5 -0
  1025. templates/nestjs/scaffold/src/backend/package.json +28 -0
  1026. templates/nestjs/scaffold/src/backend/src/app.module.ts +9 -0
  1027. templates/nestjs/scaffold/src/backend/src/common/all-exceptions.filter.ts +59 -0
  1028. templates/nestjs/scaffold/src/backend/src/health/health.controller.ts +14 -0
  1029. templates/nestjs/scaffold/src/backend/src/health/health.module.ts +10 -0
  1030. templates/nestjs/scaffold/src/backend/src/health/health.service.spec.ts +21 -0
  1031. templates/nestjs/scaffold/src/backend/src/health/health.service.ts +9 -0
  1032. templates/nestjs/scaffold/src/backend/src/main.ts +26 -0
  1033. templates/nestjs/scaffold/src/backend/tsconfig.json +16 -0
  1034. templates/nestjs/scaffold/src/backend/vitest.config.ts +9 -0
  1035. templates/nestjs/scaffold-boundary.yaml +25 -0
  1036. templates/nestjs/skills/nestjs/SKILL.md +67 -0
  1037. templates/nestjs/skills/nestjs/references/anatomy.md +65 -0
  1038. templates/nestjs/stack.yaml +68 -0
  1039. templates/nextjs/rules/frontend.md +18 -0
  1040. templates/nextjs/scaffold/docs/design/00-index.md +23 -0
  1041. templates/nextjs/scaffold/docs/design/colors-tokens.md +141 -0
  1042. templates/nextjs/scaffold/docs/design/components-patterns.md +159 -0
  1043. templates/nextjs/scaffold/docs/design/motion-accessibility.md +137 -0
  1044. templates/nextjs/scaffold/docs/design/typography-spacing.md +107 -0
  1045. templates/nextjs/scaffold/docs/engineering/accessibility-web.md +56 -0
  1046. templates/nextjs/scaffold/docs/engineering/copywriting-standard.md +102 -0
  1047. templates/nextjs/scaffold/docs/engineering/formatting-rules.md +89 -0
  1048. templates/nextjs/scaffold/docs/engineering/frontend-rendering-rules.md +80 -0
  1049. templates/nextjs/scaffold/docs/engineering/frontend-rules.md +183 -0
  1050. templates/nextjs/scaffold/docs/engineering/i18n-policy.md +99 -0
  1051. templates/nextjs/scaffold/docs/pages-content-spec/00-index.md +78 -0
  1052. templates/nextjs/scaffold/docs/playbooks/content-seo.md +55 -0
  1053. templates/nextjs/scaffold/docs/playbooks/docs-governance.md +51 -0
  1054. templates/nextjs/scaffold/docs/playbooks/frontend-ui.md +63 -0
  1055. templates/nextjs/scaffold/src/frontend/app/layout.tsx +14 -0
  1056. templates/nextjs/scaffold/src/frontend/app/page.tsx +3 -0
  1057. templates/nextjs/scaffold/src/frontend/eslint.config.js +17 -0
  1058. templates/nextjs/scaffold/src/frontend/lib/greeting.test.ts +9 -0
  1059. templates/nextjs/scaffold/src/frontend/lib/greeting.ts +3 -0
  1060. templates/nextjs/scaffold/src/frontend/package.json +28 -0
  1061. templates/nextjs/scaffold/src/frontend/tsconfig.json +18 -0
  1062. templates/nextjs/scaffold/src/frontend/vitest.config.ts +10 -0
  1063. templates/nextjs/scaffold-boundary.yaml +30 -0
  1064. templates/nextjs/skills/nextjs-react/SKILL.md +485 -0
  1065. templates/nextjs/skills/nextjs-react/references/anatomy.md +116 -0
  1066. templates/nextjs/skills/nextjs-react/scripts/new_component.py +72 -0
  1067. templates/nextjs/stack.yaml +81 -0
  1068. templates/node-express/rules/backend.md +20 -0
  1069. templates/node-express/scaffold/docs/engineering/express-rules.md +30 -0
  1070. templates/node-express/scaffold/docs/playbooks/express-service.md +35 -0
  1071. templates/node-express/scaffold/src/backend/package.json +24 -0
  1072. templates/node-express/scaffold/src/backend/src/index.ts +17 -0
  1073. templates/node-express/scaffold/src/backend/src/middleware/error-handler.ts +12 -0
  1074. templates/node-express/scaffold/src/backend/src/routes/health.test.ts +33 -0
  1075. templates/node-express/scaffold/src/backend/src/routes/health.ts +7 -0
  1076. templates/node-express/scaffold/src/backend/tsconfig.json +15 -0
  1077. templates/node-express/scaffold/src/backend/types/express-bootstrap.d.ts +21 -0
  1078. templates/node-express/scaffold-boundary.yaml +25 -0
  1079. templates/node-express/skills/node-express/SKILL.md +70 -0
  1080. templates/node-express/skills/node-express/references/anatomy.md +63 -0
  1081. templates/node-express/stack.yaml +63 -0
  1082. templates/python/scaffold/docs/engineering/python-rules.md +27 -0
  1083. templates/python/scaffold/docs/playbooks/python-library.md +35 -0
  1084. templates/python/stack.yaml +60 -0
  1085. templates/rails/rules/backend.md +10 -0
  1086. templates/rails/scaffold/docs/engineering/rails-rules.md +33 -0
  1087. templates/rails/scaffold/docs/playbooks/rails-service.md +42 -0
  1088. templates/rails/scaffold/src/backend/Gemfile +12 -0
  1089. templates/rails/scaffold/src/backend/app/controllers/application_controller.rb +26 -0
  1090. templates/rails/scaffold/src/backend/app/controllers/health_controller.rb +6 -0
  1091. templates/rails/scaffold/src/backend/app/models/health.rb +6 -0
  1092. templates/rails/scaffold/src/backend/config/application.rb +12 -0
  1093. templates/rails/scaffold/src/backend/config/boot.rb +3 -0
  1094. templates/rails/scaffold/src/backend/config/routes.rb +4 -0
  1095. templates/rails/scaffold/src/backend/config.ru +5 -0
  1096. templates/rails/scaffold/src/backend/spec/rails_helper.rb +18 -0
  1097. templates/rails/scaffold/src/backend/spec/requests/health_spec.rb +24 -0
  1098. templates/rails/scaffold-boundary.yaml +25 -0
  1099. templates/rails/skills/rails/SKILL.md +62 -0
  1100. templates/rails/skills/rails/references/anatomy.md +71 -0
  1101. templates/rails/stack.yaml +72 -0
  1102. templates/react-native/rules/mobile.md +26 -0
  1103. templates/react-native/scaffold/docs/engineering/accessibility-mobile.md +95 -0
  1104. templates/react-native/scaffold/docs/engineering/mobile-rules.md +56 -0
  1105. templates/react-native/scaffold/docs/engineering/offline-first.md +61 -0
  1106. templates/react-native/scaffold/docs/playbooks/mobile-app.md +49 -0
  1107. templates/react-native/scaffold/src/mobile/App.tsx +9 -0
  1108. templates/react-native/scaffold/src/mobile/eslint.config.js +17 -0
  1109. templates/react-native/scaffold/src/mobile/package.json +23 -0
  1110. templates/react-native/scaffold/src/mobile/src/greeting.test.ts +9 -0
  1111. templates/react-native/scaffold/src/mobile/src/greeting.ts +3 -0
  1112. templates/react-native/scaffold/src/mobile/tsconfig.json +17 -0
  1113. templates/react-native/scaffold/src/mobile/vitest.config.ts +10 -0
  1114. templates/react-native/scaffold-boundary.yaml +30 -0
  1115. templates/react-native/skills/react-native-mobile/SKILL.md +119 -0
  1116. templates/react-native/skills/react-native-mobile/assets/rn-mobile-checklist.md +28 -0
  1117. templates/react-native/skills/react-native-mobile/references/anatomy.md +140 -0
  1118. templates/react-native/skills/react-native-mobile/references/rn-2026-practices.md +54 -0
  1119. templates/react-native/skills/react-native-mobile/scripts/new_screen.py +73 -0
  1120. templates/react-native/skills/react-native-mobile/versions.json +16 -0
  1121. templates/react-native/skills/react-native-patterns/SKILL.md +512 -0
  1122. templates/react-native/skills/react-native-patterns/assets/rn-review-checklist.md +26 -0
  1123. templates/react-native/skills/react-native-patterns/references/anatomy.md +62 -0
  1124. templates/react-native/skills/react-native-patterns/references/list-performance.md +70 -0
  1125. templates/react-native/skills/react-native-patterns/scripts/scan_rn_perf.py +77 -0
  1126. templates/react-native/stack.yaml +70 -0
  1127. templates/ruby-plain/scaffold/src/backend/Gemfile +8 -0
  1128. templates/ruby-plain/scaffold/src/backend/main.rb +3 -0
  1129. templates/ruby-plain/scaffold-boundary.yaml +23 -0
  1130. templates/ruby-plain/stack.yaml +50 -0
  1131. templates/rust-axum/rules/backend.md +20 -0
  1132. templates/rust-axum/scaffold/docs/engineering/rust-axum-rules.md +35 -0
  1133. templates/rust-axum/scaffold/docs/playbooks/rust-axum-service.md +43 -0
  1134. templates/rust-axum/scaffold/src/backend/Cargo.toml +20 -0
  1135. templates/rust-axum/scaffold/src/backend/src/app.rs +12 -0
  1136. templates/rust-axum/scaffold/src/backend/src/error.rs +48 -0
  1137. templates/rust-axum/scaffold/src/backend/src/main.rs +24 -0
  1138. templates/rust-axum/scaffold/src/backend/src/routes/health.rs +37 -0
  1139. templates/rust-axum/scaffold/src/backend/src/routes/mod.rs +2 -0
  1140. templates/rust-axum/scaffold-boundary.yaml +25 -0
  1141. templates/rust-axum/skills/rust/SKILL.md +73 -0
  1142. templates/rust-axum/skills/rust/references/anatomy.md +63 -0
  1143. templates/rust-axum/stack.yaml +65 -0
  1144. templates/rust-plain/scaffold/src/backend/Cargo.toml +6 -0
  1145. templates/rust-plain/scaffold/src/backend/src/main.rs +3 -0
  1146. templates/rust-plain/scaffold-boundary.yaml +23 -0
  1147. templates/rust-plain/stack.yaml +51 -0
  1148. templates/spring-boot/rules/backend.md +20 -0
  1149. templates/spring-boot/scaffold/docs/engineering/spring-boot-rules.md +35 -0
  1150. templates/spring-boot/scaffold/docs/playbooks/spring-boot-service.md +45 -0
  1151. templates/spring-boot/scaffold/src/backend/mvnw +302 -0
  1152. templates/spring-boot/scaffold/src/backend/pom.xml +69 -0
  1153. templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/Application.java +16 -0
  1154. templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/common/GlobalExceptionHandler.java +31 -0
  1155. templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthController.java +22 -0
  1156. templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthService.java +12 -0
  1157. templates/spring-boot/scaffold/src/backend/src/main/java/com/example/app/health/HealthStatus.java +4 -0
  1158. templates/spring-boot/scaffold/src/backend/src/test/java/com/example/app/health/HealthServiceTest.java +15 -0
  1159. templates/spring-boot/scaffold-boundary.yaml +26 -0
  1160. templates/spring-boot/skills/spring-boot/SKILL.md +84 -0
  1161. templates/spring-boot/skills/spring-boot/references/anatomy.md +63 -0
  1162. templates/spring-boot/stack.yaml +65 -0
  1163. templates/svelte-sveltekit/rules/frontend.md +20 -0
  1164. templates/svelte-sveltekit/scaffold/docs/engineering/svelte-sveltekit-rules.md +37 -0
  1165. templates/svelte-sveltekit/scaffold/docs/playbooks/svelte-sveltekit-app.md +36 -0
  1166. templates/svelte-sveltekit/scaffold/src/frontend/package.json +22 -0
  1167. templates/svelte-sveltekit/scaffold/src/frontend/src/app.html +12 -0
  1168. templates/svelte-sveltekit/scaffold/src/frontend/src/hooks.server.ts +14 -0
  1169. templates/svelte-sveltekit/scaffold/src/frontend/src/lib/components/Greeting.svelte +6 -0
  1170. templates/svelte-sveltekit/scaffold/src/frontend/src/lib/stores/count.test.ts +26 -0
  1171. templates/svelte-sveltekit/scaffold/src/frontend/src/lib/stores/count.ts +4 -0
  1172. templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+layout.svelte +24 -0
  1173. templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+page.svelte +9 -0
  1174. templates/svelte-sveltekit/scaffold/src/frontend/src/routes/+page.ts +7 -0
  1175. templates/svelte-sveltekit/scaffold/src/frontend/src/routes/health/+server.ts +7 -0
  1176. templates/svelte-sveltekit/scaffold/src/frontend/svelte.config.js +10 -0
  1177. templates/svelte-sveltekit/scaffold/src/frontend/tsconfig.json +7 -0
  1178. templates/svelte-sveltekit/scaffold/src/frontend/vite.config.ts +7 -0
  1179. templates/svelte-sveltekit/scaffold/src/frontend/vitest.config.ts +11 -0
  1180. templates/svelte-sveltekit/scaffold-boundary.yaml +29 -0
  1181. templates/svelte-sveltekit/skills/svelte/SKILL.md +90 -0
  1182. templates/svelte-sveltekit/skills/svelte/references/anatomy.md +62 -0
  1183. templates/svelte-sveltekit/stack.yaml +70 -0
  1184. templates/typescript-plain/scaffold/src/index.ts +3 -0
  1185. templates/typescript-plain/scaffold/tsconfig.json +13 -0
  1186. templates/typescript-plain/scaffold-boundary.yaml +22 -0
  1187. templates/typescript-plain/stack.yaml +44 -0
  1188. templates/vue-nuxt/rules/frontend.md +19 -0
  1189. templates/vue-nuxt/scaffold/docs/engineering/nuxt-rules.md +30 -0
  1190. templates/vue-nuxt/scaffold/docs/playbooks/nuxt-app.md +29 -0
  1191. templates/vue-nuxt/scaffold/src/frontend/app.vue +3 -0
  1192. templates/vue-nuxt/scaffold/src/frontend/nuxt.config.ts +11 -0
  1193. templates/vue-nuxt/scaffold/src/frontend/package.json +20 -0
  1194. templates/vue-nuxt/scaffold/src/frontend/pages/index.test.ts +19 -0
  1195. templates/vue-nuxt/scaffold/src/frontend/pages/index.vue +11 -0
  1196. templates/vue-nuxt/scaffold/src/frontend/vitest.config.ts +12 -0
  1197. templates/vue-nuxt/scaffold-boundary.yaml +26 -0
  1198. templates/vue-nuxt/skills/vue-nuxt/SKILL.md +57 -0
  1199. templates/vue-nuxt/skills/vue-nuxt/references/anatomy.md +60 -0
  1200. templates/vue-nuxt/stack.yaml +61 -0
  1201. templates/wordpress/rules/backend.md +19 -0
  1202. templates/wordpress/scaffold/docs/engineering/wordpress-rules.md +28 -0
  1203. templates/wordpress/scaffold/docs/playbooks/wordpress-service.md +29 -0
  1204. templates/wordpress/scaffold/src/backend/composer.json +17 -0
  1205. templates/wordpress/scaffold/src/backend/phpcs.xml.dist +11 -0
  1206. templates/wordpress/scaffold/src/backend/phpunit.xml +10 -0
  1207. templates/wordpress/scaffold/src/backend/plugin/inc/health.php +8 -0
  1208. templates/wordpress/scaffold/src/backend/plugin/plugin.php +28 -0
  1209. templates/wordpress/scaffold/src/backend/tests/HealthStatusTest.php +15 -0
  1210. templates/wordpress/scaffold/src/backend/theme/functions.php +18 -0
  1211. templates/wordpress/scaffold/src/backend/theme/style.css +11 -0
  1212. templates/wordpress/scaffold-boundary.yaml +23 -0
  1213. templates/wordpress/skills/wordpress/SKILL.md +110 -0
  1214. templates/wordpress/skills/wordpress/assets/wp-checklist.md +28 -0
  1215. templates/wordpress/skills/wordpress/references/wp-development.md +75 -0
  1216. templates/wordpress/skills/wordpress/references/wp-security.md +68 -0
  1217. templates/wordpress/skills/wordpress/scripts/scan_wp_smells.py +91 -0
  1218. templates/wordpress/skills/wordpress/versions.json +16 -0
  1219. templates/wordpress/stack.yaml +60 -0
  1220. thinking_os/__init__.py +1 -0
  1221. thinking_os/_agent_markers.py +32 -0
  1222. thinking_os/background.py +405 -0
  1223. thinking_os/bootstrap_outcomes.py +200 -0
  1224. thinking_os/budget.py +302 -0
  1225. thinking_os/capture.py +495 -0
  1226. thinking_os/cognition.py +516 -0
  1227. thinking_os/cognition_schemas.py +517 -0
  1228. thinking_os/compress.py +192 -0
  1229. thinking_os/concepts.py +233 -0
  1230. thinking_os/dashboard.py +159 -0
  1231. thinking_os/database.py +2883 -0
  1232. thinking_os/decay.py +393 -0
  1233. thinking_os/digest.py +295 -0
  1234. thinking_os/dispatcher.py +192 -0
  1235. thinking_os/dispatcher_helpers.py +48 -0
  1236. thinking_os/dispatchers/__init__.py +3 -0
  1237. thinking_os/dispatchers/default.py +47 -0
  1238. thinking_os/distill.py +192 -0
  1239. thinking_os/doc_indexer.py +905 -0
  1240. thinking_os/embeddings.py +943 -0
  1241. thinking_os/formula_composer.py +556 -0
  1242. thinking_os/gate_marker.py +75 -0
  1243. thinking_os/graph.py +296 -0
  1244. thinking_os/graph_indexer.py +360 -0
  1245. thinking_os/health_check.py +517 -0
  1246. thinking_os/impact.py +119 -0
  1247. thinking_os/memory_gc.py +356 -0
  1248. thinking_os/migrator_embeddings.py +318 -0
  1249. thinking_os/precision.py +194 -0
  1250. thinking_os/record_outcome.py +399 -0
  1251. thinking_os/repair.py +105 -0
  1252. thinking_os/retrieval_quality.py +239 -0
  1253. thinking_os/roles_state.py +168 -0
  1254. thinking_os/sanitizer.py +320 -0
  1255. thinking_os/server.py +3160 -0
  1256. thinking_os/session_enrich.py +272 -0
  1257. thinking_os/session_observe_worker.py +111 -0
  1258. thinking_os/session_startup.py +74 -0
  1259. thinking_os/session_summary.py +245 -0
  1260. thinking_os/task_analyzer.py +462 -0
  1261. thinking_os/task_parser.py +342 -0
  1262. thinking_os/task_sync.py +73 -0
  1263. thinking_os/tools/__init__.py +6 -0
  1264. thinking_os/tools/_shared.py +947 -0
  1265. thinking_os/tools/cognition.py +1867 -0
  1266. thinking_os/tools/docs.py +770 -0
  1267. thinking_os/tools/learning.py +2078 -0
  1268. thinking_os/tools/logs.py +79 -0
  1269. thinking_os/tools/memory.py +840 -0
  1270. thinking_os/tools/metrics.py +200 -0
  1271. thinking_os/tools/retrieve.py +415 -0
  1272. thinking_os/tools/routing.py +658 -0
  1273. thinking_os/tools/tasks.py +449 -0
  1274. thinking_os/tools/trajectory.py +181 -0
  1275. thinking_os/tracing.py +235 -0
  1276. web/__init__.py +5 -0
  1277. web/_cache.py +118 -0
  1278. web/_deps.py +56 -0
  1279. web/_envelope.py +85 -0
  1280. web/_project_context.py +140 -0
  1281. web/chat_providers.py +108 -0
  1282. web/init_jobs.py +216 -0
  1283. web/routes/__init__.py +25 -0
  1284. web/routes/_bounded_read.py +76 -0
  1285. web/routes/board.py +1089 -0
  1286. web/routes/cognition.py +1838 -0
  1287. web/routes/config.py +635 -0
  1288. web/routes/graph.py +513 -0
  1289. web/routes/health.py +180 -0
  1290. web/routes/hooks.py +288 -0
  1291. web/routes/hub.py +1219 -0
  1292. web/routes/logs.py +374 -0
  1293. web/routes/metrics.py +43 -0
  1294. web/routes/observability.py +400 -0
  1295. web/routes/patterns.py +227 -0
  1296. web/routes/presence.py +609 -0
  1297. web/routes/roles.py +446 -0
  1298. web/routes/scheduled.py +261 -0
  1299. web/routes/search.py +238 -0
  1300. web/routes/sessions.py +220 -0
  1301. web/routes/settings.py +363 -0
  1302. web/routes/stream.py +547 -0
  1303. web/security.py +157 -0
  1304. 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