gsd-pi 2.81.0 → 2.82.0-dev.c22380fc3

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 (521) hide show
  1. package/README.md +60 -30
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  4. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  5. package/dist/resources/extensions/gsd/auto/loop.js +111 -8
  6. package/dist/resources/extensions/gsd/auto/orchestrator.js +113 -6
  7. package/dist/resources/extensions/gsd/auto/phases.js +199 -97
  8. package/dist/resources/extensions/gsd/auto/run-unit.js +66 -3
  9. package/dist/resources/extensions/gsd/auto/session.js +9 -0
  10. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +43 -0
  11. package/dist/resources/extensions/gsd/auto-dashboard.js +182 -178
  12. package/dist/resources/extensions/gsd/auto-dispatch.js +14 -11
  13. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -1
  14. package/dist/resources/extensions/gsd/auto-prompts.js +11 -3
  15. package/dist/resources/extensions/gsd/auto-recovery.js +6 -181
  16. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -0
  17. package/dist/resources/extensions/gsd/auto-start.js +20 -23
  18. package/dist/resources/extensions/gsd/auto-unit-closeout.js +33 -5
  19. package/dist/resources/extensions/gsd/auto-verification.js +12 -6
  20. package/dist/resources/extensions/gsd/auto-worktree.js +8 -0
  21. package/dist/resources/extensions/gsd/auto.js +371 -106
  22. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +13 -6
  23. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +13 -2
  24. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +4 -8
  25. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  26. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -1
  27. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +4 -10
  28. package/dist/resources/extensions/gsd/commands/handlers/parallel.js +9 -0
  29. package/dist/resources/extensions/gsd/commands-handlers.js +15 -2
  30. package/dist/resources/extensions/gsd/context-store.js +112 -0
  31. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  32. package/dist/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  33. package/dist/resources/extensions/gsd/doctor-git-checks.js +41 -6
  34. package/dist/resources/extensions/gsd/git-service.js +2 -1
  35. package/dist/resources/extensions/gsd/gsd-db.js +7 -23
  36. package/dist/resources/extensions/gsd/health-widget-core.js +1 -1
  37. package/dist/resources/extensions/gsd/health-widget.js +4 -10
  38. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  39. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  40. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  41. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  42. package/dist/resources/extensions/gsd/markdown-renderer.js +6 -96
  43. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  44. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  45. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  46. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  47. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  48. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  49. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  50. package/dist/resources/extensions/gsd/native-git-bridge.js +14 -14
  51. package/dist/resources/extensions/gsd/notification-overlay.js +35 -40
  52. package/dist/resources/extensions/gsd/parallel-merge.js +53 -30
  53. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +25 -33
  54. package/dist/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  55. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  56. package/dist/resources/extensions/gsd/prompts/discuss.md +20 -2
  57. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  58. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  59. package/dist/resources/extensions/gsd/recovery-classification.js +15 -1
  60. package/dist/resources/extensions/gsd/session-lock.js +40 -0
  61. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +131 -0
  62. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +247 -0
  63. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +50 -0
  64. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +87 -0
  65. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +50 -0
  66. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +124 -0
  67. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +32 -0
  68. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +41 -0
  69. package/dist/resources/extensions/gsd/state-reconciliation/index.js +99 -0
  70. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +24 -0
  71. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +43 -0
  72. package/dist/resources/extensions/gsd/state-reconciliation/types.js +3 -0
  73. package/dist/resources/extensions/gsd/state-reconciliation.js +5 -26
  74. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  75. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  76. package/dist/resources/extensions/gsd/tui/render-kit.js +74 -0
  77. package/dist/resources/extensions/gsd/watch/header-renderer.js +92 -69
  78. package/dist/resources/extensions/gsd/watch/splash-palette.js +10 -0
  79. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  80. package/dist/resources/extensions/gsd/worktree-lifecycle.js +743 -318
  81. package/dist/resources/extensions/gsd/worktree-telemetry.js +3 -1
  82. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  83. package/dist/web/standalone/.next/BUILD_ID +1 -1
  84. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  85. package/dist/web/standalone/.next/build-manifest.json +3 -3
  86. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  87. package/dist/web/standalone/.next/required-server-files.json +3 -3
  88. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  89. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  99. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  102. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  115. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  127. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  147. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  157. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  163. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  179. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  183. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/index.html +1 -1
  193. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  194. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  195. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  196. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  197. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  198. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  199. package/dist/web/standalone/.next/server/app/page.js +2 -2
  200. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  202. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  203. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  204. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/middleware.js +2 -2
  206. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  208. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  209. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  210. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  211. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  212. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  213. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  214. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  215. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  216. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  217. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  218. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  219. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  220. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  221. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  222. package/dist/web/standalone/server.js +1 -1
  223. package/dist/welcome-screen.d.ts +0 -7
  224. package/dist/welcome-screen.js +60 -69
  225. package/package.json +3 -2
  226. package/packages/contracts/dist/rpc.test.js +7 -0
  227. package/packages/contracts/dist/rpc.test.js.map +1 -1
  228. package/packages/contracts/dist/workflow.d.ts +21 -0
  229. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  230. package/packages/contracts/dist/workflow.js +24 -0
  231. package/packages/contracts/dist/workflow.js.map +1 -1
  232. package/packages/contracts/src/rpc.test.ts +8 -0
  233. package/packages/contracts/src/workflow.ts +24 -0
  234. package/packages/daemon/package.json +2 -2
  235. package/packages/mcp-server/README.md +14 -3
  236. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  237. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  238. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  239. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  240. package/packages/mcp-server/package.json +2 -2
  241. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  242. package/packages/mcp-server/src/workflow-tools.test.ts +22 -0
  243. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  244. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  245. package/packages/native/package.json +1 -1
  246. package/packages/pi-agent-core/package.json +1 -1
  247. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  248. package/packages/pi-ai/dist/index.d.ts +2 -2
  249. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  250. package/packages/pi-ai/dist/index.js +1 -1
  251. package/packages/pi-ai/dist/index.js.map +1 -1
  252. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  253. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  254. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  255. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  256. package/packages/pi-ai/package.json +1 -1
  257. package/packages/pi-ai/src/index.ts +7 -2
  258. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  259. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  260. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  261. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts +2 -0
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.d.ts.map +1 -0
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +47 -0
  265. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -0
  266. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +76 -9
  267. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts +2 -0
  269. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.d.ts.map +1 -0
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +40 -0
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -0
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +0 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +30 -29
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +10 -3
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +13 -13
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -3
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +58 -3
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts +2 -2
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +12 -6
  288. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -41
  291. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +0 -1
  293. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  294. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +86 -82
  295. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts +35 -0
  297. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.d.ts.map +1 -0
  298. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +152 -0
  299. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -0
  300. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts +16 -0
  301. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.d.ts.map +1 -0
  302. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js +73 -0
  303. package/packages/pi-coding-agent/dist/modes/interactive/components/tui-style-kit.js.map +1 -0
  304. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +1 -1
  305. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  306. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +12 -8
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  308. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  309. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  310. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  311. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  312. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  313. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +105 -1
  314. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +27 -26
  317. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +9 -6
  319. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  321. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  322. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  323. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  324. package/packages/pi-coding-agent/package.json +1 -1
  325. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  326. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +56 -0
  327. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +113 -9
  328. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +48 -0
  329. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +10 -3
  330. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +43 -42
  331. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +14 -14
  332. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +64 -3
  333. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +13 -7
  334. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +15 -42
  335. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +84 -104
  336. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +196 -0
  337. package/packages/pi-coding-agent/src/modes/interactive/components/tui-style-kit.ts +94 -0
  338. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +14 -9
  339. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +23 -0
  340. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +106 -1
  341. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +27 -26
  342. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +9 -6
  343. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  344. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  345. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js +14 -1
  346. package/packages/pi-tui/dist/__tests__/overlay-layout.test.js.map +1 -1
  347. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -1
  348. package/packages/pi-tui/dist/overlay-layout.js +9 -6
  349. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  350. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  351. package/packages/pi-tui/dist/tui.js +5 -0
  352. package/packages/pi-tui/dist/tui.js.map +1 -1
  353. package/packages/pi-tui/package.json +1 -1
  354. package/packages/pi-tui/src/__tests__/overlay-layout.test.ts +20 -1
  355. package/packages/pi-tui/src/overlay-layout.ts +10 -7
  356. package/packages/pi-tui/src/tui.ts +6 -0
  357. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  358. package/packages/rpc-client/package.json +1 -1
  359. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  360. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts +2 -0
  361. package/pkg/dist/modes/interactive/theme/theme-highlight.test.d.ts.map +1 -0
  362. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +17 -0
  363. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -0
  364. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  365. package/pkg/dist/modes/interactive/theme/theme.js +105 -1
  366. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  367. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  368. package/pkg/dist/modes/interactive/theme/themes.js +27 -26
  369. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  370. package/pkg/package.json +1 -1
  371. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  372. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  373. package/src/resources/extensions/gsd/auto/contracts.ts +46 -11
  374. package/src/resources/extensions/gsd/auto/loop-deps.ts +9 -5
  375. package/src/resources/extensions/gsd/auto/loop.ts +113 -9
  376. package/src/resources/extensions/gsd/auto/orchestrator.ts +118 -6
  377. package/src/resources/extensions/gsd/auto/phases.ts +158 -19
  378. package/src/resources/extensions/gsd/auto/run-unit.ts +69 -4
  379. package/src/resources/extensions/gsd/auto/session.ts +10 -0
  380. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +82 -0
  381. package/src/resources/extensions/gsd/auto-dashboard.ts +230 -183
  382. package/src/resources/extensions/gsd/auto-dispatch.ts +15 -1
  383. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -1
  384. package/src/resources/extensions/gsd/auto-prompts.ts +11 -3
  385. package/src/resources/extensions/gsd/auto-recovery.ts +7 -209
  386. package/src/resources/extensions/gsd/auto-runtime-state.ts +5 -0
  387. package/src/resources/extensions/gsd/auto-start.ts +22 -22
  388. package/src/resources/extensions/gsd/auto-unit-closeout.ts +51 -0
  389. package/src/resources/extensions/gsd/auto-verification.ts +12 -6
  390. package/src/resources/extensions/gsd/auto-worktree.ts +8 -0
  391. package/src/resources/extensions/gsd/auto.ts +411 -106
  392. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +21 -6
  393. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +12 -2
  394. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +5 -8
  395. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  396. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -1
  397. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +4 -10
  398. package/src/resources/extensions/gsd/commands/handlers/parallel.ts +12 -0
  399. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  400. package/src/resources/extensions/gsd/context-store.ts +120 -1
  401. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  402. package/src/resources/extensions/gsd/docs/preferences-reference.md +1 -1
  403. package/src/resources/extensions/gsd/doctor-git-checks.ts +44 -6
  404. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  405. package/src/resources/extensions/gsd/git-service.ts +2 -0
  406. package/src/resources/extensions/gsd/gsd-db.ts +7 -23
  407. package/src/resources/extensions/gsd/health-widget-core.ts +1 -1
  408. package/src/resources/extensions/gsd/health-widget.ts +6 -10
  409. package/src/resources/extensions/gsd/journal.ts +2 -0
  410. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  411. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  412. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  413. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  414. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -96
  415. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  416. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  417. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  418. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  419. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  420. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  421. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  422. package/src/resources/extensions/gsd/native-git-bridge.ts +14 -13
  423. package/src/resources/extensions/gsd/notification-overlay.ts +50 -46
  424. package/src/resources/extensions/gsd/parallel-merge.ts +61 -34
  425. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +33 -35
  426. package/src/resources/extensions/gsd/prompts/complete-slice.md +14 -12
  427. package/src/resources/extensions/gsd/prompts/discuss-headless.md +20 -2
  428. package/src/resources/extensions/gsd/prompts/discuss.md +20 -2
  429. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  430. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  431. package/src/resources/extensions/gsd/recovery-classification.ts +18 -1
  432. package/src/resources/extensions/gsd/session-lock.ts +41 -0
  433. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +172 -0
  434. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +337 -0
  435. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +69 -0
  436. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +109 -0
  437. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +68 -0
  438. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +185 -0
  439. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +46 -0
  440. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +67 -0
  441. package/src/resources/extensions/gsd/state-reconciliation/index.ts +142 -0
  442. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +27 -0
  443. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +60 -0
  444. package/src/resources/extensions/gsd/state-reconciliation/types.ts +83 -0
  445. package/src/resources/extensions/gsd/state-reconciliation.ts +21 -53
  446. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  447. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  448. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +99 -0
  449. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +729 -176
  450. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +408 -4
  451. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +292 -4
  452. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +20 -5
  453. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +18 -0
  454. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +68 -0
  455. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  456. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  457. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +28 -1
  458. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  459. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  460. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  461. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +20 -2
  462. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +44 -0
  463. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  464. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  465. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +40 -0
  466. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +10 -0
  467. package/src/resources/extensions/gsd/tests/health-widget.test.ts +14 -4
  468. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
  469. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +26 -0
  470. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  471. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +1 -1
  472. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  473. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +116 -24
  474. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -1
  475. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  476. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  477. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  478. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  479. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1 -1
  480. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  481. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +46 -11
  482. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  483. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  484. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +78 -41
  485. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +44 -0
  486. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +12 -217
  487. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +38 -6
  488. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  489. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +2 -2
  490. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +1 -1
  491. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +32 -1
  492. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  493. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +7 -3
  494. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +6 -3
  495. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  496. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +24 -0
  497. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +71 -58
  498. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +952 -0
  499. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -0
  500. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +121 -1
  501. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +66 -0
  502. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +83 -0
  503. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +6 -0
  504. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +158 -58
  505. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +597 -118
  506. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +59 -2
  507. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +18 -0
  508. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  509. package/src/resources/extensions/gsd/tui/render-kit.ts +109 -0
  510. package/src/resources/extensions/gsd/watch/header-renderer.ts +121 -79
  511. package/src/resources/extensions/gsd/watch/splash-palette.ts +11 -0
  512. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  513. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  514. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1171 -526
  515. package/src/resources/extensions/gsd/worktree-telemetry.ts +7 -2
  516. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  517. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  518. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  519. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +0 -1544
  520. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → Wop3A7KRGyR06H3rla_1-}/_buildManifest.js +0 -0
  521. /package/dist/web/standalone/.next/static/{drLMkgfHQ8lzS229_HWYR → Wop3A7KRGyR06H3rla_1-}/_ssgManifest.js +0 -0
