@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,1077 @@
1
+ #!/bin/bash
2
+ # Prompt Guard Hook — UserPromptSubmit
3
+ # Shell layer: filesystem authority (plan/contract/worktree state), capture
4
+ # side effects, and host-safe rendering. All prompt-text intent classification
5
+ # lives in the TypeScript engine behind `prompt-guard-decide`, which receives
6
+ # {"prompt": ...} on stdin plus PROMPT_GUARD_*_STATE env vars and returns a
7
+ # single-line verdict JSON (action + intent facts + derived strings).
8
+ #
9
+ # Prompt-layer plan/spec/contract gates are advisory: they explain the next
10
+ # workflow step and exit 0. PreToolUse keeps path/scope and private-surface
11
+ # safety authoritative while plan-state guidance defaults to advisory.
12
+ # Done-claim gates stay blocking only when they verify real failed or missing
13
+ # evidence rather than workflow ceremony.
14
+
15
+ set -eo pipefail
16
+
17
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
18
+ # shellcheck source=/dev/null
19
+ . "$SCRIPT_DIR/hook-input.sh"
20
+ # shellcheck source=/dev/null
21
+ . "$SCRIPT_DIR/lib/workflow-state.sh"
22
+ # shellcheck source=/dev/null
23
+ . "$SCRIPT_DIR/lib/session-state.sh"
24
+
25
+ # --- Filesystem/worktree helpers (shell-owned authority) ---
26
+
27
+ prompt_matches_worktree_record() {
28
+ local worktree_path="$1"
29
+ local branch_name="$2"
30
+ local path_base
31
+
32
+ [[ -n "$worktree_path" ]] || return 1
33
+ if printf '%s' "$PROMPT_INTENT_TEXT" | grep -Fq "$worktree_path"; then
34
+ return 0
35
+ fi
36
+
37
+ path_base="$(basename "$worktree_path")"
38
+ if [[ -n "$path_base" ]] && printf '%s' "$PROMPT_INTENT_TEXT" | grep -Fq "$path_base"; then
39
+ return 0
40
+ fi
41
+
42
+ if [[ -n "$branch_name" ]] && printf '%s' "$PROMPT_INTENT_TEXT" | grep -Fq "$branch_name"; then
43
+ return 0
44
+ fi
45
+
46
+ return 1
47
+ }
48
+
49
+ prompt_linked_worktree_target() {
50
+ git rev-parse --is-inside-work-tree >/dev/null 2>&1 || return 1
51
+ git worktree list --porcelain >/dev/null 2>&1 || return 1
52
+
53
+ local current worktree_path branch_name line real_path active_plan
54
+ current="$(pwd -P)"
55
+ worktree_path=""
56
+ branch_name=""
57
+
58
+ while IFS= read -r line || [[ -n "$line" ]]; do
59
+ if [[ -z "$line" ]]; then
60
+ if [[ -n "$worktree_path" ]]; then
61
+ real_path="$(cd "$worktree_path" 2>/dev/null && pwd -P || true)"
62
+ active_plan="$(cat "$worktree_path/.ai/harness/active-plan" 2>/dev/null | xargs || true)"
63
+ if [[ -n "$real_path" && "$real_path" != "$current" ]] \
64
+ && [[ -n "$active_plan" && -f "$worktree_path/$active_plan" ]] \
65
+ && prompt_matches_worktree_record "$worktree_path" "$branch_name"; then
66
+ printf '%s' "$worktree_path"
67
+ return 0
68
+ fi
69
+ fi
70
+ worktree_path=""
71
+ branch_name=""
72
+ continue
73
+ fi
74
+
75
+ case "$line" in
76
+ worktree\ *)
77
+ worktree_path="${line#worktree }"
78
+ ;;
79
+ branch\ *)
80
+ branch_name="${line#branch }"
81
+ branch_name="${branch_name#refs/heads/}"
82
+ ;;
83
+ esac
84
+ done < <(git worktree list --porcelain 2>/dev/null || true)
85
+
86
+ if [[ -n "$worktree_path" ]]; then
87
+ real_path="$(cd "$worktree_path" 2>/dev/null && pwd -P || true)"
88
+ active_plan="$(cat "$worktree_path/.ai/harness/active-plan" 2>/dev/null | xargs || true)"
89
+ if [[ -n "$real_path" && "$real_path" != "$current" ]] \
90
+ && [[ -n "$active_plan" && -f "$worktree_path/$active_plan" ]] \
91
+ && prompt_matches_worktree_record "$worktree_path" "$branch_name"; then
92
+ printf '%s' "$worktree_path"
93
+ return 0
94
+ fi
95
+ fi
96
+
97
+ return 1
98
+ }
99
+
100
+ active_plan_marker_problem() {
101
+ local marker_file marker_plan owner current
102
+
103
+ current="$(pwd -P)"
104
+ if [[ -f "$ACTIVE_WORKTREE_MARKER" ]]; then
105
+ owner="$(cat "$ACTIVE_WORKTREE_MARKER" 2>/dev/null | xargs)"
106
+ if [[ -n "$owner" && "$owner" != "$current" ]]; then
107
+ printf 'active plan marker belongs to a different worktree: %s' "$owner"
108
+ return 0
109
+ fi
110
+ fi
111
+
112
+ for marker_file in "$ACTIVE_PLAN_MARKER" "$LEGACY_ACTIVE_PLAN_MARKER"; do
113
+ [[ -f "$marker_file" ]] || continue
114
+ marker_plan="$(cat "$marker_file" 2>/dev/null | xargs)"
115
+ if [[ -n "$marker_plan" && ! -f "$marker_plan" ]]; then
116
+ printf 'stale active plan marker points to missing plan: %s' "$marker_plan"
117
+ return 0
118
+ fi
119
+ done
120
+
121
+ return 1
122
+ }
123
+
124
+ plan_evidence_contract_error() {
125
+ local file="$1"
126
+ local section=""
127
+ local missing=0
128
+
129
+ section="$(awk '
130
+ BEGIN { in_section = 0 }
131
+ /^## Evidence Contract[[:space:]]*$/ { in_section = 1; next }
132
+ in_section && /^## / { exit }
133
+ in_section { print }
134
+ ' "$file")"
135
+
136
+ if [[ -z "$(printf '%s' "$section" | tr -d '[:space:]')" ]]; then
137
+ echo "missing ## Evidence Contract section"
138
+ return 1
139
+ fi
140
+
141
+ local label line value
142
+ for label in "State/progress path" "Verification evidence" "Evaluator rubric" "Stop condition" "Rollback surface"; do
143
+ line="$(printf '%s\n' "$section" | grep -Ei "^[[:space:]]*-[[:space:]]*(\\*\\*)?${label}(\\*\\*)?[[:space:]]*:" | head -1 || true)"
144
+ if [[ -z "$line" ]]; then
145
+ echo "missing field: ${label}"
146
+ missing=1
147
+ continue
148
+ fi
149
+
150
+ value="${line#*:}"
151
+ value="$(printf '%s' "$value" | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')"
152
+ if [[ -z "$value" ]] || printf '%s' "$value" | grep -Eiq '^(tbd|todo|n/a|none|unknown|\.\.\.)$'; then
153
+ echo "field has no concrete value: ${label}"
154
+ missing=1
155
+ fi
156
+ done
157
+
158
+ [[ "$missing" -eq 0 ]]
159
+ }
160
+
161
+ # Strip host-injected context blocks so worktree matching sees the user's
162
+ # words. The TypeScript engine performs the same strip for classification.
163
+ strip_prompt_context_blocks() {
164
+ awk '
165
+ /^[[:space:]]*<(skill|environment_context|INSTRUCTIONS|system|developer|app-context|collaboration_mode|apps_instructions|skills_instructions|plugins_instructions)[^>]*>[[:space:]]*$/ {
166
+ skip = 1
167
+ next
168
+ }
169
+ /^[[:space:]]*<\/(skill|environment_context|INSTRUCTIONS|system|developer|app-context|collaboration_mode|apps_instructions|skills_instructions|plugins_instructions)>[[:space:]]*$/ {
170
+ skip = 0
171
+ next
172
+ }
173
+ skip { next }
174
+ { print }
175
+ '
176
+ }
177
+
178
+ prompt_intent_text() {
179
+ local stripped
180
+ stripped="$(printf '%s\n' "$PROMPT_TEXT" | strip_prompt_context_blocks | sed -E '/^[[:space:]]*$/d')"
181
+ if [[ -n "$(printf '%s' "$stripped" | tr -d '[:space:]')" ]]; then
182
+ printf '%s' "$stripped"
183
+ else
184
+ printf '%s' "$PROMPT_TEXT"
185
+ fi
186
+ }
187
+
188
+ # --- Decision engine invocation ---
189
+
190
+ prompt_guard_decision_command() {
191
+ local source_cli source_hook_cli
192
+ source_cli="$(cd "$SCRIPT_DIR/../.." 2>/dev/null && pwd)/src/cli/index.ts"
193
+ source_hook_cli="$(cd "$SCRIPT_DIR/../.." 2>/dev/null && pwd)/src/cli/hook-entry.ts"
194
+
195
+ if [[ -n "${FORGE_HOOK_CLI:-}" && -f "${FORGE_HOOK_CLI:-}" ]] && command -v bun >/dev/null 2>&1; then
196
+ bun "$FORGE_HOOK_CLI" prompt-guard-decide
197
+ return $?
198
+ fi
199
+
200
+ if [[ -n "${FORGE_CLI:-}" && -f "${FORGE_CLI:-}" ]] && command -v bun >/dev/null 2>&1; then
201
+ bun "$FORGE_CLI" prompt-guard-decide
202
+ return $?
203
+ fi
204
+
205
+ if [[ -f "$source_hook_cli" ]] && command -v bun >/dev/null 2>&1; then
206
+ bun "$source_hook_cli" prompt-guard-decide
207
+ return $?
208
+ fi
209
+
210
+ if [[ -n "${HOOK_REPO_ROOT:-}" && -f "$HOOK_REPO_ROOT/src/cli/hook-entry.ts" ]] && command -v bun >/dev/null 2>&1; then
211
+ bun "$HOOK_REPO_ROOT/src/cli/hook-entry.ts" prompt-guard-decide
212
+ return $?
213
+ fi
214
+
215
+ if command -v forge-hook >/dev/null 2>&1; then
216
+ forge-hook prompt-guard-decide
217
+ return $?
218
+ fi
219
+
220
+ if command -v forge >/dev/null 2>&1; then
221
+ forge prompt-guard-decide
222
+ return $?
223
+ fi
224
+
225
+ if [[ -f "$source_cli" ]] && command -v bun >/dev/null 2>&1; then
226
+ bun "$source_cli" prompt-guard-decide
227
+ return $?
228
+ fi
229
+
230
+ return 127
231
+ }
232
+
233
+ prompt_guard_refresh_state() {
234
+ prompt_guard_spec_state="missing"
235
+ prompt_guard_plan_state="none"
236
+ prompt_guard_pending_state="none"
237
+ prompt_guard_worktree_state="current"
238
+ prompt_guard_contract_state="missing"
239
+ prompt_guard_contract_path_state="missing"
240
+ prompt_guard_evidence_state="unchecked"
241
+
242
+ active_plan=""
243
+ plan_status=""
244
+ marker_problem=""
245
+ linked_worktree=""
246
+ contract_file=""
247
+ evidence_error=""
248
+
249
+ if [ -f "docs/spec.md" ]; then
250
+ prompt_guard_spec_state="present"
251
+ fi
252
+
253
+ active_plan="$(get_active_plan || true)"
254
+ if [ -n "$active_plan" ] && [ -f "$active_plan" ]; then
255
+ plan_status="$(get_plan_status "$active_plan")"
256
+ case "$plan_status" in
257
+ Draft) prompt_guard_plan_state="draft" ;;
258
+ Annotating) prompt_guard_plan_state="annotating" ;;
259
+ Approved) prompt_guard_plan_state="approved" ;;
260
+ Executing) prompt_guard_plan_state="executing" ;;
261
+ *) prompt_guard_plan_state="unknown" ;;
262
+ esac
263
+
264
+ if [ -n "$(derive_contract_path "$active_plan" || true)" ]; then
265
+ prompt_guard_contract_path_state="present"
266
+ fi
267
+
268
+ if ! evidence_error="$(plan_evidence_contract_error "$active_plan")"; then
269
+ prompt_guard_evidence_state="incomplete"
270
+ else
271
+ prompt_guard_evidence_state="complete"
272
+ fi
273
+ else
274
+ marker_problem="$(active_plan_marker_problem || true)"
275
+ if [[ "$marker_problem" == *"different worktree"* ]]; then
276
+ prompt_guard_plan_state="foreign_worktree"
277
+ prompt_guard_worktree_state="foreign_marker"
278
+ elif [[ -n "$marker_problem" ]]; then
279
+ prompt_guard_plan_state="stale_marker"
280
+ fi
281
+ fi
282
+
283
+ if workflow_pending_orchestration_is_fresh; then
284
+ prompt_guard_pending_state="fresh"
285
+ elif [ -s "$(workflow_pending_orchestration_file)" ]; then
286
+ prompt_guard_pending_state="stale"
287
+ fi
288
+
289
+ linked_worktree="$(prompt_linked_worktree_target || true)"
290
+ if [[ -n "$linked_worktree" ]]; then
291
+ prompt_guard_worktree_state="linked_target"
292
+ fi
293
+
294
+ contract_file="$(workflow_active_contract || true)"
295
+ if [[ -n "$contract_file" && -f "$contract_file" ]]; then
296
+ prompt_guard_contract_state="present"
297
+ fi
298
+
299
+ export PROMPT_GUARD_SPEC_STATE="$prompt_guard_spec_state"
300
+ export PROMPT_GUARD_PLAN_STATE="$prompt_guard_plan_state"
301
+ export PROMPT_GUARD_PENDING_STATE="$prompt_guard_pending_state"
302
+ export PROMPT_GUARD_WORKTREE_STATE="$prompt_guard_worktree_state"
303
+ export PROMPT_GUARD_CONTRACT_STATE="$prompt_guard_contract_state"
304
+ export PROMPT_GUARD_CONTRACT_PATH_STATE="$prompt_guard_contract_path_state"
305
+ export PROMPT_GUARD_EVIDENCE_STATE="$prompt_guard_evidence_state"
306
+ }
307
+
308
+ # PG_ENGINE_STATE: ok | unavailable (no runtime) | legacy (CLI predates the
309
+ # prompt protocol). Both degraded states fall back to advisory-only handling.
310
+ PG_ENGINE_STATE="ok"
311
+
312
+ prompt_guard_engine_parse() {
313
+ local verdict="$1"
314
+ local key value tsv
315
+
316
+ # Values are tab-free by construction (the engine collapses title
317
+ # whitespace), so KEY<TAB>VALUE lines assign safely without eval.
318
+ if command -v jq >/dev/null 2>&1; then
319
+ tsv="$(printf '%s' "$verdict" | jq -r '
320
+ ["PG_ACTION", .action],
321
+ ["PG_INTENT", .intent],
322
+ ["PG_DONE_OUTCOME", .derived.done_outcome],
323
+ ["PG_PLAN_START_TITLE", .derived.plan_start_title],
324
+ ["PG_PLAN_START_SLUG", .derived.plan_start_slug],
325
+ ["PG_PENDING_KIND", .derived.pending_kind],
326
+ (.facts | to_entries[] | ["PG_FACT_" + (.key|ascii_upcase), (.value|tostring)])
327
+ | @tsv
328
+ ')"
329
+ else
330
+ # The verdict only exists when a bun-backed CLI ran, so bun is available.
331
+ tsv="$(VERDICT_JSON="$verdict" bun -e '
332
+ const v = JSON.parse(process.env.VERDICT_JSON ?? "{}");
333
+ const rows = [
334
+ ["PG_ACTION", v.action],
335
+ ["PG_INTENT", v.intent],
336
+ ["PG_DONE_OUTCOME", v.derived.done_outcome],
337
+ ["PG_PLAN_START_TITLE", v.derived.plan_start_title],
338
+ ["PG_PLAN_START_SLUG", v.derived.plan_start_slug],
339
+ ["PG_PENDING_KIND", v.derived.pending_kind],
340
+ ];
341
+ for (const [k, val] of Object.entries(v.facts)) {
342
+ rows.push(["PG_FACT_" + k.toUpperCase(), String(val)]);
343
+ }
344
+ console.log(rows.map((r) => r.join("\t")).join("\n"));
345
+ ')"
346
+ fi
347
+
348
+ while IFS=$'\t' read -r key value; do
349
+ [[ "$key" =~ ^PG_[A-Z_]+$ ]] || continue
350
+ printf -v "$key" '%s' "$value"
351
+ done <<< "$tsv"
352
+ }
353
+
354
+ prompt_guard_engine_call() {
355
+ local payload output status
356
+
357
+ if command -v jq >/dev/null 2>&1; then
358
+ payload="$(jq -nc --arg prompt "$PROMPT_TEXT" '{prompt:$prompt}')"
359
+ else
360
+ payload="{\"prompt\":\"$(hook_json_escape "$PROMPT_TEXT")\"}"
361
+ fi
362
+
363
+ if output="$(printf '%s' "$payload" | prompt_guard_decision_command)"; then
364
+ :
365
+ else
366
+ status=$?
367
+ if [[ "$status" -eq 127 ]]; then
368
+ PG_ENGINE_STATE="unavailable"
369
+ return 0
370
+ fi
371
+ echo "[PromptGuard] Decision engine unavailable or failed."
372
+ hook_structured_error \
373
+ "PromptGuard" \
374
+ "Prompt guard decision engine failed." \
375
+ "Install forge or run from the source checkout so the TypeScript decision engine is available." \
376
+ "missing_artifact"
377
+ exit 2
378
+ fi
379
+
380
+ output="$(printf '%s\n' "$output" | head -n1)"
381
+ if [[ "$output" != \{* ]] || ! printf '%s' "$output" | grep -q '"protocol"'; then
382
+ PG_ENGINE_STATE="legacy"
383
+ return 0
384
+ fi
385
+
386
+ prompt_guard_engine_parse "$output"
387
+ }
388
+
389
+ pg_fact() {
390
+ local name="$1"
391
+ local var="PG_FACT_${name}"
392
+ [[ "${!var:-0}" == "1" ]]
393
+ }
394
+
395
+ # --- Side effects and hints (driven by engine facts) ---
396
+
397
+ emit_pending_orchestration_discussion() {
398
+ local active_plan_local kind source_ref source_arg
399
+ workflow_pending_orchestration_is_fresh || return 0
400
+ active_plan_local="$(get_active_plan || true)"
401
+ [[ -z "$active_plan_local" || ! -f "$active_plan_local" ]] || return 0
402
+ pg_fact PLAN_DISCUSSION_CONTINUATION || return 0
403
+ kind="$(workflow_pending_orchestration_field kind 2>/dev/null || true)"
404
+ source_ref="$(workflow_pending_orchestration_field source_ref 2>/dev/null || true)"
405
+ source_arg=""
406
+ [[ -n "$source_ref" ]] && source_arg=" --source-ref <source-ref>"
407
+
408
+ echo "[PlanDiscussionGate] Pending plan/orchestration discussion is still open; continuing discussion, not implementation."
409
+ echo "[PlanDiscussionGate] $(workflow_pending_orchestration_summary)"
410
+ echo "[PlanDiscussionGate] When the decision is complete, capture the final plan body before editing implementation files:"
411
+ echo " printf '%s\n' '<decision-complete plan body>' | bash scripts/capture-plan.sh --slug <slug> --title <title> --status Draft --source ${kind:-host-plan} --orchestration-kind ${kind:-host-plan} --route planning${source_arg}"
412
+ }
413
+
414
+ emit_pending_orchestration_capture_gate() {
415
+ local kind source_ref source_arg
416
+ workflow_pending_orchestration_is_fresh || return 1
417
+ kind="$(workflow_pending_orchestration_field kind 2>/dev/null || true)"
418
+ source_ref="$(workflow_pending_orchestration_field source_ref 2>/dev/null || true)"
419
+ source_arg=""
420
+ [[ -n "$source_ref" ]] && source_arg=" --source-ref <source-ref>"
421
+ echo "[PlanCaptureGate] Implementation requested while a pending plan/orchestration discussion has not been captured."
422
+ echo "[PlanCaptureGate] $(workflow_pending_orchestration_summary)"
423
+ echo "[PlanCaptureGate] Capture the final plan body first; if implementation is already approved, use --status Approved --execute:"
424
+ echo " printf '%s\n' '<approved plan body>' | bash scripts/capture-plan.sh --slug <slug> --title <title> --status Approved --source ${kind:-host-plan} --orchestration-kind ${kind:-host-plan} --route planning --execute${source_arg}"
425
+ return 0
426
+ }
427
+
428
+ maybe_start_plan_workflow() {
429
+ pg_fact THINK_PLAN_START || return 0
430
+
431
+ if [[ ! -x "scripts/ensure-task-workflow.sh" ]]; then
432
+ echo "[PlanStartGate] Think/plan intent detected, but scripts/ensure-task-workflow.sh is missing. Continue with planning and capture manually."
433
+ return 0
434
+ fi
435
+
436
+ local slug title before_latest after_latest draft_plan kind source_ref start_output
437
+ slug="${PG_PLAN_START_SLUG:-think-plan-$(date +%H%M%S)}"
438
+ title="${PG_PLAN_START_TITLE:-Planning Session}"
439
+ before_latest="$(get_latest_plan || true)"
440
+ kind="${PG_PENDING_KIND:-forge-plan}"
441
+ source_ref="$title"
442
+ echo "[PlanStartGate] Think/plan intent detected. Starting independent file-backed Draft plan workflow."
443
+ if ! start_output="$(bash "scripts/ensure-task-workflow.sh" --new-plan --slug "$slug" --title "$title" 2>&1)"; then
444
+ printf '%s\n' "$start_output"
445
+ return 0
446
+ fi
447
+ printf '%s\n' "$start_output"
448
+ after_latest="$(get_latest_plan || true)"
449
+ draft_plan=""
450
+ if [[ -n "$after_latest" && "$after_latest" != "$before_latest" ]]; then
451
+ draft_plan="$after_latest"
452
+ fi
453
+ workflow_write_pending_orchestration "$kind" "${HOOK_HOST:-unknown}" "$slug" "$draft_plan" "$source_ref" "plans/plan-*.md"
454
+ }
455
+
456
+ extract_embedded_approved_plan_body() {
457
+ if ! pg_fact EMBEDDED_APPROVED_PLAN && pg_fact PLAN_SHAPED_MARKDOWN; then
458
+ printf '%s\n' "$PROMPT_INTENT_TEXT"
459
+ return 0
460
+ fi
461
+
462
+ printf '%s\n' "$PROMPT_INTENT_TEXT" | awk '
463
+ BEGIN { found = 0 }
464
+ !found {
465
+ line = $0
466
+ lower = tolower(line)
467
+ if (lower ~ /^[[:space:]]*(please[[:space:]]+)?implement[[:space:]]+this[[:space:]]+plan[[:space:]]*:/) {
468
+ found = 1
469
+ colon = index(line, ":")
470
+ rest = substr(line, colon + 1)
471
+ sub(/^[[:space:]]+/, "", rest)
472
+ if (length(rest) > 0) {
473
+ print rest
474
+ }
475
+ next
476
+ }
477
+ }
478
+ found { print }
479
+ '
480
+ }
481
+
482
+ derive_embedded_approved_plan_title() {
483
+ local body="$1"
484
+ local title
485
+ title="$(printf '%s\n' "$body" | awk '
486
+ /^#[[:space:]]*Plan:[[:space:]]*/ {
487
+ sub(/^#[[:space:]]*Plan:[[:space:]]*/, "")
488
+ print
489
+ exit
490
+ }
491
+ /^#[[:space:]]+/ {
492
+ sub(/^#[[:space:]]+/, "")
493
+ print
494
+ exit
495
+ }
496
+ ' | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//' | head -1)"
497
+ if [[ -z "$title" ]]; then
498
+ title="Approved Plan"
499
+ fi
500
+ printf '%s' "$title" | cut -c 1-96
501
+ }
502
+
503
+ normalize_plan_slug() {
504
+ printf '%s' "$1" | tr '[:upper:]' '[:lower:]' | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//; s/-{2,}/-/g'
505
+ }
506
+
507
+ maybe_capture_embedded_approved_plan() {
508
+ pg_fact EMBEDDED_APPROVED_PLAN || pg_fact PLAN_SHAPED_MARKDOWN || return 0
509
+
510
+ if [[ ! -x "scripts/capture-plan.sh" ]]; then
511
+ echo "[PlanCaptureGate] Embedded approved plan detected, but scripts/capture-plan.sh is missing."
512
+ hook_structured_error \
513
+ "PlanCaptureGate" \
514
+ "Embedded approved plan detected but scripts/capture-plan.sh is missing." \
515
+ "Install workflow helpers before executing an embedded approved plan." \
516
+ "missing_artifact"
517
+ exit 2
518
+ fi
519
+
520
+ local body title slug capture_output
521
+ body="$(extract_embedded_approved_plan_body)"
522
+ if [[ -z "$(printf '%s' "$body" | tr -d '[:space:]')" ]]; then
523
+ echo "[PlanCaptureGate] Embedded approved plan marker has no plan body."
524
+ hook_structured_error \
525
+ "PlanCaptureGate" \
526
+ "PLEASE IMPLEMENT THIS PLAN was provided without a plan body." \
527
+ "Paste the approved plan body after the marker so scripts/capture-plan.sh can store and project it." \
528
+ "missing_artifact"
529
+ exit 2
530
+ fi
531
+
532
+ title="$(derive_embedded_approved_plan_title "$body")"
533
+ slug="$(normalize_plan_slug "$title")"
534
+ if [[ -z "$slug" ]]; then
535
+ slug="approved-plan-$(date +%H%M%S)"
536
+ fi
537
+
538
+ echo "[PlanCaptureGate] Embedded approved plan detected. Capturing and projecting before implementation."
539
+ if ! capture_output="$(printf '%s\n' "$body" | bash "scripts/capture-plan.sh" --slug "$slug" --title "$title" --status Approved --source user-approved-plan --route planning --execute 2>&1)"; then
540
+ printf '%s\n' "$capture_output"
541
+ hook_structured_error \
542
+ "PlanCaptureGate" \
543
+ "Embedded approved plan capture failed." \
544
+ "Fix the capture-plan.sh or plan-to-todo.sh error before editing implementation files." \
545
+ "state_violation"
546
+ exit 2
547
+ fi
548
+ printf '%s\n' "$capture_output"
549
+ exit 0
550
+ }
551
+
552
+ emit_agentic_packaging_hint() {
553
+ if pg_fact AGENTIC_PACKAGING; then
554
+ echo "[AgenticDevRoute] Reusable workflow packaging intent detected."
555
+ echo "[AgenticDevRoute] Suggested route: forge-autoplan after user authorization; hook will not plan or create assets."
556
+ fi
557
+ }
558
+
559
+ resolve_codegraph_bin() {
560
+ if [[ -x "node_modules/.bin/codegraph" ]]; then
561
+ printf '%s\n' "node_modules/.bin/codegraph"
562
+ return 0
563
+ fi
564
+
565
+ command -v codegraph 2>/dev/null || return 1
566
+ }
567
+
568
+ run_codegraph_init_command() {
569
+ local codegraph_bin status cursor_dir_existed cursor_rules_dir_existed cursor_rule_existed
570
+ codegraph_bin="$(resolve_codegraph_bin)" || return 127
571
+
572
+ cursor_dir_existed=false
573
+ cursor_rules_dir_existed=false
574
+ cursor_rule_existed=false
575
+ [[ -d ".cursor" ]] && cursor_dir_existed=true
576
+ [[ -d ".cursor/rules" ]] && cursor_rules_dir_existed=true
577
+ [[ -e ".cursor/rules/codegraph.mdc" ]] && cursor_rule_existed=true
578
+
579
+ set +e
580
+ CODEGRAPH_NO_DAEMON=1 "$codegraph_bin" init -i .
581
+ status=$?
582
+ set -e
583
+
584
+ if [[ "$cursor_rule_existed" == "false" && -f ".cursor/rules/codegraph.mdc" ]]; then
585
+ rm -f ".cursor/rules/codegraph.mdc"
586
+ [[ "$cursor_rules_dir_existed" == "false" ]] && rmdir ".cursor/rules" 2>/dev/null || true
587
+ [[ "$cursor_dir_existed" == "false" ]] && rmdir ".cursor" 2>/dev/null || true
588
+ fi
589
+
590
+ return "$status"
591
+ }
592
+
593
+ ensure_codegraph_index_for_route() {
594
+ local output status
595
+
596
+ [[ -f ".codegraph/codegraph.db" ]] && return 0
597
+
598
+ output="$(run_codegraph_init_command 2>&1)"
599
+ status=$?
600
+
601
+ if [[ "$status" -eq 0 && -f ".codegraph/codegraph.db" ]]; then
602
+ echo "[CodegraphRoute] Initialized missing CodeGraph index before routing hint."
603
+ elif [[ "$status" -ne 127 ]]; then
604
+ echo "[CodegraphRoute] CodeGraph index init skipped or failed; run codegraph init -i . if structural tools are unavailable."
605
+ fi
606
+ }
607
+
608
+ emit_codegraph_route_hint() {
609
+ local session_key session_file=".claude/.session-id"
610
+
611
+ mkdir -p .claude
612
+ session_key="$(session_state_resolve_key "$session_file" "${1:-}")"
613
+
614
+ if session_state_codegraph_used "$session_key" || session_state_codegraph_nudged "$session_key"; then
615
+ return 0
616
+ fi
617
+
618
+ if pg_fact CODEGRAPH_ROUTE; then
619
+ ensure_codegraph_index_for_route || true
620
+ echo "[CodegraphRoute] Structural code-navigation intent detected. Prefer CodeGraph context/search/callers/impact before grep/read when available."
621
+ session_state_mark_codegraph_nudged "$session_key" || true
622
+ elif pg_fact NONTRIVIAL_CODE_TASK; then
623
+ echo "[CodegraphRoute] Structural code-navigation intent detected. Prefer CodeGraph context/search/callers/impact before grep/read when available."
624
+ session_state_mark_codegraph_nudged "$session_key" || true
625
+ fi
626
+ }
627
+
628
+ emit_waza_route_hint() {
629
+ if pg_fact AGENTIC_PACKAGING; then
630
+ return
631
+ fi
632
+
633
+ if pg_fact THINK_PLAN_START; then
634
+ echo "[WazaRoute] Planning intent detected. Default route: Waza /think."
635
+ return
636
+ fi
637
+
638
+ # /health needs a health/audit/diagnostic verb plus a tooling noun (joint
639
+ # condition lives in the TypeScript classifier); reviews fall to /check.
640
+ if pg_fact HEALTH_ROUTE; then
641
+ echo "[WazaRoute] Agent workflow/tooling intent detected. Default route: Waza /health."
642
+ return
643
+ fi
644
+
645
+ if pg_fact REVIEW_RELEASE; then
646
+ echo "[WazaRoute] Review/release intent detected. Default route: Waza /check."
647
+ emit_external_acceptance_prompt review
648
+ emit_cross_review_hint merge
649
+ fi
650
+ }
651
+
652
+ # Cross-review advisory: nudge the agent to consider an independent second
653
+ # opinion from a different-vendor model. Advisory only (echo, exit 0); the agent
654
+ # decides whether to act. Host-aware: in Codex suggest claude-review, otherwise
655
+ # (Claude) suggest codex-review. On Codex the dispatcher swallows success stdout,
656
+ # so this primarily surfaces on the Claude host; the Codex-side availability note
657
+ # is delivered once by session-start-context.sh.
658
+ emit_cross_review_hint() {
659
+ local skill peer
660
+ if [ "${HOOK_HOST:-claude}" = "codex" ]; then
661
+ skill="claude-review"; peer="Claude"
662
+ else
663
+ skill="codex-review"; peer="Codex"
664
+ fi
665
+ case "${1:-}" in
666
+ merge)
667
+ echo "[CrossReview] Pre-merge moment — consider an independent ${peer} review of the diff via ${skill}: a different training distribution has non-overlapping blind spots. Skip if the change is trivial."
668
+ ;;
669
+ debug)
670
+ echo "[CrossReview] Hard bug — ${skill} can give an independent ${peer} root-cause diagnosis. Agreeing diagnoses raise confidence; divergence shows where to dig."
671
+ ;;
672
+ esac
673
+ }
674
+
675
+ emit_external_acceptance_prompt() {
676
+ local mode="${1:-review}"
677
+ local expected_reviewer expected_source command active_plan_local contract_file_local review_file checks_file
678
+
679
+ expected_reviewer="$(workflow_external_acceptance_expected_reviewer)"
680
+ expected_source="$(workflow_external_acceptance_expected_source "$expected_reviewer")"
681
+ if [ "$expected_source" = "claude-review" ]; then
682
+ command="/claude-review"
683
+ else
684
+ command="codex-review"
685
+ fi
686
+
687
+ active_plan_local="$(get_active_plan || true)"
688
+ contract_file_local="$(workflow_active_contract || true)"
689
+ review_file="$(workflow_active_review || true)"
690
+ checks_file="$(workflow_checks_file)"
691
+
692
+ echo "[ExternalAcceptance] Review/release intent detected. Start peer acceptance in parallel with local /check."
693
+ echo "[ExternalAcceptance] Mode: $mode"
694
+ echo "[ExternalAcceptance] Current active plan: ${active_plan_local:-"(none)"}"
695
+ echo "[ExternalAcceptance] Current contract: ${contract_file_local:-"(none)"}"
696
+ echo "[ExternalAcceptance] Current review: ${review_file:-tasks/reviews/<slug>.review.md}"
697
+ echo "[ExternalAcceptance] Current checks: $checks_file"
698
+ echo "[ExternalAcceptance] Peer reviewer: $expected_reviewer via $command"
699
+ echo "[ExternalAcceptance] Diff scope for peer: branch diff against target, staged diff, unstaged diff, and untracked files."
700
+ cat <<EOF_EXTERNAL_ACCEPTANCE
701
+ [ExternalAcceptance] Prompt to send with $command:
702
+ Review the current sprint for acceptance only. Do not run /check. Do not edit files. Do not write files. Inspect the diff scope, contract, review evidence, and checks evidence, then return only a Markdown block that can be pasted into ${review_file:-tasks/reviews/<slug>.review.md}.
703
+
704
+ ## External Acceptance Advice
705
+ > **External Acceptance**: pass
706
+ > **External Reviewer**: $expected_reviewer
707
+ > **External Source**: $expected_source
708
+ > **External Started**: YYYY-MM-DDTHH:MM:SS+0800
709
+ > **External Completed**: YYYY-MM-DDTHH:MM:SS+0800
710
+
711
+ - P1 blockers: none
712
+ - P2 advisories:
713
+ - Acceptance checklist: pass
714
+
715
+ If the peer CLI is unavailable, record **External Acceptance**: unavailable and include the failure reason. That does not satisfy the completion gate unless a Manual Override: line with a concrete reason is also recorded.
716
+ EOF_EXTERNAL_ACCEPTANCE
717
+ }
718
+
719
+ # --- Action rendering ---
720
+ # Plan/spec/contract prompt gates are advisory (exit 0): pre-edit-guard.sh
721
+ # enforces the same state deterministically at the edit boundary. Done-claim
722
+ # gates keep blocking because they verify file-backed completion evidence.
723
+
724
+ render_prompt_guard_action() {
725
+ local action="$1"
726
+
727
+ case "$action" in
728
+ allow|done_gate)
729
+ return 0
730
+ ;;
731
+ spec_block)
732
+ echo "[SpecGuard] Advisory: docs/spec.md is missing. Create stable product truth before implementation."
733
+ echo "[SpecGuard] Run bash scripts/new-spec.sh and capture stable product intent; implementation edits without a spec are blocked at the edit layer."
734
+ exit 0
735
+ ;;
736
+ stale_active_plan_advice)
737
+ clear_active_plan
738
+ echo "[PlanStatusGuard] Advisory: ${marker_problem}; cleared stale active markers. Capture or switch to an approved plan before editing implementation files."
739
+ exit 0
740
+ ;;
741
+ plan_capture_pending_advice)
742
+ emit_pending_orchestration_capture_gate || true
743
+ exit 0
744
+ ;;
745
+ worktree_execution_advice)
746
+ echo "[WorktreeExecutionGate] Active plan is in linked worktree: $linked_worktree"
747
+ echo "[WorktreeExecutionGate] Continue from that worktree instead of recapturing a plan:"
748
+ echo " cd \"$linked_worktree\""
749
+ exit 0
750
+ ;;
751
+ plan_capture_missing_active_advice)
752
+ echo "[PlanCaptureGate] Approval detected before an active plan artifact exists."
753
+ echo "[PlanCaptureGate] Let the agent run the approved-plan capture path now:"
754
+ echo " git status --short --branch -uall"
755
+ echo " printf '%s\n' '<approved plan body>' | bash scripts/capture-plan.sh --slug <slug> --title <title> --status Approved --source waza-think --route planning --execute"
756
+ exit 0
757
+ ;;
758
+ plan_status_no_active_block)
759
+ echo "[PlanStatusGuard] Advisory: No active plan found in plans/. Implementation edits will be blocked at the edit layer until a plan is captured."
760
+ echo "[PlanStatusGuard] Capture the approved planning output with: bash scripts/capture-plan.sh --slug <slug> --title <title> --status Approved --execute"
761
+ echo "[PlanStatusGuard] If there is no captured planning output yet, run: bash scripts/ensure-task-workflow.sh --slug <slug> --title <title>"
762
+ exit 0
763
+ ;;
764
+ plan_capture_draft_advice)
765
+ echo "[PlanCaptureGate] Approval detected for $plan_status plan: $active_plan"
766
+ echo "[PlanCaptureGate] Recapture the exact approved plan body with --status Approved --execute, or mark this plan Approved and run:"
767
+ echo " bash scripts/plan-to-todo.sh --plan $active_plan"
768
+ exit 0
769
+ ;;
770
+ plan_status_not_approved_block)
771
+ echo "[PlanStatusGuard] Advisory: plan status is '$plan_status' in $active_plan. Complete the annotation cycle and move the plan to Approved; implementation edits are blocked at the edit layer until then."
772
+ exit 0
773
+ ;;
774
+ evidence_contract_block)
775
+ echo "[EvidenceContractGuard] Advisory: plan Evidence Contract is incomplete in $active_plan:"
776
+ printf '%s\n' "$evidence_error"
777
+ echo "[EvidenceContractGuard] Fill ## Evidence Contract with state/progress path, verification evidence, evaluator rubric, stop condition, and rollback surface before implementation."
778
+ exit 0
779
+ ;;
780
+ plan_execution_scaffold_advice)
781
+ echo "[PlanExecutionGate] Approval detected for approved plan: $active_plan"
782
+ echo "[PlanExecutionGate] Create the sprint contract/review/notes before implementation:"
783
+ echo " bash scripts/plan-to-todo.sh --plan $active_plan"
784
+ exit 0
785
+ ;;
786
+ contract_missing_block)
787
+ echo "[ContractGuard] Advisory: missing active sprint contract for $active_plan."
788
+ echo "[ContractGuard] Run bash scripts/plan-to-todo.sh --plan $active_plan to create the contract/review/notes scaffold before implementation."
789
+ exit 0
790
+ ;;
791
+ done_missing_active_plan)
792
+ echo "[ContractGuard] Done intent detected, but no active plan found. Complete plan workflow first."
793
+ hook_structured_error \
794
+ "ContractGuard" \
795
+ "Done intent detected without an active plan." \
796
+ "Finish the plan workflow and ensure plans/ contains the active plan before marking work done." \
797
+ "state_violation"
798
+ exit 2
799
+ ;;
800
+ done_contract_path_missing)
801
+ echo "[ContractGuard] Could not derive contract path from plan: $active_plan"
802
+ hook_structured_error \
803
+ "ContractGuard" \
804
+ "Could not derive a contract path from $active_plan." \
805
+ "Rename the plan to plan-<timestamp>-<slug>.md so the matching contract can be resolved." \
806
+ "missing_artifact"
807
+ exit 2
808
+ ;;
809
+ done_missing_contract)
810
+ echo "[ContractGuard] Missing task contract: $contract_file"
811
+ hook_structured_error \
812
+ "ContractGuard" \
813
+ "Missing task contract $contract_file." \
814
+ "Create the contract or regenerate tasks from the active plan before marking work done." \
815
+ "missing_artifact"
816
+ exit 2
817
+ ;;
818
+ done_evidence_contract_block)
819
+ echo "[EvidenceContractGuard] Plan Evidence Contract is incomplete in $active_plan:"
820
+ printf '%s\n' "$evidence_error"
821
+ hook_structured_error \
822
+ "EvidenceContractGuard" \
823
+ "Done intent detected without a complete plan Evidence Contract." \
824
+ "Fill ## Evidence Contract with state/progress path, verification evidence, evaluator rubric, stop condition, and rollback surface before marking work done." \
825
+ "quality_gate"
826
+ exit 2
827
+ ;;
828
+ *)
829
+ echo "[PromptGuard] Unknown decision action: $action"
830
+ hook_structured_error \
831
+ "PromptGuard" \
832
+ "Unknown prompt guard decision action: $action." \
833
+ "Fix the TypeScript prompt guard decision table before continuing." \
834
+ "state_violation"
835
+ exit 2
836
+ ;;
837
+ esac
838
+ }
839
+
840
+ emit_workflow_file_guards() {
841
+ if [ -f "tasks/todos.md" ] && has_changes "tasks/todos.md"; then
842
+ echo "[PlanGuard] tasks/todos.md has been modified. Read annotations and update the plan. Do not implement yet."
843
+ fi
844
+
845
+ if [ -f "tasks/lessons.md" ] && has_changes "tasks/lessons.md"; then
846
+ echo "[LessonGuard] tasks/lessons.md has updates. Review prevention rules before coding."
847
+ fi
848
+
849
+ local changed_research
850
+ changed_research="$(has_changes_glob '^docs/researches/.*\.md$' || true)"
851
+ if [ -n "$changed_research" ]; then
852
+ echo "[ResearchGuard] ${changed_research} updated. Review research deeply before planning or implementation."
853
+ fi
854
+
855
+ local changed_plan
856
+ changed_plan="$(has_changes_glob '^plans/plan-.*\.md$' || true)"
857
+ if [ -n "$changed_plan" ]; then
858
+ echo "[AnnotationGuard] ${changed_plan} has annotations. Process all notes and revise. Do not implement yet."
859
+ fi
860
+ }
861
+
862
+ # --- Main flow ---
863
+
864
+ PROMPT_TEXT="$(hook_get_prompt "${1:-}")"
865
+ PROMPT_INTENT_TEXT="$(prompt_intent_text)"
866
+
867
+ prompt_guard_refresh_state
868
+ prompt_guard_engine_call
869
+
870
+ if [[ "$PG_ENGINE_STATE" != "ok" ]]; then
871
+ if [[ "$PG_ENGINE_STATE" == "legacy" ]]; then
872
+ echo "[PromptGuard] Advisory: the installed forge CLI predates the prompt-verdict protocol; prompt intent gates are degraded to advisory for this prompt."
873
+ echo "[PromptGuard] Refresh the CLI with: bun add -g forge@latest && forge install. Fallback: npx -y forge install."
874
+ else
875
+ echo "[PromptGuard] Advisory: prompt-guard decision engine is unavailable (forge CLI or bun not found); prompt intent gates are degraded to advisory for this prompt."
876
+ echo "[PromptGuard] Edit-layer plan guidance remains advisory; path, conflict, destructive, remote, and evidence guards remain authoritative. Install the forge CLI to restore richer prompt decisions."
877
+ fi
878
+ emit_workflow_file_guards
879
+ exit 0
880
+ fi
881
+
882
+ emit_agentic_packaging_hint
883
+ emit_waza_route_hint
884
+ emit_codegraph_route_hint
885
+ emit_pending_orchestration_discussion
886
+
887
+ implement_intent=0
888
+ pg_fact IMPLEMENT && implement_intent=1
889
+ done_intent=0
890
+ pg_fact DONE && done_intent=1
891
+ plan_start_intent=0
892
+ pg_fact PLAN_START && plan_start_intent=1
893
+
894
+ plan_research_ready=1
895
+ if [ "$plan_start_intent" -eq 1 ]; then
896
+ if ! has_research_for_new_plan; then
897
+ latest_plan="$(get_latest_plan || true)"
898
+ if [[ -n "$latest_plan" ]]; then
899
+ plan_research_ready=0
900
+ echo "[ResearchGate] Advisory: docs/researches/*.md is missing or older than $latest_plan; skipping automatic Draft plan creation."
901
+ echo "[ResearchGate] Add or update a docs/researches/ report with fresh findings before creating the next plan."
902
+ else
903
+ echo "[ResearchGate] WARNING: no docs/researches/*.md report exists yet. Consider creating one with current findings before drafting the plan."
904
+ echo " 首次创建计划:建议先写 docs/researches/<date-topic>.md,但不阻塞。"
905
+ fi
906
+ fi
907
+ fi
908
+
909
+ if [ "$implement_intent" -eq 0 ] && [ "$done_intent" -eq 0 ]; then
910
+ if [ "$plan_start_intent" -eq 1 ] && [ "$plan_research_ready" -eq 0 ]; then
911
+ echo "[PlanStartGate] Skipping automatic Draft plan workflow until research is refreshed."
912
+ else
913
+ maybe_start_plan_workflow
914
+ fi
915
+ fi
916
+
917
+ if [ "$implement_intent" -eq 0 ]; then
918
+ emit_workflow_file_guards
919
+ fi
920
+
921
+ if [ "$implement_intent" -eq 1 ]; then
922
+ if [ "$PG_ACTION" = "spec_block" ]; then
923
+ render_prompt_guard_action "$PG_ACTION"
924
+ fi
925
+
926
+ maybe_capture_embedded_approved_plan
927
+
928
+ prompt_guard_refresh_state
929
+ prompt_guard_engine_call
930
+ render_prompt_guard_action "$PG_ACTION"
931
+ fi
932
+
933
+ if [ "$done_intent" -eq 1 ]; then
934
+ render_prompt_guard_action "$PG_ACTION"
935
+
936
+ if [ -f "scripts/verify-contract.sh" ]; then
937
+ # --read-only: hook-driven verification must not rewrite the contract Status
938
+ # header, otherwise a transient failure (e.g. flaky `bun test`) dirties the
939
+ # worktree and chains into worktree-guard on the next prompt.
940
+ if ! bash "scripts/verify-contract.sh" --contract "$contract_file" --strict --read-only; then
941
+ echo "[ContractGuard] Contract verification failed: $contract_file"
942
+ hook_structured_error \
943
+ "ContractGuard" \
944
+ "Contract verification failed for $contract_file." \
945
+ "Resolve the failing exit criteria in the contract before marking work done." \
946
+ "contract_failure"
947
+ exit 2
948
+ fi
949
+ else
950
+ echo "[ContractGuard] verify-contract.sh not found at scripts/verify-contract.sh (degraded mode: skipping strict verification)."
951
+ fi
952
+
953
+ review_file="$(workflow_active_review || true)"
954
+ if [ -z "$review_file" ] || [ ! -f "$review_file" ]; then
955
+ echo "[ReviewGuard] Missing sprint review: ${review_file:-tasks/reviews/<slug>.review.md}"
956
+ hook_structured_error \
957
+ "ReviewGuard" \
958
+ "Done intent detected without a sprint review artifact." \
959
+ "Run Waza /check after verification and record its evaluator recommendation in tasks/reviews/<slug>.review.md before marking work done." \
960
+ "quality_gate"
961
+ exit 2
962
+ fi
963
+
964
+ if ! workflow_review_recommends_pass "$review_file"; then
965
+ echo "[ReviewGuard] Sprint review does not recommend pass: $review_file"
966
+ hook_structured_error \
967
+ "ReviewGuard" \
968
+ "Sprint review is missing a passing recommendation." \
969
+ "Run Waza /check with fresh verification evidence and record a pass recommendation before marking work done." \
970
+ "quality_gate"
971
+ exit 2
972
+ fi
973
+
974
+ external_status="$(workflow_external_acceptance_status "$review_file")"
975
+ IFS=$'\t' read -r external_state external_reviewer external_source external_message <<< "$external_status"
976
+ if [ "$external_state" != "pass" ] && [ "$external_state" != "manual_override" ]; then
977
+ echo "[ExternalAcceptanceGuard] ${external_message:-External acceptance is missing.}"
978
+ hook_structured_error \
979
+ "ExternalAcceptanceGuard" \
980
+ "${external_message:-External acceptance is missing from $review_file.}" \
981
+ "Run peer acceptance via $(workflow_external_acceptance_expected_source) and record ## External Acceptance Advice in $review_file before marking work done." \
982
+ "quality_gate"
983
+ exit 2
984
+ fi
985
+
986
+ checks_file="$(workflow_checks_file)"
987
+ if [ ! -f "$checks_file" ]; then
988
+ echo "[EvidenceGuard] Missing structured checks file: $checks_file"
989
+ hook_structured_error \
990
+ "EvidenceGuard" \
991
+ "Done intent detected without structured verification evidence." \
992
+ "Run the relevant checks so .ai/harness/checks/latest.json exists before marking work done." \
993
+ "quality_gate"
994
+ exit 2
995
+ fi
996
+
997
+ if ! checks_error="$(workflow_checks_pass "$checks_file" "$contract_file" "$review_file")"; then
998
+ echo "[EvidenceGuard] $checks_error"
999
+ hook_structured_error \
1000
+ "EvidenceGuard" \
1001
+ "$checks_error" \
1002
+ "Run bash scripts/verify-sprint.sh so .ai/harness/checks/latest.json records a passing current sprint verification." \
1003
+ "quality_gate"
1004
+ exit 2
1005
+ fi
1006
+
1007
+ task_state="$(workflow_plan_task_state "$active_plan")"
1008
+ IFS=$'\t' read -r total_tasks done_tasks next_task <<< "$task_state"
1009
+ remaining_tasks=$(( ${total_tasks:-0} - ${done_tasks:-0} ))
1010
+ if [ "${remaining_tasks:-0}" -gt 0 ]; then
1011
+ echo "[ArchiveGuard] Done intent detected but active plan still has $remaining_tasks unchecked item(s). Refusing to auto-archive."
1012
+ hook_structured_error \
1013
+ "ArchiveGuard" \
1014
+ "Done intent with $remaining_tasks unchecked active-plan task(s)." \
1015
+ "Finish the remaining Task Breakdown item: ${next_task:-see $active_plan}." \
1016
+ "state_violation"
1017
+ exit 2
1018
+ fi
1019
+
1020
+ if workflow_is_linked_worktree; then
1021
+ next_action="$(workflow_next_action)"
1022
+ next_stage="$(printf '%s\n' "$next_action" | cut -f1)"
1023
+ next_command="$(printf '%s\n' "$next_action" | cut -f2)"
1024
+ next_message="$(printf '%s\n' "$next_action" | cut -f3-)"
1025
+ [[ "${next_command:-}" == "-" ]] && next_command=""
1026
+ echo "[WorkflowNextAction] Done quality gates passed for $active_plan."
1027
+ echo "[WorkflowNextAction] ${next_message:-Finish this contract worktree.}"
1028
+ if [ -n "${next_command:-}" ]; then
1029
+ echo "[WorkflowNextAction] ${next_command}"
1030
+ fi
1031
+ exit 0
1032
+ fi
1033
+
1034
+ if [ ! -x scripts/archive-workflow.sh ]; then
1035
+ echo "[AutoArchive] scripts/archive-workflow.sh is missing or not executable. Skipping auto-archive."
1036
+ hook_structured_error \
1037
+ "AutoArchive" \
1038
+ "scripts/archive-workflow.sh is missing or not executable." \
1039
+ "Install the workflow helper before relying on auto-archive." \
1040
+ "missing_artifact"
1041
+ exit 1
1042
+ fi
1043
+
1044
+ outcome="${PG_DONE_OUTCOME:-Completed}"
1045
+ echo "[AutoArchive] All quality gates passed. Archiving $active_plan as outcome=$outcome"
1046
+ if ! archive_output="$(bash scripts/archive-workflow.sh --plan "$active_plan" --outcome "$outcome" 2>&1)"; then
1047
+ printf '%s\n' "$archive_output"
1048
+ hook_structured_error \
1049
+ "AutoArchive" \
1050
+ "Automatic archive failed for $active_plan." \
1051
+ "Run bash scripts/archive-workflow.sh --plan $active_plan --outcome $outcome and resolve the error." \
1052
+ "contract_failure"
1053
+ exit 1
1054
+ fi
1055
+ printf '%s\n' "$archive_output"
1056
+ fi
1057
+
1058
+ if pg_fact SPA_DAY; then
1059
+ if [ -f "docs/reference-configs/handoff-protocol.md" ]; then
1060
+ echo "[HarnessMaintenance] Follow docs/reference-configs/handoff-protocol.md and sprint-contracts.md when consolidating workflow rules."
1061
+ else
1062
+ echo "[HarnessMaintenance] harness protocol docs missing. Add docs/reference-configs/handoff-protocol.md."
1063
+ fi
1064
+ fi
1065
+
1066
+ # --- TDD/BDD Context Injection ---
1067
+ # Exclusion logic (diagnostic/review/consultation prompts that merely mention
1068
+ # bugs must not trigger fix advice) lives in the TypeScript classifier.
1069
+ if pg_fact TDD_BUG_FIX_ADVICE; then
1070
+ echo "[TDD] Bug-fix intent detected. Reproduce with a failing test first."
1071
+ echo " 检测到修复请求:先写失败测试复现问题,再重写实现。"
1072
+ emit_cross_review_hint debug
1073
+ fi
1074
+ if pg_fact BDD_FEATURE_ADVICE; then
1075
+ echo "[BDD] Feature intent detected. Define Given-When-Then acceptance scenarios first."
1076
+ echo " 检测到新功能请求:先定义 Given-When-Then 验收场景。"
1077
+ fi