@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
@@ -14,6 +14,7 @@ import { tmpdir } from "node:os";
14
14
 
15
15
  import {
16
16
  checkAutoStartAfterDiscuss,
17
+ _getPendingAutoStart,
17
18
  setPendingAutoStart,
18
19
  clearPendingAutoStart,
19
20
  } from "../guided-flow.ts";
@@ -21,6 +22,7 @@ import { drainLogs } from "../workflow-logger.ts";
21
22
  import {
22
23
  openDatabase,
23
24
  closeDatabase,
25
+ getMilestone,
24
26
  insertMilestone,
25
27
  } from "../gsd-db.ts";
26
28
 
@@ -59,6 +61,12 @@ function mkBase(): string {
59
61
  return base;
60
62
  }
61
63
 
64
+ function mkFlatBase(): string {
65
+ const base = mkdtempSync(join(tmpdir(), "gsd-gate1b-flat-"));
66
+ mkdirSync(join(base, ".gsd", "phases", "01-m001"), { recursive: true });
67
+ return base;
68
+ }
69
+
62
70
  function writeContext(base: string): void {
63
71
  writeFileSync(
64
72
  join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"),
@@ -66,6 +74,13 @@ function writeContext(base: string): void {
66
74
  );
67
75
  }
68
76
 
77
+ function writeFlatContext(base: string): void {
78
+ writeFileSync(
79
+ join(base, ".gsd", "phases", "01-m001", "01-CONTEXT.md"),
80
+ "# M001: Test Milestone\n\nContext written by discuss phase.\n",
81
+ );
82
+ }
83
+
69
84
  describe("Gate 1b discussion handoff in checkAutoStartAfterDiscuss", () => {
70
85
  let base: string;
71
86
  let cap: MockCapture;
@@ -142,4 +157,78 @@ describe("Gate 1b discussion handoff in checkAutoStartAfterDiscuss", () => {
142
157
  );
143
158
  assert.equal(gate1bLog, undefined, "Gate 1b must not log when CONTEXT.md is absent");
144
159
  });
160
+
161
+ test("flat-phase CONTEXT.md accepts handoff without a legacy milestone context file", () => {
162
+ base = mkFlatBase();
163
+ openDatabase(":memory:");
164
+ insertMilestone({ id: "M001", title: "Test Milestone", status: "queued" });
165
+ writeFlatContext(base);
166
+
167
+ cap = mkCapture();
168
+ setPendingAutoStart(base, {
169
+ basePath: base,
170
+ milestoneId: "M001",
171
+ startAuto: false,
172
+ ctx: mkCtx(cap),
173
+ pi: mkPi(cap),
174
+ });
175
+
176
+ const result = checkAutoStartAfterDiscuss();
177
+
178
+ assert.equal(result, true, "flat-phase context must be found by the handoff");
179
+ assert.equal(cap.messages.length, 0, "startAuto=false must suppress scheduling");
180
+ assert.deepEqual(cap.notifies[0], {
181
+ msg: "Milestone M001 context captured. Continuing the planning pipeline.",
182
+ level: "success",
183
+ });
184
+ });
185
+
186
+ test("DB-unavailable recovery blocks handoff instead of reporting success", () => {
187
+ base = mkFlatBase();
188
+ writeFlatContext(base);
189
+
190
+ cap = mkCapture();
191
+ setPendingAutoStart(base, {
192
+ basePath: base,
193
+ milestoneId: "M001",
194
+ startAuto: false,
195
+ ctx: mkCtx(cap),
196
+ pi: mkPi(cap),
197
+ });
198
+
199
+ const result = checkAutoStartAfterDiscuss();
200
+
201
+ assert.equal(result, false, "handoff must fail closed when the DB row cannot be confirmed");
202
+ assert.equal(cap.messages.length, 0, "must not schedule auto-start when DB is unavailable");
203
+ assert.equal(
204
+ cap.notifies.some(n => n.level === "success"),
205
+ false,
206
+ "must not report a successful handoff when DB recovery was skipped",
207
+ );
208
+ assert.ok(_getPendingAutoStart(base), "pending handoff should remain for a later recovery attempt");
209
+ });
210
+
211
+ test("missing DB row with CONTEXT.md inserts a queued row and accepts handoff", () => {
212
+ base = mkFlatBase();
213
+ openDatabase(":memory:");
214
+ writeFlatContext(base);
215
+
216
+ cap = mkCapture();
217
+ setPendingAutoStart(base, {
218
+ basePath: base,
219
+ milestoneId: "M001",
220
+ startAuto: false,
221
+ ctx: mkCtx(cap),
222
+ pi: mkPi(cap),
223
+ });
224
+
225
+ const result = checkAutoStartAfterDiscuss();
226
+
227
+ assert.equal(result, true, "successful insert should recover the missing row");
228
+ assert.equal(getMilestone("M001")?.status, "queued");
229
+ assert.deepEqual(cap.notifies[0], {
230
+ msg: "Milestone M001 context captured. Continuing the planning pipeline.",
231
+ level: "success",
232
+ });
233
+ });
145
234
  });
