@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
@@ -1,7 +1,7 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: DB-backed GSD state derivation pipeline stage.
3
3
 
4
- import type { ActiveRef, GSDState, MilestoneRegistryEntry } from '../../types.js';
4
+ import type { ActiveRef, GSDState, MilestoneRegistryEntry, Phase } from '../../types.js';
5
5
  import { join } from 'node:path';
6
6
  import { existsSync } from 'node:fs';
7
7
  import { isClosedStatus, isDeferredStatus } from '../../status-guards.js';
@@ -41,6 +41,59 @@ import {
41
41
 
42
42
  const isStatusDone = isClosedStatus;
43
43
 
44
+ type MilestoneProgress = { done: number; total: number };
45
+ type SliceProgress = { done: number; total: number };
46
+ type TaskProgress = { done: number; total: number };
47
+
48
+ interface DerivedStateContext {
49
+ activeMilestone: ActiveRef | null;
50
+ activeSlice?: ActiveRef | null;
51
+ activeTask?: ActiveRef | null;
52
+ registry: MilestoneRegistryEntry[];
53
+ requirements: GSDState["requirements"];
54
+ milestoneProgress: MilestoneProgress;
55
+ sliceProgress?: SliceProgress;
56
+ taskProgress?: TaskProgress;
57
+ }
58
+
59
+ interface DerivedStateOptions {
60
+ blockers?: string[];
61
+ lastCompletedMilestone?: ActiveRef | null;
62
+ includeActiveWorkspace?: boolean;
63
+ }
64
+
65
+ function buildProgress(context: DerivedStateContext): NonNullable<GSDState["progress"]> {
66
+ return {
67
+ milestones: context.milestoneProgress,
68
+ ...(context.sliceProgress ? { slices: context.sliceProgress } : {}),
69
+ ...(context.taskProgress ? { tasks: context.taskProgress } : {}),
70
+ };
71
+ }
72
+
73
+ function buildDerivedState(
74
+ context: DerivedStateContext,
75
+ phase: Phase,
76
+ nextAction: string,
77
+ options: DerivedStateOptions = {},
78
+ ): GSDState {
79
+ return {
80
+ activeMilestone: context.activeMilestone,
81
+ activeSlice: context.activeSlice ?? null,
82
+ activeTask: context.activeTask ?? null,
83
+ phase,
84
+ recentDecisions: [],
85
+ blockers: options.blockers ?? [],
86
+ nextAction,
87
+ ...(options.lastCompletedMilestone !== undefined
88
+ ? { lastCompletedMilestone: options.lastCompletedMilestone }
89
+ : {}),
90
+ ...(options.includeActiveWorkspace ? { activeWorkspace: undefined } : {}),
91
+ registry: context.registry,
92
+ requirements: context.requirements,
93
+ progress: buildProgress(context),
94
+ };
95
+ }
96
+
44
97
  function stripMilestonePrefix(title: string): string {
45
98
  return title.replace(/^M\d+(?:-[a-z0-9]{6})?[^:]*:\s*/, '') || title;
46
99
  }
@@ -182,58 +235,47 @@ function handleNoActiveMilestone(
182
235
  const pendingEntries = registry.filter(e => e.status === 'pending');
183
236
  const parkedEntries = registry.filter(e => e.status === 'parked');
184
237
 
238
+ const context: DerivedStateContext = {
239
+ activeMilestone: null,
240
+ registry,
241
+ requirements,
242
+ milestoneProgress,
243
+ };
244
+
185
245
  if (pendingEntries.length > 0) {
186
246
  const blockerDetails = pendingEntries
187
247
  .filter(e => e.dependsOn && e.dependsOn.length > 0)
188
248
  .map(e => `${e.id} is waiting on unmet deps: ${e.dependsOn!.join(', ')}`);
189
- return {
190
- activeMilestone: null, activeSlice: null, activeTask: null,
191
- phase: 'blocked',
192
- recentDecisions: [], blockers: blockerDetails.length > 0
249
+ return buildDerivedState(context, 'blocked', 'Resolve milestone dependencies before proceeding.', {
250
+ blockers: blockerDetails.length > 0
193
251
  ? blockerDetails
194
252
  : ['All remaining milestones are dep-blocked but no deps listed — check CONTEXT.md files'],
195
- nextAction: 'Resolve milestone dependencies before proceeding.',
196
- registry, requirements,
197
- progress: { milestones: milestoneProgress },
198
- };
253
+ });
199
254
  }
200
255
 
201
256
  if (parkedEntries.length > 0) {
202
257
  const parkedIds = parkedEntries.map(e => e.id).join(', ');
203
- return {
204
- activeMilestone: null, activeSlice: null, activeTask: null,
205
- phase: 'pre-planning',
206
- recentDecisions: [], blockers: [],
207
- nextAction: `All remaining milestones are parked (${parkedIds}). Run /gsd unpark <id> or create a new milestone.`,
208
- registry, requirements,
209
- progress: { milestones: milestoneProgress },
210
- };
258
+ return buildDerivedState(
259
+ context,
260
+ 'pre-planning',
261
+ `All remaining milestones are parked (${parkedIds}). Run /gsd unpark <id> or create a new milestone.`,
262
+ );
211
263
  }
212
264
 
213
265
  if (registry.length === 0) {
214
- return {
215
- activeMilestone: null, activeSlice: null, activeTask: null,
216
- phase: 'pre-planning',
217
- recentDecisions: [], blockers: [],
218
- nextAction: 'No milestones found. Run /gsd to create one.',
219
- registry: [], requirements,
220
- progress: { milestones: { done: 0, total: 0 } },
221
- };
266
+ return buildDerivedState(
267
+ { ...context, registry: [], milestoneProgress: { done: 0, total: 0 } },
268
+ 'pre-planning',
269
+ 'No milestones found. Run /gsd to create one.',
270
+ );
222
271
  }
223
272
 
224
273
  const lastEntry = registry[registry.length - 1];
225
274
  const unmappedActive = countUnmappedActiveRequirements();
226
275
  const completionNote = formatCompletePhaseNextAction(unmappedActive);
227
- return {
228
- activeMilestone: null,
276
+ return buildDerivedState(context, 'complete', completionNote, {
229
277
  lastCompletedMilestone: lastEntry ? { id: lastEntry.id, title: lastEntry.title } : null,
230
- activeSlice: null, activeTask: null,
231
- phase: 'complete',
232
- recentDecisions: [], blockers: [],
233
- nextAction: completionNote,
234
- registry, requirements,
235
- progress: { milestones: milestoneProgress },
236
- };
278
+ });
237
279
  }
238
280
 
239
281
  async function handleAllSlicesDone(
@@ -248,52 +290,48 @@ async function handleAllSlicesDone(
248
290
  const verdict = typeof validation?.status === "string" ? validation.status : undefined;
249
291
  const validationTerminal = verdict != null && verdict !== "";
250
292
 
293
+ const context: DerivedStateContext = {
294
+ activeMilestone,
295
+ registry,
296
+ requirements,
297
+ milestoneProgress,
298
+ sliceProgress,
299
+ };
300
+
251
301
  if (!validationTerminal) {
252
- return {
253
- activeMilestone, activeSlice: null, activeTask: null,
254
- phase: 'validating-milestone',
255
- recentDecisions: [], blockers: [],
256
- nextAction: `Validate milestone ${activeMilestone.id} before completion.`,
257
- registry, requirements,
258
- progress: { milestones: milestoneProgress, slices: sliceProgress },
259
- };
302
+ return buildDerivedState(
303
+ context,
304
+ 'validating-milestone',
305
+ `Validate milestone ${activeMilestone.id} before completion.`,
306
+ );
260
307
  }
261
308
 
262
309
  // All roadmap slices are done (enforced by caller) and verdict is
263
310
  // needs-remediation — remediation cannot progress without new slices.
264
311
  // Return blocked instead of re-dispatching validate-milestone (#4506).
265
312
  if (verdict === 'needs-attention') {
266
- return {
267
- activeMilestone, activeSlice: null, activeTask: null,
268
- phase: 'blocked',
269
- recentDecisions: [],
270
- blockers: [formatNeedsAttentionBlocker(activeMilestone.id)],
271
- nextAction: `Resolve ${activeMilestone.id} validation attention before proceeding.`,
272
- registry, requirements,
273
- progress: { milestones: milestoneProgress, slices: sliceProgress },
274
- };
313
+ return buildDerivedState(
314
+ context,
315
+ 'blocked',
316
+ `Resolve ${activeMilestone.id} validation attention before proceeding.`,
317
+ { blockers: [formatNeedsAttentionBlocker(activeMilestone.id)] },
318
+ );
275
319
  }
276
320
 
277
321
  if (verdict === 'needs-remediation') {
278
- return {
279
- activeMilestone, activeSlice: null, activeTask: null,
280
- phase: 'blocked',
281
- recentDecisions: [],
282
- blockers: [formatNeedsRemediationBlocker(activeMilestone.id)],
283
- nextAction: `Resolve ${activeMilestone.id} remediation before proceeding.`,
284
- registry, requirements,
285
- progress: { milestones: milestoneProgress, slices: sliceProgress },
286
- };
322
+ return buildDerivedState(
323
+ context,
324
+ 'blocked',
325
+ `Resolve ${activeMilestone.id} remediation before proceeding.`,
326
+ { blockers: [formatNeedsRemediationBlocker(activeMilestone.id)] },
327
+ );
287
328
  }
288
329
 
289
- return {
290
- activeMilestone, activeSlice: null, activeTask: null,
291
- phase: 'completing-milestone',
292
- recentDecisions: [], blockers: [],
293
- nextAction: `All slices complete in ${activeMilestone.id}. Write milestone summary.`,
294
- registry, requirements,
295
- progress: { milestones: milestoneProgress, slices: sliceProgress },
296
- };
330
+ return buildDerivedState(
331
+ context,
332
+ 'completing-milestone',
333
+ `All slices complete in ${activeMilestone.id}. Write milestone summary.`,
334
+ );
297
335
  }
298
336
 
299
337
  function resolveSliceDependencies(activeMilestoneSlices: SliceRow[]): { activeSlice: ActiveRef | null, activeSliceRow: SliceRow | null } {
@@ -356,13 +394,16 @@ export async function deriveStateFromDb(
356
394
  : allMilestones;
357
395
 
358
396
  if (milestones.length === 0) {
359
- return {
360
- activeMilestone: null, activeSlice: null, activeTask: null,
361
- phase: 'pre-planning', recentDecisions: [], blockers: [],
362
- nextAction: 'No milestones found. Run /gsd to create one.',
363
- registry: [], requirements,
364
- progress: { milestones: { done: 0, total: 0 } },
365
- };
397
+ return buildDerivedState(
398
+ {
399
+ activeMilestone: null,
400
+ registry: [],
401
+ requirements,
402
+ milestoneProgress: { done: 0, total: 0 },
403
+ },
404
+ 'pre-planning',
405
+ 'No milestones found. Run /gsd to create one.',
406
+ );
366
407
  }
367
408
 
368
409
  const { completeMilestoneIds, parkedMilestoneIds } = buildCompletenessSet(basePath, milestones);
@@ -384,12 +425,11 @@ export async function deriveStateFromDb(
384
425
  const nextAction = activeMilestoneHasDraft
385
426
  ? `Discuss draft context for milestone ${activeMilestone.id}.`
386
427
  : `Plan milestone ${activeMilestone.id}.`;
387
- return {
388
- activeMilestone, activeSlice: null, activeTask: null,
389
- phase, recentDecisions: [], blockers: [],
390
- nextAction, registry, requirements,
391
- progress: { milestones: milestoneProgress },
392
- };
428
+ return buildDerivedState(
429
+ { activeMilestone, registry, requirements, milestoneProgress },
430
+ phase,
431
+ nextAction,
432
+ );
393
433
  }
394
434
 
395
435
  const allSlicesDone = activeMilestoneSlices.every(s => isStatusDone(s.status));
@@ -397,6 +437,13 @@ export async function deriveStateFromDb(
397
437
  done: activeMilestoneSlices.filter(s => isStatusDone(s.status)).length,
398
438
  total: activeMilestoneSlices.length,
399
439
  };
440
+ const sliceStateContext: DerivedStateContext = {
441
+ activeMilestone,
442
+ registry,
443
+ requirements,
444
+ milestoneProgress,
445
+ sliceProgress,
446
+ };
400
447
 
401
448
  if (allSlicesDone) {
402
449
  return handleAllSlicesDone(basePath, activeMilestone, registry, requirements, milestoneProgress, sliceProgress);
@@ -407,21 +454,19 @@ export async function deriveStateFromDb(
407
454
  // If locked slice wasn't found, it returns null but logs warning, we need to return 'blocked'
408
455
  const sliceLock = process.env.GSD_PARALLEL_WORKER ? process.env.GSD_SLICE_LOCK : undefined;
409
456
  if (sliceLock) {
410
- return {
411
- activeMilestone, activeSlice: null, activeTask: null,
412
- phase: 'blocked', recentDecisions: [], blockers: [`GSD_SLICE_LOCK=${sliceLock} not found in active milestone slices`],
413
- nextAction: 'Slice lock references a non-existent slice — check orchestrator dispatch.',
414
- registry, requirements,
415
- progress: { milestones: milestoneProgress, slices: sliceProgress },
416
- };
457
+ return buildDerivedState(
458
+ sliceStateContext,
459
+ 'blocked',
460
+ 'Slice lock references a non-existent slice — check orchestrator dispatch.',
461
+ { blockers: [`GSD_SLICE_LOCK=${sliceLock} not found in active milestone slices`] },
462
+ );
417
463
  }
418
- return {
419
- activeMilestone, activeSlice: null, activeTask: null,
420
- phase: 'blocked', recentDecisions: [], blockers: ['No slice eligible — check dependency ordering'],
421
- nextAction: 'Resolve dependency blockers or plan next slice.',
422
- registry, requirements,
423
- progress: { milestones: milestoneProgress, slices: sliceProgress },
424
- };
464
+ return buildDerivedState(
465
+ sliceStateContext,
466
+ 'blocked',
467
+ 'Resolve dependency blockers or plan next slice.',
468
+ { blockers: ['No slice eligible — check dependency ordering'] },
469
+ );
425
470
  }
426
471
  const { activeSlice } = activeSliceContext;
427
472
  const activeSliceRow = activeSliceContext.activeSliceRow;
@@ -432,13 +477,11 @@ export async function deriveStateFromDb(
432
477
  // PLAN.md and preference flags are projections/configuration and are
433
478
  // deliberately not used to infer whether the slice itself is a sketch.
434
479
  if (activeSliceRow?.is_sketch === 1) {
435
- return {
436
- activeMilestone, activeSlice, activeTask: null,
437
- phase: 'refining', recentDecisions: [], blockers: [],
438
- nextAction: `Refine sketch slice ${activeSlice.id} (${activeSlice.title}) using prior slice context.`,
439
- registry, requirements,
440
- progress: { milestones: milestoneProgress, slices: sliceProgress },
441
- };
480
+ return buildDerivedState(
481
+ { ...sliceStateContext, activeSlice },
482
+ 'refining',
483
+ `Refine sketch slice ${activeSlice.id} (${activeSlice.title}) using prior slice context.`,
484
+ );
442
485
  }
443
486
 
444
487
  const tasks = getSliceTasks(activeMilestone.id, activeSlice.id);
@@ -447,30 +490,35 @@ export async function deriveStateFromDb(
447
490
  done: tasks.filter(t => isStatusDone(t.status)).length,
448
491
  total: tasks.length,
449
492
  };
493
+ const taskStateContext: DerivedStateContext = {
494
+ ...sliceStateContext,
495
+ activeSlice,
496
+ taskProgress,
497
+ };
450
498
 
451
499
  const activeTaskRow = tasks.find(t => !isStatusDone(t.status));
452
500
 
453
501
  if (!activeTaskRow && tasks.length > 0) {
454
- return {
455
- activeMilestone, activeSlice, activeTask: null,
456
- phase: 'summarizing', recentDecisions: [], blockers: [],
457
- nextAction: `All tasks done in ${activeSlice.id}. Write slice summary and complete slice.`,
458
- registry, requirements,
459
- progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
460
- };
502
+ return buildDerivedState(
503
+ taskStateContext,
504
+ 'summarizing',
505
+ `All tasks done in ${activeSlice.id}. Write slice summary and complete slice.`,
506
+ );
461
507
  }
462
508
 
463
509
  if (!activeTaskRow) {
464
- return {
465
- activeMilestone, activeSlice, activeTask: null,
466
- phase: 'planning', recentDecisions: [], blockers: [],
467
- nextAction: `Slice ${activeSlice.id} has no DB tasks. Plan slice tasks before execution.`,
468
- registry, requirements,
469
- progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
470
- };
510
+ return buildDerivedState(
511
+ taskStateContext,
512
+ 'planning',
513
+ `Slice ${activeSlice.id} has no DB tasks. Plan slice tasks before execution.`,
514
+ );
471
515
  }
472
516
 
473
517
  const activeTask: ActiveRef = { id: activeTaskRow.id, title: activeTaskRow.title };
518
+ const activeTaskStateContext: DerivedStateContext = {
519
+ ...taskStateContext,
520
+ activeTask,
521
+ };
474
522
 
475
523
  // ── Quality gate evaluation check ──────────────────────────────────
476
524
  // Pause before execution only when gates owned by the `gate-evaluate`
@@ -485,28 +533,26 @@ export async function deriveStateFromDb(
485
533
  "gate-evaluate",
486
534
  );
487
535
  if (pendingGateCount > 0) {
488
- return {
489
- activeMilestone, activeSlice, activeTask: null,
490
- phase: 'evaluating-gates', recentDecisions: [], blockers: [],
491
- nextAction: `Evaluate ${pendingGateCount} quality gate(s) for ${activeSlice.id} before execution.`,
492
- registry, requirements,
493
- progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
494
- };
536
+ return buildDerivedState(
537
+ taskStateContext,
538
+ 'evaluating-gates',
539
+ `Evaluate ${pendingGateCount} quality gate(s) for ${activeSlice.id} before execution.`,
540
+ );
495
541
  }
496
542
 
497
543
  const blockerTaskId = await detectBlockers(basePath, activeMilestone.id, activeSlice.id, tasks);
498
544
  if (blockerTaskId) {
499
545
  const replanHistory = getReplanHistory(activeMilestone.id, activeSlice.id);
500
546
  if (replanHistory.length === 0) {
501
- return {
502
- activeMilestone, activeSlice, activeTask,
503
- phase: 'replanning-slice', recentDecisions: [],
504
- blockers: [`Task ${blockerTaskId} discovered a blocker requiring slice replan`],
505
- nextAction: `Task ${blockerTaskId} reported blocker_discovered. Replan slice ${activeSlice.id} before continuing.`,
506
- activeWorkspace: undefined,
507
- registry, requirements,
508
- progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
509
- };
547
+ return buildDerivedState(
548
+ activeTaskStateContext,
549
+ 'replanning-slice',
550
+ `Task ${blockerTaskId} reported blocker_discovered. Replan slice ${activeSlice.id} before continuing.`,
551
+ {
552
+ blockers: [`Task ${blockerTaskId} discovered a blocker requiring slice replan`],
553
+ includeActiveWorkspace: true,
554
+ },
555
+ );
510
556
  }
511
557
  }
512
558
 
@@ -522,15 +568,15 @@ export async function deriveStateFromDb(
522
568
  // and the user's prior resolution never lands.
523
569
  const escalatingTaskId = detectPendingEscalation(tasks, basePath);
524
570
  if (escalatingTaskId) {
525
- return {
526
- activeMilestone, activeSlice, activeTask,
527
- phase: 'escalating-task', recentDecisions: [],
528
- blockers: [`Task ${escalatingTaskId} requires a user decision before the loop can proceed`],
529
- nextAction: `Run /gsd escalate show ${escalatingTaskId} to review, then /gsd escalate resolve ${escalatingTaskId} <choice> to proceed.`,
530
- activeWorkspace: undefined,
531
- registry, requirements,
532
- progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
533
- };
571
+ return buildDerivedState(
572
+ activeTaskStateContext,
573
+ 'escalating-task',
574
+ `Run /gsd escalate show ${escalatingTaskId} to review, then /gsd escalate resolve ${escalatingTaskId} <choice> to proceed.`,
575
+ {
576
+ blockers: [`Task ${escalatingTaskId} requires a user decision before the loop can proceed`],
577
+ includeActiveWorkspace: true,
578
+ },
579
+ );
534
580
  }
535
581
 
536
582
  if (!blockerTaskId) {
@@ -538,24 +584,22 @@ export async function deriveStateFromDb(
538
584
  if (isTriggered) {
539
585
  const replanHistory = getReplanHistory(activeMilestone.id, activeSlice.id);
540
586
  if (replanHistory.length === 0) {
541
- return {
542
- activeMilestone, activeSlice, activeTask,
543
- phase: 'replanning-slice', recentDecisions: [],
544
- blockers: ['Triage replan trigger detected slice replan required'],
545
- nextAction: `Triage replan triggered for slice ${activeSlice.id}. Replan before continuing.`,
546
- activeWorkspace: undefined,
547
- registry, requirements,
548
- progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
549
- };
587
+ return buildDerivedState(
588
+ activeTaskStateContext,
589
+ 'replanning-slice',
590
+ `Triage replan triggered for slice ${activeSlice.id}. Replan before continuing.`,
591
+ {
592
+ blockers: ['Triage replan trigger detected — slice replan required'],
593
+ includeActiveWorkspace: true,
594
+ },
595
+ );
550
596
  }
551
597
  }
552
598
  }
553
599
 
554
- return {
555
- activeMilestone, activeSlice, activeTask,
556
- phase: 'executing', recentDecisions: [], blockers: [],
557
- nextAction: `Execute ${activeTask.id}: ${activeTask.title} in slice ${activeSlice.id}.`,
558
- registry, requirements,
559
- progress: { milestones: milestoneProgress, slices: sliceProgress, tasks: taskProgress },
560
- };
600
+ return buildDerivedState(
601
+ activeTaskStateContext,
602
+ 'executing',
603
+ `Execute ${activeTask.id}: ${activeTask.title} in slice ${activeSlice.id}.`,
604
+ );
561
605
  }
@@ -1,6 +1,6 @@
1
1
  import test from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { mkdtempSync, mkdirSync, realpathSync, rmSync, writeFileSync } from "node:fs";
3
+ import { mkdtempSync, mkdirSync, realpathSync, rmSync, utimesSync, writeFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
 
@@ -360,6 +360,174 @@ test("canonical worktree + project-root legacy dir produces legacy filename (#bu
360
360
  }
361
361
  });
362
362
 
363
+ // ── cursor[bot] 3523932401: bare milestone id must not match a team-suffix ────
364
+ //
365
+ // A bare milestone id (M001, no team-mode suffix) resolves its phase dir by
366
+ // scanning phases/NN-*. Before the guard (commit 8f45bf3),
367
+ // phaseDirMatchesMilestoneId returned true for ANY same-number dir, so a
368
+ // leftover team-mode projection (phases/01-<6char>-.../, from a prior
369
+ // team-suffixed run) matched the bare id too. When that stale dir carried a
370
+ // newer mtime, pickPreferredPhaseDir selected it over the real title dir and
371
+ // resolved the ROADMAP into a directory that has no ROADMAP — the file-not-found
372
+ // retry loop. The guard (slugLooksLikeTeamSuffixProjection) rejects
373
+ // team-suffix-looking slugs for bare ids in the primary pass; the suffixed
374
+ // projection stays available only as a fallback when the primary pass finds
375
+ // nothing (#1195, guarded by the second test below).
376
+
377
+ test("bare milestone id prefers the real title dir over a newer team-suffix projection (cursor 3523932401)", () => {
378
+ const root = realpathSync(mkdtempSync(join(tmpdir(), "gsd-bare-teamsuffix-")));
379
+ try {
380
+ const phasesDir = join(root, ".gsd", "phases");
381
+ // Intended flat-phase dir for the bare id: 01-<title-slug>/ with the ROADMAP.
382
+ const intendedDir = join(phasesDir, "01-clean-continuation");
383
+ mkdirSync(intendedDir, { recursive: true });
384
+ writeFileSync(join(intendedDir, "01-ROADMAP.md"), "# roadmap\n");
385
+
386
+ // Leftover team-mode projection: 01-<6char>-.../ with NO ROADMAP, made
387
+ // NEWER so an mtime tiebreak would wrongly prefer it without the guard.
388
+ const staleDir = join(phasesDir, "01-re4q3k-old-team-projection");
389
+ mkdirSync(staleDir, { recursive: true });
390
+ const newer = new Date(Date.now() + 60_000);
391
+ const older = new Date(Date.now() - 60_000);
392
+ utimesSync(staleDir, newer, newer);
393
+ utimesSync(intendedDir, older, older);
394
+
395
+ _clearGsdRootCache();
396
+ clearPathCache();
397
+
398
+ const resolved = resolveExpectedArtifactPath("plan-milestone", "M001", root);
399
+ assert.equal(
400
+ resolved,
401
+ join(intendedDir, "01-ROADMAP.md"),
402
+ "bare id must resolve to the real title dir, not the newer team-suffix projection",
403
+ );
404
+ assert.notEqual(
405
+ resolved,
406
+ join(staleDir, "01-ROADMAP.md"),
407
+ "must NOT resolve into the team-suffix projection dir that has no ROADMAP",
408
+ );
409
+ } finally {
410
+ _clearGsdRootCache();
411
+ clearPathCache();
412
+ rmSync(root, { recursive: true, force: true });
413
+ }
414
+ });
415
+
416
+ test("bare milestone id still falls back to a lone team-suffix projection (#1195)", () => {
417
+ const root = realpathSync(mkdtempSync(join(tmpdir(), "gsd-bare-teamsuffix-only-")));
418
+ try {
419
+ const phasesDir = join(root, ".gsd", "phases");
420
+ // The only on-disk dir for the bare id is a team-mode projection. With no
421
+ // non-suffixed candidate, the fallback pass must still resolve to it.
422
+ const onlyDir = join(phasesDir, "01-re4q3k-clean-continuation");
423
+ mkdirSync(onlyDir, { recursive: true });
424
+ writeFileSync(join(onlyDir, "01-ROADMAP.md"), "# roadmap\n");
425
+
426
+ _clearGsdRootCache();
427
+ clearPathCache();
428
+
429
+ const resolved = resolveExpectedArtifactPath("plan-milestone", "M001", root);
430
+ assert.equal(
431
+ resolved,
432
+ join(onlyDir, "01-ROADMAP.md"),
433
+ "with no non-suffixed dir, the team-suffix projection is the correct fallback",
434
+ );
435
+ } finally {
436
+ _clearGsdRootCache();
437
+ clearPathCache();
438
+ rmSync(root, { recursive: true, force: true });
439
+ }
440
+ });
441
+
442
+ // ── #1208: flat-phase execute-task summaries resolve at the phase root ────────
443
+ //
444
+ // In flat-phase layout task summaries are written beside the plan files
445
+ // (phases/<phase>/T##-SUMMARY.md), NOT under a tasks/ subdir. A tasks/ dir may
446
+ // still exist to hold auxiliary task-scoped gate artifacts (e.g. T01-VERIFY.json).
447
+ // Before the fix, the mere existence of that tasks/ dir redirected summary
448
+ // verification into tasks/T##-SUMMARY.md — which never exists — trapping auto-mode
449
+ // in a false verification retry that eventually paused after a successful task.
450
+
451
+ test("flat-phase execute-task summary resolves at phase root when no tasks/ dir exists (#1208)", () => {
452
+ const root = realpathSync(mkdtempSync(join(tmpdir(), "gsd-flat-task-summary-")));
453
+ try {
454
+ const gsd = join(root, ".gsd");
455
+ const phaseDir = join(gsd, "phases", "49-end-to-end-mandates");
456
+ mkdirSync(phaseDir, { recursive: true });
457
+ writeFileSync(join(phaseDir, "49-03-PLAN.md"), "# plan\n- [x] T02\n");
458
+
459
+ _clearGsdRootCache();
460
+ clearPathCache();
461
+
462
+ assert.equal(
463
+ resolveExpectedArtifactPath("execute-task", "M049/S03/T02", root),
464
+ join(phaseDir, "T02-SUMMARY.md"),
465
+ );
466
+ } finally {
467
+ _clearGsdRootCache();
468
+ clearPathCache();
469
+ rmSync(root, { recursive: true, force: true });
470
+ }
471
+ });
472
+
473
+ test("flat-phase execute-task summary resolves at phase root even when tasks/ dir holds gate artifacts (#1208)", () => {
474
+ const root = realpathSync(mkdtempSync(join(tmpdir(), "gsd-flat-task-tasksdir-")));
475
+ try {
476
+ const gsd = join(root, ".gsd");
477
+ const phaseDir = join(gsd, "phases", "49-end-to-end-mandates");
478
+ mkdirSync(phaseDir, { recursive: true });
479
+ writeFileSync(join(phaseDir, "49-03-PLAN.md"), "# plan\n- [x] T02\n");
480
+ // Auxiliary task-scoped gate artifact — creates the tasks/ dir but must not
481
+ // redirect the T02 summary into tasks/.
482
+ const tasksDir = join(phaseDir, "tasks");
483
+ mkdirSync(tasksDir, { recursive: true });
484
+ writeFileSync(join(tasksDir, "T01-VERIFY.json"), '{"ok":true}');
485
+
486
+ _clearGsdRootCache();
487
+ clearPathCache();
488
+
489
+ const resolved = resolveExpectedArtifactPath("execute-task", "M049/S03/T02", root);
490
+ assert.equal(
491
+ resolved,
492
+ join(phaseDir, "T02-SUMMARY.md"),
493
+ "flat-phase task summary must resolve at the phase root, not tasks/",
494
+ );
495
+ assert.notEqual(
496
+ resolved,
497
+ join(tasksDir, "T02-SUMMARY.md"),
498
+ "a tasks/ dir with gate artifacts must NOT redirect summary resolution into tasks/",
499
+ );
500
+ } finally {
501
+ _clearGsdRootCache();
502
+ clearPathCache();
503
+ rmSync(root, { recursive: true, force: true });
504
+ }
505
+ });
506
+
507
+ test("legacy execute-task summary still resolves under slices/<SID>/tasks/ (#1208 regression guard)", () => {
508
+ const root = realpathSync(mkdtempSync(join(tmpdir(), "gsd-legacy-task-summary-")));
509
+ try {
510
+ const milestoneDir = join(root, ".gsd", "milestones", "M001");
511
+ const sliceDir = join(milestoneDir, "slices", "S01");
512
+ const tasksDir = join(sliceDir, "tasks");
513
+ mkdirSync(tasksDir, { recursive: true });
514
+ writeFileSync(join(milestoneDir, "M001-CONTEXT.md"), "# context\n");
515
+ writeFileSync(join(sliceDir, "S01-PLAN.md"), "# plan\n");
516
+
517
+ _clearGsdRootCache();
518
+ clearPathCache();
519
+
520
+ assert.equal(
521
+ resolveExpectedArtifactPath("execute-task", "M001/S01/T02", root),
522
+ join(tasksDir, "T02-SUMMARY.md"),
523
+ );
524
+ } finally {
525
+ _clearGsdRootCache();
526
+ clearPathCache();
527
+ rmSync(root, { recursive: true, force: true });
528
+ }
529
+ });
530
+
363
531
  // ── resolveSliceResearchLocation / resolveExistingSliceResearchPath ───────────
364
532
  //
365
533
  // Added in the code-quality consolidation PR as the shared dual-path resolver