gsd-pi 2.79.0-dev.ece5fd8ba → 2.80.0-dev.0aaa4fc17

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 (742) hide show
  1. package/dist/resources/.managed-resources-content-hash +1 -1
  2. package/dist/resources/GSD-WORKFLOW.md +2 -2
  3. package/dist/resources/extensions/github-sync/templates.js +90 -74
  4. package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
  5. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
  6. package/dist/resources/extensions/gsd/auto/loop.js +394 -520
  7. package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
  8. package/dist/resources/extensions/gsd/auto/phases.js +92 -36
  9. package/dist/resources/extensions/gsd/auto/run-unit.js +19 -15
  10. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  11. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
  16. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
  21. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
  23. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
  24. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
  26. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
  27. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
  28. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
  29. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
  30. package/dist/resources/extensions/gsd/auto-dashboard.js +54 -15
  31. package/dist/resources/extensions/gsd/auto-dispatch.js +10 -0
  32. package/dist/resources/extensions/gsd/auto-post-unit.js +10 -10
  33. package/dist/resources/extensions/gsd/auto-prompts.js +279 -4
  34. package/dist/resources/extensions/gsd/auto-recovery.js +198 -59
  35. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
  36. package/dist/resources/extensions/gsd/auto-start.js +2 -3
  37. package/dist/resources/extensions/gsd/auto-verification.js +2 -11
  38. package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
  39. package/dist/resources/extensions/gsd/auto.js +168 -3
  40. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +24 -2
  41. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  42. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -6
  43. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +129 -1
  44. package/dist/resources/extensions/gsd/clean-root-preflight.js +42 -4
  45. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  46. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  47. package/dist/resources/extensions/gsd/commands-ship.js +23 -46
  48. package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
  49. package/dist/resources/extensions/gsd/component-loader.js +5 -11
  50. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  51. package/dist/resources/extensions/gsd/custom-workflow-engine.js +25 -1
  52. package/dist/resources/extensions/gsd/db-adapter.js +47 -0
  53. package/dist/resources/extensions/gsd/db-base-schema.js +351 -0
  54. package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
  55. package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
  56. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
  57. package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
  58. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
  59. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
  60. package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
  61. package/dist/resources/extensions/gsd/db-migration-steps.js +410 -0
  62. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
  63. package/dist/resources/extensions/gsd/db-open-state.js +32 -0
  64. package/dist/resources/extensions/gsd/db-provider.js +108 -0
  65. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
  66. package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
  67. package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
  68. package/dist/resources/extensions/gsd/db-transaction.js +63 -0
  69. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
  70. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
  71. package/dist/resources/extensions/gsd/detection.js +106 -0
  72. package/dist/resources/extensions/gsd/escalation.js +2 -0
  73. package/dist/resources/extensions/gsd/graph.js +9 -3
  74. package/dist/resources/extensions/gsd/gsd-db.js +316 -1520
  75. package/dist/resources/extensions/gsd/guided-flow.js +63 -12
  76. package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
  77. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
  78. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  79. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  80. package/dist/resources/extensions/gsd/model-router.js +9 -6
  81. package/dist/resources/extensions/gsd/notification-widget.js +21 -3
  82. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  83. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
  84. package/dist/resources/extensions/gsd/pr-evidence.js +117 -0
  85. package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
  86. package/dist/resources/extensions/gsd/process-task-path.js +61 -0
  87. package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
  88. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -31
  89. package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  90. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  91. package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
  92. package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
  93. package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
  94. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  95. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  96. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  97. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  98. package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  99. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +47 -59
  100. package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  101. package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
  102. package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  103. package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
  104. package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
  105. package/dist/resources/extensions/gsd/prompts/system.md +65 -107
  106. package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  107. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  108. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  109. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  110. package/dist/resources/extensions/gsd/state.js +4 -0
  111. package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
  112. package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
  113. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  114. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  115. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +6 -1
  116. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  117. package/dist/resources/extensions/gsd/unit-runtime.js +11 -0
  118. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  119. package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
  120. package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
  121. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  122. package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
  123. package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
  124. package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
  125. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  126. package/dist/resources/extensions/shared/interview-ui.js +15 -4
  127. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  128. package/dist/web/standalone/.next/BUILD_ID +1 -1
  129. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  130. package/dist/web/standalone/.next/build-manifest.json +3 -3
  131. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  132. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  133. package/dist/web/standalone/.next/required-server-files.json +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/notifications/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/session/events/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/index.html +1 -1
  215. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  216. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  217. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  218. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  219. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  221. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  222. package/dist/web/standalone/.next/server/chunks/167.js +2 -0
  223. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  224. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  227. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  228. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  229. package/dist/web/standalone/.next/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
  230. package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
  231. package/dist/web/standalone/package.json +1 -0
  232. package/dist/web/standalone/server.js +1 -1
  233. package/package.json +18 -7
  234. package/packages/contracts/dist/index.d.ts +3 -0
  235. package/packages/contracts/dist/index.d.ts.map +1 -0
  236. package/packages/contracts/dist/index.js +5 -0
  237. package/packages/contracts/dist/index.js.map +1 -0
  238. package/packages/contracts/dist/rpc.d.ts +549 -0
  239. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  240. package/packages/contracts/dist/rpc.js +53 -0
  241. package/packages/contracts/dist/rpc.js.map +1 -0
  242. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  243. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  244. package/packages/contracts/dist/rpc.test.js +47 -0
  245. package/packages/contracts/dist/rpc.test.js.map +1 -0
  246. package/packages/contracts/dist/workflow.d.ts +180 -0
  247. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  248. package/packages/contracts/dist/workflow.js +201 -0
  249. package/packages/contracts/dist/workflow.js.map +1 -0
  250. package/packages/contracts/package.json +39 -0
  251. package/packages/contracts/src/index.ts +5 -0
  252. package/packages/contracts/src/rpc.test.ts +72 -0
  253. package/packages/contracts/src/rpc.ts +286 -0
  254. package/packages/contracts/src/workflow.ts +213 -0
  255. package/packages/contracts/tsconfig.json +25 -0
  256. package/packages/daemon/package.json +3 -2
  257. package/packages/daemon/src/event-bridge.test.ts +2 -1
  258. package/packages/daemon/src/event-bridge.ts +1 -1
  259. package/packages/daemon/src/event-formatter.test.ts +1 -2
  260. package/packages/daemon/src/event-formatter.ts +1 -2
  261. package/packages/daemon/src/session-manager.ts +2 -2
  262. package/packages/daemon/src/types.ts +3 -18
  263. package/packages/mcp-server/dist/server.d.ts +13 -0
  264. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  265. package/packages/mcp-server/dist/server.js +77 -0
  266. package/packages/mcp-server/dist/server.js.map +1 -1
  267. package/packages/mcp-server/dist/session-manager.js +1 -1
  268. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  269. package/packages/mcp-server/dist/types.d.ts +3 -11
  270. package/packages/mcp-server/dist/types.d.ts.map +1 -1
  271. package/packages/mcp-server/dist/types.js.map +1 -1
  272. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  273. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  274. package/packages/mcp-server/dist/workflow-tools.js +2 -40
  275. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  276. package/packages/mcp-server/package.json +3 -2
  277. package/packages/mcp-server/src/mcp-server.test.ts +138 -0
  278. package/packages/mcp-server/src/server.ts +99 -1
  279. package/packages/mcp-server/src/session-manager.ts +2 -2
  280. package/packages/mcp-server/src/types.ts +7 -18
  281. package/packages/mcp-server/src/workflow-tools.ts +2 -40
  282. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  283. package/packages/native/package.json +1 -1
  284. package/packages/pi-agent-core/package.json +1 -1
  285. package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
  286. package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
  287. package/packages/pi-ai/dist/models/fake-model.js +27 -0
  288. package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
  289. package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
  290. package/packages/pi-ai/dist/models/index.js +8 -0
  291. package/packages/pi-ai/dist/models/index.js.map +1 -1
  292. package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
  293. package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
  294. package/packages/pi-ai/dist/providers/fake.js +319 -0
  295. package/packages/pi-ai/dist/providers/fake.js.map +1 -0
  296. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  297. package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
  298. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  299. package/packages/pi-ai/package.json +1 -1
  300. package/packages/pi-ai/src/models/fake-model.ts +30 -0
  301. package/packages/pi-ai/src/models/index.ts +9 -0
  302. package/packages/pi-ai/src/providers/fake.ts +376 -0
  303. package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
  304. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  305. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +74 -0
  306. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  308. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  310. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  312. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  313. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  314. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  315. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +2 -0
  316. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  317. package/packages/pi-coding-agent/dist/core/extensions/runner.js +14 -1
  318. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  319. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +97 -0
  320. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
  323. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +4 -0
  325. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  327. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  330. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +67 -14
  334. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
  336. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
  337. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
  338. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
  339. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
  340. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
  341. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
  343. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +10 -9
  347. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
  349. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  350. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
  351. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  352. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +27 -6
  353. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +16 -0
  355. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +112 -18
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  359. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +60 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +40 -1
  362. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
  364. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
  366. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +12 -1
  369. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  370. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +54 -10
  371. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  373. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
  374. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
  376. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
  377. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
  378. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
  379. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  380. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  381. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
  382. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  384. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  385. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
  386. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  388. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  389. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  390. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
  391. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
  392. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
  393. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
  394. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
  395. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
  396. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +48 -0
  397. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
  398. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
  399. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  400. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
  401. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  402. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  403. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  404. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +10 -0
  405. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  406. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  407. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  408. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  409. package/packages/pi-coding-agent/package.json +2 -1
  410. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +87 -0
  411. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  412. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  413. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +108 -0
  414. package/packages/pi-coding-agent/src/core/extensions/runner.ts +16 -1
  415. package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
  416. package/packages/pi-coding-agent/src/core/settings-manager.ts +12 -0
  417. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  418. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  419. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +100 -16
  420. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
  421. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
  422. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  423. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +10 -9
  424. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  425. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -9
  426. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +124 -18
  427. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +43 -1
  428. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -1
  429. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
  430. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
  431. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +75 -9
  432. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
  433. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
  434. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
  435. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
  436. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  437. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +65 -0
  438. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
  439. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
  440. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +14 -0
  441. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  442. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  443. package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
  444. package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
  445. package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
  446. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
  447. package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
  448. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  449. package/packages/pi-tui/dist/index.d.ts +1 -0
  450. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  451. package/packages/pi-tui/dist/index.js +2 -0
  452. package/packages/pi-tui/dist/index.js.map +1 -1
  453. package/packages/pi-tui/dist/style.d.ts +41 -0
  454. package/packages/pi-tui/dist/style.d.ts.map +1 -0
  455. package/packages/pi-tui/dist/style.js +158 -0
  456. package/packages/pi-tui/dist/style.js.map +1 -0
  457. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  458. package/packages/pi-tui/dist/tui.js +1 -0
  459. package/packages/pi-tui/dist/tui.js.map +1 -1
  460. package/packages/pi-tui/package.json +1 -1
  461. package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
  462. package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
  463. package/packages/pi-tui/src/index.ts +9 -0
  464. package/packages/pi-tui/src/style.ts +225 -0
  465. package/packages/pi-tui/src/tui.ts +1 -0
  466. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  467. package/packages/rpc-client/README.md +3 -3
  468. package/packages/rpc-client/dist/index.d.ts +1 -1
  469. package/packages/rpc-client/dist/index.d.ts.map +1 -1
  470. package/packages/rpc-client/dist/index.js.map +1 -1
  471. package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
  472. package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
  473. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  474. package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
  475. package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
  476. package/packages/rpc-client/dist/rpc-types.js +3 -11
  477. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  478. package/packages/rpc-client/package.json +4 -1
  479. package/packages/rpc-client/src/index.ts +1 -1
  480. package/packages/rpc-client/src/rpc-client.ts +3 -6
  481. package/packages/rpc-client/src/rpc-types.ts +3 -398
  482. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  483. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  484. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  485. package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
  486. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  487. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  488. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  489. package/pkg/dist/modes/interactive/theme/theme.js +18 -1
  490. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  491. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  492. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  493. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  494. package/pkg/package.json +1 -1
  495. package/src/resources/GSD-WORKFLOW.md +2 -2
  496. package/src/resources/extensions/github-sync/templates.ts +93 -88
  497. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
  498. package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
  499. package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
  500. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  501. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -3
  502. package/src/resources/extensions/gsd/auto/loop.ts +461 -599
  503. package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
  504. package/src/resources/extensions/gsd/auto/phases.ts +124 -36
  505. package/src/resources/extensions/gsd/auto/run-unit.ts +24 -14
  506. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  507. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  508. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  509. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  510. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  511. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  512. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  513. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
  514. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  515. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  516. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  517. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
  518. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
  519. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  520. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  521. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  522. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  523. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  524. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  525. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
  526. package/src/resources/extensions/gsd/auto-dashboard.ts +61 -8
  527. package/src/resources/extensions/gsd/auto-dispatch.ts +17 -0
  528. package/src/resources/extensions/gsd/auto-post-unit.ts +10 -10
  529. package/src/resources/extensions/gsd/auto-prompts.ts +286 -4
  530. package/src/resources/extensions/gsd/auto-recovery.ts +194 -56
  531. package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
  532. package/src/resources/extensions/gsd/auto-start.ts +7 -6
  533. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  534. package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
  535. package/src/resources/extensions/gsd/auto.ts +179 -2
  536. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +30 -2
  537. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
  538. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +30 -6
  539. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +135 -1
  540. package/src/resources/extensions/gsd/clean-root-preflight.ts +41 -3
  541. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  542. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  543. package/src/resources/extensions/gsd/commands-ship.ts +24 -51
  544. package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
  545. package/src/resources/extensions/gsd/component-loader.ts +5 -11
  546. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  547. package/src/resources/extensions/gsd/custom-workflow-engine.ts +29 -0
  548. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  549. package/src/resources/extensions/gsd/db-base-schema.ts +383 -0
  550. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  551. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  552. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  553. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  554. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  555. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  556. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  557. package/src/resources/extensions/gsd/db-migration-steps.ts +451 -0
  558. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  559. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  560. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  561. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  562. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  563. package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
  564. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  565. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  566. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  567. package/src/resources/extensions/gsd/detection.ts +128 -0
  568. package/src/resources/extensions/gsd/escalation.ts +3 -1
  569. package/src/resources/extensions/gsd/graph.ts +12 -5
  570. package/src/resources/extensions/gsd/gsd-db.ts +379 -1660
  571. package/src/resources/extensions/gsd/guided-flow.ts +66 -12
  572. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  573. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  574. package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
  575. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  576. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  577. package/src/resources/extensions/gsd/model-router.ts +10 -6
  578. package/src/resources/extensions/gsd/notification-widget.ts +25 -4
  579. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  580. package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
  581. package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
  582. package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
  583. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  584. package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
  585. package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -31
  586. package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  587. package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  588. package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
  589. package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
  590. package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
  591. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  592. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  593. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  594. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  595. package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  596. package/src/resources/extensions/gsd/prompts/plan-milestone.md +47 -59
  597. package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  598. package/src/resources/extensions/gsd/prompts/queue.md +46 -53
  599. package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  600. package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
  601. package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
  602. package/src/resources/extensions/gsd/prompts/system.md +65 -107
  603. package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  604. package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  605. package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  606. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  607. package/src/resources/extensions/gsd/state.ts +6 -3
  608. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +38 -0
  609. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +98 -0
  610. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +118 -1
  611. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
  612. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
  613. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +170 -1
  614. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
  615. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
  616. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +88 -2
  617. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
  618. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  619. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
  620. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  621. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
  622. package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
  623. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +55 -0
  624. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  625. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +144 -0
  626. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  627. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +50 -0
  628. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
  629. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  630. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  631. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  632. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  633. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  634. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  635. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  636. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  637. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  638. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
  639. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  640. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  641. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  642. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  643. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  644. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  645. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
  646. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  647. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  648. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  649. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  650. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
  651. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
  652. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
  653. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
  654. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
  655. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  656. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
  657. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +139 -0
  658. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  659. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
  660. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  661. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  662. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
  663. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
  664. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
  665. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
  666. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  667. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  668. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
  669. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  670. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  671. package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
  672. package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
  673. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
  674. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
  675. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  676. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
  677. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +77 -0
  678. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  679. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
  680. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
  681. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
  682. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  683. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  684. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
  685. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  686. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  687. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  688. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +38 -0
  689. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +46 -2
  690. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
  691. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +6 -6
  692. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +7 -0
  693. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
  694. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  695. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  696. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  697. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  698. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  699. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  700. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  701. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
  702. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  703. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  704. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  705. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
  706. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
  707. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
  708. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  709. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  710. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  711. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  712. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
  713. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +32 -0
  714. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  715. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  716. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
  717. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
  718. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +37 -6
  719. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  720. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  721. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
  722. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  723. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  724. package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
  725. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  726. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  727. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +6 -1
  728. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  729. package/src/resources/extensions/gsd/unit-runtime.ts +14 -0
  730. package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
  731. package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
  732. package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
  733. package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
  734. package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
  735. package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
  736. package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
  737. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  738. package/src/resources/extensions/shared/interview-ui.ts +18 -5
  739. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
  740. package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
  741. /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → YRK7-Es93MwpIn3VL35K0}/_buildManifest.js +0 -0
  742. /package/dist/web/standalone/.next/static/{TzEVJ1Lh8vbez4n4Q9TqQ → YRK7-Es93MwpIn3VL35K0}/_ssgManifest.js +0 -0
