@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,206 +1,5 @@
1
- import { existsSync, readFileSync } from "fs";
2
- import { dirname, join } from "path";
3
- import { fileURLToPath } from "url";
1
+ #!/usr/bin/env bun
2
+ export * from "../assets/templates/helpers/workflow-contract";
3
+ import { runTrackedForgeHelper } from "./lib/run-forge-helper";
4
4
 
5
- export type WorkflowContract = {
6
- version: string;
7
- contractId: string;
8
- compatibility: {
9
- agents: string[];
10
- repoLocalFirst: boolean;
11
- };
12
- externalTooling?: {
13
- waza?: {
14
- sourceRepo: string;
15
- managedSkills: string[];
16
- primaryHost: string;
17
- codexPrimaryPath: string;
18
- stagingCachePath: string;
19
- syncMode: string;
20
- hostDriftPolicy: string;
21
- };
22
- codexAutomationProfile?: {
23
- requiredSkills: string[];
24
- optionalSkills: string[];
25
- mode: string;
26
- source: string;
27
- routes: {
28
- workflowHealth: string;
29
- reviewGate: string;
30
- architectureDiagram: string;
31
- };
32
- vendoringPolicy: string;
33
- };
34
- diagramDesign?: {
35
- skillName: string;
36
- primaryHost: string;
37
- codexPrimaryPath: string;
38
- syncMode: string;
39
- vendoringPolicy: string;
40
- };
41
- };
42
- agenticDevelopment?: {
43
- routing: {
44
- productDiscovery: string;
45
- complexEngineeringPlan: string;
46
- designPlan: string;
47
- smallOrMediumPlan: string;
48
- bugOrRegression: string;
49
- postImplementationReview: string;
50
- };
51
- dueDiligence: {
52
- levels: string[];
53
- explicitReportRequiredFor: string[];
54
- };
55
- };
56
- documentation?: {
57
- referenceConfigs?: {
58
- source: string;
59
- repoStubDirectory: string;
60
- packageDirectory: string;
61
- resolverCommand: string;
62
- stubMarker: string;
63
- };
64
- };
65
- helpers: {
66
- runtimeDirectory?: string;
67
- compatibilityDirectory?: string;
68
- scripts: string[];
69
- };
70
- artifacts: {
71
- runtimeManifest: string;
72
- requiredDirectories: string[];
73
- requiredFiles: string[];
74
- runtimeFiles?: string[];
75
- };
76
- documents: {
77
- spec: string;
78
- currentStatus?: string;
79
- planDirectory: string;
80
- taskChecklist?: string;
81
- deferredGoalLedger?: string;
82
- researchReportsDirectory: string;
83
- lessonsLog: string;
84
- };
85
- adoptionTemplates?: {
86
- files?: Record<
87
- string,
88
- {
89
- document: string;
90
- reason: string;
91
- lines: string[];
92
- }
93
- >;
94
- };
95
- migrations: {
96
- legacyVersions: string[];
97
- legacyPaths: string[];
98
- upgrade?: {
99
- strategyVersion: number;
100
- supportedLegacyVersions: string[];
101
- actionClasses: string[];
102
- safety: {
103
- removeOnlyOwnership: string;
104
- unknownFiles: string;
105
- customHooks: string;
106
- ignoredReferenceMaterial: string;
107
- localSecrets: string;
108
- };
109
- actions: Array<{
110
- id: string;
111
- signal: string;
112
- action: "preserve" | "archive" | "reconfigure" | "remove";
113
- risk: "low" | "medium" | "high";
114
- ownership: "known_generated" | "managed_config" | "user_authored" | "user_local";
115
- paths: string[];
116
- targetPaths?: string[];
117
- cleanupMode?: "always" | "generated_helper";
118
- summary: string;
119
- }>;
120
- };
121
- };
122
- };
123
-
124
- const SCRIPT_DIR = dirname(fileURLToPath(import.meta.url));
125
- const REPO_ROOT = SCRIPT_DIR.endsWith("/.ai/harness/scripts")
126
- ? join(SCRIPT_DIR, "../../..")
127
- : SCRIPT_DIR.endsWith("/assets/templates/helpers")
128
- ? join(SCRIPT_DIR, "../../..")
129
- : join(SCRIPT_DIR, "..");
130
- const LOCAL_ASSET_PATH = join(REPO_ROOT, "assets", "workflow-contract.v1.json");
131
-
132
- export function resolveAgenticDevRoot(_repoRoot = REPO_ROOT): string {
133
- const configuredRoot =
134
- process.env.AGENTIC_DEV_ROOT ||
135
- process.env.AGENTIC_DEV_SKILL_ROOT;
136
- if (configuredRoot && configuredRoot.length > 0) return configuredRoot;
137
-
138
- if (existsSync(LOCAL_ASSET_PATH)) return REPO_ROOT;
139
-
140
- const home = process.env.HOME;
141
- if (home && home.length > 0) {
142
- const candidates = [
143
- join(home, "Projects", "forge"),
144
- join(home, ".codex", "skills", "forge"),
145
- join(home, ".claude", "skills", "forge"),
146
- join(home, ".agents", "skills", "forge"),
147
- ];
148
-
149
- for (const candidate of candidates) {
150
- if (existsSync(candidate)) return candidate;
151
- }
152
-
153
- return candidates[0];
154
- }
155
-
156
- return join(".forge", "skills", "forge");
157
- }
158
-
159
- export function resolveAgenticDevSkillRoot(repoRoot = REPO_ROOT): string {
160
- return resolveAgenticDevRoot(repoRoot);
161
- }
162
-
163
- export function resolveUpstreamWorkflowContract(repoRoot = REPO_ROOT): string {
164
- if (existsSync(LOCAL_ASSET_PATH)) return LOCAL_ASSET_PATH;
165
- return join(resolveAgenticDevRoot(repoRoot), "assets", "workflow-contract.v1.json");
166
- }
167
-
168
- export function loadWorkflowContract(
169
- contractPath = resolveUpstreamWorkflowContract()
170
- ): WorkflowContract {
171
- return JSON.parse(readFileSync(contractPath, "utf-8")) as WorkflowContract;
172
- }
173
-
174
- export function resolveInstalledWorkflowContract(repoRoot: string): string {
175
- return join(repoRoot, ".ai", "harness", "workflow-contract.json");
176
- }
177
-
178
- export function resolveWorkflowContractForRepo(repoRoot: string): string {
179
- const installedPath = resolveInstalledWorkflowContract(repoRoot);
180
- return existsSync(installedPath) ? installedPath : resolveUpstreamWorkflowContract(repoRoot);
181
- }
182
-
183
- export function getHelperScripts(contract: WorkflowContract): string[] {
184
- return [...contract.helpers.scripts];
185
- }
186
-
187
- export function getHelperRuntimeDir(contract: WorkflowContract): string {
188
- return (
189
- contract.helpers.runtimeDirectory ??
190
- contract.helpers.compatibilityDirectory ??
191
- "scripts"
192
- );
193
- }
194
-
195
- export function getRequiredDirectories(contract: WorkflowContract): string[] {
196
- return [...contract.artifacts.requiredDirectories];
197
- }
198
-
199
- export function getRequiredFiles(contract: WorkflowContract): string[] {
200
- return [...contract.artifacts.requiredFiles];
201
- }
202
-
203
- if (import.meta.main) {
204
- const contract = loadWorkflowContract(process.argv[2] || resolveUpstreamWorkflowContract());
205
- console.log(JSON.stringify(contract, null, 2));
206
- }
5
+ if (import.meta.main) runTrackedForgeHelper("workflow-contract.ts");
@@ -1,263 +1,4 @@
1
1
  #!/bin/bash
