gsd-pi 2.78.1-dev.b0759e59b → 2.78.1-dev.d8826a445

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 (300) hide show
  1. package/README.md +8 -5
  2. package/dist/headless-recover.d.ts +23 -0
  3. package/dist/headless-recover.js +93 -0
  4. package/dist/headless.js +9 -0
  5. package/dist/help-text.js +1 -0
  6. package/dist/resources/.managed-resources-content-hash +1 -1
  7. package/dist/resources/extensions/browser-tools/tools/intent.js +8 -1
  8. package/dist/resources/extensions/gsd/auto/phases.js +7 -2
  9. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  10. package/dist/resources/extensions/gsd/auto-dispatch.js +7 -58
  11. package/dist/resources/extensions/gsd/auto-post-unit.js +14 -28
  12. package/dist/resources/extensions/gsd/auto-start.js +1 -8
  13. package/dist/resources/extensions/gsd/auto-worktree.js +244 -216
  14. package/dist/resources/extensions/gsd/auto.js +86 -7
  15. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +1 -1
  16. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +9 -77
  17. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -16
  18. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -55
  19. package/dist/resources/extensions/gsd/commands-codebase.js +2 -2
  20. package/dist/resources/extensions/gsd/commands-handlers.js +5 -5
  21. package/dist/resources/extensions/gsd/commands-logs.js +2 -2
  22. package/dist/resources/extensions/gsd/commands-scan.js +2 -2
  23. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  24. package/dist/resources/extensions/gsd/commands-workflow-templates.js +5 -5
  25. package/dist/resources/extensions/gsd/db-writer.js +106 -95
  26. package/dist/resources/extensions/gsd/delegation-policy.js +155 -0
  27. package/dist/resources/extensions/gsd/dispatch-guard.js +6 -10
  28. package/dist/resources/extensions/gsd/doctor-engine-checks.js +2 -2
  29. package/dist/resources/extensions/gsd/gsd-db.js +268 -8
  30. package/dist/resources/extensions/gsd/guided-flow-queue.js +1 -1
  31. package/dist/resources/extensions/gsd/guided-flow.js +141 -32
  32. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -51
  33. package/dist/resources/extensions/gsd/metrics.js +287 -1
  34. package/dist/resources/extensions/gsd/parallel-merge.js +14 -13
  35. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +5 -2
  36. package/dist/resources/extensions/gsd/paths.js +114 -9
  37. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  38. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -3
  39. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +8 -1
  40. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +22 -7
  41. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +6 -2
  42. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -1
  43. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -0
  44. package/dist/resources/extensions/gsd/queue-order.js +6 -1
  45. package/dist/resources/extensions/gsd/rethink.js +2 -2
  46. package/dist/resources/extensions/gsd/state.js +91 -372
  47. package/dist/resources/extensions/gsd/templates/project.md +10 -0
  48. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -5
  49. package/dist/resources/extensions/gsd/tools/complete-slice.js +7 -12
  50. package/dist/resources/extensions/gsd/tools/complete-task.js +19 -31
  51. package/dist/resources/extensions/gsd/tools/validate-milestone.js +7 -5
  52. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -1
  53. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -21
  54. package/dist/resources/extensions/gsd/workflow-mcp.js +2 -2
  55. package/dist/resources/extensions/gsd/workflow-reconcile.js +3 -3
  56. package/dist/resources/extensions/gsd/workspace.js +59 -0
  57. package/dist/resources/extensions/gsd/worktree-command.js +4 -3
  58. package/dist/resources/extensions/gsd/worktree-resolver.js +15 -2
  59. package/dist/resources/extensions/gsd/write-intercept.js +3 -3
  60. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  61. package/dist/web/standalone/.next/BUILD_ID +1 -1
  62. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  63. package/dist/web/standalone/.next/build-manifest.json +2 -2
  64. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  65. package/dist/web/standalone/.next/required-server-files.json +1 -1
  66. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  67. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  68. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  69. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  75. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  77. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  83. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  84. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  85. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  86. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  87. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  88. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  89. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  90. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  91. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  92. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  93. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  94. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  95. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  96. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  97. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  98. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  99. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  100. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  101. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  102. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  103. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  104. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  105. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  106. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  107. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  108. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  109. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  110. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  111. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  112. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  113. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  114. package/dist/web/standalone/.next/server/app/index.html +1 -1
  115. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  122. package/dist/web/standalone/.next/server/chunks/6336.js +1 -0
  123. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  124. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  126. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  127. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  128. package/dist/web/standalone/server.js +1 -1
  129. package/package.json +1 -1
  130. package/packages/mcp-server/README.md +2 -11
  131. package/packages/mcp-server/dist/remote-questions.d.ts +27 -0
  132. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
  133. package/packages/mcp-server/dist/remote-questions.js +28 -0
  134. package/packages/mcp-server/dist/remote-questions.js.map +1 -1
  135. package/packages/mcp-server/dist/server.d.ts +28 -0
  136. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  137. package/packages/mcp-server/dist/server.js +94 -4
  138. package/packages/mcp-server/dist/server.js.map +1 -1
  139. package/packages/mcp-server/dist/workflow-tools.d.ts +6 -0
  140. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  141. package/packages/mcp-server/dist/workflow-tools.js +56 -2
  142. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  143. package/packages/mcp-server/src/mcp-server.test.ts +226 -0
  144. package/packages/mcp-server/src/parse-workflow-args.test.ts +80 -0
  145. package/packages/mcp-server/src/remote-questions.test.ts +103 -0
  146. package/packages/mcp-server/src/remote-questions.ts +35 -0
  147. package/packages/mcp-server/src/server.ts +129 -6
  148. package/packages/mcp-server/src/workflow-tools.ts +62 -3
  149. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  150. package/src/resources/extensions/browser-tools/tools/intent.ts +13 -2
  151. package/src/resources/extensions/gsd/auto/phases.ts +8 -2
  152. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  153. package/src/resources/extensions/gsd/auto-dispatch.ts +14 -62
  154. package/src/resources/extensions/gsd/auto-post-unit.ts +15 -27
  155. package/src/resources/extensions/gsd/auto-start.ts +1 -8
  156. package/src/resources/extensions/gsd/auto-worktree.ts +286 -251
  157. package/src/resources/extensions/gsd/auto.ts +102 -7
  158. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +1 -1
  159. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +9 -84
  160. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +17 -17
  161. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +103 -0
  162. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +80 -55
  163. package/src/resources/extensions/gsd/commands-codebase.ts +2 -2
  164. package/src/resources/extensions/gsd/commands-handlers.ts +5 -5
  165. package/src/resources/extensions/gsd/commands-logs.ts +2 -2
  166. package/src/resources/extensions/gsd/commands-scan.ts +2 -2
  167. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  168. package/src/resources/extensions/gsd/commands-workflow-templates.ts +5 -5
  169. package/src/resources/extensions/gsd/db-writer.ts +123 -94
  170. package/src/resources/extensions/gsd/delegation-policy.ts +197 -0
  171. package/src/resources/extensions/gsd/dispatch-guard.ts +6 -11
  172. package/src/resources/extensions/gsd/doctor-engine-checks.ts +2 -2
  173. package/src/resources/extensions/gsd/gsd-db.ts +269 -8
  174. package/src/resources/extensions/gsd/guided-flow-queue.ts +1 -1
  175. package/src/resources/extensions/gsd/guided-flow.ts +181 -32
  176. package/src/resources/extensions/gsd/markdown-renderer.ts +13 -64
  177. package/src/resources/extensions/gsd/metrics.ts +321 -1
  178. package/src/resources/extensions/gsd/parallel-merge.ts +14 -13
  179. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +5 -2
  180. package/src/resources/extensions/gsd/paths.ts +122 -9
  181. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -4
  182. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -3
  183. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +8 -1
  184. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +22 -7
  185. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +6 -2
  186. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +8 -1
  187. package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -0
  188. package/src/resources/extensions/gsd/queue-order.ts +6 -1
  189. package/src/resources/extensions/gsd/rethink.ts +2 -2
  190. package/src/resources/extensions/gsd/state.ts +91 -389
  191. package/src/resources/extensions/gsd/templates/project.md +10 -0
  192. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +1 -0
  193. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +14 -14
  194. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +6 -0
  195. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +21 -34
  196. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +331 -0
  197. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +176 -0
  198. package/src/resources/extensions/gsd/tests/complete-task-rollback-evidence.test.ts +6 -7
  199. package/src/resources/extensions/gsd/tests/complete-task.test.ts +8 -6
  200. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +12 -27
  201. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +18 -5
  202. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +4 -4
  203. package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +152 -0
  204. package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +221 -0
  205. package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +230 -0
  206. package/src/resources/extensions/gsd/tests/db-writer.test.ts +14 -16
  207. package/src/resources/extensions/gsd/tests/delegation-policy.test.ts +151 -0
  208. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +6 -5
  209. package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +10 -38
  210. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +136 -56
  211. package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +3 -0
  212. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +119 -61
  213. package/src/resources/extensions/gsd/tests/derive-state.test.ts +4 -0
  214. package/src/resources/extensions/gsd/tests/dispatch-backgroundable-annotation.test.ts +55 -0
  215. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +6 -20
  216. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +4 -5
  217. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +14 -15
  218. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +3 -23
  219. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +11 -16
  220. package/src/resources/extensions/gsd/tests/escalation.test.ts +2 -1
  221. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +193 -0
  222. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +246 -0
  223. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +218 -0
  224. package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +117 -0
  225. package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +226 -0
  226. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +2 -1
  227. package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +66 -0
  228. package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +68 -5
  229. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +15 -36
  230. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +4 -4
  231. package/src/resources/extensions/gsd/tests/handler-worktree-write-isolation.test.ts +57 -0
  232. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +15 -15
  233. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +15 -5
  234. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +371 -0
  235. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +14 -8
  236. package/src/resources/extensions/gsd/tests/md-importer.test.ts +2 -1
  237. package/src/resources/extensions/gsd/tests/memory-store.test.ts +3 -2
  238. package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +222 -0
  239. package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +400 -0
  240. package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +141 -0
  241. package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +287 -0
  242. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +149 -0
  243. package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +378 -0
  244. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +329 -0
  245. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +2 -0
  246. package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +209 -0
  247. package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +175 -0
  248. package/src/resources/extensions/gsd/tests/paths-cache.test.ts +170 -0
  249. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +120 -0
  250. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +25 -16
  251. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +1 -0
  252. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +150 -7
  253. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +184 -0
  254. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +6 -1
  255. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +28 -16
  256. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +3 -0
  257. package/src/resources/extensions/gsd/tests/resolve-ts.mjs +4 -0
  258. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +209 -0
  259. package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +3 -4
  260. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +10 -56
  261. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +15 -16
  262. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  263. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +23 -27
  264. package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +13 -14
  265. package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +4 -3
  266. package/src/resources/extensions/gsd/tests/sync-layer-scope.test.ts +453 -0
  267. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +10 -33
  268. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +162 -0
  269. package/src/resources/extensions/gsd/tests/teardown-cleanup-parity.test.ts +102 -0
  270. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +186 -0
  271. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +1 -1
  272. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +7 -8
  273. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +9 -15
  274. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +239 -0
  275. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +12 -7
  276. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +4 -4
  277. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +26 -3
  278. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +9 -15
  279. package/src/resources/extensions/gsd/tests/workspace.test.ts +190 -0
  280. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +13 -0
  281. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +65 -71
  282. package/src/resources/extensions/gsd/tests/worktree-sync-tasks.test.ts +26 -151
  283. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +35 -35
  284. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -52
  285. package/src/resources/extensions/gsd/tests/write-intercept.test.ts +1 -1
  286. package/src/resources/extensions/gsd/tools/complete-milestone.ts +7 -5
  287. package/src/resources/extensions/gsd/tools/complete-slice.ts +7 -14
  288. package/src/resources/extensions/gsd/tools/complete-task.ts +19 -34
  289. package/src/resources/extensions/gsd/tools/validate-milestone.ts +7 -5
  290. package/src/resources/extensions/gsd/workflow-manifest.ts +4 -1
  291. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -18
  292. package/src/resources/extensions/gsd/workflow-mcp.ts +2 -2
  293. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  294. package/src/resources/extensions/gsd/workspace.ts +95 -0
  295. package/src/resources/extensions/gsd/worktree-command.ts +4 -3
  296. package/src/resources/extensions/gsd/worktree-resolver.ts +16 -2
  297. package/src/resources/extensions/gsd/write-intercept.ts +3 -3
  298. package/dist/web/standalone/.next/server/chunks/8527.js +0 -1
  299. /package/dist/web/standalone/.next/static/{rk1EN3FQTE6Z1yalkW_GE → AT5qi39nKXkdmQIOIoh0f}/_buildManifest.js +0 -0
  300. /package/dist/web/standalone/.next/static/{rk1EN3FQTE6Z1yalkW_GE → AT5qi39nKXkdmQIOIoh0f}/_ssgManifest.js +0 -0
