@opengsd/gsd-pi 1.8.1 → 1.9.0-dev.97ef11e3

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 (613) hide show
  1. package/README.md +10 -8
  2. package/dist/cli.js +5 -1
  3. package/dist/headless-events.d.ts +2 -1
  4. package/dist/headless-events.js +11 -3
  5. package/dist/headless-milestone-readiness.d.ts +29 -0
  6. package/dist/headless-milestone-readiness.js +161 -0
  7. package/dist/headless.js +27 -3
  8. package/dist/print-mode-exit.d.ts +12 -0
  9. package/dist/print-mode-exit.js +14 -0
  10. package/dist/resources/.managed-resources-content-hash +1 -1
  11. package/dist/resources/GSD-WORKFLOW.md +18 -49
  12. package/dist/resources/extensions/browser-tools/capture.js +2 -77
  13. package/dist/resources/extensions/browser-tools/screenshot-constraints.js +83 -0
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +17 -2
  15. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +30 -2
  16. package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
  17. package/dist/resources/extensions/gsd/auto/loop.js +24 -4
  18. package/dist/resources/extensions/gsd/auto/run-unit.js +19 -1
  19. package/dist/resources/extensions/gsd/auto/unit-phase.js +37 -5
  20. package/dist/resources/extensions/gsd/auto-artifact-paths.js +16 -10
  21. package/dist/resources/extensions/gsd/auto-dispatch.js +76 -19
  22. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
  23. package/dist/resources/extensions/gsd/auto-prompts.js +137 -22
  24. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  25. package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -5
  26. package/dist/resources/extensions/gsd/auto-start.js +29 -9
  27. package/dist/resources/extensions/gsd/auto-tool-tracking.js +40 -0
  28. package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
  29. package/dist/resources/extensions/gsd/auto-worktree-sync.js +7 -3
  30. package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
  31. package/dist/resources/extensions/gsd/auto.js +20 -6
  32. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -4
  33. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -7
  34. package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -50
  36. package/dist/resources/extensions/gsd/command-feedback.js +16 -12
  37. package/dist/resources/extensions/gsd/commands-verdict.js +10 -9
  38. package/dist/resources/extensions/gsd/compat/compat-marker.js +98 -6
  39. package/dist/resources/extensions/gsd/constants.js +12 -13
  40. package/dist/resources/extensions/gsd/context-masker.js +97 -21
  41. package/dist/resources/extensions/gsd/db/command-queue.js +7 -2
  42. package/dist/resources/extensions/gsd/db/engine.js +56 -18
  43. package/dist/resources/extensions/gsd/db/writers/cascades.js +5 -1
  44. package/dist/resources/extensions/gsd/db/writers/status.js +13 -3
  45. package/dist/resources/extensions/gsd/db-base-schema.js +28 -0
  46. package/dist/resources/extensions/gsd/db-migration-steps.js +30 -0
  47. package/dist/resources/extensions/gsd/db-schema-metadata.js +4 -1
  48. package/dist/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  49. package/dist/resources/extensions/gsd/doctor-engine-checks.js +24 -8
  50. package/dist/resources/extensions/gsd/error-classifier.js +12 -2
  51. package/dist/resources/extensions/gsd/exec-sandbox.js +1 -0
  52. package/dist/resources/extensions/gsd/flat-phase-migration.js +168 -21
  53. package/dist/resources/extensions/gsd/git-service.js +19 -7
  54. package/dist/resources/extensions/gsd/gsd-db.js +262 -76
  55. package/dist/resources/extensions/gsd/guided-flow.js +40 -15
  56. package/dist/resources/extensions/gsd/markdown-renderer.js +20 -22
  57. package/dist/resources/extensions/gsd/md-importer.js +107 -20
  58. package/dist/resources/extensions/gsd/migrate/command.js +19 -162
  59. package/dist/resources/extensions/gsd/migrate/execution.js +98 -0
  60. package/dist/resources/extensions/gsd/migrate/plan.js +49 -0
  61. package/dist/resources/extensions/gsd/migrate/planning-writer.js +12 -17
  62. package/dist/resources/extensions/gsd/migrate/presentation.js +64 -0
  63. package/dist/resources/extensions/gsd/model-cost-table.js +2 -0
  64. package/dist/resources/extensions/gsd/model-router.js +11 -0
  65. package/dist/resources/extensions/gsd/parallel-eligibility.js +5 -4
  66. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +28 -43
  67. package/dist/resources/extensions/gsd/paths.js +70 -16
  68. package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
  69. package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
  70. package/dist/resources/extensions/gsd/planning-subagent-registry.js +25 -0
  71. package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
  72. package/dist/resources/extensions/gsd/preferences-types.js +5 -0
  73. package/dist/resources/extensions/gsd/preferences-validation.js +48 -1
  74. package/dist/resources/extensions/gsd/preferences.js +17 -0
  75. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  76. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
  77. package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
  78. package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
  79. package/dist/resources/extensions/gsd/safety/evidence-collector.js +26 -1
  80. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +30 -5
  81. package/dist/resources/extensions/gsd/skill-activation.js +17 -3
  82. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +125 -15
  83. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +17 -4
  84. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +5 -2
  85. package/dist/resources/extensions/gsd/stop-notice.js +24 -1
  86. package/dist/resources/extensions/gsd/sync-lock.js +13 -7
  87. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  88. package/dist/resources/extensions/gsd/tools/complete-task.js +94 -6
  89. package/dist/resources/extensions/gsd/tools/plan-task.js +13 -15
  90. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +18 -15
  91. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
  92. package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
  93. package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
  94. package/dist/resources/extensions/gsd/tools/replan-task.js +128 -0
  95. package/dist/resources/extensions/gsd/tools/rework-brief.js +74 -0
  96. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +81 -0
  97. package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
  98. package/dist/resources/extensions/gsd/unit-registry.js +4 -0
  99. package/dist/resources/extensions/gsd/uok/plan-v2.js +19 -3
  100. package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
  101. package/dist/resources/extensions/gsd/workspace.js +2 -1
  102. package/dist/resources/extensions/gsd/worktree-state-projection.js +26 -18
  103. package/dist/resources/extensions/mac-tools/index.js +31 -9
  104. package/dist/resources/extensions/shared/interview-ui.js +43 -6
  105. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  106. package/dist/web/standalone/.next/BUILD_ID +1 -1
  107. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  108. package/dist/web/standalone/.next/build-manifest.json +3 -3
  109. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  110. package/dist/web/standalone/.next/required-server-files.json +3 -3
  111. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  112. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  122. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  131. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  138. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  150. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  172. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  188. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  204. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  208. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/index.html +1 -1
  218. package/dist/web/standalone/.next/server/app/index.rsc +5 -5
  219. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  220. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
  221. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  222. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  223. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  224. package/dist/web/standalone/.next/server/app/page.js +2 -2
  225. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  227. package/dist/web/standalone/.next/server/chunks/1991.js +2 -2
  228. package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
  229. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  230. package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
  231. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/middleware.js +3 -3
  233. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  234. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  235. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  236. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
  237. package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
  238. package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
  239. package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
  240. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
  241. package/dist/web/standalone/.next/static/css/3b1ceb7abfb9a230.css +1 -0
  242. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  243. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  244. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  245. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  246. package/dist/web/standalone/package.json +0 -1
  247. package/dist/web/standalone/server.js +1 -1
  248. package/dist/web-mode.js +31 -3
  249. package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
  250. package/integrations/hermes/pyproject.toml +1 -1
  251. package/package.json +13 -10
  252. package/packages/cloud-mcp-gateway/package.json +2 -2
  253. package/packages/contracts/dist/workflow.d.ts +14 -0
  254. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  255. package/packages/contracts/dist/workflow.js +16 -0
  256. package/packages/contracts/dist/workflow.js.map +1 -1
  257. package/packages/contracts/package.json +1 -1
  258. package/packages/daemon/dist/cloud-config.d.ts +1 -1
  259. package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
  260. package/packages/daemon/dist/cloud-config.js +5 -1
  261. package/packages/daemon/dist/cloud-config.js.map +1 -1
  262. package/packages/daemon/dist/cloud-config.test.js +51 -1
  263. package/packages/daemon/dist/cloud-config.test.js.map +1 -1
  264. package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -1
  265. package/packages/daemon/dist/local-tool-executor.js +2 -0
  266. package/packages/daemon/dist/local-tool-executor.js.map +1 -1
  267. package/packages/daemon/package.json +6 -6
  268. package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
  269. package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
  270. package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
  271. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  272. package/packages/gsd-agent-core/dist/sdk.js +1 -0
  273. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  274. package/packages/gsd-agent-core/package.json +5 -5
  275. package/packages/gsd-agent-modes/package.json +7 -7
  276. package/packages/gsd-cloud/README.md +9 -3
  277. package/packages/gsd-cloud/dist/background-cli.test.d.ts +2 -0
  278. package/packages/gsd-cloud/dist/background-cli.test.d.ts.map +1 -0
  279. package/packages/gsd-cloud/dist/background-cli.test.js +248 -0
  280. package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -0
  281. package/packages/gsd-cloud/dist/cli.d.ts +5 -0
  282. package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
  283. package/packages/gsd-cloud/dist/cli.js +266 -0
  284. package/packages/gsd-cloud/dist/cli.js.map +1 -0
  285. package/packages/gsd-cloud/dist/cloud-config.d.ts +19 -0
  286. package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -0
  287. package/packages/gsd-cloud/dist/cloud-config.js +237 -0
  288. package/packages/gsd-cloud/dist/cloud-config.js.map +1 -0
  289. package/packages/gsd-cloud/dist/cloud-config.test.d.ts +2 -0
  290. package/packages/gsd-cloud/dist/cloud-config.test.d.ts.map +1 -0
  291. package/packages/gsd-cloud/dist/cloud-config.test.js +118 -0
  292. package/packages/gsd-cloud/dist/cloud-config.test.js.map +1 -0
  293. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts +2 -0
  294. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts.map +1 -0
  295. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js +37 -0
  296. package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js.map +1 -0
  297. package/packages/gsd-cloud/dist/cloud-runtime.d.ts +33 -0
  298. package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
  299. package/packages/gsd-cloud/dist/cloud-runtime.js +260 -0
  300. package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -0
  301. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts +2 -0
  302. package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts.map +1 -0
  303. package/packages/gsd-cloud/dist/cloud-runtime.test.js +88 -0
  304. package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -0
  305. package/packages/gsd-cloud/dist/cloud-token.d.ts +3 -0
  306. package/packages/gsd-cloud/dist/cloud-token.d.ts.map +1 -0
  307. package/packages/gsd-cloud/dist/cloud-token.js +37 -0
  308. package/packages/gsd-cloud/dist/cloud-token.js.map +1 -0
  309. package/packages/gsd-cloud/dist/config.d.ts +17 -0
  310. package/packages/gsd-cloud/dist/config.d.ts.map +1 -0
  311. package/packages/gsd-cloud/dist/config.js +146 -0
  312. package/packages/gsd-cloud/dist/config.js.map +1 -0
  313. package/packages/gsd-cloud/dist/device-flow.d.ts +24 -0
  314. package/packages/gsd-cloud/dist/device-flow.d.ts.map +1 -0
  315. package/packages/gsd-cloud/dist/device-flow.js +128 -0
  316. package/packages/gsd-cloud/dist/device-flow.js.map +1 -0
  317. package/packages/gsd-cloud/dist/device-flow.test.d.ts +2 -0
  318. package/packages/gsd-cloud/dist/device-flow.test.d.ts.map +1 -0
  319. package/packages/gsd-cloud/dist/device-flow.test.js +155 -0
  320. package/packages/gsd-cloud/dist/device-flow.test.js.map +1 -0
  321. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts +6 -0
  322. package/packages/gsd-cloud/dist/executors/claude-executor.d.ts.map +1 -0
  323. package/packages/gsd-cloud/dist/executors/claude-executor.js +15 -0
  324. package/packages/gsd-cloud/dist/executors/claude-executor.js.map +1 -0
  325. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts +6 -0
  326. package/packages/gsd-cloud/dist/executors/codex-executor.d.ts.map +1 -0
  327. package/packages/gsd-cloud/dist/executors/codex-executor.js +15 -0
  328. package/packages/gsd-cloud/dist/executors/codex-executor.js.map +1 -0
  329. package/packages/gsd-cloud/dist/executors/executor.d.ts +28 -0
  330. package/packages/gsd-cloud/dist/executors/executor.d.ts.map +1 -0
  331. package/packages/gsd-cloud/dist/executors/executor.js +11 -0
  332. package/packages/gsd-cloud/dist/executors/executor.js.map +1 -0
  333. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts +34 -0
  334. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts.map +1 -0
  335. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js +179 -0
  336. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js.map +1 -0
  337. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts +2 -0
  338. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts.map +1 -0
  339. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js +44 -0
  340. package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js.map +1 -0
  341. package/packages/gsd-cloud/dist/executors/index.d.ts +17 -0
  342. package/packages/gsd-cloud/dist/executors/index.d.ts.map +1 -0
  343. package/packages/gsd-cloud/dist/executors/index.js +29 -0
  344. package/packages/gsd-cloud/dist/executors/index.js.map +1 -0
  345. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts +36 -0
  346. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts.map +1 -0
  347. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js +176 -0
  348. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js.map +1 -0
  349. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts +2 -0
  350. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts.map +1 -0
  351. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js +34 -0
  352. package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js.map +1 -0
  353. package/packages/gsd-cloud/dist/index.d.ts +7 -0
  354. package/packages/gsd-cloud/dist/index.d.ts.map +1 -0
  355. package/packages/gsd-cloud/dist/index.js +8 -0
  356. package/packages/gsd-cloud/dist/index.js.map +1 -0
  357. package/packages/gsd-cloud/dist/inject-gateway.d.ts +16 -0
  358. package/packages/gsd-cloud/dist/inject-gateway.d.ts.map +1 -0
  359. package/packages/gsd-cloud/dist/inject-gateway.js +29 -0
  360. package/packages/gsd-cloud/dist/inject-gateway.js.map +1 -0
  361. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts +2 -0
  362. package/packages/gsd-cloud/dist/inject-gateway.test.d.ts.map +1 -0
  363. package/packages/gsd-cloud/dist/inject-gateway.test.js +41 -0
  364. package/packages/gsd-cloud/dist/inject-gateway.test.js.map +1 -0
  365. package/packages/gsd-cloud/dist/logger.d.ts +25 -0
  366. package/packages/gsd-cloud/dist/logger.d.ts.map +1 -0
  367. package/packages/gsd-cloud/dist/logger.js +72 -0
  368. package/packages/gsd-cloud/dist/logger.js.map +1 -0
  369. package/packages/gsd-cloud/dist/runtime-process.d.ts +27 -0
  370. package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -0
  371. package/packages/gsd-cloud/dist/runtime-process.js +272 -0
  372. package/packages/gsd-cloud/dist/runtime-process.js.map +1 -0
  373. package/packages/gsd-cloud/dist/runtime-process.test.d.ts +2 -0
  374. package/packages/gsd-cloud/dist/runtime-process.test.d.ts.map +1 -0
  375. package/packages/gsd-cloud/dist/runtime-process.test.js +97 -0
  376. package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -0
  377. package/packages/gsd-cloud/dist/types.d.ts +51 -0
  378. package/packages/gsd-cloud/dist/types.d.ts.map +1 -0
  379. package/packages/gsd-cloud/dist/types.js +9 -0
  380. package/packages/gsd-cloud/dist/types.js.map +1 -0
  381. package/packages/gsd-cloud/package.json +3 -3
  382. package/packages/mcp-server/README.md +15 -2
  383. package/packages/mcp-server/dist/cli-runner.d.ts +3 -0
  384. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
  385. package/packages/mcp-server/dist/cli-runner.js +119 -33
  386. package/packages/mcp-server/dist/cli-runner.js.map +1 -1
  387. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  388. package/packages/mcp-server/dist/server.js +5 -5
  389. package/packages/mcp-server/dist/server.js.map +1 -1
  390. package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
  391. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  392. package/packages/mcp-server/dist/workflow-tools.js +64 -2
  393. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  394. package/packages/mcp-server/package.json +4 -4
  395. package/packages/native/package.json +1 -1
  396. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  397. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  398. package/packages/pi-agent-core/dist/agent.js +2 -0
  399. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  400. package/packages/pi-agent-core/package.json +1 -1
  401. package/packages/pi-ai/dist/models.generated.d.ts +136 -0
  402. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  403. package/packages/pi-ai/dist/models.generated.js +124 -0
  404. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  405. package/packages/pi-ai/dist/providers/amazon-bedrock.js +1 -0
  406. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  407. package/packages/pi-ai/dist/providers/anthropic.js +25 -1
  408. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  409. package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
  410. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  411. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  412. package/packages/pi-ai/dist/providers/openai-completions.js +103 -0
  413. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  414. package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
  415. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  416. package/packages/pi-ai/package.json +1 -1
  417. package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
  418. package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
  419. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -1
  420. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  421. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +11 -1
  422. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  423. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  424. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  425. package/packages/pi-coding-agent/package.json +7 -7
  426. package/packages/pi-tui/package.json +2 -2
  427. package/packages/rpc-client/package.json +2 -2
  428. package/pkg/package.json +1 -1
  429. package/src/resources/GSD-WORKFLOW.md +18 -49
  430. package/src/resources/extensions/browser-tools/capture.ts +2 -86
  431. package/src/resources/extensions/browser-tools/screenshot-constraints.ts +94 -0
  432. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -1
  433. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -0
  434. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +30 -2
  435. package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
  436. package/src/resources/extensions/gsd/auto/loop.ts +48 -4
  437. package/src/resources/extensions/gsd/auto/run-unit.ts +20 -1
  438. package/src/resources/extensions/gsd/auto/unit-phase.ts +41 -5
  439. package/src/resources/extensions/gsd/auto-artifact-paths.ts +16 -9
  440. package/src/resources/extensions/gsd/auto-dispatch.ts +87 -19
  441. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
  442. package/src/resources/extensions/gsd/auto-prompts.ts +156 -20
  443. package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
  444. package/src/resources/extensions/gsd/auto-runtime-state.ts +12 -7
  445. package/src/resources/extensions/gsd/auto-start.ts +31 -8
  446. package/src/resources/extensions/gsd/auto-tool-tracking.ts +56 -0
  447. package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
  448. package/src/resources/extensions/gsd/auto-worktree-sync.ts +10 -3
  449. package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
  450. package/src/resources/extensions/gsd/auto.ts +25 -8
  451. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +92 -4
  452. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -12
  453. package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
  454. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +87 -53
  455. package/src/resources/extensions/gsd/command-feedback.ts +19 -12
  456. package/src/resources/extensions/gsd/commands-verdict.ts +16 -9
  457. package/src/resources/extensions/gsd/compat/compat-marker.ts +119 -8
  458. package/src/resources/extensions/gsd/constants.ts +14 -13
  459. package/src/resources/extensions/gsd/context-masker.ts +98 -2
  460. package/src/resources/extensions/gsd/db/command-queue.ts +7 -1
  461. package/src/resources/extensions/gsd/db/engine.ts +58 -19
  462. package/src/resources/extensions/gsd/db/writers/cascades.ts +5 -1
  463. package/src/resources/extensions/gsd/db/writers/status.ts +25 -8
  464. package/src/resources/extensions/gsd/db-base-schema.ts +30 -0
  465. package/src/resources/extensions/gsd/db-migration-steps.ts +32 -0
  466. package/src/resources/extensions/gsd/db-schema-metadata.ts +4 -1
  467. package/src/resources/extensions/gsd/docs/preferences-reference.md +26 -4
  468. package/src/resources/extensions/gsd/doctor-engine-checks.ts +30 -7
  469. package/src/resources/extensions/gsd/error-classifier.ts +13 -2
  470. package/src/resources/extensions/gsd/exec-sandbox.ts +1 -0
  471. package/src/resources/extensions/gsd/flat-phase-migration.ts +174 -19
  472. package/src/resources/extensions/gsd/git-service.ts +19 -6
  473. package/src/resources/extensions/gsd/gsd-db.ts +340 -85
  474. package/src/resources/extensions/gsd/guided-flow.ts +50 -14
  475. package/src/resources/extensions/gsd/markdown-renderer.ts +28 -30
  476. package/src/resources/extensions/gsd/md-importer.ts +114 -16
  477. package/src/resources/extensions/gsd/migrate/command.ts +21 -227
  478. package/src/resources/extensions/gsd/migrate/execution.ts +136 -0
  479. package/src/resources/extensions/gsd/migrate/plan.ts +101 -0
  480. package/src/resources/extensions/gsd/migrate/planning-writer.ts +12 -20
  481. package/src/resources/extensions/gsd/migrate/presentation.ts +83 -0
  482. package/src/resources/extensions/gsd/model-cost-table.ts +2 -0
  483. package/src/resources/extensions/gsd/model-router.ts +12 -0
  484. package/src/resources/extensions/gsd/parallel-eligibility.ts +5 -4
  485. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +37 -40
  486. package/src/resources/extensions/gsd/paths.ts +77 -16
  487. package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
  488. package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
  489. package/src/resources/extensions/gsd/planning-subagent-registry.ts +31 -0
  490. package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
  491. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  492. package/src/resources/extensions/gsd/preferences-validation.ts +62 -0
  493. package/src/resources/extensions/gsd/preferences.ts +25 -0
  494. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  495. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
  496. package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
  497. package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
  498. package/src/resources/extensions/gsd/safety/evidence-collector.ts +28 -1
  499. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +31 -5
  500. package/src/resources/extensions/gsd/skill-activation.ts +17 -3
  501. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +162 -15
  502. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +20 -4
  503. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +4 -2
  504. package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
  505. package/src/resources/extensions/gsd/stop-notice.ts +29 -1
  506. package/src/resources/extensions/gsd/sync-lock.ts +14 -6
  507. package/src/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
  508. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
  509. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +264 -0
  510. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
  511. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +21 -1
  512. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +74 -1
  513. package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
  514. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +96 -1
  515. package/src/resources/extensions/gsd/tests/command-feedback.test.ts +12 -0
  516. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +10 -0
  517. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +129 -0
  518. package/src/resources/extensions/gsd/tests/complete-task.test.ts +362 -1
  519. package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
  520. package/src/resources/extensions/gsd/tests/db-engine-cjs-compat.test.ts +12 -0
  521. package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
  522. package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
  523. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
  524. package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
  525. package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
  526. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +123 -0
  527. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +50 -0
  528. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +49 -0
  529. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +83 -0
  530. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +81 -0
  531. package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +22 -0
  532. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +33 -1
  533. package/src/resources/extensions/gsd/tests/external-edit-scoped-import.test.ts +262 -0
  534. package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +38 -1
  535. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +201 -0
  536. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +20 -1
  537. package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
  538. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +57 -0
  539. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +22 -0
  540. package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -0
  541. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +13 -0
  542. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
  543. package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
  544. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
  545. package/src/resources/extensions/gsd/tests/migrate-plan.test.ts +68 -0
  546. package/src/resources/extensions/gsd/tests/migrate-presentation.test.ts +98 -0
  547. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
  548. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +55 -0
  549. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
  550. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  551. package/src/resources/extensions/gsd/tests/parallel-eligibility-file-overlap.test.ts +146 -0
  552. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +59 -0
  553. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
  554. package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +32 -4
  555. package/src/resources/extensions/gsd/tests/plan-task.test.ts +26 -23
  556. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +29 -0
  557. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +22 -0
  558. package/src/resources/extensions/gsd/tests/preferences.test.ts +84 -0
  559. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +4 -0
  560. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +87 -0
  561. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +121 -1
  562. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
  563. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +50 -0
  564. package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +105 -0
  565. package/src/resources/extensions/gsd/tests/replan-task-handler.test.ts +103 -0
  566. package/src/resources/extensions/gsd/tests/rework-brief.test.ts +197 -0
  567. package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
  568. package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
  569. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
  570. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +21 -0
  571. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +52 -0
  572. package/src/resources/extensions/gsd/tests/stop-notice.test.ts +38 -1
  573. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +19 -0
  574. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
  575. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +14 -0
  576. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
  577. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
  578. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +73 -0
  579. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +93 -1
  580. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +7 -0
  581. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -0
  582. package/src/resources/extensions/gsd/tests/workflow-migration-gates.test.ts +139 -0
  583. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
  584. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
  585. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +60 -0
  586. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
  587. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
  588. package/src/resources/extensions/gsd/tools/complete-task.ts +140 -5
  589. package/src/resources/extensions/gsd/tools/plan-task.ts +14 -16
  590. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +18 -17
  591. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
  592. package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
  593. package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
  594. package/src/resources/extensions/gsd/tools/replan-task.ts +160 -0
  595. package/src/resources/extensions/gsd/tools/rework-brief.ts +91 -0
  596. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +92 -0
  597. package/src/resources/extensions/gsd/types.ts +11 -0
  598. package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
  599. package/src/resources/extensions/gsd/unit-registry.ts +4 -0
  600. package/src/resources/extensions/gsd/uok/plan-v2.ts +20 -3
  601. package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
  602. package/src/resources/extensions/gsd/workspace.ts +2 -1
  603. package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -24
  604. package/src/resources/extensions/mac-tools/index.ts +52 -9
  605. package/src/resources/extensions/mac-tools/tests/mac-screenshot-payload.test.cjs +70 -0
  606. package/src/resources/extensions/shared/interview-ui.ts +47 -8
  607. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +29 -0
  608. package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
  609. package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
  610. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
  611. package/dist/web/standalone/.next/static/css/18c2fdf261bfc1b7.css +0 -1
  612. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → DXD9fZPnqtjZSlT5xdC3v}/_buildManifest.js +0 -0
  613. /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → DXD9fZPnqtjZSlT5xdC3v}/_ssgManifest.js +0 -0
