@moretea-labs/forge 1.5.0-rc.1

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 (903) hide show
  1. package/AGENTS.md +120 -0
  2. package/CHANGELOG.md +36 -0
  3. package/CLAUDE.md +120 -0
  4. package/CODE_OF_CONDUCT.md +23 -0
  5. package/CONTRIBUTING.md +77 -0
  6. package/LICENSE +22 -0
  7. package/NOTICE +9 -0
  8. package/README.en.md +5 -0
  9. package/README.es.md +12 -0
  10. package/README.fr.md +12 -0
  11. package/README.ja.md +12 -0
  12. package/README.md +132 -0
  13. package/README.zh-CN.md +84 -0
  14. package/SECURITY.md +50 -0
  15. package/SKILL.md +431 -0
  16. package/SUPPORT.md +31 -0
  17. package/THIRD_PARTY_NOTICES.md +18 -0
  18. package/agents/openai.yaml +4 -0
  19. package/assets/AGENTS.md +68 -0
  20. package/assets/CLAUDE.md +68 -0
  21. package/assets/branding/README.md +10 -0
  22. package/assets/branding/forge-controller-flow.mmd +8 -0
  23. package/assets/hooks/AGENTS.md +75 -0
  24. package/assets/hooks/CLAUDE.md +75 -0
  25. package/assets/hooks/anti-simplification.sh +12 -0
  26. package/assets/hooks/changelog-guard.sh +80 -0
  27. package/assets/hooks/codex.hooks.template.json +60 -0
  28. package/assets/hooks/first-principles-guard.sh +72 -0
  29. package/assets/hooks/hook-input.sh +618 -0
  30. package/assets/hooks/lib/session-state.sh +106 -0
  31. package/assets/hooks/lib/workflow-state.sh +1730 -0
  32. package/assets/hooks/post-bash.sh +215 -0
  33. package/assets/hooks/post-edit-guard.sh +256 -0
  34. package/assets/hooks/post-tool-observer.sh +99 -0
  35. package/assets/hooks/pre-edit-guard.sh +240 -0
  36. package/assets/hooks/prompt-guard.sh +1077 -0
  37. package/assets/hooks/run-hook.sh +67 -0
  38. package/assets/hooks/security-sentinel.sh +115 -0
  39. package/assets/hooks/session-start-context.sh +593 -0
  40. package/assets/hooks/settings.template.json +60 -0
  41. package/assets/hooks/stop-orchestrator.sh +171 -0
  42. package/assets/hooks/subagent-return-channel-guard.sh +107 -0
  43. package/assets/hooks/worktree-guard.sh +39 -0
  44. package/assets/initializer-question-pack.v1.json +132 -0
  45. package/assets/initializer-question-pack.v1.schema.json +46 -0
  46. package/assets/initializer-question-pack.v2.json +174 -0
  47. package/assets/initializer-question-pack.v3.json +206 -0
  48. package/assets/initializer-question-pack.v3.schema.json +92 -0
  49. package/assets/initializer-question-pack.v4.json +557 -0
  50. package/assets/initializer-question-pack.v4.schema.json +169 -0
  51. package/assets/partials/01-header.partial.md +10 -0
  52. package/assets/partials/02-iron-rules.partial.md +30 -0
  53. package/assets/partials/03-philosophy.partial.md +32 -0
  54. package/assets/partials/04-project-structure.partial.md +56 -0
  55. package/assets/partials/05-workflow.partial.md +79 -0
  56. package/assets/partials/06-cloudflare.partial.md +20 -0
  57. package/assets/partials/07-footer.partial.md +38 -0
  58. package/assets/partials/08-orchestration.partial.md +49 -0
  59. package/assets/partials/09-compact-instructions.partial.md +11 -0
  60. package/assets/partials/_assembly-order.md +40 -0
  61. package/assets/partials-agents/01-header.partial.md +8 -0
  62. package/assets/partials-agents/02-operating-mode.partial.md +44 -0
  63. package/assets/partials-agents/03-orchestration.partial.md +45 -0
  64. package/assets/partials-agents/04-task-protocol.partial.md +69 -0
  65. package/assets/partials-agents/05-coding-constraints.partial.md +20 -0
  66. package/assets/partials-agents/06-quality-safety.partial.md +23 -0
  67. package/assets/partials-agents/07-cloudflare.partial.md +9 -0
  68. package/assets/partials-agents/08-deep-docs.partial.md +32 -0
  69. package/assets/plan-map.json +301 -0
  70. package/assets/plugin-registry.v1.json +8 -0
  71. package/assets/project-structures/ai-native-collaborative-editor.txt +25 -0
  72. package/assets/project-structures/ai-native-product-copilot.txt +21 -0
  73. package/assets/project-structures/ai-native-runtime-console.txt +25 -0
  74. package/assets/project-structures/ai-native-sidecar-kernel.txt +19 -0
  75. package/assets/project-structures/astro-ssr.txt +25 -0
  76. package/assets/project-structures/expo-nativewind.txt +52 -0
  77. package/assets/project-structures/monorepo.txt +63 -0
  78. package/assets/project-structures/remix.txt +50 -0
  79. package/assets/project-structures/tanstack-start-workers.txt +51 -0
  80. package/assets/project-structures/vite-tanstack.txt +58 -0
  81. package/assets/reference-configs/AGENTS.md +13 -0
  82. package/assets/reference-configs/CLAUDE.md +13 -0
  83. package/assets/reference-configs/agentic-development-flow.md +94 -0
  84. package/assets/reference-configs/ai-workflows.md +14 -0
  85. package/assets/reference-configs/changelog-versioning.md +13 -0
  86. package/assets/reference-configs/coding-standards.md +14 -0
  87. package/assets/reference-configs/development-protocol.md +21 -0
  88. package/assets/reference-configs/document-generation.md +38 -0
  89. package/assets/reference-configs/evaluator-rubric.md +19 -0
  90. package/assets/reference-configs/external-tooling.md +374 -0
  91. package/assets/reference-configs/git-strategy.md +14 -0
  92. package/assets/reference-configs/global-working-rules.md +64 -0
  93. package/assets/reference-configs/handoff-protocol.md +38 -0
  94. package/assets/reference-configs/harness-overview.md +124 -0
  95. package/assets/reference-configs/heartbeat-triage.md +57 -0
  96. package/assets/reference-configs/hook-operations.md +96 -0
  97. package/assets/reference-configs/release-deploy.md +40 -0
  98. package/assets/reference-configs/spa-day-protocol.md +14 -0
  99. package/assets/reference-configs/sprint-contracts.md +89 -0
  100. package/assets/reference-configs/workflow-orchestration.md +14 -0
  101. package/assets/skill-hooks.json +41 -0
  102. package/assets/skill-version.json +189 -0
  103. package/assets/skills/claude-review/SKILL.md +231 -0
  104. package/assets/skills/codex-review/SKILL.md +103 -0
  105. package/assets/templates/AGENTS.md +13 -0
  106. package/assets/templates/CLAUDE.md +13 -0
  107. package/assets/templates/architecture.template.md +80 -0
  108. package/assets/templates/brief.template.md +38 -0
  109. package/assets/templates/contract.template.md +104 -0
  110. package/assets/templates/decisions.template.md +85 -0
  111. package/assets/templates/factor-factory/factor-backtest-report.template.md +36 -0
  112. package/assets/templates/factor-factory/factor-hypothesis.template.md +30 -0
  113. package/assets/templates/factor-factory/factor-registry.template.json +5 -0
  114. package/assets/templates/gitignore.template +53 -0
  115. package/assets/templates/guides/metro-esm-gotchas.template.md +46 -0
  116. package/assets/templates/helpers/architecture-event.ts +822 -0
  117. package/assets/templates/helpers/architecture-queue.sh +647 -0
  118. package/assets/templates/helpers/archive-architecture-request.sh +244 -0
  119. package/assets/templates/helpers/archive-workflow.sh +295 -0
  120. package/assets/templates/helpers/capability-config.ts +394 -0
  121. package/assets/templates/helpers/capability-resolver.ts +505 -0
  122. package/assets/templates/helpers/capture-plan.sh +335 -0
  123. package/assets/templates/helpers/check-agent-tooling.sh +1533 -0
  124. package/assets/templates/helpers/check-architecture-sync.sh +287 -0
  125. package/assets/templates/helpers/check-brain-manifest.sh +255 -0
  126. package/assets/templates/helpers/check-context-files.sh +49 -0
  127. package/assets/templates/helpers/check-deploy-sql-order.sh +117 -0
  128. package/assets/templates/helpers/check-skill-version.ts +193 -0
  129. package/assets/templates/helpers/check-task-sync.sh +65 -0
  130. package/assets/templates/helpers/check-task-workflow.sh +1002 -0
  131. package/assets/templates/helpers/codex-handoff-resume.sh +269 -0
  132. package/assets/templates/helpers/context-contract-sync.sh +516 -0
  133. package/assets/templates/helpers/contract-run.ts +465 -0
  134. package/assets/templates/helpers/contract-worktree.sh +725 -0
  135. package/assets/templates/helpers/ensure-task-workflow.sh +1218 -0
  136. package/assets/templates/helpers/harness-trace-grade.sh +150 -0
  137. package/assets/templates/helpers/heartbeat-triage.sh +361 -0
  138. package/assets/templates/helpers/inspect-project-state.ts +280 -0
  139. package/assets/templates/helpers/maintenance-triage.sh +167 -0
  140. package/assets/templates/helpers/migrate-project-template.sh +54 -0
  141. package/assets/templates/helpers/migrate-workflow-docs.ts +413 -0
  142. package/assets/templates/helpers/new-plan.sh +183 -0
  143. package/assets/templates/helpers/new-spec.sh +50 -0
  144. package/assets/templates/helpers/new-sprint.sh +49 -0
  145. package/assets/templates/helpers/plan-to-todo.sh +799 -0
  146. package/assets/templates/helpers/prepare-codex-handoff.sh +203 -0
  147. package/assets/templates/helpers/prepare-handoff.sh +81 -0
  148. package/assets/templates/helpers/refresh-current-status.sh +469 -0
  149. package/assets/templates/helpers/select-agent-context-blocks.sh +66 -0
  150. package/assets/templates/helpers/ship-worktrees.sh +561 -0
  151. package/assets/templates/helpers/sprint-backlog.sh +837 -0
  152. package/assets/templates/helpers/summarize-failures.sh +125 -0
  153. package/assets/templates/helpers/switch-plan.sh +153 -0
  154. package/assets/templates/helpers/sync-brain-docs.sh +381 -0
  155. package/assets/templates/helpers/verify-contract.sh +705 -0
  156. package/assets/templates/helpers/verify-sprint.sh +680 -0
  157. package/assets/templates/helpers/workflow-contract.ts +202 -0
  158. package/assets/templates/helpers/workstream-sync.sh +263 -0
  159. package/assets/templates/implementation-notes.template.md +37 -0
  160. package/assets/templates/packages.template.md +45 -0
  161. package/assets/templates/plan.template.md +77 -0
  162. package/assets/templates/prd.template.md +165 -0
  163. package/assets/templates/research.template.md +25 -0
  164. package/assets/templates/review.template.md +78 -0
  165. package/assets/templates/spec.template.md +31 -0
  166. package/assets/templates/sprint.template.md +69 -0
  167. package/assets/templates/tech-stack.template.md +57 -0
  168. package/assets/versions.json +77 -0
  169. package/assets/workflow-contract.v1.json +671 -0
  170. package/bin/forge-desktop-helper.mjs +204 -0
  171. package/bin/forge-hook.mjs +32 -0
  172. package/bin/forge-runtime-service.mjs +34 -0
  173. package/bin/forge-runtime.mjs +30 -0
  174. package/bin/forge.mjs +32 -0
  175. package/docs/CHANGELOG.md +978 -0
  176. package/docs/README.md +72 -0
  177. package/docs/README.zh-CN.md +58 -0
  178. package/docs/architecture/chatgpt-handoff-facade.md +393 -0
  179. package/docs/architecture/current/README.md +158 -0
  180. package/docs/architecture/current/approved-target-architecture.zh-CN.md +1501 -0
  181. package/docs/architecture/current/architecture-invariants.md +331 -0
  182. package/docs/architecture/current/automation-and-schedule-engine.md +453 -0
  183. package/docs/architecture/current/codegraph-context-provider.md +226 -0
  184. package/docs/architecture/current/control-plane-authority-inventory.md +82 -0
  185. package/docs/architecture/current/controller-repository-decoupling.md +148 -0
  186. package/docs/architecture/current/dispatch-and-agent-strategy.md +354 -0
  187. package/docs/architecture/current/entity-model.md +619 -0
  188. package/docs/architecture/current/external-plugin-governance.md +396 -0
  189. package/docs/architecture/current/failure-recovery.md +471 -0
  190. package/docs/architecture/current/governance.md +213 -0
  191. package/docs/architecture/current/human-interaction-plane.md +87 -0
  192. package/docs/architecture/current/implementation-status.md +128 -0
  193. package/docs/architecture/current/job-and-run-lifecycle.md +413 -0
  194. package/docs/architecture/current/local-workspace-target-grants.md +70 -0
  195. package/docs/architecture/current/migration-roadmap.md +105 -0
  196. package/docs/architecture/current/multi-repository-execution.md +371 -0
  197. package/docs/architecture/current/operations-runbook.md +45 -0
  198. package/docs/architecture/current/peer-supercontroller-runtime.md +32 -0
  199. package/docs/architecture/current/personal-assistant-plugin-baseline.md +207 -0
  200. package/docs/architecture/current/repository-access-modes.md +102 -0
  201. package/docs/architecture/current/route-policy.md +15 -0
  202. package/docs/architecture/current/route-session-concurrency.md +85 -0
  203. package/docs/architecture/current/runtime-architecture-simplification.md +214 -0
  204. package/docs/architecture/current/runtime-directory-map.md +49 -0
  205. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +85 -0
  206. package/docs/architecture/current/scheduler-and-resource-claims.md +432 -0
  207. package/docs/architecture/current/session-aware-execution-and-authorization.md +77 -0
  208. package/docs/architecture/current/system-overview.md +144 -0
  209. package/docs/architecture/current/target-requirements-traceability.md +202 -0
  210. package/docs/architecture/current/thin-harness-governance-policy.md +32 -0
  211. package/docs/architecture/current/thin-harness-v1.md +313 -0
  212. package/docs/architecture/current/verification-and-release-gates.md +391 -0
  213. package/docs/architecture/decisions/20260801-controller-home-sqlite-state.md +100 -0
  214. package/docs/architecture/decisions/20260803-canonical-skill-surface.md +40 -0
  215. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +53 -0
  216. package/docs/architecture/diagrams/.gitkeep +1 -0
  217. package/docs/architecture/diagrams/agentic-dev-plugin-architecture.html +186 -0
  218. package/docs/architecture/domains/.gitkeep +0 -0
  219. package/docs/architecture/domains/public-surface.md +30 -0
  220. package/docs/architecture/domains/runtime-harness.md +33 -0
  221. package/docs/architecture/domains/verification.md +33 -0
  222. package/docs/architecture/domains/workflow-engine.md +30 -0
  223. package/docs/architecture/global-hook-runtime.md +162 -0
  224. package/docs/architecture/history.md +38 -0
  225. package/docs/architecture/index.md +114 -0
  226. package/docs/architecture/ios-semantic-automation-provider-v2.md +166 -0
  227. package/docs/architecture/modules/.gitkeep +0 -0
  228. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +24 -0
  229. package/docs/architecture/requests/.gitkeep +1 -0
  230. package/docs/architecture/requests/archive/2026/20260528-154740-ai-hooks-ai-hooks-hook-input-sh.md +59 -0
  231. package/docs/architecture/requests/archive/2026/20260528-154816-assets-hooks-assets-hooks-hook-input-sh.md +59 -0
  232. package/docs/architecture/requests/archive/2026/20260528-161851-ai-harness-workflow-contract-json-ai-harness-workflow-contract-json.md +59 -0
  233. package/docs/architecture/requests/archive/2026/20260528-161853-scripts-check-task-workflow-sh-scripts-check-task-workflow-sh.md +59 -0
  234. package/docs/architecture/requests/archive/2026/20260528-161911-assets-workflow-contract-v1-json-assets-workflow-contract-v1-json.md +59 -0
  235. package/docs/architecture/requests/archive/2026/20260528-222416-ai-hooks-ai-hooks-hook-input-sh.md +59 -0
  236. package/docs/architecture/requests/archive/2026/20260528-222444-ai-hooks-ai-hooks-pre-edit-guard-sh.md +59 -0
  237. package/docs/architecture/requests/archive/2026/20260528-222457-ai-hooks-ai-hooks-pre-edit-guard-sh.md +59 -0
  238. package/docs/architecture/requests/archive/2026/20260528-222648-ai-hooks-ai-hooks-pre-edit-guard-sh.md +59 -0
  239. package/docs/architecture/requests/archive/2026/20260528-222705-ai-hooks-ai-hooks-worktree-guard-sh.md +59 -0
  240. package/docs/architecture/requests/archive/2026/20260528-222726-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
  241. package/docs/architecture/requests/archive/2026/20260528-222727-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
  242. package/docs/architecture/requests/archive/2026/20260528-224736-ai-hooks-ai-hooks-hook-input-sh.md +59 -0
  243. package/docs/architecture/requests/archive/2026/20260528-233259-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
  244. package/docs/architecture/requests/archive/2026/20260528-233335-assets-hooks-assets-hooks-prompt-guard-sh.md +59 -0
  245. package/docs/architecture/requests/archive/2026/20260528-233456-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
  246. package/docs/architecture/requests/archive/2026/20260528-233457-assets-hooks-assets-hooks-prompt-guard-sh.md +59 -0
  247. package/docs/architecture/requests/archive/2026/20260528-233637-ai-hooks-ai-hooks-prompt-guard-sh.md +59 -0
  248. package/docs/architecture/requests/archive/2026/20260528-233638-assets-hooks-assets-hooks-prompt-guard-sh.md +59 -0
  249. package/docs/architecture/requests/archive/2026/20260529-000322-root-package-json.md +59 -0
  250. package/docs/architecture/requests/archive/2026/20260529-004238-ai-hooks-ai-hooks-lib-workflow-state-sh.md +59 -0
  251. package/docs/architecture/requests/archive/2026/20260529-020654-ai-harness-policy-json-ai-harness-policy-json.md +63 -0
  252. package/docs/architecture/requests/archive/2026/20260529-094236-ai-hooks-ai-hooks-prompt-guard-sh.md +60 -0
  253. package/docs/architecture/requests/archive/2026/20260529-094323-assets-hooks-assets-hooks-prompt-guard-sh.md +60 -0
  254. package/docs/architecture/requests/archive/2026/20260529-094331-ai-hooks-ai-hooks-prompt-guard-sh.md +60 -0
  255. package/docs/architecture/requests/archive/2026/20260529-094339-assets-hooks-assets-hooks-prompt-guard-sh.md +60 -0
  256. package/docs/architecture/requests/archive/2026/20260529-094430-assets-hooks-assets-hooks-session-start-context-sh.md +60 -0
  257. package/docs/architecture/requests/archive/2026/20260529-094446-ai-hooks-ai-hooks-session-start-context-sh.md +60 -0
  258. package/docs/architecture/requests/archive/2026/20260613-002040-runtime-harness-hook-adapters.md +68 -0
  259. package/docs/architecture/requests/archive/2026/root.md +68 -0
  260. package/docs/architecture/requests/archive/2026/runtime-harness-hook-adapters.md +76 -0
  261. package/docs/architecture/requests/archive/2026/verification-evals-checks.md +68 -0
  262. package/docs/architecture/requests/archive/2026/workflow-engine-contract-assets.md +69 -0
  263. package/docs/architecture/reviews/2026-07-11-access-surface-review.md +99 -0
  264. package/docs/architecture/snapshots/.gitkeep +1 -0
  265. package/docs/forge-autonomous-goal-loop.md +7 -0
  266. package/docs/forge-chatgpt-browser-engine.md +11 -0
  267. package/docs/forge-chatgpt-mcp-setup.md +239 -0
  268. package/docs/forge-chatgpt-supervised-automation.md +11 -0
  269. package/docs/forge-github-issue-launcher.md +7 -0
  270. package/docs/forge-plugin-management.md +95 -0
  271. package/docs/forge-provider-configuration.md +7 -0
  272. package/docs/forge-runtime-self-healing-loop.md +7 -0
  273. package/docs/images/forge-banner-cn.svg +1 -0
  274. package/docs/images/forge-banner.svg +1 -0
  275. package/docs/images/forge-controller-flow.svg +1 -0
  276. package/docs/images/image.png +0 -0
  277. package/docs/images/repo-harness-gptpro-cn.png +0 -0
  278. package/docs/images/repo-harness-gptpro.png +0 -0
  279. package/docs/images/repo-harness-hook-carrot.png +0 -0
  280. package/docs/operations/chatgpt-personal-assistant-runtime.md +83 -0
  281. package/docs/operations/checkout-route-integrity.md +22 -0
  282. package/docs/operations/controller-browser-plugin.md +299 -0
  283. package/docs/operations/controller-desktop-plugin.md +112 -0
  284. package/docs/operations/controller-performance-and-502.md +126 -0
  285. package/docs/operations/controller-reliability-runbook.md +134 -0
  286. package/docs/operations/environment-hardening.md +50 -0
  287. package/docs/operations/features.md +45 -0
  288. package/docs/operations/features.zh-CN.md +45 -0
  289. package/docs/operations/github-repository.md +60 -0
  290. package/docs/operations/gmail-assistant-routines.md +186 -0
  291. package/docs/operations/homebrew.md +26 -0
  292. package/docs/operations/local-system-assistant.md +46 -0
  293. package/docs/operations/local-system-assistant.zh-CN.md +46 -0
  294. package/docs/operations/mcp-tool-exposure.md +58 -0
  295. package/docs/operations/mobile-intents-shortcuts.md +117 -0
  296. package/docs/operations/open-source-release-hygiene.md +31 -0
  297. package/docs/operations/personal-assistant-operator-guide.md +61 -0
  298. package/docs/operations/platform-support.md +62 -0
  299. package/docs/operations/platform-support.zh-CN.md +61 -0
  300. package/docs/operations/provider-configuration.md +31 -0
  301. package/docs/operations/releasing.md +86 -0
  302. package/docs/operations/releasing.zh-CN.md +86 -0
  303. package/docs/operations/route-session-concurrency-baseline.json +893 -0
  304. package/docs/operations/route-session-concurrency-baseline.md +94 -0
  305. package/docs/operations/runtime-performance-diagnostics.md +14 -0
  306. package/docs/operations/sqlite-control-plane-recovery.md +65 -0
  307. package/docs/operations/standalone-disaster-recovery.md +136 -0
  308. package/docs/operations/troubleshooting.md +72 -0
  309. package/docs/operations/troubleshooting.zh-CN.md +70 -0
  310. package/docs/public-usage-guide.md +33 -0
  311. package/docs/public-usage-guide.zh-CN.md +33 -0
  312. package/docs/tutorials/01-install-and-start.md +93 -0
  313. package/docs/tutorials/01-install-and-start.zh-CN.md +93 -0
  314. package/docs/tutorials/02-connect-chatgpt.md +82 -0
  315. package/docs/tutorials/02-connect-chatgpt.zh-CN.md +80 -0
  316. package/docs/tutorials/03-first-repository-task.md +57 -0
  317. package/docs/tutorials/03-first-repository-task.zh-CN.md +57 -0
  318. package/docs/tutorials/README.md +13 -0
  319. package/docs/tutorials/README.zh-CN.md +13 -0
  320. package/docs/wiki/Architecture.md +85 -0
  321. package/docs/wiki/Core-Concepts.md +27 -0
  322. package/docs/wiki/Home.md +36 -0
  323. package/docs/wiki/Implementation.md +172 -0
  324. package/docs/wiki/Installation.md +50 -0
  325. package/docs/wiki/Integrations.md +29 -0
  326. package/docs/wiki/Operations.md +26 -0
  327. package/docs/wiki/Quick-Start.md +46 -0
  328. package/docs/wiki/Releases-and-Upgrades.md +34 -0
  329. package/docs/wiki/Runtime-Architecture.md +50 -0
  330. package/docs/wiki/Security-Model.md +31 -0
  331. package/docs/wiki/Troubleshooting.md +38 -0
  332. package/docs/wiki/Work-Lifecycle.md +31 -0
  333. package/docs/wiki/_Sidebar.md +21 -0
  334. package/install.ps1 +48 -0
  335. package/install.sh +66 -0
  336. package/package.json +156 -0
  337. package/scripts/activate-source-baseline.ts +335 -0
  338. package/scripts/architecture-event.ts +822 -0
  339. package/scripts/architecture-queue.sh +647 -0
  340. package/scripts/archive-architecture-request.sh +244 -0
  341. package/scripts/archive-workflow.sh +295 -0
  342. package/scripts/assemble-template.ts +1172 -0
  343. package/scripts/benchmark-controller-hotpath.ts +212 -0
  344. package/scripts/benchmark-controller-round2.ts +139 -0
  345. package/scripts/benchmark-ios-agent-device.ts +514 -0
  346. package/scripts/benchmark-route-session-concurrency.ts +714 -0
  347. package/scripts/benchmark-thin-harness-gateway-ab.ts +632 -0
  348. package/scripts/benchmark-thin-harness-mcp-e2e.ts +479 -0
  349. package/scripts/benchmark-thin-harness.ts +251 -0
  350. package/scripts/bootstrap-runtime-maintenance-recovery.sh +183 -0
  351. package/scripts/canary-global-hook.sh +263 -0
  352. package/scripts/capability-config.ts +394 -0
  353. package/scripts/capability-resolver.ts +505 -0
  354. package/scripts/capture-plan.sh +335 -0
  355. package/scripts/check-agent-tooling.sh +1549 -0
  356. package/scripts/check-architecture-sync.sh +373 -0
  357. package/scripts/check-brain-manifest.sh +255 -0
  358. package/scripts/check-ci.sh +16 -0
  359. package/scripts/check-context-files.sh +49 -0
  360. package/scripts/check-deploy-sql-order.sh +117 -0
  361. package/scripts/check-mcp-compatibility.ts +93 -0
  362. package/scripts/check-npm-release.sh +32 -0
  363. package/scripts/check-open-source-tracked-surface.sh +146 -0
  364. package/scripts/check-package-identity.mjs +117 -0
  365. package/scripts/check-platform-support.mjs +79 -0
  366. package/scripts/check-public-docs.sh +105 -0
  367. package/scripts/check-public-release-surface.sh +19 -0
  368. package/scripts/check-release-published.sh +57 -0
  369. package/scripts/check-release-readiness.sh +43 -0
  370. package/scripts/check-release-version.mjs +74 -0
  371. package/scripts/check-runtime-architecture.mjs +593 -0
  372. package/scripts/check-runtime-env.mjs +89 -0
  373. package/scripts/check-skill-version.ts +193 -0
  374. package/scripts/check-tarball-install-smoke.sh +66 -0
  375. package/scripts/check-task-sync.sh +65 -0
  376. package/scripts/check-task-workflow.sh +1002 -0
  377. package/scripts/check-third-party-notices.mjs +36 -0
  378. package/scripts/codex-handoff-resume.sh +269 -0
  379. package/scripts/complete-control-plane-cutover.ts +126 -0
  380. package/scripts/context-contract-sync.sh +516 -0
  381. package/scripts/contract-run.ts +465 -0
  382. package/scripts/contract-worktree.sh +725 -0
  383. package/scripts/controller-ngrok-rotation.sh +678 -0
  384. package/scripts/create-project-dirs.sh +282 -0
  385. package/scripts/ensure-codegraph.sh +16 -0
  386. package/scripts/ensure-task-workflow.sh +1218 -0
  387. package/scripts/export-requirement-portfolio.ts +28 -0
  388. package/scripts/factor-lab-check.sh +73 -0
  389. package/scripts/factor-lab-new.sh +96 -0
  390. package/scripts/factor-lab-promote.sh +86 -0
  391. package/scripts/factor-lab-reject.sh +68 -0
  392. package/scripts/harness-trace-grade.sh +150 -0
  393. package/scripts/heartbeat-triage.sh +361 -0
  394. package/scripts/hook-dispatch-diet-report.ts +234 -0
  395. package/scripts/hook-shim.sh +93 -0
  396. package/scripts/init-project.sh +505 -0
  397. package/scripts/initializer-question-pack.ts +200 -0
  398. package/scripts/inspect-project-state.ts +280 -0
  399. package/scripts/install-desktop-operator-registration.ts +45 -0
  400. package/scripts/install-standalone-recovery.ts +74 -0
  401. package/scripts/lib/AGENTS.md +13 -0
  402. package/scripts/lib/CLAUDE.md +13 -0
  403. package/scripts/lib/controller-home-env.sh +69 -0
  404. package/scripts/lib/project-init-lib.sh +2759 -0
  405. package/scripts/load-standalone-recovery.sh +17 -0
  406. package/scripts/loop-engine-cutover-gate.ts +324 -0
  407. package/scripts/maintenance-triage.sh +167 -0
  408. package/scripts/migrate-project-template.sh +1189 -0
  409. package/scripts/migrate-requirement-portfolio.ts +86 -0
  410. package/scripts/migrate-workflow-docs.ts +413 -0
  411. package/scripts/new-plan.sh +183 -0
  412. package/scripts/new-spec.sh +50 -0
  413. package/scripts/new-sprint.sh +49 -0
  414. package/scripts/open-source-audit-allowlist.txt +46 -0
  415. package/scripts/package-source-archive.sh +147 -0
  416. package/scripts/plan-to-todo.sh +799 -0
  417. package/scripts/prepare-codex-handoff.sh +203 -0
  418. package/scripts/prepare-handoff.sh +81 -0
  419. package/scripts/public-release-files.txt +39 -0
  420. package/scripts/public-release.ts +174 -0
  421. package/scripts/publish-release-tarball.sh +27 -0
  422. package/scripts/refresh-current-status.sh +469 -0
  423. package/scripts/refresh-ios-physical-runtime.ts +196 -0
  424. package/scripts/repair-executable-modes.ts +8 -0
  425. package/scripts/rollout-all-registered-repos.sh +7 -0
  426. package/scripts/route-nl-vs-ts-eval.ts +679 -0
  427. package/scripts/run-bun-test-file.ts +182 -0
  428. package/scripts/run-governed-gate.ts +140 -0
  429. package/scripts/run-mobile-monitor-bridge.ts +71 -0
  430. package/scripts/run-skill-evals.ts +1022 -0
  431. package/scripts/run-skill-hook.ts +244 -0
  432. package/scripts/run-supervised-command.ts +24 -0
  433. package/scripts/run-tests-portable.sh +20 -0
  434. package/scripts/select-agent-context-blocks.sh +66 -0
  435. package/scripts/setup-plugins.sh +43 -0
  436. package/scripts/ship-worktrees.sh +561 -0
  437. package/scripts/smoke-browser-cdp-bridge.ts +93 -0
  438. package/scripts/smoke-chatgpt-supervised-automation.ts +208 -0
  439. package/scripts/smoke-ios-physical-device.ts +114 -0
  440. package/scripts/smoke-mcp-http-runtime.ts +216 -0
  441. package/scripts/smoke-mcp-tool-surface.ts +117 -0
  442. package/scripts/smoke-runtime-recovery.ts +220 -0
  443. package/scripts/smoke-schedule-engine.ts +283 -0
  444. package/scripts/sprint-backlog.sh +837 -0
  445. package/scripts/stage-runtime-release.ts +38 -0
  446. package/scripts/summarize-failures.sh +125 -0
  447. package/scripts/switch-plan.sh +153 -0
  448. package/scripts/sync-brain-docs.sh +381 -0
  449. package/scripts/sync-codex-installed-copies.sh +183 -0
  450. package/scripts/test-governance.ts +75 -0
  451. package/scripts/verify-contract.sh +705 -0
  452. package/scripts/verify-forge-runtime.sh +31 -0
  453. package/scripts/verify-sprint.sh +680 -0
  454. package/scripts/windows-paths.d.mts +7 -0
  455. package/scripts/windows-paths.mjs +28 -0
  456. package/scripts/workflow-contract.ts +206 -0
  457. package/scripts/workstream-sync.sh +263 -0
  458. package/src/cli/agent-jobs/executable-resolver.ts +289 -0
  459. package/src/cli/agent-jobs/executor-health.ts +252 -0
  460. package/src/cli/agent-jobs/integration.ts +963 -0
  461. package/src/cli/agent-jobs/job-manager.ts +2030 -0
  462. package/src/cli/agent-jobs/types.ts +219 -0
  463. package/src/cli/agent-jobs/worker-lifecycle.ts +288 -0
  464. package/src/cli/chatgpt-browser/bind-server.ts +504 -0
  465. package/src/cli/chatgpt-browser/binding.ts +140 -0
  466. package/src/cli/chatgpt-browser/bridge-extension.ts +221 -0
  467. package/src/cli/chatgpt-browser/bridge-provider.ts +268 -0
  468. package/src/cli/chatgpt-browser/engine.ts +569 -0
  469. package/src/cli/chatgpt-browser/file-policy.ts +158 -0
  470. package/src/cli/chatgpt-browser/native-provider.ts +553 -0
  471. package/src/cli/chatgpt-browser/oracle-provider.ts +437 -0
  472. package/src/cli/chatgpt-browser/prompt-assembler.ts +29 -0
  473. package/src/cli/chatgpt-browser/session-store.ts +301 -0
  474. package/src/cli/chatgpt-browser/types.ts +172 -0
  475. package/src/cli/commands/adopt-plan.ts +186 -0
  476. package/src/cli/commands/brain-root.ts +132 -0
  477. package/src/cli/commands/brain.ts +609 -0
  478. package/src/cli/commands/capability-context.ts +613 -0
  479. package/src/cli/commands/chatgpt.ts +424 -0
  480. package/src/cli/commands/controller.ts +680 -0
  481. package/src/cli/commands/docs.ts +103 -0
  482. package/src/cli/commands/doctor.ts +476 -0
  483. package/src/cli/commands/global-runtime.ts +323 -0
  484. package/src/cli/commands/hook.ts +34 -0
  485. package/src/cli/commands/init-hook.ts +870 -0
  486. package/src/cli/commands/init.ts +829 -0
  487. package/src/cli/commands/install.ts +86 -0
  488. package/src/cli/commands/mcp.ts +315 -0
  489. package/src/cli/commands/migrate.ts +154 -0
  490. package/src/cli/commands/plugin.ts +74 -0
  491. package/src/cli/commands/prompt-guard-decision.ts +238 -0
  492. package/src/cli/commands/recovery.ts +667 -0
  493. package/src/cli/commands/repository.ts +224 -0
  494. package/src/cli/commands/run.ts +23 -0
  495. package/src/cli/commands/runtime.ts +191 -0
  496. package/src/cli/commands/security.ts +440 -0
  497. package/src/cli/commands/status.ts +137 -0
  498. package/src/cli/commands/tools.ts +167 -0
  499. package/src/cli/controller/check-runner.ts +1022 -0
  500. package/src/cli/controller/codex-continuation.ts +153 -0
  501. package/src/cli/controller/completion-backlog.ts +380 -0
  502. package/src/cli/controller/completion-orchestrator.ts +1807 -0
  503. package/src/cli/controller/completion-target.ts +96 -0
  504. package/src/cli/controller/composite-operations.ts +196 -0
  505. package/src/cli/controller/composite-result.ts +130 -0
  506. package/src/cli/controller/context-pack.ts +652 -0
  507. package/src/cli/controller/execution-completion.ts +175 -0
  508. package/src/cli/controller/execution-policy.ts +392 -0
  509. package/src/cli/controller/governance.ts +594 -0
  510. package/src/cli/controller/issue-store.ts +1421 -0
  511. package/src/cli/controller/launch-agents.ts +410 -0
  512. package/src/cli/controller/legacy-issue-cutover.ts +415 -0
  513. package/src/cli/controller/lifecycle-authority.ts +16 -0
  514. package/src/cli/controller/migrated-issue-decision.ts +237 -0
  515. package/src/cli/controller/operational-plan.ts +226 -0
  516. package/src/cli/controller/postcondition.ts +134 -0
  517. package/src/cli/controller/progress.ts +656 -0
  518. package/src/cli/controller/project-state.ts +147 -0
  519. package/src/cli/controller/requirement-portfolio-export.ts +146 -0
  520. package/src/cli/controller/requirement-portfolio-migration.ts +613 -0
  521. package/src/cli/controller/run-evidence.ts +43 -0
  522. package/src/cli/controller/runtime-config.ts +92 -0
  523. package/src/cli/controller/stuck-state-migration.ts +396 -0
  524. package/src/cli/controller/task-ledger.ts +632 -0
  525. package/src/cli/controller/task-status-resolver.ts +403 -0
  526. package/src/cli/controller/types.ts +273 -0
  527. package/src/cli/controller/work-mode.ts +186 -0
  528. package/src/cli/controller/worklog.ts +201 -0
  529. package/src/cli/diagnostic-entry.ts +39 -0
  530. package/src/cli/editing/edit-session.ts +1606 -0
  531. package/src/cli/editing/executable-modes.ts +70 -0
  532. package/src/cli/github/github.ts +274 -0
  533. package/src/cli/github/plugin.ts +345 -0
  534. package/src/cli/github/session.ts +104 -0
  535. package/src/cli/hook/prompt-guard-decision.ts +238 -0
  536. package/src/cli/hook/prompt-intents.ts +534 -0
  537. package/src/cli/hook/route-registry.ts +107 -0
  538. package/src/cli/hook/runtime.ts +303 -0
  539. package/src/cli/hook/state-snapshot.ts +388 -0
  540. package/src/cli/hook-entry.ts +51 -0
  541. package/src/cli/index.ts +574 -0
  542. package/src/cli/installer/managed-entries.ts +78 -0
  543. package/src/cli/installer/shared.ts +65 -0
  544. package/src/cli/installer/targets/claude.ts +136 -0
  545. package/src/cli/installer/targets/codex.ts +174 -0
  546. package/src/cli/installer/targets/registry.ts +28 -0
  547. package/src/cli/installer/types.ts +72 -0
  548. package/src/cli/local-bridge/connector-freshness.ts +529 -0
  549. package/src/cli/local-bridge/console-view-models.ts +324 -0
  550. package/src/cli/local-bridge/dashboard.ts +1312 -0
  551. package/src/cli/local-bridge/facade-api.ts +1877 -0
  552. package/src/cli/local-bridge/job-store.ts +1451 -0
  553. package/src/cli/local-bridge/mobile-intents.ts +344 -0
  554. package/src/cli/local-bridge/mobile-monitor.ts +209 -0
  555. package/src/cli/local-bridge/server.ts +3183 -0
  556. package/src/cli/local-bridge/types.ts +176 -0
  557. package/src/cli/mcp/access-mode.ts +132 -0
  558. package/src/cli/mcp/access-tools.ts +387 -0
  559. package/src/cli/mcp/audit.ts +32 -0
  560. package/src/cli/mcp/auth.ts +402 -0
  561. package/src/cli/mcp/instructions.ts +33 -0
  562. package/src/cli/mcp/legacy-context.ts +16 -0
  563. package/src/cli/mcp/legacy-tool-service.ts +5516 -0
  564. package/src/cli/mcp/multi-repository.ts +423 -0
  565. package/src/cli/mcp/oauth.ts +226 -0
  566. package/src/cli/mcp/paths.ts +134 -0
  567. package/src/cli/mcp/policy.ts +230 -0
  568. package/src/cli/mcp/proxy-env.ts +62 -0
  569. package/src/cli/mcp/readiness-projection.ts +24 -0
  570. package/src/cli/mcp/redaction.ts +21 -0
  571. package/src/cli/mcp/repo.ts +24 -0
  572. package/src/cli/mcp/repository-tools.ts +1295 -0
  573. package/src/cli/mcp/server.ts +341 -0
  574. package/src/cli/mcp/setup.ts +793 -0
  575. package/src/cli/mcp/tool-capability-cache.ts +87 -0
  576. package/src/cli/mcp/tools.ts +9 -0
  577. package/src/cli/mcp/toolset-names.ts +70 -0
  578. package/src/cli/mcp/toolset-selection.ts +41 -0
  579. package/src/cli/mcp/toolset.ts +300 -0
  580. package/src/cli/mcp/transports/AGENTS.md +39 -0
  581. package/src/cli/mcp/transports/CLAUDE.md +39 -0
  582. package/src/cli/mcp/transports/http.ts +1234 -0
  583. package/src/cli/mcp/transports/session-registry.ts +428 -0
  584. package/src/cli/mcp/transports/stdio.ts +8 -0
  585. package/src/cli/mcp/types.ts +41 -0
  586. package/src/cli/mcp/umbrella-tools.ts +117 -0
  587. package/src/cli/repo-adoption/reclaim-runtime.ts +681 -0
  588. package/src/cli/repositories/branch-name-policy.ts +57 -0
  589. package/src/cli/repositories/command-classifier.ts +600 -0
  590. package/src/cli/repositories/command-executor.ts +1066 -0
  591. package/src/cli/repositories/command-normalization.ts +53 -0
  592. package/src/cli/repositories/command-scope.ts +264 -0
  593. package/src/cli/repositories/controller-home.ts +88 -0
  594. package/src/cli/repositories/entity-migration.ts +199 -0
  595. package/src/cli/repositories/ephemeral-workspace.ts +62 -0
  596. package/src/cli/repositories/git-command-executor.ts +301 -0
  597. package/src/cli/repositories/goal-registry.ts +239 -0
  598. package/src/cli/repositories/identity.ts +64 -0
  599. package/src/cli/repositories/local-project-onboarding.ts +539 -0
  600. package/src/cli/repositories/locks.ts +262 -0
  601. package/src/cli/repositories/registry.ts +1057 -0
  602. package/src/cli/repositories/runtime-storage.ts +411 -0
  603. package/src/cli/repositories/safe-patch.ts +421 -0
  604. package/src/cli/repositories/selected-path-actions.ts +341 -0
  605. package/src/cli/repositories/structured-git.ts +257 -0
  606. package/src/cli/repositories/types.ts +155 -0
  607. package/src/cli/repositories/umbrella.ts +134 -0
  608. package/src/cli/repositories/workbench.ts +140 -0
  609. package/src/cli/repositories/worktree-storage.ts +137 -0
  610. package/src/cli/repository/inspector.ts +637 -0
  611. package/src/cli/repository/session-cache.ts +453 -0
  612. package/src/cli/runtime/helper-runner.ts +172 -0
  613. package/src/cli/runtime-invocation.ts +318 -0
  614. package/src/cli/tools/codegraph.ts +676 -0
  615. package/src/cli/v81-entry.ts +29 -0
  616. package/src/core/adoption/gitignore-plan.ts +127 -0
  617. package/src/core/adoption/helper-wrapper-plan.ts +159 -0
  618. package/src/core/adoption/manifest-templates.ts +60 -0
  619. package/src/core/adoption/modes.ts +7 -0
  620. package/src/core/adoption/operations.ts +126 -0
  621. package/src/core/adoption/plan.ts +149 -0
  622. package/src/core/adoption/render.ts +70 -0
  623. package/src/core/adoption/rollback.ts +62 -0
  624. package/src/core/adoption/summary.ts +43 -0
  625. package/src/core/adoption/workflow-contract-asset.ts +14 -0
  626. package/src/core/adoption/workflow-contract-plan.ts +31 -0
  627. package/src/effects/fs-transaction.ts +540 -0
  628. package/src/effects/git-executable.ts +59 -0
  629. package/src/effects/managed-block.ts +86 -0
  630. package/src/effects/path-safety.ts +47 -0
  631. package/src/effects/process-runner.ts +192 -0
  632. package/src/runtime/assistant/action-proposals.ts +279 -0
  633. package/src/runtime/assistant/intent.ts +395 -0
  634. package/src/runtime/assistant/model-provider.ts +460 -0
  635. package/src/runtime/assistant/openapi.ts +223 -0
  636. package/src/runtime/assistant/policy.ts +89 -0
  637. package/src/runtime/assistant/readiness.ts +258 -0
  638. package/src/runtime/assistant/routine-runtime.ts +477 -0
  639. package/src/runtime/assistant/schedule-binding.ts +171 -0
  640. package/src/runtime/assistant/standing-grants.ts +375 -0
  641. package/src/runtime/assistant/store.ts +243 -0
  642. package/src/runtime/assistant/types.ts +135 -0
  643. package/src/runtime/context/codegraph-read-provider.ts +347 -0
  644. package/src/runtime/context/codegraph-sidecar.cjs +207 -0
  645. package/src/runtime/control-plane/dispatch-priority.ts +67 -0
  646. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +151 -0
  647. package/src/runtime/control-plane/execution/execution-identity.ts +456 -0
  648. package/src/runtime/control-plane/execution/session-store.ts +175 -0
  649. package/src/runtime/control-plane/execution/validation.ts +117 -0
  650. package/src/runtime/control-plane/execution/verification-evidence.ts +191 -0
  651. package/src/runtime/control-plane/execution/work-handle-store.ts +225 -0
  652. package/src/runtime/control-plane/execution/work-prepare-request-store.ts +159 -0
  653. package/src/runtime/control-plane/execution/work-task-receipt.ts +445 -0
  654. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +821 -0
  655. package/src/runtime/control-plane/facade/capability-registry.ts +279 -0
  656. package/src/runtime/control-plane/facade/check-normalization.ts +233 -0
  657. package/src/runtime/control-plane/facade/codex-delegation.ts +196 -0
  658. package/src/runtime/control-plane/facade/controller-session-store.ts +199 -0
  659. package/src/runtime/control-plane/facade/facade-result.ts +41 -0
  660. package/src/runtime/control-plane/facade/goal-workloop-access.ts +177 -0
  661. package/src/runtime/control-plane/facade/goal-workloop.ts +1216 -0
  662. package/src/runtime/control-plane/facade/handoff-inbox-store.ts +221 -0
  663. package/src/runtime/control-plane/facade/index.ts +16 -0
  664. package/src/runtime/control-plane/facade/operation-digest.ts +528 -0
  665. package/src/runtime/control-plane/facade/plan-contract-store.ts +403 -0
  666. package/src/runtime/control-plane/facade/policy-gate.ts +149 -0
  667. package/src/runtime/control-plane/facade/requirement-board.ts +280 -0
  668. package/src/runtime/control-plane/facade/self-healing-loop.ts +555 -0
  669. package/src/runtime/control-plane/facade/suggested-actions.ts +108 -0
  670. package/src/runtime/control-plane/facade/types.ts +729 -0
  671. package/src/runtime/control-plane/facade/work-admission-policy.ts +93 -0
  672. package/src/runtime/control-plane/facade/work-continuation.ts +104 -0
  673. package/src/runtime/control-plane/facade/work-contract-store.ts +1118 -0
  674. package/src/runtime/control-plane/facade/work-task-projection.ts +66 -0
  675. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +365 -0
  676. package/src/runtime/control-plane/global-scheduler/scheduler.ts +920 -0
  677. package/src/runtime/control-plane/global-scheduler/wake-signal.ts +89 -0
  678. package/src/runtime/control-plane/goal-loop/config-facade.ts +700 -0
  679. package/src/runtime/control-plane/goal-loop/config-store.ts +570 -0
  680. package/src/runtime/control-plane/goal-loop/config-types.ts +213 -0
  681. package/src/runtime/control-plane/goal-loop/executor-router.ts +109 -0
  682. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +149 -0
  683. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +304 -0
  684. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +1001 -0
  685. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +160 -0
  686. package/src/runtime/control-plane/goal-loop/index.ts +13 -0
  687. package/src/runtime/control-plane/goal-loop/local-tools.ts +290 -0
  688. package/src/runtime/control-plane/goal-loop/policy-gates.ts +203 -0
  689. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +93 -0
  690. package/src/runtime/control-plane/goal-loop/provider-registry.ts +545 -0
  691. package/src/runtime/control-plane/goal-loop/types.ts +378 -0
  692. package/src/runtime/control-plane/governance/access-policy.ts +147 -0
  693. package/src/runtime/control-plane/governance/authorization.ts +195 -0
  694. package/src/runtime/control-plane/governance/external-effects.ts +43 -0
  695. package/src/runtime/control-plane/launcher/thin-launcher.ts +97 -0
  696. package/src/runtime/control-plane/persistence/metadata-payload-policy.ts +53 -0
  697. package/src/runtime/control-plane/persistence/requirement-store.ts +241 -0
  698. package/src/runtime/control-plane/persistence/sqlite-store.ts +539 -0
  699. package/src/runtime/control-plane/release-retention.ts +447 -0
  700. package/src/runtime/control-plane/repo-actor/actor.ts +181 -0
  701. package/src/runtime/control-plane/repo-actor/registry.ts +20 -0
  702. package/src/runtime/control-plane/routing/index.ts +1 -0
  703. package/src/runtime/control-plane/routing/route-policy.ts +379 -0
  704. package/src/runtime/control-plane/runtime-cleanup.ts +727 -0
  705. package/src/runtime/control-plane/runtime-generation.ts +509 -0
  706. package/src/runtime/control-plane/runtime-pid-ownership.ts +11 -0
  707. package/src/runtime/control-plane/runtime-status-client.ts +90 -0
  708. package/src/runtime/control-plane/startup-recovery.ts +198 -0
  709. package/src/runtime/diagnostics/connectivity-observability.ts +475 -0
  710. package/src/runtime/diagnostics/mcp-timing.ts +64 -0
  711. package/src/runtime/diagnostics/performance.ts +379 -0
  712. package/src/runtime/diagnostics/process-facade.ts +350 -0
  713. package/src/runtime/diagnostics/read-only-tool.ts +226 -0
  714. package/src/runtime/evidence/artifact-store.ts +154 -0
  715. package/src/runtime/evidence/event-ledger.ts +80 -0
  716. package/src/runtime/evidence/evidence-store.ts +68 -0
  717. package/src/runtime/evidence/process-check-receipt.ts +43 -0
  718. package/src/runtime/evidence/result-store.ts +209 -0
  719. package/src/runtime/evidence/sensitive-output.ts +353 -0
  720. package/src/runtime/execution/jobs/child-reference.ts +124 -0
  721. package/src/runtime/execution/jobs/legacy-adapter.ts +22 -0
  722. package/src/runtime/execution/jobs/receipt-recovery.ts +119 -0
  723. package/src/runtime/execution/jobs/receipt-store.ts +243 -0
  724. package/src/runtime/execution/jobs/store.ts +737 -0
  725. package/src/runtime/execution/jobs/timeouts.ts +109 -0
  726. package/src/runtime/execution/jobs/types.ts +230 -0
  727. package/src/runtime/execution/jobs/wait.ts +45 -0
  728. package/src/runtime/execution/process-runtime/canary.ts +26 -0
  729. package/src/runtime/execution/process-runtime/check-facade.ts +272 -0
  730. package/src/runtime/execution/process-runtime/check-receipt.ts +185 -0
  731. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +60 -0
  732. package/src/runtime/execution/process-runtime/command-facade.ts +321 -0
  733. package/src/runtime/execution/process-runtime/gc.ts +171 -0
  734. package/src/runtime/execution/process-runtime/index.ts +9 -0
  735. package/src/runtime/execution/process-runtime/interactive-admission.ts +23 -0
  736. package/src/runtime/execution/process-runtime/process-runner-entry.ts +466 -0
  737. package/src/runtime/execution/process-runtime/resource-claims.ts +440 -0
  738. package/src/runtime/execution/process-runtime/runtime.ts +1816 -0
  739. package/src/runtime/execution/process-runtime/store.ts +687 -0
  740. package/src/runtime/execution/process-runtime/types.ts +352 -0
  741. package/src/runtime/execution/thin-harness/async-process.ts +181 -0
  742. package/src/runtime/execution/thin-harness/batch-executor.ts +671 -0
  743. package/src/runtime/execution/thin-harness/execution-router.ts +700 -0
  744. package/src/runtime/execution/thin-harness/fast-executor.ts +1263 -0
  745. package/src/runtime/execution/thin-harness/fast-receipt.ts +235 -0
  746. package/src/runtime/execution/thin-harness/fingerprint-worker.ts +191 -0
  747. package/src/runtime/execution/thin-harness/index.ts +13 -0
  748. package/src/runtime/execution/thin-harness/latency-trace.ts +107 -0
  749. package/src/runtime/execution/thin-harness/lightweight-lanes.ts +745 -0
  750. package/src/runtime/execution/thin-harness/mutation-gate.ts +578 -0
  751. package/src/runtime/execution/thin-harness/proposal-store.ts +409 -0
  752. package/src/runtime/execution/thin-harness/request-ledger.ts +595 -0
  753. package/src/runtime/execution/thin-harness/search-worker.ts +114 -0
  754. package/src/runtime/execution/thin-harness/types.ts +313 -0
  755. package/src/runtime/execution/thin-harness/workspace-savepoint.ts +333 -0
  756. package/src/runtime/execution/workers/executor.ts +687 -0
  757. package/src/runtime/execution/workers/ownership.ts +94 -0
  758. package/src/runtime/execution/workers/worker-entry.ts +277 -0
  759. package/src/runtime/gateway/mcp/execution-tools.ts +2009 -0
  760. package/src/runtime/gateway/mcp/persisted-check-process.ts +255 -0
  761. package/src/runtime/gateway/mcp/process-tools.ts +230 -0
  762. package/src/runtime/gateway/mcp/resource-policy.ts +195 -0
  763. package/src/runtime/gateway/mcp/router.ts +1088 -0
  764. package/src/runtime/gateway/mcp/runtime-tools.ts +5994 -0
  765. package/src/runtime/gateway/mcp/work-validation-reconciler.ts +219 -0
  766. package/src/runtime/health/evaluator.ts +474 -0
  767. package/src/runtime/health/index.ts +2 -0
  768. package/src/runtime/health/operational-view.ts +198 -0
  769. package/src/runtime/maintenance/cleanup.ts +419 -0
  770. package/src/runtime/model-clients/deepseek-adapter.ts +312 -0
  771. package/src/runtime/model-clients/index.ts +2 -0
  772. package/src/runtime/model-clients/types.ts +101 -0
  773. package/src/runtime/observability/gateway-contention-metrics.ts +129 -0
  774. package/src/runtime/observability/route-session-benchmark.ts +110 -0
  775. package/src/runtime/personal-assistant/gmail-triage-manager.ts +231 -0
  776. package/src/runtime/personal-assistant/reporting-runtime.ts +344 -0
  777. package/src/runtime/personal-assistant/triage-runtime.ts +748 -0
  778. package/src/runtime/plugins/app-store-connect-adapter.ts +868 -0
  779. package/src/runtime/plugins/browser-adapter.ts +2812 -0
  780. package/src/runtime/plugins/browser-automation-service.ts +46 -0
  781. package/src/runtime/plugins/browser-handoff-host.ts +304 -0
  782. package/src/runtime/plugins/browser-handoff.ts +371 -0
  783. package/src/runtime/plugins/browser-macos-bridge.ts +865 -0
  784. package/src/runtime/plugins/browser-node-bridge-host.ts +64 -0
  785. package/src/runtime/plugins/browser-node-bridge.ts +249 -0
  786. package/src/runtime/plugins/desktop-adapter.ts +374 -0
  787. package/src/runtime/plugins/desktop-operator-registration.ts +418 -0
  788. package/src/runtime/plugins/errors.ts +39 -0
  789. package/src/runtime/plugins/execution-origin.ts +26 -0
  790. package/src/runtime/plugins/external-adapter.ts +322 -0
  791. package/src/runtime/plugins/external-registration.ts +308 -0
  792. package/src/runtime/plugins/external-unix-socket-probe.cjs +79 -0
  793. package/src/runtime/plugins/external-unix-socket.ts +238 -0
  794. package/src/runtime/plugins/first-party-registry.ts +37 -0
  795. package/src/runtime/plugins/github-adapter.ts +266 -0
  796. package/src/runtime/plugins/gmail-adapter.ts +729 -0
  797. package/src/runtime/plugins/google-calendar-adapter.ts +468 -0
  798. package/src/runtime/plugins/google-shared.ts +578 -0
  799. package/src/runtime/plugins/google-tasks-adapter.ts +535 -0
  800. package/src/runtime/plugins/interaction-session.ts +252 -0
  801. package/src/runtime/plugins/ios/agent-device-capabilities.ts +258 -0
  802. package/src/runtime/plugins/ios/agent-device-failures.ts +95 -0
  803. package/src/runtime/plugins/ios/agent-device-provider.ts +63 -0
  804. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +268 -0
  805. package/src/runtime/plugins/ios/app-adapters.ts +122 -0
  806. package/src/runtime/plugins/ios-adapter.ts +509 -0
  807. package/src/runtime/plugins/ios-agent-device.ts +2311 -0
  808. package/src/runtime/plugins/ios-physical-device.ts +955 -0
  809. package/src/runtime/plugins/local-system-adapter.ts +1016 -0
  810. package/src/runtime/plugins/macos-capability-broker.ts +73 -0
  811. package/src/runtime/plugins/managed-process-adapter.ts +366 -0
  812. package/src/runtime/plugins/resend-adapter.ts +506 -0
  813. package/src/runtime/plugins/store.ts +1025 -0
  814. package/src/runtime/plugins/types.ts +138 -0
  815. package/src/runtime/projections/controller-context.ts +596 -0
  816. package/src/runtime/projections/git-status-sampler.ts +84 -0
  817. package/src/runtime/projections/invalidation.ts +250 -0
  818. package/src/runtime/projections/materialized-view.ts +694 -0
  819. package/src/runtime/recovery/actions.ts +158 -0
  820. package/src/runtime/recovery/audit.ts +38 -0
  821. package/src/runtime/recovery/classifier.ts +163 -0
  822. package/src/runtime/recovery/index.ts +9 -0
  823. package/src/runtime/recovery/local-jobs-repair.ts +393 -0
  824. package/src/runtime/recovery/maintenance-executor.ts +822 -0
  825. package/src/runtime/recovery/patch-handoff.ts +50 -0
  826. package/src/runtime/recovery/probe.ts +308 -0
  827. package/src/runtime/recovery/store.ts +35 -0
  828. package/src/runtime/recovery/types.ts +175 -0
  829. package/src/runtime/release/identity.ts +101 -0
  830. package/src/runtime/release/release-gate.ts +137 -0
  831. package/src/runtime/resources/claims/conflicts.ts +205 -0
  832. package/src/runtime/resources/index.ts +1 -0
  833. package/src/runtime/resources/leases/store.ts +539 -0
  834. package/src/runtime/resources/leases/types.ts +50 -0
  835. package/src/runtime/resources/ownership.ts +72 -0
  836. package/src/runtime/root/controller-services.ts +42 -0
  837. package/src/runtime/root/entry.ts +70 -0
  838. package/src/runtime/root/gateway-adapter.ts +46 -0
  839. package/src/runtime/root/local-bridge.ts +72 -0
  840. package/src/runtime/root/mcp-transport.ts +198 -0
  841. package/src/runtime/root/ownership.ts +94 -0
  842. package/src/runtime/root/readiness.ts +69 -0
  843. package/src/runtime/root/release-manifest.ts +147 -0
  844. package/src/runtime/root/release-materialize.ts +509 -0
  845. package/src/runtime/root/release-store.ts +236 -0
  846. package/src/runtime/root/runtime.ts +318 -0
  847. package/src/runtime/root/scheduler.ts +58 -0
  848. package/src/runtime/root/service-runner-entry.ts +20 -0
  849. package/src/runtime/root/service-runner.ts +69 -0
  850. package/src/runtime/root/service.ts +291 -0
  851. package/src/runtime/root/status.ts +127 -0
  852. package/src/runtime/root/types.ts +112 -0
  853. package/src/runtime/root/write-fence.ts +309 -0
  854. package/src/runtime/safe-tooling/browser-safe.ts +133 -0
  855. package/src/runtime/safe-tooling/external-filesystem.ts +304 -0
  856. package/src/runtime/safe-tooling/google-credential-store.ts +95 -0
  857. package/src/runtime/safe-tooling/google-oauth-broker.ts +286 -0
  858. package/src/runtime/safe-tooling/index.ts +11 -0
  859. package/src/runtime/safe-tooling/ios-development.ts +1039 -0
  860. package/src/runtime/safe-tooling/job-summary.ts +361 -0
  861. package/src/runtime/safe-tooling/plugin-summary.ts +53 -0
  862. package/src/runtime/safe-tooling/resend-oauth.ts +387 -0
  863. package/src/runtime/safe-tooling/review-artifacts.ts +133 -0
  864. package/src/runtime/safe-tooling/types.ts +103 -0
  865. package/src/runtime/safe-tooling/workspace-auth.ts +116 -0
  866. package/src/runtime/shared/bounded-child-supervisor.ts +235 -0
  867. package/src/runtime/shared/idempotent-retry.ts +128 -0
  868. package/src/runtime/shared/json-files.ts +43 -0
  869. package/src/runtime/shared/local-bridge-surface.ts +231 -0
  870. package/src/runtime/shared/managed-env.ts +154 -0
  871. package/src/runtime/shared/node-ts-loader.mjs +50 -0
  872. package/src/runtime/shared/process-environment.ts +97 -0
  873. package/src/runtime/shared/process-identity.ts +72 -0
  874. package/src/runtime/shared/process-tree.ts +227 -0
  875. package/src/runtime/shared/response-budget.ts +246 -0
  876. package/src/runtime/standalone-recovery/core.ts +2275 -0
  877. package/src/runtime/standalone-recovery/entry.ts +686 -0
  878. package/src/runtime/standalone-recovery/http-transport.ts +317 -0
  879. package/src/runtime/standalone-recovery/installer.ts +747 -0
  880. package/src/runtime/standalone-recovery/release.ts +241 -0
  881. package/src/runtime/watchdog/workflow-watchdog.ts +118 -0
  882. package/src/runtime/workflow/campaigns/cleanup.ts +263 -0
  883. package/src/runtime/workflow/campaigns/engine.ts +112 -0
  884. package/src/runtime/workflow/campaigns/normalize.ts +100 -0
  885. package/src/runtime/workflow/campaigns/review.ts +315 -0
  886. package/src/runtime/workflow/campaigns/store.ts +526 -0
  887. package/src/runtime/workflow/campaigns/supervisor.ts +112 -0
  888. package/src/runtime/workflow/campaigns/types.ts +290 -0
  889. package/src/runtime/workflow/campaigns/workspace-agent.ts +155 -0
  890. package/src/runtime/workflow/campaigns/workspace.ts +200 -0
  891. package/src/runtime/workflow/findings/store.ts +165 -0
  892. package/src/runtime/workflow/findings/types.ts +36 -0
  893. package/src/runtime/workflow/portfolio/engine.ts +20 -0
  894. package/src/runtime/workflow/portfolio/store.ts +185 -0
  895. package/src/runtime/workflow/portfolio/types.ts +29 -0
  896. package/src/runtime/workflow/schedules/engine.ts +620 -0
  897. package/src/runtime/workflow/schedules/settlement.ts +144 -0
  898. package/src/runtime/workflow/schedules/store.ts +417 -0
  899. package/src/runtime/workflow/schedules/types.ts +124 -0
  900. package/src/runtime/workspace-targets/index.ts +24 -0
  901. package/src/runtime/workspace-targets/target-grant.ts +721 -0
  902. package/src/testing/test-governance.ts +626 -0
  903. package/src/version.ts +21 -0
