gsd-pi 2.82.0-dev.ed17d078d → 3.0.0

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 (567) hide show
  1. package/README.md +6 -5
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/GSD-WORKFLOW.md +10 -1
  4. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  5. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +1 -1
  6. package/dist/resources/extensions/cmux/index.js +5 -0
  7. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  8. package/dist/resources/extensions/gsd/auto/loop.js +19 -6
  9. package/dist/resources/extensions/gsd/auto/orchestrator.js +11 -0
  10. package/dist/resources/extensions/gsd/auto/phases.js +81 -31
  11. package/dist/resources/extensions/gsd/auto/session.js +4 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  14. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  15. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  16. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
  17. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +246 -133
  19. package/dist/resources/extensions/gsd/auto-prompts.js +2 -2
  20. package/dist/resources/extensions/gsd/auto-recovery.js +71 -14
  21. package/dist/resources/extensions/gsd/auto-start.js +87 -14
  22. package/dist/resources/extensions/gsd/auto-verification.js +45 -26
  23. package/dist/resources/extensions/gsd/auto-worktree.js +176 -10
  24. package/dist/resources/extensions/gsd/auto.js +57 -33
  25. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  26. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  27. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +4 -2
  28. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  29. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +17 -3
  30. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  31. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  32. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  33. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  34. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  35. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
  36. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  37. package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
  38. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  39. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  40. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
  41. package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
  42. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  43. package/dist/resources/extensions/gsd/doctor.js +2 -28
  44. package/dist/resources/extensions/gsd/export-html.js +27 -425
  45. package/dist/resources/extensions/gsd/forensics.js +3 -3
  46. package/dist/resources/extensions/gsd/git-service.js +45 -3
  47. package/dist/resources/extensions/gsd/gsd-db.js +21 -6
  48. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  49. package/dist/resources/extensions/gsd/guided-flow.js +101 -116
  50. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  51. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -8
  52. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  53. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  54. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  55. package/dist/resources/extensions/gsd/native-git-bridge.js +48 -12
  56. package/dist/resources/extensions/gsd/paths.js +4 -0
  57. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  58. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
  59. package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
  60. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  61. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  62. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  63. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  64. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  65. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  66. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  67. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  68. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  69. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  70. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  71. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  72. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  73. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  74. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  75. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  76. package/dist/resources/extensions/gsd/state.js +3 -3
  77. package/dist/resources/extensions/gsd/status-guards.js +11 -0
  78. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  79. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  80. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  81. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  82. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  83. package/dist/resources/extensions/gsd/tools/plan-slice.js +87 -14
  84. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  85. package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
  86. package/dist/resources/extensions/gsd/validation.js +23 -1
  87. package/dist/resources/extensions/gsd/verification-gate.js +68 -7
  88. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  89. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  90. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  91. package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
  92. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  93. package/dist/resources/extensions/shared/html-shell.js +388 -0
  94. package/dist/resources/extensions/subagent/index.js +448 -78
  95. package/dist/resources/extensions/subagent/launch.js +77 -0
  96. package/dist/resources/extensions/subagent/run-store.js +148 -0
  97. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  98. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  99. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  100. package/dist/resources/extensions/visual-brief/index.js +5 -0
  101. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  102. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  103. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  104. package/dist/web/standalone/.next/BUILD_ID +1 -1
  105. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  106. package/dist/web/standalone/.next/build-manifest.json +4 -4
  107. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  108. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  109. package/dist/web/standalone/.next/required-server-files.json +3 -3
  110. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  111. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  121. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  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 -7
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  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 -5
  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 -5
  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/notifications/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  186. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  202. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  206. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/index.html +1 -1
  216. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  217. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  218. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  219. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  221. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  222. package/dist/web/standalone/.next/server/app/page.js +2 -2
  223. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  226. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  227. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  228. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  229. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/middleware.js +2 -2
  232. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  234. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  235. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  236. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  237. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  238. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  239. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  241. package/dist/web/standalone/.next/static/chunks/app/layout-b23b3f6858dc6dc8.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  246. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  247. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  248. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  249. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  250. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  251. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  252. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  253. package/dist/web/standalone/server.js +1 -1
  254. package/package.json +4 -4
  255. package/packages/contracts/dist/rpc.test.js +7 -0
  256. package/packages/contracts/dist/rpc.test.js.map +1 -1
  257. package/packages/contracts/dist/workflow.d.ts +21 -0
  258. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  259. package/packages/contracts/dist/workflow.js +24 -0
  260. package/packages/contracts/dist/workflow.js.map +1 -1
  261. package/packages/contracts/src/rpc.test.ts +8 -0
  262. package/packages/contracts/src/workflow.ts +24 -0
  263. package/packages/daemon/package.json +2 -2
  264. package/packages/mcp-server/README.md +13 -4
  265. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  266. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  267. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  268. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  269. package/packages/mcp-server/package.json +2 -2
  270. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  271. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  272. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  273. package/packages/native/package.json +1 -1
  274. package/packages/native/tsconfig.json +2 -1
  275. package/packages/native/tsconfig.tsbuildinfo +1 -1
  276. package/packages/pi-agent-core/package.json +1 -1
  277. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  278. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  279. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  280. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  281. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  282. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  283. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  284. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  285. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  286. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  287. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  288. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  289. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  290. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  291. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  292. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  293. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  294. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  295. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  296. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  297. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  298. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  299. package/packages/pi-ai/package.json +1 -1
  300. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  301. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  302. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  303. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  304. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  305. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  306. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  307. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  308. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  310. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  312. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  314. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  316. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  321. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  322. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  326. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  328. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  329. package/packages/pi-coding-agent/package.json +1 -1
  330. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  331. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  332. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  333. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  334. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  335. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  336. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  337. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  338. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  339. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  340. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  341. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  342. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  343. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  344. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  345. package/packages/pi-tui/dist/terminal.js +12 -0
  346. package/packages/pi-tui/dist/terminal.js.map +1 -1
  347. package/packages/pi-tui/package.json +1 -1
  348. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  349. package/packages/pi-tui/src/terminal.ts +11 -0
  350. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  351. package/packages/rpc-client/package.json +1 -1
  352. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  353. package/pkg/package.json +1 -1
  354. package/src/resources/GSD-WORKFLOW.md +10 -1
  355. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  356. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +1 -1
  357. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  358. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +9 -0
  359. package/src/resources/extensions/cmux/index.ts +6 -0
  360. package/src/resources/extensions/gsd/auto/contracts.ts +14 -6
  361. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  362. package/src/resources/extensions/gsd/auto/loop.ts +22 -6
  363. package/src/resources/extensions/gsd/auto/orchestrator.ts +11 -0
  364. package/src/resources/extensions/gsd/auto/phases.ts +90 -38
  365. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  366. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  367. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  368. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  369. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  370. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
  371. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  372. package/src/resources/extensions/gsd/auto-post-unit.ts +279 -144
  373. package/src/resources/extensions/gsd/auto-prompts.ts +2 -2
  374. package/src/resources/extensions/gsd/auto-recovery.ts +74 -11
  375. package/src/resources/extensions/gsd/auto-start.ts +94 -12
  376. package/src/resources/extensions/gsd/auto-verification.ts +58 -36
  377. package/src/resources/extensions/gsd/auto-worktree.ts +193 -10
  378. package/src/resources/extensions/gsd/auto.ts +59 -31
  379. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  380. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  381. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +4 -2
  382. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  383. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +20 -4
  384. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  385. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  386. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  387. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  388. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  389. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
  390. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  391. package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
  392. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  393. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  394. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
  395. package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
  396. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  397. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  398. package/src/resources/extensions/gsd/doctor.ts +2 -27
  399. package/src/resources/extensions/gsd/export-html.ts +27 -427
  400. package/src/resources/extensions/gsd/forensics.ts +3 -3
  401. package/src/resources/extensions/gsd/git-service.ts +51 -4
  402. package/src/resources/extensions/gsd/gsd-db.ts +21 -6
  403. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  404. package/src/resources/extensions/gsd/guided-flow.ts +134 -133
  405. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  406. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -8
  407. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  408. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  409. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  410. package/src/resources/extensions/gsd/native-git-bridge.ts +54 -12
  411. package/src/resources/extensions/gsd/paths.ts +5 -0
  412. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  413. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
  414. package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
  415. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  416. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  417. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  418. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  419. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  420. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  421. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  422. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  423. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  424. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  425. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  426. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  427. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  428. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  429. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  430. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  431. package/src/resources/extensions/gsd/state.ts +3 -3
  432. package/src/resources/extensions/gsd/status-guards.ts +13 -0
  433. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  434. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  435. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  436. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  437. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +56 -0
  438. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +80 -1
  439. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  440. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  441. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  442. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +91 -6
  443. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  444. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  445. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  446. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  447. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  448. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  449. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +11 -2
  450. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  451. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  452. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  453. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  454. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  455. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
  456. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  457. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  458. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +59 -2
  459. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
  460. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
  461. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  462. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
  463. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  464. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +11 -0
  465. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  466. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  467. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  468. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  469. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  470. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  471. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  472. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  473. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  474. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  475. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  476. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +112 -1
  477. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  478. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +46 -0
  479. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  480. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  481. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  482. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
  483. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  484. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  485. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  486. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  487. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  488. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  489. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +251 -2
  490. package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
  491. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  492. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
  493. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  494. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  495. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
  496. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +59 -0
  497. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  498. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  499. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  500. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  501. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  502. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  503. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
  504. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  505. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
  506. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  507. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  508. package/src/resources/extensions/gsd/tests/status-guards.test.ts +13 -1
  509. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  510. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  511. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +103 -7
  512. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  513. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
  514. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  515. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  516. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  517. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  518. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  519. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  520. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  521. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
  522. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +54 -0
  523. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  524. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  525. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  526. package/src/resources/extensions/gsd/tools/plan-slice.ts +97 -12
  527. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  528. package/src/resources/extensions/gsd/types.ts +1 -1
  529. package/src/resources/extensions/gsd/unit-context-manifest.ts +47 -11
  530. package/src/resources/extensions/gsd/validation.ts +23 -1
  531. package/src/resources/extensions/gsd/verification-gate.ts +78 -6
  532. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  533. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  534. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  535. package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
  536. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  537. package/src/resources/extensions/shared/html-shell.ts +412 -0
  538. package/src/resources/extensions/subagent/index.ts +567 -103
  539. package/src/resources/extensions/subagent/launch.ts +131 -0
  540. package/src/resources/extensions/subagent/run-store.ts +218 -0
  541. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  542. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  543. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  544. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  545. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  546. package/src/resources/extensions/visual-brief/index.ts +8 -0
  547. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  548. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  549. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  550. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  551. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  553. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  555. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +0 -1
  556. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  557. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  558. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  559. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  560. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  561. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  562. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  563. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  564. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  565. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  566. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → qoMxZh-xuwuvpFW0x0k01}/_buildManifest.js +0 -0
  567. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → qoMxZh-xuwuvpFW0x0k01}/_ssgManifest.js +0 -0