@@ -92,6 +92,11 @@ remote_questions:
92
92
  uat_dispatch:
93
93
  post_unit_hooks: []
94
94
  pre_dispatch_hooks: []
95
+ # planning_subagents:
96
+ # plan-milestone:
97
+ # allowed: [scout, planner, security]
98
+ # plan-slice:
99
+ # allowed: [scout, planner, reviewer, security]
95
100
  # language:
96
101
  # experimental:
97
102
  # rtk: false
@@ -12,10 +12,10 @@
12
12
  import { existsSync, unlinkSync } from "node:fs";
13
13
  import { join } from "node:path";
14
14
  import { isClosedStatus } from "../status-guards.js";
15
- import { transaction, insertMilestone, insertSlice, insertTask, insertVerificationEvidence, getMilestone, getSlice, getTask, updateTaskStatus, deleteVerificationEvidence, saveGateResult, getPendingGatesForTurn, } from "../gsd-db.js";
15
+ import { transaction, insertMilestone, insertSlice, insertTask, insertVerificationEvidence, getMilestone, getSlice, getTask, updateTaskStatus, deleteVerificationEvidence, saveGateResult, getPendingGatesForTurn, getUnresolvedBlockingReworkFindingsForTask, getBlockingReworkFindingsForTask, applyReworkResolutions, } from "../gsd-db.js";
16
16
  import { getWorkflowDatabasePath, ensureWorkflowDbAtPath } from "../db-workspace.js";