@@ -15,7 +15,7 @@ import { deriveState } from "./state.js";
15
15
  import { parseUnitId } from "./unit-id.js";
16
16
  import { assessInterruptedSession, readPausedSessionMetadata, PAUSED_SESSION_KV_KEY, } from "./interrupted-session.js";
17
17
  import { setRuntimeKv, deleteRuntimeKv, } from "./db/runtime-kv.js";
18
- import { getManifestStatus } from "./files.js";
18
+ import { extractSection, getManifestStatus, splitFrontmatter, parseFrontmatterMap } from "./files.js";
19
19
  export { inlinePriorMilestoneSummary } from "./files.js";
20
20
  import { collectSecretsFromManifest } from "../get-secrets-from-user.js";
21
21
  import { gsdRoot, resolveMilestoneFile, resolveMilestonePath, resolveDir, milestonesDir, } from "./paths.js";
@@ -45,11 +45,10 @@ import { isAbsolute, join } from "node:path";
45
45
  import { pathToFileURL } from "node:url";
46
46
  import { readFileSync, existsSync, mkdirSync } from "node:fs";
47
47
  import { atomicWriteSync } from "./atomic-write.js";
48
- import { autoCommitCurrentBranch, captureIntegrationBranch, detectWorktreeName, getCurrentBranch, getMainBranch, setActiveMilestoneId, resolveProjectRoot, } from "./worktree.js";
48
+ import { captureIntegrationBranch, detectWorktreeName, getCurrentBranch, getMainBranch, setActiveMilestoneId, resolveProjectRoot, } from "./worktree.js";
49
49
  import { GitServiceImpl } from "./git-service.js";