2
2
  set -euo pipefail
3
-
4
- # Contract invariant: durable capability ledgers live under tasks/workstreams.
5
-
6
- usage() {
7
- cat <<'USAGE_EOF'
8
- Usage:
9
- scripts/workstream-sync.sh ensure --block <capability-prefix> [--slug <slug>] [--title <title>] [--plan <plan-file>] [--slice <todo-id>] [--request <architecture-request>]
10
- USAGE_EOF
11
- }
12
-
13
- repo="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
14
- repo="$(cd "$repo" && pwd)"
15
- cd "$repo"
16
-
17
- command_name="${1:-ensure}"
18
- shift || true
19
-
20
- functional_block=""
21
- slug=""
22
- title=""
23
- source_plan="(none)"
24
- current_slice="todo-01"
25
- request_file="(none)"
26
-
27
- json_escape() {
28
- local value="$1"
29
- value="${value//\\/\\\\}"
30
- value="${value//\"/\\\"}"
31
- value="${value//$'\n'/\\n}"
32
- value="${value//$'\r'/\\r}"
33
- value="${value//$'\t'/\\t}"
34
- printf '%s' "$value"
35
- }
36
-
37
- json_get() {
38
- local json_input="$1"
39
- local key="$2"
40
- local parsed=""
41
-
42
- if [[ -z "$json_input" ]]; then
43
- return 1
44
- fi
45
-
46
- if command -v jq >/dev/null 2>&1; then
47
- parsed="$(printf '%s' "$json_input" | jq -r ".$key // empty" 2>/dev/null || true)"
48
- fi
49
-
50
- if [[ -z "$parsed" ]] && command -v node >/dev/null 2>&1; then
51
- parsed="$(JSON_INPUT="$json_input" JSON_KEY="$key" node -e '
52
- const raw = process.env.JSON_INPUT || "";
53
- const key = process.env.JSON_KEY || "";
54
- try {
55
- const value = JSON.parse(raw)[key];
56
- if (value === undefined || value === null) process.exit(1);
57
- process.stdout.write(String(value));
58
- } catch {
59
- process.exit(1);
60
- }
61
- ' 2>/dev/null || true)"
62
- fi
63
-
64
- [[ -n "$parsed" ]] || return 1
65
- printf '%s' "$parsed"
66
- }
67
-
68
- safe_token() {
69
- local value="$1"
70
- value="$(printf '%s' "$value" | tr '[:upper:]' '[:lower:]')"
71
- value="$(printf '%s' "$value" | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//; s/-{2,}/-/g')"
72
- printf '%s' "${value:-workstream}"
73
- }
74
-
75
- validate_block() {
76
- local block="$1"
77
- case "$block" in
78
- ""|.|..|../*|*/../*|/*|*$'\n'*|*$'\r'*)
79
- return 1
80
- ;;
81
- esac
82
- [[ -e "$block" ]]
83
- }
84
-
85
- while [[ $# -gt 0 ]]; do
86
- case "$1" in
87
- --block)
88
- [[ -n "${2:-}" ]] || { echo "workstream-sync: --block requires a value" >&2; exit 2; }
89
- functional_block="${2#./}"
90
- functional_block="${functional_block%/}"
91
- shift 2
92
- ;;
93
- --slug)
94
- [[ -n "${2:-}" ]] || { echo "workstream-sync: --slug requires a value" >&2; exit 2; }
95
- slug="$(safe_token "$2")"
96
- shift 2
97
- ;;
98
- --title)
99
- [[ -n "${2:-}" ]] || { echo "workstream-sync: --title requires a value" >&2; exit 2; }
100
- title="$2"
101
- shift 2
102
- ;;
103
- --plan)
104
- [[ -n "${2:-}" ]] || { echo "workstream-sync: --plan requires a value" >&2; exit 2; }
105
- source_plan="$2"
106
- shift 2
107
- ;;
108
- --slice)
109
- [[ -n "${2:-}" ]] || { echo "workstream-sync: --slice requires a value" >&2; exit 2; }
110
- current_slice="$2"
111
- shift 2
112
- ;;
113
- --request)
114
- [[ -n "${2:-}" ]] || { echo "workstream-sync: --request requires a value" >&2; exit 2; }
115
- request_file="$2"
116
- shift 2
117
- ;;
118
- --help|-h)
119
- usage
120
- exit 0
121
- ;;
122
- *)
123
- echo "workstream-sync: unknown argument: $1" >&2
124
- usage
125
- exit 2
126
- ;;
127
- esac
128
- done
129
-
130
- if [[ "$command_name" != "ensure" ]]; then
131
- echo "workstream-sync: unknown command: $command_name" >&2
132
- usage
133
- exit 2
134
- fi
135
-
136
- if ! validate_block "$functional_block"; then
137
- echo "workstream-sync: --block must be an existing repo-relative capability prefix" >&2
138
- exit 2
139
- fi
140
-
141
- if [[ ! -f "scripts/capability-resolver.ts" ]] || ! command -v bun >/dev/null 2>&1; then
142
- echo "workstream-sync: scripts/capability-resolver.ts and bun are required" >&2
143
- exit 2
144
- fi
145
-
146
- if ! resolver_json="$(bun scripts/capability-resolver.ts match --path "$functional_block" --format json 2>&1)"; then
147
- echo "$resolver_json" >&2
148
- exit 1
149
- fi
150
-
151
- if [[ "$(json_get "$resolver_json" "matched" || true)" != "true" ]]; then
152
- echo "workstream-sync: --block must match a declared capability prefix in .ai/context/capabilities.json" >&2
153
- exit 2
154
- fi
155
-
156
- capability_id="$(json_get "$resolver_json" "capability_id")"
157
- matched_prefix="$(json_get "$resolver_json" "matched_prefix")"
158
- architecture_domain="$(json_get "$resolver_json" "architecture_domain")"
159
- architecture_capability="$(json_get "$resolver_json" "architecture_capability")"
160
- architecture_module="$(json_get "$resolver_json" "architecture_module")"
161
- workstream_dir="$(json_get "$resolver_json" "workstream_dir")"
162
- contract_agents="$(json_get "$resolver_json" "contract_agents" || true)"
163
- contract_claude="$(json_get "$resolver_json" "contract_claude" || true)"
164
-
165
- if [[ -z "$slug" ]]; then
166
- if [[ -n "$title" ]]; then
167
- slug="$(safe_token "$title")"
168
- else
169
- slug="$(date '+%Y%m%d')-${architecture_capability}"
170
- fi
171
- fi
172
- title="${title:-$slug}"
173
- workstream_file="${workstream_dir}/${slug}.md"
174
- event_file=".ai/harness/events.jsonl"
175
- iso_timestamp="$(date '+%Y-%m-%dT%H:%M:%S%z')"
176
- architecture_domain_file="docs/architecture/domains/${architecture_domain}.md"
177
-
178
- mkdir -p "$workstream_dir" "$(dirname "$architecture_module")" "$(dirname "$architecture_domain_file")" ".ai/harness"
179
-
180
- if [[ ! -f "$architecture_domain_file" ]]; then
181
- cat > "$architecture_domain_file" <<EOF_DOMAIN
182
- # Architecture Domain: ${architecture_domain}
183
-
184
- > **Source**: \`.ai/context/capabilities.json\`
185
-
186
- ## Capabilities
187
-
188
- - \`${capability_id}\` -> \`${architecture_module}\`
189
- EOF_DOMAIN
190
- elif ! grep -Fq "$architecture_module" "$architecture_domain_file"; then
191
- {
192
- echo ""
193
- echo "- \`${capability_id}\` -> \`${architecture_module}\`"
194
- } >> "$architecture_domain_file"
195
- fi
196
-
197
- if [[ ! -f "$architecture_module" ]]; then
198
- cat > "$architecture_module" <<EOF_MODULE
199
- # Architecture Module: ${architecture_domain}/${architecture_capability}
200
-
201
- > **Capability ID**: \`${capability_id}\`
202
- > **Functional Block**: \`${functional_block}\`
203
- > **Matched Prefix**: \`${matched_prefix}\`
204
- > **Domain**: \`${architecture_domain}\`
205
- > **Capability**: \`${architecture_capability}\`
206
-
207
- ## Boundary
208
-
209
- - Responsibility: Keep the capability boundary, entrypoints, runtime path, dependency rules, and local verification pointers for \`${capability_id}\`.
210
- - Entrypoints: \`${matched_prefix}\`
211
- - Runtime path: \`${matched_prefix}\`
212
- - Local contracts: \`${contract_agents:-none}\`, \`${contract_claude:-none}\`
213
-
214
- ## Active Workstreams
215
-
216
- - \`${workstream_file}\`
217
- EOF_MODULE
218
- elif ! grep -Fq "$workstream_file" "$architecture_module"; then
219
- {
220
- echo ""
221
- echo "- \`${workstream_file}\`"
222
- } >> "$architecture_module"
223
- fi
224
-
225
- if [[ ! -f "$workstream_file" ]]; then
226
- cat > "$workstream_file" <<EOF_WORKSTREAM
227
- # Workstream: ${title}
228
-
229
- > **Status**: active
230
- > **Capability ID**: \`${capability_id}\`
231
- > **Functional Block**: \`${functional_block}\`
232
- > **Matched Prefix**: \`${matched_prefix}\`
233
- > **Architecture Domain**: \`${architecture_domain}\`
234
- > **Architecture Capability**: \`${architecture_capability}\`
235
- > **Architecture Module**: \`${architecture_module}\`
236
- > **Source Plan**: ${source_plan}
237
- > **Current Slice**: ${current_slice}
238
- > **Last Handoff**: \`.ai/harness/session/continuation.md\`
239
- > **Architecture Request**: ${request_file}
240
-
241
- ## Purpose
242
-
243
- Track durable multi-session progress for \`${capability_id}\` without inflating local agent instructions.
244
-
245
- ## TODOs
246
-
247
- - [ ] ${current_slice}: Complete the current executable slice for \`${capability_id}\`.
248
-
249
- ## Notes
250
-
251
- - Project the current slice into \`tasks/todos.md\` for a single session.
252
- - Keep architecture facts in \`${architecture_module}\`; keep execution progress here.
253
- EOF_WORKSTREAM
254
- fi
255
-
256
- event_json="{\"ts\":\"$(json_escape "$iso_timestamp")\",\"file_path\":\"$(json_escape "$workstream_file")\",\"severity\":\"medium\",\"functional_block\":\"$(json_escape "$functional_block")\",\"capability_id\":\"$(json_escape "$capability_id")\",\"matched_prefix\":\"$(json_escape "$matched_prefix")\",\"architecture_domain\":\"$(json_escape "$architecture_domain")\",\"architecture_capability\":\"$(json_escape "$architecture_capability")\",\"architecture_module\":\"$(json_escape "$architecture_module")\",\"workstream_dir\":\"$(json_escape "$workstream_dir")\",\"contract_agents\":\"$(json_escape "$contract_agents")\",\"contract_claude\":\"$(json_escape "$contract_claude")\",\"active_workstream\":\"$(json_escape "$workstream_file")\",\"change_type\":\"workstream-sync\",\"spawn_recommended\":false,\"contract_sync_required\":true,\"request_file\":\"$(json_escape "$request_file")\"}"
257
- printf '%s\n' "$event_json" >> "$event_file"
258
-
259
- if [[ -x "scripts/context-contract-sync.sh" ]]; then
260
- bash "scripts/context-contract-sync.sh" sync-event --json "$event_json"
261
- fi
262
-
263
- echo "[WorkstreamSync] Ensured $workstream_file for $capability_id."
3
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
4
+ exec "$SCRIPT_DIR/lib/run-forge-helper.sh" "workstream-sync.sh" "$@"
@@ -1,4 +1,4 @@
1
- import type { GitHubStatus } from "../github/github";
1
+ import type { GitHubStatus } from "../github/contracts";
2
2
  import type { McpAgentRunnerName } from "../mcp/types";
3
3
  import type { ControllerAgent, ControllerTask } from "../controller/types";
4
4
 
@@ -17,7 +17,7 @@ import { Command } from 'commander';
17
17
  import { runDoctor, type CheckStatus, type DoctorReport } from './doctor';
18
18
  import { runStatus, type StatusReport } from './status';
19
19
  import { runMcpSetupChatgpt } from '../mcp/setup';
20
- import { resolveRepoPreferredControllerHome } from '../repositories/controller-home';
20
+ import { resolveControllerHome } from '../repositories/controller-home';
21
21
  import {
22
22
  configureSetupProfile,
23
23
  detectSetupPlatform,
@@ -791,7 +791,7 @@ export function openSetupSession(options: SetupSessionOptions = {}): SetupSessio
791
791
  const platform = options.platform ?? detectSetupPlatform({ env: options.env });
792
792
  const target = options.target ?? setupHostTarget(profile);
793
793
  const report = options.report ?? runInitHook({ ...options, target });
794
- const controllerHome = resolveRepoPreferredControllerHome(options.cwd ?? process.cwd(), options.controllerHome);
794
+ const controllerHome = resolveControllerHome(options.controllerHome);
795
795
  const nextAction = profileNextAction(profile, platform, { controllerHome, accountHome: options.accountHome }) ?? report.agent_actions[0];
796
796
  const now = (options.now ?? (() => new Date()))().toISOString();
797
797
  const reuse = previous && previous.status !== 'closed';
@@ -1010,4 +1010,4 @@ export function buildSetupCommand(): Command {
1010
1010
  });
1011
1011
 
1012
1012
  return command;
1013
- }
1013
+ }
@@ -28,7 +28,7 @@ export interface McpServeOptions {
28
28
  devRunnerAgents?: string;
29
29
  devRunnerTimeoutMs?: string;
30
30
  devRunnerMaxTimeoutMs?: string;
31
- toolset?: 'core' | 'advanced' | 'full';
31
+ toolset?: 'facade' | 'core' | 'advanced' | 'full';
32
32
  }
33
33
 
34
34
  interface McpAccessOptions {
@@ -161,14 +161,14 @@ export function buildMcpCommand(): Command {
161
161
  mcp
162
162
  .command('serve')
163
163
  .description('Start the forge MCP server')
164
- .option('--repo <path>', 'Repository root to expose through the selected MCP profile', '.')
164
+ .option('--repo <path>', 'Repository root to expose through the selected MCP profile')
165
165
  .option('--controller-home <path>', 'Controller state root; defaults to repo _ops/controller-home when present')
166
166
  .option('--transport <transport>', 'Transport: stdio|http', 'stdio')
167
167
  .option('--host <host>', 'HTTP bind host', '127.0.0.1')
168
168
  .option('--port <port>', 'HTTP bind port', '8765')
169
169
  .option('--profile <profile>', 'MCP profile: planner|executor|orchestrator|controller', 'controller')
170
- .option('--toolset <toolset>', 'Controller toolset: core|advanced|full (default core; advanced/full are explicit compatibility profiles)')
171
- .option('--auth <mode>', 'HTTP auth mode: oauth|bearer', 'oauth')
170
+ .option('--toolset <toolset>', 'Controller toolset: facade|core|advanced|full (default advanced; facade is an explicit five-tool ChatGPT surface)')
171
+ .option('--auth <mode>', 'HTTP auth mode: oauth|bearer|none', 'oauth')
172
172
  .option('--enable-chatgpt-browser', 'Expose tools that operate the user logged-in ChatGPT Web browser session')
173
173
  .option('--enable-dev-runner', 'Enable local Codex/Claude task runners for controller or orchestrator profiles')
174
174
  .option('--dev-runner-agents <agents>', 'Comma-separated dev runner agents: codex,claude')
@@ -181,7 +181,11 @@ export function buildMcpCommand(): Command {
181
181
  const devRunnerMaxTimeoutMs = parsePositiveIntegerOption('dev-runner-max-timeout-ms', rawOpts.devRunnerMaxTimeoutMs);
182
182
  if (rawOpts.transport === 'stdio') {
183
183
  await startMcpStdio({
184
- repo: rawOpts.repo,
184
+ // stdio preserves its historical current-directory default.
185
+ // The HTTP controller Gateway deliberately leaves this unset so
186
+ // it can serve Controller Home without registering a launchd
187
+ // working directory as a repository.
188
+ repo: rawOpts.repo ?? '.',
185
189
  controllerHome: rawOpts.controllerHome,
186
190
  profile: rawOpts.profile,
187
191
  toolset: rawOpts.toolset,
@@ -63,13 +63,17 @@ export function installerNextSteps(result:Record<string,unknown>):string[]{
63
63
  .filter(Boolean)
64
64
  .slice(0,10);
65
65
  }
66
- function registrationFrom(result:Record<string,unknown>,entry:RegistryEntry):ExternalPluginRegistrationInput{
66
+ export function registrationFrom(
67
+ result:Record<string,unknown>,
68
+ entry:RegistryEntry,
69
+ options: { packageIdentityVerified?: boolean } = {},
70
+ ):ExternalPluginRegistrationInput{
67
71
  if(result.registration){const input=result.registration as ExternalPluginRegistrationInput;if(input.pluginId!==entry.id)throw new Error('PLUGIN_INSTALLER_ID_MISMATCH');if(input.pluginVersion!==entry.version)throw new Error('PLUGIN_INSTALLER_VERSION_MISMATCH');return input;}
68
72
  const facts=result.providerInstall as Record<string,unknown>|undefined;
69
73
  if(!facts||facts.kind!=='desktop_operator'||entry.id!=='desktop_operator')throw new Error('PLUGIN_INSTALLER_REGISTRATION_MISSING');
70
74
  const expectedProviderVersion=entry.providerVersion??entry.version;
71
75
  const expectedProtocolVersion=entry.protocolVersion??'1.0';
72
- if(facts.pluginVersion!==expectedProviderVersion)throw new Error(`PLUGIN_INSTALLER_PROVIDER_VERSION_MISMATCH: expected ${expectedProviderVersion} for ${entry.id}@${entry.version}, actual ${String(facts.pluginVersion??'missing')}`);
76
+ if(facts.pluginVersion!==expectedProviderVersion&&!options.packageIdentityVerified)throw new Error(`PLUGIN_INSTALLER_PROVIDER_VERSION_MISMATCH: expected ${expectedProviderVersion} for ${entry.id}@${entry.version}, actual ${String(facts.pluginVersion??'missing')}`);
73
77
  if(facts.protocolVersion!==expectedProtocolVersion)throw new Error(`PLUGIN_INSTALLER_PROTOCOL_VERSION_MISMATCH: expected ${expectedProtocolVersion} for ${entry.id}@${entry.version}, actual ${String(facts.protocolVersion??'missing')}`);
74
78
  const socketPath=typeof facts.socketPath==='string'?facts.socketPath:'';const launchAgentLabel=typeof facts.launchAgentLabel==='string'?facts.launchAgentLabel:'';const expectedProgramContains=typeof facts.expectedProgramContains==='string'?facts.expectedProgramContains:'';
75
79
  if(!isAbsolute(socketPath)||!launchAgentLabel||!expectedProgramContains)throw new Error('PLUGIN_INSTALLER_PROVIDER_FACTS_INVALID');
@@ -86,7 +90,12 @@ function install(entry:RegistryEntry,controllerHome:string):Record<string,unknow
86
90
  const manifest=JSON.parse(readFileSync(manifestPath,'utf8')) as Record<string,unknown>;if(manifest.id!==entry.id||manifest.version!==entry.version)throw new Error(`PLUGIN_PACKAGE_IDENTITY_MISMATCH: ${entry.id}`);
87
91
  if(existsSync(finalRoot)){renameSync(finalRoot,backup);backed=true;}renameSync(stage,finalRoot);
88
92
  const result=installerJson(run(process.execPath,[within(finalRoot,entry.installer)],finalRoot,180000));
89
- const installed=installExternalPluginRegistration(controllerHome,registrationFrom(result,entry));
93
+ // The staged package manifest is checked against the catalog before the
94
+ // installer runs. Provider identity is then probed through the installed
95
+ // socket during registry sync. The installer's providerInstall version is
96
+ // useful diagnostics, but must not strand a verified package when that
97
+ // helper field is stale.
98
+ const installed=installExternalPluginRegistration(controllerHome,registrationFrom(result,entry,{packageIdentityVerified:true}));
90
99
  const repository=controllerPluginRepository(controllerHome);syncAssistantPluginRegistry(controllerHome,repository);const plugin=getAssistantPluginManifest(controllerHome,repository,entry.id);
91
100
  if(backed)rmSync(backup,{recursive:true,force:true});
92
101
  return{pluginId:entry.id,version:entry.version,packageRoot:finalRoot,registrationRevision:installed.revision,enabled:plugin.enabled,health:plugin.health,nextSteps:installerNextSteps(result)};
@@ -310,7 +310,10 @@ export async function verifyRecoveryConnector(
310
310
  body: initializeBody,
311
311
  });
312
312
  const challenge = response.headers.get('www-authenticate') ?? '';
313
- const ok = response.status === 401 && /\bBearer\b/i.test(challenge) && challenge.includes('oauth-protected-resource');
313
+ const ok = response.status === 401
314
+ && /\bBearer\b/i.test(challenge)
315
+ && challenge.includes('error="invalid_token"')
316
+ && challenge.includes('oauth-protected-resource');
314
317
  probes.unauthenticatedChallenge = { ok, status: response.status };
315
318
  if (!ok) failures.push('unauthenticatedChallenge: Recovery MCP did not return the expected OAuth Bearer challenge.');
316
319
  } catch (error) {
@@ -514,11 +517,15 @@ export function buildRecoveryCommand(): Command {
514
517
  const home = resolveControllerHome(opts.controllerHome);
515
518
  const repoRoot = resolve(opts.repo);
516
519
  const current = loadRecoveryConfig(home);
517
- const primaryConnectorService = launchdService(
520
+ const primaryConnectorBase = launchdService(
518
521
  opts.primaryConnectorServiceLabel,
519
522
  opts.primaryConnectorServicePlist,
520
523
  'RECOVERY_PRIMARY_CONNECTOR',
521
524
  ) as PrimaryConnectorServiceConfig;
525
+ const primaryConnectorService: PrimaryConnectorServiceConfig = {
526
+ ...primaryConnectorBase,
527
+ ...(current.primaryConnectorService?.localMcpUrl ? { localMcpUrl: current.primaryConnectorService.localMcpUrl } : {}),
528
+ };
522
529
  const installed = await installStandaloneRecovery({
523
530
  controllerHome: home,
524
531
  repoRoot,
@@ -526,6 +533,7 @@ export function buildRecoveryCommand(): Command {
526
533
  publicMcpUrl: current.publicMcpUrl,
527
534
  recoveryPublicUrl: current.recoveryPublicUrl,
528
535
  recoveryTunnelService: current.recoveryTunnelService,
536
+ primaryPublicTunnelService: current.primaryPublicTunnelService,
529
537
  primaryRuntimeService: current.primaryRuntimeService ?? { platform: 'launchd' },
530
538
  primaryConnectorService,
531
539
  });
@@ -622,6 +630,9 @@ export function buildRecoveryCommand(): Command {
622
630
  .option('--recovery-tunnel-service-plist <path>', 'Absolute Recovery tunnel launchd plist path')
623
631
  .option('--primary-connector-service-label <label>', 'Primary OAuth/Connector launchd label managed by standalone Recovery')
624
632
  .option('--primary-connector-service-plist <path>', 'Absolute primary OAuth/Connector launchd plist path')
633
+ .option('--primary-connector-local-url <url>', 'Local primary OAuth/Connector MCP endpoint used to distinguish Connector from tunnel failures')
634
+ .option('--primary-tunnel-service-label <label>', 'Primary public MCP tunnel launchd label managed by standalone Recovery')
635
+ .option('--primary-tunnel-service-plist <path>', 'Absolute primary public MCP tunnel launchd plist path')
625
636
  .option('--stage-only', 'Build and canary the Recovery release without activating services')
626
637
  .action(async (opts: {
627
638
  controllerHome: string;
@@ -632,13 +643,23 @@ export function buildRecoveryCommand(): Command {
632
643
  recoveryTunnelServicePlist?: string;
633
644
  primaryConnectorServiceLabel?: string;
634
645
  primaryConnectorServicePlist?: string;
646
+ primaryConnectorLocalUrl?: string;
647
+ primaryTunnelServiceLabel?: string;
648
+ primaryTunnelServicePlist?: string;
635
649
  stageOnly?: boolean;
636
650
  }) => {
637
651
  const home = resolveControllerHome(opts.controllerHome);
638
652
  const port = Number(opts.port);
639
653
  if (!Number.isInteger(port) || port < 1024 || port > 65535) throw new Error('RECOVERY_PORT_INVALID');
640
654
  const recoveryTunnelService = launchdService(opts.recoveryTunnelServiceLabel, opts.recoveryTunnelServicePlist, 'RECOVERY_TUNNEL') as PublicTunnelServiceConfig | undefined;
641
- const primaryConnectorService = launchdService(opts.primaryConnectorServiceLabel, opts.primaryConnectorServicePlist, 'RECOVERY_PRIMARY_CONNECTOR') as PrimaryConnectorServiceConfig | undefined;
655
+ const primaryConnectorBase = launchdService(opts.primaryConnectorServiceLabel, opts.primaryConnectorServicePlist, 'RECOVERY_PRIMARY_CONNECTOR') as PrimaryConnectorServiceConfig | undefined;
656
+ const primaryConnectorLocalUrl = endpoint(opts.primaryConnectorLocalUrl, 'RECOVERY_PRIMARY_CONNECTOR_LOCAL_URL');
657
+ if (primaryConnectorLocalUrl && !primaryConnectorBase) throw new Error('RECOVERY_PRIMARY_CONNECTOR_LABEL_REQUIRED_FOR_LOCAL_URL');
658
+ const primaryConnectorService = primaryConnectorBase
659
+ ? { ...primaryConnectorBase, ...(primaryConnectorLocalUrl ? { localMcpUrl: primaryConnectorLocalUrl } : {}) }
660
+ : undefined;
661
+ const primaryPublicTunnelService = launchdService(opts.primaryTunnelServiceLabel, opts.primaryTunnelServicePlist, 'RECOVERY_PRIMARY_TUNNEL') as PublicTunnelServiceConfig | undefined;
662
+ if (primaryPublicTunnelService && !primaryConnectorService) throw new Error('RECOVERY_PRIMARY_CONNECTOR_REQUIRED_FOR_PRIMARY_TUNNEL');
642
663
  const recoveryPublicUrl = endpoint(opts.recoveryPublicUrl, 'RECOVERY_PUBLIC_URL');
643
664
  if (Boolean(recoveryTunnelService) !== Boolean(recoveryPublicUrl)) {
644
665
  throw new Error('RECOVERY_PUBLIC_URL_AND_TUNNEL_SERVICE_MUST_BE_CONFIGURED_TOGETHER');
@@ -653,6 +674,7 @@ export function buildRecoveryCommand(): Command {
653
674
  publicMcpUrl: endpoint(opts.publicMcpUrl, 'PUBLIC_MCP_URL'),
654
675
  recoveryPublicUrl,
655
676
  recoveryTunnelService,
677
+ primaryPublicTunnelService,
656
678
  primaryConnectorService,
657
679
  });
658
680
  output({