@opengsd/gsd-pi 1.4.0 → 1.5.0-dev.553dc518

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 (606) 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/claude-code-cli/stream-adapter.js +118 -53
  6. package/dist/resources/extensions/cursor-cli/index.js +16 -0
  7. package/dist/resources/extensions/cursor-cli/models.js +63 -0
  8. package/dist/resources/extensions/cursor-cli/package.json +11 -0
  9. package/dist/resources/extensions/cursor-cli/readiness.js +128 -0
  10. package/dist/resources/extensions/cursor-cli/stream-adapter.js +353 -0
  11. package/dist/resources/extensions/gsd/activity-log.js +4 -1
  12. package/dist/resources/extensions/gsd/artifact-verification.js +25 -9
  13. package/dist/resources/extensions/gsd/auto/closeout.js +137 -42
  14. package/dist/resources/extensions/gsd/auto/finalize.js +9 -0
  15. package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -3
  16. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +6 -3
  17. package/dist/resources/extensions/gsd/auto/run-unit.js +5 -2
  18. package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +3 -0
  19. package/dist/resources/extensions/gsd/auto/unit-phase.js +5 -9
  20. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +4 -5
  21. package/dist/resources/extensions/gsd/auto-dispatch.js +15 -5
  22. package/dist/resources/extensions/gsd/auto-model-selection.js +36 -18
  23. package/dist/resources/extensions/gsd/auto-prompts.js +76 -2
  24. package/dist/resources/extensions/gsd/auto-start.js +7 -5
  25. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -0
  26. package/dist/resources/extensions/gsd/auto-worktree-branch-lifecycle.js +189 -0
  27. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +133 -0
  28. package/dist/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.js +35 -0
  29. package/dist/resources/extensions/gsd/auto-worktree-creation.js +130 -0
  30. package/dist/resources/extensions/gsd/auto-worktree-entry.js +118 -0
  31. package/dist/resources/extensions/gsd/auto-worktree-merge-already-merged.js +98 -0
  32. package/dist/resources/extensions/gsd/auto-worktree-merge-branch-head.js +52 -0
  33. package/dist/resources/extensions/gsd/auto-worktree-merge-cleanup.js +87 -0
  34. package/dist/resources/extensions/gsd/auto-worktree-merge-code-changes.js +46 -0
  35. package/dist/resources/extensions/gsd/auto-worktree-merge-db-ready.js +68 -0
  36. package/dist/resources/extensions/gsd/auto-worktree-merge-integration-branch.js +51 -0
  37. package/dist/resources/extensions/gsd/auto-worktree-merge-message.js +106 -0
  38. package/dist/resources/extensions/gsd/auto-worktree-merge-pre-teardown.js +64 -0
  39. package/dist/resources/extensions/gsd/auto-worktree-merge-stash.js +168 -0
  40. package/dist/resources/extensions/gsd/auto-worktree-merge.js +302 -0
  41. package/dist/resources/extensions/gsd/auto-worktree-milestone-shelter.js +119 -0
  42. package/dist/resources/extensions/gsd/auto-worktree-path-resolution.js +5 -0
  43. package/dist/resources/extensions/gsd/auto-worktree-path-utils.js +5 -0
  44. package/dist/resources/extensions/gsd/auto-worktree-resource-version.js +41 -0
  45. package/dist/resources/extensions/gsd/auto-worktree-runtime-cleanup.js +99 -0
  46. package/dist/resources/extensions/gsd/auto-worktree-session-registry.js +57 -0
  47. package/dist/resources/extensions/gsd/auto-worktree-sync.js +249 -0
  48. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +120 -0
  49. package/dist/resources/extensions/gsd/auto-worktree.js +20 -2046
  50. package/dist/resources/extensions/gsd/auto.js +31 -5
  51. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +3 -0
  52. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
  53. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +133 -6
  54. package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +58 -9
  55. package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
  56. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +127 -22
  57. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +14 -1
  58. package/dist/resources/extensions/gsd/codebase-generator.js +157 -19
  59. package/dist/resources/extensions/gsd/commands/handlers/core.js +40 -4
  60. package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
  61. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +153 -1
  62. package/dist/resources/extensions/gsd/commands-workflow-templates.js +3 -3
  63. package/dist/resources/extensions/gsd/commands-worktree.js +11 -2
  64. package/dist/resources/extensions/gsd/db/queries.js +48 -9
  65. package/dist/resources/extensions/gsd/discussion-handoff.js +8 -3
  66. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -2
  67. package/dist/resources/extensions/gsd/doctor-engine-checks.js +292 -18
  68. package/dist/resources/extensions/gsd/doctor-providers.js +38 -10
  69. package/dist/resources/extensions/gsd/doctor.js +93 -3
  70. package/dist/resources/extensions/gsd/exec-sandbox.js +6 -2
  71. package/dist/resources/extensions/gsd/flat-phase-migration.js +88 -26
  72. package/dist/resources/extensions/gsd/forensics.js +1 -1
  73. package/dist/resources/extensions/gsd/git-conflict-resolve.js +2 -2
  74. package/dist/resources/extensions/gsd/git-service.js +59 -18
  75. package/dist/resources/extensions/gsd/gsd-db.js +63 -0
  76. package/dist/resources/extensions/gsd/guidance.js +1 -0
  77. package/dist/resources/extensions/gsd/guided-flow.js +46 -12
  78. package/dist/resources/extensions/gsd/key-manager.js +1 -0
  79. package/dist/resources/extensions/gsd/markdown-renderer.js +40 -11
  80. package/dist/resources/extensions/gsd/migrate-external.js +24 -7
  81. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +14 -3
  82. package/dist/resources/extensions/gsd/milestone-settlement.js +1 -1
  83. package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
  84. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -1
  85. package/dist/resources/extensions/gsd/preferences-diagnostics.js +24 -1
  86. package/dist/resources/extensions/gsd/preferences-models.js +6 -4
  87. package/dist/resources/extensions/gsd/preferences-types.js +1 -0
  88. package/dist/resources/extensions/gsd/preferences-validation.js +107 -2
  89. package/dist/resources/extensions/gsd/preferences.js +29 -2
  90. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -2
  91. package/dist/resources/extensions/gsd/prompts/system.md +6 -6
  92. package/dist/resources/extensions/gsd/quick.js +12 -3
  93. package/dist/resources/extensions/gsd/redact-secrets.js +37 -0
  94. package/dist/resources/extensions/gsd/repo-identity.js +16 -0
  95. package/dist/resources/extensions/gsd/repository-registry.js +6 -1
  96. package/dist/resources/extensions/gsd/root-write-leak-guard.js +4 -2
  97. package/dist/resources/extensions/gsd/safe-fs.js +23 -2
  98. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
  99. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
  100. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +2 -1
  101. package/dist/resources/extensions/gsd/state/derive/from-db.js +88 -153
  102. package/dist/resources/extensions/gsd/tool-contract.js +14 -0
  103. package/dist/resources/extensions/gsd/tools/plan-task.js +76 -8
  104. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -0
  105. package/dist/resources/extensions/gsd/unit-context-manifest.js +5 -4
  106. package/dist/resources/extensions/gsd/unit-registry.js +37 -2
  107. package/dist/resources/extensions/gsd/unit-runtime.js +21 -0
  108. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
  109. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -1
  110. package/dist/resources/extensions/gsd/workspace-git-preflight.js +2 -2
  111. package/dist/resources/extensions/gsd/workspace.js +26 -8
  112. package/dist/resources/extensions/gsd/worktree-command.js +1 -1
  113. package/dist/resources/extensions/gsd/worktree-lifecycle.js +81 -14
  114. package/dist/resources/extensions/gsd/worktree-manager.js +97 -4
  115. package/dist/resources/extensions/gsd/worktree-reentry.js +2 -1
  116. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  117. package/dist/web/standalone/.next/BUILD_ID +1 -1
  118. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  119. package/dist/web/standalone/.next/build-manifest.json +3 -3
  120. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  121. package/dist/web/standalone/.next/required-server-files.json +3 -3
  122. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  123. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  125. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  133. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  136. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  161. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  183. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  193. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  199. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  215. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  219. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/index.html +1 -1
  229. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  230. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  231. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  232. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  233. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  234. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  235. package/dist/web/standalone/.next/server/app/page.js +2 -2
  236. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  238. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  239. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  240. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/middleware.js +3 -3
  242. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  243. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  244. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  245. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  246. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  247. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  248. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  249. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  250. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  251. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  252. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  253. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  254. package/dist/web/standalone/server.js +1 -1
  255. package/dist/wizard.d.ts +8 -0
  256. package/dist/wizard.js +8 -1
  257. package/integrations/hermes/CONTEXT.md +47 -0
  258. package/integrations/hermes/README.md +21 -0
  259. package/integrations/hermes/__init__.py +31 -0
  260. package/integrations/hermes/docs/issue-1162-grilling.md +197 -0
  261. package/integrations/hermes/docs/setup.md +4 -0
  262. package/integrations/hermes/open_gsd_hermes/commands.py +141 -0
  263. package/integrations/hermes/open_gsd_hermes/config.py +2 -0
  264. package/integrations/hermes/open_gsd_hermes/gsd_client.py +591 -39
  265. package/integrations/hermes/open_gsd_hermes/notifications.py +10 -1
  266. package/integrations/hermes/plugin.yaml +4 -0
  267. package/integrations/hermes/tests/test_config.py +6 -0
  268. package/integrations/hermes/tests/test_directory_loader.py +37 -0
  269. package/integrations/hermes/tests/test_gsd_client_cache.py +3 -0
  270. package/integrations/hermes/tests/test_gsd_client_execute.py +35 -0
  271. package/integrations/hermes/tests/test_gsd_client_process_cwd.py +22 -0
  272. package/integrations/hermes/tests/test_gsd_client_timeout.py +98 -0
  273. package/integrations/hermes/tests/test_milestone_client.py +447 -0
  274. package/integrations/hermes/tests/test_new_milestone_command.py +313 -0
  275. package/integrations/hermes/tests/test_supervisor_fsm.py +40 -0
  276. package/package.json +8 -8
  277. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts +1 -0
  278. package/packages/cloud-mcp-gateway/dist/auth-store.d.ts.map +1 -1
  279. package/packages/cloud-mcp-gateway/dist/auth-store.js +21 -1
  280. package/packages/cloud-mcp-gateway/dist/auth-store.js.map +1 -1
  281. package/packages/cloud-mcp-gateway/dist/auth-store.test.js +34 -0
  282. package/packages/cloud-mcp-gateway/dist/auth-store.test.js.map +1 -1
  283. package/packages/cloud-mcp-gateway/package.json +2 -2
  284. package/packages/contracts/package.json +1 -1
  285. package/packages/daemon/dist/cloud-runtime.d.ts +2 -0
  286. package/packages/daemon/dist/cloud-runtime.d.ts.map +1 -1
  287. package/packages/daemon/dist/cloud-runtime.js +25 -1
  288. package/packages/daemon/dist/cloud-runtime.js.map +1 -1
  289. package/packages/daemon/dist/cloud-runtime.test.js +51 -0
  290. package/packages/daemon/dist/cloud-runtime.test.js.map +1 -1
  291. package/packages/daemon/dist/message-batcher.d.ts +7 -0
  292. package/packages/daemon/dist/message-batcher.d.ts.map +1 -1
  293. package/packages/daemon/dist/message-batcher.js +13 -0
  294. package/packages/daemon/dist/message-batcher.js.map +1 -1
  295. package/packages/daemon/dist/message-batcher.test.js +48 -0
  296. package/packages/daemon/dist/message-batcher.test.js.map +1 -1
  297. package/packages/daemon/dist/session-manager.js +1 -1
  298. package/packages/daemon/dist/session-manager.js.map +1 -1
  299. package/packages/daemon/package.json +5 -5
  300. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts +13 -1
  301. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  302. package/packages/gsd-agent-core/dist/compaction/compaction.js +15 -1
  303. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  304. package/packages/gsd-agent-core/dist/export-html/template.js +53 -4
  305. package/packages/gsd-agent-core/dist/session/agent-session-navigation.d.ts.map +1 -1
  306. package/packages/gsd-agent-core/dist/session/agent-session-navigation.js +4 -1
  307. package/packages/gsd-agent-core/dist/session/agent-session-navigation.js.map +1 -1
  308. package/packages/gsd-agent-core/package.json +5 -5
  309. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  310. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +3 -2
  311. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  312. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.d.ts.map +1 -1
  313. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js +1 -0
  314. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-segment-walker.js.map +1 -1
  315. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js +1 -1
  316. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-client.js.map +1 -1
  317. package/packages/gsd-agent-modes/package.json +7 -7
  318. package/packages/mcp-server/dist/server.d.ts +18 -5
  319. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  320. package/packages/mcp-server/dist/server.js +46 -5
  321. package/packages/mcp-server/dist/server.js.map +1 -1
  322. package/packages/mcp-server/dist/session-manager.js +1 -1
  323. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  324. package/packages/mcp-server/package.json +4 -4
  325. package/packages/native/package.json +1 -1
  326. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  327. package/packages/pi-agent-core/dist/agent-loop.js +14 -9
  328. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  329. package/packages/pi-agent-core/package.json +1 -1
  330. package/packages/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  331. package/packages/pi-ai/dist/env-api-keys.js +3 -0
  332. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  333. package/packages/pi-ai/dist/index.d.ts +1 -0
  334. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  335. package/packages/pi-ai/dist/index.js +1 -0
  336. package/packages/pi-ai/dist/index.js.map +1 -1
  337. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  338. package/packages/pi-ai/dist/providers/transform-messages.js +7 -3
  339. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  340. package/packages/pi-ai/dist/tool-result-content.d.ts +3 -0
  341. package/packages/pi-ai/dist/tool-result-content.d.ts.map +1 -0
  342. package/packages/pi-ai/dist/tool-result-content.js +62 -0
  343. package/packages/pi-ai/dist/tool-result-content.js.map +1 -0
  344. package/packages/pi-ai/dist/types.d.ts +10 -22
  345. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  346. package/packages/pi-ai/dist/types.js.map +1 -1
  347. package/packages/pi-ai/package.json +1 -1
  348. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  350. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts +1 -0
  352. package/packages/pi-coding-agent/dist/core/session-manager-types.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/session-manager-types.js.map +1 -1
  354. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/session-manager.js +3 -0
  356. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  357. package/packages/pi-coding-agent/package.json +7 -7
  358. package/packages/pi-tui/package.json +2 -2
  359. package/packages/rpc-client/dist/rpc-client.js +1 -1
  360. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  361. package/packages/rpc-client/package.json +2 -2
  362. package/pkg/dist/core/export-html/template.js +53 -4
  363. package/pkg/package.json +1 -1
  364. package/scripts/link-workspace-packages.cjs +14 -4
  365. package/src/resources/GSD-WORKFLOW.md +20 -25
  366. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +130 -51
  367. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +371 -39
  368. package/src/resources/extensions/cursor-cli/index.ts +18 -0
  369. package/src/resources/extensions/cursor-cli/models.ts +65 -0
  370. package/src/resources/extensions/cursor-cli/package.json +11 -0
  371. package/src/resources/extensions/cursor-cli/readiness.ts +143 -0
  372. package/src/resources/extensions/cursor-cli/stream-adapter.ts +440 -0
  373. package/src/resources/extensions/cursor-cli/tests/index.test.ts +54 -0
  374. package/src/resources/extensions/cursor-cli/tests/readiness.test.ts +29 -0
  375. package/src/resources/extensions/cursor-cli/tests/stream-adapter.test.ts +166 -0
  376. package/src/resources/extensions/gsd/activity-log.ts +4 -1
  377. package/src/resources/extensions/gsd/artifact-verification.ts +25 -9
  378. package/src/resources/extensions/gsd/auto/closeout.ts +163 -58
  379. package/src/resources/extensions/gsd/auto/finalize.ts +8 -0
  380. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  381. package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -3
  382. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +6 -3
  383. package/src/resources/extensions/gsd/auto/run-unit.ts +5 -2
  384. package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +8 -0
  385. package/src/resources/extensions/gsd/auto/unit-phase.ts +5 -9
  386. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +4 -5
  387. package/src/resources/extensions/gsd/auto-dispatch.ts +17 -5
  388. package/src/resources/extensions/gsd/auto-model-selection.ts +49 -18
  389. package/src/resources/extensions/gsd/auto-prompts.ts +73 -2
  390. package/src/resources/extensions/gsd/auto-start.ts +8 -5
  391. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +4 -0
  392. package/src/resources/extensions/gsd/auto-worktree-branch-lifecycle.ts +237 -0
  393. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +166 -0
  394. package/src/resources/extensions/gsd/auto-worktree-conflict-auto-resolve.ts +37 -0
  395. package/src/resources/extensions/gsd/auto-worktree-creation.ts +171 -0
  396. package/src/resources/extensions/gsd/auto-worktree-entry.ts +154 -0
  397. package/src/resources/extensions/gsd/auto-worktree-merge-already-merged.ts +161 -0
  398. package/src/resources/extensions/gsd/auto-worktree-merge-branch-head.ts +83 -0
  399. package/src/resources/extensions/gsd/auto-worktree-merge-cleanup.ts +132 -0
  400. package/src/resources/extensions/gsd/auto-worktree-merge-code-changes.ts +71 -0
  401. package/src/resources/extensions/gsd/auto-worktree-merge-db-ready.ts +112 -0
  402. package/src/resources/extensions/gsd/auto-worktree-merge-integration-branch.ts +99 -0
  403. package/src/resources/extensions/gsd/auto-worktree-merge-message.ts +166 -0
  404. package/src/resources/extensions/gsd/auto-worktree-merge-pre-teardown.ts +93 -0
  405. package/src/resources/extensions/gsd/auto-worktree-merge-stash.ts +213 -0
  406. package/src/resources/extensions/gsd/auto-worktree-merge.ts +391 -0
  407. package/src/resources/extensions/gsd/auto-worktree-milestone-shelter.ts +159 -0
  408. package/src/resources/extensions/gsd/auto-worktree-path-resolution.ts +6 -0
  409. package/src/resources/extensions/gsd/auto-worktree-path-utils.ts +10 -0
  410. package/src/resources/extensions/gsd/auto-worktree-resource-version.ts +44 -0
  411. package/src/resources/extensions/gsd/auto-worktree-runtime-cleanup.ts +119 -0
  412. package/src/resources/extensions/gsd/auto-worktree-session-registry.ts +71 -0
  413. package/src/resources/extensions/gsd/auto-worktree-sync.ts +370 -0
  414. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +161 -0
  415. package/src/resources/extensions/gsd/auto-worktree.ts +69 -2390
  416. package/src/resources/extensions/gsd/auto.ts +32 -19
  417. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +3 -0
  418. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
  419. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +147 -6
  420. package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +80 -12
  421. package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
  422. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +163 -22
  423. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +23 -1
  424. package/src/resources/extensions/gsd/codebase-generator.ts +179 -18
  425. package/src/resources/extensions/gsd/commands/handlers/core.ts +39 -3
  426. package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
  427. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +135 -1
  428. package/src/resources/extensions/gsd/commands-workflow-templates.ts +3 -3
  429. package/src/resources/extensions/gsd/commands-worktree.ts +13 -2
  430. package/src/resources/extensions/gsd/db/queries.ts +49 -9
  431. package/src/resources/extensions/gsd/discussion-handoff.ts +10 -2
  432. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -2
  433. package/src/resources/extensions/gsd/doctor-engine-checks.ts +372 -22
  434. package/src/resources/extensions/gsd/doctor-providers.ts +39 -10
  435. package/src/resources/extensions/gsd/doctor-types.ts +5 -1
  436. package/src/resources/extensions/gsd/doctor.ts +95 -3
  437. package/src/resources/extensions/gsd/exec-sandbox.ts +6 -2
  438. package/src/resources/extensions/gsd/flat-phase-migration.ts +112 -25
  439. package/src/resources/extensions/gsd/forensics.ts +1 -1
  440. package/src/resources/extensions/gsd/git-conflict-resolve.ts +2 -2
  441. package/src/resources/extensions/gsd/git-service.ts +67 -17
  442. package/src/resources/extensions/gsd/gsd-db.ts +85 -0
  443. package/src/resources/extensions/gsd/guidance.ts +2 -0
  444. package/src/resources/extensions/gsd/guided-flow.ts +52 -13
  445. package/src/resources/extensions/gsd/key-manager.ts +1 -0
  446. package/src/resources/extensions/gsd/markdown-renderer.ts +40 -10
  447. package/src/resources/extensions/gsd/migrate-external.ts +23 -6
  448. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +19 -4
  449. package/src/resources/extensions/gsd/milestone-settlement.ts +1 -1
  450. package/src/resources/extensions/gsd/model-router.ts +4 -5
  451. package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
  452. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -1
  453. package/src/resources/extensions/gsd/preferences-diagnostics.ts +24 -0
  454. package/src/resources/extensions/gsd/preferences-models.ts +6 -3
  455. package/src/resources/extensions/gsd/preferences-types.ts +30 -0
  456. package/src/resources/extensions/gsd/preferences-validation.ts +97 -2
  457. package/src/resources/extensions/gsd/preferences.ts +38 -4
  458. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -2
  459. package/src/resources/extensions/gsd/prompts/system.md +6 -6
  460. package/src/resources/extensions/gsd/quick.ts +11 -3
  461. package/src/resources/extensions/gsd/redact-secrets.ts +40 -0
  462. package/src/resources/extensions/gsd/repo-identity.ts +17 -0
  463. package/src/resources/extensions/gsd/repository-registry.ts +7 -1
  464. package/src/resources/extensions/gsd/root-write-leak-guard.ts +3 -2
  465. package/src/resources/extensions/gsd/safe-fs.ts +22 -2
  466. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +7 -9
  467. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +1 -0
  468. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -1
  469. package/src/resources/extensions/gsd/state/derive/from-db.ts +201 -157
  470. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +2 -1
  471. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +131 -5
  472. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +18 -0
  473. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +178 -0
  474. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +43 -1
  475. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +54 -0
  476. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +41 -0
  477. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +41 -0
  478. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +4 -4
  479. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +3 -0
  480. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
  481. package/src/resources/extensions/gsd/tests/auto-timeout-recovery-harness-abort.test.ts +55 -0
  482. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +10 -1
  483. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +1 -1
  484. package/src/resources/extensions/gsd/tests/auto-worktree-merge-already-merged.test.ts +177 -0
  485. package/src/resources/extensions/gsd/tests/auto-worktree-merge-branch-head.test.ts +118 -0
  486. package/src/resources/extensions/gsd/tests/auto-worktree-merge-cleanup.test.ts +115 -0
  487. package/src/resources/extensions/gsd/tests/auto-worktree-merge-code-changes.test.ts +76 -0
  488. package/src/resources/extensions/gsd/tests/auto-worktree-merge-db-ready.test.ts +140 -0
  489. package/src/resources/extensions/gsd/tests/auto-worktree-merge-integration-branch.test.ts +123 -0
  490. package/src/resources/extensions/gsd/tests/auto-worktree-merge-message.test.ts +114 -0
  491. package/src/resources/extensions/gsd/tests/auto-worktree-merge-pre-teardown.test.ts +84 -0
  492. package/src/resources/extensions/gsd/tests/auto-worktree-merge-stash.test.ts +70 -0
  493. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-shelter.test.ts +52 -0
  494. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +6 -6
  495. package/src/resources/extensions/gsd/tests/auto-worktree-resource-version.test.ts +59 -0
  496. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +3 -1
  497. package/src/resources/extensions/gsd/tests/batch-task-query.test.ts +85 -0
  498. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +29 -0
  499. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +365 -0
  500. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +62 -1
  501. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -0
  503. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +138 -1
  504. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +571 -5
  505. package/src/resources/extensions/gsd/tests/doctor-workspace.test.ts +207 -0
  506. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
  507. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +82 -2
  508. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +25 -1
  509. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +87 -19
  510. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +89 -0
  511. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +40 -0
  512. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +9 -0
  513. package/src/resources/extensions/gsd/tests/integration/all-milestones-complete-merge.test.ts +4 -6
  514. package/src/resources/extensions/gsd/tests/integration/auto-stash-merge.test.ts +2 -1
  515. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +3 -3
  516. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +7 -8
  517. package/src/resources/extensions/gsd/tests/integration/feature-branch-lifecycle-integration.test.ts +2 -5
  518. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +76 -0
  519. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
  520. package/src/resources/extensions/gsd/tests/integration/merge-preserve-worktree-on-preteardown-error.test.ts +1 -1
  521. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +2 -1
  522. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +5 -7
  523. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +4 -2
  524. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +2 -4
  525. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +122 -0
  526. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +1 -1
  527. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +4 -4
  528. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +1 -1
  529. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
  530. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +116 -0
  531. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +592 -23
  532. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +25 -1
  533. package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +1 -1
  534. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -3
  535. package/src/resources/extensions/gsd/tests/parallel-worker-lock-contention.test.ts +1 -1
  536. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +2 -2
  537. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +50 -6
  538. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +17 -0
  539. package/src/resources/extensions/gsd/tests/plan-task.test.ts +264 -1
  540. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +1 -4
  541. package/src/resources/extensions/gsd/tests/preferences.test.ts +150 -0
  542. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +147 -0
  543. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +4 -4
  544. package/src/resources/extensions/gsd/tests/redact-secrets.test.ts +56 -0
  545. package/src/resources/extensions/gsd/tests/register-hooks-flat-phase-migration.test.ts +73 -0
  546. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +275 -0
  547. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +41 -2
  548. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +55 -0
  549. package/src/resources/extensions/gsd/tests/root-write-leak-guard.test.ts +31 -9
  550. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +20 -0
  551. package/src/resources/extensions/gsd/tests/schedule-wakeup-tool.test.ts +167 -0
  552. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +3 -5
  553. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -0
  554. package/src/resources/extensions/gsd/tests/stash-pop-gsd-conflict.test.ts +2 -1
  555. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +2 -1
  556. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -1
  557. package/src/resources/extensions/gsd/tests/status-per-repo.test.ts +94 -0
  558. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +1 -1
  559. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +1 -1
  560. package/src/resources/extensions/gsd/tests/system-flat-phase-layout.test.ts +33 -0
  561. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +4 -4
  562. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +2 -1
  563. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +4 -4
  564. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +35 -0
  565. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +166 -0
  566. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +1 -1
  567. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +66 -18
  568. package/src/resources/extensions/gsd/tests/unit-registry.test.ts +81 -0
  569. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +30 -0
  570. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +52 -0
  571. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +53 -1
  572. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +208 -1
  573. package/src/resources/extensions/gsd/tests/workspace.test.ts +18 -4
  574. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +1 -1
  575. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +1 -1
  576. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +1 -3
  577. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
  578. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +1 -1
  579. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +4 -4
  580. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
  581. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
  582. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +1 -1
  583. package/src/resources/extensions/gsd/tests/worktree-reentry.test.ts +2 -1
  584. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +36 -3
  585. package/src/resources/extensions/gsd/tests/worktree-sync-overwrite-loop.test.ts +1 -1
  586. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +1 -1
  587. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +32 -0
  588. package/src/resources/extensions/gsd/tool-contract.ts +29 -0
  589. package/src/resources/extensions/gsd/tools/plan-task.ts +107 -9
  590. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +58 -0
  591. package/src/resources/extensions/gsd/unit-context-manifest.ts +11 -5
  592. package/src/resources/extensions/gsd/unit-registry.ts +48 -2
  593. package/src/resources/extensions/gsd/unit-runtime.ts +42 -0
  594. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
  595. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -1
  596. package/src/resources/extensions/gsd/workspace-git-preflight.ts +2 -2
  597. package/src/resources/extensions/gsd/workspace.ts +42 -8
  598. package/src/resources/extensions/gsd/worktree-command.ts +1 -1
  599. package/src/resources/extensions/gsd/worktree-lifecycle.ts +154 -26
  600. package/src/resources/extensions/gsd/worktree-manager.ts +143 -5
  601. package/src/resources/extensions/gsd/worktree-reentry.ts +2 -1
  602. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  603. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
  604. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  605. /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → ZpFDazP-38PXBPiI_LdZf}/_buildManifest.js +0 -0
  606. /package/dist/web/standalone/.next/static/{zQLcXm0Za8lexoXtgDpMG → ZpFDazP-38PXBPiI_LdZf}/_ssgManifest.js +0 -0
