gsd-pi 2.79.0 → 2.80.0-dev.c5f2443b3

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 (635) hide show
  1. package/README.md +94 -47
  2. package/dist/loader.js +0 -0
  3. package/dist/resources/.managed-resources-content-hash +1 -1
  4. package/dist/resources/extensions/github-sync/templates.js +55 -70
  5. package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
  6. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
  7. package/dist/resources/extensions/gsd/auto/loop.js +359 -523
  8. package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
  9. package/dist/resources/extensions/gsd/auto/phases.js +61 -7
  10. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  11. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
  16. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
  21. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
  23. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
  24. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
  26. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
  27. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
  28. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
  29. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
  30. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  31. package/dist/resources/extensions/gsd/auto-dashboard.js +3 -0
  32. package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
  33. package/dist/resources/extensions/gsd/auto-prompts.js +220 -32
  34. package/dist/resources/extensions/gsd/auto-recovery.js +63 -55
  35. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
  36. package/dist/resources/extensions/gsd/auto-start.js +3 -2
  37. package/dist/resources/extensions/gsd/auto-verification.js +2 -11
  38. package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
  39. package/dist/resources/extensions/gsd/auto.js +159 -2
  40. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +9 -1
  41. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  42. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  43. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +52 -50
  44. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +8 -8
  45. package/dist/resources/extensions/gsd/commands/context.js +1 -1
  46. package/dist/resources/extensions/gsd/commands-ship.js +23 -46
  47. package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
  48. package/dist/resources/extensions/gsd/component-loader.js +5 -11
  49. package/dist/resources/extensions/gsd/custom-workflow-engine.js +4 -0
  50. package/dist/resources/extensions/gsd/db-adapter.js +47 -0
  51. package/dist/resources/extensions/gsd/db-base-schema.js +337 -0
  52. package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
  53. package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
  54. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
  55. package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
  56. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
  57. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
  58. package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
  59. package/dist/resources/extensions/gsd/db-migration-steps.js +394 -0
  60. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
  61. package/dist/resources/extensions/gsd/db-open-state.js +32 -0
  62. package/dist/resources/extensions/gsd/db-provider.js +108 -0
  63. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
  64. package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
  65. package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
  66. package/dist/resources/extensions/gsd/db-transaction.js +63 -0
  67. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
  68. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
  69. package/dist/resources/extensions/gsd/escalation.js +2 -0
  70. package/dist/resources/extensions/gsd/gsd-db.js +215 -1519
  71. package/dist/resources/extensions/gsd/guided-flow.js +40 -0
  72. package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
  73. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
  74. package/dist/resources/extensions/gsd/model-router.js +9 -6
  75. package/dist/resources/extensions/gsd/notification-widget.js +21 -3
  76. package/dist/resources/extensions/gsd/paths.js +5 -1
  77. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
  78. package/dist/resources/extensions/gsd/pr-evidence.js +76 -0
  79. package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
  80. package/dist/resources/extensions/gsd/preferences-types.js +20 -2
  81. package/dist/resources/extensions/gsd/preferences-validation.js +3 -3
  82. package/dist/resources/extensions/gsd/process-task-path.js +61 -0
  83. package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
  84. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  85. package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  86. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  87. package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
  88. package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
  89. package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
  90. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  91. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  92. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  93. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  94. package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  95. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  96. package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  97. package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
  98. package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  99. package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
  100. package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
  101. package/dist/resources/extensions/gsd/prompts/system.md +65 -107
  102. package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  103. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  104. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  105. package/dist/resources/extensions/gsd/state.js +4 -0
  106. package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
  107. package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
  108. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +88 -3
  109. package/dist/resources/extensions/gsd/unit-context-composer.js +32 -0
  110. package/dist/resources/extensions/gsd/unit-context-manifest.js +21 -0
  111. package/dist/resources/extensions/gsd/uok/audit.js +23 -9
  112. package/dist/resources/extensions/gsd/uok/contracts.js +69 -1
  113. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +3 -0
  114. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  115. package/dist/resources/extensions/gsd/uok/loop-adapter.js +48 -33
  116. package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
  117. package/dist/resources/extensions/gsd/uok/timeline.js +125 -0
  118. package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
  119. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  120. package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
  121. package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
  122. package/dist/resources/extensions/shared/gsd-phase-state.js +45 -3
  123. package/dist/resources/extensions/shared/interview-ui.js +15 -4
  124. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  125. package/dist/web/standalone/.next/BUILD_ID +1 -1
  126. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  127. package/dist/web/standalone/.next/build-manifest.json +3 -3
  128. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  129. package/dist/web/standalone/.next/required-server-files.json +4 -4
  130. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  131. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  141. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  160. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  176. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  205. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  219. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  227. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  249. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  254. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  265. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/app/index.html +1 -1
  267. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  268. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  269. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  270. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  271. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  272. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  273. package/dist/web/standalone/.next/server/app/page.js +2 -2
  274. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  275. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  276. package/dist/web/standalone/.next/server/chunks/167.js +2 -0
  277. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  278. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  279. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  280. package/dist/web/standalone/.next/server/middleware.js +2 -2
  281. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  282. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  283. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  284. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  285. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  286. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  287. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  288. package/dist/web/standalone/.next/static/chunks/app/page-fab3ebb85b006001.js +1 -0
  289. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  290. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  291. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  292. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  293. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  294. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  295. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  296. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  297. package/dist/web/standalone/package.json +1 -0
  298. package/dist/web/standalone/server.js +1 -1
  299. package/package.json +9 -2
  300. package/packages/contracts/dist/index.d.ts +3 -0
  301. package/packages/contracts/dist/index.d.ts.map +1 -0
  302. package/packages/contracts/dist/index.js +5 -0
  303. package/packages/contracts/dist/index.js.map +1 -0
  304. package/packages/contracts/dist/rpc.d.ts +549 -0
  305. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  306. package/packages/contracts/dist/rpc.js +53 -0
  307. package/packages/contracts/dist/rpc.js.map +1 -0
  308. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  309. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  310. package/packages/contracts/dist/rpc.test.js +47 -0
  311. package/packages/contracts/dist/rpc.test.js.map +1 -0
  312. package/packages/contracts/dist/workflow.d.ts +180 -0
  313. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  314. package/packages/contracts/dist/workflow.js +201 -0
  315. package/packages/contracts/dist/workflow.js.map +1 -0
  316. package/packages/contracts/package.json +39 -0
  317. package/packages/contracts/src/index.ts +5 -0
  318. package/packages/contracts/src/rpc.test.ts +72 -0
  319. package/packages/contracts/src/rpc.ts +286 -0
  320. package/packages/contracts/src/workflow.ts +213 -0
  321. package/packages/contracts/tsconfig.json +25 -0
  322. package/packages/contracts/tsconfig.tsbuildinfo +1 -0
  323. package/packages/daemon/package.json +3 -2
  324. package/packages/daemon/src/event-bridge.test.ts +2 -1
  325. package/packages/daemon/src/event-bridge.ts +1 -1
  326. package/packages/daemon/src/event-formatter.test.ts +1 -2
  327. package/packages/daemon/src/event-formatter.ts +1 -2
  328. package/packages/daemon/src/session-manager.ts +2 -2
  329. package/packages/daemon/src/types.ts +3 -18
  330. package/packages/mcp-server/dist/server.d.ts +13 -0
  331. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  332. package/packages/mcp-server/dist/server.js +77 -0
  333. package/packages/mcp-server/dist/server.js.map +1 -1
  334. package/packages/mcp-server/dist/session-manager.js +1 -1
  335. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  336. package/packages/mcp-server/dist/types.d.ts +3 -11
  337. package/packages/mcp-server/dist/types.d.ts.map +1 -1
  338. package/packages/mcp-server/dist/types.js.map +1 -1
  339. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  340. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  341. package/packages/mcp-server/dist/workflow-tools.js +52 -37
  342. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  343. package/packages/mcp-server/package.json +3 -2
  344. package/packages/mcp-server/src/mcp-server.test.ts +138 -0
  345. package/packages/mcp-server/src/server.ts +99 -1
  346. package/packages/mcp-server/src/session-manager.ts +2 -2
  347. package/packages/mcp-server/src/types.ts +7 -18
  348. package/packages/mcp-server/src/workflow-tools.test.ts +129 -2
  349. package/packages/mcp-server/src/workflow-tools.ts +80 -37
  350. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  351. package/packages/native/package.json +1 -1
  352. package/packages/pi-agent-core/package.json +1 -1
  353. package/packages/pi-ai/package.json +1 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +14 -0
  355. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +20 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +6 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +9 -1
  362. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +31 -10
  364. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
  366. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
  368. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  369. package/packages/pi-coding-agent/package.json +2 -1
  370. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +23 -2
  371. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
  372. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +6 -1
  373. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -9
  374. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
  375. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  376. package/packages/pi-tui/dist/tui.d.ts +1 -0
  377. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  378. package/packages/pi-tui/dist/tui.js +8 -2
  379. package/packages/pi-tui/dist/tui.js.map +1 -1
  380. package/packages/pi-tui/package.json +1 -1
  381. package/packages/pi-tui/src/tui.ts +8 -2
  382. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  383. package/packages/rpc-client/README.md +3 -3
  384. package/packages/rpc-client/dist/index.d.ts +1 -1
  385. package/packages/rpc-client/dist/index.d.ts.map +1 -1
  386. package/packages/rpc-client/dist/index.js.map +1 -1
  387. package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
  388. package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
  389. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  390. package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
  391. package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
  392. package/packages/rpc-client/dist/rpc-types.js +3 -11
  393. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  394. package/packages/rpc-client/package.json +4 -1
  395. package/packages/rpc-client/src/index.ts +1 -1
  396. package/packages/rpc-client/src/rpc-client.ts +3 -6
  397. package/packages/rpc-client/src/rpc-types.ts +3 -398
  398. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  399. package/pkg/package.json +1 -1
  400. package/src/resources/extensions/github-sync/templates.ts +59 -84
  401. package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
  402. package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
  403. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  404. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
  405. package/src/resources/extensions/gsd/auto/loop.ts +411 -598
  406. package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
  407. package/src/resources/extensions/gsd/auto/phases.ts +88 -9
  408. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  409. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  410. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  411. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  412. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  413. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  414. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  415. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
  416. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  417. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  418. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  419. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
  420. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
  421. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  422. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  423. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  424. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  425. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  426. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  427. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
  428. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  429. package/src/resources/extensions/gsd/auto-dashboard.ts +4 -0
  430. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
  431. package/src/resources/extensions/gsd/auto-prompts.ts +276 -31
  432. package/src/resources/extensions/gsd/auto-recovery.ts +59 -53
  433. package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
  434. package/src/resources/extensions/gsd/auto-start.ts +3 -2
  435. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  436. package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
  437. package/src/resources/extensions/gsd/auto.ts +167 -1
  438. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +14 -1
  439. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
  440. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  441. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +62 -51
  442. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +97 -0
  443. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +8 -4
  444. package/src/resources/extensions/gsd/commands/context.ts +1 -1
  445. package/src/resources/extensions/gsd/commands-ship.ts +24 -51
  446. package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
  447. package/src/resources/extensions/gsd/component-loader.ts +5 -11
  448. package/src/resources/extensions/gsd/custom-workflow-engine.ts +6 -0
  449. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  450. package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
  451. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  452. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  453. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  454. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  455. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  456. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  457. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  458. package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
  459. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  460. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  461. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  462. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  463. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  464. package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
  465. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  466. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  467. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  468. package/src/resources/extensions/gsd/escalation.ts +3 -1
  469. package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
  470. package/src/resources/extensions/gsd/guided-flow.ts +47 -0
  471. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  472. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  473. package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
  474. package/src/resources/extensions/gsd/model-router.ts +10 -6
  475. package/src/resources/extensions/gsd/notification-widget.ts +25 -4
  476. package/src/resources/extensions/gsd/paths.ts +6 -1
  477. package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
  478. package/src/resources/extensions/gsd/pr-evidence.ts +124 -0
  479. package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
  480. package/src/resources/extensions/gsd/preferences-types.ts +23 -4
  481. package/src/resources/extensions/gsd/preferences-validation.ts +3 -3
  482. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  483. package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
  484. package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  485. package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  486. package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  487. package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
  488. package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
  489. package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
  490. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  491. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  492. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  493. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  494. package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  495. package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  496. package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  497. package/src/resources/extensions/gsd/prompts/queue.md +46 -53
  498. package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  499. package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
  500. package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
  501. package/src/resources/extensions/gsd/prompts/system.md +65 -107
  502. package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  503. package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  504. package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  505. package/src/resources/extensions/gsd/state.ts +6 -3
  506. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +32 -0
  507. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +65 -0
  508. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +38 -0
  509. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
  510. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
  511. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +108 -1
  512. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
  513. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
  514. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -2
  515. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +203 -0
  516. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +148 -0
  517. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
  518. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
  519. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  520. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
  521. package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
  522. package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
  523. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +38 -0
  524. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  525. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +12 -0
  526. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
  527. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  528. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  529. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  530. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  531. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  532. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  533. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  534. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  535. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  536. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  537. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  538. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  539. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  540. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  541. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  542. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
  543. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  544. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  545. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +42 -0
  546. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +63 -2
  547. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  548. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +109 -0
  549. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
  550. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  551. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
  552. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  553. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
  554. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  555. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +14 -0
  556. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
  557. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
  558. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
  559. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
  560. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  561. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  562. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
  563. package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
  564. package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
  565. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
  566. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +8 -0
  567. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
  568. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  569. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
  570. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
  571. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
  572. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  573. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +3 -0
  574. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  575. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
  576. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  577. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +85 -0
  578. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +2 -0
  579. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +59 -0
  580. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
  581. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +42 -4
  582. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +32 -0
  583. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +109 -1
  584. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
  585. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +98 -0
  586. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  587. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  588. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  589. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  590. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  591. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  592. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
  593. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  594. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  595. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  596. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
  597. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
  598. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
  599. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  600. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  601. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  602. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  603. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
  604. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +164 -3
  605. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  606. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  607. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
  608. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +3 -0
  609. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
  610. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  611. package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
  612. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +90 -2
  613. package/src/resources/extensions/gsd/unit-context-composer.ts +49 -0
  614. package/src/resources/extensions/gsd/unit-context-manifest.ts +34 -0
  615. package/src/resources/extensions/gsd/uok/audit.ts +25 -9
  616. package/src/resources/extensions/gsd/uok/contracts.ts +105 -0
  617. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +4 -0
  618. package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
  619. package/src/resources/extensions/gsd/uok/loop-adapter.ts +60 -45
  620. package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
  621. package/src/resources/extensions/gsd/uok/timeline.ts +158 -0
  622. package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
  623. package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
  624. package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
  625. package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
  626. package/src/resources/extensions/shared/gsd-phase-state.ts +56 -3
  627. package/src/resources/extensions/shared/interview-ui.ts +18 -5
  628. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +43 -1
  629. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
  630. package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
  631. package/dist/web/standalone/.next/static/chunks/app/page-ff639266d978f2a0.js +0 -1
  632. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  633. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  634. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → bQDK5_LtkGVS64AirQgQG}/_buildManifest.js +0 -0
  635. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → bQDK5_LtkGVS64AirQgQG}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gsd-build/mcp-server",