@@ -538,6 +538,31 @@ test("restoreToProjectRoot is no-op when originalBasePath is empty", () => {
538
538
  assert.equal(deps.calls.filter((c) => c.fn === "gitServiceFactory").length, 0);
539
539
  });
540
540
 
541
+ test("restoreToProjectRoot completes session-state restore even when chdir fails (ADR-016 phase 3, #5693)", () => {
542
+ // The verb attempts process.chdir to s.basePath after restoring it. The
543
+ // chdir is best-effort; failure must not abort the session-state restore.
544
+ // We exercise that contract by pointing originalBasePath at a path that
545
+ // cannot be chdir'd into.
546
+ const s = makeSession();
547
+ s.originalBasePath = "/this/path/should/not/exist/in/any/test/env";
548
+ s.basePath = "/project/.gsd/worktrees/M001";
549
+ const deps = makeDeps();
550
+ const lifecycle = new WorktreeLifecycle(s, deps);
551
+
552
+ // Capture cwd so we can confirm we did NOT successfully chdir.
553
+ const cwdBefore = process.cwd();
554
+ lifecycle.restoreToProjectRoot();
555
+
556
+ // Session-state restore happened despite chdir failure.
557
+ assert.equal(s.basePath, "/this/path/should/not/exist/in/any/test/env");
558
+ assert.equal(
559
+ deps.calls.filter((c) => c.fn === "gitServiceFactory").length,
560
+ 1,
561
+ );
562
+ // cwd is unchanged because chdir threw and was swallowed.
563
+ assert.equal(process.cwd(), cwdBefore);
564
+ });
565
+
541
566
  // ─── adoptSessionRoot (ADR-016 phase 2 / B2, issue #5620) ─────────────────────
