@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 {
12
12
  getArtifact,
13
13
  getAssessment,
14
14
  insertAssessment,
15
+ insertGateRow,
15
16
  insertMilestone,
16
17
  upsertRequirement,
17
18
  getAllMilestones,
@@ -21,6 +22,7 @@ import { claimMilestoneLease, getMilestoneLease } from "../db/milestone-leases.t
21
22
  import { deriveState, invalidateStateCache } from "../state.ts";
22
23
  import { autoSession } from "../auto-runtime-state.ts";
23
24
  import { normalizeRealPath } from "../paths.ts";
25
+ import { recordUnitHarnessAbort } from "../unit-runtime.ts";
24
26
  import { markApprovalGateVerified, markDepthVerified, clearDiscussionFlowState, loadWriteGateSnapshot, setPendingGate } from "../bootstrap/write-gate.ts";
25
27
  import {
26
28
  executeCompleteMilestone,
@@ -37,6 +39,11 @@ import {
37
39
  executeValidateMilestone,
38
40
  executeUatResultSave,
39
41
  } from "../tools/workflow-tool-executors.ts";
42
+ import {
43
+ initNotificationStore,
44
+ readNotifications,
45
+ _resetNotificationStore,
46
+ } from "../notification-store.ts";
40
47
 
41
48
  function makeTmpBase(): string {
42
49
  const base = join(tmpdir(), `gsd-workflow-executors-${randomUUID()}`);
@@ -910,6 +917,104 @@ test("executeUatResultSave accepts gsd_uat_exec evidence written in a milestone
910
917
  }
911
918
  });
912
919
 
920
+ test("executeUatResultSave leaves UAT pending after a harness-aborted turn", async () => {
921
+ const base = makeTmpBase();
922
+ const worktree = join(base, ".gsd", "worktrees", "M001");
923
+ const worktreeExecDir = join(worktree, ".gsd", "exec");
924
+ const evidenceId = "harness-aborted-uat-evidence";
925
+ const startedAt = Date.now();
926
+ try {
927
+ openTestDb(base);
928
+ seedMilestone("M001", "Milestone One");
929
+ seedSlice("M001", "S04", "complete");
930
+ mkdirSync(worktreeExecDir, { recursive: true });
931
+ writeFileSync(
932
+ join(worktreeExecDir, `${evidenceId}.meta.json`),
933
+ JSON.stringify({
934
+ id: evidenceId,
935
+ metadata: {
936
+ kind: "uat_exec",
937
+ milestoneId: "M001",
938
+ sliceId: "S04",
939
+ checkId: "UAT-01",
940
+ intent: "uat-runtime-check",
941
+ },
942
+ }),
943
+ "utf-8",
944
+ );
945
+ _getAdapter()!.prepare(
946
+ `INSERT INTO quality_gates (milestone_id, slice_id, gate_id, scope, task_id, status)
947
+ VALUES (?, ?, ?, ?, ?, ?)`,
948
+ ).run("M001", "S04", "UAT", "slice", "", "pending");
949
+ autoSession.reset();
950
+ autoSession.active = true;
951
+ autoSession.basePath = base;
952
+ autoSession.currentUnit = { type: "run-uat", id: "M001/S04", startedAt, workspaceRoot: worktree };
953
+ recordUnitHarnessAbort(base, "run-uat", "M001/S04", startedAt, {
954
+ kind: "tool-loop-guard",
955
+ reason: "Tool loop detected (repeated tool): browser_click called 7 times this turn.",
956
+ toolName: "browser_click",
957
+ count: 7,
958
+ });
959
+
960
+ const result = await inProjectDir(worktree, () => executeUatResultSave({
961
+ milestoneId: "M001",
962
+ sliceId: "S04",
963
+ uatType: "runtime-executable",
964
+ verdict: "FAIL",
965
+ checks: [{
966
+ id: "UAT-01",
967
+ description: "Runtime behavior could not be fully evaluated before harness abort",
968
+ mode: "runtime",
969
+ result: "FAIL",
970
+ evidence: [{ kind: "gsd_uat_exec", ref: evidenceId }],
971
+ notes: "Partial failure should be retried because the harness aborted the turn.",
972
+ }],
973
+ presentation: {
974
+ surface: "mcp",
975
+ presentedTools: [
976
+ "gsd_uat_exec",
977
+ "gsd_uat_result_save",
978
+ "gsd_resume",
979
+ "gsd_milestone_status",
980
+ "gsd_journal_query",
981
+ ],
982
+ blockedTools: [
983
+ { name: "gsd_exec", reason: "forbidden during run-uat" },
984
+ { name: "gsd_summary_save", reason: "forbidden during run-uat" },
985
+ { name: "gsd_save_gate_result", reason: "forbidden during run-uat" },
986
+ ],
987
+ },
988
+ notes: "Partial UAT result after harness abort.",
989
+ }, worktree));
990
+
991
+ assert.equal(result.isError, true);
992
+ assert.equal(result.details.operation, "save_uat_result");
993
+ assert.equal(result.details.error, "harness_aborted_needs_retry");
994
+ assert.equal(result.details.retryable, true);
995
+ assert.equal(result.details.harnessAbortKind, "tool-loop-guard");
996
+ assert.equal(
997
+ existsSync(join(base, ".gsd", "uat", "M001", "S04", "attempt-1.json")),
998
+ false,
999
+ "harness-aborted UAT should not persist an attempt artifact",
1000
+ );
1001
+ assert.equal(
1002
+ existsSync(join(base, ".gsd", "phases", "01-m001", "01-04-ASSESSMENT.md")),
1003
+ false,
1004
+ "harness-aborted UAT should not write an ASSESSMENT verdict",
1005
+ );
1006
+ const row = _getAdapter()!.prepare(
1007
+ "SELECT status, verdict FROM quality_gates WHERE milestone_id = ? AND slice_id = ? AND gate_id = ?",
1008
+ ).get("M001", "S04", "UAT") as Record<string, unknown>;
1009
+ assert.equal(row.status, "pending");
1010
+ assert.equal(row.verdict, "");
1011
+ } finally {
1012
+ autoSession.reset();
1013
+ closeDatabase();
1014
+ cleanup(base);
1015
+ }
1016
+ });
1017
+
913
1018
  test("executeUatResultSave supplies canonical presentation and normalizes verdict casing", async () => {
914
1019
  const base = makeTmpBase();
915
1020
  const worktree = join(base, ".gsd", "worktrees", "M001");
@@ -1100,13 +1205,14 @@ test("executeUatResultSave merges canonical plan ID and read-only tools when pre
1100
1205
  }
1101
1206
  });
1102
1207
 
1103
- test("executeUatResultSave surfaces the worktree validation path for NEEDS-HUMAN checks", async () => {
1208
+ test("executeUatResultSave surfaces the worktree validation path and notification for NEEDS-HUMAN checks", async () => {
1104
1209
  const base = makeTmpBase();
1105
1210
  const worktree = join(base, ".gsd", "worktrees", "M001");
1106
1211
  const worktreeExecDir = join(worktree, ".gsd", "exec");
1107
1212
  const evidenceId = "uat-human-validation-evidence";
1108
1213
  try {
1109
1214
  openTestDb(base);
1215
+ initNotificationStore(base);
1110
1216
  seedMilestone("M001", "Milestone One");
1111
1217
  seedSlice("M001", "S07", "complete");
1112
1218
  mkdirSync(worktreeExecDir, { recursive: true });
@@ -1166,7 +1272,17 @@ test("executeUatResultSave surfaces the worktree validation path for NEEDS-HUMAN
1166
1272
  assert.match(assessment, /## Manual Validation/);
1167
1273
  assert.ok(assessment.includes(worktree), "assessment should include the worktree checkout path");
1168
1274
  assert.match(assessment, /git worktree/);
1275
+
1276
+ const notifications = readNotifications(base, { kind: "uat-needs-human", scope: "M001/S07" });
1277
+ assert.equal(notifications.length, 1);
1278
+ assert.equal(notifications[0].severity, "warning");
1279
+ assert.equal(notifications[0].source, "notify");
1280
+ assert.equal(
1281
+ notifications[0].message,
1282
+ "UAT for M001/S07 has NEEDS-HUMAN checks awaiting human validation",
1283
+ );
1169
1284
  } finally {
1285
+ _resetNotificationStore();
1170
1286
  closeDatabase();
1171
1287
  cleanup(base);
1172
1288
  }
@@ -1757,6 +1873,97 @@ test("executeSaveGateResult validates inputs and persists verdicts", async () =>
1757
1873
  }
1758
1874
  });
1759
1875
 
1876
+ test("executeSaveGateResult leaves quality gates pending after a retryable tool error", async () => {
1877
+ const base = makeTmpBase();
1878
+ const startedAt = Date.now();
1879
+ try {
1880
+ openTestDb(base);
1881
+ seedMilestone("M005", "Milestone Five");
1882
+ seedSlice("M005", "S05", "pending");
1883
+ insertGateRow({ milestoneId: "M005", sliceId: "S05", gateId: "Q3", scope: "slice" });
1884
+ autoSession.reset();
1885
+ autoSession.active = true;
1886
+ autoSession.basePath = base;
1887
+ autoSession.currentUnit = { type: "plan-slice", id: "M005/S05", startedAt };
1888
+ recordUnitHarnessAbort(base, "plan-slice", "M005/S05", startedAt, {
1889
+ kind: "tool-error",
1890
+ reason: "Input validation error: selector is required",
1891
+ toolName: "browser_click",
1892
+ });
1893
+
1894
+ const result = await inProjectDir(base, () => executeSaveGateResult({
1895
+ milestoneId: "M005",
1896
+ sliceId: "S05",
1897
+ gateId: "Q3",
1898
+ verdict: "flag",
1899
+ rationale: "Partial gate failure after harness abort.",
1900
+ findings: "This should not be persisted as a product-quality finding.",
1901
+ }, base));
1902
+
1903
+ assert.equal(result.isError, true);
1904
+ assert.equal(result.details.operation, "save_gate_result");
1905
+ assert.equal(result.details.error, "harness_aborted_needs_retry");
1906
+ assert.equal(result.details.retryable, true);
1907
+ assert.equal(result.details.harnessAbortKind, "tool-error");
1908
+ const row = _getAdapter()!.prepare(
1909
+ "SELECT status, verdict, rationale, findings FROM quality_gates WHERE milestone_id = ? AND slice_id = ? AND gate_id = ? AND task_id = ''",
1910
+ ).get("M005", "S05", "Q3") as Record<string, unknown>;
1911
+ assert.equal(row.status, "pending");
1912
+ assert.equal(row.verdict, "");
1913
+ assert.equal(row.rationale, "");
1914
+ assert.equal(row.findings, "");
1915
+ } finally {
1916
+ autoSession.reset();
1917
+ closeDatabase();
1918
+ cleanup(base);
1919
+ }
1920
+ });
1921
+
1922
+ test("executeSaveGateResult leaves quality gates pending after a turn abort", async () => {
1923
+ const base = makeTmpBase();
1924
+ const startedAt = Date.now();
1925
+ try {
1926
+ openTestDb(base);
1927
+ seedMilestone("M005", "Milestone Five");
1928
+ seedSlice("M005", "S05", "pending");
1929
+ insertGateRow({ milestoneId: "M005", sliceId: "S05", gateId: "Q3", scope: "slice" });
1930
+ autoSession.reset();
1931
+ autoSession.active = true;
1932
+ autoSession.basePath = base;
1933
+ autoSession.currentUnit = { type: "plan-slice", id: "M005/S05", startedAt };
1934
+ recordUnitHarnessAbort(base, "plan-slice", "M005/S05", startedAt, {
1935
+ kind: "turn-abort",
1936
+ reason: "Agent turn aborted before the gate evaluation completed. origin=timeout stopReason=aborted",
1937
+ });
1938
+
1939
+ const result = await inProjectDir(base, () => executeSaveGateResult({
1940
+ milestoneId: "M005",
1941
+ sliceId: "S05",
1942
+ gateId: "Q3",
1943
+ verdict: "flag",
1944
+ rationale: "Partial gate failure after a turn abort.",
1945
+ findings: "This should not be persisted as a product-quality finding.",
1946
+ }, base));
1947
+
1948
+ assert.equal(result.isError, true);
1949
+ assert.equal(result.details.operation, "save_gate_result");
1950
+ assert.equal(result.details.error, "harness_aborted_needs_retry");
1951
+ assert.equal(result.details.retryable, true);
1952
+ assert.equal(result.details.harnessAbortKind, "turn-abort");
1953
+ const row = _getAdapter()!.prepare(
1954
+ "SELECT status, verdict, rationale, findings FROM quality_gates WHERE milestone_id = ? AND slice_id = ? AND gate_id = ? AND task_id = ''",
1955
+ ).get("M005", "S05", "Q3") as Record<string, unknown>;
1956
+ assert.equal(row.status, "pending");
1957
+ assert.equal(row.verdict, "");
1958
+ assert.equal(row.rationale, "");
1959
+ assert.equal(row.findings, "");
1960
+ } finally {
1961
+ autoSession.reset();
1962
+ closeDatabase();
1963
+ cleanup(base);
1964
+ }
1965
+ });
1966
+
1760
1967
  test("executeSaveGateResult fails when no canonical gate row is updated", async () => {
1761
1968
  const base = makeTmpBase();
1762
1969
  try {
@@ -8,6 +8,7 @@ import {
8
8
  rmSync,
9
9
  realpathSync,
10
10
  symlinkSync,
11
+ writeFileSync,
11
12
  } from "node:fs";
12
13
  import { tmpdir } from "node:os";
13
14
  import { join } from "node:path";
@@ -118,17 +119,17 @@ describe("scopeMilestone path methods", () => {
118
119
  rmSync(projectDir, { recursive: true, force: true });
119
120
  });
120
121
 
121
- test("produces correct paths for a known milestone ID", () => {
122
+ test("produces flat-phase paths for a known milestone ID", () => {
122
123
  const ws = createWorkspace(projectDir);
123
124
  const scope = scopeMilestone(ws, MID);
124
125
  const gsd = ws.contract.projectGsd;
125
126
 
126
127
  assert.equal(scope.milestoneId, MID);
127
- assert.equal(scope.contextFile(), join(gsd, "milestones", MID, `${MID}-CONTEXT.md`));
128
- assert.equal(scope.roadmapFile(), join(gsd, "milestones", MID, `${MID}-ROADMAP.md`));
128
+ assert.equal(scope.contextFile(), join(gsd, "phases", "01-m001", "01-CONTEXT.md"));
129
+ assert.equal(scope.roadmapFile(), join(gsd, "phases", "01-m001", "01-ROADMAP.md"));
129
130
  assert.equal(scope.stateFile(), join(gsd, "STATE.md"));
130
131
  assert.equal(scope.dbPath(), ws.contract.projectDb);
131
- assert.equal(scope.milestoneDir(), join(gsd, "milestones", MID));
132
+ assert.equal(scope.milestoneDir(), join(gsd, "phases", "01-m001"));
132
133
  assert.equal(scope.metaJson(), join(gsd, `${MID}-META.json`));
133
134
  });
134
135
 
@@ -144,6 +145,19 @@ describe("scopeMilestone path methods", () => {
144
145
  assert.equal(scope1.milestoneDir(), scope2.milestoneDir());
145
146
  assert.equal(scope1.metaJson(), scope2.metaJson());
146
147
  });
148
+
149
+ test("uses legacy milestone paths when legacy content exists", () => {
150
+ const legacyDir = join(projectDir, ".gsd", "milestones", MID);
151
+ mkdirSync(legacyDir, { recursive: true });
152
+ writeFileSync(join(legacyDir, `${MID}-CONTEXT.md`), "# Legacy context\n");
153
+
154
+ const ws = createWorkspace(projectDir);
155
+ const scope = scopeMilestone(ws, MID);
156
+
157
+ assert.equal(scope.contextFile(), join(legacyDir, `${MID}-CONTEXT.md`));
158
+ assert.equal(scope.roadmapFile(), join(legacyDir, `${MID}-ROADMAP.md`));
159
+ assert.equal(scope.milestoneDir(), legacyDir);
160
+ });
147
161
  });
148
162
 
149
163
  describe("createWorkspace: contract.projectGsd is realpath-canonicalized when basePath is a symlink", () => {
@@ -17,7 +17,7 @@ import { join } from "node:path";
17
17
  import { tmpdir } from "node:os";
18
18
  import { execSync } from "node:child_process";
19
19
 
20
- import { createAutoWorktree } from "../auto-worktree.ts";
20
+ import { createAutoWorktree } from "../auto-worktree-creation.ts";
21
21
  import { worktreePath } from "../worktree-manager.ts";
22
22
  import {
23
23
  copyWorktreeDb,
@@ -17,7 +17,7 @@ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync
17
17
  import { join } from 'node:path';
18
18
  import { tmpdir } from 'node:os';
19
19
 
20
- import { syncProjectRootToWorktree } from '../auto-worktree.ts';
20
+ import { syncProjectRootToWorktree } from '../auto-worktree-sync.ts';
21
21
  import { describe, test } from 'node:test';
22
22
  import assert from 'node:assert/strict';
23
23
 
@@ -18,9 +18,7 @@ import {
18
18
  reconcileWorktreeDb,
19
19
  insertDecision,
20
20
  } from "../gsd-db.ts";
21
- import {
22
- _shouldReconcileWorktreeDb,
23
- } from "../auto-worktree.ts";
21
+ import { _shouldReconcileWorktreeDb } from "../auto-worktree-sync.ts";
24
22
  import { isInfrastructureError } from "../auto/infra-errors.ts";
25
23
 
26
24
  describe("#2823: reconcileWorktreeDb same-file guard", () => {
@@ -6,7 +6,7 @@ import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
6
6
  import { join, resolve } from "node:path";
7
7
  import { tmpdir } from "node:os";
8
8
 
9
- import { _isExpectedWorktreeUnlinkError } from "../auto-worktree.ts";
9
+ import { _isExpectedWorktreeUnlinkError } from "../auto-worktree-path-utils.ts";
10
10
  import { resolveGitDir } from "../worktree-manager.ts";
11
11
 
12
12
  describe("worktree expected-condition warning suppression (#3665)", () => {
@@ -5,7 +5,7 @@ import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
  import { execFileSync } from "node:child_process";
7
7
 
8
- import { _gitPathspecForWorktreePath } from "../auto-worktree.ts";
8
+ import { _gitPathspecForWorktreePath } from "../auto-worktree-path-utils.ts";
9
9
 
10
10
  function run(cmd: string, args: string[], cwd: string): string {
11
11
  return execFileSync(cmd, args, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
@@ -107,7 +107,7 @@ function makeDeps(
107
107
  // real `getAutoWorktreePath` / `createAutoWorktree` / etc. and the
108
108
  // success/existing/failure branches won't fire as expected.
109
109
  const deps: LegacyTestDeps = {
110
- mergeMilestoneToMain: () => ({ pushed: false, codeFilesChanged: true }),
110
+ mergeMilestone: () => ({ pushed: false, codeFilesChanged: true }),
111
111
  worktreeProjection: new WorktreeStateProjection(),
112
112
  // ADR-016 phase 2 / C4 (#5627): GitServiceImpl constructor → factory.
113
113
  gitServiceFactory: () => ({}) as unknown as ReturnType<
@@ -283,7 +283,7 @@ describe("worktree journal events", () => {
283
283
 
284
284
  const s = makeSession({ basePath: wt, originalBasePath: tmp });
285
285
  const deps = makeDeps({
286
- mergeMilestoneToMain: () => ({ pushed: false, codeFilesChanged: true }),
286
+ mergeMilestone: () => ({ pushed: false, codeFilesChanged: true }),
287
287
  });
288
288
  process.chdir(wt);
289
289
 
@@ -304,7 +304,7 @@ describe("worktree journal events", () => {
304
304
  const wt = setupMergeWorktree(tmp, "M001");
305
305
  const s = makeSession({ basePath: wt, originalBasePath: tmp });
306
306
  const deps = makeDeps({
307
- mergeMilestoneToMain: () => { throw new Error("conflict in main"); },
307
+ mergeMilestone: () => { throw new Error("conflict in main"); },
308
308
  });
309
309
  // Since #4380, mergeAndExit re-throws all errors after emitting the journal
310
310
  // event and restoring state. Lifecycle now wraps that throw in a typed
@@ -347,7 +347,7 @@ describe("worktree journal events", () => {
347
347
  const s = makeSession({ basePath: wt, originalBasePath: tmp });
348
348
  let attempt = 0;
349
349
  const deps = makeDeps({
350
- mergeMilestoneToMain: () => {
350
+ mergeMilestone: () => {
351
351
  attempt += 1;
352
352
  throw new MergeConflictError(
353
353
  attempt === 1 ? ["src/a.ts"] : ["src/b.ts", "src/c.ts"],
@@ -46,7 +46,7 @@ function makeDeps(
46
46
  ): LegacyTestDeps & { calls: CallLog[] } {
47
47
  const calls: CallLog[] = [];
48
48
  // ADR-016 phase 2 / C-track close-out: WorktreeLifecycleDeps is now a
49
- // 3-field bag (gitServiceFactory, worktreeProjection, mergeMilestoneToMain).
49
+ // 3-field bag (gitServiceFactory, worktreeProjection, mergeMilestone).
50
50
  // Tests still pass legacy override hooks via `LegacyTestDeps` — Lifecycle
51
51
  // ignores the extras structurally and reads them through the C1-healing
52
52
  // primitive-override pattern when stubs are needed.
@@ -73,7 +73,7 @@ function makeDeps(
73
73
  },
74
74
  autoWorktreeBranch: (mid: string) => `milestone/${mid}`,
75
75
  teardownAutoWorktree: () => {},
76
- mergeMilestoneToMain: () => ({ pushed: false, codeFilesChanged: true }),
76
+ mergeMilestone: () => ({ pushed: false, codeFilesChanged: true }),
77
77
  ...overrides,
78
78
  };
79
79
  return deps;
@@ -3,7 +3,7 @@
3
3
  import { test } from "node:test";
4
4
  import assert from "node:assert/strict";
5
5
 
6
- import { _resolveAutoWorktreeStartPoint } from "../auto-worktree.ts";
6
+ import { _resolveAutoWorktreeStartPoint } from "../auto-worktree-branch-lifecycle.ts";
7
7
 
8
8
  test("auto-worktree start point prefers milestone integration branch", () => {
9
9
  const startPoint = _resolveAutoWorktreeStartPoint(
@@ -26,7 +26,7 @@ import { tmpdir } from "node:os";
26
26
  import {
27
27
  syncGsdStateToWorktree,
28
28
  syncWorktreeStateBack,
29
- } from "../auto-worktree.ts";
29
+ } from "../auto-worktree-sync.ts";
30
30
 
31
31
  // ─── Helpers ─────────────────────────────────────────────────────────
32
32
 
@@ -13,7 +13,8 @@ import { join } from "node:path";
13
13
  import { tmpdir } from "node:os";
14
14
  import { execFileSync } from "node:child_process";
15
15
 
16
- import { createAutoWorktree, _resetAutoWorktreeOriginalBaseForTests } from "../auto-worktree.ts";
16
+ import { createAutoWorktree } from "../auto-worktree-creation.ts";
17
+ import { _resetAutoWorktreeOriginalBaseForTests } from "../auto-worktree-session-registry.ts";
17
18
  import { reenterActiveWorktreeIfNeeded } from "../worktree-reentry.ts";
18
19
 
19
20
  // Safe: all inputs below are hardcoded test strings, not user input.
@@ -23,12 +23,15 @@
23
23
  * - syncWorktreeStateBack skips non-standard milestone projection dir names
24
24
  */
25
25
 
26
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync } from 'node:fs';
26
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync, statSync } from 'node:fs';
27
27
  import { join } from 'node:path';
28
28
  import { tmpdir } from 'node:os';
29
29
 
30
- import { syncProjectRootToWorktree } from '../auto-worktree.ts';
31
- import { syncGsdStateToWorktree, syncWorktreeStateBack } from '../auto-worktree.ts';
30
+ import {
31
+ syncGsdStateToWorktree,
32
+ syncProjectRootToWorktree,
33
+ syncWorktreeStateBack,
34
+ } from '../auto-worktree-sync.ts';
32
35
  import { describe, test } from 'node:test';
33
36
  import assert from 'node:assert/strict';
34
37
 
@@ -148,6 +151,36 @@ describe('worktree-sync-milestones', async () => {
148
151
  }
149
152
  }
150
153
 
154
+ // ─── 3c. artifact file/dir collisions preserve existing worktree files ─
155
+ console.log('\n=== 3c. artifact file/dir collisions preserve existing worktree files (#1157) ===');
156
+ {
157
+ const mainBase = createBase('main');
158
+ const wtBase = createBase('wt');
159
+
160
+ try {
161
+ const mainSliceDir = join(mainBase, '.gsd', 'milestones', 'M001', 'slices', 'S01');
162
+ mkdirSync(join(mainSliceDir, 'S01-SUMMARY.md'), { recursive: true });
163
+ mkdirSync(join(mainSliceDir, 'S01-ASSESSMENT.md'), { recursive: true });
164
+
165
+ const wtSliceDir = join(wtBase, '.gsd', 'milestones', 'M001', 'slices', 'S01');
166
+ mkdirSync(wtSliceDir, { recursive: true });
167
+ writeFileSync(join(wtSliceDir, 'S01-SUMMARY.md'), '# Valid summary\n');
168
+ writeFileSync(join(wtSliceDir, 'S01-ASSESSMENT.md'), '---\nverdict: pass\n---\n# Valid assessment\n');
169
+
170
+ syncProjectRootToWorktree(mainBase, wtBase, 'M001');
171
+
172
+ const summaryPath = join(wtSliceDir, 'S01-SUMMARY.md');
173
+ const assessmentPath = join(wtSliceDir, 'S01-ASSESSMENT.md');
174
+ assert.ok(statSync(summaryPath).isFile(), 'existing SUMMARY.md stays a file');
175
+ assert.ok(statSync(assessmentPath).isFile(), 'existing ASSESSMENT.md stays a file');
176
+ assert.equal(readFileSync(summaryPath, 'utf-8'), '# Valid summary\n');
177
+ assert.equal(readFileSync(assessmentPath, 'utf-8'), '---\nverdict: pass\n---\n# Valid assessment\n');
178
+ } finally {
179
+ cleanup(mainBase);
180
+ cleanup(wtBase);
181
+ }
182
+ }
183
+
151
184
  // ─── 4. No-op when paths are equal ────────────────────────────────────
152
185
  console.log('\n=== 4. no-op when paths are equal ===');
153
186
  {
@@ -25,7 +25,7 @@ import {
25
25
  import { join } from "node:path";
26
26
  import { tmpdir } from "node:os";
27
27
 
28
- import { syncProjectRootToWorktree } from "../auto-worktree.ts";
28
+ import { syncProjectRootToWorktree } from "../auto-worktree-sync.ts";
29
29
 
30
30
  function createBase(name: string): string {
31
31
  const base = mkdtempSync(join(tmpdir(), `gsd-wt-1886-${name}-`));
@@ -18,7 +18,7 @@ import {
18
18
  import { join } from "node:path";
19
19
  import { tmpdir } from "node:os";
20
20
 
21
- import { syncWorktreeStateBack } from "../auto-worktree.ts";
21
+ import { syncWorktreeStateBack } from "../auto-worktree-sync.ts";
22
22
 
23
23
  function makeTempDir(prefix: string): string {
24
24
  return mkdtempSync(join(tmpdir(), `gsd-sync-test-${prefix}-`));
@@ -20,6 +20,7 @@ import {
20
20
  existsSync,
21
21
  realpathSync,
22
22
  readFileSync,
23
+ readdirSync,
23
24
  } from "node:fs";
24
25
  import { join } from "node:path";
25
26
  import { tmpdir } from "node:os";
@@ -132,6 +133,37 @@ describe("worktree-teardown-safety", () => {
132
133
  );
133
134
  });
134
135
 
136
+ it("removeWorktree quarantines dirty worktree contents before forced cleanup", () => {
137
+ const tempDir = createTempRepo();
138
+ dirs.push(tempDir);
139
+
140
+ const wt = createWorktree(tempDir, "dirty-wt");
141
+ writeFileSync(join(wt.path, "generated-feature.ts"), "export const answer = 42;\n");
142
+ writeFileSync(join(wt.path, "README.md"), "# changed in worktree\n");
143
+
144
+ removeWorktree(tempDir, "dirty-wt", { deleteBranch: false });
145
+
146
+ assertTrue(!existsSync(wt.path), "original dirty worktree path removed after quarantine");
147
+ const quarantineRoot = join(tempDir, ".gsd", "quarantine", "worktrees");
148
+ const entries = readdirSync(quarantineRoot).filter((entry) => entry.startsWith("dirty-wt-"));
149
+ assertEq(entries.length, 1, "dirty worktree snapshot quarantined");
150
+ const quarantineDir = join(quarantineRoot, entries[0]!);
151
+ assertEq(
152
+ readFileSync(join(quarantineDir, "generated-feature.ts"), "utf-8"),
153
+ "export const answer = 42;\n",
154
+ "untracked source file survives in quarantine",
155
+ );
156
+ assertEq(
157
+ readFileSync(join(quarantineDir, "README.md"), "utf-8"),
158
+ "# changed in worktree\n",
159
+ "modified tracked file survives in quarantine",
160
+ );
161
+ assertTrue(
162
+ existsSync(join(quarantineDir, ".gsd-quarantine.json")),
163
+ "quarantine metadata written",
164
+ );
165
+ });
166
+
135
167
  it("worktreePath always returns paths under .gsd/worktrees/", () => {
136
168
  const tempDir = createTempRepo();
137
169
  dirs.push(tempDir);
@@ -85,6 +85,18 @@ export interface UnitWorkflowDispatchReadinessInput {
85
85
  activeTools?: string[];
86
86
  }
87
87
 
88
+ export interface WorkflowDispatchModelContext {
89
+ provider?: string;
90
+ baseUrl?: string;
91
+ }
92
+
93
+ export interface UnitWorkflowDispatchReadinessForModelInput
94
+ extends Omit<UnitWorkflowDispatchReadinessInput, "provider" | "authMode" | "baseUrl"> {
95
+ model?: WorkflowDispatchModelContext | null;
96
+ fallbackModel?: WorkflowDispatchModelContext | null;
97
+ getProviderAuthMode?: (provider: string) => WorkflowCapabilityOptions["authMode"] | undefined;
98
+ }
99
+
88
100
  export function compileUnitContextContract(unitType: string): UnitContextContractResult {
89
101
  const manifest = resolveManifest(unitType);
90
102
  if (!manifest) {
@@ -115,6 +127,23 @@ export function getUnitWorkflowDispatchReadinessError(
115
127
  );
116
128
  }
117
129
 
130
+ export function getUnitWorkflowDispatchReadinessErrorForModel(
131
+ input: UnitWorkflowDispatchReadinessForModelInput,
132
+ ): string | null {
133
+ const provider = input.model?.provider ?? input.fallbackModel?.provider;
134
+ const baseUrl = input.model?.baseUrl ?? input.fallbackModel?.baseUrl;
135
+ return getUnitWorkflowDispatchReadinessError({
136
+ provider,
137
+ unitType: input.unitType,
138
+ projectRoot: input.projectRoot,
139
+ env: input.env,
140
+ surface: input.surface,
141
+ authMode: provider ? input.getProviderAuthMode?.(provider) : undefined,
142
+ baseUrl,
143
+ activeTools: input.activeTools,
144
+ });
145
+ }
146
+
118
147
  export function compileUnitToolContract(unitType: string): ToolContractResult {
119
148
  const manifest = resolveManifest(unitType);
120
149
  const surfaceContract = getUnitToolSurfaceContract(unitType);