@opengsd/gsd-pi 1.4.0 → 1.5.0-dev.4fb2d460

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 (657) hide show
  1. package/README.md +11 -11
  2. package/dist/onboarding.js +11 -0
  3. package/dist/resources/.managed-resources-content-hash +1 -1
  4. package/dist/resources/GSD-WORKFLOW.md +20 -25
  5. package/dist/resources/extensions/ask-user-questions.js +1 -1
  6. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +118 -53
  7. package/dist/resources/extensions/cursor-cli/index.js +16 -0
  8. package/dist/resources/extensions/cursor-cli/models.js +63 -0
  9. package/dist/resources/extensions/cursor-cli/package.json +11 -0
  10. package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
  11. package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
  12. package/dist/resources/extensions/gsd/activity-log.js +4 -1
  13. package/dist/resources/extensions/gsd/artifact-verification.js +25 -9
  14. package/dist/resources/extensions/gsd/auto/closeout.js +137 -42
  15. package/dist/resources/extensions/gsd/auto/finalize.js +9 -0
  16. package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -3
  17. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
  18. package/dist/resources/extensions/gsd/auto/run-unit.js +5 -2
  19. package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +3 -0
  20. package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +12 -3
  22. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -7
  23. package/dist/resources/extensions/gsd/auto-dispatch.js +31 -7
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
  25. package/dist/resources/extensions/gsd/auto-prompts.js +76 -2
  26. package/dist/resources/extensions/gsd/auto-recovery.js +50 -6
  27. package/dist/resources/extensions/gsd/auto-start.js +8 -6
  28. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -0
  29. package/dist/resources/extensions/gsd/auto-worktree-branch-lifecycle.js +189 -0
  30. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +133 -0
  31. package/dist/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.js +35 -0
  32. package/dist/resources/extensions/gsd/auto-worktree-creation.js +130 -0
  33. package/dist/resources/extensions/gsd/auto-worktree-entry.js +118 -0
  34. package/dist/resources/extensions/gsd/auto-worktree-merge-already-merged.js +98 -0
  35. package/dist/resources/extensions/gsd/auto-worktree-merge-branch-head.js +52 -0
  36. package/dist/resources/extensions/gsd/auto-worktree-merge-cleanup.js +87 -0
  37. package/dist/resources/extensions/gsd/auto-worktree-merge-code-changes.js +46 -0
  38. package/dist/resources/extensions/gsd/auto-worktree-merge-db-ready.js +68 -0
  39. package/dist/resources/extensions/gsd/auto-worktree-merge-integration-branch.js +51 -0
  40. package/dist/resources/extensions/gsd/auto-worktree-merge-message.js +106 -0
  41. package/dist/resources/extensions/gsd/auto-worktree-merge-pre-teardown.js +64 -0
  42. package/dist/resources/extensions/gsd/auto-worktree-merge-stash.js +168 -0
  43. package/dist/resources/extensions/gsd/auto-worktree-merge.js +302 -0
  44. package/dist/resources/extensions/gsd/auto-worktree-milestone-shelter.js +119 -0
  45. package/dist/resources/extensions/gsd/auto-worktree-path-resolution.js +5 -0
  46. package/dist/resources/extensions/gsd/auto-worktree-path-utils.js +5 -0
  47. package/dist/resources/extensions/gsd/auto-worktree-resource-version.js +41 -0
  48. package/dist/resources/extensions/gsd/auto-worktree-runtime-cleanup.js +99 -0
  49. package/dist/resources/extensions/gsd/auto-worktree-session-registry.js +57 -0
  50. package/dist/resources/extensions/gsd/auto-worktree-sync.js +249 -0
  51. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +120 -0
  52. package/dist/resources/extensions/gsd/auto-worktree.js +20 -2046
  53. package/dist/resources/extensions/gsd/auto.js +31 -5
  54. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -0
  55. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
  56. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +134 -7
  57. package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +58 -9
  58. package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
  59. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +194 -28
  60. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +14 -1
  61. package/dist/resources/extensions/gsd/codebase-generator.js +164 -20
  62. package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
  63. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  64. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +153 -1
  65. package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
  66. package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
  67. package/dist/resources/extensions/gsd/db/queries.js +48 -9
  68. package/dist/resources/extensions/gsd/db/writers/cascades.js +20 -2
  69. package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
  70. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -2
  71. package/dist/resources/extensions/gsd/doctor-engine-checks.js +292 -18
  72. package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
  73. package/dist/resources/extensions/gsd/doctor.js +93 -3
  74. package/dist/resources/extensions/gsd/exec-sandbox.js +6 -2
  75. package/dist/resources/extensions/gsd/flat-phase-migration.js +106 -26
  76. package/dist/resources/extensions/gsd/forensics.js +1 -1
  77. package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
  78. package/dist/resources/extensions/gsd/git-service.js +59 -18
  79. package/dist/resources/extensions/gsd/gsd-db.js +75 -11
  80. package/dist/resources/extensions/gsd/guidance.js +1 -0
  81. package/dist/resources/extensions/gsd/guided-flow.js +62 -19
  82. package/dist/resources/extensions/gsd/key-manager.js +1 -0
  83. package/dist/resources/extensions/gsd/markdown-renderer.js +40 -11
  84. package/dist/resources/extensions/gsd/md-importer.js +89 -23
  85. package/dist/resources/extensions/gsd/migrate-external.js +24 -7
  86. package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
  87. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +14 -3
  88. package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
  89. package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
  90. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
  91. package/dist/resources/extensions/gsd/paths.js +17 -3
  92. package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
  93. package/dist/resources/extensions/gsd/preferences-models.js +6 -4
  94. package/dist/resources/extensions/gsd/preferences-skills.js +10 -16
  95. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  96. package/dist/resources/extensions/gsd/preferences-validation.js +107 -2
  97. package/dist/resources/extensions/gsd/preferences.js +49 -2
  98. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -2
  99. package/dist/resources/extensions/gsd/prompts/system.md +6 -6
  100. package/dist/resources/extensions/gsd/quick.js +12 -3
  101. package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
  102. package/dist/resources/extensions/gsd/repo-identity.js +16 -0
  103. package/dist/resources/extensions/gsd/repository-registry.js +6 -1
  104. package/dist/resources/extensions/gsd/root-write-leak-guard.js +4 -2
  105. package/dist/resources/extensions/gsd/safe-fs.js +23 -2
  106. package/dist/resources/extensions/gsd/skill-discovery.js +36 -23
  107. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
  108. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
  109. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
  110. package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
  111. package/dist/resources/extensions/gsd/tool-contract.js +14 -0
  112. package/dist/resources/extensions/gsd/tools/plan-task.js +76 -8
  113. package/dist/resources/extensions/gsd/tools/reopen-slice.js +5 -0
  114. package/dist/resources/extensions/gsd/tools/reopen-task.js +13 -5
  115. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
  116. package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
  117. package/dist/resources/extensions/gsd/unit-registry.js +37 -2
  118. package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
  119. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
  120. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
  121. package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
  122. package/dist/resources/extensions/gsd/workspace.js +26 -8
  123. package/dist/resources/extensions/gsd/worktree-command.js +1 -1
  124. package/dist/resources/extensions/gsd/worktree-lifecycle.js +81 -14
  125. package/dist/resources/extensions/gsd/worktree-manager.js +97 -4
  126. package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
  127. package/dist/resources/extensions/shared/interview-ui.js +62 -9
  128. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  129. package/dist/web/standalone/.next/BUILD_ID +1 -1
  130. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  131. package/dist/web/standalone/.next/build-manifest.json +3 -3
  132. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  133. package/dist/web/standalone/.next/required-server-files.json +3 -3
  134. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  135. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  145. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  147. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  151. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  161. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  173. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  195. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  205. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  211. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  227. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  231. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/index.html +1 -1
  241. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  242. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  243. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  244. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  245. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  246. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  247. package/dist/web/standalone/.next/server/app/page.js +2 -2
  248. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  250. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  251. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  252. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/middleware.js +3 -3
  254. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  255. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  256. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  257. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  258. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  259. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  260. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  261. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  262. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  263. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  264. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  265. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  266. package/dist/web/standalone/server.js +1 -1
  267. package/dist/wizard.d.ts +8 -0
  268. package/dist/wizard.js +8 -1
  269. package/integrations/hermes/CONTEXT.md +47 -0
  270. package/integrations/hermes/README.md +21 -0
  271. package/integrations/hermes/__init__.py +31 -0
  272. package/integrations/hermes/docs/issue-1162-grilling.md +197 -0
  273. package/integrations/hermes/docs/setup.md +4 -0
  274. package/integrations/hermes/open_gsd_hermes/commands.py +141 -0
  275. package/integrations/hermes/open_gsd_hermes/config.py +2 -0
  276. package/integrations/hermes/open_gsd_hermes/gsd_client.py +591 -39
  277. package/integrations/hermes/open_gsd_hermes/notifications.py +10 -1
  278. package/integrations/hermes/plugin.yaml +4 -0
  279. package/integrations/hermes/tests/test_config.py +6 -0
  280. package/integrations/hermes/tests/test_directory_loader.py +37 -0
  281. package/integrations/hermes/tests/test_gsd_client_cache.py +3 -0
  282. package/integrations/hermes/tests/test_gsd_client_execute.py +35 -0
  283. package/integrations/hermes/tests/test_gsd_client_process_cwd.py +22 -0
  284. package/integrations/hermes/tests/test_gsd_client_timeout.py +98 -0
  285. package/integrations/hermes/tests/test_milestone_client.py +447 -0
  286. package/integrations/hermes/tests/test_new_milestone_command.py +313 -0
  287. package/integrations/hermes/tests/test_supervisor_fsm.py +40 -0
  288. package/package.json +8 -8
  289. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
  290. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
  291. package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
  292. package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
  293. package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
  294. package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
  295. package/packages/cloud-mcp-gateway/package.json +2 -2
  296. package/packages/contracts/package.json +1 -1
  297. package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
  298. package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
  299. package/packages/daemon/dist/cloud-runtime.js +25 -1
  300. package/packages/daemon/dist/cloud-runtime.js.map +1 -1
  301. package/packages/daemon/dist/cloud-runtime.test.js +51 -0
  302. package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
  303. package/packages/daemon/dist/message-batcher.d.ts +7 -0
  304. package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
  305. package/packages/daemon/dist/message-batcher.js +13 -0
  306. package/packages/daemon/dist/message-batcher.js.map +1 -1
  307. package/packages/daemon/dist/message-batcher.test.js +48 -0
  308. package/packages/daemon/dist/message-batcher.test.js.map +1 -1
  309. package/packages/daemon/dist/session-manager.js +1 -1
  310. package/packages/daemon/dist/session-manager.js.map +1 -1
  311. package/packages/daemon/package.json +5 -5
  312. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
  313. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  314. package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
  315. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  316. package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
  317. package/packages/gsd-agent-core/dist/session/agent-session-navigation.d.ts.map +1 -1
  318. package/packages/gsd-agent-core/dist/session/agent-session-navigation.js +4 -1
  319. package/packages/gsd-agent-core/dist/session/agent-session-navigation.js.map +1 -1
  320. package/packages/gsd-agent-core/package.json +5 -5
  321. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  322. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +3 -2
  323. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  324. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -1
  325. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +1 -0
  326. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -1
  327. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +1 -1
  328. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
  329. package/packages/gsd-agent-modes/package.json +7 -7
  330. package/packages/mcp-server/dist/server.d.ts +18 -5
  331. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  332. package/packages/mcp-server/dist/server.js +46 -5
  333. package/packages/mcp-server/dist/server.js.map +1 -1
  334. package/packages/mcp-server/dist/session-manager.js +1 -1
  335. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  336. package/packages/mcp-server/package.json +4 -4
  337. package/packages/native/package.json +1 -1
  338. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  339. package/packages/pi-agent-core/dist/agent-loop.js +14 -9
  340. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  341. package/packages/pi-agent-core/package.json +1 -1
  342. package/packages/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  343. package/packages/pi-ai/dist/env-api-keys.js +3 -0
  344. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  345. package/packages/pi-ai/dist/index.d.ts +1 -0
  346. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  347. package/packages/pi-ai/dist/index.js +1 -0
  348. package/packages/pi-ai/dist/index.js.map +1 -1
  349. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  350. package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
  351. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  352. package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
  353. package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
  354. package/packages/pi-ai/dist/tool-result-content.js +62 -0
  355. package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
  356. package/packages/pi-ai/dist/types.d.ts +10 -22
  357. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  358. package/packages/pi-ai/dist/types.js.map +1 -1
  359. package/packages/pi-ai/package.json +1 -1
  360. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  362. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/package-manager.d.ts +9 -0
  364. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/package-manager.js +74 -53
  366. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  367. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +6 -0
  368. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/resource-loader.js +30 -2
  370. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +1 -0
  372. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -1
  373. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/session-manager.js +3 -0
  376. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts +66 -0
  378. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts.map +1 -0
  379. package/packages/pi-coding-agent/dist/core/skill-directories.js +138 -0
  380. package/packages/pi-coding-agent/dist/core/skill-directories.js.map +1 -0
  381. package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -1
  382. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/skills.js +4 -1
  384. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  386. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/index.js +1 -0
  388. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  389. package/packages/pi-coding-agent/package.json +7 -7
  390. package/packages/pi-tui/package.json +2 -2
  391. package/packages/rpc-client/dist/rpc-client.js +1 -1
  392. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  393. package/packages/rpc-client/package.json +2 -2
  394. package/pkg/dist/core/export-html/template.js +53 -4
  395. package/pkg/package.json +1 -1
  396. package/scripts/link-workspace-packages.cjs +14 -4
  397. package/src/resources/GSD-WORKFLOW.md +20 -25
  398. package/src/resources/extensions/ask-user-questions.ts +1 -1
  399. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +130 -51
  400. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +371 -39
  401. package/src/resources/extensions/cursor-cli/index.ts +18 -0
  402. package/src/resources/extensions/cursor-cli/models.ts +65 -0
  403. package/src/resources/extensions/cursor-cli/package.json +11 -0
  404. package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
  405. package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
  406. package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
  407. package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
  408. package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
  409. package/src/resources/extensions/gsd/activity-log.ts +4 -1
  410. package/src/resources/extensions/gsd/artifact-verification.ts +25 -9
  411. package/src/resources/extensions/gsd/auto/closeout.ts +163 -58
  412. package/src/resources/extensions/gsd/auto/finalize.ts +8 -0
  413. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  414. package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -3
  415. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
  416. package/src/resources/extensions/gsd/auto/run-unit.ts +5 -2
  417. package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +8 -0
  418. package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
  419. package/src/resources/extensions/gsd/auto-artifact-paths.ts +12 -3
  420. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +13 -7
  421. package/src/resources/extensions/gsd/auto-dispatch.ts +35 -7
  422. package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
  423. package/src/resources/extensions/gsd/auto-prompts.ts +73 -2
  424. package/src/resources/extensions/gsd/auto-recovery.ts +50 -6
  425. package/src/resources/extensions/gsd/auto-start.ts +9 -6
  426. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +4 -0
  427. package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
  428. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
  429. package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
  430. package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
  431. package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
  432. package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
  433. package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
  434. package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
  435. package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
  436. package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
  437. package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
  438. package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
  439. package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
  440. package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
  441. package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
  442. package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
  443. package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
  444. package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
  445. package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
  446. package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
  447. package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
  448. package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
  449. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
  450. package/src/resources/extensions/gsd/auto-worktree.ts +69 -2390
  451. package/src/resources/extensions/gsd/auto.ts +32 -19
  452. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -0
  453. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
  454. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +148 -7
  455. package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +80 -12
  456. package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
  457. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +229 -28
  458. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +23 -1
  459. package/src/resources/extensions/gsd/codebase-generator.ts +186 -19
  460. package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
  461. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  462. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +135 -1
  463. package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
  464. package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
  465. package/src/resources/extensions/gsd/db/queries.ts +49 -9
  466. package/src/resources/extensions/gsd/db/writers/cascades.ts +23 -1
  467. package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
  468. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -2
  469. package/src/resources/extensions/gsd/doctor-engine-checks.ts +372 -22
  470. package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
  471. package/src/resources/extensions/gsd/doctor-types.ts +5 -1
  472. package/src/resources/extensions/gsd/doctor.ts +95 -3
  473. package/src/resources/extensions/gsd/exec-sandbox.ts +6 -2
  474. package/src/resources/extensions/gsd/flat-phase-migration.ts +132 -25
  475. package/src/resources/extensions/gsd/forensics.ts +1 -1
  476. package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
  477. package/src/resources/extensions/gsd/git-service.ts +67 -17
  478. package/src/resources/extensions/gsd/gsd-db.ts +105 -11
  479. package/src/resources/extensions/gsd/guidance.ts +2 -0
  480. package/src/resources/extensions/gsd/guided-flow.ts +71 -20
  481. package/src/resources/extensions/gsd/key-manager.ts +1 -0
  482. package/src/resources/extensions/gsd/markdown-renderer.ts +40 -10
  483. package/src/resources/extensions/gsd/md-importer.ts +93 -22
  484. package/src/resources/extensions/gsd/migrate-external.ts +23 -6
  485. package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
  486. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +19 -4
  487. package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
  488. package/src/resources/extensions/gsd/model-router.ts +4 -5
  489. package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
  490. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
  491. package/src/resources/extensions/gsd/paths.ts +21 -3
  492. package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
  493. package/src/resources/extensions/gsd/preferences-models.ts +6 -3
  494. package/src/resources/extensions/gsd/preferences-skills.ts +10 -16
  495. package/src/resources/extensions/gsd/preferences-types.ts +30 -0
  496. package/src/resources/extensions/gsd/preferences-validation.ts +97 -2
  497. package/src/resources/extensions/gsd/preferences.ts +58 -4
  498. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -2
  499. package/src/resources/extensions/gsd/prompts/system.md +6 -6
  500. package/src/resources/extensions/gsd/quick.ts +11 -3
  501. package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
  502. package/src/resources/extensions/gsd/repo-identity.ts +17 -0
  503. package/src/resources/extensions/gsd/repository-registry.ts +7 -1
  504. package/src/resources/extensions/gsd/root-write-leak-guard.ts +3 -2
  505. package/src/resources/extensions/gsd/safe-fs.ts +22 -2
  506. package/src/resources/extensions/gsd/skill-discovery.ts +47 -23
  507. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
  508. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
  509. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
  510. package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
  511. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +169 -1
  512. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
  513. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +131 -5
  514. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
  515. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
  516. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +43 -1
  517. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +111 -0
  518. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
  519. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
  520. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
  521. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
  522. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
  523. package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
  524. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +10 -1
  525. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
  526. package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
  527. package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
  528. package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
  529. package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
  530. package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
  531. package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
  532. package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
  533. package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
  534. package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
  535. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
  536. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
  537. package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
  538. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
  539. package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
  540. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
  541. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +387 -0
  542. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
  543. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
  544. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
  545. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
  546. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +571 -5
  547. package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
  548. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
  549. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +109 -2
  550. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +25 -1
  551. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
  552. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
  553. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
  554. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
  555. package/src/resources/extensions/gsd/tests/import-completion-lost-update.test.ts +196 -0
  556. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
  557. package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
  558. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
  559. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
  560. package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
  561. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
  562. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
  563. package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
  564. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
  565. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
  566. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  567. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
  568. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -15
  569. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +122 -0
  570. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
  571. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +4 -4
  572. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
  573. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
  574. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +116 -0
  575. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +91 -0
  576. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +592 -23
  577. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +25 -1
  578. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
  579. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
  580. package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
  581. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
  582. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +50 -6
  583. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +17 -0
  584. package/src/resources/extensions/gsd/tests/plan-task.test.ts +264 -1
  585. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
  586. package/src/resources/extensions/gsd/tests/preferences.test.ts +169 -0
  587. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +147 -0
  588. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
  589. package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
  590. package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
  591. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +275 -0
  592. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +52 -0
  593. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
  594. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
  595. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +31 -9
  596. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
  597. package/src/resources/extensions/gsd/tests/schedule-wakeup-tool.test.ts +167 -0
  598. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +46 -0
  599. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
  600. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -0
  601. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
  602. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
  603. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -1
  604. package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
  605. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
  606. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
  607. package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
  608. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
  609. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
  610. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
  611. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
  612. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +259 -0
  613. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
  614. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
  615. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +81 -0
  616. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
  617. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +52 -0
  618. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
  619. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +208 -1
  620. package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
  621. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
  622. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
  623. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
  624. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
  625. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
  626. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +4 -4
  627. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
  628. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
  629. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
  630. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
  631. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +36 -3
  632. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
  633. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
  634. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
  635. package/src/resources/extensions/gsd/tool-contract.ts +29 -0
  636. package/src/resources/extensions/gsd/tools/plan-task.ts +107 -9
  637. package/src/resources/extensions/gsd/tools/reopen-slice.ts +5 -0
  638. package/src/resources/extensions/gsd/tools/reopen-task.ts +13 -5
  639. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
  640. package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
  641. package/src/resources/extensions/gsd/unit-registry.ts +48 -2
  642. package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
  643. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
  644. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
  645. package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
  646. package/src/resources/extensions/gsd/workspace.ts +42 -8
  647. package/src/resources/extensions/gsd/worktree-command.ts +1 -1
  648. package/src/resources/extensions/gsd/worktree-lifecycle.ts +154 -26
  649. package/src/resources/extensions/gsd/worktree-manager.ts +143 -5
  650. package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
  651. package/src/resources/extensions/shared/interview-ui.ts +58 -11
  652. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +32 -0
  653. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  654. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
  655. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  656. /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → gXoWec4UNqcR0tkuHwYCr}/_buildManifest.js +0 -0
  657. /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → gXoWec4UNqcR0tkuHwYCr}/_ssgManifest.js +0 -0