@@ -31,7 +31,7 @@ import { selectAndApplyModel, resolveModelId, clearToolBaseline } from "./auto-m
31
31
  import { resetRoutingHistory, recordOutcome } from "./routing-history.js";
32
32
  import { resetHookState, runPreDispatchHooks, restoreHookState, clearPersistedHookState, } from "./post-unit-hooks.js";
33
33
  import { runGSDDoctor, rebuildState } from "./doctor.js";
34
- import { preDispatchHealthGate, resetProactiveHealing, setLevelChangeCallback, } from "./doctor-proactive.js";
34
+ import { preDispatchHealthGate, recordHealthSnapshot, resetProactiveHealing, setLevelChangeCallback, } from "./doctor-proactive.js";
35
35
  import { clearSkillSnapshot } from "./skill-discovery.js";
36
36
  import { captureAvailableSkills, resetSkillTelemetry, } from "./skill-telemetry.js";
37
37
  import { getRtkSessionSavings } from "../shared/rtk-session-stats.js";
@@ -43,7 +43,7 @@ import { isAbsolute, join } from "node:path";
43
43
  import { pathToFileURL } from "node:url";
44
44
  import { readFileSync, existsSync, mkdirSync } from "node:fs";
45
45
  import { atomicWriteSync } from "./atomic-write.js";