@@ -33,6 +33,10 @@ import {
33
33
  getMilestoneSliceSummaries,
34
34
  getClosedSliceIds,
35
35
  getActiveMilestoneFromDb,
36
+ getActiveSliceFromDb,
37
+ getActiveTaskFromDb,
38
+ getActiveTaskIdFromDb,
39
+ getSliceTaskCounts,
36
40
  deleteMilestone,
37
41
  clearEngineHierarchy,
38
42
  recordMilestoneCommitAttribution,
@@ -240,6 +244,42 @@ describe('gsd-db', () => {
240
244
  closeDatabase();
241
245
  });
242
246
 
247
+ test("gsd-db: active readers use the shared closed-status vocabulary", () => {
248
+ openDatabase(":memory:");
249
+
250
+ try {
251
+ insertMilestone({ id: "M001", title: "Status vocabulary", status: "active" });
252
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Closed dep", status: "closed", sequence: 1 });
253
+ insertSlice({ id: "S02", milestoneId: "M001", title: "Runnable", status: "pending", depends: ["S01"], sequence: 2 });
254
+ insertTask({ id: "T01", sliceId: "S02", milestoneId: "M001", title: "Skipped", status: "skipped", sequence: 1 });
255
+ insertTask({ id: "T02", sliceId: "S02", milestoneId: "M001", title: "Closed", status: "closed", sequence: 2 });
256
+ insertTask({ id: "T03", sliceId: "S02", milestoneId: "M001", title: "Pending", status: "pending", sequence: 3 });
257
+
258
+ assert.equal(
259
+ getActiveSliceFromDb("M001")?.id,
260
+ "S02",
261
+ "closed dependency slices must satisfy dependencies and be excluded from active slice selection",
262
+ );
263
+ assert.equal(
264
+ getActiveTaskFromDb("M001", "S02")?.id,
265
+ "T03",
266
+ "skipped/closed tasks must be excluded from active task selection",
267
+ );
268
+ assert.equal(
269
+ getActiveTaskIdFromDb("M001", "S02")?.id,
270
+ "T03",
271
+ "lightweight active task selection must use the same closed-status vocabulary",
272
+ );
273
+ assert.deepEqual(
274
+ getSliceTaskCounts("M001", "S02"),
275
+ { total: 3, done: 2, pending: 1 },
276
+ "slice task counts must derive done/pending from the shared closed-status vocabulary",
277
+ );
278
+ } finally {
279
+ closeDatabase();
280
+ }
281
+ });
282
+
243
283
  test('gsd-db: active_decisions view excludes superseded', () => {
244
284
  openDatabase(':memory:');
245
285
 
@@ -20,6 +20,7 @@ import {
20
20
  clearPendingAutoStart,
21
21
  checkAutoStartAfterDiscuss,
22
22
  } from "../guided-flow.ts";
23
+ import { closeDatabase, openDatabase } from "../gsd-db.ts";
23
24
 
24
25
  function pendingInput(basePath: string, milestoneId: string) {
25
26
  return {
@@ -34,6 +35,7 @@ function pendingInput(basePath: string, milestoneId: string) {
34
35
 
35
36
  describe("#2985 Bug 3 — concurrent discuss sessions must be independent", () => {
36
37
  beforeEach(() => {
38
+ closeDatabase();
37
39
  clearPendingAutoStart();
38
40
  });
39
41
 
@@ -75,6 +77,7 @@ describe("#2985 Bug 3 — concurrent discuss sessions must be independent", () =
75
77
 
76
78
  describe("#2985 Bug 4 — getDiscussionMilestoneId must be keyed by basePath", () => {
77
79
  beforeEach(() => {
80
+ closeDatabase();
78
81
  clearPendingAutoStart();
79
82
  });
80
83
 
@@ -110,6 +113,7 @@ describe("#2985 Bug 4 — getDiscussionMilestoneId must be keyed by basePath", (
110
113
  test("checkAutoStartAfterDiscuss ignores missing manifest for single-milestone discuss on established project", () => {
111
114
  const base = mkdtempSync(join(tmpdir(), "gsd-auto-start-manifest-"));
112
115
  try {
116
+ openDatabase(":memory:");
113
117
  const gsdDir = join(base, ".gsd");
114
118
  const milestoneDir = join(gsdDir, "milestones", "M001");
115
119
  mkdirSync(milestoneDir, { recursive: true });
@@ -132,6 +136,7 @@ test("checkAutoStartAfterDiscuss ignores missing manifest for single-milestone d
132
136
  const started = checkAutoStartAfterDiscuss();
133
137
  assert.equal(started, true, "project history alone should not require a manifest");
134
138
  } finally {
139
+ closeDatabase();
135
140
  clearPendingAutoStart();
136
141
  rmSync(base, { recursive: true, force: true });
137
142
  }
@@ -151,6 +156,7 @@ test("checkAutoStartAfterDiscuss(basePath) selects the matching pending entry wh
151
156
  }
152
157
 
153
158
  try {
159
+ openDatabase(":memory:");
154
160
  clearPendingAutoStart();
155
161
  writeReadyArtifacts(projectA, "M001");
156
162
  writeReadyArtifacts(projectB, "M002");
@@ -172,6 +178,7 @@ test("checkAutoStartAfterDiscuss(basePath) selects the matching pending entry wh
172
178
  assert.equal(getDiscussionMilestoneId(projectA), "M001", "projectA should remain pending");
173
179
  assert.equal(getDiscussionMilestoneId(projectB), null, "projectB should be cleared after start");
174
180
  } finally {
181
+ closeDatabase();
175
182
  clearPendingAutoStart();
176
183
  rmSync(projectA, { recursive: true, force: true });
177
184
  rmSync(projectB, { recursive: true, force: true });
@@ -183,6 +190,7 @@ test("checkAutoStartAfterDiscuss can accept context handoff without scheduling a
183
190
  let waitForIdleCalls = 0;
184
191
  const notifications: string[] = [];
185
192
  try {
193
+ openDatabase(":memory:");
186
194
  const gsdDir = join(base, ".gsd");
187
195
  const milestoneDir = join(gsdDir, "milestones", "M001");
188
196
  mkdirSync(milestoneDir, { recursive: true });
@@ -215,6 +223,7 @@ test("checkAutoStartAfterDiscuss can accept context handoff without scheduling a
215
223
  assert.equal(waitForIdleCalls, 0, "headless-owned auto start must not schedule guided-flow auto");
216
224
  assert.equal(getDiscussionMilestoneId(base), null, "accepted handoff should still be cleared");
217
225
  } finally {
226
+ closeDatabase();
218
227
  clearPendingAutoStart();
219
228
  rmSync(base, { recursive: true, force: true });
220
229
  }
@@ -25,12 +25,10 @@ import { join } from "node:path";
25
25
  import { tmpdir } from "node:os";
26
26
  import { execSync } from "node:child_process";
27
27
 
28
- import {
29
- createAutoWorktree,
30
- isInAutoWorktree,
31
- getAutoWorktreeOriginalBase,
32
- mergeMilestoneToMain,
33
- } from "../../auto-worktree.ts";
28
+ import { createAutoWorktree } from "../../auto-worktree-creation.ts";
29
+ import { isInAutoWorktree } from "../../auto-worktree-entry.ts";
30
+ import { mergeMilestoneToMain } from "../../auto-worktree-merge.ts";
31
+ import { getAutoWorktreeOriginalBase } from "../../auto-worktree-session-registry.ts";
34
32
 
35
33
  function run(command: string, cwd: string): string {
36
34
  return execSync(command, {
@@ -12,7 +12,8 @@ import { join } from "node:path";
12
12
  import { tmpdir } from "node:os";
13
13
  import { execSync } from "node:child_process";
14
14
 
15
- import { createAutoWorktree, mergeMilestoneToMain } from "../../auto-worktree.ts";
15
+ import { createAutoWorktree } from "../../auto-worktree-creation.ts";
16
+ import { mergeMilestoneToMain } from "../../auto-worktree-merge.ts";
16
17
  import { nativeMergeSquash } from "../../native-git-bridge.ts";
17
18
 
18
19
  function run(cmd: string, cwd: string): string {
@@ -19,12 +19,12 @@ import { join } from "node:path";
19
19
  import { tmpdir } from "node:os";
20
20
  import { execSync } from "node:child_process";
21
21
 
22
+ import { createAutoWorktree } from "../../auto-worktree-creation.ts";
22
23
  import {
23
- createAutoWorktree,
24
24
  mergeMilestoneToMain,
25
- getAutoWorktreeOriginalBase,
26
25
  _setRestoreEntryFnForTests,
27
- } from "../../auto-worktree.ts";
26
+ } from "../../auto-worktree-merge.ts";
27
+ import { getAutoWorktreeOriginalBase } from "../../auto-worktree-session-registry.ts";
28
28
  import { getSliceBranchName } from "../../worktree.ts";
29
29
  import { nativeMergeSquash } from "../../native-git-bridge.ts";
30
30
  import { drainLogs, setStderrLoggingEnabled } from "../../workflow-logger.ts";
@@ -17,17 +17,16 @@ import {
17
17
  writeGsdMilestoneContext,
18
18
  } from "./gsd-integration-fixture.ts";
19
19
 
20
+ import { createAutoWorktree } from "../../auto-worktree-creation.ts";
21
+ import { enterAutoWorktree, isInAutoWorktree } from "../../auto-worktree-entry.ts";
22
+ import { getAutoWorktreePath } from "../../auto-worktree-path-resolution.ts";
20
23
  import {
21
- createAutoWorktree,
22
- teardownAutoWorktree,
23
- isInAutoWorktree,
24
- getAutoWorktreePath,
25
- enterAutoWorktree,
26
- getAutoWorktreeOriginalBase,
27
24
  getActiveAutoWorktreeContext,
28
- syncGsdStateToWorktree,
25
+ getAutoWorktreeOriginalBase,
29
26
  _resetAutoWorktreeOriginalBaseForTests,
30
- } from "../../auto-worktree.ts";
27
+ } from "../../auto-worktree-session-registry.ts";
28
+ import { syncGsdStateToWorktree } from "../../auto-worktree-sync.ts";
29
+ import { teardownAutoWorktree } from "../../auto-worktree-teardown.ts";
31
30
 
32
31
  // Note: execSync is used intentionally in tests for git operations with
33
32
  // controlled, hardcoded inputs (no user input). This is safe and matches
@@ -22,11 +22,8 @@ import { join } from "node:path";
22
22
  import { tmpdir } from "node:os";
23
23
  import { execSync } from "node:child_process";
24
24
 
25
- import {
26
- createAutoWorktree,
27
- mergeMilestoneToMain,
28
- autoWorktreeBranch,
29
- } from "../../auto-worktree.ts";
25
+ import { createAutoWorktree } from "../../auto-worktree-creation.ts";
26
+ import { mergeMilestoneToMain } from "../../auto-worktree-merge.ts";
30
27
  import { captureIntegrationBranch, getSliceBranchName } from "../../worktree.ts";
31
28
  import { writeIntegrationBranch, readIntegrationBranch } from "../../git-service.ts";
32
29
  import { nextMilestoneId, generateMilestoneSuffix } from "../../guided-flow.ts";
@@ -15,6 +15,7 @@ import {
15
15
  RUNTIME_EXCLUSION_PATHS,
16
16
  VALID_BRANCH_NAME,
17
17
  runGit,
18
+ taskBranchArgs,
18
19
  readIntegrationBranch,
19
20
  resolveMilestoneIntegrationBranch,
20
21
  writeIntegrationBranch,
@@ -1119,6 +1120,81 @@ process.exit(result.status ?? 0);
1119
1120
  rmSync(repo, { recursive: true, force: true });
1120
1121
  }
1121
1122
 
1123
+ // ─── taskBranchArgs ───────────────────────────────────────────────────
1124
+
1125
+ test('taskBranchArgs starts new workflow branches from the base branch, not from HEAD', () => {
1126
+ const repo = initBranchTestRepo();
1127
+
1128
+ assert.deepStrictEqual(
1129
+ taskBranchArgs(repo, "gsd/spike/first", "main", "main"),
1130
+ ["checkout", "-b", "gsd/spike/first"],
1131
+ "branching while on the base branch itself needs no explicit start point",
1132
+ );
1133
+
1134
+ // Simulate a finished workflow left checked out with its own commit.
1135
+ run("git checkout -b gsd/spike/first", repo);
1136
+ createFile(repo, "first.txt", "first workflow output");
1137
+ runGit(repo, ["add", "-A"]);
1138
+ runGit(repo, ["commit", "-m", "first workflow work"]);
1139
+ _resetHasChangesCache();
1140
+
1141
+ const args = taskBranchArgs(repo, "gsd/spike/second", "gsd/spike/first", "main");
1142
+ assert.deepStrictEqual(
1143
+ args,
1144
+ ["checkout", "-b", "gsd/spike/second", "main"],
1145
+ "next workflow branch starts from the base so workflows do not stack",
1146
+ );
1147
+
1148
+ runGit(repo, args);
1149
+ assert.deepStrictEqual(
1150
+ run("git rev-parse HEAD", repo),
1151
+ run("git rev-parse main", repo),
1152
+ "second workflow branch points at the base, without the first workflow's commit",
1153
+ );
1154
+
1155
+ rmSync(repo, { recursive: true, force: true });
1156
+ });
1157
+
1158
+ test('taskBranchArgs keeps branch-from-HEAD on user branches and unsafe states', () => {
1159
+ const repo = initBranchTestRepo();
1160
+
1161
+ // Manual feature branch: the user chose to stand here — new workflow
1162
+ // branches base on it, never silently jump to main.
1163
+ run("git checkout -b feature/login", repo);
1164
+ createFile(repo, "feature.txt", "feature work");
1165
+ runGit(repo, ["add", "-A"]);
1166
+ runGit(repo, ["commit", "-m", "feature work"]);
1167
+ _resetHasChangesCache();
1168
+ assert.deepStrictEqual(
1169
+ taskBranchArgs(repo, "gsd/spike/from-feature", "feature/login", "main"),
1170
+ ["checkout", "-b", "gsd/spike/from-feature"],
1171
+ "a manual feature branch is a deliberate base — no redirect to main",
1172
+ );
1173
+
1174
+ // Base branch without a local ref (e.g. origin/HEAD names a branch that
1175
+ // was never checked out locally): fall back to HEAD instead of failing.
1176
+ run("git checkout -b gsd/spike/stale", repo);
1177
+ _resetHasChangesCache();
1178
+ assert.deepStrictEqual(
1179
+ taskBranchArgs(repo, "gsd/spike/next", "gsd/spike/stale", "no-such-branch"),
1180
+ ["checkout", "-b", "gsd/spike/next"],
1181
+ "missing local base ref falls back to branch-from-HEAD",
1182
+ );
1183
+
1184
+ // Dirty tree on a task branch: a tree-changing start point would abort
1185
+ // the checkout or strand the changes — fall back to HEAD.
1186
+ createFile(repo, "dirty.txt", "uncommitted");
1187
+ runGit(repo, ["add", "-A"]);
1188
+ _resetHasChangesCache();
1189
+ assert.deepStrictEqual(
1190
+ taskBranchArgs(repo, "gsd/spike/next", "gsd/spike/stale", "main"),
1191
+ ["checkout", "-b", "gsd/spike/next"],
1192
+ "dirty working tree falls back to branch-from-HEAD",
1193
+ );
1194
+
1195
+ rmSync(repo, { recursive: true, force: true });
1196
+ });
1197
+
1122
1198
  // ═══════════════════════════════════════════════════════════════════════
1123
1199
  // S05: Enhanced features — snapshots, pre-merge checks
1124
1200
  // ═══════════════════════════════════════════════════════════════════════
@@ -28,7 +28,7 @@ import { join } from "node:path";
28
28
  import { tmpdir } from "node:os";
29
29
  import { execSync } from "node:child_process";
30
30
 
31
- import { mergeMilestoneToMain } from "../../auto-worktree.ts";
31
+ import { mergeMilestoneToMain } from "../../auto-worktree-merge.ts";
32
32
  import { MergeConflictError } from "../../git-service.ts";
33
33
 
34
34
  function run(cmd: string, cwd: string): string {
@@ -6,7 +6,7 @@ import { join } from "node:path";
6
6
  import { tmpdir } from "node:os";
7
7
 
8
8
  import { GSDError } from "../../errors.js";
9
- import { mergeMilestoneToMain } from "../../auto-worktree.ts";
9
+ import { mergeMilestoneToMain } from "../../auto-worktree-merge.ts";
10
10
 
11
11
  function run(cmd: string, cwd: string): string {
12
12
  return execSync(cmd, {
@@ -29,7 +29,8 @@ import { join } from "node:path";
29
29
  import { tmpdir } from "node:os";
30
30
  import { execSync } from "node:child_process";
31
31
 
32
- import { createAutoWorktree, mergeMilestoneToMain } from "../../auto-worktree.ts";
32
+ import { createAutoWorktree } from "../../auto-worktree-creation.ts";
33
+ import { mergeMilestoneToMain } from "../../auto-worktree-merge.ts";
33
34
  import { closeDatabase } from "../../gsd-db.ts";
34
35
  import { getSliceBranchName } from "../../worktree.ts";
35
36
 
@@ -16,13 +16,11 @@ import { execSync } from "node:child_process";
16
16
  import { dirname } from "node:path";
17
17
  import { fileURLToPath } from "node:url";
18
18
 
19
- import {
20
- createAutoWorktree,
21
- teardownAutoWorktree,
22
- isInAutoWorktree,
23
- getAutoWorktreeOriginalBase,
24
- mergeMilestoneToMain,
25
- } from "../../auto-worktree.ts";
19
+ import { createAutoWorktree } from "../../auto-worktree-creation.ts";
20
+ import { isInAutoWorktree } from "../../auto-worktree-entry.ts";
21
+ import { mergeMilestoneToMain } from "../../auto-worktree-merge.ts";
22
+ import { getAutoWorktreeOriginalBase } from "../../auto-worktree-session-registry.ts";
23
+ import { teardownAutoWorktree } from "../../auto-worktree-teardown.ts";
26
24
 
27
25
  const __dirname = dirname(fileURLToPath(import.meta.url));
28
26
 
@@ -90,6 +90,8 @@ import { clearPathCache } from "../../paths.ts";
90
90
  // Fixture Helpers
91
91
  // ═══════════════════════════════════════════════════════════════════════════
92
92
 
93
+ const UAT_VERDICT_GATE_RULE_NAME = "uat-verdict-gate (non-PASS observed; closeout enforces)";
94
+
93
95
  function makeTempDir(): string {
94
96
  return mkdtempSync(join(tmpdir(), "gsd-edge-cases-"));
95
97
  }
@@ -280,7 +282,7 @@ function buildDispatchCtx(
280
282
 
281
283
  function getUatVerdictGate(): import("../../auto-dispatch.ts").DispatchRule {
282
284
  const rule = DISPATCH_RULES.find(
283
- r => r.name === "uat-verdict-gate (non-PASS blocks progression)",
285
+ r => r.name === UAT_VERDICT_GATE_RULE_NAME,
284
286
  );
285
287
  assert.ok(rule, "uat-verdict-gate rule should be registered");
286
288
  return rule;
@@ -867,7 +869,7 @@ describe("dispatch failure modes", () => {
867
869
  // Verify critical ordering constraints
868
870
  const summarizeIdx = ruleNames.indexOf("summarizing → complete-slice");
869
871
  const runUatIdx = ruleNames.indexOf("run-uat (post-completion)");
870
- const uatGateIdx = ruleNames.indexOf("uat-verdict-gate (non-PASS blocks progression)");
872
+ const uatGateIdx = ruleNames.indexOf(UAT_VERDICT_GATE_RULE_NAME);
871
873
  const executeIdx = ruleNames.indexOf("executing → execute-task");
872
874
 
873
875
  // summarizing should come before execute-task
@@ -25,10 +25,8 @@ import {
25
25
  markDepthVerified,
26
26
  clearDiscussionFlowState,
27
27
  } from "../../bootstrap/write-gate.ts";
28
- import {
29
- teardownAutoWorktree,
30
- _resetAutoWorktreeOriginalBaseForTests,
31
- } from "../../auto-worktree.ts";
28
+ import { _resetAutoWorktreeOriginalBaseForTests } from "../../auto-worktree-session-registry.ts";
29
+ import { teardownAutoWorktree } from "../../auto-worktree-teardown.ts";
32
30
  import {
33
31
  openDatabaseByWorkspace,
34
32
  closeAllDatabases,
@@ -22,6 +22,8 @@ import {
22
22
  getMilestoneSlices,
23
23
  getSliceTasks,
24
24
  updateSliceStatus,
25
+ insertGateRow,
26
+ saveGateResult,
25
27
  _getAdapter,
26
28
  } from '../gsd-db.ts';
27
29
  import {
@@ -44,6 +46,7 @@ import {
44
46
  parseSummary,
45
47
  parseTaskPlanFile,
46
48
  clearParseCache,
49
+ extractSection,
47
50
  } from '../files.ts';
48
51
  import { clearPathCache, _clearGsdRootCache } from '../paths.ts';
49
52
  import { invalidateStateCache } from '../state.ts';
@@ -645,6 +648,125 @@ test('── markdown-renderer: slice plan summarizes task descriptions without
645
648
  }
646
649
  });
647
650
 
651
+ test('── markdown-renderer: renderPlanFromDb marks flagged slice gates ──', async () => {
652
+ const tmpDir = makeTmpDir();
653
+ const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
654
+ openDatabase(dbPath);
655
+ clearAllCaches();
656
+
657
+ try {
658
+ insertMilestone({ id: 'M001', title: 'Milestone', status: 'active' });
659
+ scaffoldDirs(tmpDir, 'M001', ['S01']);
660
+ insertSlice({
661
+ id: 'S01',
662
+ milestoneId: 'M001',
663
+ title: 'Risky slice',
664
+ status: 'pending',
665
+ demo: 'Reviewers can see flagged gates.',
666
+ planning: {
667
+ goal: 'Persist gate concern state.',
668
+ successCriteria: '- Flagged gates stay visible',
669
+ },
670
+ });
671
+ insertTask({
672
+ id: 'T01',
673
+ sliceId: 'S01',
674
+ milestoneId: 'M001',
675
+ title: 'Render gate state',
676
+ status: 'pending',
677
+ });
678
+ insertGateRow({ milestoneId: 'M001', sliceId: 'S01', gateId: 'Q3', scope: 'slice' });
679
+ insertGateRow({ milestoneId: 'M001', sliceId: 'S01', gateId: 'Q4', scope: 'slice' });
680
+
681
+ const findings = '- Shared gate findings.';
682
+ saveGateResult({
683
+ milestoneId: 'M001',
684
+ sliceId: 'S01',
685
+ gateId: 'Q3',
686
+ verdict: 'flag',
687
+ rationale: 'Concern recorded.',
688
+ findings,
689
+ });
690
+ saveGateResult({
691
+ milestoneId: 'M001',
692
+ sliceId: 'S01',
693
+ gateId: 'Q4',
694
+ verdict: 'pass',
695
+ rationale: 'No concern.',
696
+ findings,
697
+ });
698
+
699
+ const rendered = await renderPlanFromDb(tmpDir, 'M001', 'S01');
700
+ const threatSurface = extractSection(rendered.content, 'Threat Surface');
701
+ const requirementImpact = extractSection(rendered.content, 'Requirement Impact');
702
+
703
+ assert.ok(threatSurface?.includes('> **Warning:** Verdict: flag - concerns recorded below'));
704
+ assert.ok(threatSurface?.includes(findings));
705
+ assert.ok(!requirementImpact?.includes('Verdict: flag'), 'passing gate should not render a flag warning');
706
+ assert.ok(requirementImpact?.includes(findings), 'passing gate still renders findings');
707
+ } finally {
708
+ closeDatabase();
709
+ cleanupDir(tmpDir);
710
+ }
711
+ });
712
+
713
+ test('── markdown-renderer: renderTaskPlanFromDb marks flagged task gates ──', async () => {
714
+ const tmpDir = makeTmpDir();
715
+ const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
716
+ openDatabase(dbPath);
717
+ clearAllCaches();
718
+
719
+ try {
720
+ insertMilestone({ id: 'M001', title: 'Milestone', status: 'active' });
721
+ scaffoldDirs(tmpDir, 'M001', ['S01']);
722
+ insertSlice({ id: 'S01', milestoneId: 'M001', title: 'Slice', status: 'pending' });
723
+ insertTask({
724
+ id: 'T01',
725
+ sliceId: 'S01',
726
+ milestoneId: 'M001',
727
+ title: 'Task gate render',
728
+ status: 'pending',
729
+ planning: {
730
+ description: 'Render task quality gates.',
731
+ },
732
+ });
733
+ insertGateRow({ milestoneId: 'M001', sliceId: 'S01', gateId: 'Q5', scope: 'task', taskId: 'T01' });
734
+ insertGateRow({ milestoneId: 'M001', sliceId: 'S01', gateId: 'Q6', scope: 'task', taskId: 'T01' });
735
+
736
+ const findings = '- Same task findings.';
737
+ saveGateResult({
738
+ milestoneId: 'M001',
739
+ sliceId: 'S01',
740
+ taskId: 'T01',
741
+ gateId: 'Q5',
742
+ verdict: 'flag',
743
+ rationale: 'Concern recorded.',
744
+ findings,
745
+ });
746
+ saveGateResult({
747
+ milestoneId: 'M001',
748
+ sliceId: 'S01',
749
+ taskId: 'T01',
750
+ gateId: 'Q6',
751
+ verdict: 'pass',
752
+ rationale: 'No concern.',
753
+ findings,
754
+ });
755
+
756
+ const rendered = await renderTaskPlanFromDb(tmpDir, 'M001', 'S01', 'T01');
757
+ const failureModes = extractSection(rendered.content, 'Failure Modes');
758
+ const loadProfile = extractSection(rendered.content, 'Load Profile');
759
+
760
+ assert.ok(failureModes?.includes('> **Warning:** Verdict: flag - concerns recorded below'));
761
+ assert.ok(failureModes?.includes(findings));
762
+ assert.ok(!loadProfile?.includes('Verdict: flag'), 'passing task gate should not render a flag warning');
763
+ assert.ok(loadProfile?.includes(findings), 'passing task gate still renders findings');
764
+ } finally {
765
+ closeDatabase();
766
+ cleanupDir(tmpDir);
767
+ }
768
+ });
769
+
648
770
  test('── markdown-renderer: renderTaskPlanFromDb throws for missing task ──', async () => {
649
771
  const tmpDir = makeTmpDir();
650
772
  const dbPath = path.join(tmpDir, '.gsd', 'gsd.db');
@@ -8,7 +8,7 @@ import { join } from "node:path";
8
8
  import { tmpdir } from "node:os";
9
9
  import { execFileSync } from "node:child_process";
10
10
 
11
- import { mergeMilestoneToMain } from "../auto-worktree.ts";
11
+ import { mergeMilestoneToMain } from "../auto-worktree-merge.ts";
12
12
  import { checkCloseoutConsistencyGate } from "../closeout-consistency-gate.ts";
13
13
  import {
14
14
  closeDatabase,
@@ -95,7 +95,7 @@ function makeDeps(
95
95
  isInAutoWorktree: () => true,
96
96
  shouldUseWorktreeIsolation: () => true,
97
97
  getIsolationMode: () => "worktree",
98
- mergeMilestoneToMain: () => ({ pushed: false, codeFilesChanged: true }),
98
+ mergeMilestone: () => ({ pushed: false, codeFilesChanged: true }),
99
99
  syncWorktreeStateBack: () => ({ synced: [] }),
100
100
  teardownAutoWorktree: () => undefined,
101
101
  createAutoWorktree: () => "",
@@ -185,7 +185,7 @@ describe("WorktreeResolver.mergeAndExit re-throws MergeConflictError (#2330)", (
185
185
  resolveMilestoneFile: (_base: string, _mid: string, type: string) =>
186
186
  type === "ROADMAP" ? roadmapPath : null,
187
187
  readFileSync: () => "# M001\n",
188
- mergeMilestoneToMain: () => {
188
+ mergeMilestone: () => {
189
189
  throw new MergeConflictError(conflicted, "squash", "worktree/M001", "main");
190
190
  },
191
191
  });
@@ -216,7 +216,7 @@ describe("WorktreeResolver.mergeAndExit re-throws MergeConflictError (#2330)", (
216
216
  resolveMilestoneFile: (_base: string, _mid: string, type: string) =>
217
217
  type === "ROADMAP" ? roadmapPath : null,
218
218
  readFileSync: () => "# M001\n",
219
- mergeMilestoneToMain: () => {
219
+ mergeMilestone: () => {
220
220
  throw new FakePermError("EACCES: permission denied");
221
221
  },
222
222
  });
@@ -242,7 +242,7 @@ describe("WorktreeResolver.mergeAndExit re-throws MergeConflictError (#2330)", (
242
242
  resolveMilestoneFile: (_base: string, _mid: string, type: string) =>
243
243
  type === "ROADMAP" ? roadmapPath : null,
244
244
  readFileSync: () => "# M001\n",
245
- mergeMilestoneToMain: () => ({ pushed: false, codeFilesChanged: true }),
245
+ mergeMilestone: () => ({ pushed: false, codeFilesChanged: true }),
246
246
  });
247
247
 
248
248
  const resolver = makeResolver(makeSession(baseDir), deps);
@@ -14,7 +14,7 @@ import { tmpdir } from "node:os";
14
14
  import { delimiter, join } from "node:path";
15
15
  import { execFileSync } from "node:child_process";
16
16
 
17
- import { mergeMilestoneToMain } from "../auto-worktree.ts";
17
+ import { mergeMilestoneToMain } from "../auto-worktree-merge.ts";
18
18
  import { closeDatabase, insertAssessment, insertMilestone, insertSlice, openDatabase } from "../gsd-db.ts";
19
19
  import { GIT_NO_PROMPT_ENV } from "../git-constants.js";
20
20
  import { _clearGsdRootCache } from "../paths.ts";
@@ -19,7 +19,7 @@ import { join } from "node:path";
19
19
  import { tmpdir } from "node:os";
20
20
  import { execFileSync } from "node:child_process";
21
21
 
22
- import { mergeMilestoneToMain } from "../auto-worktree.ts";
22
+ import { mergeMilestoneToMain } from "../auto-worktree-merge.ts";
23
23
  import { _resetServiceCache } from "../worktree.ts";
24
24
  import { _clearGsdRootCache } from "../paths.ts";
25
25