3
- "version": "2.79.0",
3
+ "version": "2.80.0",
4
4
  "description": "MCP server exposing GSD orchestration tools for Claude Code, Cursor, and other MCP clients",
5
5
  "license": "MIT",
6
6
  "gsd": {
@@ -34,8 +34,9 @@
34
34
  "test": "npm run build:test && node --test dist/mcp-server.test.js dist/remote-questions.test.js"
35
35
  },
36
36
  "dependencies": {
37
+ "@gsd-build/contracts": "^2.80.0",
38
+ "@gsd-build/rpc-client": "^2.80.0",
37
39
  "@modelcontextprotocol/sdk": "^1.27.1",
38
- "@gsd-build/rpc-client": "^2.79.0",
39
40
  "zod": "^4.0.0"
40
41
  },
41
42
  "devDependencies": {
@@ -882,6 +882,144 @@ describe('createMcpServer tool registration', () => {
882
882
  );
883
883
  });
884
884
 
885
+ it('ask_user_questions persists confirmed depth gates for local answers', async () => {
886
+ const questions = [
887
+ {
888
+ id: 'depth_verification_M003_confirm',
889
+ header: 'Depth Check',
890
+ question: 'Did I capture the depth right?',
891
+ options: [
892
+ { label: 'Yes, you got it (Recommended)', description: 'Continue with the current summary.' },
893
+ { label: 'Not quite', description: 'I need to clarify the depth further.' },
894
+ ],
895
+ },
896
+ ];
897
+ const calls: string[] = [];
898
+ const writeGate = {
899
+ isGateQuestionId(questionId: string) {
900
+ return questionId.startsWith('depth_verification_');
901
+ },
902
+ isDepthConfirmationAnswer(selected: unknown, options?: Array<{ label?: string }>) {
903
+ return selected === options?.[0]?.label;
904
+ },
905
+ setPendingGate(gateId: string, basePath: string) {
906
+ calls.push(`pending:${gateId}:${basePath}`);
907
+ },
908
+ markApprovalGateVerified(gateId?: string | null, basePath?: string) {
909
+ calls.push(`approval:${gateId}:${basePath}`);
910
+ },
911
+ markDepthVerified(milestoneId?: string | null, basePath?: string) {
912
+ calls.push(`depth:${milestoneId}:${basePath}`);
913
+ },
914
+ clearPendingGate(basePath: string) {
915
+ calls.push(`clear:${basePath}`);
916
+ },
917
+ extractDepthVerificationMilestoneId(questionId: string) {
918
+ return questionId.match(/_(M\d+)_/)?.[1] ?? null;
919
+ },
920
+ };
921
+
922
+ const result = await askUserQuestionsHandler(questions, undefined, {
923
+ async elicitInput() {
924
+ return {
925
+ action: 'accept',
926
+ content: {
927
+ depth_verification_M003_confirm: 'Yes, you got it (Recommended)',
928
+ },
929
+ };
930
+ },
931
+ isRemoteConfigured() {
932
+ return false;
933
+ },
934
+ async tryRemoteQuestions() {
935
+ throw new Error('should not be called');
936
+ },
937
+ writeGate,
938
+ writeGateBasePath: '/tmp/gsd-project',
939
+ });
940
+
941
+ assert.equal('isError' in result && result.isError, false);
942
+ assert.deepEqual(calls, [
943
+ 'pending:depth_verification_M003_confirm:/tmp/gsd-project',
944
+ 'approval:depth_verification_M003_confirm:/tmp/gsd-project',
945
+ 'depth:M003:/tmp/gsd-project',
946
+ 'clear:/tmp/gsd-project',
947
+ ]);
948
+ });
949
+
950
+ it('ask_user_questions persists confirmed depth gates for remote answers', async () => {
951
+ const questions = [
952
+ {
953
+ id: 'depth_verification_M003_confirm',
954
+ header: 'Depth Check',
955
+ question: 'Did I capture the depth right?',
956
+ options: [
957
+ { label: 'Yes, you got it (Recommended)', description: 'Continue with the current summary.' },
958
+ { label: 'Not quite', description: 'I need to clarify the depth further.' },
959
+ ],
960
+ },
961
+ ];
962
+ const calls: string[] = [];
963
+ const writeGate = {
964
+ isGateQuestionId(questionId: string) {
965
+ return questionId.startsWith('depth_verification_');
966
+ },
967
+ isDepthConfirmationAnswer(selected: unknown, options?: Array<{ label?: string }>) {
968
+ return selected === options?.[0]?.label;
969
+ },
970
+ setPendingGate(gateId: string, basePath: string) {
971
+ calls.push(`pending:${gateId}:${basePath}`);
972
+ },
973
+ markApprovalGateVerified(gateId?: string | null, basePath?: string) {
974
+ calls.push(`approval:${gateId}:${basePath}`);
975
+ },
976
+ markDepthVerified(milestoneId?: string | null, basePath?: string) {
977
+ calls.push(`depth:${milestoneId}:${basePath}`);
978
+ },
979
+ clearPendingGate(basePath: string) {
980
+ calls.push(`clear:${basePath}`);
981
+ },
982
+ extractDepthVerificationMilestoneId(questionId: string) {
983
+ return questionId.match(/_(M\d+)_/)?.[1] ?? null;
984
+ },
985
+ };
986
+
987
+ const result = await askUserQuestionsHandler(questions, undefined, {
988
+ async elicitInput() {
989
+ return { action: 'cancel' };
990
+ },
991
+ isRemoteConfigured() {
992
+ return true;
993
+ },
994
+ async tryRemoteQuestions() {
995
+ return {
996
+ content: [{ type: 'text', text: 'remote response' }],
997
+ details: {
998
+ response: {
999
+ endInterview: false,
1000
+ answers: {
1001
+ depth_verification_M003_confirm: {
1002
+ selected: 'Yes, you got it (Recommended)',
1003
+ notes: '',
1004
+ },
1005
+ },
1006
+ },
1007
+ },
1008
+ };
1009
+ },
1010
+ writeGate,
1011
+ writeGateBasePath: '/tmp/gsd-project',
1012
+ });
1013
+
1014
+ assert.equal('isError' in result && result.isError, false);
1015
+ assert.deepEqual(calls, [
1016
+ 'pending:depth_verification_M003_confirm:/tmp/gsd-project',
1017
+ 'approval:depth_verification_M003_confirm:/tmp/gsd-project',
1018
+ 'depth:M003:/tmp/gsd-project',
1019
+ 'clear:/tmp/gsd-project',
1020
+ ]);
1021
+ });
1022
+
885
1023
  it('ask_user_questions falls back to remote when local elicitation is cancelled', async () => {
886
1024
  const questions = [
887
1025
  {
@@ -15,6 +15,7 @@ import { readFile, readdir } from 'node:fs/promises';
15
15
  import { join, resolve } from 'node:path';
16
16
  import { spawn } from 'node:child_process';
17
17
  import { createRequire } from 'node:module';
18
+ import { pathToFileURL } from 'node:url';
18
19
  import { z } from 'zod';
19
20
  import type { SessionManager } from './session-manager.js';
20
21
  import { isRemoteConfigured, tryRemoteQuestions } from './remote-questions.js';
@@ -355,6 +356,16 @@ interface AskUserQuestionsStructuredContent {
355
356
  cancelled: boolean;
356
357
  }
357
358
 
359
+ interface AskUserQuestionsWriteGateModule {
360
+ isGateQuestionId(questionId: string): boolean;
361
+ isDepthConfirmationAnswer(selected: unknown, options?: Array<{ label?: string }>): boolean;
362
+ setPendingGate(gateId: string, basePath: string): void;
363
+ markApprovalGateVerified(gateId?: string | null, basePath?: string): void;
364
+ markDepthVerified(milestoneId?: string | null, basePath?: string): void;
365
+ clearPendingGate(basePath: string): void;
366
+ extractDepthVerificationMilestoneId(questionId: string): string | null;
367
+ }
368
+
358
369
  const OTHER_OPTION_LABEL = 'None of the above';
359
370
 
360
371
  function normalizeAskUserQuestionsNote(value: AskUserQuestionsContentValue | undefined): string {
@@ -499,6 +510,90 @@ interface AskUserQuestionsHandlerDeps {
499
510
  elicitInput(params: AskUserQuestionsElicitRequest): Promise<AskUserQuestionsElicitResult>;
500
511
  isRemoteConfigured(): boolean;
501
512
  tryRemoteQuestions(questions: AskUserQuestion[], signal?: AbortSignal): Promise<RemoteToolResult | null>;
513
+ writeGate?: AskUserQuestionsWriteGateModule | null;
514
+ writeGateBasePath?: string;
515
+ }
516
+
517
+ let askUserQuestionsWriteGateModulePromise: Promise<AskUserQuestionsWriteGateModule | null> | null = null;
518
+
519
+ function isAskUserQuestionsWriteGateModule(value: unknown): value is AskUserQuestionsWriteGateModule {
520
+ if (!value || typeof value !== 'object') return false;
521
+ const module = value as Record<string, unknown>;
522
+ return (
523
+ typeof module['isGateQuestionId'] === 'function' &&
524
+ typeof module['isDepthConfirmationAnswer'] === 'function' &&
525
+ typeof module['setPendingGate'] === 'function' &&
526
+ typeof module['markApprovalGateVerified'] === 'function' &&
527
+ typeof module['markDepthVerified'] === 'function' &&
528
+ typeof module['clearPendingGate'] === 'function' &&
529
+ typeof module['extractDepthVerificationMilestoneId'] === 'function'
530
+ );
531
+ }
532
+
533
+ async function loadAskUserQuestionsWriteGateModule(): Promise<AskUserQuestionsWriteGateModule | null> {
534
+ if (!askUserQuestionsWriteGateModulePromise) {
535
+ askUserQuestionsWriteGateModulePromise = (async () => {
536
+ const modulePath = process.env.GSD_WORKFLOW_WRITE_GATE_MODULE?.trim();
537
+ if (!modulePath) return null;
538
+ try {
539
+ if (/^[a-z]{2,}:/i.test(modulePath) && !modulePath.startsWith('file:')) {
540
+ throw new Error('GSD_WORKFLOW_WRITE_GATE_MODULE only supports file: URLs or filesystem paths.');
541
+ }
542
+ const baseRoot = process.env.GSD_WORKFLOW_PROJECT_ROOT?.trim() || process.cwd();
543
+ const specifier = modulePath.startsWith('file:') ? modulePath : pathToFileURL(resolve(baseRoot, modulePath)).href;
544
+ const loaded = await import(specifier);
545
+ return isAskUserQuestionsWriteGateModule(loaded) ? loaded : null;
546
+ } catch (err) {
547
+ console.warn(`[gsd:mcp] ask_user_questions write-gate integration unavailable: ${formatErrorMessage(err)}`);
548
+ return null;
549
+ }
550
+ })();
551
+ }
552
+ return askUserQuestionsWriteGateModulePromise;
553
+ }
554
+
555
+ function askUserQuestionsWriteGateBasePath(deps: AskUserQuestionsHandlerDeps): string {
556
+ return deps.writeGateBasePath ?? process.env.GSD_WORKFLOW_PROJECT_ROOT?.trim() ?? process.cwd();
557
+ }
558
+
559
+ async function resolveAskUserQuestionsWriteGate(deps: AskUserQuestionsHandlerDeps): Promise<AskUserQuestionsWriteGateModule | null> {
560
+ if (deps.writeGate !== undefined) return deps.writeGate;
561
+ return loadAskUserQuestionsWriteGateModule();
562
+ }
563
+
564
+ async function recordAskUserQuestionsPendingGate(
565
+ questions: AskUserQuestion[],
566
+ deps: AskUserQuestionsHandlerDeps,
567
+ ): Promise<void> {
568
+ const writeGate = await resolveAskUserQuestionsWriteGate(deps);
569
+ if (!writeGate) return;
570
+
571
+ const basePath = askUserQuestionsWriteGateBasePath(deps);
572
+ for (const question of questions) {
573
+ if (writeGate.isGateQuestionId(question.id)) {
574
+ writeGate.setPendingGate(question.id, basePath);
575
+ }
576
+ }
577
+ }
578
+
579
+ async function recordAskUserQuestionsGateResult(
580
+ structured: AskUserQuestionsStructuredContent,
581
+ deps: AskUserQuestionsHandlerDeps,
582
+ ): Promise<void> {
583
+ if (structured.cancelled || !structured.response) return;
584
+ const writeGate = await resolveAskUserQuestionsWriteGate(deps);
585
+ if (!writeGate) return;
586
+
587
+ const basePath = askUserQuestionsWriteGateBasePath(deps);
588
+ for (const question of structured.questions) {
589
+ if (!writeGate.isGateQuestionId(question.id)) continue;
590
+ const selected = structured.response.answers[question.id]?.selected;
591
+ if (!writeGate.isDepthConfirmationAnswer(selected, question.options)) continue;
592
+
593
+ writeGate.markApprovalGateVerified(question.id, basePath);
594
+ writeGate.markDepthVerified(writeGate.extractDepthVerificationMilestoneId(question.id), basePath);
595
+ writeGate.clearPendingGate(basePath);
596
+ }
502
597
  }
503
598
 
504
599
  function isLocalElicitFallbackError(err: unknown): boolean {
@@ -539,6 +634,7 @@ export async function askUserQuestionsHandler(
539
634
  try {
540
635
  const validationError = validateAskUserQuestionsPayload(questions);
541
636
  if (validationError) return errorContent(validationError);
637
+ await recordAskUserQuestionsPendingGate(questions, deps);
542
638
 
543
639
  // Local-first: try the MCP host's elicitation channel (Claude Code,
544
640
  // Cursor, etc.) before any configured remote channel. A misconfigured
@@ -556,6 +652,7 @@ export async function askUserQuestionsHandler(
556
652
  response: buildAskUserQuestionsRoundResult(questions, elicitation),
557
653
  cancelled: false,
558
654
  };
655
+ await recordAskUserQuestionsGateResult(structured, deps);
559
656
  return {
560
657
  content: [{ type: 'text' as const, text: formatAskUserQuestionsElicitResult(questions, elicitation) }],
561
658
  structuredContent: structured as unknown as Record<string, unknown>,
@@ -612,11 +709,12 @@ export async function askUserQuestionsHandler(
612
709
  response: details!['response'] as AskUserQuestionsRoundResult,
613
710
  cancelled: false,
614
711
  }
615
- : {
712
+ : {
616
713
  questions,
617
714
  response: null,
618
715
  cancelled: true,
619
716
  };
717
+ await recordAskUserQuestionsGateResult(acceptedStructured, deps);
620
718
  return {
621
719
  content: [{ type: 'text' as const, text: remoteResult.content[0]?.text ?? '' }],
622
720
  structuredContent: acceptedStructured as unknown as Record<string, unknown>,
@@ -9,7 +9,7 @@
9
9
  import { readFileSync, existsSync } from 'node:fs';
10
10
  import { resolve, join, delimiter } from 'node:path';
11
11
  import { RpcClient } from '@gsd-build/rpc-client';
12
- import type { SdkAgentEvent, RpcInitResult, RpcCostUpdateEvent, RpcExtensionUIRequest } from '@gsd-build/rpc-client';
12
+ import type { SdkAgentEvent, RpcInitResult, RpcCostUpdateEvent, RpcExtensionUIRequest } from '@gsd-build/contracts';
13
13
  import type {
14
14
  ManagedSession,
15
15
  ExecuteOptions,
@@ -391,7 +391,7 @@ function extractBlocker(event: SdkAgentEvent): PendingBlocker {
391
391
  const uiEvent = event as unknown as RpcExtensionUIRequest;
392
392
  return {
393
393
  id: String(uiEvent.id ?? ''),
394
- method: String(uiEvent.method ?? ''),
394
+ method: uiEvent.method,
395
395
  message: String((uiEvent as Record<string, unknown>).title ?? (uiEvent as Record<string, unknown>).message ?? ''),
396
396
  event: uiEvent,
397
397
  };
@@ -2,7 +2,12 @@
2
2
  * MCP Server types — session lifecycle and orchestration.
3
3
  */
4
4
 
5
- import type { RpcClient, SdkAgentEvent, RpcCostUpdateEvent, RpcExtensionUIRequest } from '@gsd-build/rpc-client';
5
+ import type { RpcClient } from '@gsd-build/rpc-client';
6
+ import type {
7
+ McpPendingBlocker as PendingBlocker,
8
+ RpcCostUpdateEvent,
9
+ SdkAgentEvent,
10
+ } from '@gsd-build/contracts';
6
11
 
7
12
  // ---------------------------------------------------------------------------
8
13
  // Session Status
@@ -46,23 +51,7 @@ export interface ManagedSession {
46
51
  unsubscribe?: () => void;
47
52
  }
48
53
 
49
- // ---------------------------------------------------------------------------
50
- // Pending Blocker
51
- // ---------------------------------------------------------------------------
52
-
53
- export interface PendingBlocker {
54
- /** The extension_ui_request id */
55
- id: string;
56
-
57
- /** The request method (e.g. 'select', 'confirm', 'input') */
58
- method: string;
59
-
60
- /** Human-readable message or title */
61
- message: string;
62
-
63
- /** Full event payload for inspection */
64
- event: RpcExtensionUIRequest;
65
- }
54
+ export type { PendingBlocker };
66
55
 
67
56
  // ---------------------------------------------------------------------------
68
57
  // Cost Accumulator (K004 — cumulative-max)
@@ -132,6 +132,122 @@ describe("workflow MCP tools", () => {
132
132
  }
133
133
  });
134
134
 
135
+ it("gsd_exec runs by default, preserves cwd, and returns structured metadata", async () => {
136
+ const base = makeTmpBase();
137
+ const originalCwd = process.cwd();
138
+ try {
139
+ const server = makeMockServer();
140
+ registerWorkflowTools(server as any);
141
+ const tool = server.tools.find((t) => t.name === "gsd_exec");
142
+ assert.ok(tool, "exec tool should be registered");
143
+
144
+ const result = await tool!.handler({
145
+ projectDir: base,
146
+ runtime: "node",
147
+ script: "console.log(process.cwd()); console.log('context mode default on');",
148
+ purpose: "default-on smoke",
149
+ });
150
+
151
+ const record = result as any;
152
+ assert.equal(record.isError, false);
153
+ assert.match(record.content[0].text as string, /context mode default on/);
154
+ assert.equal(record.structuredContent.operation, "gsd_exec");
155
+ assert.equal(record.structuredContent.runtime, "node");
156
+ assert.ok(existsSync(record.structuredContent.stdout_path), "stdout should be persisted");
157
+ assert.equal(process.cwd(), originalCwd, "gsd_exec must not mutate process.cwd");
158
+ assert.match(
159
+ readFileSync(record.structuredContent.stdout_path, "utf-8"),
160
+ new RegExp(base.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")),
161
+ "script should run relative to the requested projectDir",
162
+ );
163
+ } finally {
164
+ cleanup(base);
165
+ }
166
+ });
167
+
168
+ it("gsd_exec returns an MCP error when context mode is disabled", async () => {
169
+ const base = makeTmpBase();
170
+ try {
171
+ writeFileSync(
172
+ join(base, ".gsd", "PREFERENCES.md"),
173
+ "---\ncontext_mode:\n enabled: false\n---\n",
174
+ "utf-8",
175
+ );
176
+ const server = makeMockServer();
177
+ registerWorkflowTools(server as any);
178
+ const tool = server.tools.find((t) => t.name === "gsd_exec");
179
+ assert.ok(tool, "exec tool should be registered");
180
+
181
+ const result = await tool!.handler({
182
+ projectDir: base,
183
+ runtime: "bash",
184
+ script: "echo should-not-run",
185
+ });
186
+
187
+ assertToolError(result, /context_mode\.enabled: false/);
188
+ assert.equal((result as any).structuredContent.error, "context_mode_disabled");
189
+ } finally {
190
+ cleanup(base);
191
+ }
192
+ });
193
+
194
+ it("gsd_exec_search finds a prior gsd_exec run", async () => {
195
+ const base = makeTmpBase();
196
+ try {
197
+ const server = makeMockServer();
198
+ registerWorkflowTools(server as any);
199
+ const execTool = server.tools.find((t) => t.name === "gsd_exec");
200
+ const searchTool = server.tools.find((t) => t.name === "gsd_exec_search");
201
+ assert.ok(execTool, "exec tool should be registered");
202
+ assert.ok(searchTool, "exec search tool should be registered");
203
+
204
+ await execTool!.handler({
205
+ projectDir: base,
206
+ runtime: "bash",
207
+ script: "printf 'needle-output\\n'",
208
+ purpose: "find-me-later",
209
+ });
210
+
211
+ const result = await searchTool!.handler({
212
+ projectDir: base,
213
+ query: "find-me",
214
+ });
215
+
216
+ assert.match((result as any).content[0].text as string, /find-me-later/);
217
+ assert.equal((result as any).structuredContent.operation, "gsd_exec_search");
218
+ assert.equal((result as any).structuredContent.matches, 1);
219
+ assert.match((result as any).structuredContent.results[0].stdout_path, /\.gsd[\\/]exec[\\/].*\.stdout$/);
220
+ } finally {
221
+ cleanup(base);
222
+ }
223
+ });
224
+
225
+ it("gsd_resume reads the context snapshot", async () => {
226
+ const base = makeTmpBase();
227
+ try {
228
+ writeFileSync(
229
+ join(base, ".gsd", "last-snapshot.md"),
230
+ "# GSD context snapshot\n\nResume from here.\n",
231
+ "utf-8",
232
+ );
233
+ const server = makeMockServer();
234
+ registerWorkflowTools(server as any);
235
+ const tool = server.tools.find((t) => t.name === "gsd_resume");
236
+ assert.ok(tool, "resume tool should be registered");
237
+
238
+ const result = await tool!.handler({ projectDir: base });
239
+
240
+ assert.match((result as any).content[0].text as string, /Resume from here/);
241
+ assert.deepEqual((result as any).structuredContent, {
242
+ operation: "gsd_resume",
243
+ found: true,
244
+ bytes: Buffer.byteLength("# GSD context snapshot\n\nResume from here.\n", "utf-8"),
245
+ });
246
+ } finally {
247
+ cleanup(base);
248
+ }
249
+ });
250
+
135
251
  it("gsd_summary_save supports root-level PROJECT artifacts without milestone_id", async () => {
136
252
  const base = makeTmpBase();
137
253
  try {
@@ -147,10 +263,21 @@ describe("workflow MCP tools", () => {
147
263
  "workflow MCP schema must advertise milestone_id as optional for root artifacts",
148
264
  );
149
265
 
266
+ const projectFixture = [
267
+ "# Project",
268
+ "",
269
+ "Root artifact",
270
+ "",
271
+ "## Milestone Sequence",
272
+ "",
273
+ "- [ ] M001: Foundation - Establish the first runnable slice.",
274
+ "",
275
+ ].join("\n");
276
+
150
277
  const result = await tool!.handler({
151
278
  projectDir: base,
152
279
  artifact_type: "PROJECT",
153
- content: "# Project\n\nRoot artifact",
280
+ content: projectFixture,
154
281
  });
155
282
 
156
283
  const text = (result as any).content[0].text as string;
@@ -161,7 +288,7 @@ describe("workflow MCP tools", () => {
161
288
  );
162
289
  assert.equal(
163
290
  readFileSync(join(base, ".gsd", "PROJECT.md"), "utf-8"),
164
- "# Project\n\nRoot artifact",
291
+ projectFixture,
165
292
  );
166
293
  } finally {
167
294
  cleanup(base);
@@ -7,6 +7,7 @@ import { homedir } from "node:os";
7
7
  import { isAbsolute, join, relative, resolve } from "node:path";
8
8
  import { pathToFileURL } from "node:url";
9
9
  import { z } from "zod";
10
+ import { WORKFLOW_TOOL_NAMES as CONTRACT_WORKFLOW_TOOL_NAMES } from "@gsd-build/contracts";
10
11
 
11
12
  import { logAliasUsage } from "./alias-telemetry.js";
12
13
 
@@ -662,43 +663,7 @@ interface McpToolServer {
662
663
  ): unknown;
663
664
  }
664
665
 
665
- export const WORKFLOW_TOOL_NAMES = [
666
- "gsd_decision_save",
667
- "gsd_save_decision",
668
- "gsd_requirement_update",
669
- "gsd_update_requirement",
670
- "gsd_requirement_save",
671
- "gsd_save_requirement",
672
- "gsd_milestone_generate_id",
673
- "gsd_generate_milestone_id",
674
- "gsd_plan_milestone",
675
- "gsd_plan_slice",
676
- "gsd_plan_task",
677
- "gsd_task_plan",
678
- "gsd_replan_slice",
679
- "gsd_slice_replan",
680
- "gsd_slice_complete",
681
- "gsd_complete_slice",
682
- "gsd_skip_slice",
683
- "gsd_complete_milestone",
684
- "gsd_milestone_complete",
685
- "gsd_validate_milestone",
686
- "gsd_milestone_validate",
687
- "gsd_reassess_roadmap",
688
- "gsd_roadmap_reassess",
689
- "gsd_save_gate_result",
690
- "gsd_summary_save",
691
- "gsd_task_complete",
692
- "gsd_complete_task",
693
- "gsd_milestone_status",
694
- "gsd_journal_query",
695
- // ADR-013 step 3: memory-store tools exposed to external MCP clients.
696
- // gsd_memory_graph is namespaced to avoid collision with the existing
697
- // gsd_graph tool (project knowledge graph from .gsd/ artifacts).
698
- "gsd_capture_thought",
699
- "gsd_memory_query",
700
- "gsd_memory_graph",
701
- ] as const;
666
+ export const WORKFLOW_TOOL_NAMES = CONTRACT_WORKFLOW_TOOL_NAMES;
702
667
 
703
668
  const DEFAULT_WORKFLOW_OP_TIMEOUT_MS = 5 * 60 * 1000;
704
669
 
@@ -1426,6 +1391,30 @@ const journalQueryParams = {
1426
1391
  };
1427
1392
  const journalQuerySchema = z.object(journalQueryParams);
1428
1393
 
1394
+ const execRuntimeSchema = z.enum(["bash", "node", "python"]);
1395
+ const execParams = {
1396
+ projectDir: projectDirParam,
1397
+ runtime: execRuntimeSchema.describe("Interpreter: bash (-c), node (-e), or python3 (-c)."),
1398
+ script: nonEmptyString("script").describe("Script body. Keep output small; full stdout/stderr are persisted under .gsd/exec."),
1399
+ purpose: z.string().optional().describe("Short label recorded in meta.json for later review."),
1400
+ timeout_ms: z.number().int().min(1_000).max(600_000).optional().describe("Per-invocation timeout in milliseconds."),
1401
+ };
1402
+ const execSchema = z.object(execParams);
1403
+
1404
+ const execSearchParams = {
1405
+ projectDir: projectDirParam,
1406
+ query: z.string().optional().describe("Substring matched against id and purpose, case-insensitive."),
1407
+ runtime: execRuntimeSchema.optional().describe("Restrict to one runtime."),
1408
+ failing_only: z.boolean().optional().describe("Only non-zero exit codes and timeouts."),
1409
+ limit: z.number().int().min(1).max(200).optional().describe("Max results (default 20, cap 200)."),
1410
+ };
1411
+ const execSearchSchema = z.object(execSearchParams);
1412
+
1413
+ const resumeParams = {
1414
+ projectDir: projectDirParam,
1415
+ };
1416
+ const resumeSchema = z.object(resumeParams);
1417
+
1429
1418
  /**
1430
1419
  * Wrap a real McpToolServer so every handler we register catches thrown
1431
1420
  * errors and returns a structured `{isError: true, content: [...]}` MCP
@@ -1882,6 +1871,60 @@ export function registerWorkflowTools(realServer: McpToolServer): void {
1882
1871
  },
1883
1872
  );
1884
1873
 
1874
+ server.tool(
1875
+ "gsd_exec",
1876
+ "Run a short bash/node/python script in the project directory. Full stdout/stderr persist under .gsd/exec; only a digest returns to MCP.",
1877
+ execParams,
1878
+ async (args: Record<string, unknown>) => {
1879
+ const { projectDir, ...params } = parseWorkflowArgs(execSchema, args);
1880
+ await enforceWorkflowWriteGate("gsd_exec", projectDir);
1881
+ const [{ executeGsdExec }, { loadEffectiveGSDPreferences }] = await Promise.all([
1882
+ importLocalModule<any>("../../../src/resources/extensions/gsd/tools/exec-tool.js"),
1883
+ importLocalModule<any>("../../../src/resources/extensions/gsd/preferences.js"),
1884
+ ]);
1885
+ let prefs: { preferences?: unknown } | null = null;
1886
+ try {
1887
+ prefs = loadEffectiveGSDPreferences(projectDir);
1888
+ } catch {
1889
+ prefs = null;
1890
+ }
1891
+ return adaptExecutorResult(
1892
+ await runSerializedWorkflowOperation(() =>
1893
+ executeGsdExec(params, {
1894
+ baseDir: projectDir,
1895
+ preferences: (prefs?.preferences ?? null) as unknown,
1896
+ }),
1897
+ ),
1898
+ );
1899
+ },
1900
+ );
1901
+
1902
+ server.tool(
1903
+ "gsd_exec_search",
1904
+ "Search prior gsd_exec runs from .gsd/exec/*.meta.json without re-running them.",
1905
+ execSearchParams,
1906
+ async (args: Record<string, unknown>) => {
1907
+ const { projectDir, ...params } = parseWorkflowArgs(execSearchSchema, args);
1908
+ const { executeExecSearch } = await importLocalModule<any>(
1909
+ "../../../src/resources/extensions/gsd/tools/exec-search-tool.js",
1910
+ );
1911
+ return adaptExecutorResult(executeExecSearch(params, { baseDir: projectDir }));
1912
+ },
1913
+ );
1914
+
1915
+ server.tool(
1916
+ "gsd_resume",
1917
+ "Read .gsd/last-snapshot.md so agents can re-orient after compaction or session resume.",
1918
+ resumeParams,
1919
+ async (args: Record<string, unknown>) => {
1920
+ const { projectDir, ...params } = parseWorkflowArgs(resumeSchema, args);
1921
+ const { executeResume } = await importLocalModule<any>(
1922
+ "../../../src/resources/extensions/gsd/tools/resume-tool.js",
1923
+ );
1924
+ return adaptExecutorResult(executeResume(params, { baseDir: projectDir }));
1925
+ },
1926
+ );
1927
+
1885
1928
  // ─── ADR-013 step 3 — memory-store tools for external MCP clients ────────
1886
1929
  //
1887
1930
  // The same three tools the LLM sees in-process as `capture_thought`,