17
17
  import { getGatesForTurn } from "../gate-registry.js";
18
- import { gsdProjectionRoot, clearPathCache, resolveMilestonePath, resolveSlicePath } from "../paths.js";
18
+ import { buildFlatTaskFileName, buildTaskFileName, gsdProjectionRoot, clearPathCache, legacyMilestonesDir, resolveMilestonePath, resolveSlicePath, } from "../paths.js";
19
19
  import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
20
20
  import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
21
21
  import { saveFile, clearParseCache } from "../files.js";
@@ -34,13 +34,20 @@ function taskSummaryPath(basePath, milestoneId, sliceId, taskId) {
34
34
  // a legacy layout and breaks all subsequent path resolution for the session.
35
35
  const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
36
36
  const phaseDir = resolveMilestonePath(basePath, milestoneId);
37
- if (slicePath && phaseDir && slicePath !== phaseDir) {
38
- // Legacy layout: the slice has its own slices/SID/ subdir → tasks/ subdir
39
- return join(slicePath, "tasks", `${taskId}-SUMMARY.md`);
37
+ const legacyBase = legacyMilestonesDir(basePath);
38
+ const isLegacy = phaseDir
39
+ ? phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\")
40
+ : false;
41
+ if (isLegacy && phaseDir) {
42
+ // Legacy layout: the slice has its own slices/SID/ subdir → tasks/ subdir.
43
+ const legacySlicePath = slicePath && slicePath !== phaseDir
44
+ ? slicePath
45
+ : join(phaseDir, "slices", sliceId);
46
+ return join(legacySlicePath, "tasks", buildTaskFileName(taskId, "SUMMARY"));
40
47
  }
41
48
  if (phaseDir) {
42
49
  // Flat-phase: task summaries go in the phase dir (no tasks/ subdir)
43
- return join(phaseDir, `${taskId}-SUMMARY.md`);
50
+ return join(phaseDir, buildFlatTaskFileName(sliceId, taskId, "SUMMARY"));
44
51
  }
45
52
  // Fallback: legacy hardcoded path (milestone/slice dir not on disk yet)
46
53
  return join(gsdProjectionRoot(basePath), "milestones", milestoneId, "slices", sliceId, "tasks", `${taskId}-SUMMARY.md`);
@@ -107,6 +114,44 @@ export function normalizeListParam(value) {
107
114
  * Build a TaskRow-shaped object from CompleteTaskParams so the unified
108
115
  * renderSummaryContent() can be used at completion time (#2720).
109
116
  */
117
+ function normalizeReworkResolution(params) {
118
+ return (params.reworkResolution ?? []).map((resolution) => ({
119
+ milestoneId: params.milestoneId,
120
+ sliceId: params.sliceId,
121
+ taskId: params.taskId,
122
+ findingId: resolution.findingId,
123
+ status: resolution.status,
124
+ evidence: resolution.evidence,
125
+ decisionRef: resolution.decisionRef,
126
+ }));
127
+ }
128
+ function unresolvedReworkError(missingFindingIds) {
129
+ const plural = missingFindingIds.length === 1 ? "finding" : "findings";
130
+ return `unresolved blocking rework ${plural}: ${missingFindingIds.join(", ")} — provide reworkResolution entries with status resolved and evidence, or status deferred-with-override with evidence and decisionRef, before completing the task`;
131
+ }
132
+ function satisfiesBlockingReworkFinding(resolution) {
133
+ if (resolution.evidence.trim().length === 0)
134
+ return false;
135
+ if (resolution.status === "resolved")
136
+ return true;
137
+ return (resolution.decisionRef ?? "").trim().length > 0;
138
+ }
139
+ /**
140
+ * Restore rework findings to their pre-completion state.
141
+ *
142
+ * The completion transaction flips blocking findings to resolved/
143
+ * deferred-with-override via applyReworkResolutions. When a later projection
144
+ * or escalation write fails and we compensate by reverting the task to
145
+ * `pending`, we must also revert those findings. Otherwise a retry sees no
146
+ * unresolved blocking findings (getUnresolvedBlockingReworkFindingsForTask
147
+ * only returns `pending` rows) and completes the task with the blocking gate
148
+ * silently skipped.
149
+ */
150
+ function revertAppliedReworkResolutions(snapshot) {
151
+ if (snapshot.length === 0)
152
+ return;
153
+ applyReworkResolutions(snapshot);
154
+ }
110
155
  function paramsToTaskRow(params, completedAt) {
111
156
  return {
112
157
  milestone_id: params.milestoneId,
@@ -182,6 +227,7 @@ export async function handleCompleteTask(params, basePath) {
182
227
  let guardError = null;
183
228
  let summaryMd = "";
184
229
  let repairTaskSummaryRow = null;
230
+ let appliedReworkSnapshot = [];
185
231
  const rollbackDbPath = getWorkflowDatabasePath();
186
232
  // ── ADR-011 Phase 2: validate escalation payload BEFORE any side effects ─
187
233
  // Building the artifact runs the full shape validation (2-4 options, unique
@@ -192,6 +238,7 @@ export async function handleCompleteTask(params, basePath) {
192
238
  // no escalation recorded, and the loop would silently advance past it.
193
239
  // The filesystem write happens later (after side effects) because that's
194
240
  // the cheapest ordering and validation is where 99% of failures live.
241
+ const reworkResolutions = normalizeReworkResolution(params);
195
242
  let validatedEscalationArtifact = null;
196
243
  let escalationWriteEnabled = false;
197
244
  if (params.escalation) {
@@ -231,6 +278,17 @@ export async function handleCompleteTask(params, basePath) {
231
278
  return;
232
279
  }
233
280
  const existingTask = getTask(params.milestoneId, params.sliceId, params.taskId);
281
+ const unresolvedRework = getUnresolvedBlockingReworkFindingsForTask(params.milestoneId, params.sliceId, params.taskId);
282
+ const resolvedFindingIds = new Set(reworkResolutions
283
+ .filter(satisfiesBlockingReworkFinding)
284
+ .map((resolution) => resolution.findingId));
285
+ const missingFindingIds = unresolvedRework
286
+ .filter((finding) => !resolvedFindingIds.has(finding.finding_id))
287
+ .map((finding) => finding.finding_id);
288
+ if (missingFindingIds.length > 0) {
289
+ guardError = unresolvedReworkError(missingFindingIds);
290
+ return;
291
+ }
234
292
  if (existingTask && isClosedStatus(existingTask.status)) {
235
293
  // Stale-turn path: a timed-out turn that was superseded by recovery
236
294
  // can still reach this code when its LLM call eventually returns and
@@ -278,6 +336,33 @@ export async function handleCompleteTask(params, basePath) {
278
336
  keyDecisions: params.keyDecisions ?? [],
279
337
  fullSummaryMd: summaryMd,
280
338
  });
339
+ // Only persist resolutions that actually satisfy the evidence
340
+ // requirement. The guard above admits a finding as long as ONE satisfying
341
+ // entry exists, but applyReworkResolutions writes by findingId and lets the
342
+ // last entry win. Persisting every entry would let a later non-satisfying
343
+ // duplicate (empty evidence, or deferred-with-override without decisionRef)
344
+ // overwrite a valid resolution and leave the finding non-pending without
345
+ // acceptable evidence. Filtering with the same predicate the guard uses
346
+ // keeps the applied set and the gate consistent.
347
+ const resolutionsToApply = reworkResolutions.filter(satisfiesBlockingReworkFinding);
348
+ if (resolutionsToApply.length > 0) {
349
+ // Snapshot the pre-resolution state of the findings we're about to
350
+ // change so a compensating rollback can restore them exactly (see
351
+ // revertAppliedReworkResolutions).
352
+ const resolvedFindingIdsForSnapshot = new Set(resolutionsToApply.map((r) => r.findingId));
353
+ appliedReworkSnapshot = getBlockingReworkFindingsForTask(params.milestoneId, params.sliceId, params.taskId)
354
+ .filter((finding) => resolvedFindingIdsForSnapshot.has(finding.finding_id))
355
+ .map((finding) => ({
356
+ milestoneId: params.milestoneId,
357
+ sliceId: params.sliceId,
358
+ taskId: params.taskId,
359
+ findingId: finding.finding_id,
360
+ status: finding.status,
361
+ evidence: finding.evidence,
362
+ decisionRef: finding.decision_ref,
363
+ }));
364
+ applyReworkResolutions(resolutionsToApply);
365
+ }
281
366
  for (const evidence of (params.verificationEvidence ?? [])) {
282
367
  insertVerificationEvidence({
283
368
  taskId: params.taskId,
@@ -340,6 +425,7 @@ export async function handleCompleteTask(params, basePath) {
340
425
  ensureWorkflowDbAtPath(rollbackDbPath);
341
426
  deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
342
427
  updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, "pending");
428
+ revertAppliedReworkResolutions(appliedReworkSnapshot);
343
429
  invalidateStateCache();
344
430
  rollbackSucceeded = true;
345
431
  }
@@ -430,6 +516,7 @@ export async function handleCompleteTask(params, basePath) {
430
516
  try {
431
517
  deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
432
518
  updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, 'pending');
519
+ revertAppliedReworkResolutions(appliedReworkSnapshot);
433
520
  invalidateStateCache();
434
521
  logWarning("tool", `complete-task rolled back DB completion for ${params.milestoneId}/${params.sliceId}/${params.taskId} after escalation write failure; SUMMARY.md left on disk for retry.`);
435
522
  }
@@ -447,6 +534,7 @@ export async function handleCompleteTask(params, basePath) {
447
534
  try {
448
535
  deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
449
536
  updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, 'pending');
537
+ revertAppliedReworkResolutions(appliedReworkSnapshot);
450
538
  invalidateStateCache();
451
539
  logWarning("tool", `complete-task rolled back DB completion for ${params.milestoneId}/${params.sliceId}/${params.taskId} because hard-blocker escalation handling is disabled; SUMMARY.md left on disk for retry.`);
452
540
  }
@@ -5,7 +5,7 @@ import { getGateIdsForTurn } from "../gate-registry.js";
5
5
  import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning, insertGateRow, setSliceSketchFlag } from "../gsd-db.js";
6
6
  import { invalidateStateCache } from "../state.js";
7
7
  import { renderTaskPlanFromDb, renderPlanFromDb } from "../markdown-renderer.js";
8
- import { resolveTasksDir } from "../paths.js";
8
+ import { resolveMilestonePath, resolveSlicePath } from "../paths.js";
9
9
  import { flushWorkflowProjections } from "../projection-flush.js";
10
10
  import { writeManifest } from "../workflow-manifest.js";
11
11
  import { appendEvent } from "../workflow-events.js";
@@ -193,21 +193,19 @@ export async function handlePlanTask(rawParams, basePath) {
193
193
  return { error: guardError };
194
194
  }
195
195
  try {
196
- const renderResult = await renderTaskPlanFromDb(basePath, params.milestoneId, params.sliceId, params.taskId);
197
- // Flat-phase: tasks live as checkboxes in the slice plan's <tasks> block,
198
- // not as standalone TID-PLAN.md files. Re-render the slice plan so the
199
- // new/updated task appears in the plan file that gsd-core reads.
200
- // Guard: resolveTasksDir is null in flat-phase (no tasks/ subdir exists).
196
+ const milestonePath = resolveMilestonePath(basePath, params.milestoneId);
197
+ const slicePath = resolveSlicePath(basePath, params.milestoneId, params.sliceId);
198
+ const isLegacySliceLayout = Boolean(milestonePath && slicePath && slicePath !== milestonePath);
199
+ let renderedPath;
201
200
  let slicePlanSynced = false;
202
- try {
203
- const tDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
204
- if (!tDir) {
205
- await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
206
- slicePlanSynced = true;
207
- }
201
+ if (isLegacySliceLayout) {
202
+ const renderResult = await renderTaskPlanFromDb(basePath, params.milestoneId, params.sliceId, params.taskId);
203
+ renderedPath = renderResult.taskPlanPath;
208
204
  }
209
- catch (syncErr) {
210
- logWarning("tool", `plan-task: slice-plan sync failed: ${syncErr.message}`);
205
+ else {
206
+ const renderResult = await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
207
+ renderedPath = renderResult.planPath;
208
+ slicePlanSynced = true;
211
209
  }
212
210
  if (slicePlanSynced) {
213
211
  setSliceSketchFlag(params.milestoneId, params.sliceId, false);
@@ -234,7 +232,7 @@ export async function handlePlanTask(rawParams, basePath) {
234
232
  milestoneId: params.milestoneId,
235
233
  sliceId: params.sliceId,
236
234
  taskId: params.taskId,
237
- taskPlanPath: renderResult.taskPlanPath,
235
+ taskPlanPath: renderedPath,
238
236
  };
239
237
  }
240
238
  catch (err) {
@@ -1,6 +1,6 @@
1
1
  import { existsSync, unlinkSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { relSliceFile, resolveMilestoneFile, resolveMilestonePath, targetMilestoneFile } from "../paths.js";
2
+ import { join, relative } from "node:path";
3
+ import { gsdProjectionRoot, gsdRoot, resolveMilestoneFile, resolveMilestonePath, targetMilestoneFile } from "../paths.js";
4
4
  import { clearParseCache } from "../files.js";
5
5
  import { isClosedStatus } from "../status-guards.js";
6
6
  import { isNonEmptyString } from "../validation.js";
@@ -11,6 +11,14 @@ import { flushWorkflowProjections } from "../projection-flush.js";
11
11
  import { writeManifest } from "../workflow-manifest.js";
12
12
  import { appendEvent } from "../workflow-events.js";
13
13
  import { logWarning } from "../workflow-logger.js";
14
+ function assessmentDbPathForRenderedFile(basePath, absPath) {
15
+ const projectionRoot = gsdProjectionRoot(basePath);
16
+ const projectionRel = relative(projectionRoot, absPath);
17
+ const root = projectionRel && !projectionRel.startsWith("..") && !projectionRel.startsWith("/")
18
+ ? projectionRoot
19
+ : gsdRoot(basePath);
20
+ return `.gsd/${relative(root, absPath).replace(/\\/g, "/")}`;
21
+ }
14
22
  function validateParams(params) {
15
23
  if (!isNonEmptyString(params?.milestoneId))
16
24
  throw new Error("milestoneId is required");
@@ -74,10 +82,6 @@ export async function handleReassessRoadmap(rawParams, basePath) {
74
82
  catch (err) {
75
83
  return { error: `validation failed: ${err.message}` };
76
84
  }
77
- // ── Compute assessment artifact path ──────────────────────────────
78
- // Assessment lives in the completed slice's directory.
79
- // Use relSliceFile so the path is layout-aware (flat-phase or legacy).
80
- const assessmentRelPath = relSliceFile(basePath, params.milestoneId, params.completedSliceId, "ASSESSMENT");
81
85
  // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
82
86
  // Guards must be inside the transaction so the state they check cannot
83
87
  // change between the read and the write (#2723).
@@ -152,15 +156,6 @@ export async function handleReassessRoadmap(rawParams, basePath) {
152
156
  }
153
157
  }
154
158
  }
155
- // Record assessment
156
- insertAssessment({
157
- path: assessmentRelPath,
158
- milestoneId: params.milestoneId,
159
- sliceId: params.completedSliceId,
160
- status: params.verdict,
161
- scope: "roadmap",
162
- fullContent: params.assessment,
163
- });
164
159
  // Apply slice modifications
165
160
  for (const mod of params.sliceChanges.modified) {
166
161
  updateSliceFields(params.milestoneId, mod.sliceId, {
@@ -220,6 +215,14 @@ export async function handleReassessRoadmap(rawParams, basePath) {
220
215
  assessment: params.assessment,
221
216
  completedSliceId: params.completedSliceId,
222
217
  });
218
+ insertAssessment({
219
+ path: assessmentDbPathForRenderedFile(basePath, assessmentResult.assessmentPath),
220
+ milestoneId: params.milestoneId,
221
+ sliceId: params.completedSliceId,
222
+ status: params.verdict,
223
+ scope: "roadmap",
224
+ fullContent: params.assessment,
225
+ });
223
226
  // ── Remove stale VALIDATION file from disk (#2957) ────────────
224
227
  const hasStructuralChanges = params.sliceChanges.added.length > 0 ||
225
228
  params.sliceChanges.modified.length > 0 ||
@@ -16,7 +16,7 @@ import { logWarning } from "../workflow-logger.js";
16
16
  import { debugLog } from "../debug-logger.js";
17
17
  import { existsSync, unlinkSync } from "node:fs";
18
18
  import { join } from "node:path";
19
- import { resolveMilestonePath, resolveSlicePath, resolveTasksDir, clearPathCache } from "../paths.js";
19
+ import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveSlicePath, resolveTasksDir, clearPathCache, } from "../paths.js";
20
20
  export async function handleReopenMilestone(params, basePath) {
21
21
  // ── Validate required fields ────────────────────────────────────────────
22
22
  if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
@@ -41,6 +41,8 @@ export async function handleReopenMilestone(params, basePath) {
41
41
  // auto-corrects entities back to "complete", making reopen a no-op (#3161).
42
42
  try {
43
43
  const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
44
+ const legacyBase = legacyMilestonesDir(basePath);
45
+ const isLegacy = !!milestoneDir && (milestoneDir.startsWith(legacyBase + "/") || milestoneDir.startsWith(legacyBase + "\\"));
44
46
  if (milestoneDir) {
45
47
  const milestoneSummary = join(milestoneDir, `${params.milestoneId}-SUMMARY.md`);
46
48
  if (existsSync(milestoneSummary))
@@ -58,10 +60,17 @@ export async function handleReopenMilestone(params, basePath) {
58
60
  unlinkSync(sliceUat);
59
61
  }
60
62
  const tasksDir = resolveTasksDir(basePath, params.milestoneId, slice.id);
61
- if (tasksDir) {
62
- const tasks = getSliceTasks(params.milestoneId, slice.id);
63
- for (const task of tasks) {
64
- const taskSummary = join(tasksDir, `${task.id}-SUMMARY.md`);
63
+ const tasks = getSliceTasks(params.milestoneId, slice.id);
64
+ for (const task of tasks) {
65
+ const taskSummaries = isLegacy
66
+ ? (tasksDir ? [join(tasksDir, buildTaskFileName(task.id, "SUMMARY"))] : [])
67
+ : milestoneDir
68
+ ? [
69
+ join(milestoneDir, buildFlatTaskFileName(slice.id, task.id, "SUMMARY")),
70
+ join(milestoneDir, buildTaskFileName(task.id, "SUMMARY")),
71
+ ]
72
+ : [];
73
+ for (const taskSummary of taskSummaries) {
65
74
  if (existsSync(taskSummary))
66
75
  unlinkSync(taskSummary);
67
76
  }
@@ -22,7 +22,7 @@ import { appendEvent } from "../workflow-events.js";
22
22
  import { logWarning } from "../workflow-logger.js";
23
23
  import { existsSync, unlinkSync } from "node:fs";
24
24
  import { join } from "node:path";
25
- import { resolveTasksDir, resolveSlicePath, clearPathCache } from "../paths.js";
25
+ import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveTasksDir, resolveSlicePath, clearPathCache, } from "../paths.js";
26
26
  export async function handleReopenSlice(params, basePath) {
27
27
  // ── Validate required fields ────────────────────────────────────────────
28
28
  if (!params.sliceId || typeof params.sliceId !== "string" || params.sliceId.trim() === "") {
@@ -52,11 +52,21 @@ export async function handleReopenSlice(params, basePath) {
52
52
  // Without this, the DB-filesystem reconciler sees SUMMARY.md files and
53
53
  // auto-corrects tasks back to "complete", making reopen a no-op (#3161).
54
54
  try {
55
+ const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
56
+ const legacyBase = legacyMilestonesDir(basePath);
57
+ const isLegacy = !!milestoneDir && (milestoneDir.startsWith(legacyBase + "/") || milestoneDir.startsWith(legacyBase + "\\"));
55
58
  const tasksDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
56
- if (tasksDir) {
57
- const tasks = getSliceTasks(params.milestoneId, params.sliceId);
58
- for (const task of tasks) {
59
- const summaryPath = join(tasksDir, `${task.id}-SUMMARY.md`);
59
+ const tasks = getSliceTasks(params.milestoneId, params.sliceId);
60
+ for (const task of tasks) {
61
+ const summaryPaths = isLegacy
62
+ ? (tasksDir ? [join(tasksDir, buildTaskFileName(task.id, "SUMMARY"))] : [])
63
+ : milestoneDir
64
+ ? [
65
+ join(milestoneDir, buildFlatTaskFileName(params.sliceId, task.id, "SUMMARY")),
66
+ join(milestoneDir, buildTaskFileName(task.id, "SUMMARY")),
67
+ ]
68
+ : [];
69
+ for (const summaryPath of summaryPaths) {
60
70
  if (existsSync(summaryPath))
61
71
  unlinkSync(summaryPath);
62
72
  }
@@ -17,8 +17,8 @@ import { appendEvent } from "../workflow-events.js";
17
17
  import { logWarning } from "../workflow-logger.js";
18
18
  import { writeReopenReason } from "../reopen-reason.js";
19
19
  import { existsSync, unlinkSync } from "node:fs";
20
- import { join, basename, dirname } from "node:path";
21
- import { resolveTasksDir, resolveSlicePath, clearPathCache } from "../paths.js";
20
+ import { join } from "node:path";
21
+ import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveTasksDir, resolveSlicePath, clearPathCache, } from "../paths.js";
22
22
  export async function handleReopenTask(params, basePath) {
23
23
  // ── Validate required fields ────────────────────────────────────────────
24
24
  if (!params.taskId || typeof params.taskId !== "string" || params.taskId.trim() === "") {
@@ -76,14 +76,20 @@ export async function handleReopenTask(params, basePath) {
76
76
  // summary cleanup into tasks/ (#1208).
77
77
  try {
78
78
  const slicePath = resolveSlicePath(basePath, params.milestoneId, params.sliceId);
79
- if (slicePath) {
80
- const isLegacySlice = basename(dirname(slicePath)) === "slices";
81
- const summaryDir = isLegacySlice
82
- ? (resolveTasksDir(basePath, params.milestoneId, params.sliceId) ?? slicePath)
83
- : slicePath;
84
- const summaryPath = join(summaryDir, `${params.taskId}-SUMMARY.md`);
85
- if (existsSync(summaryPath))
86
- unlinkSync(summaryPath);
79
+ const milestonePath = resolveMilestonePath(basePath, params.milestoneId);
80
+ if (milestonePath) {
81
+ const legacyBase = legacyMilestonesDir(basePath);
82
+ const isLegacy = milestonePath.startsWith(legacyBase + "/") || milestonePath.startsWith(legacyBase + "\\");
83
+ const summaryPaths = isLegacy
84
+ ? [join(resolveTasksDir(basePath, params.milestoneId, params.sliceId) ?? slicePath ?? join(milestonePath, "slices", params.sliceId, "tasks"), buildTaskFileName(params.taskId, "SUMMARY"))]
85
+ : [
86
+ join(milestonePath, buildFlatTaskFileName(params.sliceId, params.taskId, "SUMMARY")),
87
+ join(milestonePath, buildTaskFileName(params.taskId, "SUMMARY")),
88
+ ];
89
+ for (const summaryPath of summaryPaths) {
90
+ if (existsSync(summaryPath))
91
+ unlinkSync(summaryPath);
92
+ }
87
93
  }
88
94
  }
89
95
  catch (cleanupErr) {
@@ -0,0 +1,128 @@
1
+ import { clearParseCache } from "../files.js";
2
+ import { getSlice, getTask, insertReplanHistory, transaction, upsertTaskPlanning, } from "../gsd-db.js";
3
+ import { invalidateStateCache } from "../state.js";
4
+ import { isClosedStatus } from "../status-guards.js";
5
+ import { isNonEmptyString, validateStringArray } from "../validation.js";
6
+ import { renderPlanFromDb, renderTaskPlanFromDb } from "../markdown-renderer.js";
7
+ import { resolveMilestonePath, resolveSlicePath } from "../paths.js";
8
+ import { flushWorkflowProjections } from "../projection-flush.js";
9
+ import { writeManifest } from "../workflow-manifest.js";
10
+ import { appendEvent } from "../workflow-events.js";
11
+ import { logWarning } from "../workflow-logger.js";
12
+ function validateParams(params) {
13
+ if (!isNonEmptyString(params?.milestoneId))
14
+ throw new Error("milestoneId is required");
15
+ if (!isNonEmptyString(params?.sliceId))
16
+ throw new Error("sliceId is required");
17
+ if (!isNonEmptyString(params?.taskId))
18
+ throw new Error("taskId is required");
19
+ if (!isNonEmptyString(params?.title))
20
+ throw new Error("title is required");
21
+ if (!isNonEmptyString(params?.description))
22
+ throw new Error("description is required");
23
+ if (!isNonEmptyString(params?.estimate))
24
+ throw new Error("estimate is required");
25
+ if (!isNonEmptyString(params?.verify))
26
+ throw new Error("verify is required");
27
+ return {
28
+ ...params,
29
+ files: validateStringArray(params.files, "files"),
30
+ inputs: validateStringArray(params.inputs, "inputs"),
31
+ expectedOutput: validateStringArray(params.expectedOutput, "expectedOutput"),
32
+ };
33
+ }
34
+ function replanSummary(params) {
35
+ const ref = params.reworkBriefRef?.trim();
36
+ return ref
37
+ ? `Task ${params.taskId} replanned from rework brief ${ref}`
38
+ : `Task ${params.taskId} replanned`;
39
+ }
40
+ export async function handleReplanTask(rawParams, basePath) {
41
+ let params;
42
+ try {
43
+ params = validateParams(rawParams);
44
+ }
45
+ catch (err) {
46
+ return { error: `validation failed: ${err.message}` };
47
+ }
48
+ let guardError = null;
49
+ try {
50
+ transaction(() => {
51
+ const parentSlice = getSlice(params.milestoneId, params.sliceId);
52
+ if (!parentSlice) {
53
+ guardError = `missing parent slice: ${params.milestoneId}/${params.sliceId}`;
54
+ return;
55
+ }
56
+ if (isClosedStatus(parentSlice.status)) {
57
+ guardError = `cannot replan a task in a closed slice: ${params.sliceId} (status: ${parentSlice.status})`;
58
+ return;
59
+ }
60
+ const task = getTask(params.milestoneId, params.sliceId, params.taskId);
61
+ if (!task) {
62
+ guardError = `task not found: ${params.milestoneId}/${params.sliceId}/${params.taskId}`;
63
+ return;
64
+ }
65
+ if (isClosedStatus(task.status)) {
66
+ guardError = `cannot replan completed task ${params.taskId} — use gsd_task_reopen first`;
67
+ return;
68
+ }
69
+ upsertTaskPlanning(params.milestoneId, params.sliceId, params.taskId, {
70
+ title: params.title,
71
+ description: params.description,
72
+ estimate: params.estimate,
73
+ files: params.files,
74
+ verify: params.verify,
75
+ inputs: params.inputs,
76
+ expectedOutput: params.expectedOutput,
77
+ fullPlanMd: params.fullPlanMd,
78
+ });
79
+ insertReplanHistory({
80
+ milestoneId: params.milestoneId,
81
+ sliceId: params.sliceId,
82
+ taskId: params.taskId,
83
+ summary: replanSummary(params),
84
+ previousArtifactPath: params.reworkBriefRef ?? null,
85
+ });
86
+ });
87
+ }
88
+ catch (err) {
89
+ return { error: `db write failed: ${err.message}` };
90
+ }
91
+ if (guardError)
92
+ return { error: guardError };
93
+ try {
94
+ const milestonePath = resolveMilestonePath(basePath, params.milestoneId);
95
+ const slicePath = resolveSlicePath(basePath, params.milestoneId, params.sliceId);
96
+ const isLegacySliceLayout = Boolean(milestonePath && slicePath && slicePath !== milestonePath);
97
+ const renderResult = isLegacySliceLayout
98
+ ? await renderTaskPlanFromDb(basePath, params.milestoneId, params.sliceId, params.taskId)
99
+ : await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
100
+ const taskPlanPath = "taskPlanPath" in renderResult ? renderResult.taskPlanPath : renderResult.planPath;
101
+ invalidateStateCache();
102
+ clearParseCache();
103
+ try {
104
+ await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
105
+ writeManifest(basePath);
106
+ appendEvent(basePath, {
107
+ cmd: "replan-task",
108
+ params: { milestoneId: params.milestoneId, sliceId: params.sliceId, taskId: params.taskId },
109
+ ts: new Date().toISOString(),
110
+ actor: "agent",
111
+ actor_name: params.actorName,
112
+ trigger_reason: params.triggerReason,
113
+ });
114
+ }
115
+ catch (hookErr) {
116
+ logWarning("tool", `replan-task post-mutation hook warning: ${hookErr.message}`);
117
+ }
118
+ return {
119
+ milestoneId: params.milestoneId,
120
+ sliceId: params.sliceId,
121
+ taskId: params.taskId,
122
+ taskPlanPath,
123
+ };
124
+ }
125
+ catch (err) {
126
+ return { error: `render failed: ${err.message}` };
127
+ }
128
+ }
@@ -0,0 +1,74 @@
1
+ import { saveReworkBrief } from "../gsd-db.js";
2
+ import { isNonEmptyString, validateStringArray } from "../validation.js";
3
+ function validateFinding(finding, index) {
4
+ if (!isNonEmptyString(finding?.findingId))
5
+ throw new Error(`findings[${index}].findingId is required`);
6
+ if (finding.severity !== "blocking" && finding.severity !== "advisory") {
7
+ throw new Error(`findings[${index}].severity must be blocking or advisory`);
8
+ }
9
+ if (!isNonEmptyString(finding.description))
10
+ throw new Error(`findings[${index}].description is required`);
11
+ if (!isNonEmptyString(finding.requiredFix))
12
+ throw new Error(`findings[${index}].requiredFix is required`);
13
+ const status = finding.status ?? "pending";
14
+ if (status !== "pending" && status !== "resolved" && status !== "deferred-with-override") {
15
+ throw new Error(`findings[${index}].status must be pending, resolved, or deferred-with-override`);
16
+ }
17
+ // A blocking finding is only enforced by gsd_task_complete while it is
18
+ // `pending` (getUnresolvedBlockingReworkFindingsForTask returns pending rows
19
+ // only). Persisting a blocking finding as resolved/deferred-with-override
20
+ // at save time therefore bypasses the completion gate entirely, so require
21
+ // the same justification a reworkResolution would (evidence for `resolved`,
22
+ // evidence + decisionRef for `deferred-with-override`). Advisory findings do
23
+ // not gate completion, so their status is left as-is.
24
+ if (finding.severity === "blocking" && status !== "pending") {
25
+ if (!isNonEmptyString(finding.evidence)) {
26
+ throw new Error(`findings[${index}].evidence is required when a blocking finding is saved as ${status}`);
27
+ }
28
+ if (status === "deferred-with-override" && !isNonEmptyString(finding.decisionRef)) {
29
+ throw new Error(`findings[${index}].decisionRef is required when a blocking finding is saved as deferred-with-override`);
30
+ }
31
+ }
32
+ return {
33
+ ...finding,
34
+ verificationCommands: validateStringArray(finding.verificationCommands, `findings[${index}].verificationCommands`),
35
+ status,
36
+ };
37
+ }
38
+ function validateParams(params) {
39
+ if (!isNonEmptyString(params?.milestoneId))
40
+ throw new Error("milestoneId is required");
41
+ if (!isNonEmptyString(params?.sliceId))
42
+ throw new Error("sliceId is required");
43
+ if (!isNonEmptyString(params?.taskId))
44
+ throw new Error("taskId is required");
45
+ if (!Array.isArray(params.findings) || params.findings.length === 0) {
46
+ throw new Error("findings must be a non-empty array");
47
+ }
48
+ return {
49
+ ...params,
50
+ findings: params.findings.map(validateFinding),
51
+ };
52
+ }
53
+ export async function handleReworkBriefSave(rawParams) {
54
+ let params;
55
+ try {
56
+ params = validateParams(rawParams);
57
+ }
58
+ catch (err) {
59
+ return { error: `validation failed: ${err.message}` };
60
+ }
61
+ try {
62
+ const { briefId } = saveReworkBrief(params);
63
+ return {
64
+ briefId,
65
+ milestoneId: params.milestoneId,
66
+ sliceId: params.sliceId,
67
+ taskId: params.taskId,
68
+ findingCount: params.findings.length,
69
+ };
70
+ }
71
+ catch (err) {
72
+ return { error: `db write failed: ${err.message}` };
73
+ }
74
+ }