@@ -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
  }
@@ -0,0 +1,196 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Regression for #1222 — a re-import must not silently downgrade
3
+ // a completed flat-phase task back to pending when its SUMMARY.md attests the
4
+ // completion. gsd_task_complete succeeds and writes TID-SUMMARY.md, but a stale
5
+ // plan checkbox re-imported into the DB would revert the task to pending,
6
+ // hard-stopping auto-mode on its "state did not advance" guard.
7
+
8
+ import test, { afterEach } from "node:test";
9
+ import assert from "node:assert/strict";
10
+ import { cpSync, mkdtempSync, rmSync, writeFileSync, unlinkSync, mkdirSync } from "node:fs";
11
+ import { join, dirname } from "node:path";
12
+ import { tmpdir } from "node:os";
13
+ import { randomUUID } from "node:crypto";
14
+ import { fileURLToPath } from "node:url";
15
+
16
+ import { openDatabase, closeDatabase, getAllMilestones, getMilestoneSlices, getSliceTasks, repairTaskCompletionFromSummary } from "../gsd-db.ts";
17
+ import { migrateHierarchyToDb } from "../md-importer.ts";
18
+ import { invalidateStateCache } from "../state.ts";
19
+
20
+ const __dirname = dirname(fileURLToPath(import.meta.url));
21
+ const FIXTURE_ROOT = join(__dirname, "__fixtures__", "flat-phase");
22
+ // The flat-phase fixture parses to M001/S01/T01 (phase 01, plan 01, task T01).
23
+ const PHASE_DIR = join(".gsd", "phases", "01-foundation");
24
+ const SUMMARY_REL = join(PHASE_DIR, "T01-SUMMARY.md");
25
+
26
+ const tmpDirs: string[] = [];
27
+ afterEach(() => {
28
+ closeDatabase();
29
+ for (const d of tmpDirs) { try { rmSync(d, { recursive: true, force: true }); } catch { /* */ } }
30
+ tmpDirs.length = 0;
31
+ });
32
+
33
+ function copyFixture(): string {
34
+ const base = mkdtempSync(join(tmpdir(), `gsd-lostupdate-${randomUUID()}`));
35
+ cpSync(FIXTURE_ROOT, base, { recursive: true });
36
+ tmpDirs.push(base);
37
+ return base;
38
+ }
39
+
40
+ function taskStatus(base: string): string | undefined {
41
+ return t01Row()?.status;
42
+ }
43
+
44
+ function t01Row() {
45
+ const ms = getAllMilestones();
46
+ if (ms.length === 0) return undefined;
47
+ const slices = getMilestoneSlices(ms[0]!.id);
48
+ if (slices.length === 0) return undefined;
49
+ const tasks = getSliceTasks(ms[0]!.id, slices[0]!.id);
50
+ return tasks.find((t) => t.id === "T01");
51
+ }
52
+
53
+ function t01Ids() {
54
+ const ms = getAllMilestones();
55
+ const slices = getMilestoneSlices(ms[0]!.id);
56
+ return { milestoneId: ms[0]!.id, sliceId: slices[0]!.id };
57
+ }
58
+
59
+ test("re-import keeps a flat-phase task complete when its SUMMARY.md is present (#1222)", () => {
60
+ const base = copyFixture();
61
+ // The fixture plan leaves T01 unchecked ([ ]). Simulate a completed task: the
62
+ // durable SUMMARY.md exists even though the plan checkbox is stale-unchecked.
63
+ writeFileSync(join(base, SUMMARY_REL), "# T01 SUMMARY\n\nDone.\n");
64
+
65
+ openDatabase(join(base, ".gsd", "gsd.db"));
66
+ migrateHierarchyToDb(base);
67
+ invalidateStateCache();
68
+
69
+ assert.equal(
70
+ taskStatus(base),
71
+ "complete",
72
+ "task with SUMMARY.md on disk must import as complete, not revert to pending",
73
+ );
74
+ });
75
+
76
+ test("re-import leaves an unchecked flat-phase task pending when no SUMMARY.md exists (#1222)", () => {
77
+ const base = copyFixture();
78
+ // No SUMMARY.md — the unchecked checkbox is the authoritative signal.
79
+
80
+ openDatabase(join(base, ".gsd", "gsd.db"));
81
+ migrateHierarchyToDb(base);
82
+ invalidateStateCache();
83
+
84
+ assert.equal(
85
+ taskStatus(base),
86
+ "pending",
87
+ "unchecked task without a SUMMARY.md must stay pending",
88
+ );
89
+ });
90
+
91
+ test("re-import keeps a flat-phase task complete even when an auxiliary tasks/ subdir exists (#1222)", () => {
92
+ const base = copyFixture();
93
+ // Flat-phase may keep a tasks/ subdir for gate artifacts (e.g. T01-VERIFY.json)
94
+ // while gsd_task_complete still writes TID-SUMMARY.md at the phase root. The
95
+ // tasks/ subdir must NOT shadow that real summary and downgrade the task.
96
+ mkdirSync(join(base, PHASE_DIR, "tasks"), { recursive: true });
97
+ writeFileSync(join(base, PHASE_DIR, "tasks", "T01-VERIFY.json"), "{}\n");
98
+ writeFileSync(join(base, SUMMARY_REL), "# T01 SUMMARY\n\nDone.\n");
99
+
100
+ openDatabase(join(base, ".gsd", "gsd.db"));
101
+ migrateHierarchyToDb(base);
102
+ invalidateStateCache();
103
+
104
+ assert.equal(
105
+ taskStatus(base),
106
+ "complete",
107
+ "a phase-root SUMMARY.md must win even when a tasks/ subdir exists (no shadowing)",
108
+ );
109
+ });
110
+
111
+ test("re-import preserves execution metadata and completed_at of an attested-complete task (#1222)", () => {
112
+ const base = copyFixture();
113
+ // T01 is completed on disk (SUMMARY present) but its plan checkbox is stale-unchecked.
114
+ writeFileSync(join(base, SUMMARY_REL), "# T01 SUMMARY\n\nDone.\n");
115
+
116
+ openDatabase(join(base, ".gsd", "gsd.db"));
117
+ migrateHierarchyToDb(base);
118
+ invalidateStateCache();
119
+
120
+ // Simulate the row gsd_task_complete leaves behind: real execution prose plus
121
+ // a completion timestamp from when the task actually finished.
122
+ const OLD_COMPLETED_AT = "2026-07-01T00:00:00.000Z";
123
+ const REAL_ONE_LINER = "Implemented the widget frobnicator end-to-end";
124
+ const REAL_SUMMARY = "# T01 full summary\n\nEverything about how T01 was done.";
125
+ const REAL_VERIFICATION = "all 12 checks passed";
126
+ const { milestoneId, sliceId } = t01Ids();
127
+ repairTaskCompletionFromSummary({
128
+ milestoneId,
129
+ sliceId,
130
+ taskId: "T01",
131
+ oneLiner: REAL_ONE_LINER,
132
+ verificationResult: REAL_VERIFICATION,
133
+ completedAt: OLD_COMPLETED_AT,
134
+ fullSummaryMd: REAL_SUMMARY,
135
+ });
136
+ invalidateStateCache();
137
+
138
+ const before = t01Row()!;
139
+ assert.equal(before.status, "complete", "precondition: T01 is complete");
140
+ assert.equal(before.one_liner, REAL_ONE_LINER, "precondition: one_liner set");
141
+ assert.equal(before.completed_at, OLD_COMPLETED_AT, "precondition: completed_at set");
142
+
143
+ // The pre-dispatch reconcile re-imports the whole tree (plan checkbox still [ ]).
144
+ migrateHierarchyToDb(base);
145
+ invalidateStateCache();
146
+
147
+ const after = t01Row()!;
148
+ assert.equal(after.status, "complete", "status must survive re-import");
149
+ assert.equal(after.one_liner, REAL_ONE_LINER, "one_liner must survive re-import");
150
+ assert.equal(after.full_summary_md, REAL_SUMMARY, "full_summary_md must survive re-import");
151
+ assert.equal(after.verification_result, REAL_VERIFICATION, "verification_result must survive re-import");
152
+ assert.equal(after.completed_at, OLD_COMPLETED_AT, "completed_at must not be refreshed by re-import");
153
+ });
154
+
155
+ test("removing the SUMMARY.md (reopen) lets a re-import return the task to pending and clears completion metadata (#1222)", () => {
156
+ const base = copyFixture();
157
+ writeFileSync(join(base, SUMMARY_REL), "# T01 SUMMARY\n\nDone.\n");
158
+
159
+ openDatabase(join(base, ".gsd", "gsd.db"));
160
+ migrateHierarchyToDb(base);
161
+ invalidateStateCache();
162
+ assert.equal(taskStatus(base), "complete", "precondition: task imports complete with SUMMARY present");
163
+
164
+ // Simulate the durable completion row gsd_task_complete leaves behind.
165
+ const { milestoneId, sliceId } = t01Ids();
166
+ repairTaskCompletionFromSummary({
167
+ milestoneId,
168
+ sliceId,
169
+ taskId: "T01",
170
+ oneLiner: "Implemented the widget frobnicator end-to-end",
171
+ verificationResult: "all 12 checks passed",
172
+ completedAt: "2026-07-01T00:00:00.000Z",
173
+ fullSummaryMd: "# T01 full summary\n\nEverything about how T01 was done.",
174
+ });
175
+ invalidateStateCache();
176
+ const before = t01Row()!;
177
+ assert.equal(before.status, "complete", "precondition: T01 is complete");
178
+ assert.equal(before.completed_at, "2026-07-01T00:00:00.000Z", "precondition: completed_at set");
179
+
180
+ // reopen-task deletes the flat-phase SUMMARY; the next re-import must respect it.
181
+ unlinkSync(join(base, SUMMARY_REL));
182
+ migrateHierarchyToDb(base);
183
+ invalidateStateCache();
184
+ const after = t01Row()!;
185
+ assert.equal(
186
+ after.status,
187
+ "pending",
188
+ "after the SUMMARY is removed, a re-import must return the unchecked task to pending",
189
+ );
190
+ // A pending re-import must not preserve stale completion metadata (#1228 thread):
191
+ // preserveCompletionMetadata only applies to complete/done imports.
192
+ assert.ok(!after.completed_at, "completed_at must be cleared when the task reverts to pending");
193
+ assert.ok(!after.one_liner, "one_liner must be cleared when the task reverts to pending");
194
+ assert.ok(!after.full_summary_md, "full_summary_md must be cleared when the task reverts to pending");
195
+ assert.ok(!after.verification_result, "verification_result must be cleared when the task reverts to pending");
196
+ });
@@ -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