@@ -177,24 +177,18 @@ import {
177
177
  import { GitServiceImpl } from "./git-service.js";
178
178
  import { nativeCheckoutBranch } from "./native-git-bridge.js";
179
179
  import { getPriorSliceCompletionBlocker } from "./dispatch-guard.js";
180
- import {
181
- createAutoWorktree,
182
- enterAutoWorktree,
183
- enterBranchModeForMilestone,
184
- teardownAutoWorktree,
185
- isInAutoWorktree,
186
- getAutoWorktreePath,
187
- getAutoWorktreeOriginalBase,
188
- mergeMilestoneToMain,
189
- autoWorktreeBranch,
190
- syncWorktreeStateBack,
191
- readResourceVersion,
192
- checkResourcesStale,
193
- escapeStaleWorktree,
194
- } from "./auto-worktree.js";
180
+ import { autoWorktreeBranch, enterBranchModeForMilestone } from "./auto-worktree-branch-lifecycle.js";
181
+ import { createAutoWorktree } from "./auto-worktree-creation.js";
182
+ import { enterAutoWorktree, isInAutoWorktree } from "./auto-worktree-entry.js";
183
+ import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
184
+ import { checkResourcesStale, readResourceVersion } from "./auto-worktree-resource-version.js";
185
+ import { escapeStaleWorktree } from "./auto-worktree-runtime-cleanup.js";
186
+ import { getAutoWorktreeOriginalBase } from "./auto-worktree-session-registry.js";
187
+ import { syncWorktreeStateBack } from "./auto-worktree-sync.js";
188
+ import { teardownAutoWorktree } from "./auto-worktree-teardown.js";
195
189
  import { pruneQueueOrder } from "./queue-order.js";
196
190
  import { startCommandPolling as _startCommandPolling, isRemoteConfigured } from "../remote-questions/manager.js";
197
- import { createMilestoneMergeTransaction } from "./milestone-merge-transaction.js";
191
+ import { createDefaultMilestoneMergeTransaction } from "./milestone-merge-transaction.js";
198
192
 
199
193
  import { debugLog, isDebugEnabled, writeDebugSummary } from "./debug-logger.js";
200
194
  import {
@@ -236,7 +230,7 @@ import {
236
230
  getSlice,
237
231
  getTask,
238
232
  } from "./gsd-db.js";
239
- import { closeWorkflowDatabase } from "./db-workspace.js";
233
+ import { checkpointWorkflowDatabase, closeWorkflowDatabase } from "./db-workspace.js";
240
234
  import { markLatestActiveForWorkerCanceled } from "./db/unit-dispatches.js";
241
235
  import { writeUnitRuntimeRecord } from "./unit-runtime.js";
242
236
  import { countPendingCaptures } from "./captures.js";
@@ -1051,6 +1045,12 @@ export function stopAutoRemote(projectRoot: string): {
1051
1045
  * The normal stop path stays SIGTERM-only so cooperative sessions can clean up;
1052
1046
  * this path is only for the explicit "Force start" action.
1053
1047
  */
1048
+ // Grace window between SIGTERM and SIGKILL so the target can run its cleanup
1049
+ // handler (lock release, DB snapshot flush, worktree teardown). Polled so a
1050
+ // process that exits early is not made to wait the full window.
1051
+ const FORCE_STOP_GRACE_MS = 3000;
1052
+ const FORCE_STOP_POLL_MS = 100;
1053
+
1054
1054
  export function forceStopAutoRemote(projectRoot: string): {
1055
1055
  found: boolean;
1056
1056
  pid?: number;
@@ -1071,6 +1071,13 @@ export function forceStopAutoRemote(projectRoot: string): {
1071
1071
 
1072
1072
  try {
1073
1073
  process.kill(lock.pid, "SIGTERM");
1074
+ // Poll for graceful exit before escalating. Synchronous sleep keeps this
1075
+ // function sync for its callers (Atomics.wait times out with no notify).
1076
+ const deadline = Date.now() + FORCE_STOP_GRACE_MS;
1077
+ while (Date.now() < deadline) {
1078
+ if (!isLockProcessAlive(lock)) break;
1079
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, FORCE_STOP_POLL_MS);
1080
+ }
1074
1081
  if (isLockProcessAlive(lock)) {
1075
1082
  process.kill(lock.pid, "SIGKILL");
1076
1083
  }
@@ -1615,6 +1622,11 @@ export async function stopAuto(
1615
1622
  const installTerminalCloseoutOutcome = completionStopRequested && preserveCloseoutTranscript;
1616
1623
  const preserveCompletionSurface = completionStopRequested || preserveCloseoutTranscript;
1617
1624
  s.completionStopInProgress = preserveCompletionSurface;
1625
+ try {
1626
+ checkpointWorkflowDatabase();
1627
+ } catch (e) {
1628
+ debugLog("stop-checkpoint-failed", { error: e instanceof Error ? e.message : String(e) });
1629
+ }
1618
1630
  playNotificationBell("stop", loadedPreferences?.notifications);
1619
1631
 
1620
1632
  // #4764 — telemetry: record the exit reason, isolation mode, whether an auto
@@ -2299,7 +2311,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
2299
2311
  // C4 (#5627) — GitServiceImpl constructor → gitServiceFactory
2300
2312
  //
2301
2313
  // Final WorktreeLifecycleDeps shape: 3 fields (gitServiceFactory,
2302
- // worktreeProjection, mergeMilestoneToMain transaction runner). Down from 18 at slice-7
2314
+ // worktreeProjection, mergeMilestone transaction runner). Down from 18 at slice-7
2303
2315
  // closure.
2304
2316
  return {
2305
2317
  gitServiceFactory: (basePath: string) => {
@@ -2308,7 +2320,7 @@ export function buildWorktreeLifecycleDeps(): WorktreeLifecycleDeps {
2308
2320
  return new GitServiceImpl(basePath, gitConfig);
2309
2321
  },
2310
2322
  worktreeProjection: new WorktreeStateProjection(),
2311
- mergeMilestoneToMain: createMilestoneMergeTransaction(mergeMilestoneToMain),
2323
+ mergeMilestone: createDefaultMilestoneMergeTransaction(),
2312
2324
  };
2313
2325
  }
2314
2326
 
@@ -2357,6 +2369,7 @@ function buildLoopDeps(pi: ExtensionAPI, ctx: ExtensionContext): LoopDeps {
2357
2369
  stopAuto,
2358
2370
  pauseAuto,
2359
2371
  clearUnitTimeout,
2372
+ checkpointWorkflowDatabase,
2360
2373
  updateProgressWidget,
2361
2374
  ...cmux,
2362
2375
  handleLostSessionLock: (ctx: ExtensionContext | undefined, lockStatus: SessionLockStatus | undefined) => {
@@ -710,12 +710,14 @@ export function registerDbTools(pi: ExtensionAPI): void {
710
710
  inputs: Type.Array(Type.String(), { description: "Array<string> of input files or references; pass [\"path\"] or [], never a single string" }),
711
711
  expectedOutput: Type.Array(Type.String(), { description: "Array<string> of files this task creates or overwrites; pass [\"path\"] or [], never prose or a single string" }),
712
712
  observabilityImpact: Type.Optional(Type.String({ description: "Task observability impact" })),
713
+ targetRepositories: Type.Optional(Type.Array(Type.String(), { description: "Repository id(s) this task touches (parent workspace); must match a Declared Repository. Omit for single-repo projects." })),
713
714
  }), { description: "Optional full task replacement for the slice. Omit for incremental planning, then call gsd_plan_task once per task." })),
714
715
  // ── Enrichment metadata (optional — defaults to empty) ────────────
715
716
  successCriteria: Type.Optional(Type.String({ description: "Slice success criteria block" })),
716
717
  proofLevel: Type.Optional(Type.String({ description: "Slice proof level" })),
717
718
  integrationClosure: Type.Optional(Type.String({ description: "Slice integration closure" })),
718
719
  observabilityImpact: Type.Optional(Type.String({ description: "Slice observability impact" })),
720
+ targetRepositories: Type.Optional(Type.Array(Type.String(), { description: "Slice-wide default repository id(s) (parent workspace); must match a Declared Repository. Omit for single-repo projects." })),
719
721
  // Single-writer v3 audit trail (Stream 2): caller-provided actor identity + causation.
720
722
  actorName: Type.Optional(Type.String({ description: "Caller-provided actor identity for the audit trail (e.g. 'executor-01', 'gsd-orchestrator')" })),
721
723
  triggerReason: Type.Optional(Type.String({ description: "Caller-provided reason this action was triggered (e.g. 'plan-phase complete')" })),
@@ -789,6 +791,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
789
791
  inputs: Type.Array(Type.String(), { description: "Array<string> of input files or references; pass [\"path\"] or [], never a single string" }),
790
792
  expectedOutput: Type.Array(Type.String(), { description: "Array<string> of files this task creates or overwrites; pass [\"path\"] or [], never prose or a single string" }),
791
793
  observabilityImpact: Type.Optional(Type.String({ description: "Task observability impact" })),
794
+ targetRepositories: Type.Optional(Type.Array(Type.String(), { description: "Repository id(s) this task touches (parent workspace); must match a Declared Repository. Omit for single-repo projects." })),
792
795
  // Single-writer v3 audit trail (Stream 2): caller-provided actor identity + causation.
793
796
  actorName: Type.Optional(Type.String({ description: "Caller-provided actor identity for the audit trail (e.g. 'executor-01', 'gsd-orchestrator')" })),
794
797
  triggerReason: Type.Optional(Type.String({ description: "Caller-provided reason this action was triggered (e.g. 'plan-phase complete')" })),
@@ -14,7 +14,7 @@ import {
14
14
  type WorkflowDatabaseOpenResult,
15
15
  type WorkflowDatabaseStatus,
16
16
  } from "../db-workspace.js";
17
- import { getAutoWorktreePath } from "../auto-worktree.js";
17
+ import { getAutoWorktreePath } from "../auto-worktree-path-resolution.js";
18
18
  import { resolveWorktreeProjectRoot } from "../worktree-root.js";
19
19
  import { worktreesDirs } from "../worktree-placement.js";
20
20
 
@@ -32,9 +32,15 @@ import {
32
32
  recordAutoToolSurfaceSnapshot,
33
33
  recordToolInvocationError,
34
34
  } from "../auto-runtime-state.js";
35
+ import {
36
+ isDeterministicPolicyError,
37
+ isQueuedUserMessageSkip,
38
+ isToolInvocationError,
39
+ isToolUnavailableError,
40
+ } from "../auto-tool-tracking.js";
35
41
  import { applyProviderPayloadPolicy } from "../provider-payload-policy.js";
36
42
 
37
- import { checkToolCallLoop, recordToolCallLoopMutation, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
43
+ import { checkToolCallLoop, configureToolCallLoopGuard, recordToolCallLoopMutation, resetToolCallLoopGuard } from "./tool-call-loop-guard.js";
38
44
  import { MINIMAL_AUTO_BASE_TOOL_NAMES } from "./core-session-tools.js";
39
45
  import { maybePauseAutoForApprovalGate, resetPendingGatePauseGuard } from "./pending-gate-pause.js";
40
46
  import { saveActivityLog } from "../activity-log.js";
@@ -77,9 +83,24 @@ import { clearPendingAutoStart } from "../pending-auto-start.js";
77
83
  import { resolveWorkflowToolBasePath } from "./dynamic-tools.js";
78
84
  import { getRequiredWorkflowToolsForUnit } from "../unit-tool-contracts.js";
79
85
  import { flushAllManifests } from "../workflow-manifest.js";
86
+ import { recordUnitHarnessAbort, type UnitHarnessAbortRecord } from "../unit-runtime.js";
80
87
 
81
88
  let approvalQuestionAbortInFlight = false;
82
89
 
90
+ function recordCurrentUnitHarnessAbort(
91
+ abort: Omit<UnitHarnessAbortRecord, "recordedAt"> & { recordedAt?: number },
92
+ ): void {
93
+ const dash = getAutoRuntimeSnapshot();
94
+ if (!dash.active || !dash.basePath || !dash.currentUnit) return;
95
+ recordUnitHarnessAbort(
96
+ dash.basePath,
97
+ dash.currentUnit.type,
98
+ dash.currentUnit.id,
99
+ dash.currentUnit.startedAt,
100
+ abort,
101
+ );
102
+ }
103
+
83
104
  type WelcomeScreenModule = {
84
105
  buildWelcomeScreenLines(opts: { version: string; remoteChannel?: string; width?: number }): string[];
85
106
  };
@@ -209,10 +230,26 @@ const WORKFLOW_GSD_TOOL_NAMES = [
209
230
  ...Object.values(AUTO_UNIT_SCOPED_TOOLS).flat(),
210
231
  ].filter(isGsdManagedTool);
211
232
 
233
+ const WORKFLOW_ONLY_AUTO_BASE_TOOL_NAMES = [
234
+ "find",
235
+ "glob",
236
+ "grep",
237
+ "ls",
238
+ "read",
239
+ "subagent",
240
+ ] as const;
241
+
212
242
  function isGsdManagedTool(name: string): boolean {
213
243
  return name.startsWith("gsd_") || name === "memory_query" || name === "capture_thought" || name === "gsd_graph";
214
244
  }
215
245
 
246
+ function autoBaseToolNamesForUnit(unitType: string | undefined): readonly string[] {
247
+ const manifest = unitType ? resolveManifest(unitType) : null;
248
+ return manifest?.tools.mode === "workflow-only"
249
+ ? WORKFLOW_ONLY_AUTO_BASE_TOOL_NAMES
250
+ : MINIMAL_AUTO_BASE_TOOL_NAMES;
251
+ }
252
+
216
253
  /**
217
254
  * Resolves requested tool names against active tools using exact and MCP-scoped matches.
218
255
  *
@@ -275,7 +312,7 @@ export function buildMinimalAutoGsdToolSet(
275
312
  return buildRunUatGsdToolSet(activeToolNames, registeredToolNames);
276
313
  }
277
314
  const unitTools = unitType ? AUTO_UNIT_SCOPED_TOOLS[unitType] ?? [] : [];
278
- const autoBaseTools = new Set<string>(MINIMAL_AUTO_BASE_TOOL_NAMES);
315
+ const autoBaseTools = new Set<string>(autoBaseToolNamesForUnit(unitType));
279
316
  const availableBaseTools = registeredToolNames.filter((name) => autoBaseTools.has(name));
280
317
  const preserved = [...new Set([
281
318
  ...activeToolNames.filter((name) => autoBaseTools.has(name)),
@@ -557,6 +594,22 @@ async function applyCompactionThresholdOverride(ctx: ExtensionContext): Promise<
557
594
  }
558
595
  }
559
596
 
597
+ /**
598
+ * Apply user-tunable tool-call loop guard thresholds (#1198) from GSD
599
+ * preferences plus GSD_TOOL_LOOP_* env overrides. Runs at session boundaries
600
+ * so both interactive sessions and `/gsd auto` pick up the configuration.
601
+ * Non-fatal: falls back to built-in defaults when preferences cannot be loaded.
602
+ */
603
+ async function applyToolCallLoopGuardConfig(basePath: string): Promise<void> {
604
+ try {
605
+ const { loadEffectiveGSDPreferences } = await import("../preferences.js");
606
+ const prefs = loadEffectiveGSDPreferences(basePath);
607
+ configureToolCallLoopGuard(prefs?.preferences.tool_call_loop_guard);
608
+ } catch {
609
+ configureToolCallLoopGuard(null);
610
+ }
611
+ }
612
+
560
613
  function clearDeferredApprovalGate(basePath?: string): void {
561
614
  if (!basePath) {
562
615
  deferredApprovalGates.clear();
@@ -599,6 +652,72 @@ function formatLoopGuardBlockReason(reason: string | undefined): string | undefi
599
652
  );
600
653
  }
601
654
 
655
+ function isGateResultPersistenceTool(toolName: string): boolean {
656
+ return toolName === "gsd_save_gate_result" || toolName === "gsd_uat_result_save";
657
+ }
658
+
659
+ function resultDetails(result: unknown): Record<string, unknown> {
660
+ if (!result || typeof result !== "object") return {};
661
+ const details = (result as { details?: unknown }).details;
662
+ return details && typeof details === "object" ? details as Record<string, unknown> : {};
663
+ }
664
+
665
+ function isAbortedExecutionToolResult(toolName: string, result: unknown): boolean {
666
+ if (toolName !== "gsd_exec" && toolName !== "gsd_uat_exec") return false;
667
+ const details = resultDetails(result);
668
+ return details.aborted === true || details.force_resolved === true || details.timed_out === true;
669
+ }
670
+
671
+ function isRetryableHarnessToolError(toolName: string, result: unknown, errorText: string): boolean {
672
+ if (isGateResultPersistenceTool(toolName)) return false;
673
+ if (isDeterministicPolicyError(errorText)) return false;
674
+ if (toolName === "gsd_exec" || toolName === "gsd_uat_exec") {
675
+ if (isAbortedExecutionToolResult(toolName, result)) return true;
676
+ if (isToolUnavailableError(errorText)) return true;
677
+ if (isQueuedUserMessageSkip(errorText)) return true;
678
+ return isToolInvocationError(errorText);
679
+ }
680
+ if (isToolUnavailableError(errorText)) return true;
681
+ if (isQueuedUserMessageSkip(errorText)) return true;
682
+ return false;
683
+ }
684
+
685
+ function recordRetryableHarnessToolError(toolName: string, result: unknown, errorText: string): void {
686
+ if (!isRetryableHarnessToolError(toolName, result, errorText)) return;
687
+ recordCurrentUnitHarnessAbort({
688
+ kind: "tool-error",
689
+ reason: errorText || "Tool execution failed before the unit could complete its gate evaluation.",
690
+ toolName,
691
+ });
692
+ }
693
+
694
+ function recordRetryableTurnAbort(event: { abortOrigin?: unknown; messages?: unknown[] }): void {
695
+ const origin = typeof event.abortOrigin === "string" ? event.abortOrigin : undefined;
696
+ if (origin === "session-transition") return;
697
+
698
+ const messages = Array.isArray(event.messages) ? event.messages : [];
699
+ const lastMsg = messages[messages.length - 1];
700
+ const stopReason = lastMsg && typeof lastMsg === "object"
701
+ ? (lastMsg as { stopReason?: unknown }).stopReason
702
+ : undefined;
703
+ if (stopReason !== "aborted" && stopReason !== "error") return;
704
+
705
+ const errorMessage = lastMsg && typeof lastMsg === "object"
706
+ ? (lastMsg as { errorMessage?: unknown }).errorMessage
707
+ : undefined;
708
+ const reason = [
709
+ "Agent turn aborted before the unit could complete its gate evaluation.",
710
+ origin ? `origin=${origin}` : undefined,
711
+ typeof stopReason === "string" ? `stopReason=${stopReason}` : undefined,
712
+ typeof errorMessage === "string" && errorMessage.trim() ? `error=${errorMessage.trim()}` : undefined,
713
+ ].filter(Boolean).join(" ");
714
+
715
+ recordCurrentUnitHarnessAbort({
716
+ kind: "turn-abort",
717
+ reason,
718
+ });
719
+ }
720
+
602
721
  function beginSourceObservationStoreForCurrentUnit(
603
722
  ctx?: { cwd?: string },
604
723
  ): ReturnType<typeof getSourceObservationStore> | null {
@@ -893,6 +1012,7 @@ export function registerHooks(
893
1012
  }
894
1013
  resetWriteGateState(basePath);
895
1014
  resetToolCallLoopGuard();
1015
+ await applyToolCallLoopGuardConfig(basePath);
896
1016
  approvalQuestionAbortInFlight = false;
897
1017
  clearDeferredApprovalGate();
898
1018
  await resetAskUserQuestionsTurnCache();
@@ -902,8 +1022,8 @@ export function registerHooks(
902
1022
  await prepareWorkflowMcpForHookContext(ctx, basePath);
903
1023
 
904
1024
  // Migrate legacy .gsd/milestones/ to flat-phase .gsd/phases/ when detected.
905
- // Best-effort never blocks session startup. Skipped inside auto-worktrees
906
- // (migration already ran on the project root before the worktree was created).
1025
+ // Fail closed on migration errors: resolvers assume flat-phase paths after
1026
+ // startup, so continuing with nested disk state corrupts later checks.
907
1027
  try {
908
1028
  const { isInAutoWorktree } = await import("../auto-worktree.js");
909
1029
  if (!isInAutoWorktree(basePath)) {
@@ -917,11 +1037,21 @@ export function registerHooks(
917
1037
  } else {
918
1038
  safetyLogWarning(
919
1039
  "bootstrap",
920
- "flat-phase migration deferred: legacy .gsd/milestones/ layout detected but the workflow database could not be opened — will retry on next session",
1040
+ "flat-phase migration required: legacy .gsd/milestones/ layout detected but the workflow database could not be opened — fix database access before starting GSD",
1041
+ );
1042
+ throw new Error(
1043
+ "flat-phase migration required but the workflow database could not be opened; fix database access before starting GSD",
921
1044
  );
922
1045
  }
923
1046
  }
924
1047
  }
1048
+ } catch (err) {
1049
+ const message = err instanceof Error ? err.message : String(err);
1050
+ safetyLogWarning("bootstrap", `flat-phase migration failed: ${message}`);
1051
+ throw new Error(`flat-phase migration failed: ${message}`);
1052
+ }
1053
+
1054
+ try {
925
1055
  const projectRoot = resolveWorktreeProjectRoot(basePath);
926
1056
  const { pruneStaleFlatPhaseBackups } = await import("../flat-phase-migration.js");
927
1057
  const pruned = pruneStaleFlatPhaseBackups(projectRoot);
@@ -932,7 +1062,7 @@ export function registerHooks(
932
1062
  );
933
1063
  }
934
1064
  } catch (err) {
935
- safetyLogWarning("bootstrap", `flat-phase migration: ${err instanceof Error ? err.message : String(err)}`);
1065
+ safetyLogWarning("bootstrap", `flat-phase backup pruning: ${err instanceof Error ? err.message : String(err)}`);
936
1066
  }
937
1067
 
938
1068
  // Apply show_token_cost preference (#1515)
@@ -974,6 +1104,7 @@ export function registerHooks(
974
1104
  initSessionNotifications(ctx);
975
1105
  resetWriteGateState(basePath);
976
1106
  resetToolCallLoopGuard();
1107
+ await applyToolCallLoopGuardConfig(basePath);
977
1108
  clearDeferredApprovalGate();
978
1109
  await resetAskUserQuestionsTurnCache();
979
1110
  clearDiscussionFlowState(basePath);
@@ -1090,6 +1221,7 @@ export function registerHooks(
1090
1221
 
1091
1222
  pi.on("agent_end", async (event, ctx: ExtensionContext) => {
1092
1223
  approvalQuestionAbortInFlight = false;
1224
+ recordRetryableTurnAbort(event);
1093
1225
  resetToolCallLoopGuard();
1094
1226
  resetPendingGatePauseGuard();
1095
1227
  await resetAskUserQuestionsTurnCache();
@@ -1315,6 +1447,12 @@ export function registerHooks(
1315
1447
  // ── Loop guard: block repeated identical tool calls ──
1316
1448
  const loopCheck = checkToolCallLoop(toolName, event.input as Record<string, unknown>);
1317
1449
  if (loopCheck.block) {
1450
+ recordCurrentUnitHarnessAbort({
1451
+ kind: "tool-loop-guard",
1452
+ reason: loopCheck.reason ?? "Tool-call loop guard blocked a repeated tool call.",
1453
+ toolName,
1454
+ count: loopCheck.count,
1455
+ });
1318
1456
  return { block: true, reason: formatLoopGuardBlockReason(loopCheck.reason) };
1319
1457
  }
1320
1458
 
@@ -1587,7 +1725,7 @@ export function registerHooks(
1587
1725
  }
1588
1726
  }
1589
1727
  if (!event.isError) {
1590
- recordToolCallLoopMutation(toolName);
1728
+ recordToolCallLoopMutation(toolName, event.details);
1591
1729
  refreshSourceObservationAfterMutation(toolName, event.input, ctx);
1592
1730
  clearSourceObservationsAfterShell(toolName);
1593
1731
  }
@@ -1603,6 +1741,7 @@ export function registerHooks(
1603
1741
  // Let recordToolInvocationError classify the failure so non-gsd_ harness
1604
1742
  // errors and deterministic policy rejections are handled consistently.
1605
1743
  recordToolInvocationError(event.toolName, errorText);
1744
+ recordRetryableHarnessToolError(toolName, resultPayload, errorText);
1606
1745
  } else if (isAutoActive()) {
1607
1746
  clearToolInvocationError();
1608
1747
  }
@@ -1799,6 +1938,7 @@ export function registerHooks(
1799
1938
  // for every finalized tool call on every engine, so error classification
1800
1939
  // and evidence persistence here cover external engines that skip tool_result.
1801
1940
  pi.on("tool_execution_end", async (event) => {
1941
+ const toolName = canonicalToolName(event.toolName);
1802
1942
  markToolEnd(event.toolCallId);
1803
1943
  // #2883/#4974: Capture deterministic invocation/policy errors
1804
1944
  // so postUnitPreVerification can break the retry loop instead of re-dispatching.
@@ -1809,6 +1949,7 @@ export function registerHooks(
1809
1949
  // Let recordToolInvocationError classify the failure so non-gsd_ harness
1810
1950
  // errors and deterministic policy rejections are handled consistently.
1811
1951
  recordToolInvocationError(event.toolName, errorText);
1952
+ recordRetryableHarnessToolError(toolName, event.result, errorText);
1812
1953
  } else if (isAutoActive()) {
1813
1954
  clearToolInvocationError();
1814
1955
  }
@@ -6,22 +6,85 @@ import type { ExtensionAPI } from "@gsd/pi-coding-agent";
6
6
 
7
7
  import { getAutoRuntimeSnapshot } from "../auto-runtime-state.js";
8
8
  import { scheduleAutoWakeup } from "../auto/schedule-wakeup.js";
9
+ import { logWarning } from "../workflow-logger.js";
9
10
  import { resolveCtxCwd } from "./dynamic-tools.js";
10
11
 
11
12
  const MAX_WAKEUP_DELAY_SECONDS = 24 * 60 * 60;
13
+ const INTERACTIVE_WAKEUP_CUSTOM_TYPE = "gsd-schedule-wakeup";
14
+
15
+ // One pending interactive wakeup per session, keyed by base path — the same
16
+ // scoping auto-mode uses for its wakeup map (see `wakeupKey`). Re-arming cancels
17
+ // only that session's prior timer, so repeated polling never stacks overlapping
18
+ // wakeups, and concurrent projects in one host process don't cancel each other.
19
+ const pendingInteractiveWakeups = new Map<string, ReturnType<typeof setTimeout>>();
20
+
21
+ function scheduleInteractiveWakeup(
22
+ pi: ExtensionAPI,
23
+ key: string,
24
+ delaySeconds: number,
25
+ prompt: string,
26
+ reason: string,
27
+ ): void {
28
+ const existing = pendingInteractiveWakeups.get(key);
29
+ if (existing) clearTimeout(existing);
30
+
31
+ const handle = setTimeout(() => {
32
+ if (pendingInteractiveWakeups.get(key) === handle) {
33
+ pendingInteractiveWakeups.delete(key);
34
+ }
35
+ try {
36
+ void Promise.resolve(pi.sendMessage(
37
+ {
38
+ customType: INTERACTIVE_WAKEUP_CUSTOM_TYPE,
39
+ content: prompt,
40
+ display: true,
41
+ details: { delaySeconds, reason },
42
+ },
43
+ { triggerTurn: true },
44
+ )).catch((error) => {
45
+ logWarning(
46
+ "bootstrap",
47
+ `ScheduleWakeup interactive dispatch failed: ${error instanceof Error ? error.message : String(error)}`,
48
+ );
49
+ });
50
+ } catch (error) {
51
+ logWarning(
52
+ "bootstrap",
53
+ `ScheduleWakeup interactive dispatch failed: ${error instanceof Error ? error.message : String(error)}`,
54
+ );
55
+ }
56
+ }, delaySeconds * 1000);
57
+ pendingInteractiveWakeups.set(key, handle);
58
+ if (
59
+ typeof handle === "object" &&
60
+ handle !== null &&
61
+ "unref" in handle &&
62
+ typeof handle.unref === "function"
63
+ ) {
64
+ handle.unref();
65
+ }
66
+ }
67
+
68
+ export function _resetInteractiveWakeupsForTest(): void {
69
+ for (const handle of pendingInteractiveWakeups.values()) {
70
+ clearTimeout(handle);
71
+ }
72
+ pendingInteractiveWakeups.clear();
73
+ }
12
74
 
13
75
  export function registerScheduleWakeupTool(pi: ExtensionAPI): void {
14
76
  pi.registerTool({
15
77
  name: "ScheduleWakeup",
16
78
  label: "Schedule Wakeup",
17
79
  description:
18
- "In GSD auto-mode, pause the current unit and continue the same session after a delay. " +
19
- "Use this for long external processes that need polling without ending the unit as no-artifact.",
20
- promptSnippet: "Schedule a same-session auto-mode wakeup after a delay.",
80
+ "Schedule a delayed continuation turn. In GSD auto-mode, continue the current unit in the same session; " +
81
+ "outside auto-mode, start a new triggered turn with the supplied wakeup prompt.",
82
+ promptSnippet: "Schedule a wakeup prompt after a delay.",
21
83
  promptGuidelines: [
22
84
  "Use ScheduleWakeup at the end of an execute-task turn when waiting for a long external process.",
23
85
  "Include a prompt that says exactly what external state to check next and what artifact to write when done.",
24
86
  "Re-arm ScheduleWakeup on each polling turn if the external process is still running.",
87
+ "Outside auto-mode, use ScheduleWakeup when the user asks you to check back or poll later.",
25
88
  ],
26
89
  parameters: Type.Object({
27
90
  delaySeconds: Type.Number({
@@ -40,27 +103,32 @@ export function registerScheduleWakeupTool(pi: ExtensionAPI): void {
40
103
  async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
41
104
  const dash = getAutoRuntimeSnapshot();
42
105
  const currentUnit = dash.currentUnit;
43
- const basePath = dash.basePath || resolveCtxCwd(ctx);
106
+ const delaySeconds = Math.max(
107
+ 1,
108
+ Math.min(MAX_WAKEUP_DELAY_SECONDS, Math.floor(params.delaySeconds)),
109
+ );
110
+ const reason = params.reason ?? "";
44
111
 
45
112
  if (!dash.active || !currentUnit) {
113
+ const interactiveKey = dash.basePath || resolveCtxCwd(ctx);
114
+ scheduleInteractiveWakeup(pi, interactiveKey, delaySeconds, params.prompt, reason);
46
115
  return {
47
- content: [{ type: "text", text: "ScheduleWakeup is only available during an active GSD auto-mode unit." }],
48
- details: { operation: "schedule_wakeup", error: "auto_mode_inactive" },
49
- isError: true,
116
+ content: [{
117
+ type: "text",
118
+ text: `Wakeup scheduled for ${delaySeconds}s. GSD will start a new turn with the wakeup prompt.`,
119
+ }],
120
+ details: { operation: "schedule_wakeup", delaySeconds, mode: "interactive" },
50
121
  };
51
122
  }
52
123
 
53
- const delaySeconds = Math.max(
54
- 1,
55
- Math.min(MAX_WAKEUP_DELAY_SECONDS, Math.floor(params.delaySeconds)),
56
- );
124
+ const basePath = dash.basePath || resolveCtxCwd(ctx);
57
125
  scheduleAutoWakeup({
58
126
  basePath,
59
127
  unitType: currentUnit.type,
60
128
  unitId: currentUnit.id,
61
129
  delayMs: delaySeconds * 1000,
62
130
  prompt: params.prompt,
63
- reason: params.reason ?? "",
131
+ reason,
64
132
  createdAt: Date.now(),
65
133
  });
66
134
 
@@ -14,7 +14,7 @@ import { resolveModelWithFallbacksForUnit } from "../preferences-models.js";
14
14
  import { resolveGsdRootFile, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTaskFiles, resolveTasksDir, relSliceFile, relSlicePath, relTaskFile } from "../paths.js";
15
15
  import { extractIntroAndRules } from "../knowledge-parser.js";
16
16
  import { ensureCodebaseMapFresh, readCodebaseMap } from "../codebase-generator.js";
17
- import { getActiveAutoWorktreeContext } from "../auto-worktree.js";
17
+ import { getActiveAutoWorktreeContext } from "../auto-worktree-session-registry.js";
18
18
  import { getActiveWorktreeName, getWorktreeOriginalCwd } from "../worktree-session-state.js";
19
19
  import { deriveState } from "../state.js";
20
20
  import { formatOverridesSection, formatShortcut, loadActiveOverrides, loadFile, parseContinue, parseSummary } from "../files.js";