@@ -14,7 +14,7 @@ import type { GSDPreferences } from "./preferences.js";
14
14
  import type { UatType } from "./files.js";
15
15
  import type { MinimalModelRegistry } from "./context-budget.js";
16
16
  import { loadFile, extractUatType, loadActiveOverrides } from "./files.js";
17
- import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted, getMilestone, updateMilestoneStatus } from "./gsd-db.js";
17
+ import { isDbAvailable, getMilestoneSlices, getPendingGates, markAllGatesOmitted, getMilestone } from "./gsd-db.js";
18
18
  import { isClosedStatus } from "./status-guards.js";
19
19
  import { extractVerdict, isAcceptableUatVerdict } from "./verdict-parser.js";
20
20
 
@@ -35,7 +35,6 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from "
35
35
  import { logWarning, logError } from "./workflow-logger.js";
36
36
  import { join } from "node:path";
37
37
  import { hasImplementationArtifacts } from "./auto-recovery.js";
38
- import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.js";
39
38
  import {
40
39
  buildDiscussMilestonePrompt,
41
40
  buildDiscussProjectPrompt,
@@ -78,6 +77,7 @@ import {
78
77
  resolveDeepProjectSetupState,
79
78
  type DeepProjectSetupStage,
80
79
  } from "./deep-project-setup-policy.js";
80
+ import { annotateBackgroundable } from "./delegation-policy.js";
81
81
 
82
82
  // ─── Types ────────────────────────────────────────────────────────────────
83
83
 
@@ -90,6 +90,12 @@ export type DispatchAction =
90
90
  pauseAfterDispatch?: boolean;
91
91
  /** Name of the matched dispatch rule from the unified registry (journal provenance). */
92
92
  matchedRule?: string;
93
+ /**
94
+ * True when the matched unit type has a `good` verdict in delegation-policy.ts.
95
+ * Annotated in `resolveDispatch`. Consumers may use this to fork the prompt
96
+ * to a background sub-agent; default behavior is unchanged (synchronous).
97
+ */
98
+ backgroundable?: boolean;
93
99
  }