542
567
 
543
568
  test("adoptSessionRoot sets basePath and seeds originalBasePath on a fresh session", () => {
@@ -26,6 +26,7 @@ const PLANNING_DISPATCH_REVIEW: ToolsPolicy = {
26
26
  };
27
27
  const READ_ONLY: ToolsPolicy = { mode: 'read-only' };
28
28
  const ALL: ToolsPolicy = { mode: 'all' };
29
+ const VERIFICATION: ToolsPolicy = { mode: 'verification' };
29
30
  const DOCS: ToolsPolicy = {
30
31
  mode: 'docs',
31
32
  allowedPathGlobs: ['docs/**', 'README.md', 'README.*.md', 'CHANGELOG.md', '*.md'],
@@ -157,6 +158,13 @@ test('planning-dispatch: allows subagent dispatch (delegated recon/planner durin
157
158
  assert.strictEqual(r.block, false);
158
159
  });
159
160
 
161
+ test('planning-dispatch: allows markdown agent filenames after identity normalization', () => {
162
+ const agentClasses = extractSubagentAgentClasses({ agent: 'scout.md' });
163
+ assert.deepEqual(agentClasses, ['scout']);
164
+ const r = shouldBlockPlanningUnit('subagent', '', BASE, 'plan-slice', PLANNING_DISPATCH, agentClasses);
165
+ assert.strictEqual(r.block, false);
166
+ });
167
+
160
168
  test('planning-dispatch: allows task dispatch (delegated recon/planner during slice planning)', () => {
161
169
  const r = shouldBlockPlanningUnit('task', '', BASE, 'plan-slice', PLANNING_DISPATCH, ['planner']);
162
170
  assert.strictEqual(r.block, false);
@@ -172,6 +180,22 @@ test('planning-dispatch: extracts subagent classes from single, parallel, and ch
172
180
  extractSubagentAgentClasses({ chain: [{ agent: 'reviewer' }, { agent: 'security' }] }),
173
181
  ['reviewer', 'security'],
174
182
  );
183
+ assert.deepEqual(
184
+ extractSubagentAgentClasses({
185
+ chain: [
186
+ { agent: 'scout' },
187
+ { parallel: [{ agent: 'reviewer' }, { agent: ' security ' }] },
188
+ ],
189
+ }),
190
+ ['scout', 'reviewer', 'security'],
191
+ );
192
+ });
193
+
194
+ test('planning-dispatch: extracts subagent classes without recursing through cycles', () => {
195
+ const input: { agent: string; parallel?: unknown[] } = { agent: 'scout' };
196
+ input.parallel = [input, { agent: 'reviewer' }];
197
+
198
+ assert.deepEqual(extractSubagentAgentClasses(input), ['scout', 'reviewer']);
175
199
  });
176
200
 
177
201
  test('planning-dispatch: blocks subagent dispatch when agentClasses is undefined (stale caller shim)', () => {
@@ -315,6 +339,36 @@ test('all-mode: execute-task can dispatch subagents', () => {
315
339
  assert.strictEqual(r.block, false);
316
340
  });
317
341
 
342
+ // ─── verification mode: bash allowed, writes still scoped ─────────────────
343
+
344
+ test('verification-mode: run-uat can run build commands', () => {
345
+ const r = shouldBlockPlanningUnit('bash', 'npm run build 2>&1', BASE, 'run-uat', VERIFICATION);
346
+ assert.strictEqual(r.block, false);
347
+ });
348
+
349
+ test('verification-mode: run-uat blocks destructive bash (rm -rf)', () => {
350
+ const r = shouldBlockPlanningUnit('bash', 'rm -rf dist', BASE, 'run-uat', VERIFICATION);
351
+ assert.strictEqual(r.block, true);
352
+ assert.match(r.reason!, /bash is restricted to build\/test verification commands/);
353
+ });
354
+
355
+ test('verification-mode: run-uat allows read-only investigative bash (git status)', () => {
356
+ const r = shouldBlockPlanningUnit('bash', 'git status', BASE, 'run-uat', VERIFICATION);
357
+ assert.strictEqual(r.block, false);
358
+ });
359
+
360
+ test('verification-mode: run-uat still blocks user source edits', () => {
361
+ const r = shouldBlockPlanningUnit('edit', join(BASE, 'src', 'main.ts'), BASE, 'run-uat', VERIFICATION);
362
+ assert.strictEqual(r.block, true);
363
+ assert.match(r.reason!, /tools-policy "verification"/);
364
+ });
365
+
366
+ test('verification-mode: run-uat still blocks subagent dispatch', () => {
367
+ const r = shouldBlockPlanningUnit('subagent', '', BASE, 'run-uat', VERIFICATION);
368
+ assert.strictEqual(r.block, true);
369
+ assert.match(r.reason!, /subagent dispatch is not permitted/);
370
+ });
371
+
318
372
  // ─── read-only mode ───────────────────────────────────────────────────────
319
373
 
320
374
  test('read-only: blocks any edit even to .gsd/', () => {
@@ -38,9 +38,9 @@ export interface CompleteMilestoneParams {
38
38
  definitionOfDoneResults?: string;
39
39
  /** @optional — empty/omitted renders as "Not provided." */
40
40
  requirementOutcomes?: string;
41
- /** @optional — empty/omitted renders as "(none)" */
41
+ /** @optional — empty/omitted renders as an empty frontmatter list */
42
42
  keyDecisions?: string[];
43
- /** @optional — empty/omitted renders as "(none)" */
43
+ /** @optional — empty/omitted renders as an empty frontmatter list */
44
44
  keyFiles?: string[];
45
45
  /** @optional — empty/omitted renders as "(none)" */
46
46
  lessonsLearned?: string[];
@@ -70,12 +70,12 @@ function renderMilestoneSummaryMarkdown(params: CompleteMilestoneParams, complet
70
70
  const lessonsLearned = params.lessonsLearned ?? [];
71
71
 
72
72
  const keyDecisionsYaml = keyDecisions.length > 0
73
- ? keyDecisions.map(d => ` - ${d}`).join("\n")
74
- : " - (none)";
73
+ ? `\n${keyDecisions.map(d => ` - ${d}`).join("\n")}`
74
+ : " []";
75
75
 
76
76
  const keyFilesYaml = keyFiles.length > 0
77
- ? keyFiles.map(f => ` - ${f}`).join("\n")
78
- : " - (none)";
77
+ ? `\n${keyFiles.map(f => ` - ${f}`).join("\n")}`
78
+ : " []";
79
79
 
80
80
  const lessonsYaml = lessonsLearned.length > 0
81
81
  ? lessonsLearned.map(l => ` - ${l}`).join("\n")
@@ -86,10 +86,8 @@ id: ${params.milestoneId}
86
86
  title: "${displayTitle}"
87
87
  status: complete
88
88
  completed_at: ${completedAt}
89
- key_decisions:
90
- ${keyDecisionsYaml}
91
- key_files:
92
- ${keyFilesYaml}
89
+ key_decisions:${keyDecisionsYaml}
90
+ key_files:${keyFilesYaml}
93
91
  lessons_learned:
94
92
  ${lessonsYaml}
95
93
  ---
@@ -104,12 +104,12 @@ function renderSliceSummaryMarkdown(params: CompleteSliceParams): string {
104
104
  : " []";
105
105
 
106
106
  const keyFilesYaml = keyFiles.length > 0
107
- ? keyFiles.map(f => ` - ${f}`).join("\n")
108
- : " - (none)";
107
+ ? `\n${keyFiles.map(f => ` - ${f}`).join("\n")}`
108
+ : " []";
109
109
 
110
110
  const keyDecisionsYaml = keyDecisions.length > 0
111
- ? keyDecisions.map(d => ` - ${d}`).join("\n")
112
- : " - (none)";
111
+ ? `\n${keyDecisions.map(d => ` - ${d}`).join("\n")}`
112
+ : " []";
113
113
 
114
114
  const patternsYaml = patternsEstablished.length > 0
115
115
  ? patternsEstablished.map(p => ` - ${p}`).join("\n")
@@ -155,10 +155,8 @@ requires:
155
155
  ${requiresYaml}
156
156
  affects:
157
157
  ${affectsYaml}
158
- key_files:
159
- ${keyFilesYaml}
160
- key_decisions:
161
- ${keyDecisionsYaml}
158
+ key_files:${keyFilesYaml}
159
+ key_decisions:${keyDecisionsYaml}
162
160
  patterns_established:
163
161
  ${patternsYaml}
164
162
  observability_surfaces:
@@ -1,6 +1,6 @@
1
1
  import { clearParseCache } from "../files.js";
2
2
  import { isClosedStatus } from "../status-guards.js";
3
- import { isNonEmptyString, validateStringArray } from "../validation.js";
3
+ import { isNonEmptyString, validateStringArray, validateTitle } from "../validation.js";
4
4
  import {
5
5
  transaction,
6
6
  getMilestone,
@@ -148,6 +148,8 @@ function validateSlices(value: unknown): PlanMilestoneSliceInput[] {
148
148
  if (seen.has(sliceId)) throw new Error(`slices[${index}].sliceId must be unique`);
149
149
  seen.add(sliceId);
150
150
  if (!isNonEmptyString(title)) throw new Error(`slices[${index}].title must be a non-empty string`);
151
+ const titleIssue = validateTitle(title);
152
+ if (titleIssue) throw new Error(`slices[${index}].title is invalid: ${titleIssue}`);
151
153
  if (!isNonEmptyString(risk)) throw new Error(`slices[${index}].risk must be a non-empty string`);
152
154
  if (!Array.isArray(depends) || depends.some((item) => !isNonEmptyString(item))) {
153
155
  throw new Error(`slices[${index}].depends must be an array of non-empty strings`);
@@ -190,6 +192,8 @@ function validateParams(params: PlanMilestoneParams): PlanMilestoneParams {
190
192
  if (!isNonEmptyString(params?.milestoneId)) throw new Error("milestoneId is required");
191
193
  if (!isNonEmptyString(params?.title)) throw new Error("title is required");
192
194
  if (!isNonEmptyString(params?.vision)) throw new Error("vision is required");
195
+ const milestoneTitleIssue = validateTitle(params.title);
196
+ if (milestoneTitleIssue) throw new Error(`title is invalid: ${milestoneTitleIssue}`);
193
197
 
194
198
  return {
195
199
  ...params,
@@ -1,3 +1,5 @@
1
+ import { existsSync, rmSync } from "node:fs";
2
+ import { join, relative } from "node:path";
1
3
  import { clearParseCache } from "../files.js";
2
4
  import { isClosedStatus, isDeferredStatus } from "../status-guards.js";
3
5
  import { isNonEmptyString, validateStringArray } from "../validation.js";
@@ -5,11 +7,15 @@ import {
5
7
  transaction,
6
8
  getMilestone,
7
9
  getSlice,
10
+ getSliceTasks,
8
11
  insertTask,
9
12
  upsertSlicePlanning,
10
13
  upsertTaskPlanning,
11
14
  insertGateRow,
12
15
  updateSliceStatus,
16
+ setSliceSketchFlag,
17
+ deleteTask,
18
+ deleteArtifactByPath,
13
19
  } from "../gsd-db.js";
14
20
  import type { GateId } from "../types.js";
15
21
  import { invalidateStateCache } from "../state.js";
@@ -19,6 +25,9 @@ import { writeManifest } from "../workflow-manifest.js";
19
25
  import { appendEvent } from "../workflow-events.js";
20
26
  import { logWarning } from "../workflow-logger.js";
21
27
  import { validatePlanningPathScope } from "../planning-path-scope.js";
28
+ import { checkFilePathConsistency, checkTaskOrdering } from "../pre-execution-checks.js";
29
+ import type { TaskRow } from "../db-task-slice-rows.js";
30
+ import { buildTaskFileName, gsdProjectionRoot } from "../paths.js";
22
31
 
23
32
  export interface PlanSliceTaskInput {
24
33
  taskId: string;
@@ -86,16 +95,10 @@ function validateTasks(value: unknown): PlanSliceTaskInput[] {
86
95
  if (!isNonEmptyString(title)) throw new Error(`tasks[${index}].title must be a non-empty string`);
87
96
  if (!isNonEmptyString(description)) throw new Error(`tasks[${index}].description must be a non-empty string`);
88
97
  if (!isNonEmptyString(estimate)) throw new Error(`tasks[${index}].estimate must be a non-empty string`);
89
- if (!Array.isArray(files) || files.some((item) => !isNonEmptyString(item))) {
90
- throw new Error(`tasks[${index}].files must be an array of non-empty strings`);
91
- }
98
+ const validatedFiles = validateStringArray(files, `tasks[${index}].files`);
92
99
  if (!isNonEmptyString(verify)) throw new Error(`tasks[${index}].verify must be a non-empty string`);
93
- if (!Array.isArray(inputs) || inputs.some((item) => !isNonEmptyString(item))) {
94
- throw new Error(`tasks[${index}].inputs must be an array of non-empty strings`);
95
- }
96
- if (!Array.isArray(expectedOutput) || expectedOutput.some((item) => !isNonEmptyString(item))) {
97
- throw new Error(`tasks[${index}].expectedOutput must be an array of non-empty strings`);
98
- }
100
+ const validatedInputs = validateStringArray(inputs, `tasks[${index}].inputs`);
101
+ const validatedExpectedOutput = validateStringArray(expectedOutput, `tasks[${index}].expectedOutput`);
99
102
  if (observabilityImpact !== undefined && !isNonEmptyString(observabilityImpact)) {
100
103
  throw new Error(`tasks[${index}].observabilityImpact must be a non-empty string when provided`);
101
104
  }
@@ -105,10 +108,10 @@ function validateTasks(value: unknown): PlanSliceTaskInput[] {
105
108
  title,
106
109
  description,
107
110
  estimate,
108
- files,
111
+ files: validatedFiles,
109
112
  verify,
110
- inputs,
111
- expectedOutput,
113
+ inputs: validatedInputs,
114
+ expectedOutput: validatedExpectedOutput,
112
115
  observabilityImpact: typeof observabilityImpact === "string" ? observabilityImpact : "",
113
116
  };
114
117
  });
@@ -131,6 +134,56 @@ function validateParams(params: PlanSliceParams): PlanSliceParams {
131
134
  };
132
135
  }
133
136
 
137
+ function toTaskRows(params: PlanSliceParams): TaskRow[] {
138
+ return params.tasks.map((task, index) => ({
139
+ milestone_id: params.milestoneId,
140
+ slice_id: params.sliceId,
141
+ id: task.taskId,
142
+ title: task.title,
143
+ status: "pending",
144
+ one_liner: "",
145
+ narrative: "",
146
+ verification_result: "",
147
+ duration: "",
148
+ completed_at: null,
149
+ blocker_discovered: false,
150
+ deviations: "",
151
+ known_issues: "",
152
+ key_files: [],
153
+ key_decisions: [],
154
+ full_summary_md: "",
155
+ description: task.description,
156
+ estimate: task.estimate,
157
+ files: task.files,
158
+ verify: task.verify,
159
+ inputs: task.inputs,
160
+ expected_output: task.expectedOutput,
161
+ observability_impact: task.observabilityImpact ?? "",
162
+ full_plan_md: task.fullPlanMd ?? "",
163
+ sequence: index + 1,
164
+ blocker_source: "",
165
+ escalation_pending: 0,
166
+ escalation_awaiting_review: 0,
167
+ escalation_artifact_path: null,
168
+ escalation_override_applied_at: null,
169
+ }));
170
+ }
171
+
172
+ function validateTaskPathsBeforePersist(params: PlanSliceParams, basePath: string): string | null {
173
+ const taskRows = toTaskRows(params);
174
+ const checks = [
175
+ ...checkFilePathConsistency(taskRows, basePath),
176
+ ...checkTaskOrdering(taskRows, basePath),
177
+ ];
178
+ const blocking = checks.filter((check) => !check.passed && check.blocking);
179
+
180
+ if (blocking.length === 0) return null;
181
+
182
+ return blocking
183
+ .map((check) => `[${check.category}] ${check.target}: ${check.message}`)
184
+ .join("\n");
185
+ }
186
+
134
187
  export async function handlePlanSlice(
135
188
  rawParams: PlanSliceParams,
136
189
  basePath: string,
@@ -154,10 +207,16 @@ export async function handlePlanSlice(
154
207
  return { error: `validation failed: ${pathScopeError}` };
155
208
  }
156
209
 
210
+ const pathError = validateTaskPathsBeforePersist(params, basePath);
211
+ if (pathError) {
212
+ return { error: `pre-execution validation failed:\n${pathError}` };
213
+ }
214
+
157
215
  // ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
158
216
  // Guards must be inside the transaction so the state they check cannot
159
217
  // change between the read and the write (#2723).
160
218
  let guardError: string | null = null;
219
+ let omittedTaskIds: string[] = [];
161
220
 
162
221
  try {
163
222
  transaction(() => {
@@ -181,9 +240,23 @@ export async function handlePlanSlice(
181
240
  return;
182
241
  }
183
242
 
243
+ const newTaskIds = new Set(params.tasks.map((task) => task.taskId));
244
+ const existingTasks = getSliceTasks(params.milestoneId, params.sliceId);
245
+ omittedTaskIds = existingTasks
246
+ .filter((task) => !newTaskIds.has(task.id))
247
+ .map((task) => task.id);
248
+
249
+ for (const task of existingTasks) {
250
+ if (!newTaskIds.has(task.id) && isClosedStatus(task.status)) {
251
+ guardError = `cannot remove completed task ${task.id}`;
252
+ return;
253
+ }
254
+ }
255
+
184
256
  if (isDeferredStatus(parentSlice.status)) {
185
257
  updateSliceStatus(params.milestoneId, params.sliceId, "pending");
186
258
  }
259
+ setSliceSketchFlag(params.milestoneId, params.sliceId, false);
187
260
 
188
261
  upsertSlicePlanning(params.milestoneId, params.sliceId, {
189
262
  goal: params.goal,
@@ -193,6 +266,10 @@ export async function handlePlanSlice(
193
266
  observabilityImpact: params.observabilityImpact,
194
267
  });
195
268
 
269
+ for (const taskId of omittedTaskIds) {
270
+ deleteTask(params.milestoneId, params.sliceId, taskId);
271
+ }
272
+
196
273
  for (const task of params.tasks) {
197
274
  insertTask({
198
275
  id: task.taskId,
@@ -237,6 +314,14 @@ export async function handlePlanSlice(
237
314
  }
238
315
 
239
316
  try {
317
+ const tasksDir = join(gsdProjectionRoot(basePath), "milestones", params.milestoneId, "slices", params.sliceId, "tasks");
318
+ for (const taskId of omittedTaskIds) {
319
+ const taskPlanPath = join(tasksDir, buildTaskFileName(taskId, "PLAN"));
320
+ if (existsSync(taskPlanPath)) rmSync(taskPlanPath, { force: true });
321
+ const artifactPath = relative(gsdProjectionRoot(basePath), taskPlanPath).replace(/\\/g, "/");
322
+ deleteArtifactByPath(artifactPath);
323
+ }
324
+
240
325
  const renderResult = await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
241
326
  invalidateStateCache();
242
327
  clearParseCache();
@@ -1,3 +1,6 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Adapts shared GSD workflow handlers for MCP executor calls.
3
+
1
4
  import { ensureDbOpen } from "../bootstrap/dynamic-tools.js";
2
5
  import { sanitizeCompleteMilestoneParams } from "../bootstrap/sanitize-complete-milestone.js";
3
6
  import { loadWriteGateSnapshot, shouldBlockContextArtifactSaveInSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "../bootstrap/write-gate.js";
@@ -25,6 +28,12 @@ import type { PlanSliceParams } from "./plan-slice.js";
25
28
  import { handlePlanSlice } from "./plan-slice.js";
26
29
  import type { ReplanSliceParams } from "./replan-slice.js";
27
30
  import { handleReplanSlice } from "./replan-slice.js";
31
+ import type { ReopenMilestoneParams } from "./reopen-milestone.js";
32
+ import { handleReopenMilestone } from "./reopen-milestone.js";
33
+ import type { ReopenSliceParams } from "./reopen-slice.js";
34
+ import { handleReopenSlice } from "./reopen-slice.js";
35
+ import type { ReopenTaskParams } from "./reopen-task.js";
36
+ import { handleReopenTask } from "./reopen-task.js";
28
37
  import type { ReassessRoadmapParams } from "./reassess-roadmap.js";
29
38
  import { handleReassessRoadmap } from "./reassess-roadmap.js";
30
39
  import type { ValidateMilestoneParams } from "./validate-milestone.js";
@@ -311,6 +320,9 @@ export type SliceCompleteExecutorParams = CompleteSliceParams;
311
320
  export type PlanMilestoneExecutorParams = PlanMilestoneParams;
312
321
  export type PlanSliceExecutorParams = PlanSliceParams;
313
322
  export type ReplanSliceExecutorParams = ReplanSliceParams;
323
+ export type ReopenTaskExecutorParams = ReopenTaskParams;
324
+ export type ReopenSliceExecutorParams = ReopenSliceParams;
325
+ export type ReopenMilestoneExecutorParams = ReopenMilestoneParams;
314
326
  export type ValidateMilestoneExecutorParams = ValidateMilestoneParams;
315
327
  export type ReassessRoadmapExecutorParams = ReassessRoadmapParams;
316
328
 
@@ -371,6 +383,129 @@ export async function executeTaskComplete(
371
383
  }
372
384
  }
373
385
 
386
+ export async function executeTaskReopen(
387
+ params: ReopenTaskExecutorParams,
388
+ basePath: string = process.cwd(),
389
+ ): Promise<ToolExecutionResult> {
390
+ const dbAvailable = await ensureDbOpen(basePath);
391
+ if (!dbAvailable) {
392
+ return {
393
+ content: [{ type: "text", text: "Error: GSD database is not available. Cannot reopen task." }],
394
+ details: { operation: "reopen_task", error: "db_unavailable" },
395
+ isError: true,
396
+ };
397
+ }
398
+ try {
399
+ const result = await handleReopenTask(params, basePath);
400
+ if ("error" in result) {
401
+ return {
402
+ content: [{ type: "text", text: `Error reopening task: ${result.error}` }],
403
+ details: { operation: "reopen_task", error: result.error },
404
+ isError: true,
405
+ };
406
+ }
407
+ return {
408
+ content: [{ type: "text", text: `Reopened task ${result.taskId} (${result.sliceId}/${result.milestoneId})` }],
409
+ details: {
410
+ operation: "reopen_task",
411
+ taskId: result.taskId,
412
+ sliceId: result.sliceId,
413
+ milestoneId: result.milestoneId,
414
+ },
415
+ };
416
+ } catch (err) {
417
+ const msg = err instanceof Error ? err.message : String(err);
418
+ logError("tool", `reopen_task tool failed: ${msg}`, { tool: "gsd_task_reopen", error: String(err) });
419
+ return {
420
+ content: [{ type: "text", text: `Error reopening task: ${msg}` }],
421
+ details: { operation: "reopen_task", error: msg },
422
+ isError: true,
423
+ };
424
+ }
425
+ }
426
+
427
+ export async function executeSliceReopen(
428
+ params: ReopenSliceExecutorParams,
429
+ basePath: string = process.cwd(),
430
+ ): Promise<ToolExecutionResult> {
431
+ const dbAvailable = await ensureDbOpen(basePath);
432
+ if (!dbAvailable) {
433
+ return {
434
+ content: [{ type: "text", text: "Error: GSD database is not available. Cannot reopen slice." }],
435
+ details: { operation: "reopen_slice", error: "db_unavailable" },
436
+ isError: true,
437
+ };
438
+ }
439
+ try {
440
+ const result = await handleReopenSlice(params, basePath);
441
+ if ("error" in result) {
442
+ return {
443
+ content: [{ type: "text", text: `Error reopening slice: ${result.error}` }],
444
+ details: { operation: "reopen_slice", error: result.error },
445
+ isError: true,
446
+ };
447
+ }
448
+ return {
449
+ content: [{ type: "text", text: `Reopened slice ${result.sliceId} (${result.milestoneId})` }],
450
+ details: {
451
+ operation: "reopen_slice",
452
+ sliceId: result.sliceId,
453
+ milestoneId: result.milestoneId,
454
+ tasksReset: result.tasksReset,
455
+ },
456
+ };
457
+ } catch (err) {
458
+ const msg = err instanceof Error ? err.message : String(err);
459
+ logError("tool", `reopen_slice tool failed: ${msg}`, { tool: "gsd_slice_reopen", error: String(err) });
460
+ return {
461
+ content: [{ type: "text", text: `Error reopening slice: ${msg}` }],
462
+ details: { operation: "reopen_slice", error: msg },
463
+ isError: true,
464
+ };
465
+ }
466
+ }
467
+
468
+ export async function executeMilestoneReopen(
469
+ params: ReopenMilestoneExecutorParams,
470
+ basePath: string = process.cwd(),
471
+ ): Promise<ToolExecutionResult> {
472
+ const dbAvailable = await ensureDbOpen(basePath);
473
+ if (!dbAvailable) {
474
+ return {
475
+ content: [{ type: "text", text: "Error: GSD database is not available. Cannot reopen milestone." }],
476
+ details: { operation: "reopen_milestone", error: "db_unavailable" },
477
+ isError: true,
478
+ };
479
+ }
480
+ try {
481
+ const result = await handleReopenMilestone(params, basePath);
482
+ if ("error" in result) {
483
+ return {
484
+ content: [{ type: "text", text: `Error reopening milestone: ${result.error}` }],
485
+ details: { operation: "reopen_milestone", error: result.error },
486
+ isError: true,
487
+ };
488
+ }
489
+ return {
490
+ content: [{ type: "text", text: `Reopened milestone ${result.milestoneId}` }],
491
+ details: {
492
+ operation: "reopen_milestone",
493
+ milestoneId: result.milestoneId,
494
+ slicesReset: result.slicesReset,
495
+ tasksReset: result.tasksReset,
496
+ },
497
+ };
498
+ } catch (err) {
499
+ const msg = err instanceof Error ? err.message : String(err);
500
+ logError("tool", `reopen_milestone tool failed: ${msg}`, { tool: "gsd_milestone_reopen", error: String(err) });
501
+ return {
502
+ content: [{ type: "text", text: `Error reopening milestone: ${msg}` }],
503
+ details: { operation: "reopen_milestone", error: msg },
504
+ isError: true,
505
+ };
506
+ }
507
+ }
508
+
374
509
  export async function executeSliceComplete(
375
510
  params: SliceCompleteExecutorParams,
376
511
  basePath: string = process.cwd(),
@@ -106,7 +106,7 @@ export interface AuditWarning {
106
106
  export interface VerificationResult {
107
107
  passed: boolean; // true if all checks passed (or no checks discovered)
108
108
  checks: VerificationCheck[]; // per-command results
109
- discoverySource: "preference" | "task-plan" | "package-json" | "none";
109
+ discoverySource: "preference" | "task-plan" | "package-json" | "python-project" | "none";
110
110
  timestamp: number; // Date.now() at gate start
111
111
  runtimeErrors?: RuntimeError[]; // optional — populated by captureRuntimeErrors()
112
112
  auditWarnings?: AuditWarning[]; // optional — populated by runDependencyAudit()