@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
@@ -12,6 +12,7 @@ import { appendEvent } from "../workflow-events.js";
12
12
  import { logWarning } from "../workflow-logger.js";
13
13
  import { loadEffectiveGSDPreferences } from "../preferences.js";
14
14
  import { validatePathOnlyPlanningFields, validatePlanningPathScope } from "../planning-path-scope.js";
15
+ import { createRepositoryRegistryFromPreferences, defaultRepositoryTargets, type RepositoryRegistry } from "../repository-registry.js";
15
16
  import type { GateId } from "../types.js";
16
17
 
17
18
  export interface PlanTaskParams {
@@ -26,6 +27,8 @@ export interface PlanTaskParams {
26
27
  inputs: string[];
27
28
  expectedOutput: string[];
28
29
  observabilityImpact?: string;
30
+ /** Repository id(s) this task touches (parent workspace); omitted for single-repo projects. */
31
+ targetRepositories?: string[];
29
32
  fullPlanMd?: string;
30
33
  /** Optional caller-provided identity for audit trail */
31
34
  actorName?: string;
@@ -40,6 +43,63 @@ export interface PlanTaskResult {
40
43
  taskPlanPath: string;
41
44
  }
42
45
 
46
+ function validateRepositoryTargetIds(field: string, value: unknown): string[] {
47
+ const ids = validateStringArray(value, field);
48
+ if (ids.length === 0) throw new Error(`${field} must include at least one repository id when provided`);
49
+ const deduped = Array.from(new Set(ids.map((id) => id.trim()).filter(Boolean)));
50
+ if (deduped.length === 0) throw new Error(`${field} must include at least one repository id when provided`);
51
+ return deduped;
52
+ }
53
+
54
+ function validateReferencedRepositories(
55
+ targetRepositories: string[] | undefined,
56
+ registry: RepositoryRegistry,
57
+ ): string | null {
58
+ if (!targetRepositories) return null;
59
+ const known = new Set(registry.repositories.map((repo) => repo.id));
60
+ const missing = targetRepositories.filter((id) => !known.has(id));
61
+ if (missing.length === 0) return null;
62
+ return `unknown targetRepositories: ${missing.join(", ")}. Declared repositories: ${Array.from(known).join(", ")}`;
63
+ }
64
+
65
+ function resolveAllowedRootsForPathScope(
66
+ targetRepositories: string[],
67
+ registry: RepositoryRegistry,
68
+ ): string[] {
69
+ if (targetRepositories.length === 0) return [registry.projectRoot];
70
+ const roots = targetRepositories
71
+ .map((id) => registry.byId.get(id)?.root)
72
+ .filter((root): root is string => typeof root === "string");
73
+ return roots.length > 0 ? roots : [registry.projectRoot];
74
+ }
75
+
76
+ function validatePathScopeForTargetRepositories(
77
+ params: PlanTaskParams,
78
+ basePath: string,
79
+ registry: RepositoryRegistry,
80
+ targetRepositories: string[],
81
+ ): string | null {
82
+ return validatePlanningPathScope(
83
+ basePath,
84
+ [
85
+ { field: "files", values: params.files },
86
+ { field: "inputs", values: params.inputs },
87
+ { field: "expectedOutput", values: params.expectedOutput },
88
+ ],
89
+ resolveAllowedRootsForPathScope(targetRepositories, registry),
90
+ );
91
+ }
92
+
93
+ function resolveEffectiveTargetRepositories(
94
+ taskTargetRepositories: string[] | undefined,
95
+ sliceTargetRepositories: string[] | undefined,
96
+ defaultTargets: string[],
97
+ ): string[] {
98
+ if (taskTargetRepositories) return taskTargetRepositories;
99
+ if (sliceTargetRepositories?.length) return sliceTargetRepositories;
100
+ return defaultTargets;
101
+ }
102
+
43
103
  function validateParams(params: PlanTaskParams): PlanTaskParams {
44
104
  if (!isNonEmptyString(params?.milestoneId)) throw new Error("milestoneId is required");
45
105
  if (!isNonEmptyString(params?.sliceId)) throw new Error("sliceId is required");
@@ -57,6 +117,9 @@ function validateParams(params: PlanTaskParams): PlanTaskParams {
57
117
  files: validateStringArray(params.files, "files"),
58
118
  inputs: validateStringArray(params.inputs, "inputs"),
59
119
  expectedOutput: validateStringArray(params.expectedOutput, "expectedOutput"),
120
+ ...(params.targetRepositories !== undefined
121
+ ? { targetRepositories: validateRepositoryTargetIds("targetRepositories", params.targetRepositories) }
122
+ : {}),
60
123
  };
61
124
  }
62
125
 
@@ -84,23 +147,19 @@ export async function handlePlanTask(
84
147
  return { error: `validation failed: ${pathOnlyError}` };
85
148
  }
86
149
 
87
- const pathScopeError = validatePlanningPathScope(basePath, [
88
- { field: "files", values: params.files },
89
- { field: "inputs", values: params.inputs },
90
- { field: "expectedOutput", values: params.expectedOutput },
91
- ]);
92
- if (pathScopeError) {
93
- return { error: `validation failed: ${pathScopeError}` };
94
- }
95
-
96
150
  let taskGates: GateId[];
151
+ let repositoryRegistry: RepositoryRegistry;
97
152
  try {
98
153
  taskGates = resolveTaskGates(basePath);
154
+ const loaded = loadEffectiveGSDPreferences(basePath);
155
+ repositoryRegistry = createRepositoryRegistryFromPreferences(basePath, loaded?.preferences);
99
156
  } catch (err) {
100
157
  const message = err instanceof Error ? err.message : String(err);
101
158
  return { error: `validation failed: ${message}` };
102
159
  }
103
160
 
161
+ const defaultTargets = defaultRepositoryTargets(repositoryRegistry);
162
+
104
163
  // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
105
164
  // Guards must be inside the transaction so the state they check cannot
106
165
  // change between the read and the write (#2723).
@@ -124,6 +183,44 @@ export async function handlePlanTask(
124
183
  return;
125
184
  }
126
185
 
186
+ let effectiveTargetRepositories = resolveEffectiveTargetRepositories(
187
+ params.targetRepositories,
188
+ parentSlice.target_repositories,
189
+ defaultTargets,
190
+ );
191
+ const repoValidationError = validateReferencedRepositories(effectiveTargetRepositories, repositoryRegistry);
192
+ if (repoValidationError) {
193
+ guardError = `validation failed: ${repoValidationError}`;
194
+ return;
195
+ }
196
+
197
+ let pathScopeError = validatePathScopeForTargetRepositories(
198
+ params,
199
+ basePath,
200
+ repositoryRegistry,
201
+ effectiveTargetRepositories,
202
+ );
203
+ const storedTaskTargets = existingTask?.target_repositories?.length
204
+ ? existingTask.target_repositories
205
+ : undefined;
206
+ // Omitted targetRepositories inherit the current slice default first.
207
+ // Fall back to the stored task target only when that inherited scope
208
+ // rejects the replan paths, preserving explicit per-task parent-root work.
209
+ if (pathScopeError && params.targetRepositories === undefined && storedTaskTargets) {
210
+ const storedRepoValidationError = validateReferencedRepositories(storedTaskTargets, repositoryRegistry);
211
+ const storedPathScopeError = storedRepoValidationError
212
+ ? storedRepoValidationError
213
+ : validatePathScopeForTargetRepositories(params, basePath, repositoryRegistry, storedTaskTargets);
214
+ if (!storedPathScopeError) {
215
+ effectiveTargetRepositories = storedTaskTargets;
216
+ pathScopeError = null;
217
+ }
218
+ }
219
+ if (pathScopeError) {
220
+ guardError = `validation failed: ${pathScopeError}`;
221
+ return;
222
+ }
223
+
127
224
  if (!existingTask) {
128
225
  insertTask({
129
226
  id: params.taskId,
@@ -143,6 +240,7 @@ export async function handlePlanTask(
143
240
  expectedOutput: params.expectedOutput,
144
241
  observabilityImpact: params.observabilityImpact ?? "",
145
242
  fullPlanMd: params.fullPlanMd,
243
+ targetRepositories: effectiveTargetRepositories,
146
244
  });
147
245
  for (const gid of taskGates) {
148
246
  insertGateRow({ milestoneId: params.milestoneId, sliceId: params.sliceId, gateId: gid, scope: "task", taskId: params.taskId });
@@ -5,6 +5,11 @@
5
5
  * tasks back to "pending". This is intentional — if you're reopening a
6
6
  * slice, you're re-doing the work. Partial resets create ambiguous state.
7
7
  *
8
+ * Also recovers a desynced slice (#1205): when a UAT→planning fallback leaves
9
+ * the slice open (e.g. "pending") but its tasks still "complete", this clears
10
+ * that state so the planner can re-plan without hitting "already complete"
11
+ * rejections.
12
+ *
8
13
  * The parent milestone must still be open (not complete).
9
14
  */
10
15
 
@@ -24,8 +24,8 @@ import { writeManifest } from "../workflow-manifest.js";
24
24
  import { appendEvent } from "../workflow-events.js";
25
25
  import { logWarning } from "../workflow-logger.js";
26
26
  import { existsSync, unlinkSync } from "node:fs";
27
- import { join } from "node:path";
28
- import { resolveTasksDir, clearPathCache } from "../paths.js";
27
+ import { join, basename, dirname } from "node:path";
28
+ import { resolveTasksDir, resolveSlicePath, clearPathCache } from "../paths.js";
29
29
 
30
30
  export interface ReopenTaskParams {
31
31
  milestoneId: string;
@@ -106,10 +106,18 @@ export async function handleReopenTask(
106
106
  // ── Clean up stale filesystem artifacts (M12 fix) ────────────────────────
107
107
  // Without this, the DB-filesystem reconciler sees the SUMMARY.md and
108
108
  // auto-corrects the task back to "complete", making reopen a no-op (#3161).
109
+ // Legacy layout keeps the summary under a tasks/ subdir; flat-phase writes
110
+ // TID-SUMMARY.md directly in the phase dir. A tasks/ subdir may still exist
111
+ // in flat-phase for auxiliary artifacts — its mere existence must NOT redirect
112
+ // summary cleanup into tasks/ (#1208).
109
113
  try {
110
- const tasksDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
111
- if (tasksDir) {
112
- const summaryPath = join(tasksDir, `${params.taskId}-SUMMARY.md`);
114
+ const slicePath = resolveSlicePath(basePath, params.milestoneId, params.sliceId);
115
+ if (slicePath) {
116
+ const isLegacySlice = basename(dirname(slicePath)) === "slices";
117
+ const summaryDir = isLegacySlice
118
+ ? (resolveTasksDir(basePath, params.milestoneId, params.sliceId) ?? slicePath)
119
+ : slicePath;
120
+ const summaryPath = join(summaryDir, `${params.taskId}-SUMMARY.md`);
113
121
  if (existsSync(summaryPath)) unlinkSync(summaryPath);
114
122
  }
115
123
  } catch (cleanupErr) {
@@ -53,11 +53,13 @@ import { loadEffectiveGSDPreferences } from "../preferences.js";
53
53
  import { parseProject } from "../schemas/parsers.js";
54
54
  import { autoSession, getAutoRuntimeSnapshot, isAutoActive } from "../auto-runtime-state.js";
55
55
  import { renderPlanFromDb } from "../markdown-renderer.js";
56
+ import { readUnitHarnessAbort, type UnitHarnessAbortRecord } from "../unit-runtime.js";
56
57
  import {
57
58
  prepareUatRun,
58
59
  saveUatAttemptArtifact,
59
60
  type UatResultSaveParams,
60
61
  } from "../uat-run.js";
62
+ import { appendNotification } from "../notification-store.js";
61
63
  import { registerAutoWorker, markWorkerStopping, getAutoWorker } from "../db/auto-workers.js";
62
64
  import {
63
65
  claimMilestoneLease,
@@ -116,6 +118,48 @@ function blockIfWrongAutoUnit(requiredUnitType: string, operation: string): Tool
116
118
  };
117
119
  }
118
120
 
121
+ function blockIfHarnessAbortedUnit(operation: string, basePath: string): ToolExecutionResult | null {
122
+ const snapshot = getAutoRuntimeSnapshot();
123
+ if (!snapshot.active || !snapshot.currentUnit) return null;
124
+
125
+ const abort = readUnitHarnessAbort(
126
+ snapshot.basePath || basePath,
127
+ snapshot.currentUnit.type,
128
+ snapshot.currentUnit.id,
129
+ snapshot.currentUnit.startedAt,
130
+ );
131
+ if (!abort) return null;
132
+
133
+ return harnessAbortResult(operation, snapshot.currentUnit.type, snapshot.currentUnit.id, abort);
134
+ }
135
+
136
+ function harnessAbortResult(
137
+ operation: string,
138
+ unitType: string,
139
+ unitId: string,
140
+ abort: UnitHarnessAbortRecord,
141
+ ): ToolExecutionResult {
142
+ const toolText = abort.toolName ? ` while calling ${abort.toolName}` : "";
143
+ const message =
144
+ `Retryable harness abort: ${unitType} ${unitId} was truncated by ${abort.kind}${toolText}. ` +
145
+ "This gate result was not saved; leave the gate pending so auto-mode can rerun it.";
146
+ return {
147
+ content: [{ type: "text", text: message }],
148
+ details: {
149
+ operation,
150
+ error: "harness_aborted_needs_retry",
151
+ retryable: true,
152
+ unitType,
153
+ unitId,
154
+ harnessAbortKind: abort.kind,
155
+ harnessAbortReason: abort.reason,
156
+ harnessAbortToolName: abort.toolName,
157
+ harnessAbortCount: abort.count,
158
+ },
159
+ isError: true,
160
+ };
161
+ }
162
+
119
163
  function milestoneLeaseConflictResult(
120
164
  milestoneId: string,
121
165
  byWorker: string,
@@ -1135,6 +1179,9 @@ export async function executeSaveGateResult(
1135
1179
  params: SaveGateResultParams,
1136
1180
  basePath: string = process.cwd(),
1137
1181
  ): Promise<ToolExecutionResult> {
1182
+ const harnessAbort = blockIfHarnessAbortedUnit("save_gate_result", basePath);
1183
+ if (harnessAbort) return harnessAbort;
1184
+
1138
1185
  const dbAvailable = await ensureDbOpen(basePath);
1139
1186
  if (!dbAvailable) {
1140
1187
  return {
@@ -1206,6 +1253,9 @@ export async function executeUatResultSave(
1206
1253
  const unitGuard = blockIfWrongAutoUnit("run-uat", "save_uat_result");
1207
1254
  if (unitGuard) return unitGuard;
1208
1255
 
1256
+ const harnessAbort = blockIfHarnessAbortedUnit("save_uat_result", basePath);
1257
+ if (harnessAbort) return harnessAbort;
1258
+
1209
1259
  const dbAvailable = await ensureDbOpen(basePath);
1210
1260
  if (!dbAvailable) return errorResult("save_uat_result", "GSD database is not available.", "db_unavailable");
1211
1261
 
@@ -1268,6 +1318,14 @@ export async function executeUatResultSave(
1268
1318
  evaluatedAt: run.evaluatedAt,
1269
1319
  });
1270
1320
  invalidateStateCache();
1321
+ if (run.hasHuman) {
1322
+ appendNotification(
1323
+ `UAT for ${run.params.milestoneId}/${run.params.sliceId} has NEEDS-HUMAN checks awaiting human validation`,
1324
+ "warning",
1325
+ "notify",
1326
+ { kind: "uat-needs-human", scope: `${run.params.milestoneId}/${run.params.sliceId}` },
1327
+ );
1328
+ }
1271
1329
  const savedText = `UAT result saved for ${run.params.milestoneId}/${run.params.sliceId}: ${run.params.verdict}`;
1272
1330
  return {
1273
1331
  content: [{
@@ -140,6 +140,10 @@ export type ContextModePolicy =
140
140
  * restricted to .gsd/**. Subagent dispatch is denied unless
141
141
  * `allowedSubagents` opts a unit into controlled read-only
142
142
  * specialist delegation.
143
+ * - "workflow-only"
144
+ * — Read tools + GSD workflow tools only. No generic writes
145
+ * and no generic shell; used by lanes whose durable output
146
+ * must be produced by a dedicated DB-backed workflow tool.
143
147
  *
144
148
  * The allowlist for "docs" is declared per-manifest rather than hardcoded so
145
149
  * projects with non-standard doc layouts can extend it without forking the
@@ -152,7 +156,8 @@ export type ToolsPolicy =
152
156
  | { readonly mode: "planning" }
153
157
  | { readonly mode: "planning-dispatch"; readonly allowedSubagents: readonly string[] }
154
158
  | { readonly mode: "docs"; readonly allowedPathGlobs: readonly string[] }
155
- | { readonly mode: "verification"; readonly allowedSubagents?: readonly string[] };
159
+ | { readonly mode: "verification"; readonly allowedSubagents?: readonly string[] }
160
+ | { readonly mode: "workflow-only"; readonly allowedSubagents?: readonly string[] };
156
161
 
157
162
  // ─── Computed-artifact registry (#4924 v2 contract) ───────────────────────
158
163
 
@@ -405,9 +410,10 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
405
410
  codebaseMap: false,
406
411
  preferences: "active-only",
407
412
  contextMode: "verification",
408
- // Validation may need to run shell verification commands and apply source
409
- // fixes before milestone closeout can proceed.
410
- tools: TOOLS_ALL,
413
+ // Validation must persist its durable output through gsd_validate_milestone;
414
+ // generic write/bash tools can create filesystem artifacts that bypass DB
415
+ // state and trigger destructive recovery loops.
416
+ tools: { mode: "workflow-only", allowedSubagents: ["reviewer", "security", "tester"] },
411
417
  artifacts: {
412
418
  inline: ["roadmap", "requirements", "templates"],
413
419
  excerpt: ["slice-summary", "slice-assessment"],
@@ -774,7 +780,7 @@ export function compileSubagentPermissionContract(
774
780
  return { allowed: true, allowedSubagents: ["*"], toolsMode: policy.mode };
775
781
  }
776
782
  if (
777
- (policy.mode === "planning-dispatch" || policy.mode === "verification") &&
783
+ (policy.mode === "planning-dispatch" || policy.mode === "verification" || policy.mode === "workflow-only") &&
778
784
  Array.isArray(policy.allowedSubagents)
779
785
  ) {
780
786
  return {
@@ -20,8 +20,9 @@
20
20
  //
21
21
  // Not yet declared here (remaining ADR-033 steps): the manifest data
22
22
  // (`UNIT_MANIFESTS` stays in unit-context-manifest.ts, already type-enforced
23
- // against the registry's `UnitType`) and prompt-template association (still
24
- // implicit in auto-prompts.ts builders).
23
+ // against the registry's `UnitType`). Prompt-template association is declared
24
+ // for direct one-template units and verified conditional template sets;
25
+ // composition logic stays with prompt builders.
25
26
 
26
27
  import type { CanonicalWorkflowToolName } from "@opengsd/contracts";
27
28
  import { BROWSER_CONTRACT_TOOL_NAMES } from "../shared/browser-contract.js";
@@ -61,6 +62,17 @@ export interface UnitDescriptor {
61
62
  * resolves against session defaults).
62
63
  */
63
64
  readonly phaseChain: readonly GSDModelPhaseKey[] | null;
65
+ /**
66
+ * Prompt template id passed to loadPrompt for units with a direct
67
+ * one-template builder. Omitted for conditional, composite, or not-yet
68
+ * verified prompt associations.
69
+ */
70
+ readonly promptTemplate?: string;
71
+ /**
72
+ * Prompt template ids a conditional or composite builder may choose from.
73
+ * Omitted unless every listed association is verified against the builder.
74
+ */
75
+ readonly promptTemplates?: readonly string[];
64
76
  /** `null` = the unit has no scoped gsd-tool contract. */
65
77
  readonly toolContract: UnitToolSurfaceContract | null;
66
78
  }
@@ -97,6 +109,7 @@ export const UNIT_REGISTRY = {
97
109
  kind: "primary",
98
110
  scopeClass: "standard",
99
111
  phaseChain: ["research"],
112
+ promptTemplate: "research-milestone",
100
113
  toolContract: {
101
114
  allowedGsdTools: [
102
115
  "gsd_summary_save",
@@ -112,6 +125,7 @@ export const UNIT_REGISTRY = {
112
125
  kind: "primary",
113
126
  scopeClass: "standard",
114
127
  phaseChain: ["planning"],
128
+ promptTemplate: "plan-milestone",
115
129
  toolContract: {
116
130
  allowedGsdTools: [
117
131
  "gsd_milestone_status",
@@ -128,6 +142,7 @@ export const UNIT_REGISTRY = {
128
142
  kind: "primary",
129
143
  scopeClass: "standard",
130
144
  phaseChain: ["discuss", "planning"],
145
+ promptTemplates: ["discuss", "discuss-headless", "guided-discuss-milestone"],
131
146
  toolContract: {
132
147
  allowedGsdTools: [
133
148
  "gsd_summary_save",
@@ -160,6 +175,7 @@ export const UNIT_REGISTRY = {
160
175
  kind: "primary",
161
176
  scopeClass: "section-close",
162
177
  phaseChain: ["validation", "planning"],
178
+ promptTemplate: "validate-milestone",
163
179
  toolContract: {
164
180
  allowedGsdTools: [
165
181
  "gsd_milestone_status",
@@ -177,6 +193,7 @@ export const UNIT_REGISTRY = {
177
193
  kind: "primary",
178
194
  scopeClass: "standard",
179
195
  phaseChain: ["completion"],
196
+ promptTemplate: "complete-milestone",
180
197
  toolContract: {
181
198
  allowedGsdTools: [
182
199
  "gsd_milestone_status",
@@ -200,6 +217,7 @@ export const UNIT_REGISTRY = {
200
217
  kind: "primary",
201
218
  scopeClass: "standard",
202
219
  phaseChain: ["research"],
220
+ promptTemplate: "research-slice",
203
221
  toolContract: {
204
222
  allowedGsdTools: [
205
223
  "gsd_milestone_status",
@@ -216,6 +234,7 @@ export const UNIT_REGISTRY = {
216
234
  kind: "primary",
217
235
  scopeClass: "standard",
218
236
  phaseChain: ["planning"],
237
+ promptTemplate: "plan-slice",
219
238
  toolContract: {
220
239
  allowedGsdTools: [
221
240
  "gsd_milestone_status",
@@ -234,6 +253,7 @@ export const UNIT_REGISTRY = {
234
253
  kind: "primary",
235
254
  scopeClass: "standard",
236
255
  phaseChain: ["planning"],
256
+ promptTemplate: "refine-slice",
237
257
  toolContract: {
238
258
  allowedGsdTools: [
239
259
  "gsd_milestone_status",
@@ -250,6 +270,7 @@ export const UNIT_REGISTRY = {
250
270
  kind: "primary",
251
271
  scopeClass: "standard",
252
272
  phaseChain: ["planning"],
273
+ promptTemplate: "replan-slice",
253
274
  toolContract: {
254
275
  allowedGsdTools: ["gsd_replan_slice", "gsd_decision_save"],
255
276
  requiredWorkflowTools: ["gsd_replan_slice"],
@@ -259,6 +280,7 @@ export const UNIT_REGISTRY = {
259
280
  kind: "primary",
260
281
  scopeClass: "section-close",
261
282
  phaseChain: ["completion"],
283
+ promptTemplate: "complete-slice",
262
284
  toolContract: {
263
285
  allowedGsdTools: [
264
286
  "gsd_milestone_status",
@@ -293,6 +315,7 @@ export const UNIT_REGISTRY = {
293
315
  kind: "primary",
294
316
  scopeClass: "standard",
295
317
  phaseChain: ["validation", "planning"],
318
+ promptTemplate: "reassess-roadmap",
296
319
  toolContract: {
297
320
  allowedGsdTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
298
321
  requiredWorkflowTools: ["gsd_milestone_status", "gsd_reassess_roadmap"],
@@ -302,6 +325,7 @@ export const UNIT_REGISTRY = {
302
325
  kind: "primary",
303
326
  scopeClass: "execute-task",
304
327
  phaseChain: ["execution"],
328
+ promptTemplate: "execute-task",
305
329
  toolContract: {
306
330
  allowedGsdTools: [
307
331
  "gsd_task_complete",
@@ -346,6 +370,7 @@ export const UNIT_REGISTRY = {
346
370
  kind: "primary",
347
371
  scopeClass: "execute-task",
348
372
  phaseChain: ["execution"],
373
+ promptTemplate: "reactive-execute",
349
374
  toolContract: {
350
375
  allowedGsdTools: [
351
376
  "gsd_milestone_status",
@@ -361,6 +386,7 @@ export const UNIT_REGISTRY = {
361
386
  kind: "primary",
362
387
  scopeClass: "standard",
363
388
  phaseChain: ["uat", "completion"],
389
+ promptTemplate: "run-uat",
364
390
  toolContract: {
365
391
  allowedGsdTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES, "subagent"],
366
392
  requiredWorkflowTools: [...RUN_UAT_WORKFLOW_TOOL_NAMES],
@@ -375,6 +401,7 @@ export const UNIT_REGISTRY = {
375
401
  kind: "primary",
376
402
  scopeClass: "standard",
377
403
  phaseChain: ["validation", "planning"],
404
+ promptTemplate: "gate-evaluate",
378
405
  toolContract: {
379
406
  allowedGsdTools: ["gsd_save_gate_result"],
380
407
  requiredWorkflowTools: ["gsd_save_gate_result"],
@@ -384,6 +411,7 @@ export const UNIT_REGISTRY = {
384
411
  kind: "primary",
385
412
  scopeClass: "standard",
386
413
  phaseChain: ["validation", "planning"],
414
+ promptTemplate: "rewrite-docs",
387
415
  toolContract: {
388
416
  allowedGsdTools: ["gsd_summary_save", "gsd_decision_save"],
389
417
  requiredWorkflowTools: [],
@@ -408,6 +436,7 @@ export const UNIT_REGISTRY = {
408
436
  kind: "primary",
409
437
  scopeClass: "standard",
410
438
  phaseChain: ["discuss", "planning"],
439
+ promptTemplate: "guided-workflow-preferences",
411
440
  toolContract: {
412
441
  allowedGsdTools: ["gsd_summary_save"],
413
442
  requiredWorkflowTools: [],
@@ -417,6 +446,7 @@ export const UNIT_REGISTRY = {
417
446
  kind: "primary",
418
447
  scopeClass: "standard",
419
448
  phaseChain: ["discuss", "planning"],
449
+ promptTemplate: "guided-discuss-project",
420
450
  toolContract: {
421
451
  allowedGsdTools: ["gsd_summary_save", "gsd_decision_save", "gsd_requirement_save"],
422
452
  requiredWorkflowTools: ["ask_user_questions", "gsd_summary_save"],
@@ -426,6 +456,7 @@ export const UNIT_REGISTRY = {
426
456
  kind: "primary",
427
457
  scopeClass: "standard",
428
458
  phaseChain: ["discuss", "planning"],
459
+ promptTemplate: "guided-discuss-requirements",
429
460
  toolContract: {
430
461
  allowedGsdTools: ["gsd_requirement_save", "gsd_summary_save"],
431
462
  requiredWorkflowTools: ["ask_user_questions", "gsd_requirement_save", "gsd_summary_save"],
@@ -435,6 +466,7 @@ export const UNIT_REGISTRY = {
435
466
  kind: "primary",
436
467
  scopeClass: "standard",
437
468
  phaseChain: ["discuss", "planning"],
469
+ promptTemplate: "guided-research-decision",
438
470
  toolContract: {
439
471
  allowedGsdTools: ["gsd_summary_save"],
440
472
  requiredWorkflowTools: ["ask_user_questions"],
@@ -447,6 +479,7 @@ export const UNIT_REGISTRY = {
447
479
  kind: "primary",
448
480
  scopeClass: "standard",
449
481
  phaseChain: ["research"],
482
+ promptTemplate: "guided-research-project",
450
483
  toolContract: {
451
484
  allowedGsdTools: [],
452
485
  requiredWorkflowTools: [],
@@ -494,3 +527,16 @@ export function getUnitDescriptor(unitType: string): UnitDescriptor | undefined
494
527
  export function getUnitPhaseChain(unitType: string): readonly GSDModelPhaseKey[] | null {
495
528
  return getUnitDescriptor(unitType)?.phaseChain ?? null;
496
529
  }
530
+
531
+ /** Prompt template id for units with a direct one-template builder. */
532
+ export function getUnitPromptTemplate(unitType: string): string | undefined {
533
+ return getUnitDescriptor(unitType)?.promptTemplate;
534
+ }
535
+
536
+ /** Prompt template ids for any verified direct or conditional prompt builder. */
537
+ export function getUnitPromptTemplates(unitType: string): readonly string[] {
538
+ const descriptor = getUnitDescriptor(unitType);
539
+ if (!descriptor) return [];
540
+ if (descriptor.promptTemplates) return descriptor.promptTemplates;
541
+ return descriptor.promptTemplate ? [descriptor.promptTemplate] : [];
542
+ }
@@ -100,6 +100,14 @@ export interface ExecuteTaskRecoveryStatus {
100
100
  mustHavesMentionedInSummary: number;
101
101
  }
102
102
 
103
+ export interface UnitHarnessAbortRecord {
104
+ kind: "tool-loop-guard" | "tool-error" | "turn-abort";
105
+ reason: string;
106
+ toolName?: string;
107
+ count?: number;
108
+ recordedAt: number;
109
+ }
110
+
103
111
  export interface AutoUnitRuntimeRecord {
104
112
  version: 1;
105
113
  unitType: string;
@@ -116,6 +124,7 @@ export interface AutoUnitRuntimeRecord {
116
124
  recovery?: ExecuteTaskRecoveryStatus;
117
125
  recoveryAttempts?: number;
118
126
  lastRecoveryReason?: "idle" | "hard";
127
+ harnessAbort?: UnitHarnessAbortRecord;
119
128
  }
120
129
 
121
130
  function runtimeDir(basePath: string): string {
@@ -138,6 +147,8 @@ export function writeUnitRuntimeRecord(
138
147
  const path = runtimePath(basePath, unitType, unitId);
139
148
  return withRecordLock(path, () => {
140
149
  const prev = readUnitRuntimeRecord(basePath, unitType, unitId);
150
+ const sameRun = prev?.startedAt === startedAt;
151
+ const updatesHarnessAbort = Object.prototype.hasOwnProperty.call(updates, "harnessAbort");
141
152
  const next: AutoUnitRuntimeRecord = {
142
153
  version: 1,
143
154
  unitType,
@@ -154,12 +165,32 @@ export function writeUnitRuntimeRecord(
154
165
  recovery: updates.recovery ?? prev?.recovery,
155
166
  recoveryAttempts: updates.recoveryAttempts ?? prev?.recoveryAttempts ?? 0,
156
167
  lastRecoveryReason: updates.lastRecoveryReason ?? prev?.lastRecoveryReason,
168
+ harnessAbort: updatesHarnessAbort
169
+ ? updates.harnessAbort
170
+ : (sameRun ? prev?.harnessAbort : undefined),
157
171
  };
158
172
  atomicWriteSync(path, JSON.stringify(next, null, 2) + "\n", "utf-8");
159
173
  return next;
160
174
  });
161
175
  }
162
176
 
177
+ export function recordUnitHarnessAbort(
178
+ basePath: string,
179
+ unitType: string,
180
+ unitId: string,
181
+ startedAt: number,
182
+ abort: Omit<UnitHarnessAbortRecord, "recordedAt"> & { recordedAt?: number },
183
+ ): AutoUnitRuntimeRecord {
184
+ return writeUnitRuntimeRecord(basePath, unitType, unitId, startedAt, {
185
+ harnessAbort: {
186
+ ...abort,
187
+ recordedAt: abort.recordedAt ?? Date.now(),
188
+ },
189
+ lastProgressAt: Date.now(),
190
+ lastProgressKind: `harness-abort:${abort.kind}`,
191
+ });
192
+ }
193
+
163
194
  export function readUnitRuntimeRecord(basePath: string, unitType: string, unitId: string): AutoUnitRuntimeRecord | null {
164
195
  const path = runtimePath(basePath, unitType, unitId);
165
196
  if (!existsSync(path)) return null;
@@ -170,6 +201,17 @@ export function readUnitRuntimeRecord(basePath: string, unitType: string, unitId
170
201
  }
171
202
  }
172
203
 
204
+ export function readUnitHarnessAbort(
205
+ basePath: string,
206
+ unitType: string,
207
+ unitId: string,
208
+ startedAt: number,
209
+ ): UnitHarnessAbortRecord | null {
210
+ const record = readUnitRuntimeRecord(basePath, unitType, unitId);
211
+ if (!record || record.startedAt !== startedAt) return null;
212
+ return record.harnessAbort ?? null;
213
+ }
214
+
173
215
  export function clearUnitRuntimeRecord(basePath: string, unitType: string, unitId: string): void {
174
216
  const path = runtimePath(basePath, unitType, unitId);
175
217
  if (existsSync(path)) unlinkSync(path);
@@ -9,7 +9,7 @@ import {
9
9
  nativeDiffNumstat,
10
10
  nativeIsAncestor,
11
11
  } from "./native-git-bridge.js";
12
- import { autoWorktreeBranch } from "./auto-worktree.js";
12
+ import { autoWorktreeBranch } from "./auto-worktree-branch-lifecycle.js";
13
13
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
14
14
  import { getAllMilestones } from "./gsd-db.js";
15
15
  import { resolveMilestoneIntegrationBranch } from "./git-service.js";
@@ -3,7 +3,8 @@
3
3
 
4
4
  import { existsSync } from "node:fs";
5
5
 
6
- import { getAutoWorktreePath, isInAutoWorktree } from "./auto-worktree.js";
6
+ import { isInAutoWorktree } from "./auto-worktree-entry.js";
7
+ import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
7
8
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
8
9
  import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
9
10
  import { getIsolationMode } from "./preferences.js";
@@ -3,8 +3,8 @@
3
3
 
4
4
  import { existsSync, realpathSync } from "node:fs";
5
5
 
6
- import { getAutoWorktreePath } from "./auto-worktree.js";
7
- import { isSafeToAutoResolve } from "./auto-worktree.js";
6
+ import { isSafeToAutoResolve } from "./auto-worktree-conflict-auto-resolve.js";
7
+ import { getAutoWorktreePath } from "./auto-worktree-path-resolution.js";
8
8
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
9
9
  import {
10
10
  listMergeStateBlockers,