94
100
  | { action: "stop"; reason: string; level: "info" | "warning" | "error"; matchedRule?: string }
95
101
  | { action: "skip"; matchedRule?: string };
@@ -854,13 +860,9 @@ export const DISPATCH_RULES: DispatchRule[] = [
854
860
  // while a slice is still `is_sketch=1`, fall through to a standard
855
861
  // plan-slice so the loop doesn't dead-end.
856
862
  //
857
- // Note on the flag-OFF downgrade: plan-slice does not explicitly clear
858
- // `is_sketch`. After it writes PLAN.md, the auto-heal in state.ts's
859
- // `deriveStateFromDb` (via `autoHealSketchFlags`) flips the flag on the
860
- // next iteration. That implicit coupling is the sole mechanism that
861
- // reconciles `is_sketch=1` on the plan-slice path — do not remove the
862
- // auto-heal without either adding an explicit `setSliceSketchFlag(..., false)`
863
- // call here or doing so inside the plan-slice tool handler.
863
+ // Note on the flag-OFF downgrade: DB slice metadata is authoritative.
864
+ // PLAN.md is only a projection, so plan-slice/refine-slice handlers must
865
+ // explicitly clear `is_sketch` when a sketch becomes a full plan.
864
866
  name: "refining → refine-slice",
865
867
  match: async ({ state, mid, midTitle, basePath, prefs, sessionContextWindow, modelRegistry, sessionProvider }) => {
866
868
  if (state.phase !== "refining") return null;
@@ -1239,15 +1241,6 @@ export const DISPATCH_RULES: DispatchRule[] = [
1239
1241
  }
1240
1242
  }
1241
1243
 
1242
- const existingSummary = resolveMilestoneFile(basePath, mid, "SUMMARY");
1243
- let summaryOutcome: "success" | "failure" | "unknown" = "unknown";
1244
- if (existingSummary) {
1245
- const summaryContent = await loadFile(existingSummary);
1246
- if (summaryContent) {
1247
- summaryOutcome = classifyMilestoneSummaryContent(summaryContent);
1248
- }
1249
- }
1250
-
1251
1244
  // Safety guard (#2675): block completion when VALIDATION verdict is
1252
1245
  // needs-remediation. The state machine treats needs-remediation as
1253
1246
  // terminal (to prevent validate-milestone loops per #832), but
@@ -1330,48 +1323,6 @@ export const DISPATCH_RULES: DispatchRule[] = [
1330
1323
  logWarning("dispatch", `verification class check failed: ${err instanceof Error ? err.message : String(err)}`);
1331
1324
  }
1332
1325
 
1333
- // Disk/DB mismatch handling (#4658): SUMMARY presence alone is not enough.
1334
- // Apply post-gate policy:
1335
- // - success summary: reconcile DB and skip re-dispatch
1336
- // - failure summary: pause/fail-closed
1337
- // - unknown summary: pause/fail-closed
1338
- if (existingSummary) {
1339
- const milestone = isDbAvailable() ? getMilestone(mid) : null;
1340
- const status = milestone?.status ?? (isDbAvailable() ? "missing" : "unavailable");
1341
-
1342
- if (summaryOutcome === "success") {
1343
- if (!isDbAvailable()) {
1344
- logWarning("dispatch", `Milestone ${mid} SUMMARY indicates completion while DB is unavailable — skipping duplicate complete-milestone dispatch`);
1345
- return { action: "skip" };
1346
- }
1347
- try {
1348
- updateMilestoneStatus(mid, "complete", new Date().toISOString());
1349
- logWarning("dispatch", `Milestone ${mid} SUMMARY indicates completion while DB status was "${status}" — reconciled DB to complete (#4658)`);
1350
- return { action: "skip" };
1351
- } catch (err) {
1352
- return {
1353
- action: "stop",
1354
- level: "warning",
1355
- reason: `Milestone ${mid} SUMMARY indicates completion but DB reconciliation failed (${err instanceof Error ? err.message : String(err)}). Auto-mode paused for manual review.`,
1356
- };
1357
- }
1358
- }
1359
-
1360
- if (summaryOutcome === "failure") {
1361
- return {
1362
- action: "stop",
1363
- level: "warning",
1364
- reason: `Milestone ${mid} has a failure-path SUMMARY while DB status is "${status}". Auto-mode will not promote completion from failure artifacts. Re-run complete-milestone only after blockers are resolved and verification passes.`,
1365
- };
1366
- }
1367
-
1368
- return {
1369
- action: "stop",
1370
- level: "warning",
1371
- reason: `Milestone ${mid} has an ambiguous SUMMARY while DB status is "${status}". Auto-mode paused instead of promoting completion from file presence alone.`,
1372
- };
1373
- }
1374
-
1375
1326
  return {
1376
1327
  action: "dispatch",
1377
1328
  unitType: "complete-milestone",
@@ -1422,7 +1373,7 @@ export async function resolveDispatch(
1422
1373
  // Delegate to registry when available
1423
1374
  try {
1424
1375
  const registry = getRegistry();
1425
- return await registry.evaluateDispatch(ctx);
1376
+ return annotateBackgroundable(await registry.evaluateDispatch(ctx));
1426
1377
  } catch (err) {
1427
1378
  // Registry not initialized — fall back to inline loop
1428
1379
  logWarning("dispatch", `registry dispatch failed, falling back to inline rules: ${err instanceof Error ? err.message : String(err)}`);
@@ -1432,7 +1383,7 @@ export async function resolveDispatch(
1432
1383
  const result = await rule.match(ctx);
1433
1384
  if (result) {
1434
1385
  if (result.action !== "skip") result.matchedRule = rule.name;
1435
- return result;
1386
+ return annotateBackgroundable(result);
1436
1387
  }
1437
1388
  }
1438
1389
 
@@ -1448,6 +1399,7 @@ export async function resolveDispatch(
1448
1399
  };
1449
1400
  }
1450
1401
 
1402
+
1451
1403
  /** Exposed for testing — returns the rule names in evaluation order. */
1452
1404
  export function getDispatchRuleNames(): string[] {
1453
1405
  return DISPATCH_RULES.map((r) => r.name);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Post-unit processing for auto-loop — auto-commit, doctor run,
3
- * state rebuild, worktree sync, DB dual-write, hooks, triage, and
3
+ * state rebuild, projection checks, DB tool closeout, hooks, triage, and
4
4
  * quick-task dispatch.
5
5
  *
6
6
  * Split into two functions called sequentially by auto-loop with
@@ -42,7 +42,8 @@ import {
42
42
  } from "./auto-recovery.js";
43
43
  import { regenerateIfMissing } from "./workflow-projections.js";
44
44
  import { syncStateToProjectRoot } from "./auto-worktree.js";
45
- import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, updateSliceStatus, _getAdapter } from "./gsd-db.js";
45
+ import { normalizeWorktreePathForCompare } from "./worktree-root.js";
46
+ import { isDbAvailable, getTask, getSlice, getMilestone, updateTaskStatus, _getAdapter } from "./gsd-db.js";
46
47
  import { renderPlanCheckboxes } from "./markdown-renderer.js";
47
48
  import { consumeSignal } from "./session-status-io.js";
48
49
  import {
@@ -80,6 +81,12 @@ import {
80
81
  } from "./project-research-policy.js";
81
82
  import { validateArtifact } from "./schemas/validate.js";
82
83
 
84
+ // ─── Path Comparison Helper ───────────────────────────────────────────────
85
+ /** Compare two paths for physical identity, tolerating trailing slashes and symlinks. */
86
+ function isSamePathLocal(a: string, b: string): boolean {
87
+ return normalizeWorktreePathForCompare(a) === normalizeWorktreePathForCompare(b);
88
+ }
89
+
83
90
  /** Maximum verification retry attempts before escalating to blocker placeholder (#2653). */
84
91
  const MAX_VERIFICATION_RETRIES = 3;
85
92
  /** Keep failure toasts short while still showing concrete examples. */
@@ -160,9 +167,8 @@ export interface RogueFileWrite {
160
167
  * the completion tool. A "rogue" file is one that exists on disk but has
161
168
  * no corresponding DB row with status "complete".
162
169
  *
163
- * This is a safety-net diagnostic (D003). The existing migrateFromMarkdown()
164
- * in postUnitPostVerification() eventually ingests rogue files, but explicit
165
- * detection provides immediate diagnostics so operators know the prompt failed.
170
+ * This is a safety-net diagnostic (D003). Runtime detection never imports
171
+ * markdown into the DB; explicit migration/import/recovery commands own that.
166
172
  */
167
173
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
168
174
  function hasNonEmptyFields(row: Record<string, any> | null, fields: string[]): boolean {
@@ -201,14 +207,7 @@ export function detectRogueFileWrites(
201
207
 
202
208
  const dbRow = getSlice(mid, sid);
203
209
  if (!dbRow || dbRow.status !== "complete") {
204
- // Auto-remediate: SUMMARY exists on disk but DB is stale — sync DB to
205
- // match filesystem instead of reporting as rogue (#3633).
206
- try {
207
- updateSliceStatus(mid, sid, "complete", new Date().toISOString());
208
- } catch {
209
- // If DB update fails, fall back to rogue detection so the issue is visible
210
- rogues.push({ path: summaryPath, unitType, unitId });
211
- }
210
+ rogues.push({ path: summaryPath, unitType, unitId });
212
211
  }
213
212
  } else if (unitType === "plan-milestone") {
214
213
  if (!mid) return [];
@@ -625,7 +624,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
625
624
  });
626
625
 
627
626
  // Sync worktree state back to project root (skipped for lightweight sidecars)
628
- if (!opts?.skipWorktreeSync && s.originalBasePath && s.originalBasePath !== s.basePath) {
627
+ if (!opts?.skipWorktreeSync && s.originalBasePath && !isSamePathLocal(s.originalBasePath, s.basePath)) {
629
628
  await runSafely("postUnit", "worktree-sync", () => {
630
629
  syncStateToProjectRoot(s.basePath, s.originalBasePath!, s.currentMilestoneId);
631
630
  });
@@ -738,7 +737,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
738
737
  "error",
739
738
  );
740
739
  // Stop auto AND signal the outer postUnit flow to exit early.
741
- // Without the flag, subsequent hooks (triage, rogue detection,
740
+ // Without the flag, subsequent hooks (triage,
742
741
  // DB writes) would keep running against a conflicted main
743
742
  // checkout after the loop was already told to stop.
744
743
  const { stopAuto } = await import("./auto.js");
@@ -758,7 +757,7 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
758
757
  }
759
758
  });
760
759
  // Exit early after stopAuto so the rest of post-unit processing
761
- // (triage, rogue detection, hook dispatch, DB writes) doesn't run
760
+ // (triage, hook dispatch, DB writes) doesn't run
762
761
  // against a conflicted main checkout. Return "dispatched" to match
763
762
  // the convention used by other stop/pauseAuto paths in this function
764
763
  // (see signal handling earlier: stop/pause also return "dispatched").
@@ -813,17 +812,6 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
813
812
  }
814
813
  }
815
814
 
816
- // Rogue file detection — safety net for LLM bypassing completion tools (D003)
817
- try {
818
- const rogueFiles = detectRogueFileWrites(s.currentUnit.type, s.currentUnit.id, s.basePath);
819
- for (const rogue of rogueFiles) {
820
- logWarning("engine", "rogue file write detected", { path: rogue.path, unitId: rogue.unitId });
821
- ctx.ui.notify(`Rogue file write detected: ${rogue.path}`, "warning");
822
- }
823
- } catch (e) {
824
- debugLog("postUnit", { phase: "rogue-detection", error: String(e) });
825
- }
826
-
827
815
  // ── Safety harness: post-unit validation ──
828
816
  try {
829
817
  const { loadEffectiveGSDPreferences } = await import("./preferences.js");
@@ -855,18 +855,11 @@ export async function bootstrapAutoSession(
855
855
  const gsdDbPath = resolveProjectRootDbPath(s.basePath);
856
856
  const gsdDirPath = join(s.basePath, ".gsd");
857
857
  if (existsSync(gsdDirPath) && !existsSync(gsdDbPath)) {
858
- const hasDecisions = existsSync(join(gsdDirPath, "DECISIONS.md"));
859
- const hasRequirements = existsSync(join(gsdDirPath, "REQUIREMENTS.md"));
860
- const hasMilestones = existsSync(join(gsdDirPath, "milestones"));
861
858
  try {
862
859
  const { openDatabase: openDb } = await import("./gsd-db.js");
863
860
  openDb(gsdDbPath);
864
- if (hasDecisions || hasRequirements || hasMilestones) {
865
- const { migrateFromMarkdown } = await import("./md-importer.js");
866
- migrateFromMarkdown(s.basePath);
867
- }
868
861
  } catch (err) {
869
- logError("engine", `auto-migration failed: ${(err as Error).message}`);
862
+ logError("engine", `failed to initialize project database: ${(err as Error).message}`);
870
863
  }
871
864
  }
872
865
  if (existsSync(gsdDbPath) && !isDbAvailable()) {