50
- import { nativeCheckoutBranch } from "./native-git-bridge.js";
51
50
  import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
52
- import { createAutoWorktree, enterAutoWorktree, enterBranchModeForMilestone, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree.js";
51
+ import { createAutoWorktree, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree.js";
53
52
  import { pruneQueueOrder } from "./queue-order.js";
54
53
  import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
55
54
  import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
@@ -61,9 +60,9 @@ import { recoverFailedMigration } from "./migrate-external.js";
61
60
  import { initRegistry, convertDispatchRules } from "./rule-registry.js";
62
61
  import { emitJournalEvent as _emitJournalEvent } from "./journal.js";
63
62
  import { isClosedStatus } from "./status-guards.js";
64
- import { updateProgressWidget as _updateProgressWidget, updateSliceProgressCache, clearSliceProgressCache, } from "./auto-dashboard.js";
63
+ import { updateProgressWidget as _updateProgressWidget, setCompletionProgressWidget, setAutoOutcomeWidget, updateSliceProgressCache, clearSliceProgressCache, unitVerb, } from "./auto-dashboard.js";
65
64
  import { registerSigtermHandler as _registerSigtermHandler, deregisterSigtermHandler as _deregisterSigtermHandler, } from "./auto-supervisor.js";
66
- import { isDbAvailable, getMilestone } from "./gsd-db.js";
65
+ import { isDbAvailable, getMilestone, getMilestoneSlices } from "./gsd-db.js";
67
66
  import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
68
67
  import { writeUnitRuntimeRecord } from "./unit-runtime.js";
69
68
  import { countPendingCaptures } from "./captures.js";
@@ -93,6 +92,7 @@ import { compileUnitToolContract } from "./tool-contract.js";
93
92
  import { createWorktreeSafetyModule } from "./worktree-safety.js";
94
93
  import { resolveManifest } from "./unit-context-manifest.js";
95
94
  import { classifyFailure } from "./recovery-classification.js";
95
+ import { supportsStructuredQuestions } from "./workflow-mcp.js";
96
96
  import { WorktreeLifecycle, } from "./worktree-lifecycle.js";
97
97
  import { WorktreeStateProjection } from "./worktree-state-projection.js";
98
98
  import { reorderForCaching } from "./prompt-ordering.js";
@@ -253,11 +253,10 @@ function synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile
253
253
  export function _synthesizePausedSessionRecoveryForTest(basePath, unitType, unitId, sessionFile) {
254
254
  return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
255
255
  }
256
- export function _resolvePausedResumeBasePathForTest(basePath, pausedWorktreePath, pathExists = existsSync) {
257
- return pausedWorktreePath && pathExists(pausedWorktreePath)
258
- ? pausedWorktreePath
259
- : basePath;
260
- }
256
+ // `_resolvePausedResumeBasePathForTest` was retired in ADR-016 phase 2 / B3
257
+ // (#5621). Production callers go through
258
+ // `WorktreeLifecycle.resumeFromPausedSession`; the pure helper for tests is
259
+ // `resolvePausedResumeBasePath` exported from `worktree-lifecycle.ts`.
261
260
  const DETACHED_AUTO_KEEPALIVE_INTERVAL_MS = 30_000;
262
261
  function withDetachedAutoKeepalive(run) {
263
262
  const keepAlive = setInterval(() => { }, DETACHED_AUTO_KEEPALIVE_INTERVAL_MS);
@@ -415,6 +414,9 @@ export function getAutoDashboardData() {
415
414
  export function isAutoActive() {
416
415
  return s.active;
417
416
  }
417
+ export function isAutoCompletionStopInProgress() {
418
+ return s.completionStopInProgress;
419
+ }
418
420
  /** Test-only seam for validating auto-mode guards (#4704). Do not use in production code. */
419
421
  export function _setAutoActiveForTest(active) {
420
422
  s.active = active;
@@ -611,6 +613,21 @@ function buildSnapshotOpts(_unitType, _unitId) {
611
613
  ...(s.currentUnitRouting ?? {}),
612
614
  };
613
615
  }
616
+ function currentUnitLabel() {
617
+ if (!s.currentUnit)
618
+ return null;
619
+ return `${unitVerb(s.currentUnit.type)} ${s.currentUnit.id}`;
620
+ }
621
+ function setLifecycleOutcome(ctx, input) {
622
+ if (!ctx?.hasUI)
623
+ return;
624
+ const { unitLabel: unitLabelOverride, ...rest } = input;
625
+ setAutoOutcomeWidget(ctx, {
626
+ ...rest,
627
+ unitLabel: unitLabelOverride !== undefined ? unitLabelOverride : currentUnitLabel(),
628
+ startedAt: s.autoStartTime,
629
+ });
630
+ }
614
631
  function handleLostSessionLock(ctx, lockStatus) {
615
632
  debugLog("session-lock-lost", {
616
633
  lockBase: lockBase(),
@@ -690,33 +707,76 @@ export async function cleanupAfterLoopExit(ctx) {
690
707
  // visible so the user still has a resumable auto-mode signal on screen.
691
708
  if (!s.paused) {
692
709
  ctx.ui.setStatus("gsd-auto", undefined);
693
- ctx.ui.setWidget("gsd-progress", undefined);
710
+ if (s.completionStopInProgress) {
711
+ s.completionStopInProgress = false;
712
+ }
694
713
  initHealthWidget(ctx);
695
714
  }
696
- // Restore CWD out of worktree back to original project root
715
+ // ADR-016 phase 3 (#5693): the stop-path basePath restore + chdir routes
716
+ // through `Lifecycle.restoreToProjectRoot()`, the sole owner of both
717
+ // `s.basePath` mutation and the paired `process.chdir` for auto-loop
718
+ // transitions. The verb assigns `s.basePath` before any throwable work, so
719
+ // a thrown error still leaves basePath restored.
697
720
  if (s.originalBasePath) {
698
- s.basePath = s.originalBasePath;
699
721
  try {
700
- process.chdir(s.basePath);
722
+ buildLifecycle().restoreToProjectRoot();
701
723
  }
702
724
  catch (err) {
703
- /* best-effort */
704
- logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
725
+ logWarning("engine", `restore project root failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
705
726
  }
706
727
  }
707
728
  if (s.originalBasePath && s.cmdCtx) {
708
- const result = await rerootCommandSession(s.cmdCtx, s.basePath);
729
+ const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
709
730
  if (result.status === "cancelled") {
710
- logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
731
+ logWarning("engine", "post-loop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
711
732
  }
712
733
  else if (result.status === "failed") {
713
- logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
734
+ logWarning("engine", `post-loop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.originalBasePath });
714
735
  }
715
736
  }
716
737
  }
717
738
  export function _cleanupAfterLoopExitForTest(ctx) {
718
739
  return cleanupAfterLoopExit(ctx);
719
740
  }
741
+ function normalizeFrontmatterList(value) {
742
+ if (!Array.isArray(value))
743
+ return [];
744
+ return value
745
+ .map(item => typeof item === "string" ? item.trim() : "")
746
+ .filter(item => item.length > 0 && item !== "(none)");
747
+ }
748
+ function firstBoldParagraph(body) {
749
+ const match = body.match(/\*\*([^*\n][\s\S]*?)\*\*/);
750
+ return match?.[1]?.replace(/\s+/g, " ").trim() || undefined;
751
+ }
752
+ function loadMilestoneCompletionRollup(basePath, milestoneId) {
753
+ if (!milestoneId)
754
+ return {};
755
+ const summaryPath = resolveMilestoneFile(basePath, milestoneId, "SUMMARY");
756
+ if (!summaryPath || !existsSync(summaryPath))
757
+ return {};
758
+ try {
759
+ const raw = readFileSync(summaryPath, "utf-8");
760
+ const [frontmatterLines, body] = splitFrontmatter(raw);
761
+ const frontmatter = frontmatterLines ? parseFrontmatterMap(frontmatterLines) : {};
762
+ return {
763
+ milestoneTitle: typeof frontmatter.title === "string" ? frontmatter.title : undefined,
764
+ oneLiner: firstBoldParagraph(body),
765
+ successCriteriaResults: extractSection(body, "Success Criteria Results") ?? undefined,
766
+ definitionOfDoneResults: extractSection(body, "Definition of Done Results") ?? undefined,
767
+ requirementOutcomes: extractSection(body, "Requirement Outcomes") ?? undefined,
768
+ deviations: extractSection(body, "Deviations") ?? undefined,
769
+ followUps: extractSection(body, "Follow-ups") ?? undefined,
770
+ keyDecisions: normalizeFrontmatterList(frontmatter.key_decisions),
771
+ keyFiles: normalizeFrontmatterList(frontmatter.key_files),
772
+ lessonsLearned: normalizeFrontmatterList(frontmatter.lessons_learned),
773
+ };
774
+ }
775
+ catch (err) {
776
+ logWarning("dashboard", `completion roll-up summary read failed: ${err instanceof Error ? err.message : String(err)}`);
777
+ return {};
778
+ }
779
+ }
720
780
  export function _resolveAutoWorktreeExitActionForTest(currentMilestoneId, milestoneMergedInPhases, milestoneComplete) {
721
781
  const action = _selectStopAutoWorktreeExit({
722
782
  currentMilestoneId: currentMilestoneId ?? null,
@@ -725,15 +785,16 @@ export function _resolveAutoWorktreeExitActionForTest(currentMilestoneId, milest
725
785
  });
726
786
  return action === "none" ? "skip" : action;
727
787
  }
728
- export async function stopAuto(ctx, pi, reason) {
788
+ export async function stopAuto(ctx, pi, reason, options = {}) {
729
789
  if (!s.active && !s.paused)
730
790
  return;
731
791
  const loadedPreferences = loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences;
732
792
  const reasonSuffix = reason ? ` — ${reason}` : "";
733
- // #4764 telemetry: record the exit reason and whether the current milestone
734
- // was merged before we entered stopAuto. This is the producer-side signal for
735
- // the #4761 orphan class: milestoneMerged=false + currentMilestoneId present
736
- // is exactly the pattern that strands work.
793
+ const preserveCompletionSurface = Boolean(options.completionWidget);
794
+ s.completionStopInProgress = preserveCompletionSurface;
795
+ // #4764 telemetry: record the exit reason, isolation mode, whether an auto
796
+ // worktree was active, and whether the current milestone was merged before
797
+ // stopAuto. The unmerged-work warning is only meaningful for real worktrees.
737
798
  try {
738
799
  const { emitAutoExit } = await import("./worktree-telemetry.js");
739
800
  // Normalize the free-form reason to a closed set so the telemetry
@@ -755,10 +816,13 @@ export async function stopAuto(ctx, pi, reason) {
755
816
  : rawReason === "stop" || rawReason === "pause"
756
817
  ? rawReason
757
818
  : "other";
758
- emitAutoExit(s.originalBasePath || s.basePath, {
819
+ const telemetryBase = s.originalBasePath || s.basePath;
820
+ emitAutoExit(telemetryBase, {
759
821
  reason: normalizedReason,
760
822
  milestoneId: s.currentMilestoneId ?? undefined,
761
823
  milestoneMerged: s.milestoneMergedInPhases === true,
824
+ isolationMode: getIsolationMode(telemetryBase),
825
+ worktreeActive: isInAutoWorktree(s.basePath),
762
826
  });
763
827
  }
764
828
  catch (err) {
@@ -902,6 +966,21 @@ export async function stopAuto(ctx, pi, reason) {
902
966
  });
903
967
  }
904
968
  }
969
+ // Pre-compute completion widget slice counts while the DB is still open.
970
+ // Step 8 runs after closeDatabase(), so DB-backed slice lookups must happen here.
971
+ const completionMilestoneId = options.completionWidget?.milestoneId ?? s.currentMilestoneId;
972
+ let completedSlices = null;
973
+ let totalSlices = null;
974
+ if (preserveCompletionSurface && options.completionWidget && completionMilestoneId && isDbAvailable()) {
975
+ try {
976
+ const slices = getMilestoneSlices(completionMilestoneId);
977
+ completedSlices = slices.filter(slice => isClosedStatus(slice.status)).length;
978
+ totalSlices = slices.length;
979
+ }
980
+ catch (err) {
981
+ logWarning("dashboard", `completion slice stats lookup failed: ${err instanceof Error ? err.message : String(err)}`);
982
+ }
983
+ }
905
984
  // ── Step 6: DB cleanup ──
906
985
  if (isDbAvailable()) {
907
986
  try {
@@ -914,49 +993,105 @@ export async function stopAuto(ctx, pi, reason) {
914
993
  });
915
994
  }
916
995
  }
917
- // ── Step 7: Restore basePath and chdir ──
918
- try {
919
- if (s.originalBasePath) {
920
- s.basePath = s.originalBasePath;
921
- try {
922
- process.chdir(s.basePath);
923
- }
924
- catch (err) {
925
- /* best-effort */
926
- logWarning("engine", `chdir failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
927
- }
996
+ // ── Step 7: Restore basePath and chdir (ADR-016 phase 3, #5693) ──
997
+ // `restoreToProjectRoot` owns both s.basePath restore and process.chdir;
998
+ // no paired chdir is needed at the call site.
999
+ if (s.originalBasePath) {
1000
+ try {
1001
+ buildLifecycle().restoreToProjectRoot();
1002
+ }
1003
+ catch (e) {
1004
+ debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
928
1005
  }
929
- }
930
- catch (e) {
931
- debugLog("stop-cleanup-basepath", { error: e instanceof Error ? e.message : String(e) });
932
1006
  }
933
1007
  // Re-root the active command session/tool runtime after worktree teardown.
934
1008
  // mergeAndExit restores process.cwd(), but AgentSession has already captured
935
1009
  // its own cwd for tools and system prompt; refresh it before returning to the
936
1010
  // user so follow-up commands do not target a removed milestone worktree.
937
1011
  if (s.originalBasePath && ctx && s.cmdCtx) {
938
- const result = await rerootCommandSession(s.cmdCtx, s.basePath);
1012
+ const result = await rerootCommandSession(s.cmdCtx, s.originalBasePath);
939
1013
  if (result.status === "cancelled") {
940
- logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.basePath });
1014
+ logWarning("engine", "post-stop session re-root was cancelled", { file: "auto.ts", basePath: s.originalBasePath });
941
1015
  }
942
1016
  else if (result.status === "failed") {
943
- logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.basePath });
1017
+ logWarning("engine", `post-stop session re-root failed: ${result.error ?? "unknown"}`, { file: "auto.ts", basePath: s.originalBasePath });
944
1018
  }
945
1019
  }
946
1020
  // ── Step 8: Ledger notification ──
947
1021
  try {
948
1022
  const ledger = getLedger();
1023
+ const isAllComplete = reason === "All milestones complete";
1024
+ const isMilestoneComplete = /^Milestone\s+\S+\s+complete$/i.test(reason ?? "");
1025
+ const notificationPrefix = isAllComplete
1026
+ ? "All milestones complete"
1027
+ : isMilestoneComplete
1028
+ ? `${reason}. Auto-mode finished this milestone`
1029
+ : `Auto-mode stopped${reasonSuffix}`;
949
1030
  if (ledger && ledger.units.length > 0) {
950
1031
  const totals = getProjectTotals(ledger.units);
951
- ctx?.ui.notify(`Auto-mode stopped${reasonSuffix}. Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${ledger.units.length} units`, "info");
1032
+ ctx?.ui.notify(`${notificationPrefix}. Session: ${formatCost(totals.cost)} · ${formatTokenCount(totals.tokens.total)} tokens · ${ledger.units.length} units`, "info");
952
1033
  }
953
1034
  else {
954
- ctx?.ui.notify(`Auto-mode stopped${reasonSuffix}.`, "info");
1035
+ ctx?.ui.notify(`${notificationPrefix}.`, "info");
955
1036
  }
956
1037
  }
957
1038
  catch (e) {
958
1039
  debugLog("stop-cleanup-ledger", { error: e instanceof Error ? e.message : String(e) });
959
1040
  }
1041
+ if (preserveCompletionSurface && ctx && options.completionWidget) {
1042
+ const ledger = getLedger();
1043
+ const units = ledger?.units ?? [];
1044
+ const totals = units.length > 0 ? getProjectTotals(units) : null;
1045
+ let totalInput = 0;
1046
+ let totalCacheRead = 0;
1047
+ try {
1048
+ for (const entry of s.cmdCtx?.sessionManager?.getEntries?.() ?? []) {
1049
+ if (entry.type === "message") {
1050
+ const msgEntry = entry;
1051
+ if (msgEntry.message?.role === "assistant") {
1052
+ const usage = msgEntry.message.usage;
1053
+ if (usage) {
1054
+ totalInput += usage.input || 0;
1055
+ totalCacheRead += usage.cacheRead || 0;
1056
+ }
1057
+ }
1058
+ }
1059
+ }
1060
+ }
1061
+ catch (err) {
1062
+ logWarning("dashboard", `completion stats lookup failed: ${err instanceof Error ? err.message : String(err)}`);
1063
+ }
1064
+ const contextUsage = s.cmdCtx?.getContextUsage?.();
1065
+ const milestoneId = completionMilestoneId;
1066
+ const rollup = loadMilestoneCompletionRollup(s.originalBasePath || s.basePath, milestoneId);
1067
+ setCompletionProgressWidget(ctx, {
1068
+ milestoneId,
1069
+ milestoneTitle: options.completionWidget.milestoneTitle ?? rollup.milestoneTitle,
1070
+ oneLiner: rollup.oneLiner,
1071
+ successCriteriaResults: rollup.successCriteriaResults,
1072
+ definitionOfDoneResults: rollup.definitionOfDoneResults,
1073
+ requirementOutcomes: rollup.requirementOutcomes,
1074
+ deviations: rollup.deviations,
1075
+ followUps: rollup.followUps,
1076
+ keyDecisions: rollup.keyDecisions,
1077
+ keyFiles: rollup.keyFiles,
1078
+ lessonsLearned: rollup.lessonsLearned,
1079
+ reason: reason ?? "Milestone complete",
1080
+ startedAt: s.autoStartTime,
1081
+ totalCost: totals?.cost ?? 0,
1082
+ totalTokens: totals?.tokens.total ?? 0,
1083
+ unitCount: units.length,
1084
+ cacheHitRate: totalCacheRead + totalInput > 0
1085
+ ? (totalCacheRead / (totalCacheRead + totalInput)) * 100
1086
+ : null,
1087
+ contextPercent: contextUsage?.percent ?? null,
1088
+ contextWindow: contextUsage?.contextWindow ?? s.cmdCtx?.model?.contextWindow ?? null,
1089
+ completedSlices,
1090
+ totalSlices,
1091
+ allMilestonesComplete: options.completionWidget.allMilestonesComplete,
1092
+ basePath: s.originalBasePath || s.basePath || null,
1093
+ });
1094
+ }
960
1095
  // ── Step 9: Cmux sidebar / event log ──
961
1096
  try {
962
1097
  pi?.events.emit(CMUX_CHANNELS.SIDEBAR, { action: "clear", preferences: loadedPreferences });
@@ -1047,9 +1182,21 @@ export async function stopAuto(ctx, pi, reason) {
1047
1182
  resetProactiveHealing();
1048
1183
  // UI cleanup
1049
1184
  ctx?.ui.setStatus("gsd-auto", undefined);
1050
- ctx?.ui.setWidget("gsd-progress", undefined);
1051
- if (ctx)
1052
- initHealthWidget(ctx);
1185
+ if (!preserveCompletionSurface) {
1186
+ ctx?.ui.setWidget("gsd-progress", undefined);
1187
+ const status = reason?.startsWith("Blocked:") ? "blocked" : reason?.toLowerCase().includes("fail") ? "failed" : "stopped";
1188
+ setLifecycleOutcome(ctx, {
1189
+ status,
1190
+ title: status === "blocked" ? "Auto-mode blocked" : status === "failed" ? "Auto-mode stopped with an issue" : "Auto-mode stopped",
1191
+ detail: reason ?? "Auto-mode stopped.",
1192
+ nextAction: status === "blocked"
1193
+ ? "Fix the blocker, then run /gsd auto to resume."
1194
+ : "Run /gsd status for the current project state, or /gsd auto to continue.",
1195
+ commands: ["/gsd status for overview", "/gsd auto to run", "/gsd visualize to inspect", "/gsd notifications for history"],
1196
+ });
1197
+ if (ctx)
1198
+ initHealthWidget(ctx);
1199
+ }
1053
1200
  restoreProjectRootEnv();
1054
1201
  restoreMilestoneLockEnv();
1055
1202
  // Drop the active-tool baseline so a subsequent /gsd auto run on the
@@ -1065,7 +1212,7 @@ export async function stopAuto(ctx, pi, reason) {
1065
1212
  debugLog("stop-orchestration-stop", { error: err instanceof Error ? err.message : String(err) });
1066
1213
  }
1067
1214
  // Reset all session state in one call
1068
- s.reset();
1215
+ s.resetAfterStop({ preserveCompletionSurface });
1069
1216
  }
1070
1217
  }
1071
1218
  export function _selectStopAutoWorktreeExit(args) {
@@ -1126,6 +1273,7 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
1126
1273
  // Non-fatal — resume will still work via full bootstrap, just without worktree context
1127
1274
  logWarning("engine", `paused-session DB write failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1128
1275
  }
1276
+ const pausedUnitLabel = currentUnitLabel();
1129
1277
  // Close out the current unit so its runtime record doesn't stay at "dispatched"
1130
1278
  if (s.currentUnit && ctx) {
1131
1279
  try {
@@ -1173,9 +1321,17 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
1173
1321
  s.verificationRetryCount.clear();
1174
1322
  ctx?.ui.setStatus("gsd-auto", "paused");
1175
1323
  ctx?.ui.setWidget("gsd-progress", undefined);
1324
+ const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
1325
+ setLifecycleOutcome(ctx, {
1326
+ status: "paused",
1327
+ title: `${s.stepMode ? "Step" : "Auto"}-mode paused`,
1328
+ detail: _errorContext?.message ?? "Paused by user request.",
1329
+ nextAction: `Type to steer, or run ${resumeCmd} to resume.`,
1330
+ commands: [resumeCmd, "/gsd status for overview", "/gsd notifications for history"],
1331
+ unitLabel: pausedUnitLabel,
1332
+ });
1176
1333
  if (ctx)
1177
1334
  initHealthWidget(ctx);
1178
- const resumeCmd = s.stepMode ? "/gsd next" : "/gsd auto";
1179
1335
  ctx?.ui.notify(`${s.stepMode ? "Step" : "Auto"}-mode paused (Escape). Type to interact, or ${resumeCmd} to resume.`, "info");
1180
1336
  }
1181
1337
  /**
@@ -1186,28 +1342,94 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
1186
1342
  * deps bag is intentionally focused — Lifecycle does not see the wider auto-
1187
1343
  * mode dependency graph.
1188
1344
  */
1189
- function buildLifecycle() {
1190
- const lifecycleDeps = {
1191
- enterAutoWorktree,
1192
- createAutoWorktree,
1193
- enterBranchModeForMilestone,
1194
- getAutoWorktreePath,
1195
- getIsolationMode,
1196
- invalidateAllCaches,
1197
- GitServiceImpl,
1198
- loadEffectiveGSDPreferences,
1345
+ /**
1346
+ * Construct a `WorktreeLifecycleDeps` bag without binding to any session.
1347
+ *
1348
+ * Exported so session-less callers (currently `parallel-merge.ts`) can build
1349
+ * the same deps and call `mergeMilestoneStandalone` through the Worktree
1350
+ * Lifecycle Module instead of bypassing it (ADR-016 phase 2 / A2).
1351
+ */
1352
+ export function buildWorktreeLifecycleDeps() {
1353
+ // ADR-016 phase 2 / C-track close-out:
1354
+ // C1 (#5624) — fs + git-CLI primitives inlined
1355
+ // C2 (#5625) — worktree-manager helpers inlined
1356
+ // C3 (#5626) — cache + preferences + paths inlined
1357
+ // C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
1358
+ //
1359
+ // Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
1360
+ // worktreeProjection, mergeMilestoneToMain). Down from 18 at slice-7
1361
+ // closure.
1362
+ return {
1363
+ gitServiceFactory: (basePath) => {
1364
+ const gitConfig = loadEffectiveGSDPreferences()?.preferences?.git ?? {};
1365
+ return new GitServiceImpl(basePath, gitConfig);
1366
+ },
1199
1367
  worktreeProjection: new WorktreeStateProjection(),
1200
- isInAutoWorktree,
1201
- autoCommitCurrentBranch,
1202
- autoWorktreeBranch,
1203
- teardownAutoWorktree,
1204
1368
  mergeMilestoneToMain,
1205
- getCurrentBranch,
1206
- checkoutBranch: nativeCheckoutBranch,
1207
- resolveMilestoneFile,
1208
- readFileSync: (path, encoding) => readFileSync(path, encoding),
1209
1369
  };
1210
- return new WorktreeLifecycle(s, lifecycleDeps);
1370
+ }
1371
+ function buildLifecycle() {
1372
+ return new WorktreeLifecycle(s, buildWorktreeLifecycleDeps());
1373
+ }
1374
+ /**
1375
+ * Build the production `DispatchAdapter` used by `createWiredAutoOrchestrationModule`.
1376
+ *
1377
+ * Exported so tests can verify parity with `runDispatch`'s `resolveDispatch` call —
1378
+ * the wired adapter must derive `structuredQuestionsAvailable`, `sessionContextWindow`,
1379
+ * `sessionProvider`, and `modelRegistry` the same way phases.ts:runDispatch does.
1380
+ */
1381
+ export function createWiredDispatchAdapter(ctx, pi, dispatchBasePath) {
1382
+ return {
1383
+ async decideNextUnit(input) {
1384
+ const state = input.stateSnapshot;
1385
+ const active = state.activeMilestone;
1386
+ if (!active)
1387
+ return null;
1388
+ const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
1389
+ // Derive session-derived dispatch inputs the same way phases.ts:runDispatch does
1390
+ // (#5789). Prefer caller-supplied values when present so test harnesses and
1391
+ // alternative wirings can inject deterministic snapshots; otherwise pull from
1392
+ // the captured pi/ctx references.
1393
+ const sessionProvider = input.sessionProvider ?? ctx.model?.provider;
1394
+ const sessionContextWindow = input.sessionContextWindow ?? ctx.model?.contextWindow;
1395
+ const modelRegistry = input.modelRegistry ?? ctx.modelRegistry;
1396
+ const authMode = sessionProvider && typeof ctx.modelRegistry?.getProviderAuthMode === "function"
1397
+ ? ctx.modelRegistry.getProviderAuthMode(sessionProvider)
1398
+ : undefined;
1399
+ const activeTools = typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [];
1400
+ // Mirrors runDispatch: deep-planning keeps approval gates in plain chat
1401
+ // because structured questions can be cancelled outside the chat turn on
1402
+ // some transports.
1403
+ const structuredQuestionsAvailable = input.structuredQuestionsAvailable ??
1404
+ (prefs?.planning_depth === "deep"
1405
+ ? "false"
1406
+ : supportsStructuredQuestions(activeTools, {
1407
+ authMode,
1408
+ baseUrl: ctx.model?.baseUrl,
1409
+ })
1410
+ ? "true"
1411
+ : "false");
1412
+ const action = await resolveDispatch({
1413
+ basePath: dispatchBasePath,
1414
+ mid: active.id,
1415
+ midTitle: active.title,
1416
+ state,
1417
+ prefs,
1418
+ structuredQuestionsAvailable,
1419
+ sessionContextWindow,
1420
+ sessionProvider,
1421
+ modelRegistry,
1422
+ });
1423
+ if (action.action !== "dispatch")
1424
+ return null;
1425
+ return {
1426
+ unitType: action.unitType,
1427
+ unitId: action.unitId,
1428
+ reason: action.matchedRule ?? "dispatch",
1429
+ preconditions: [],
1430
+ };
1431
+ },
1432
+ };
1211
1433
  }
1212
1434
  /**
1213
1435
  * Thin entry glue for the new Auto Orchestration module.
@@ -1216,51 +1438,31 @@ function buildLifecycle() {
1216
1438
  * no behavior changes to the existing auto loop. It provides a concrete seam
1217
1439
  * the next refactor steps can adopt incrementally.
1218
1440
  */
1219
- export function createWiredAutoOrchestrationModule(ctx, _pi, dispatchBasePath, runtimeBasePath = resolveProjectRoot(dispatchBasePath)) {
1441
+ export function createWiredAutoOrchestrationModule(ctx, pi, dispatchBasePath, runtimeBasePath = resolveProjectRoot(dispatchBasePath)) {
1220
1442
  const flowId = `auto-orchestrator-${Date.now()}`;
1221
1443
  let seq = 0;
1222
1444
  const deps = {
1223
1445
  stateReconciliation: {
1224
1446
  async reconcileBeforeDispatch() {
1225
1447
  const result = await reconcileBeforeDispatch(dispatchBasePath);
1226
- if (!result.ok) {
1448
+ if (result.blockers.length > 0) {
1227
1449
  return {
1228
1450
  ok: false,
1229
- reason: result.reason,
1451
+ reason: result.blockers[0],
1230
1452
  stateSnapshot: result.stateSnapshot,
1231
1453
  };
1232
1454
  }
1455
+ const repairedKinds = result.repaired.map((d) => d.kind);
1233
1456
  return {
1234
1457
  ok: true,
1235
- reason: result.repaired.join(", "),
1458
+ reason: repairedKinds.length > 0
1459
+ ? `repaired: ${repairedKinds.join(", ")}`
1460
+ : "clean",
1236
1461
  stateSnapshot: result.stateSnapshot,
1237
1462
  };
1238
1463
  },
1239
1464
  },
1240
- dispatch: {
1241
- async decideNextUnit(input) {
1242
- const state = input.stateSnapshot;
1243
- const active = state.activeMilestone;
1244
- if (!active)
1245
- return null;
1246
- const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
1247
- const action = await resolveDispatch({
1248
- basePath: dispatchBasePath,
1249
- mid: active.id,
1250
- midTitle: active.title,
1251
- state,
1252
- prefs,
1253
- });
1254
- if (action.action !== "dispatch")
1255
- return null;
1256
- return {
1257
- unitType: action.unitType,
1258
- unitId: action.unitId,
1259
- reason: action.matchedRule ?? "dispatch",
1260
- preconditions: [],
1261
- };
1262
- },
1263
- },
1465
+ dispatch: createWiredDispatchAdapter(ctx, pi, dispatchBasePath),
1264
1466
  recovery: {
1265
1467
  async classifyAndRecover(input) {
1266
1468
  const recovery = classifyFailure(input);
@@ -1309,12 +1511,26 @@ export function createWiredAutoOrchestrationModule(ctx, _pi, dispatchBasePath, r
1309
1511
  async cleanupOnStop() { },
1310
1512
  },
1311
1513
  health: {
1514
+ checkResourcesStale() {
1515
+ return checkResourcesStale(s.resourceVersionOnStart);
1516
+ },
1312
1517
  async preAdvanceGate() {
1313
- const gate = await preDispatchHealthGate(dispatchBasePath);
1314
- return {
1315
- allow: gate.proceed,
1316
- reason: gate.reason,
1317
- };
1518
+ try {
1519
+ const gate = await preDispatchHealthGate(dispatchBasePath);
1520
+ if (gate.proceed) {
1521
+ return {
1522
+ kind: "pass",
1523
+ fixesApplied: gate.fixesApplied,
1524
+ };
1525
+ }
1526
+ return {
1527
+ kind: "fail",
1528
+ reason: gate.reason ?? "Pre-dispatch health check failed — run /gsd doctor for details.",
1529
+ };
1530
+ }
1531
+ catch (error) {
1532
+ return { kind: "threw", error };
1533
+ }
1318
1534
  },
1319
1535
  async postAdvanceRecord(result) {
1320
1536
  if (result.kind === "error") {
@@ -1382,6 +1598,45 @@ export function createWiredAutoOrchestrationModule(ctx, _pi, dispatchBasePath, r
1382
1598
  }
1383
1599
  },
1384
1600
  },
1601
+ uokGate: {
1602
+ async emit(input) {
1603
+ const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
1604
+ const uokFlags = resolveUokFlags(prefs);
1605
+ if (!uokFlags.gates)
1606
+ return;
1607
+ const milestoneId = input.milestoneId ?? s.currentMilestoneId ?? undefined;
1608
+ try {
1609
+ const { UokGateRunner } = await import("./uok/gate-runner.js");
1610
+ const runner = new UokGateRunner();
1611
+ runner.register({
1612
+ id: input.gateId,
1613
+ type: input.gateType,
1614
+ execute: async () => ({
1615
+ outcome: input.outcome,
1616
+ failureClass: input.failureClass,
1617
+ rationale: input.rationale,
1618
+ findings: input.findings ?? "",
1619
+ }),
1620
+ });
1621
+ await runner.run(input.gateId, {
1622
+ basePath: dispatchBasePath,
1623
+ traceId: `pre-dispatch:${flowId}`,
1624
+ turnId: `orch-${seq}`,
1625
+ milestoneId,
1626
+ unitType: "pre-dispatch",
1627
+ unitId: `orch-${seq}`,
1628
+ });
1629
+ }
1630
+ catch (err) {
1631
+ logWarning("engine", `uok gate emit failed: ${getErrorMessage(err)}`, {
1632
+ file: "auto.ts",
1633
+ gateId: input.gateId,
1634
+ gateType: input.gateType,
1635
+ ...(milestoneId ? { milestoneId } : {}),
1636
+ });
1637
+ }
1638
+ },
1639
+ },
1385
1640
  };
1386
1641
  return createAutoOrchestrator(deps);
1387
1642
  }
@@ -1431,7 +1686,6 @@ function buildLoopDeps(pi) {
1431
1686
  pruneQueueOrder,
1432
1687
  isInAutoWorktree,
1433
1688
  shouldUseWorktreeIsolation,
1434
- mergeMilestoneToMain,
1435
1689
  teardownAutoWorktree,
1436
1690
  createAutoWorktree,
1437
1691
  captureIntegrationBranch,
@@ -1701,7 +1955,12 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1701
1955
  s.verbose = verboseMode;
1702
1956
  s.stepMode = requestedStepMode;
1703
1957
  s.cmdCtx = ctx;
1704
- s.basePath = base;
1958
+ // ADR-016 phase 2 / B2 (#5620): bootstrap basePath transition before
1959
+ // the resume path consults persisted worktree state. Defensive about
1960
+ // s.originalBasePath — the meta-restore above (line 2003 / 2055) may
1961
+ // have already populated it from paused metadata; the verb preserves
1962
+ // that value.
1963
+ buildLifecycle().adoptSessionRoot(base);
1705
1964
  // ── Resume worktree: if the paused session was inside a milestone worktree,
1706
1965
  // apply that path as the dispatch basePath immediately (#3723).
1707
1966
  // This ensures the dispatch loop runs from the worktree directory even when
@@ -1713,7 +1972,8 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1713
1972
  if (resumeWorktreePath && !existsSync(resumeWorktreePath)) {
1714
1973
  logWarning("session", `Worktree was expected at ${resumeWorktreePath} but is missing. Continuing in project-root mode. To restart with a fresh worktree, run /gsd-debug or recreate the milestone.`, { file: "auto.ts", milestoneId: s.currentMilestoneId ?? "" });
1715
1974
  }
1716
- s.basePath = _resolvePausedResumeBasePathForTest(base, resumeWorktreePath);
1975
+ // ADR-016 phase 2 / B3 (#5621): paused-resume worktree-path adoption.
1976
+ buildLifecycle().resumeFromPausedSession(base, resumeWorktreePath);
1717
1977
  // Rebuild scope now that s.basePath reflects the actual worktree (or project root).
1718
1978
  rebuildScope(s.basePath, s.currentMilestoneId);
1719
1979
  // Ensure the workflow-logger audit log is pinned to the project root
@@ -1936,7 +2196,12 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
1936
2196
  s.currentUnit = null;
1937
2197
  s.pendingQuickTasks = [];
1938
2198
  }
1939
- s.basePath = targetBasePath;
2199
+ // ADR-016 phase 2 / B2 (#5620): hook-trigger basePath transition. Treats
2200
+ // the trigger as a bootstrap variant — if the session is fresh,
2201
+ // `originalBasePath` gets set to `targetBasePath`; if the session was
2202
+ // already active with an established `originalBasePath`, the verb
2203
+ // preserves it.
2204
+ buildLifecycle().adoptSessionRoot(targetBasePath);
1940
2205
  if (!s.orchestration) {
1941
2206
  ensureOrchestrationModule(ctx, pi, s.basePath);
1942
2207
  }