@@ -0,0 +1,534 @@
1
+ /**
2
+ * Prompt intent classifiers — TypeScript port of the prompt-guard.sh shell
3
+ * regex layer.
4
+ *
5
+ * The shell hook used byte-oriented `grep -Ei` classifiers, which made
6
+ * Chinese-language boundaries locale-dependent (UTF-8 continuation bytes can
7
+ * fall inside `[[:punct:]]` under LC_ALL=C, so e.g. "里完成。" misclassified
8
+ * as a done declaration on GNU grep but not BSD grep). This module owns the
9
+ * full prompt-text classification with real Unicode semantics; the shell
10
+ * layer keeps filesystem authority (plan/contract/worktree state) and side
11
+ * effects, and consumes the JSON verdict from `prompt-guard-decide`.
12
+ *
13
+ * Porting conventions:
14
+ * - `grep -qEi "<pat>"` over multi-line text → RegExp with `imu` flags so
15
+ * `^`/`$` stay line anchors, matching grep's per-line semantics.
16
+ * - `[[:space:][:punct:]]` boundary → `[\s\p{P}\p{S}]` (Unicode-aware).
17
+ * - `[^[:alpha:]]` word-ish boundaries in English verb matchers stay ASCII
18
+ * (`[^A-Za-z]`) on purpose: "fixture"/"prefix" must not fire.
19
+ */
20
+
21
+ const SP = String.raw`[\s\p{P}\p{S}]`;
22
+
23
+ function re(pattern: string): RegExp {
24
+ return new RegExp(pattern, 'imu');
25
+ }
26
+
27
+ export interface PromptIntentContext {
28
+ /** Raw prompt text as delivered by the host. */
29
+ readonly raw: string;
30
+ /** Prompt with host-injected context blocks stripped. */
31
+ readonly text: string;
32
+ readonly firstLine: string;
33
+ /** True when a pending plan/orchestration discussion is fresh. */
34
+ readonly pendingFresh: boolean;
35
+ }
36
+
37
+ /**
38
+ * Mirror of strip_prompt_context_blocks: drop host-injected wrapper blocks
39
+ * (skill/system/environment) so classification sees the user's words.
40
+ */
41
+ export function stripPromptContextBlocks(prompt: string): string {
42
+ const tagNames =
43
+ 'skill|environment_context|INSTRUCTIONS|system|developer|app-context|collaboration_mode|apps_instructions|skills_instructions|plugins_instructions';
44
+ const open = new RegExp(String.raw`^\s*<(${tagNames})[^>]*>\s*$`, 'i');
45
+ const close = new RegExp(String.raw`^\s*</(${tagNames})>\s*$`, 'i');
46
+ const out: string[] = [];
47
+ let skip = false;
48
+ for (const line of prompt.split('\n')) {
49
+ if (open.test(line)) {
50
+ skip = true;
51
+ continue;
52
+ }
53
+ if (close.test(line)) {
54
+ skip = false;
55
+ continue;
56
+ }
57
+ if (!skip) out.push(line);
58
+ }
59
+ const stripped = out.join('\n');
60
+ return stripped.trim().length > 0 ? stripped : prompt;
61
+ }
62
+
63
+ export function buildPromptIntentContext(
64
+ rawPrompt: string,
65
+ pendingFresh: boolean,
66
+ ): PromptIntentContext {
67
+ const raw = rawPrompt.replace(/\r/g, '');
68
+ const text = stripPromptContextBlocks(raw);
69
+ const firstLine = text.split('\n').find((l) => l.trim().length > 0) ?? '';
70
+ return { raw, text, firstLine, pendingFresh };
71
+ }
72
+
73
+ const EXECUTION_APPROVAL = re(
74
+ String.raw`^${SP}*(please${SP}+)?(go ahead(\s+(with\s+(it|this|that)|please))?|go|proceed(\s+(with\s+(it|this|that)|please))?|approved|approve(\s+(it|this|that))?|ship it|let'?s go|继续执行|批准执行|批准|同意(了)?${SP}*(执行|开干|开始|动手|做|干)(了|吧)?|可以干(了|吧)?|可以(开始|执行)(了|吧)?|直接改(了|吧)?|整|整吧|开干|干吧|做吧|走起)(${SP}+please)?${SP}*$`,
75
+ );
76
+
77
+ export function isExecutionApprovalIntent(ctx: PromptIntentContext): boolean {
78
+ return EXECUTION_APPROVAL.test(ctx.raw);
79
+ }
80
+
81
+ const EXPLICIT_EXECUTION_LINE = re(
82
+ String.raw`^${SP}*(please\s+)?(implement\s+(this|the)|execute\s+(this|the)|start\s+(implementation|executing|coding)|go ahead|proceed|ship it|开始(实现|执行|落实|写)|执行计划|落实计划|批准执行|批准|直接(改|做|实现|执行|落地)|动手|开干|可以(开始|执行|干)|可以干|干吧|做吧)(${SP}|$)`,
83
+ );
84
+
85
+ export function promptHasExplicitExecutionCommandLine(ctx: PromptIntentContext): boolean {
86
+ return EXPLICIT_EXECUTION_LINE.test(ctx.text);
87
+ }
88
+
89
+ export function isExplicitExecutionStartLine(ctx: PromptIntentContext): boolean {
90
+ return EXPLICIT_EXECUTION_LINE.test(ctx.firstLine);
91
+ }
92
+
93
+ const PLAN_EXECUTION_PROJECTION_LINE = re(
94
+ String.raw`^${SP}*(please${SP}+)?((implement|execute|run|start\s+(implementing|executing))\s+(this|the|approved)\s+plan|开始(实现|执行|落实)(这个|该)?(方案|计划)|执行(这个|该)?(方案|计划)|落实(这个|该)?(方案|计划))(${SP}+please)?${SP}*$`,
95
+ );
96
+
97
+ export function isPlanExecutionProjectionIntent(ctx: PromptIntentContext): boolean {
98
+ if (isExecutionApprovalIntent(ctx)) return true;
99
+ return PLAN_EXECUTION_PROJECTION_LINE.test(ctx.firstLine);
100
+ }
101
+
102
+ const TRIGGER_QUESTION = re(
103
+ '(会不会触发|会触发吗|能触发吗|可以触发吗|does this trigger|would this trigger|will this trigger|比如.*触发|例如.*触发)',
104
+ );
105
+
106
+ export function isTriggerQuestionPrompt(ctx: PromptIntentContext): boolean {
107
+ return TRIGGER_QUESTION.test(ctx.firstLine);
108
+ }
109
+
110
+ const EMBEDDED_APPROVED_PLAN = re(
111
+ String.raw`^\s*(please\s+)?implement\s+this\s+plan\s*:`,
112
+ );
113
+
114
+ export function isEmbeddedApprovedPlanIntent(ctx: PromptIntentContext): boolean {
115
+ return EMBEDDED_APPROVED_PLAN.test(ctx.text);
116
+ }
117
+
118
+ export function isPlanShapedMarkdownIntent(ctx: PromptIntentContext): boolean {
119
+ if (isTriggerQuestionPrompt(ctx)) return false;
120
+ if (!/^#\s+/u.test(ctx.firstLine)) return false;
121
+ if (!re(String.raw`^##\s+Summary\s*$`).test(ctx.text)) return false;
122
+ return re(String.raw`(^##\s+(Key Changes|Tests|Assumptions)\s*$|P1\s|P2\s|P3\s)`).test(ctx.text);
123
+ }
124
+
125
+ const PLAN_REFINEMENT_EXEC = re(
126
+ '(implement|execute|开始实现|开始执行|批准执行|直接改|动手|开干|可以干)',
127
+ );
128
+ const PLAN_REFINEMENT = re(
129
+ '((review|critique|refine|improve|polish|完善|优化|调整|修改|补充|评审|审一下|看一下|看看|评价|帮我看|帮我审).*(plan|方案|计划|设计|claude|codex)|((plan|方案|计划|设计|claude).*(review|critique|refine|improve|polish|完善|优化|调整|修改|补充|评审|审一下|看一下|看看|评价|帮我看|帮我审)))',
130
+ );
131
+
132
+ export function isPlanRefinementIntent(ctx: PromptIntentContext): boolean {
133
+ if (PLAN_REFINEMENT_EXEC.test(ctx.firstLine)) return false;
134
+ return PLAN_REFINEMENT.test(ctx.firstLine);
135
+ }
136
+
137
+ const PLAN_DISCUSSION_TOPIC = re(
138
+ String.raw`(plan|方案|计划|workflow|hook|hooks|codex[\s-]*plan|claude[\s-]*plan|dynamic[\s-]*workflow|orchestrat|active[\s-]*plan|active[\s-]*marker|PlanStatusGuard|PlanCaptureGate|PlanStartGate|capture|落实plan|执行门禁)`,
139
+ );
140
+ const PLAN_DISCUSSION_MOVE = re(
141
+ '(继续讨论|讨论|追问|疑问|补充|调整|完善|优化|评审|review|refine|怎么|如何|为什么|为啥|不要.*机械|不能.*机械|过于机械|多轮|中断|状态|边界|弱点|补充|改一下|修一下|不合理|有风险|我觉得|是否|是不是|能不能|应该|设计)',
142
+ );
143
+
144
+ export function isPlanDiscussionContinuationIntent(ctx: PromptIntentContext): boolean {
145
+ if (!ctx.pendingFresh) return false;
146
+ if (isExecutionApprovalIntent(ctx)) return false;
147
+ if (isEmbeddedApprovedPlanIntent(ctx)) return false;
148
+ if (isPlanShapedMarkdownIntent(ctx)) return false;
149
+ if (isExplicitExecutionStartLine(ctx)) return false;
150
+ return PLAN_DISCUSSION_TOPIC.test(ctx.text) && PLAN_DISCUSSION_MOVE.test(ctx.text);
151
+ }
152
+
153
+ const PLAN_CONSULTATION_TOPIC = re(
154
+ String.raw`(plan|方案|计划|workflow|hook|hooks|codex[\s-]*plan|claude[\s-]*plan|active[\s-]*plan|PlanStatusGuard|PlanCaptureGate|PlanStartGate|执行门禁|new\s+plan|create\s+(a\s+)?(new\s+)?plan|write\s+plan|draft\s+plan|新建计划|创建计划|写计划|制定计划|补计划)`,
155
+ );
156
+ const PLAN_CONSULTATION_QUESTION = re(
157
+ String.raw`(为什么|为啥|怎么回事|怎么.*(看|理解|处理|判断|选|选择|创建)|如何.*(看|理解|处理|判断|选|选择|创建)|是否|是不是|能不能|可不可以|该不该|应该|哪个|哪种|哪条|选择哪个|咨询|讨论|追问|疑问|问一下|会不会|会触发吗|被拦|拦截|why|how\s+(do|should|can|would|could)|should\s+(i|we)|would|could|can\s+(i|we)|which|what\s+if|is\s+it|question|consult|discuss)`,
158
+ );
159
+
160
+ export function isPlanConsultationIntent(ctx: PromptIntentContext): boolean {
161
+ if (isExecutionApprovalIntent(ctx)) return false;
162
+ if (isEmbeddedApprovedPlanIntent(ctx)) return false;
163
+ if (isPlanShapedMarkdownIntent(ctx)) return false;
164
+ if (isExplicitExecutionStartLine(ctx)) return false;
165
+ return PLAN_CONSULTATION_TOPIC.test(ctx.text) && PLAN_CONSULTATION_QUESTION.test(ctx.text);
166
+ }
167
+
168
+ const DIAGNOSTIC_DIRECT = re(
169
+ '(怎么实现|如何实现|为什么.*(实现|执行|implement|execute)|why.*(implement|execute)|how.*implement|the way .*implement|implement.*interesting|执行流程.*(被拦|拦截|中断|为什么|怎么))',
170
+ );
171
+ const DIAGNOSTIC_TOPIC = re(
172
+ '(hook|hooks|worktree|wt|PlanStatusGuard|执行路径|没开|中断|被拦|拦截|root cause|debug|排查|查查|定位)',
173
+ );
174
+ const DIAGNOSTIC_QUESTION = re(
175
+ '(为什么|为啥|怎么回事|怎么.*(没|不|会|被)|why|what.*root cause|root cause|排查|查查|定位|debug|诊断|中断|被拦|拦截|执行路径|没开)',
176
+ );
177
+
178
+ export function isDiagnosticQuestionIntent(ctx: PromptIntentContext): boolean {
179
+ if (isExecutionApprovalIntent(ctx)) return false;
180
+ if (isEmbeddedApprovedPlanIntent(ctx)) return false;
181
+ if (isPlanShapedMarkdownIntent(ctx)) return false;
182
+ if (DIAGNOSTIC_DIRECT.test(ctx.text)) return true;
183
+ return DIAGNOSTIC_TOPIC.test(ctx.text) && DIAGNOSTIC_QUESTION.test(ctx.text);
184
+ }
185
+
186
+ const REVIEW_RELEASE = re(
187
+ '(review|check|pre-merge|before merge|release|publish|push|验收|检查|提交|发布|推送|合并前)',
188
+ );
189
+
190
+ export function isReviewReleaseIntent(ctx: PromptIntentContext): boolean {
191
+ return REVIEW_RELEASE.test(ctx.text);
192
+ }
193
+
194
+ const REVIEW_RELEASE_CODING_VERB = re('(implement|build it|do it|实现|开始写|动手|开干)');
195
+
196
+ export function isReviewReleaseAdvisoryIntent(ctx: PromptIntentContext): boolean {
197
+ if (!isReviewReleaseIntent(ctx)) return false;
198
+ if (isEmbeddedApprovedPlanIntent(ctx)) return false;
199
+ if (isPlanShapedMarkdownIntent(ctx)) return false;
200
+ if (isExecutionApprovalIntent(ctx)) return false;
201
+ // Review/check prompts often say "execute /check" or "执行 checklist". Those
202
+ // route to evaluator evidence, not implementation.
203
+ if (REVIEW_RELEASE_CODING_VERB.test(ctx.text)) return false;
204
+ return true;
205
+ }
206
+
207
+ const PASSIVE_WORKTREE_TOPIC = re(
208
+ '(plan-to-todo|worktree|linked worktree|隔离 worktree|分支|branch)',
209
+ );
210
+ const PASSIVE_WORKTREE_STATUS = re(
211
+ '(实现会在.*worktree.*完成|会在.*worktree.*完成|已在.*worktree.*完成实现|worktree.*完成实现|implementation will .*worktree|will .*happen.*worktree|will .*complete.*worktree|implementation (has been )?(completed|done).*worktree|completed implementation.*worktree)',
212
+ );
213
+
214
+ export function isPassiveWorktreeStatusIntent(ctx: PromptIntentContext): boolean {
215
+ if (isExecutionApprovalIntent(ctx)) return false;
216
+ if (isEmbeddedApprovedPlanIntent(ctx)) return false;
217
+ if (isPlanShapedMarkdownIntent(ctx)) return false;
218
+ if (promptHasExplicitExecutionCommandLine(ctx)) return false;
219
+ return PASSIVE_WORKTREE_TOPIC.test(ctx.text) && PASSIVE_WORKTREE_STATUS.test(ctx.text);
220
+ }
221
+
222
+ const RETRO_VERB = re('(implement|execute|build|实现|执行|开发)');
223
+ const RETRO_DONE = re(
224
+ '(现在已补|已补|已归档|已复跑|并已复跑|已完成|已处理|我补了|我已经|通过|passed|completed)',
225
+ );
226
+ const RETRO_EVIDENCE = re(
227
+ '(npm|bun|pnpm|yarn|test|lint|build|check|复跑|归档|docs/|README|PRD|通过|passed)',
228
+ );
229
+
230
+ export function isRetrospectiveCompletionReportIntent(ctx: PromptIntentContext): boolean {
231
+ if (isExecutionApprovalIntent(ctx)) return false;
232
+ if (isEmbeddedApprovedPlanIntent(ctx)) return false;
233
+ if (isPlanShapedMarkdownIntent(ctx)) return false;
234
+ if (promptHasExplicitExecutionCommandLine(ctx)) return false;
235
+ return RETRO_VERB.test(ctx.text) && RETRO_DONE.test(ctx.text) && RETRO_EVIDENCE.test(ctx.text);
236
+ }
237
+
238
+ export function isNextSliceOrStatusAdvisoryIntent(ctx: PromptIntentContext): boolean {
239
+ if (isExecutionApprovalIntent(ctx)) return false;
240
+ if (isEmbeddedApprovedPlanIntent(ctx)) return false;
241
+ if (isPlanShapedMarkdownIntent(ctx)) return false;
242
+ if (promptHasExplicitExecutionCommandLine(ctx)) return false;
243
+
244
+ if (re('(下一刀.*(plan|think|方案|计划)|(plan|think|方案|计划).*下一刀)').test(ctx.firstLine)) {
245
+ return true;
246
+ }
247
+
248
+ if (
249
+ re(String.raw`(^|${SP})下一刀(${SP}|$)`).test(ctx.text) &&
250
+ ctx.text.includes('建议切') &&
251
+ ctx.text.includes('理由是') &&
252
+ ctx.text.includes('入口是')
253
+ ) {
254
+ return true;
255
+ }
256
+
257
+ if (
258
+ re(String.raw`^\s*P1\s*$`).test(ctx.text) &&
259
+ re(String.raw`^\s*P2\s*$`).test(ctx.text) &&
260
+ re(String.raw`^\s*P3\s*$`).test(ctx.text) &&
261
+ re(String.raw`(验证结果|已在.*worktree.*完成实现|worktree.*完成实现|未提交|未[\s-]*merge)`).test(ctx.text)
262
+ ) {
263
+ return true;
264
+ }
265
+
266
+ return false;
267
+ }
268
+
269
+ const IMPLEMENT_VERB = re('(implement|execute|build it|do it|go ahead|proceed|ship it|实现|执行|开始写|动手|开干)');
270
+
271
+ export function isImplementIntent(ctx: PromptIntentContext): boolean {
272
+ if (isTriggerQuestionPrompt(ctx)) return false;
273
+ if (isRetrospectiveCompletionReportIntent(ctx)) return false;
274
+ if (isNextSliceOrStatusAdvisoryIntent(ctx)) return false;
275
+ if (isPlanConsultationIntent(ctx)) return false;
276
+ if (isPlanDiscussionContinuationIntent(ctx)) return false;
277
+ if (isPlanRefinementIntent(ctx)) return false;
278
+ if (isDiagnosticQuestionIntent(ctx)) return false;
279
+ if (isReviewReleaseAdvisoryIntent(ctx)) return false;
280
+ if (isPassiveWorktreeStatusIntent(ctx)) return false;
281
+ return (
282
+ IMPLEMENT_VERB.test(ctx.text) ||
283
+ isExecutionApprovalIntent(ctx) ||
284
+ isEmbeddedApprovedPlanIntent(ctx) ||
285
+ isPlanShapedMarkdownIntent(ctx)
286
+ );
287
+ }
288
+
289
+ const DONE_FIRST_LINE = re(
290
+ String.raw`^${SP}*(/done|/complete|/finish|done\.?|mark\s+(it\s+|this\s+)?(as\s+)?done|task\s+(is\s+)?(done|complete|completed|finished)|all\s+done|wrap\s+(it\s+)?up|完成(了|啦|吧|!|。)?|结束(吧|!|。)?|可以收工|收工(了|吧)?|宣布完成|工作完成)${SP}*$`,
291
+ );
292
+ const DONE_SHORT_EN = re(
293
+ String.raw`(^|${SP})(done|complete|completed|finished|mark\s+done)(${SP}|$)`,
294
+ );
295
+ const DONE_SHORT_ZH = re(
296
+ String.raw`(^|[\s\p{P}\p{S}])(任务完成了?|完成(了|啦|吧)?|已完成|本轮完成|这刀完成|收尾完成|结束吧|结束任务|可以收工|收工(了|吧)?|宣布完成|工作完成)([\s\p{P}\p{S}]|$)`,
297
+ );
298
+
299
+ export function isDoneIntent(ctx: PromptIntentContext): boolean {
300
+ if (isPlanRefinementIntent(ctx)) return false;
301
+
302
+ // Long markdown / plan-shaped prompts often contain literal "Completed" /
303
+ // "Done" tokens as state-enum values. Those are not a user declaration that
304
+ // the work is done: long or plan-shaped prompts must declare done in the
305
+ // first non-blank line via an explicit completion phrase.
306
+ if (isPlanShapedMarkdownIntent(ctx) || isEmbeddedApprovedPlanIntent(ctx)) {
307
+ return DONE_FIRST_LINE.test(ctx.firstLine);
308
+ }
309
+
310
+ if (Buffer.byteLength(ctx.text, 'utf8') >= 280) {
311
+ return DONE_FIRST_LINE.test(ctx.firstLine);
312
+ }
313
+
314
+ // Short prompts: require token boundaries / explicit completion phrases so
315
+ // task instructions such as `完成后验证` do not close the active contract.
316
+ if (DONE_SHORT_EN.test(ctx.text)) return true;
317
+ return DONE_SHORT_ZH.test(ctx.text);
318
+ }
319
+
320
+ export type DoneOutcome = 'Completed' | 'Abandoned' | 'Superseded';
321
+
322
+ export function deriveDoneOutcome(ctx: PromptIntentContext): DoneOutcome {
323
+ if (re('(abandon(ed)?|drop( it)?|放弃|不做了|算了|作废|不要了|废弃)').test(ctx.text)) {
324
+ return 'Abandoned';
325
+ }
326
+ if (re('(supersed(ed|e)|replaced by|被.*取代|被.*替代|改用新方案|换方案)').test(ctx.text)) {
327
+ return 'Superseded';
328
+ }
329
+ return 'Completed';
330
+ }
331
+
332
+ export function isSpaDayIntent(ctx: PromptIntentContext): boolean {
333
+ return re('(spa day|audit rules|consolidate|cleanup rules|规则清理|规则审计|合并规则|瘦身)').test(ctx.text);
334
+ }
335
+
336
+ const PLAN_CREATION = re(
337
+ '(new plan|create plan|write plan|draft plan|新建计划|创建计划|写计划|制定计划|补计划)',
338
+ );
339
+
340
+ export function isPlanCreationIntent(ctx: PromptIntentContext): boolean {
341
+ if (isPlanDiscussionContinuationIntent(ctx)) return false;
342
+ if (isPlanRefinementIntent(ctx)) return false;
343
+ if (isDiagnosticQuestionIntent(ctx)) return false;
344
+ if (isPlanConsultationIntent(ctx)) return false;
345
+ return PLAN_CREATION.test(ctx.text);
346
+ }
347
+
348
+ const BUG_OR_HUNT = re(
349
+ '(fix|patch|bug|error|crash|broken|regression|报错|崩溃|修复|不工作|跑不通|为什么.*错|排查|查查|定位问题|debug)',
350
+ );
351
+
352
+ export function isBugOrHuntIntent(ctx: PromptIntentContext): boolean {
353
+ return BUG_OR_HUNT.test(ctx.text);
354
+ }
355
+
356
+ // Precise bug-FIX classifier for the TDD advisory. isBugOrHuntIntent stays
357
+ // deliberately broad because it is only used as an exclusion; this one is a
358
+ // positive trigger, so a bare "bug" substring (找出Bug, review for bugs,
359
+ // prefix, fixture) must NOT fire. Requires an explicit fix verb or a
360
+ // breakage report.
361
+ const FIX_VERB_EN = re(
362
+ String.raw`(^|[^A-Za-z])(fix(es|ed|ing)?|patch(es|ed|ing)?|hotfix)([^A-Za-z]|$)|bug[\s_-]?fix`,
363
+ );
364
+ const FIX_VERB_ZH = re(
365
+ '修复|修一下|修个|修掉|修好|修不好|反复修|修bug|修 bug|改bug|改 bug|解决.{0,24}(bug|缺陷|报错|崩溃)',
366
+ );
367
+ const BREAKAGE_REPORT = re(
368
+ String.raw`(报错|崩溃|闪退|跑不通|不工作|坏了|挂了|crash(es|ed|ing)?|broken|stack\s?trace|regression|used to work|no longer works|stopped working)`,
369
+ );
370
+
371
+ export function isBugFixIntent(ctx: PromptIntentContext): boolean {
372
+ if (FIX_VERB_EN.test(ctx.text)) return true;
373
+ if (FIX_VERB_ZH.test(ctx.text)) return true;
374
+ return BREAKAGE_REPORT.test(ctx.text);
375
+ }
376
+
377
+ const PLAIN_FEATURE = re(
378
+ String.raw`(new feature|feature request|add (a )?(new )?feature|build (a|an|the)\s.*(page|screen|feature|component|module|tool|dashboard|api|endpoint|flow|app)|create (a|an|the)\s.*(page|screen|feature|component|module|tool|dashboard|api|endpoint|flow|app)|开发新功能|开发.*功能|新增功能|新功能|加.*功能|做(一个|个).*(页|页面|功能|模块|工具|组件|接口|应用|系统|面板|流程)|搭(一个|个).*(页|页面|功能|模块|工具|组件|接口|应用|系统|面板|流程)|写(一个|个).*(页|页面|功能|模块|工具|组件|接口|脚本|应用|系统|面板|流程))`,
379
+ );
380
+
381
+ export function isPlainFeaturePlanStartIntent(ctx: PromptIntentContext): boolean {
382
+ if (isTriggerQuestionPrompt(ctx)) return false;
383
+ if (isPlanDiscussionContinuationIntent(ctx)) return false;
384
+ if (isPlanRefinementIntent(ctx)) return false;
385
+ if (isDiagnosticQuestionIntent(ctx)) return false;
386
+ if (isPlanConsultationIntent(ctx)) return false;
387
+ if (isBugOrHuntIntent(ctx)) return false;
388
+ if (isExecutionApprovalIntent(ctx)) return false;
389
+ return PLAIN_FEATURE.test(ctx.text);
390
+ }
391
+
392
+ const THINK_COMMAND = re(String.raw`^${SP}*(/think|[$]think|\[[$]think\])`);
393
+ const THINK_PLAN_PHRASE = re(
394
+ '(plan this|plan it|how should i|how should we|出方案|给方案|怎么设计|用什么方案|制定计划|写计划|新建计划|创建计划)',
395
+ );
396
+
397
+ export function isThinkPlanStartIntent(ctx: PromptIntentContext): boolean {
398
+ if (isPlanDiscussionContinuationIntent(ctx)) return false;
399
+ if (isPlanRefinementIntent(ctx)) return false;
400
+ if (isDiagnosticQuestionIntent(ctx)) return false;
401
+ if (isBugOrHuntIntent(ctx)) return false;
402
+ if (THINK_COMMAND.test(ctx.text)) return true;
403
+ if (isPlanConsultationIntent(ctx)) return false;
404
+ return THINK_PLAN_PHRASE.test(ctx.text) || isPlainFeaturePlanStartIntent(ctx);
405
+ }
406
+
407
+ export function normalizePlanSlug(value: string): string {
408
+ return value
409
+ .toLowerCase()
410
+ .replace(/[^a-z0-9]+/g, '-')
411
+ .replace(/^-+/, '')
412
+ .replace(/-+$/, '')
413
+ .replace(/-{2,}/g, '-');
414
+ }
415
+
416
+ export function derivePlanStartTitle(ctx: PromptIntentContext): string {
417
+ let title = ctx.text
418
+ .replace(/[\r\n]/g, ' ')
419
+ .replace(/\[\$think\]\([^)]*\)/g, 'think')
420
+ .replace(/\$think/g, 'think')
421
+ .replace(/\/think/g, 'think')
422
+ .replace(/\s+/g, ' ')
423
+ .replace(new RegExp(`^${SP}+`, 'u'), '')
424
+ .trim();
425
+ if (title.length === 0) title = 'Planning Session';
426
+ return Array.from(title).slice(0, 96).join('');
427
+ }
428
+
429
+ export function derivePlanStartSlug(ctx: PromptIntentContext, now: Date = new Date()): string {
430
+ const title = derivePlanStartTitle(ctx);
431
+ let slug = normalizePlanSlug(title);
432
+ if (slug === '' || slug === 'think' || slug === 'plan') {
433
+ const hms = [now.getHours(), now.getMinutes(), now.getSeconds()]
434
+ .map((n) => String(n).padStart(2, '0'))
435
+ .join('');
436
+ slug = isPlainFeaturePlanStartIntent(ctx) ? `feature-plan-${hms}` : `think-plan-${hms}`;
437
+ }
438
+ return Array.from(slug).slice(0, 64).join('').replace(/-+$/, '');
439
+ }
440
+
441
+ export type PendingOrchestrationKind =
442
+ | 'waza-think'
443
+ | 'dynamic-workflow'
444
+ | 'codex-plan'
445
+ | 'forge-plan';
446
+
447
+ export function derivePendingOrchestrationKind(ctx: PromptIntentContext): PendingOrchestrationKind {
448
+ if (re(String.raw`(/think|[$]think|\[[$]think\]|waza[\s/-]*think)`).test(ctx.text)) {
449
+ return 'waza-think';
450
+ }
451
+ if (re(String.raw`dynamic[\s-]*workflow|workflow`).test(ctx.text)) {
452
+ return 'dynamic-workflow';
453
+ }
454
+ if (re(String.raw`codex[\s-]*plan`).test(ctx.text)) {
455
+ return 'codex-plan';
456
+ }
457
+ return 'forge-plan';
458
+ }
459
+
460
+ const AGENTIC_PACKAGING = re(
461
+ String.raw`(repeated workflow|reusable workflow|workflow packaging|package into (a )?skill|make this (a )?skill|subagent or automation|skill or automation|skill/subagent/automation|重复(手工)?工作|重复工作流|做成\s*(skill|subagent|automation)|包装成(skill|subagent|automation|技能|自动化)|抽象成(skill|subagent|automation|技能|自动化)|沉淀成(工作流|skill|技能|自动化)|做成\s*(hook|钩子).*触发|触发用户授权.*(plan|计划|方案))`,
462
+ );
463
+
464
+ export function isAgenticPackagingIntent(ctx: PromptIntentContext): boolean {
465
+ return AGENTIC_PACKAGING.test(ctx.text);
466
+ }
467
+
468
+ const CODEGRAPH_ROUTE = re(
469
+ String.raw`(who calls|what calls|callers|callees|impact|impact radius|trace\s+(flow|path|call)|where\s.*(defined|definition)|definition of|symbol named|调用关系|谁调用|调用了谁|哪里定义|定义在哪|影响面|调用链|追踪(路径|调用|链)|从.*到.*怎么走)`,
470
+ );
471
+
472
+ export function isCodegraphRouteIntent(ctx: PromptIntentContext): boolean {
473
+ if (isTriggerQuestionPrompt(ctx)) return false;
474
+ return CODEGRAPH_ROUTE.test(ctx.text);
475
+ }
476
+
477
+ const GIT_STATUS_LINE = re(
478
+ String.raw`^${SP}*(git\s+(status|log|show|diff|push|pull|commit)|status|commit|push|merge|提交|推送|合并|看状态|看看状态)(${SP}|$)`,
479
+ );
480
+ const STRUCTURAL_TOPIC = re(
481
+ '(architecture|architectural|runtime|hook|hooks|shared contract|workflow contract|module boundary|route registry|multi[- ]?file|refactor|dependency path|架构|运行时|钩子|共享合约|工作流合约|模块边界|路由表|多文件|重构|依赖路径)',
482
+ );
483
+
484
+ export function isNontrivialCodeTaskIntent(ctx: PromptIntentContext): boolean {
485
+ if (isTriggerQuestionPrompt(ctx)) return false;
486
+ if (isPlanDiscussionContinuationIntent(ctx)) return false;
487
+ if (isPlanRefinementIntent(ctx)) return false;
488
+ if (isReviewReleaseAdvisoryIntent(ctx)) return false;
489
+ if (isDiagnosticQuestionIntent(ctx) && !isBugOrHuntIntent(ctx)) return false;
490
+ if (GIT_STATUS_LINE.test(ctx.firstLine)) return false;
491
+ if (isBugOrHuntIntent(ctx) || isPlainFeaturePlanStartIntent(ctx) || isImplementIntent(ctx)) {
492
+ return true;
493
+ }
494
+ return STRUCTURAL_TOPIC.test(ctx.text);
495
+ }
496
+
497
+ // /health needs a health/audit/diagnostic VERB and a tooling NOUN. A bare
498
+ // tooling noun ("review the hook framework") must not misroute review intent
499
+ // to /health; reviews fall through to /check.
500
+ const HEALTH_VERB = re(
501
+ String.raw`(健康度|健康检查|体检|诊断|环境检查|配置检查|检查.{0,24}(配置|环境|工具链|钩子|hook|健康)|审计.{0,24}(配置|环境|工具链|钩子|hook|agent)|health\s?check|tooling\s+check|audit.{0,40}(setup|tooling|config|environment)|为什么|为啥|怎么回事|不工作|没生效|没触发|被拦|拦截|not firing|why)`,
502
+ );
503
+ const HEALTH_NOUN = re(
504
+ String.raw`(agent|agents|codex|claude|hook|hooks|workflow|tooling|config|AGENTS\.md|CLAUDE\.md|钩子|工作流|技能配置|配置|环境|工具链|AI coding|agent instructions)`,
505
+ );
506
+
507
+ export function isHealthRouteIntent(ctx: PromptIntentContext): boolean {
508
+ return HEALTH_VERB.test(ctx.text) && HEALTH_NOUN.test(ctx.text);
509
+ }
510
+
511
+ const BDD_FEATURE = re('(new feature|feature|implement|build|新功能|实现|开发功能|执行)');
512
+
513
+ function passiveOrAdvisoryExclusion(ctx: PromptIntentContext): boolean {
514
+ return (
515
+ isDiagnosticQuestionIntent(ctx) ||
516
+ isPlanConsultationIntent(ctx) ||
517
+ isReviewReleaseAdvisoryIntent(ctx) ||
518
+ isPassiveWorktreeStatusIntent(ctx) ||
519
+ isNextSliceOrStatusAdvisoryIntent(ctx) ||
520
+ isRetrospectiveCompletionReportIntent(ctx)
521
+ );
522
+ }
523
+
524
+ /** TDD bug-fix advisory with diagnostic/review/consultation exclusions applied. */
525
+ export function shouldEmitTddBugFixAdvice(ctx: PromptIntentContext): boolean {
526
+ if (passiveOrAdvisoryExclusion(ctx)) return false;
527
+ return isBugFixIntent(ctx);
528
+ }
529
+
530
+ /** BDD feature advisory with the same exclusions; matches the raw prompt like the shell did. */
531
+ export function shouldEmitBddFeatureAdvice(ctx: PromptIntentContext): boolean {
532
+ if (passiveOrAdvisoryExclusion(ctx)) return false;
533
+ return BDD_FEATURE.test(ctx.raw);
534
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Route registry — single source of truth for hook events × routes × scripts.
3
+ *
4
+ * The (event, route-id, matcher) tuple is the **public contract** that host
5
+ * adapters (`~/.codex/hooks.json`, `~/.claude/settings.json`) bind to. Script
6
+ * names are an internal implementation detail — Phase 2 sealed hooks will
7
+ * replace them with bundled implementations without changing the tuple.
8
+ *
9
+ * Derived from `.codex/hooks.json` reality verified Phase 0 canary
10
+ * 2026-05-28 (see docs/architecture/global-hook-runtime.md and Codex consult
11
+ * session 019e6df7-e7c9-70e2-8872-db9869420bd0). The matcher dimension was
12
+ * the missing piece in the X (event-only) design — see
13
+ * tasks/notes/hook-global-runtime.notes.md § Phase 1B Design Pivot.
14
+ *
15
+ * Order matters: it is the stable adapter entry order. Codex hashes adapter
16
+ * entries by `(absolute-path, event-snake, i, j)`, so any reordering re-prompts
17
+ * trust (verified Phase 0 Trust UX § Confirmed).
18
+ */
19
+
20
+ export type HookEvent =
21
+ | 'SessionStart'
22
+ | 'PreToolUse'
23
+ | 'PostToolUse'
24
+ | 'UserPromptSubmit'
25
+ | 'Stop';
26
+
27
+ /** Stable route id within an event. Public contract — never rename without coordinated adapter migration. */
28
+ export type RouteId = 'default' | 'edit' | 'subagent' | 'bash' | 'always';
29
+
30
+ export interface Route {
31
+ readonly event: HookEvent;
32
+ readonly routeId: RouteId;
33
+ /**
34
+ * Tool matcher written to host adapter `matcher` field. Undefined means
35
+ * no matcher — fires for all tools at this event.
36
+ */
37
+ readonly matcher?: string;
38
+ /** Repo-local `.ai/hooks/<script>` names, in execution order. */
39
+ readonly scripts: readonly string[];
40
+ }
41
+
42
+ export const ROUTES: readonly Route[] = Object.freeze([
43
+ Object.freeze({
44
+ event: 'SessionStart' as const,
45
+ routeId: 'default' as const,
46
+ scripts: Object.freeze(['session-start-context.sh', 'security-sentinel.sh']),
47
+ }),
48
+ Object.freeze({
49
+ event: 'PreToolUse' as const,
50
+ routeId: 'edit' as const,
51
+ matcher: 'Edit|Write',
52
+ scripts: Object.freeze(['worktree-guard.sh', 'pre-edit-guard.sh']),
53
+ }),
54
+ Object.freeze({
55
+ event: 'PreToolUse' as const,
56
+ routeId: 'subagent' as const,
57
+ matcher: 'Task|Agent|SendUserMessage',
58
+ scripts: Object.freeze(['subagent-return-channel-guard.sh']),
59
+ }),
60
+ Object.freeze({
61
+ event: 'PostToolUse' as const,
62
+ routeId: 'edit' as const,
63
+ matcher: 'Edit|Write',
64
+ scripts: Object.freeze(['post-edit-guard.sh']),
65
+ }),
66
+ Object.freeze({
67
+ event: 'PostToolUse' as const,
68
+ routeId: 'bash' as const,
69
+ matcher: 'Bash',
70
+ scripts: Object.freeze(['post-bash.sh']),
71
+ }),
72
+ Object.freeze({
73
+ event: 'PostToolUse' as const,
74
+ routeId: 'always' as const,
75
+ scripts: Object.freeze(['post-tool-observer.sh']),
76
+ }),
77
+ Object.freeze({
78
+ event: 'UserPromptSubmit' as const,
79
+ routeId: 'default' as const,
80
+ scripts: Object.freeze(['prompt-guard.sh']),
81
+ }),
82
+ Object.freeze({
83
+ event: 'Stop' as const,
84
+ routeId: 'default' as const,
85
+ scripts: Object.freeze(['stop-orchestrator.sh']),
86
+ }),
87
+ ]);
88
+
89
+ export function getRoute(event: HookEvent, routeId: RouteId): Route | undefined {
90
+ return ROUTES.find((r) => r.event === event && r.routeId === routeId);
91
+ }
92
+
93
+ export function listRoutesForEvent(event: HookEvent): readonly Route[] {
94
+ return ROUTES.filter((r) => r.event === event);
95
+ }
96
+
97
+ export function allEvents(): readonly HookEvent[] {
98
+ const seen = new Set<HookEvent>();
99
+ const out: HookEvent[] = [];
100
+ for (const r of ROUTES) {
101
+ if (!seen.has(r.event)) {
102
+ seen.add(r.event);
103
+ out.push(r.event);
104
+ }
105
+ }
106
+ return out;
107
+ }