@moretea-labs/forge 1.6.0 → 1.7.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 (469) hide show
  1. package/AGENTS.md +4 -0
  2. package/CHANGELOG.md +39 -0
  3. package/CLAUDE.md +4 -0
  4. package/README.md +2 -2
  5. package/README.zh-CN.md +1 -1
  6. package/SKILL.md +2 -2
  7. package/THIRD_PARTY_NOTICES.md +1 -1
  8. package/agents/openai.yaml +1 -1
  9. package/assets/hooks/hook-input.sh +11 -8
  10. package/assets/hooks/lib/session-state.sh +10 -7
  11. package/assets/hooks/lib/workflow-state.sh +13 -177
  12. package/assets/hooks/post-tool-observer.sh +8 -2
  13. package/assets/hooks/prompt-guard.sh +5 -81
  14. package/assets/hooks/session-start-context.sh +56 -1
  15. package/assets/partials/05-workflow.partial.md +1 -1
  16. package/assets/partials-agents/02-operating-mode.partial.md +2 -0
  17. package/assets/partials-agents/03-orchestration.partial.md +1 -1
  18. package/assets/plugin-registry.v1.json +3 -3
  19. package/assets/reference-configs/document-generation.md +1 -1
  20. package/assets/reference-configs/harness-overview.md +1 -1
  21. package/assets/reference-configs/sprint-contracts.md +3 -3
  22. package/assets/skill-version.json +2 -2
  23. package/assets/templates/contract.template.md +2 -7
  24. package/assets/templates/helpers/capture-plan.sh +2 -2
  25. package/assets/templates/helpers/check-architecture-sync.sh +17 -0
  26. package/assets/templates/helpers/check-task-workflow.sh +4 -4
  27. package/assets/templates/helpers/contract-worktree.sh +1 -21
  28. package/assets/templates/helpers/ensure-task-workflow.sh +11 -36
  29. package/assets/templates/helpers/inspect-project-state.ts +8 -6
  30. package/assets/templates/helpers/migrate-project-template.sh +22 -45
  31. package/assets/templates/helpers/migrate-workflow-docs.ts +9 -7
  32. package/assets/templates/helpers/new-plan.sh +1 -1
  33. package/assets/templates/helpers/plan-to-todo.sh +12 -37
  34. package/assets/templates/helpers/ship-worktrees.sh +2 -29
  35. package/assets/templates/helpers/verify-contract.sh +1 -111
  36. package/assets/templates/helpers/verify-sprint.sh +3 -180
  37. package/assets/templates/helpers/workflow-contract.ts +5 -1
  38. package/assets/templates/plan.template.md +1 -1
  39. package/assets/templates/review.template.md +9 -34
  40. package/assets/workflow-contract.v1.json +10 -19
  41. package/docs/README.md +10 -10
  42. package/docs/architecture/CURRENT.md +178 -0
  43. package/docs/architecture/EVOLUTION.md +42 -0
  44. package/docs/architecture/current/README.md +4 -156
  45. package/docs/architecture/decisions/20260803-release-identity-binding-and-exit-policy.md +2 -2
  46. package/docs/architecture/decisions/20260823-immediate-controller-relay.md +53 -0
  47. package/docs/architecture/decisions/20260826-browser-runtime-v2.md +73 -0
  48. package/docs/architecture/history/README.md +7 -0
  49. package/docs/architecture/{chatgpt-handoff-facade.md → history/chatgpt-handoff-facade.md} +4 -0
  50. package/docs/architecture/{global-hook-runtime.md → history/global-hook-runtime.md} +7 -3
  51. package/docs/architecture/{ios-semantic-automation-provider-v2.md → history/ios-semantic-automation-provider-v2.md} +6 -2
  52. package/docs/architecture/history.md +3 -34
  53. package/docs/architecture/index.md +15 -98
  54. package/docs/architecture/modules/controller-runtime/transport-lifecycle.md +1 -1
  55. package/docs/architecture/reviews/2026-08-22-semantic-harness-convergence-acceptance.md +39 -0
  56. package/docs/architecture/versions/1.6.md +38 -0
  57. package/docs/architecture/versions/1.7.md +41 -0
  58. package/docs/forge-chatgpt-browser-engine.md +2 -2
  59. package/docs/forge-chatgpt-mcp-setup.md +4 -28
  60. package/docs/forge-chatgpt-supervised-automation.md +3 -3
  61. package/docs/forge-github-issue-launcher.md +1 -1
  62. package/docs/forge-plugin-management.md +1 -1
  63. package/docs/forge-runtime-self-healing-loop.md +1 -1
  64. package/docs/operations/controller-browser-plugin.md +26 -6
  65. package/docs/operations/controller-performance-and-502.md +143 -0
  66. package/docs/operations/controller-reliability-runbook.md +1 -1
  67. package/docs/operations/features.md +2 -2
  68. package/docs/operations/github-repository.md +1 -1
  69. package/docs/operations/homebrew.md +2 -2
  70. package/docs/operations/mcp-tool-exposure.md +5 -3
  71. package/docs/wiki/Architecture.md +6 -6
  72. package/docs/wiki/Implementation.md +2 -2
  73. package/docs/wiki/Integrations.md +2 -2
  74. package/docs/wiki/Work-Lifecycle.md +1 -1
  75. package/package.json +33 -11
  76. package/scripts/activate-source-baseline.ts +17 -13
  77. package/scripts/architecture-event.ts +2 -820
  78. package/scripts/architecture-queue.sh +2 -645
  79. package/scripts/archive-architecture-request.sh +2 -242
  80. package/scripts/archive-workflow.sh +1 -291
  81. package/scripts/benchmark-background-check-overlap.ts +228 -0
  82. package/scripts/benchmark-mcp-host.sh +117 -0
  83. package/scripts/benchmark-mcp-transport.ts +170 -0
  84. package/scripts/benchmark-quality-harness.ts +146 -0
  85. package/scripts/benchmark-route-session-concurrency.ts +207 -6
  86. package/scripts/benchmark-thin-harness-mcp-e2e.ts +7 -1
  87. package/scripts/benchmark-typescript-navigation.ts +186 -0
  88. package/scripts/benchmark-work-efficiency.ts +334 -0
  89. package/scripts/capability-config.ts +2 -392
  90. package/scripts/capability-resolver.ts +2 -503
  91. package/scripts/capture-plan.sh +1 -332
  92. package/scripts/check-agent-tooling.sh +2 -1558
  93. package/scripts/check-architecture-sync.sh +2 -371
  94. package/scripts/check-brain-manifest.sh +2 -253
  95. package/scripts/check-context-files.sh +2 -47
  96. package/scripts/check-deploy-sql-order.sh +2 -115
  97. package/scripts/check-mcp-compatibility.ts +14 -0
  98. package/scripts/check-runtime-architecture.mjs +349 -79
  99. package/scripts/check-skill-version.ts +3 -191
  100. package/scripts/check-source-duplication.mjs +61 -0
  101. package/scripts/check-stable-baseline.ts +92 -0
  102. package/scripts/check-task-sync.sh +2 -63
  103. package/scripts/check-task-workflow.sh +2 -1000
  104. package/scripts/codex-handoff-resume.sh +2 -267
  105. package/scripts/context-contract-sync.sh +2 -514
  106. package/scripts/contract-run.ts +2 -463
  107. package/scripts/contract-worktree.sh +1 -722
  108. package/scripts/ensure-task-workflow.sh +1 -1225
  109. package/scripts/host-temporary-cloud-mcp-e2e.sh +265 -0
  110. package/scripts/inspect-project-state.ts +4 -279
  111. package/scripts/install-standalone-recovery.ts +24 -0
  112. package/scripts/lib/project-init-lib.sh +22 -46
  113. package/scripts/lib/run-forge-helper.sh +19 -0
  114. package/scripts/lib/run-forge-helper.ts +26 -0
  115. package/scripts/migrate-project-template.sh +1 -1189
  116. package/scripts/migrate-workflow-docs.ts +4 -412
  117. package/scripts/new-plan.sh +1 -180
  118. package/scripts/new-spec.sh +1 -47
  119. package/scripts/new-sprint.sh +1 -46
  120. package/scripts/plan-to-todo.sh +1 -796
  121. package/scripts/prepare-codex-handoff.sh +2 -201
  122. package/scripts/prepare-handoff.sh +1 -78
  123. package/scripts/refresh-current-status.sh +2 -467
  124. package/scripts/run-governed-gate.ts +5 -1
  125. package/scripts/select-agent-context-blocks.sh +2 -64
  126. package/scripts/ship-worktrees.sh +1 -558
  127. package/scripts/smoke-ios-physical-device.ts +4 -2
  128. package/scripts/smoke-runtime-recovery.ts +1 -35
  129. package/scripts/smoke-schedule-engine.ts +1 -20
  130. package/scripts/sprint-backlog.sh +1 -834
  131. package/scripts/stage-runtime-release.ts +2 -1
  132. package/scripts/summarize-failures.sh +2 -123
  133. package/scripts/switch-plan.sh +1 -150
  134. package/scripts/sync-brain-docs.sh +2 -379
  135. package/scripts/sync-generated-authority.mjs +175 -0
  136. package/scripts/verify-contract.sh +2 -703
  137. package/scripts/verify-forge-runtime.sh +0 -1
  138. package/scripts/verify-sprint.sh +1 -677
  139. package/scripts/workflow-contract.ts +4 -205
  140. package/scripts/workstream-sync.sh +2 -261
  141. package/src/cli/agent-jobs/executor-health.ts +1 -1
  142. package/src/cli/commands/init-hook.ts +3 -3
  143. package/src/cli/commands/mcp.ts +9 -5
  144. package/src/cli/commands/plugin.ts +12 -3
  145. package/src/cli/commands/recovery.ts +25 -3
  146. package/src/cli/commands/runtime.ts +55 -3
  147. package/src/cli/commands/security.ts +12 -1
  148. package/src/cli/commands/setup-profile.ts +31 -21
  149. package/src/cli/controller/check-runner.ts +113 -5
  150. package/src/cli/controller/composite-result.ts +1 -1
  151. package/src/cli/controller/context/focus.ts +51 -0
  152. package/src/cli/controller/context/instruction-context.ts +114 -0
  153. package/src/cli/controller/context/known-paths.ts +76 -0
  154. package/src/cli/controller/context/query-planning.ts +110 -0
  155. package/src/cli/controller/context/rule-resolution.ts +532 -0
  156. package/src/cli/controller/context/source-materializer.ts +278 -0
  157. package/src/cli/controller/context/structural.ts +16 -0
  158. package/src/cli/controller/context/types.ts +286 -0
  159. package/src/cli/controller/context-pack.ts +828 -487
  160. package/src/cli/controller/launch-agents.ts +77 -2
  161. package/src/cli/controller/operational-plan.ts +2 -2
  162. package/src/cli/controller/work-mode.ts +6 -4
  163. package/src/cli/editing/edit-session.ts +60 -7
  164. package/src/cli/github/contracts.ts +16 -0
  165. package/src/cli/github/github.ts +135 -16
  166. package/src/cli/github/session.ts +2 -1
  167. package/src/cli/installer/managed-entries.ts +15 -1
  168. package/src/cli/local-bridge/console-automations.ts +54 -78
  169. package/src/cli/local-bridge/console-view-models.ts +1 -35
  170. package/src/cli/local-bridge/facade-api.ts +37 -264
  171. package/src/cli/local-bridge/frontend/src/App.tsx +3 -3
  172. package/src/cli/local-bridge/frontend/src/features/automations/AutomationsView.tsx +23 -13
  173. package/src/cli/local-bridge/frontend/src/features/capabilities/CapabilitiesView.tsx +37 -4
  174. package/src/cli/local-bridge/frontend/src/features/overview/OverviewView.tsx +6 -4
  175. package/src/cli/local-bridge/frontend/src/lib/api.ts +1 -6
  176. package/src/cli/local-bridge/frontend/src/lib/routes.ts +1 -1
  177. package/src/cli/local-bridge/frontend/src/shell/Sidebar.tsx +2 -2
  178. package/src/cli/local-bridge/frontend/src/styles.css +1 -1
  179. package/src/cli/local-bridge/frontend/src/types.ts +5 -8
  180. package/src/cli/local-bridge/job-store.ts +1 -490
  181. package/src/cli/local-bridge/server.ts +2 -515
  182. package/src/cli/local-bridge/ui-dist/app.css +1 -1
  183. package/src/cli/local-bridge/ui-dist/app.js +3703 -3757
  184. package/src/cli/mcp/auth.ts +5 -5
  185. package/src/cli/mcp/instructions.ts +3 -2
  186. package/src/cli/mcp/legacy-tool-service.ts +10 -222
  187. package/src/cli/mcp/multi-repository.ts +16 -5
  188. package/src/cli/mcp/oauth.ts +175 -26
  189. package/src/cli/mcp/post-finalize-work-attribution.ts +150 -0
  190. package/src/cli/mcp/repository-tools.ts +282 -146
  191. package/src/cli/mcp/server.ts +586 -116
  192. package/src/cli/mcp/tool-capability-cache.ts +1 -1
  193. package/src/cli/mcp/tool-contract.ts +14 -0
  194. package/src/cli/mcp/toolset-selection.ts +1 -1
  195. package/src/cli/mcp/toolset.ts +44 -7
  196. package/src/cli/mcp/transports/http.ts +124 -14
  197. package/src/cli/mcp/transports/session-registry.ts +43 -5
  198. package/src/cli/mcp/types.ts +3 -3
  199. package/src/cli/repositories/command-classifier.ts +103 -21
  200. package/src/cli/repositories/command-executor.ts +78 -526
  201. package/src/cli/repositories/command-process.ts +108 -0
  202. package/src/cli/repositories/command-scope.ts +99 -41
  203. package/src/cli/repositories/controller-home.ts +7 -8
  204. package/src/cli/repositories/git-command-executor.ts +2 -0
  205. package/src/cli/repositories/locks.ts +53 -16
  206. package/src/cli/repositories/repository-snapshot.ts +124 -0
  207. package/src/cli/repositories/selected-path-actions.ts +17 -9
  208. package/src/cli/repositories/structured-git.ts +118 -6
  209. package/src/cli/repository/inspector.ts +563 -65
  210. package/src/cli/repository/session-cache.ts +58 -17
  211. package/src/cli/v81-entry.ts +1 -4
  212. package/src/effects/fs-transaction.ts +85 -17
  213. package/src/runtime/context/codegraph-read-provider.ts +233 -2
  214. package/src/runtime/context/codegraph-sidecar.cjs +74 -40
  215. package/src/runtime/context/generic-lsp-provider.ts +355 -0
  216. package/src/runtime/context/lsp-client.ts +283 -0
  217. package/src/runtime/context/semantic-navigation-contract.ts +61 -0
  218. package/src/runtime/context/semantic-navigation.ts +223 -0
  219. package/src/runtime/context/swift-navigation.ts +565 -0
  220. package/src/runtime/context/typescript-navigation.ts +226 -0
  221. package/src/runtime/control-plane/dispatch-priority.ts +28 -0
  222. package/src/runtime/control-plane/execution/direct-edit-work-completion.ts +48 -16
  223. package/src/runtime/control-plane/execution/edit-validation-coordinator.ts +86 -24
  224. package/src/runtime/control-plane/execution/repository-work-attribution.ts +106 -0
  225. package/src/runtime/control-plane/execution/retained-work-resume.ts +203 -0
  226. package/src/runtime/control-plane/execution/session-store.ts +18 -0
  227. package/src/runtime/control-plane/execution/verification-evidence.ts +58 -3
  228. package/src/runtime/control-plane/execution/work-completion-authority.ts +58 -0
  229. package/src/runtime/control-plane/execution/work-evidence-policy.ts +200 -0
  230. package/src/runtime/control-plane/execution/work-execution-support.ts +386 -0
  231. package/src/runtime/control-plane/execution/work-finalization-service.ts +1913 -0
  232. package/src/runtime/control-plane/execution/work-handle-authority.ts +96 -0
  233. package/src/runtime/control-plane/execution/work-handle-store.ts +27 -2
  234. package/src/runtime/control-plane/execution/work-lifecycle-audit.ts +258 -0
  235. package/src/runtime/control-plane/execution/work-operation-service.ts +468 -0
  236. package/src/runtime/control-plane/execution/work-path-scope.ts +37 -0
  237. package/src/runtime/control-plane/execution/work-preparation-service.ts +479 -0
  238. package/src/runtime/control-plane/execution/work-process-evidence.ts +129 -0
  239. package/src/runtime/control-plane/execution/work-remote-delivery.ts +215 -0
  240. package/src/runtime/control-plane/execution/work-task-receipt.ts +22 -18
  241. package/src/runtime/control-plane/execution/work-terminal-cleanup.ts +156 -11
  242. package/src/runtime/control-plane/execution/work-validation-reconciler.ts +22 -14
  243. package/src/runtime/control-plane/execution/work-verification-context.ts +56 -0
  244. package/src/runtime/control-plane/execution/work-verification-service.ts +388 -0
  245. package/src/runtime/control-plane/execution/work-verification-snapshot.ts +90 -9
  246. package/src/runtime/control-plane/facade/capability-registry.ts +129 -25
  247. package/src/runtime/control-plane/facade/controller-round-relay.ts +1118 -0
  248. package/src/runtime/control-plane/facade/controller-session-store.ts +302 -12
  249. package/src/runtime/control-plane/facade/goal-workloop-access.ts +17 -1
  250. package/src/runtime/control-plane/facade/goal-workloop.ts +928 -190
  251. package/src/runtime/control-plane/facade/index.ts +3 -0
  252. package/src/runtime/control-plane/facade/plan-contract-store.ts +275 -42
  253. package/src/runtime/control-plane/facade/repository-work-admission.ts +147 -0
  254. package/src/runtime/control-plane/facade/requirement-authority.ts +83 -0
  255. package/src/runtime/control-plane/facade/semantic-admission.ts +205 -0
  256. package/src/runtime/control-plane/facade/suggested-actions.ts +5 -1
  257. package/src/runtime/control-plane/facade/types.ts +90 -10
  258. package/src/runtime/control-plane/facade/work-contract-store.ts +157 -261
  259. package/src/runtime/control-plane/facade/work-state-machine.ts +250 -0
  260. package/src/runtime/control-plane/generated-cache-retention.ts +271 -0
  261. package/src/runtime/control-plane/global-scheduler/config.ts +44 -0
  262. package/src/runtime/control-plane/global-scheduler/dispatch-capacity.ts +80 -0
  263. package/src/runtime/control-plane/global-scheduler/durable-admission.ts +46 -0
  264. package/src/runtime/control-plane/global-scheduler/maintenance.ts +152 -0
  265. package/src/runtime/control-plane/global-scheduler/projection-refresh.ts +84 -0
  266. package/src/runtime/control-plane/global-scheduler/reconciliation.ts +3 -3
  267. package/src/runtime/control-plane/global-scheduler/scheduler.ts +278 -543
  268. package/src/runtime/control-plane/global-scheduler/source-scan.ts +59 -0
  269. package/src/runtime/control-plane/global-scheduler/state.ts +88 -0
  270. package/src/runtime/control-plane/global-scheduler/worker-attachment.ts +57 -0
  271. package/src/runtime/control-plane/global-scheduler/worker-exit-decision.ts +38 -0
  272. package/src/runtime/control-plane/global-scheduler/worker-exit-reconciler.ts +175 -0
  273. package/src/runtime/control-plane/global-scheduler/worker-launch.ts +111 -0
  274. package/src/runtime/control-plane/global-scheduler/worker-lifecycle-store.ts +64 -0
  275. package/src/runtime/control-plane/global-scheduler/worker-lifecycle.ts +150 -0
  276. package/src/runtime/control-plane/global-scheduler/worker-process.ts +119 -0
  277. package/src/runtime/control-plane/global-scheduler/worker-stderr.ts +60 -0
  278. package/src/runtime/control-plane/launcher/chatgpt-work-binding-store.ts +63 -0
  279. package/src/runtime/control-plane/launcher/chatgpt-work-continuation.ts +365 -117
  280. package/src/runtime/control-plane/launcher/launch-reservation-store.ts +89 -0
  281. package/src/runtime/control-plane/launcher/thin-launcher.ts +244 -11
  282. package/src/runtime/control-plane/persistence/controller-home-migration.ts +487 -0
  283. package/src/runtime/control-plane/persistence/requirement-store.ts +0 -12
  284. package/src/runtime/control-plane/persistence/sqlite-store.ts +33 -2
  285. package/src/runtime/control-plane/release-retention.ts +62 -2
  286. package/src/runtime/control-plane/repo-actor/registry.ts +4 -2
  287. package/src/runtime/control-plane/routing/route-policy.ts +24 -21
  288. package/src/runtime/control-plane/routing/workspace-admission.ts +70 -0
  289. package/src/runtime/control-plane/runtime-status-client.ts +0 -2
  290. package/src/runtime/diagnostics/mcp-timing.ts +13 -0
  291. package/src/runtime/diagnostics/mcp-transport-benchmark.ts +129 -0
  292. package/src/runtime/diagnostics/performance.ts +24 -1
  293. package/src/runtime/evidence/event-ledger.ts +1 -1
  294. package/src/runtime/evidence/process-check-execution.ts +18 -0
  295. package/src/runtime/execution/jobs/child-reference.ts +6 -2
  296. package/src/runtime/execution/jobs/store.ts +58 -4
  297. package/src/runtime/execution/jobs/types.ts +1 -1
  298. package/src/runtime/execution/managed-workspace.ts +203 -1
  299. package/src/runtime/execution/process-runtime/check-facade.ts +51 -4
  300. package/src/runtime/execution/process-runtime/check-result.ts +88 -0
  301. package/src/runtime/execution/process-runtime/check-runner-sidecar.ts +7 -1
  302. package/src/runtime/execution/process-runtime/check-scheduling.ts +114 -0
  303. package/src/runtime/execution/process-runtime/command-facade.ts +367 -40
  304. package/src/runtime/execution/process-runtime/gc.ts +38 -6
  305. package/src/runtime/execution/process-runtime/lightweight-managed.ts +1201 -0
  306. package/src/runtime/execution/process-runtime/persisted-check.ts +51 -5
  307. package/src/runtime/execution/process-runtime/resource-claims.ts +10 -6
  308. package/src/runtime/execution/process-runtime/runtime.ts +53 -3
  309. package/src/runtime/execution/process-runtime/store.ts +1 -0
  310. package/src/runtime/execution/process-runtime/types.ts +4 -12
  311. package/src/runtime/execution/thin-harness/async-process.ts +12 -2
  312. package/src/runtime/execution/thin-harness/search-worker.ts +54 -5
  313. package/src/runtime/execution/work-activity.ts +21 -0
  314. package/src/runtime/execution/workers/executor.ts +18 -61
  315. package/src/runtime/gateway/mcp/execution-tools.ts +35 -1852
  316. package/src/runtime/gateway/mcp/legacy-ios-tool-adapter.ts +61 -0
  317. package/src/runtime/gateway/mcp/process-tools.ts +83 -37
  318. package/src/runtime/gateway/mcp/router.ts +186 -84
  319. package/src/runtime/gateway/mcp/runtime-tool-definitions.ts +565 -0
  320. package/src/runtime/gateway/mcp/runtime-tools.ts +2378 -1947
  321. package/src/runtime/plugins/app-store-connect-adapter.ts +216 -47
  322. package/src/runtime/plugins/browser-adapter.ts +2662 -829
  323. package/src/runtime/plugins/browser-automation-service.ts +10 -0
  324. package/src/runtime/plugins/browser-handoff-host.ts +2 -25
  325. package/src/runtime/plugins/browser-handoff.ts +110 -5
  326. package/src/runtime/plugins/browser-macos-bridge.ts +701 -63
  327. package/src/runtime/plugins/browser-manifest-surface.ts +603 -0
  328. package/src/runtime/plugins/browser-native-session-service.ts +222 -0
  329. package/src/runtime/plugins/browser-node-bridge.ts +6 -34
  330. package/src/runtime/plugins/browser-provider-registry.ts +109 -0
  331. package/src/runtime/plugins/browser-runtime-contract.ts +154 -0
  332. package/src/runtime/plugins/browser-runtime.ts +193 -0
  333. package/src/runtime/plugins/browser-session-authority.ts +332 -0
  334. package/src/runtime/plugins/browser-session-store.ts +121 -0
  335. package/src/runtime/plugins/browser-session-types.ts +98 -0
  336. package/src/runtime/plugins/capability-authorization-grants.ts +354 -0
  337. package/src/runtime/plugins/desktop-operator-registration.ts +10 -4
  338. package/src/runtime/plugins/external-adapter.ts +358 -3
  339. package/src/runtime/plugins/external-unix-socket.ts +7 -1
  340. package/src/runtime/plugins/first-party-registry.ts +2 -0
  341. package/src/runtime/plugins/github-adapter.ts +125 -0
  342. package/src/runtime/plugins/ios/agent-device-provider.ts +1 -1
  343. package/src/runtime/plugins/ios/agent-device-typed-provider.ts +52 -9
  344. package/src/runtime/plugins/ios/remote-xpc-hid.ts +1171 -0
  345. package/src/runtime/plugins/ios-adapter.ts +106 -16
  346. package/src/runtime/plugins/ios-agent-device.ts +234 -64
  347. package/src/runtime/plugins/ios-physical-device.ts +1143 -392
  348. package/src/runtime/plugins/lightweight-action.ts +153 -0
  349. package/src/runtime/plugins/local-system-adapter.ts +123 -6
  350. package/src/runtime/plugins/macos-capability-broker.ts +47 -9
  351. package/src/runtime/plugins/plugin-action-sidecar.ts +59 -0
  352. package/src/runtime/plugins/plugin-management-adapter.ts +49 -8
  353. package/src/runtime/plugins/resend-adapter.ts +1 -1
  354. package/src/runtime/plugins/store.ts +330 -33
  355. package/src/runtime/plugins/types.ts +38 -3
  356. package/src/runtime/plugins/xiaohongshu-publish.ts +515 -0
  357. package/src/runtime/projections/git-status-sampler.ts +16 -16
  358. package/src/runtime/projections/materialized-view.ts +28 -10
  359. package/src/runtime/recovery/maintenance-executor.ts +426 -25
  360. package/src/runtime/root/mcp-transport.ts +180 -10
  361. package/src/runtime/root/package-connector-service.ts +230 -10
  362. package/src/runtime/root/package-runtime-release.ts +143 -17
  363. package/src/runtime/root/package-runtime-service.ts +461 -22
  364. package/src/runtime/root/release-manifest.ts +144 -18
  365. package/src/runtime/root/release-materialize.ts +125 -32
  366. package/src/runtime/root/release-store.ts +48 -11
  367. package/src/runtime/root/runtime.ts +23 -5
  368. package/src/runtime/root/service.ts +100 -29
  369. package/src/runtime/root/types.ts +12 -0
  370. package/src/runtime/safe-tooling/ios-development.ts +321 -63
  371. package/src/runtime/shared/trusted-executable.ts +62 -0
  372. package/src/runtime/shared/trusted-node-executable.ts +48 -0
  373. package/src/runtime/standalone-recovery/core.ts +1079 -240
  374. package/src/runtime/standalone-recovery/entry.ts +100 -24
  375. package/src/runtime/standalone-recovery/installer.ts +20 -4
  376. package/src/runtime/standalone-recovery/service-labels.ts +2 -0
  377. package/src/runtime/standalone-recovery/watchdog-heartbeat.ts +160 -0
  378. package/src/runtime/workflow/schedules/browser-probe.ts +81 -3
  379. package/src/runtime/workflow/schedules/engine.ts +364 -202
  380. package/src/runtime/workflow/schedules/github-issue-watch.ts +158 -0
  381. package/src/runtime/workflow/schedules/settlement.ts +64 -17
  382. package/src/runtime/workflow/schedules/store.ts +209 -19
  383. package/src/runtime/workflow/schedules/types.ts +2 -4
  384. package/src/runtime/workflow/schedules/work-continuation.ts +26 -13
  385. package/src/testing/test-governance.ts +8 -40
  386. package/assets/reference-configs/heartbeat-triage.md +0 -57
  387. package/assets/templates/helpers/harness-trace-grade.sh +0 -150
  388. package/assets/templates/helpers/heartbeat-triage.sh +0 -361
  389. package/assets/templates/helpers/maintenance-triage.sh +0 -167
  390. package/docs/architecture/current/approved-target-architecture.zh-CN.md +0 -1501
  391. package/docs/architecture/current/architecture-invariants.md +0 -331
  392. package/docs/architecture/current/automation-and-schedule-engine.md +0 -459
  393. package/docs/architecture/current/codegraph-context-provider.md +0 -238
  394. package/docs/architecture/current/control-plane-authority-inventory.md +0 -94
  395. package/docs/architecture/current/controller-repository-decoupling.md +0 -148
  396. package/docs/architecture/current/dispatch-and-agent-strategy.md +0 -373
  397. package/docs/architecture/current/entity-model.md +0 -612
  398. package/docs/architecture/current/external-plugin-governance.md +0 -396
  399. package/docs/architecture/current/failure-recovery.md +0 -447
  400. package/docs/architecture/current/governance.md +0 -213
  401. package/docs/architecture/current/human-interaction-plane.md +0 -87
  402. package/docs/architecture/current/implementation-status.md +0 -128
  403. package/docs/architecture/current/job-and-run-lifecycle.md +0 -413
  404. package/docs/architecture/current/legacy-governance.md +0 -58
  405. package/docs/architecture/current/local-workspace-target-grants.md +0 -70
  406. package/docs/architecture/current/migration-roadmap.md +0 -105
  407. package/docs/architecture/current/multi-repository-execution.md +0 -371
  408. package/docs/architecture/current/operations-runbook.md +0 -45
  409. package/docs/architecture/current/peer-supercontroller-runtime.md +0 -32
  410. package/docs/architecture/current/personal-assistant-plugin-baseline.md +0 -206
  411. package/docs/architecture/current/repository-access-modes.md +0 -102
  412. package/docs/architecture/current/route-policy.md +0 -15
  413. package/docs/architecture/current/route-session-concurrency.md +0 -85
  414. package/docs/architecture/current/runtime-architecture-simplification.md +0 -214
  415. package/docs/architecture/current/runtime-directory-map.md +0 -49
  416. package/docs/architecture/current/runtime-health-and-resource-lifecycle.md +0 -85
  417. package/docs/architecture/current/scheduler-and-resource-claims.md +0 -422
  418. package/docs/architecture/current/session-aware-execution-and-authorization.md +0 -77
  419. package/docs/architecture/current/system-overview.md +0 -169
  420. package/docs/architecture/current/target-requirements-traceability.md +0 -202
  421. package/docs/architecture/current/thin-harness-governance-policy.md +0 -32
  422. package/docs/architecture/current/thin-harness-v1.md +0 -321
  423. package/docs/architecture/current/verification-and-release-gates.md +0 -391
  424. package/docs/forge-autonomous-goal-loop.md +0 -9
  425. package/docs/forge-provider-configuration.md +0 -7
  426. package/docs/operations/chatgpt-personal-assistant-runtime.md +0 -93
  427. package/docs/operations/gmail-assistant-routines.md +0 -186
  428. package/docs/operations/personal-assistant-operator-guide.md +0 -61
  429. package/docs/operations/provider-configuration.md +0 -31
  430. package/scripts/harness-trace-grade.sh +0 -150
  431. package/scripts/heartbeat-triage.sh +0 -361
  432. package/scripts/maintenance-triage.sh +0 -167
  433. package/src/cli/local-bridge/frontend/src/features/settings/SettingsView.tsx +0 -2
  434. package/src/cli/repositories/goal-registry.ts +0 -239
  435. package/src/runtime/assistant/action-proposals.ts +0 -279
  436. package/src/runtime/assistant/intent.ts +0 -395
  437. package/src/runtime/assistant/model-provider.ts +0 -460
  438. package/src/runtime/assistant/openapi.ts +0 -223
  439. package/src/runtime/assistant/policy.ts +0 -89
  440. package/src/runtime/assistant/readiness.ts +0 -258
  441. package/src/runtime/assistant/routine-runtime.ts +0 -477
  442. package/src/runtime/assistant/schedule-binding.ts +0 -171
  443. package/src/runtime/assistant/standing-grants.ts +0 -375
  444. package/src/runtime/assistant/store.ts +0 -243
  445. package/src/runtime/assistant/types.ts +0 -135
  446. package/src/runtime/control-plane/goal-loop/config-facade.ts +0 -700
  447. package/src/runtime/control-plane/goal-loop/config-store.ts +0 -570
  448. package/src/runtime/control-plane/goal-loop/config-types.ts +0 -213
  449. package/src/runtime/control-plane/goal-loop/executor-router.ts +0 -109
  450. package/src/runtime/control-plane/goal-loop/failure-taxonomy.ts +0 -149
  451. package/src/runtime/control-plane/goal-loop/goal-contract-store.ts +0 -304
  452. package/src/runtime/control-plane/goal-loop/goal-loop-engine.ts +0 -1001
  453. package/src/runtime/control-plane/goal-loop/handoff-packet.ts +0 -160
  454. package/src/runtime/control-plane/goal-loop/index.ts +0 -13
  455. package/src/runtime/control-plane/goal-loop/local-tools.ts +0 -290
  456. package/src/runtime/control-plane/goal-loop/policy-gates.ts +0 -203
  457. package/src/runtime/control-plane/goal-loop/provider-dispatch.ts +0 -93
  458. package/src/runtime/control-plane/goal-loop/provider-registry.ts +0 -545
  459. package/src/runtime/control-plane/goal-loop/types.ts +0 -378
  460. package/src/runtime/control-plane/startup-recovery.ts +0 -198
  461. package/src/runtime/gateway/mcp/resource-policy.ts +0 -186
  462. package/src/runtime/personal-assistant/gmail-triage-manager.ts +0 -231
  463. package/src/runtime/personal-assistant/reporting-runtime.ts +0 -344
  464. package/src/runtime/personal-assistant/triage-runtime.ts +0 -748
  465. package/src/runtime/workflow/findings/store.ts +0 -204
  466. package/src/runtime/workflow/findings/types.ts +0 -58
  467. package/src/runtime/workflow/portfolio/engine.ts +0 -20
  468. package/src/runtime/workflow/portfolio/store.ts +0 -185
  469. package/src/runtime/workflow/portfolio/types.ts +0 -29