46
- import { autoCommitCurrentBranch, captureIntegrationBranch, detectWorktreeName, getCurrentBranch, getMainBranch, setActiveMilestoneId, } from "./worktree.js";
46
+ import { autoCommitCurrentBranch, captureIntegrationBranch, detectWorktreeName, getCurrentBranch, getMainBranch, setActiveMilestoneId, resolveProjectRoot, } from "./worktree.js";
47
47
  import { GitServiceImpl } from "./git-service.js";
48
48
  import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
49
49
  import { createAutoWorktree, enterAutoWorktree, enterBranchModeForMilestone, teardownAutoWorktree, isInAutoWorktree, getAutoWorktreePath, mergeMilestoneToMain, autoWorktreeBranch, syncWorktreeStateBack, syncProjectRootToWorktree, checkResourcesStale, escapeStaleWorktree, } from "./auto-worktree.js";
@@ -82,6 +82,7 @@ import { resolveAgentEnd, resolveAgentEndCancelled, _resetPendingResolve, isSess
82
82
  import { runAutoLoopWithUok } from "./uok/kernel.js";
83
83
  import { resolveUokFlags } from "./uok/flags.js";
84
84
  import { validateDirectory } from "./validate-directory.js";
85
+ import { createAutoOrchestrator } from "./auto/orchestrator.js";
85
86
  import { WorktreeResolver, } from "./worktree-resolver.js";
86
87
  import { reorderForCaching } from "./prompt-ordering.js";
87
88
  export { STUB_RECOVERY_THRESHOLD, NEW_SESSION_TIMEOUT_MS, } from "./auto/session.js";
@@ -224,8 +225,16 @@ function synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile
224
225
  export function _synthesizePausedSessionRecoveryForTest(basePath, unitType, unitId, sessionFile) {
225
226
  return synthesizePausedSessionRecovery(basePath, unitType, unitId, sessionFile);
226
227
  }
228
+ const DETACHED_AUTO_KEEPALIVE_INTERVAL_MS = 30_000;
229
+ function withDetachedAutoKeepalive(run) {
230
+ const keepAlive = setInterval(() => { }, DETACHED_AUTO_KEEPALIVE_INTERVAL_MS);
231
+ return run.finally(() => {
232
+ clearInterval(keepAlive);
233
+ });
234
+ }
235
+ export const _withDetachedAutoKeepaliveForTest = withDetachedAutoKeepalive;
227
236
  export function startAutoDetached(ctx, pi, base, verboseMode, options) {
228
- void startAuto(ctx, pi, base, verboseMode, options).catch((err) => {
237
+ void withDetachedAutoKeepalive(startAuto(ctx, pi, base, verboseMode, options)).catch((err) => {
229
238
  const message = getErrorMessage(err);
230
239
  ctx.ui.notify(`Auto-start failed: ${message}`, "error");
231
240
  logWarning("engine", `auto start error: ${message}`, { file: "auto.ts" });
@@ -904,6 +913,12 @@ export async function stopAuto(ctx, pi, reason) {
904
913
  // changes the user made between sessions (#4959 / CodeRabbit).
905
914
  if (pi)
906
915
  clearToolBaseline(pi);
916
+ try {
917
+ await s.orchestration?.stop(reason ?? "stop");
918
+ }
919
+ catch (err) {
920
+ debugLog("stop-orchestration-stop", { error: err instanceof Error ? err.message : String(err) });
921
+ }
907
922
  // Reset all session state in one call
908
923
  s.reset();
909
924
  }
@@ -953,6 +968,7 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
953
968
  activeRunDir: s.activeRunDir,
954
969
  autoStartTime: s.autoStartTime,
955
970
  milestoneLock: s.sessionMilestoneLock ?? undefined,
971
+ pauseReason: _errorContext?.message,
956
972
  };
957
973
  setRuntimeKv("global", "", PAUSED_SESSION_KV_KEY, pausedMeta);
958
974
  }
@@ -992,6 +1008,12 @@ export async function pauseAuto(ctx, _pi, _errorContext) {
992
1008
  // Unblock pending unitPromise so autoLoop exits cleanly (#1799)
993
1009
  resolveAgentEnd({ messages: [] });
994
1010
  _resetPendingResolve();
1011
+ try {
1012
+ await s.orchestration?.stop("pause");
1013
+ }
1014
+ catch (err) {
1015
+ debugLog("pause-orchestration-stop", { error: err instanceof Error ? err.message : String(err) });
1016
+ }
995
1017
  s.active = false;
996
1018
  s.paused = true;
997
1019
  deactivateGSD();
@@ -1041,6 +1063,132 @@ function buildResolverDeps() {
1041
1063
  function buildResolver() {
1042
1064
  return new WorktreeResolver(s, buildResolverDeps());
1043
1065
  }
1066
+ /**
1067
+ * Thin entry glue for the new Auto Orchestration module.
1068
+ *
1069
+ * This intentionally wires only dispatch + error notification today, with
1070
+ * no behavior changes to the existing auto loop. It provides a concrete seam
1071
+ * the next refactor steps can adopt incrementally.
1072
+ */
1073
+ export function createWiredAutoOrchestrationModule(ctx, _pi, dispatchBasePath, runtimeBasePath = resolveProjectRoot(dispatchBasePath)) {
1074
+ const flowId = `auto-orchestrator-${Date.now()}`;
1075
+ let seq = 0;
1076
+ const deps = {
1077
+ dispatch: {
1078
+ async decideNextUnit() {
1079
+ const state = await deriveState(dispatchBasePath);
1080
+ const active = state.activeMilestone;
1081
+ if (!active)
1082
+ return null;
1083
+ const prefs = loadEffectiveGSDPreferences(dispatchBasePath)?.preferences;
1084
+ const action = await resolveDispatch({
1085
+ basePath: dispatchBasePath,
1086
+ mid: active.id,
1087
+ midTitle: active.title,
1088
+ state,
1089
+ prefs,
1090
+ });
1091
+ if (action.action !== "dispatch")
1092
+ return null;
1093
+ return {
1094
+ unitType: action.unitType,
1095
+ unitId: action.unitId,
1096
+ reason: action.matchedRule ?? "dispatch",
1097
+ preconditions: [],
1098
+ };
1099
+ },
1100
+ },
1101
+ recovery: {
1102
+ async classifyAndRecover(input) {
1103
+ const reason = input.error instanceof Error ? input.error.message : String(input.error ?? "unknown auto error");
1104
+ return { action: "escalate", reason };
1105
+ },
1106
+ },
1107
+ worktree: {
1108
+ async prepareForUnit() { },
1109
+ async syncAfterUnit() { },
1110
+ async cleanupOnStop() { },
1111
+ },
1112
+ health: {
1113
+ async preAdvanceGate() {
1114
+ const gate = await preDispatchHealthGate(dispatchBasePath);
1115
+ return {
1116
+ allow: gate.proceed,
1117
+ reason: gate.reason,
1118
+ };
1119
+ },
1120
+ async postAdvanceRecord(result) {
1121
+ if (result.kind === "error") {
1122
+ recordHealthSnapshot(1, 0, 0, [{
1123
+ code: "orchestration-error",
1124
+ message: result.reason ?? "orchestration error",
1125
+ severity: "error",
1126
+ unitId: "orchestration",
1127
+ }], [], "orchestration");
1128
+ }
1129
+ else if (result.kind === "blocked") {
1130
+ recordHealthSnapshot(0, 1, 0, [{
1131
+ code: "orchestration-blocked",
1132
+ message: result.reason ?? "orchestration blocked",
1133
+ severity: "warning",
1134
+ unitId: "orchestration",
1135
+ }], [], "orchestration");
1136
+ }
1137
+ },
1138
+ },
1139
+ runtime: {
1140
+ async ensureLockOwnership() {
1141
+ const status = getSessionLockStatus(runtimeBasePath);
1142
+ if (!status.valid || status.failureReason === "pid-mismatch") {
1143
+ throw new Error("session lock held by another process");
1144
+ }
1145
+ },
1146
+ async journalTransition(event) {
1147
+ const eventType = event.name === "start"
1148
+ ? "iteration-start"
1149
+ : event.name === "resume"
1150
+ ? "iteration-start"
1151
+ : event.name === "advance"
1152
+ ? "dispatch-match"
1153
+ : event.name === "advance-blocked"
1154
+ ? "guard-block"
1155
+ : event.name === "advance-stopped"
1156
+ ? "dispatch-stop"
1157
+ : event.name === "advance-error"
1158
+ ? "iteration-end"
1159
+ : event.name === "advance-paused" || event.name === "advance-retry"
1160
+ ? "guard-block"
1161
+ : event.name === "stop"
1162
+ ? "terminal"
1163
+ : "iteration-end";
1164
+ _emitJournalEvent(runtimeBasePath, {
1165
+ ts: new Date().toISOString(),
1166
+ flowId,
1167
+ seq: ++seq,
1168
+ eventType,
1169
+ data: {
1170
+ source: "auto-orchestrator",
1171
+ name: event.name,
1172
+ reason: event.reason,
1173
+ unitType: event.unitType,
1174
+ unitId: event.unitId,
1175
+ },
1176
+ });
1177
+ },
1178
+ },
1179
+ notifications: {
1180
+ async notifyLifecycle(event) {
1181
+ if (event.name === "error") {
1182
+ ctx.ui.notify(event.detail ?? "auto orchestration error", "error");
1183
+ }
1184
+ },
1185
+ },
1186
+ };
1187
+ return createAutoOrchestrator(deps);
1188
+ }
1189
+ function ensureOrchestrationModule(ctx, pi, basePath) {
1190
+ s.orchestration = createWiredAutoOrchestrationModule(ctx, pi, basePath, lockBase());
1191
+ }
1044
1192
  /**
1045
1193
  * Build the LoopDeps object from auto.ts private scope.
1046
1194
  * This bundles all private functions that autoLoop needs without exporting them.
@@ -1398,6 +1546,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1398
1546
  // s.basePath may have been updated to a worktree path by enterMilestone.
1399
1547
  rebuildScope(s.basePath, s.currentMilestoneId);
1400
1548
  }
1549
+ ensureOrchestrationModule(ctx, pi, s.basePath || base);
1401
1550
  registerSigtermHandler(lockBase());
1402
1551
  ctx.ui.setStatus("gsd-auto", s.stepMode ? "next" : "auto");
1403
1552
  ctx.ui.setWidget("gsd-health", undefined);
@@ -1457,6 +1606,12 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1457
1606
  clearPausedSession("paused-session DB cleanup failed (resume activation)");
1458
1607
  }
1459
1608
  pi.events.emit(CMUX_CHANNELS.LOG, { preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, message: s.stepMode ? "Step-mode resumed." : "Auto-mode resumed.", level: "progress" });
1609
+ try {
1610
+ await s.orchestration?.resume();
1611
+ }
1612
+ catch (err) {
1613
+ debugLog("resume-orchestration-resume", { error: err instanceof Error ? err.message : String(err) });
1614
+ }
1460
1615
  startAutoCommandPolling(s.basePath);
1461
1616
  await runAutoLoopWithUok({
1462
1617
  ctx,
@@ -1482,6 +1637,7 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1482
1637
  // Build scope after bootstrap has populated s.basePath / s.originalBasePath /
1483
1638
  // s.currentMilestoneId (including worktree setup inside bootstrapAutoSession).
1484
1639
  rebuildScope(s.basePath, s.currentMilestoneId);
1640
+ ensureOrchestrationModule(ctx, pi, s.basePath || base);
1485
1641
  captureProjectRootEnv(s.originalBasePath || s.basePath);
1486
1642
  registerAutoWorkerForSession(s);
1487
1643
  try {
@@ -1492,6 +1648,12 @@ export async function startAuto(ctx, pi, base, verboseMode, options) {
1492
1648
  logWarning("engine", `cmux sync failed: ${err instanceof Error ? err.message : String(err)}`, { file: "auto.ts" });
1493
1649
  }
1494
1650
  pi.events.emit(CMUX_CHANNELS.LOG, { preferences: loadEffectiveGSDPreferences(s.basePath || undefined)?.preferences, message: requestedStepMode ? "Step-mode started." : "Auto-mode started.", level: "progress" });
1651
+ try {
1652
+ await s.orchestration?.start({ basePath: s.basePath, trigger: "auto-loop" });
1653
+ }
1654
+ catch (err) {
1655
+ debugLog("start-orchestration-start", { error: err instanceof Error ? err.message : String(err) });
1656
+ }
1495
1657
  startAutoCommandPolling(s.basePath);
1496
1658
  // Dispatch the first unit
1497
1659
  await runAutoLoopWithUok({
@@ -1576,6 +1738,9 @@ export async function dispatchHookUnit(ctx, pi, hookName, triggerUnitType, trigg
1576
1738
  s.pendingQuickTasks = [];
1577
1739
  }
1578
1740
  s.basePath = targetBasePath;
1741
+ if (!s.orchestration) {
1742
+ ensureOrchestrationModule(ctx, pi, s.basePath);
1743
+ }
1579
1744
  const hookUnitType = `hook/${hookName}`;
1580
1745
  const hookStartedAt = Date.now();
1581
1746
  s.currentUnit = {
@@ -1,10 +1,11 @@
1
+ // GSD-2 + src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts - Handles provider and agent-end recovery for GSD auto-mode.
1
2
  import { logWarning } from "../workflow-logger.js";
2
3
  import { checkDeepProjectSetupAfterTurn, checkAutoStartAfterDiscuss, maybeHandleReadyPhraseWithoutFiles, maybeHandleEmptyIntentTurn, resetEmptyTurnCounter, } from "../guided-flow.js";
3
4
  import { clearPathCache } from "../paths.js";
4
5
  import { getAutoDashboardData, getAutoModeStartModel, isAutoActive, pauseAuto, setCurrentDispatchedModelId } from "../auto.js";
5
6
  import { getNextFallbackModel, resolveModelWithFallbacksForUnit } from "../preferences.js";
6
7
  import { pauseAutoForProviderError } from "../provider-error-pause.js";
7
- import { isSessionSwitchInFlight, resolveAgentEnd } from "../auto/resolve.js";
8
+ import { isSessionSwitchInFlight, resolveAgentEnd, resolveAgentEndCancelled } from "../auto/resolve.js";
8
9
  import { resolveModelId } from "../auto-model-selection.js";
9
10
  import { resolveProjectRoot } from "../worktree.js";
10
11
  import { clearDiscussionFlowState } from "./write-gate.js";
@@ -39,6 +40,19 @@ function resolveAgentEndBasePath() {
39
40
  return undefined;
40
41
  }
41
42
  }
43
+ export function _buildAbortedPauseContext(lastMsg) {
44
+ const hasErrorMessage = Object.prototype.hasOwnProperty.call(lastMsg, "errorMessage") && !!lastMsg.errorMessage;
45
+ return {
46
+ message: hasErrorMessage ? String(lastMsg.errorMessage) : "Operation aborted",
47
+ category: "aborted",
48
+ isTransient: true,
49
+ };
50
+ }
51
+ export function isUserInitiatedAbortMessage(message) {
52
+ if (!message)
53
+ return false;
54
+ return /\b(?:claude code process aborted by user|request aborted by user|process aborted by user)\b/i.test(message);
55
+ }
42
56
  async function pauseTransientWithBackoff(cls, pi, ctx, errorDetail, isRateLimit) {
43
57
  retryState.consecutiveTransientCount += 1;
44
58
  const baseRetryAfterMs = "retryAfterMs" in cls ? cls.retryAfterMs : 15_000;
@@ -134,7 +148,7 @@ export async function handleAgentEnd(pi, event, ctx) {
134
148
  }
135
149
  return;
136
150
  }
137
- await pauseAuto(ctx, pi);
151
+ await pauseAuto(ctx, pi, _buildAbortedPauseContext(lastMsg));
138
152
  return;
139
153
  }
140
154
  if (lastMsg && "stopReason" in lastMsg && lastMsg.stopReason === "error") {
@@ -142,6 +156,14 @@ export async function handleAgentEnd(pi, event, ctx) {
142
156
  // is in the assistant message text content. Fall back to content when
143
157
  // errorMessage looks uninformative.
144
158
  const rawErrorMsg = ("errorMessage" in lastMsg && lastMsg.errorMessage) ? String(lastMsg.errorMessage) : "";
159
+ if (isUserInitiatedAbortMessage(rawErrorMsg)) {
160
+ resolveAgentEndCancelled({
161
+ message: rawErrorMsg,
162
+ category: "aborted",
163
+ isTransient: false,
164
+ });
165
+ return;
166
+ }
145
167
  const isUseless = !rawErrorMsg || /^(success|ok|true|error|unknown)$/i.test(rawErrorMsg.trim());
146
168
  // #3588: When errorMessage is uninformative, extract the real error from
147
169
  // the assistant message text content for display purposes only.
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers DB-backed GSD workflow tools and compatibility aliases.
1
3
  import { Type } from "@sinclair/typebox";
2
4
  import { Text } from "@gsd/pi-tui";
3
5
  import { loadEffectiveGSDPreferences } from "../preferences.js";
@@ -5,6 +7,7 @@ import { ensureDbOpen } from "./dynamic-tools.js";
5
7
  import { loadWriteGateSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "./write-gate.js";
6
8
  import { StringEnum } from "@gsd/pi-ai";
7
9
  import { logError } from "../workflow-logger.js";
10
+ import { incrementLegacyTelemetry } from "../legacy-telemetry.js";
8
11
  async function loadWorkflowExecutors() {
9
12
  return import("../tools/workflow-tool-executors.js");
10
13
  }
@@ -14,11 +17,18 @@ async function loadWorkflowExecutors() {
14
17
  */
15
18
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- toolDef shape matches ToolDefinition but typing it fully requires generics
16
19
  function registerAlias(pi, toolDef, aliasName, canonicalName) {
20
+ const execute = typeof toolDef.execute === "function"
21
+ ? async (...args) => {
22
+ incrementLegacyTelemetry("legacy.mcpAliasUsed");
23
+ return toolDef.execute(...args);
24
+ }
25
+ : toolDef.execute;
17
26
  pi.registerTool({
18
27
  ...toolDef,
19
28
  name: aliasName,
20
29
  description: toolDef.description + ` (alias for ${canonicalName} — prefer the canonical name)`,
21
30
  promptGuidelines: [`Alias for ${canonicalName} — prefer the canonical name.`],
31
+ execute,
22
32
  });
23
33
  }
24
34
  function requirementRootWriteGuard(operation) {
@@ -2,7 +2,7 @@ import { join } from "node:path";
2
2
  import { isToolCallEventType } from "@gsd/pi-coding-agent";
3
3
  import { updateSnapshot } from "../ecosystem/gsd-extension-api.js";
4
4
  import { buildMilestoneFileName, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "../paths.js";
5
- import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
5
+ import { canonicalToolName, clearDiscussionFlowState, isDepthConfirmationAnswer, isQueuePhaseActive, markApprovalGateVerified, markDepthVerified, resetWriteGateState, shouldBlockContextWrite, shouldBlockPlanningUnit, shouldBlockQueueExecution, shouldBlockWorktreeWrite, isGateQuestionId, setPendingGate, clearPendingGate, getPendingGate, shouldBlockPendingGate, shouldBlockPendingGateBash, extractDepthVerificationMilestoneId } from "./write-gate.js";
6
6
  import { resolveManifest } from "../unit-context-manifest.js";
7
7
  import { isBlockedStateFile, isBashWriteToStateFile, BLOCKED_WRITE_ERROR } from "../write-intercept.js";
8
8
  import { loadFile, saveFile, formatContinue } from "../files.js";
@@ -16,6 +16,7 @@ import { logWarning as safetyLogWarning } from "../workflow-logger.js";
16
16
  import { installNotifyInterceptor } from "./notify-interceptor.js";
17
17
  import { initNotificationStore } from "../notification-store.js";
18
18
  import { initNotificationWidget } from "../notification-widget.js";
19
+ import { resolveWorktreeProjectRoot } from "../worktree-root.js";
19
20
  import { extractSubagentAgentClasses } from "./subagent-input.js";
20
21
  import { approvalGateIdForUnit, isExplicitApprovalResponse, shouldPauseForUserApprovalQuestion } from "../user-input-boundary.js";
21
22
  // Skip the welcome screen on the very first session_start — cli.ts already
@@ -51,6 +52,14 @@ async function applyDisabledModelProviderPolicy(ctx) {
51
52
  // Non-fatal: keep default provider visibility if preferences cannot be loaded.
52
53
  }
53
54
  }
55
+ export function resolveNotificationStoreBasePath(cwd = process.cwd()) {
56
+ return resolveWorktreeProjectRoot(cwd);
57
+ }
58
+ function initSessionNotifications(ctx) {
59
+ initNotificationStore(resolveNotificationStoreBasePath());
60
+ installNotifyInterceptor(ctx);
61
+ initNotificationWidget(ctx);
62
+ }
54
63
  async function writeContextModeCompactionSnapshot(basePath) {
55
64
  try {
56
65
  const { loadEffectiveGSDPreferences } = await import("../preferences.js");
@@ -81,9 +90,7 @@ async function writeContextModeCompactionSnapshot(basePath) {
81
90
  }
82
91
  export function registerHooks(pi, ecosystemHandlers) {
83
92
  pi.on("session_start", async (_event, ctx) => {
84
- initNotificationStore(process.cwd());
85
- installNotifyInterceptor(ctx);
86
- initNotificationWidget(ctx);
93
+ initSessionNotifications(ctx);
87
94
  if (!isAutoActive()) {
88
95
  const { initHealthWidget } = await import("../health-widget.js");
89
96
  initHealthWidget(ctx);
@@ -135,8 +142,7 @@ export function registerHooks(pi, ecosystemHandlers) {
135
142
  }
136
143
  });
137
144
  pi.on("session_switch", async (_event, ctx) => {
138
- initNotificationStore(process.cwd());
139
- installNotifyInterceptor(ctx);
145
+ initSessionNotifications(ctx);
140
146
  resetWriteGateState(process.cwd());
141
147
  resetToolCallLoopGuard();
142
148
  await resetAskUserQuestionsTurnCache();
@@ -426,6 +432,16 @@ export function registerHooks(pi, ecosystemHandlers) {
426
432
  return planningGuard;
427
433
  }
428
434
  }
435
+ // ── Worktree-isolation write gate (#5199) ────────────────────────────
436
+ // Block planning-write tools from landing code at the project root when
437
+ // git.isolation=worktree but auto-mode hasn't created the milestone
438
+ // worktree yet. Without this, writes silently orphan outside git history.
439
+ if (isToolCallEventType("write", event) || isToolCallEventType("edit", event)) {
440
+ const wtBasePath = resolveWorktreeProjectRoot(dash.basePath ?? discussionBasePath);
441
+ const wtGuard = shouldBlockWorktreeWrite(event.toolName, event.input.path, wtBasePath, isAutoActive(), dash.currentUnit?.type);
442
+ if (wtGuard.block)
443
+ return wtGuard;
444
+ }
429
445
  // ── Single-writer engine: block direct writes to STATE.md ──────────
430
446
  // Covers write, edit, and bash tools to prevent bypass vectors.
431
447
  if (isToolCallEventType("write", event)) {
@@ -1,7 +1,9 @@
1
- import { copyFileSync, existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
1
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
2
2
  import { isAbsolute, join, relative, resolve, sep } from "node:path";
3
3
  import { minimatch } from "minimatch";
4
+ import { getIsolationMode } from "../preferences.js";
4
5
  import { logWarning } from "../workflow-logger.js";
6
+ import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "../worktree-root.js";
5
7
  /**
6
8
  * Regex matching milestone CONTEXT.md file names in both legacy M001
7
9
  * and unique M001-abc123 formats. Exported so regex-hardening tests
@@ -728,3 +730,129 @@ export function shouldBlockPlanningUnit(toolName, pathOrCommand, basePath, unitT
728
730
  // avoids breaking gsd_* MCP tools or future safe additions.
729
731
  return { block: false };
730
732
  }
733
+ // ─── Worktree isolation write gate (#5199) ────────────────────────────────
734
+ //
735
+ // When `git.isolation: worktree` is configured, the per-unit commit pipeline
736
+ // only runs inside the auto-mode loop (`auto-post-unit.ts`). If the LLM
737
+ // authors code at the project root before auto-mode is started, those writes
738
+ // land in the working tree but never reach a commit — they're silently
739
+ // orphaned outside git history. This guard blocks those writes at the
740
+ // tool_call seam so the agent receives a clear error instead.
741
+ const WORKTREE_GATE_BOOTSTRAP_UNITS = new Set([
742
+ "discuss-milestone",
743
+ "plan-milestone",
744
+ "init",
745
+ ]);
746
+ function realpathOrResolve(p) {
747
+ const abs = resolve(p);
748
+ try {
749
+ return realpathSync(abs);
750
+ }
751
+ catch {
752
+ // Path doesn't exist (yet) — realpath the deepest existing ancestor so
753
+ // platforms where /tmp -> /private/tmp don't break containment checks.
754
+ let dir = abs;
755
+ const tail = [];
756
+ while (dir && dir !== resolve(dir, "..")) {
757
+ try {
758
+ const real = realpathSync(dir);
759
+ return tail.length ? join(real, ...tail.reverse()) : real;
760
+ }
761
+ catch {
762
+ const idx = dir.lastIndexOf(sep);
763
+ if (idx <= 0)
764
+ break;
765
+ tail.push(dir.slice(idx + 1));
766
+ dir = dir.slice(0, idx) || sep;
767
+ }
768
+ }
769
+ return abs;
770
+ }
771
+ }
772
+ function isPathContained(target, container) {
773
+ if (target === container)
774
+ return true;
775
+ return target.startsWith(container.endsWith(sep) ? container : container + sep);
776
+ }
777
+ /**
778
+ * Block planning-write tool calls that would land code at the project root
779
+ * while `git.isolation: worktree` is in effect and auto-mode hasn't created
780
+ * (or flipped cwd into) the milestone worktree.
781
+ *
782
+ * Pure / unit-testable. Callers in `register-hooks.ts` supply the resolved
783
+ * project root and current auto liveness; this function does no I/O beyond
784
+ * realpath resolution.
785
+ *
786
+ * Allow rules (in order):
787
+ * 1. Tool isn't a planning-write (write/edit/multi_edit/notebook_edit).
788
+ * 2. `GSD_DISABLE_WORKTREE_WRITE_GUARD=1` self-hosting bypass.
789
+ * 3. Isolation mode is not "worktree".
790
+ * 4. Active unit is a bootstrap unit (discuss-milestone/plan-milestone/init).
791
+ * 5. Target is inside `<projectRoot>/.gsd/worktrees/` (a real worktree).
792
+ * 6. Target is inside `<projectRoot>/.gsd/` and isn't masquerading as a
793
+ * worktrees sibling (rejects the `.gsd/worktrees-extra/…` prefix trick).
794
+ * 7. Auto is live AND `effectiveBasePath` is itself a `.gsd/worktrees/…` path.
795
+ *
796
+ * Otherwise: block with a message that points the agent at `/gsd` to start
797
+ * auto-mode.
798
+ */
799
+ export function shouldBlockWorktreeWrite(toolName, targetPath, effectiveBasePath, isAutoLive, currentUnitType) {
800
+ const tool = canonicalToolName(toolName);
801
+ if (!PLANNING_WRITE_TOOLS.has(tool))
802
+ return { block: false };
803
+ if (process.env.GSD_DISABLE_WORKTREE_WRITE_GUARD === "1")
804
+ return { block: false };
805
+ if (getIsolationMode(effectiveBasePath) !== "worktree")
806
+ return { block: false };
807
+ if (currentUnitType && WORKTREE_GATE_BOOTSTRAP_UNITS.has(currentUnitType))
808
+ return { block: false };
809
+ if (!targetPath) {
810
+ return {
811
+ block: true,
812
+ reason: [
813
+ `HARD BLOCK: ${tool} called with empty path while \`git.isolation: worktree\` is configured`,
814
+ `and auto-mode is not active. Refusing to allow writes that cannot be located.`,
815
+ ].join(" "),
816
+ };
817
+ }
818
+ // Resolve the target relative to the project root, then realpath to defeat
819
+ // symlink-based escapes and prefix tricks (e.g. .gsd/worktrees-extra/).
820
+ const projectRoot = resolveWorktreeProjectRoot(effectiveBasePath);
821
+ const absTarget = isAbsolute(targetPath) ? targetPath : resolve(projectRoot, targetPath);
822
+ const realTarget = realpathOrResolve(absTarget);
823
+ const realRoot = realpathOrResolve(projectRoot);
824
+ const realGsd = realpathOrResolve(join(projectRoot, ".gsd"));
825
+ const realWorktreesDir = realpathOrResolve(join(projectRoot, ".gsd", "worktrees"));
826
+ // Allow writes inside the legitimate worktrees subtree.
827
+ if (isPathContained(realTarget, realWorktreesDir))
828
+ return { block: false };
829
+ // Allow writes to .gsd/ planning artifacts, but reject siblings whose name
830
+ // starts with "worktrees" (the worktrees-extra prefix trick — case 4).
831
+ if (isPathContained(realTarget, realGsd)) {
832
+ const rel = relative(realGsd, realTarget);
833
+ const firstSeg = rel.split(/[\/\\]/)[0] ?? "";
834
+ if (!firstSeg.startsWith("worktrees"))
835
+ return { block: false };
836
+ // fall through: looks like worktrees<something> sibling — block
837
+ }
838
+ // Auto is live and the caller is operating inside a worktree path —
839
+ // host tool's write happens in worktree context; let it through.
840
+ if (isAutoLive && isGsdWorktreePath(effectiveBasePath))
841
+ return { block: false };
842
+ // Block. Provide enough context that the agent can self-correct.
843
+ const displayTarget = isPathContained(realTarget, realRoot)
844
+ ? relative(realRoot, realTarget) || "."
845
+ : realTarget;
846
+ return {
847
+ block: true,
848
+ reason: [
849
+ `HARD BLOCK: Worktree isolation is configured (\`git.isolation: worktree\`) but auto-mode is`,
850
+ `not running and the target "${displayTarget}" is not inside \`.gsd/worktrees/<MID>/\`.`,
851
+ `Code edits at the project root would be lost — only the auto-mode commit pipeline`,
852
+ `(auto-post-unit) commits work, and it never runs outside the loop.`,
853
+ `Required action: start auto-mode with \`/gsd\` so the milestone worktree is created,`,
854
+ `then write inside it. To disable this guard for self-hosting development, set`,
855
+ `GSD_DISABLE_WORKTREE_WRITE_GUARD=1.`,
856
+ ].join(" "),
857
+ };
858
+ }
@@ -16,6 +16,31 @@ import { execFileSync } from "node:child_process";
16
16
  import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
17
17
  import { logWarning } from "./workflow-logger.js";
18
18
  import { nativeHasChanges } from "./native-git-bridge.js";
19
+ function findPreflightStashRef(basePath, milestoneId, stashMarker) {
20
+ const markerPrefix = `gsd-preflight-stash:${milestoneId}:`;
21
+ let fallbackRef = null;
22
+ try {
23
+ const list = execFileSync("git", ["stash", "list", "--format=%gd%x00%s"], {
24
+ cwd: basePath,
25
+ stdio: ["ignore", "pipe", "pipe"],
26
+ encoding: "utf-8",
27
+ env: GIT_NO_PROMPT_ENV,
28
+ });
29
+ for (const line of list.split("\n")) {
30
+ const [ref, subject] = line.split("\x00");
31
+ if (!ref || !subject)
32
+ continue;
33
+ if (stashMarker && subject.includes(stashMarker))
34
+ return ref;
35
+ if (!fallbackRef && subject.includes(markerPrefix))
36
+ fallbackRef = ref;
37
+ }
38
+ }
39
+ catch (err) {
40
+ logWarning("preflight", `stash list failed before restore: ${err instanceof Error ? err.message : String(err)}`);
41
+ }
42
+ return fallbackRef;
43
+ }
19
44
  /**
20
45
  * Check the working tree for dirty files before a milestone merge.
21
46
  *
@@ -47,7 +72,8 @@ export function preflightCleanRoot(basePath, milestoneId, notify) {
47
72
  notify(warnMsg, "warning");
48
73
  // Push the stash
49
74
  try {
50
- execFileSync("git", ["stash", "push", "--include-untracked", "-m", "gsd-preflight-stash"], {
75
+ const stashMarker = `gsd-preflight-stash:${milestoneId}:${process.pid}:${Date.now()}:${process.hrtime.bigint().toString(36)}`;
76
+ execFileSync("git", ["stash", "push", "--include-untracked", "-m", `gsd-preflight-stash [${stashMarker}]`], {
51
77
  cwd: basePath,
52
78
  stdio: ["ignore", "pipe", "pipe"],
53
79
  encoding: "utf-8",
@@ -55,6 +81,7 @@ export function preflightCleanRoot(basePath, milestoneId, notify) {
55
81
  });
56
82
  return {
57
83
  stashPushed: true,
84
+ stashMarker,
58
85
  summary: `Stashed uncommitted changes before merge (milestone ${milestoneId}).`,
59
86
  };
60
87
  }
@@ -73,9 +100,17 @@ export function preflightCleanRoot(basePath, milestoneId, notify) {
73
100
  * Any pop error (e.g. conflict) is logged and notified but does NOT throw —
74
101
  * the merge already completed successfully.
75
102
  */
76
- export function postflightPopStash(basePath, milestoneId, notify) {
103
+ export function postflightPopStash(basePath, milestoneId, stashMarker, notify) {
104
+ let stashRef = null;
77
105
  try {
78
- execFileSync("git", ["stash", "pop"], {
106
+ stashRef = findPreflightStashRef(basePath, milestoneId, stashMarker);
107
+ if (!stashRef) {
108
+ const msg = `No matching GSD preflight stash found for milestone ${milestoneId}; leaving stash list untouched.`;
109
+ logWarning("preflight", msg);
110
+ notify(msg, "warning");
111
+ return;
112
+ }
113
+ execFileSync("git", ["stash", "pop", stashRef], {
79
114
  cwd: basePath,
80
115
  stdio: ["ignore", "pipe", "pipe"],
81
116
  encoding: "utf-8",
@@ -86,7 +121,10 @@ export function postflightPopStash(basePath, milestoneId, notify) {
86
121
  catch (err) {
87
122
  // Pop conflicts mean the merged code collides with the stashed changes.
88
123
  // Log a warning — the user needs to resolve manually, but the merge succeeded.
89
- const msg = `git stash pop failed after merge of milestone ${milestoneId}: ${err instanceof Error ? err.message : String(err)}. Run "git stash pop" manually to restore your changes.`;
124
+ const restoreHint = stashRef
125
+ ? `Run "git stash pop ${stashRef}" or "git stash apply ${stashRef}" manually to restore the correct stash.`
126
+ : `Run "git stash list" to find the matching GSD preflight stash before restoring manually.`;
127
+ const msg = `git stash pop ${stashRef ?? ""}`.trim() + ` failed after merge of milestone ${milestoneId}: ${err instanceof Error ? err.message : String(err)}. ${restoreHint}`;
90
128
  logWarning("preflight", msg);
91
129
  notify(msg, "warning");
92
130
  }
@@ -33,5 +33,10 @@ export async function handleGSDCommand(args, ctx, pi) {
33
33
  }
34
34
  if (handled)
35
35
  return;
36
+ if (trimmed.includes(" ")) {
37
+ const { handleDo } = await import("../commands-do.js");
38
+ await handleDo(trimmed, ctx, pi);
39
+ return;
40
+ }
36
41
  ctx.ui.notify(`Unknown: /gsd ${trimmed}. Run /gsd help for available commands.`, "warning");
37
42
  }