@@ -1,61 +0,0 @@
1
- # Personal assistant operator guide
2
-
3
- This runtime is intended to be used with ChatGPT as the primary control plane. The Local Controller is the execution, policy, audit, and persistence layer.
4
-
5
- ## Recommended daily path
6
-
7
- 1. Ask ChatGPT for the goal in natural language.
8
- 2. ChatGPT calls the high-level assistant API or MCP tools.
9
- 3. The runtime plans safe plugin actions, submits durable jobs, and writes results into Assistant Inbox.
10
- 4. High-risk actions stay blocked until explicit human confirmation.
11
-
12
- ## Readiness check
13
-
14
- Use `assistant_readiness` or `GET /api/assistant/readiness` before relying on the assistant.
15
-
16
- The report separates:
17
-
18
- - live Google capability
19
- - mock-only capability
20
- - disabled plugins
21
- - routine, inbox, and memory state
22
- - recommended next actions
23
-
24
- Mock mode proves the execution path only. It does not read real Gmail, Calendar, or Tasks data.
25
-
26
- ## Gmail read self-test
27
-
28
- A low-risk Gmail read test can be submitted through either:
29
-
30
- - `plugin_action_execute` with `gmail.list_messages`
31
- - `POST /api/assistant/self-test/gmail-read`
32
- - `POST /api/assistant/intent` with an utterance such as `测试读取最近一周 Gmail`
33
-
34
- When Gmail is in mock mode, the test returns deterministic mock messages. For real Gmail, configure the plugin with provider `google-workspace` and set one of the supported token environment variables documented by the plugin health message.
35
-
36
- ## Cleanup workflow
37
-
38
- Use `runtime_cleanup_preview` or `POST /api/assistant/maintenance/cleanup-preview` first. It is non-destructive.
39
-
40
- Use cleanup apply only after reviewing the preview:
41
-
42
- - `runtime_cleanup_apply` with `confirm_cleanup=true`
43
- - `POST /api/assistant/maintenance/cleanup-apply` with `confirmCleanup=true`
44
-
45
- Cleanup is limited to explicit Forge candidates:
46
-
47
- - old `Forge-*` temp directories that are not referenced by running processes
48
- - terminal local jobs, when explicitly included
49
- - historical attention acknowledgements, when explicitly included
50
-
51
- Do not use cleanup apply as a substitute for reviewing active jobs, active leases, or running workers.
52
-
53
- ## What still needs real productization
54
-
55
- The current runtime can route assistant intents and run safe data collection jobs. A full personal-assistant product still needs:
56
-
57
- - real OAuth/token broker and refresh support
58
- - wall-clock routine scheduling
59
- - model-backed summarization of collected data
60
- - approval summaries for risky actions
61
- - cleanup apply integration in a dedicated maintenance UI
@@ -1,31 +0,0 @@
1
- # Provider configuration and routing
2
-
3
- Forge does not require or privilege a specific model vendor. A fresh installation builds neutral routing from provider kind, declared capabilities, health, and the configured provider priority. Providers with the same priority use the provider id only as a deterministic tie-breaker.
4
-
5
- ## Where configuration lives
6
-
7
- The Controller GUI and the JSON files below edit the same controller-scoped configuration:
8
-
9
- - `<controllerHome>/global/provider-config.json`: enable/disable providers, priority, model and non-secret API settings.
10
- - `<controllerHome>/global/executor-routing.json`: explicit provider order for each task intent.
11
- - `<controllerHome>/global/provider-secrets.json`: locally stored API credentials. This file is outside the repository and must never be committed.
12
-
13
- Opening the GUI or reading configuration does not rewrite these files. Existing routing and priority choices remain authoritative across upgrades.
14
-
15
- ## Precedence
16
-
17
- Provider selection applies these rules in order:
18
-
19
- 1. Per-request provider preferences and allow/deny constraints.
20
- 2. An explicit order or default in `executor-routing.json`, including changes made in the GUI routing editor.
21
- 3. Neutral generated defaults based on provider kind and `provider-config.json` priority.
22
- 4. Availability, enablement, authentication, live-call policy, safety gates, and required capabilities.
23
- 5. A ChatGPT handoff packet when no direct provider can safely run.
24
-
25
- An explicit routing order intentionally overrides the general provider priority. The GUI shows both controls so users can decide whether task types follow a specific route or the general provider preference. Use **Use automatic routing** in the routing panel to remove explicit overrides and resume generated priority-based routing; do not delete the whole controller configuration.
26
-
27
- ## Personal preferences
28
-
29
- Maintainers and users may place Grok, Codex, Claude, an API provider, or another registered provider first in their own Controller configuration. Those preferences belong under `controllerHome`; they are not open-source defaults and are not copied into the repository.
30
-
31
- Remote API calls remain double-gated: the provider must be enabled/configured in the GUI and `FORGE_ENABLE_LIVE_MODEL_PROVIDERS` must explicitly allow live calls. Without both, the API provider is proposal-only.
@@ -1,150 +0,0 @@
1
- #!/bin/bash
2
- set -euo pipefail
3
-
4
- usage() {
5
- cat <<'USAGE_EOF'
6
- Usage: scripts/harness-trace-grade.sh --run <trace.json> [--repo <repo>] [--strict]
7
- USAGE_EOF
8
- }
9
-
10
- run_file=""
11
- repo="."
12
- strict=0
13
-
14
- while [[ $# -gt 0 ]]; do
15
- case "$1" in
16
- --run)
17
- run_file="${2:-}"
18
- shift 2
19
- ;;
20
- --repo)
21
- repo="${2:-.}"
22
- shift 2
23
- ;;
24
- --strict)
25
- strict=1
26
- shift
27
- ;;
28
- --help|-h)
29
- usage
30
- exit 0
31
- ;;
32
- *)
33
- echo "Unknown argument: $1" >&2
34
- usage
35
- exit 1
36
- ;;
37
- esac
38
- done
39
-
40
- [[ -n "$run_file" ]] || { usage >&2; exit 1; }
41
- [[ -f "$run_file" ]] || { echo "Trace run file not found: $run_file" >&2; exit 1; }
42
- command -v jq >/dev/null 2>&1 || { echo "jq is required for harness trace grading" >&2; exit 1; }
43
-
44
- if REPO_ROOT="$(cd "$repo" && pwd -P 2>/dev/null)"; then
45
- :
46
- else
47
- echo "Repo path not found: $repo" >&2
48
- exit 1
49
- fi
50
-
51
- results_file="$(mktemp)"
52
- trap 'rm -f "$results_file"' EXIT
53
- : > "$results_file"
54
-
55
- record() {
56
- local id="$1"
57
- local passed="$2"
58
- local message="$3"
59
- jq -n \
60
- --arg id "$id" \
61
- --argjson passed "$passed" \
62
- --arg message "$message" \
63
- '{id: $id, passed: $passed, message: $message}' >> "$results_file"
64
- }
65
-
66
- trace_get() {
67
- local query="$1"
68
- jq -r "$query // empty" "$run_file"
69
- }
70
-
71
- schema="$(trace_get '.schema')"
72
- active_plan="$(trace_get '.active_plan')"
73
- task_profile="$(trace_get '.task_profile')"
74
- review_card_verdict="$(trace_get '.review.card.verdict')"
75
- review_card_change_type="$(trace_get '.review.card.change_type')"
76
- review_card_rollback="$(trace_get '.review.card.rollback')"
77
- commands_count="$(jq '.commands | if type == "array" then length else 0 end' "$run_file")"
78
- outside_count="$(jq '.allowed_paths_check.outside | if type == "array" then length else 0 end' "$run_file")"
79
- allowed_status="$(trace_get '.allowed_paths_check.status')"
80
-
81
- if [[ "$schema" == "forge-run-trace.v1" ]]; then
82
- record "schema.v1" true "trace schema is forge-run-trace.v1"
83
- else
84
- record "schema.v1" false "trace schema is ${schema:-missing}"
85
- fi
86
-
87
- if [[ -n "$active_plan" && -f "$REPO_ROOT/$active_plan" ]]; then
88
- record "active_plan.resolves" true "active plan resolves: $active_plan"
89
- else
90
- record "active_plan.resolves" false "active plan does not resolve: ${active_plan:-missing}"
91
- fi
92
-
93
- case "$task_profile" in
94
- code-change|docs-only|ledger-closeout|migration|eval-only|delegated-run)
95
- record "contract_profile.valid" true "contract profile is valid: $task_profile"
96
- ;;
97
- *)
98
- record "contract_profile.valid" false "contract profile is invalid: ${task_profile:-missing}"
99
- ;;
100
- esac
101
-
102
- if [[ "$review_card_verdict" == "pass" ]]; then
103
- record "review_card.pass" true "Human Review Card verdict is pass"
104
- else
105
- record "review_card.pass" false "Human Review Card verdict is ${review_card_verdict:-missing}"
106
- fi
107
-
108
- if [[ -n "$review_card_change_type" && "$review_card_change_type" == "$task_profile" ]]; then
109
- record "review_card.change_type" true "Human Review Card change type matches task profile"
110
- else
111
- record "review_card.change_type" false "Human Review Card change type ${review_card_change_type:-missing} does not match task profile ${task_profile:-missing}"
112
- fi
113
-
114
- rollback_token="$(printf '%s' "$review_card_rollback" | sed -E 's/[;,].*$//; s/[[:space:]].*$//; s/^[[:space:]]+//; s/[[:space:]]+$//' | tr '[:upper:]' '[:lower:]')"
115
- case "$rollback_token" in
116
- ""|tbd|todo|n/a|na|none|unknown|unavailable|pending|...)
117
- record "review_card.rollback" false "Human Review Card rollback is missing or not concrete"
118
- ;;
119
- *)
120
- record "review_card.rollback" true "Human Review Card rollback is concrete"
121
- ;;
122
- esac
123
-
124
- if [[ "$commands_count" -gt 0 ]] && jq -e '.commands[]? | select((.command // "") | length > 0)' "$run_file" >/dev/null; then
125
- record "commands.present" true "commands evidence is present"
126
- else
127
- record "commands.present" false "commands evidence is missing"
128
- fi
129
-
130
- if [[ "$outside_count" -eq 0 && "$allowed_status" == "pass" ]]; then
131
- record "allowed_paths.clean" true "no changed file is outside allowed paths"
132
- else
133
- record "allowed_paths.clean" false "allowed_paths status is ${allowed_status:-missing}; changed files outside allowed paths: $outside_count"
134
- fi
135
-
136
- failed="$(jq -s '[.[] | select(.passed == false)] | length' "$results_file")"
137
- total="$(jq -s 'length' "$results_file")"
138
- status="pass"
139
- [[ "$failed" -eq 0 ]] || status="fail"
140
-
141
- jq -s \
142
- --arg status "$status" \
143
- --arg run "$run_file" \
144
- --argjson total "$total" \
145
- --argjson failed "$failed" \
146
- '{status: $status, run: $run, total: $total, failed: $failed, graders: .}' "$results_file"
147
-
148
- if [[ "$strict" -eq 1 && "$failed" -ne 0 ]]; then
149
- exit 1
150
- fi
@@ -1,361 +0,0 @@
1
- #!/bin/bash
2
- set -euo pipefail
3
-
4
- usage() {
5
- cat <<'USAGE_EOF'
6
- Usage: scripts/heartbeat-triage.sh [run] [--repo PATH] [--inbox PATH] [--run-id ID] [--source manual|scheduled] [--json]
7
-
8
- Writes a heartbeat triage run to .ai/harness/triage/inbox.md. The command is
9
- safe for cron/loop schedulers: findings are recorded as inbox entries and do
10
- not make the process fail unless the runner itself is misconfigured.
11
- USAGE_EOF
12
- }
13
-
14
- command="run"
15
- repo="."
16
- inbox_path=".ai/harness/triage/inbox.md"
17
- run_id=""
18
- run_source="manual"
19
- json_output=0
20
-
21
- if [[ "${1:-}" == "run" ]]; then
22
- shift
23
- elif [[ "${1:-}" == "--help" || "${1:-}" == "-h" ]]; then
24
- usage
25
- exit 0
26
- elif [[ "${1:-}" != "" && "${1:-}" != --* ]]; then
27
- echo "heartbeat-triage: unknown command: $1" >&2
28
- usage >&2
29
- exit 2
30
- fi
31
-
32
- while [[ $# -gt 0 ]]; do
33
- case "$1" in
34
- --repo)
35
- [[ -n "${2:-}" ]] || { echo "heartbeat-triage: --repo requires a value" >&2; exit 2; }
36
- repo="$2"
37
- shift 2
38
- ;;
39
- --inbox)
40
- [[ -n "${2:-}" ]] || { echo "heartbeat-triage: --inbox requires a value" >&2; exit 2; }
41
- inbox_path="$2"
42
- shift 2
43
- ;;
44
- --run-id)
45
- [[ -n "${2:-}" ]] || { echo "heartbeat-triage: --run-id requires a value" >&2; exit 2; }
46
- run_id="$2"
47
- shift 2
48
- ;;
49
- --source)
50
- [[ -n "${2:-}" ]] || { echo "heartbeat-triage: --source requires a value" >&2; exit 2; }
51
- run_source="$2"
52
- shift 2
53
- ;;
54
- --json)
55
- json_output=1
56
- shift
57
- ;;
58
- --help|-h)
59
- usage
60
- exit 0
61
- ;;
62
- *)
63
- echo "heartbeat-triage: unknown argument: $1" >&2
64
- usage >&2
65
- exit 2
66
- ;;
67
- esac
68
- done
69
-
70
- [[ "$command" == "run" ]] || { echo "heartbeat-triage: unsupported command: $command" >&2; exit 2; }
71
-
72
- repo="$(cd "$repo" 2>/dev/null && pwd -P)" || { echo "heartbeat-triage: repo not found: $repo" >&2; exit 2; }
73
- cd "$repo"
74
-
75
- timestamp="$(date '+%Y-%m-%dT%H:%M:%S%z')"
76
- if [[ -z "$run_id" ]]; then
77
- run_id="heartbeat-$(date '+%Y%m%dT%H%M%S')-$$"
78
- fi
79
- safe_run_id="$(printf '%s' "$run_id" | sed -E 's/[^A-Za-z0-9._-]+/-/g')"
80
-
81
- if [[ "$inbox_path" = /* ]]; then
82
- inbox_file="$inbox_path"
83
- else
84
- inbox_file="$repo/$inbox_path"
85
- fi
86
-
87
- runs_dir="$repo/.ai/harness/runs"
88
- triage_dir="$(dirname "$inbox_file")"
89
- run_file="$runs_dir/${safe_run_id}-heartbeat-triage.json"
90
- mkdir -p "$triage_dir" "$runs_dir"
91
-
92
- json_escape() {
93
- local value="$1"
94
- value="${value//\\/\\\\}"
95
- value="${value//\"/\\\"}"
96
- value="${value//$'\n'/\\n}"
97
- value="${value//$'\r'/\\r}"
98
- value="${value//$'\t'/\\t}"
99
- printf '%s' "$value"
100
- }
101
-
102
- policy_get() {
103
- local jq_path="$1"
104
- local default_value="$2"
105
-
106
- if [[ -f ".ai/harness/policy.json" ]] && command -v jq >/dev/null 2>&1; then
107
- local value
108
- value="$(jq -r "$jq_path // empty" ".ai/harness/policy.json" 2>/dev/null || true)"
109
- if [[ -n "$value" ]]; then
110
- printf '%s' "$value"
111
- return 0
112
- fi
113
- fi
114
-
115
- printf '%s' "$default_value"
116
- }
117
-
118
- helper_runtime_dir="$(policy_get '.harness.helper_runtime_dir' '.ai/harness/scripts')"
119
-
120
- helper_path() {
121
- local helper_name="$1"
122
-
123
- if [[ -f "$helper_runtime_dir/$helper_name" ]]; then
124
- printf '%s/%s' "$helper_runtime_dir" "$helper_name"
125
- return 0
126
- fi
127
-
128
- if [[ -f "scripts/$helper_name" ]]; then
129
- printf '%s/%s' "scripts" "$helper_name"
130
- return 0
131
- fi
132
-
133
- printf '%s/%s' "$helper_runtime_dir" "$helper_name"
134
- }
135
-
136
- repo_relative() {
137
- local path="$1"
138
- case "$path" in
139
- "$repo"/*) printf '%s' "${path#"$repo"/}" ;;
140
- "$repo") printf '.' ;;
141
- *) printf '%s' "$path" ;;
142
- esac
143
- }
144
-
145
- first_line() {
146
- awk 'NF { print; exit }'
147
- }
148
-
149
- date_plus_14_days() {
150
- if date -v+14d '+%Y-%m-%d' >/dev/null 2>&1; then
151
- date -v+14d '+%Y-%m-%d'
152
- elif date -d '+14 days' '+%Y-%m-%d' >/dev/null 2>&1; then
153
- date -d '+14 days' '+%Y-%m-%d'
154
- else
155
- date '+%Y-%m-%d'
156
- fi
157
- }
158
-
159
- entry_kinds=()
160
- entry_statuses=()
161
- entry_summaries=()
162
- entry_details=()
163
-
164
- add_entry() {
165
- entry_kinds+=("$1")
166
- entry_statuses+=("$2")
167
- entry_summaries+=("$3")
168
- entry_details+=("$4")
169
- }
170
-
171
- run_workflow_check() {
172
- local output status summary
173
- local check_script
174
- check_script="$(helper_path "check-task-workflow.sh")"
175
-
176
- if [[ ! -f "$check_script" ]]; then
177
- add_entry "workflow-check" "warning" "$check_script is missing" ""
178
- return 0
179
- fi
180
-
181
- set +e
182
- output="$(bash "$check_script" --strict 2>&1)"
183
- status=$?
184
- set -e
185
-
186
- if [[ "$status" -eq 0 ]]; then
187
- add_entry "workflow-check" "pass" "check-task-workflow.sh --strict passed" "$output"
188
- else
189
- summary="$(printf '%s\n' "$output" | first_line)"
190
- add_entry "workflow-check" "fail" "${summary:-check-task-workflow.sh --strict failed}" "$output"
191
- fi
192
- }
193
-
194
- extract_next_pending_from_sprint() {
195
- local sprint_file="$1"
196
- awk -F '|' '
197
- function trim(s) {
198
- gsub(/^[[:space:]]+|[[:space:]]+$/, "", s)
199
- return s
200
- }
201
- /^## Backlog[[:space:]]*$/ { in_section = 1; next }
202
- in_section && /^## / { exit }
203
- !in_section { next }
204
- /^\|[[:space:]]*[0-9]+[[:space:]]*\|/ {
205
- idx = trim($2)
206
- status = trim($3)
207
- task = trim($4)
208
- mode = trim($5)
209
- acceptance = trim($6)
210
- plan = trim($7)
211
- if (status == "[ ]") {
212
- printf "index: %s\ntask: %s\nmode: %s\nacceptance: %s\nplan: %s\n", idx, task, mode, acceptance, plan
213
- exit
214
- }
215
- }
216
- ' "$sprint_file"
217
- }
218
-
219
- find_executing_sprint() {
220
- local file status
221
- local sprints_dir
222
- sprints_dir="$(policy_get '.sprints.dir' 'plans/sprints')"
223
- [[ -d "$sprints_dir" ]] || return 1
224
- while IFS= read -r file; do
225
- status="$(awk '/\*\*Status\*\*:/ { sub(/^.*\*\*Status\*\*: */, ""); gsub(/\r/, ""); print; exit }' "$file" | xargs)"
226
- case "$status" in
227
- Executing|Approved)
228
- printf '%s\n' "$file"
229
- return 0
230
- ;;
231
- esac
232
- done < <(find "$sprints_dir" -maxdepth 1 -name '*.sprint.md' -type f | sort -r)
233
- return 1
234
- }
235
-
236
- run_sprint_next() {
237
- local output status summary sprint_file task
238
- local sprint_helper
239
- sprint_helper="$(helper_path "sprint-backlog.sh")"
240
-
241
- if [[ -f ".ai/harness/sprint/active-sprint" && -f "$sprint_helper" ]]; then
242
- set +e
243
- output="$(bash "$sprint_helper" next 2>&1)"
244
- status=$?
245
- set -e
246
- if [[ "$status" -eq 0 ]]; then
247
- task="$(printf '%s\n' "$output" | awk -F ': ' '/^task:/ { print $2; exit }')"
248
- add_entry "sprint-next" "action" "next sprint task: ${task:-unknown}" "$output"
249
- return 0
250
- fi
251
- if [[ "$status" -eq 3 ]]; then
252
- add_entry "sprint-next" "pass" "no pending sprint task" "$output"
253
- return 0
254
- fi
255
- fi
256
-
257
- if sprint_file="$(find_executing_sprint)"; then
258
- output="$(extract_next_pending_from_sprint "$sprint_file")"
259
- if [[ -n "$output" ]]; then
260
- task="$(printf '%s\n' "$output" | awk -F ': ' '/^task:/ { print $2; exit }')"
261
- add_entry "sprint-next" "action" "next sprint task: ${task:-unknown}" "$output"
262
- else
263
- add_entry "sprint-next" "pass" "no pending sprint task in $sprint_file" ""
264
- fi
265
- else
266
- add_entry "sprint-next" "info" "no active or executing sprint found" ""
267
- fi
268
- }
269
-
270
- run_drift_requests() {
271
- local details count
272
- if [[ ! -d "docs/architecture/requests" ]]; then
273
- add_entry "drift-requests" "pass" "no architecture request directory" ""
274
- return 0
275
- fi
276
-
277
- details="$(find docs/architecture/requests -maxdepth 1 -type f ! -name '.gitkeep' | sort)"
278
- if [[ -z "$details" ]]; then
279
- add_entry "drift-requests" "pass" "no pending architecture drift requests" ""
280
- return 0
281
- fi
282
-
283
- count="$(printf '%s\n' "$details" | sed '/^$/d' | wc -l | xargs)"
284
- add_entry "drift-requests" "action" "${count} pending architecture drift request(s)" "$details"
285
- }
286
-
287
- write_json_snapshot() {
288
- local target="$1"
289
- local idx
290
- {
291
- echo "{"
292
- printf ' "version": 1,\n'
293
- printf ' "kind": "forge-heartbeat-triage",\n'
294
- printf ' "run_id": "%s",\n' "$(json_escape "$run_id")"
295
- printf ' "source": "%s",\n' "$(json_escape "$run_source")"
296
- printf ' "generated_at": "%s",\n' "$(json_escape "$timestamp")"
297
- printf ' "repo": "%s",\n' "$(json_escape "$repo")"
298
- printf ' "inbox": "%s",\n' "$(json_escape "$(repo_relative "$inbox_file")")"
299
- printf ' "run_file": "%s",\n' "$(json_escape "$(repo_relative "$run_file")")"
300
- printf ' "adoption_review_due": "%s",\n' "$(json_escape "$adoption_review_due")"
301
- echo ' "entries": ['
302
- for idx in "${!entry_kinds[@]}"; do
303
- [[ "$idx" -eq 0 ]] || echo ","
304
- printf ' {"kind":"%s","status":"%s","summary":"%s","details":"%s"}' \
305
- "$(json_escape "${entry_kinds[$idx]}")" \
306
- "$(json_escape "${entry_statuses[$idx]}")" \
307
- "$(json_escape "${entry_summaries[$idx]}")" \
308
- "$(json_escape "${entry_details[$idx]}")"
309
- done
310
- echo
311
- echo ' ]'
312
- echo "}"
313
- } > "$target"
314
- }
315
-
316
- write_inbox() {
317
- local idx detail_line
318
- if [[ ! -f "$inbox_file" ]]; then
319
- {
320
- echo "# Heartbeat Triage Inbox"
321
- echo
322
- echo "<!-- managed by scripts/heartbeat-triage.sh; append-only run log -->"
323
- echo
324
- } > "$inbox_file"
325
- fi
326
-
327
- {
328
- echo "## Run ${run_id} - ${timestamp}"
329
- echo
330
- echo "- Source: ${run_source}"
331
- echo "- Run snapshot: $(repo_relative "$run_file")"
332
- echo "- Adoption review due: ${adoption_review_due}"
333
- echo
334
- echo "### Entries"
335
- echo
336
- for idx in "${!entry_kinds[@]}"; do
337
- printf -- "- [%s] %s: %s\n" "${entry_statuses[$idx]}" "${entry_kinds[$idx]}" "${entry_summaries[$idx]}"
338
- if [[ -n "${entry_details[$idx]}" ]]; then
339
- while IFS= read -r detail_line; do
340
- [[ -n "$detail_line" ]] || continue
341
- printf ' - %s\n' "$detail_line"
342
- done <<< "${entry_details[$idx]}"
343
- fi
344
- done
345
- echo
346
- } >> "$inbox_file"
347
- }
348
-
349
- adoption_review_due="$(date_plus_14_days)"
350
- run_workflow_check
351
- run_sprint_next
352
- run_drift_requests
353
- write_json_snapshot "$run_file"
354
- write_inbox
355
-
356
- if [[ "$json_output" -eq 1 ]]; then
357
- cat "$run_file"
358
- else
359
- echo "[Heartbeat] wrote $(repo_relative "$inbox_file")"
360
- echo "[Heartbeat] run snapshot: $(repo_relative "$run_file")"
361
- fi