@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6

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 (500) hide show
  1. package/dist/cli-web-branch.d.ts +2 -0
  2. package/dist/cli-web-branch.js +9 -2
  3. package/dist/help-text.js +5 -0
  4. package/dist/project-sessions.js +4 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/extensions/ask-user-questions.js +78 -23
  7. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
  8. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  9. package/dist/resources/extensions/github-sync/templates.js +3 -3
  10. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  11. package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
  12. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
  14. package/dist/resources/extensions/gsd/auto/phases.js +28 -3
  15. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  16. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  17. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  19. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  20. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
  21. package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
  22. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  23. package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
  24. package/dist/resources/extensions/gsd/auto-start.js +12 -23
  25. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  26. package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
  27. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
  28. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  29. package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
  30. package/dist/resources/extensions/gsd/auto.js +73 -471
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  32. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
  33. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
  36. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  37. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  38. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  39. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  40. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  41. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  42. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  43. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  44. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  45. package/dist/resources/extensions/gsd/debug-logger.js +10 -0
  46. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  47. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  48. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  49. package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
  50. package/dist/resources/extensions/gsd/doctor.js +16 -9
  51. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  52. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  53. package/dist/resources/extensions/gsd/gsd-db.js +12 -0
  54. package/dist/resources/extensions/gsd/guided-flow.js +36 -470
  55. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  56. package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
  57. package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
  58. package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
  59. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  60. package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
  61. package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
  62. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  63. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  64. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  65. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  66. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  67. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  68. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  69. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  70. package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
  71. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  72. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  73. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  74. package/dist/resources/extensions/gsd/preferences.js +147 -29
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  76. package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  78. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  79. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  80. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  84. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  85. package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  86. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  88. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  89. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  90. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  91. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  92. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  93. package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
  94. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  95. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
  96. package/dist/resources/extensions/gsd/state.js +13 -5
  97. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  98. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  99. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  100. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  101. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  102. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  103. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  104. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  105. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  106. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  107. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
  108. package/dist/resources/extensions/gsd/uat-policy.js +16 -10
  109. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  110. package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
  111. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  112. package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
  113. package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
  114. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  115. package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  117. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  118. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  119. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  120. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  121. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  122. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  123. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  124. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  125. package/dist/update-cmd.js +20 -0
  126. package/dist/web/standalone/.next/BUILD_ID +1 -1
  127. package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
  128. package/dist/web/standalone/.next/build-manifest.json +3 -3
  129. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  130. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  131. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +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.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/index.html +1 -1
  183. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
  190. package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
  191. package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
  192. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  193. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  196. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  197. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  198. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  199. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  200. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  201. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  202. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  203. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  204. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  206. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  207. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  208. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  209. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  210. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  211. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  212. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  213. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  214. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  215. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  216. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  217. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  218. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  219. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  220. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  221. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  222. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  223. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  224. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  225. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  226. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  227. package/dist/web-mode.d.ts +2 -0
  228. package/dist/web-mode.js +20 -8
  229. package/package.json +17 -11
  230. package/packages/cloud-mcp-gateway/package.json +2 -2
  231. package/packages/contracts/package.json +1 -1
  232. package/packages/daemon/package.json +4 -4
  233. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  234. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  235. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  236. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  237. package/packages/gsd-agent-core/package.json +5 -5
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  249. package/packages/gsd-agent-modes/package.json +7 -7
  250. package/packages/mcp-server/dist/server.d.ts +10 -0
  251. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  252. package/packages/mcp-server/dist/server.js +8 -0
  253. package/packages/mcp-server/dist/server.js.map +1 -1
  254. package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
  255. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  256. package/packages/mcp-server/dist/workflow-tools.js +2 -1
  257. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  258. package/packages/mcp-server/package.json +3 -3
  259. package/packages/native/package.json +1 -1
  260. package/packages/pi-agent-core/package.json +1 -1
  261. package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
  262. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  263. package/packages/pi-ai/dist/image-models.generated.js +30 -0
  264. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  265. package/packages/pi-ai/dist/models.generated.d.ts +8 -127
  266. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  267. package/packages/pi-ai/dist/models.generated.js +47 -166
  268. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  269. package/packages/pi-ai/package.json +1 -1
  270. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
  272. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  273. package/packages/pi-coding-agent/package.json +7 -7
  274. package/packages/pi-tui/dist/components/input.js +1 -1
  275. package/packages/pi-tui/dist/components/input.js.map +1 -1
  276. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  277. package/packages/pi-tui/dist/keys.js +39 -30
  278. package/packages/pi-tui/dist/keys.js.map +1 -1
  279. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  280. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  281. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  282. package/packages/pi-tui/package.json +2 -2
  283. package/packages/rpc-client/package.json +2 -2
  284. package/pkg/package.json +1 -1
  285. package/scripts/install/deps.js +10 -0
  286. package/scripts/link-workspace-packages.cjs +7 -40
  287. package/src/resources/extensions/ask-user-questions.ts +87 -24
  288. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
  289. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
  290. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  291. package/src/resources/extensions/github-sync/templates.ts +3 -3
  292. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  293. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  294. package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
  295. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  296. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  297. package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
  298. package/src/resources/extensions/gsd/auto/phases.ts +35 -3
  299. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  300. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  301. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  302. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  303. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  304. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
  305. package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
  306. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  307. package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
  308. package/src/resources/extensions/gsd/auto-start.ts +17 -20
  309. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  310. package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
  311. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
  312. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  313. package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
  314. package/src/resources/extensions/gsd/auto.ts +96 -508
  315. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  316. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
  317. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  318. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
  319. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
  320. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  321. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  322. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  323. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  324. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  325. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  326. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  327. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  328. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  329. package/src/resources/extensions/gsd/debug-logger.ts +11 -0
  330. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  331. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  332. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  333. package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
  334. package/src/resources/extensions/gsd/doctor.ts +15 -5
  335. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  336. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  337. package/src/resources/extensions/gsd/gsd-db.ts +12 -0
  338. package/src/resources/extensions/gsd/guided-flow.ts +49 -560
  339. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  340. package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
  341. package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
  342. package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
  343. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  344. package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
  345. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  346. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  347. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  348. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  349. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  350. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  351. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  352. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  353. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  354. package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
  355. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  356. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  357. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  358. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  359. package/src/resources/extensions/gsd/preferences.ts +173 -28
  360. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  361. package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
  362. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  363. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  364. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  365. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  366. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  367. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  368. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  369. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  370. package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  371. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  372. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  373. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  374. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  375. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  376. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  377. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  378. package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
  379. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  380. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
  381. package/src/resources/extensions/gsd/state.ts +15 -5
  382. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  383. package/src/resources/extensions/gsd/templates/project.md +1 -0
  384. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  385. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  386. package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
  387. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  388. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  389. package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
  390. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
  391. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  392. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  393. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +709 -845
  394. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
  395. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  396. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  397. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  398. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  399. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
  400. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
  401. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  402. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
  403. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  404. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
  405. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  406. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  407. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  408. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  409. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
  410. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
  411. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  412. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
  413. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  414. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  415. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  416. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  417. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  418. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  419. package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
  420. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
  421. package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
  422. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  423. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
  424. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  425. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  426. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  427. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
  428. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  429. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  430. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  431. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
  432. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
  433. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  434. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
  435. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  436. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
  437. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  438. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
  439. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
  440. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  441. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  442. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
  443. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
  444. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
  445. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  446. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
  447. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
  448. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  449. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
  450. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  451. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
  452. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  453. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
  454. package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
  455. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  456. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  457. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  458. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  459. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  460. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  461. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
  462. package/src/resources/extensions/gsd/uat-policy.ts +19 -10
  463. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  464. package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
  465. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  466. package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
  467. package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
  468. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  469. package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
  470. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  471. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  472. package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
  473. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  474. package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
  475. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  476. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  477. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  478. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  479. package/dist/web/standalone/.next/server/chunks/678.js +0 -2
  480. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  481. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  482. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  483. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  484. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  485. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  486. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
  487. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
  488. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
  489. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
  490. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
  491. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
  492. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
  493. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
  494. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
  495. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
  496. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
  497. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
  498. package/scripts/ensure-workspace-builds.cjs +0 -129
  499. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
  500. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
@@ -17,9 +17,11 @@ import {
17
17
  getRequiredWorkflowToolsForAutoUnit,
18
18
  getRequiredWorkflowToolsForGuidedUnit,
19
19
  resolveWorkflowMcpProjectRoot,
20
+ isWorkflowMcpSurfaceTool,
20
21
  supportsStructuredQuestions,
21
22
  usesWorkflowMcpTransport,
22
23
  } from "../workflow-mcp.ts";
24
+ import { DB_WORKFLOW_TOOL_NAMES } from "../workflow-tool-surface.ts";
23
25
 
24
26
  const MCP_STDIO_TIMEOUT_MS = 90_000;
25
27
 
@@ -109,6 +111,18 @@ test("workflow MCP capability surface includes native legacy gsd aliases", () =>
109
111
  assert.equal(err, null);
110
112
  });
111
113
 
114
+ test("workflow MCP capability surface includes every shared workflow contract tool", () => {
115
+ for (const name of DB_WORKFLOW_TOOL_NAMES) {
116
+ assert.equal(isWorkflowMcpSurfaceTool(name), true, `${name} should be in workflow MCP surface`);
117
+ }
118
+ });
119
+
120
+ test("workflow MCP capability surface preserves session and read tools outside DB contracts", () => {
121
+ for (const name of ["gsd_execute", "gsd_status", "gsd_progress", "gsd_doctor", "gsd_graph"]) {
122
+ assert.equal(isWorkflowMcpSurfaceTool(name), true, `${name} should stay in workflow MCP surface`);
123
+ }
124
+ });
125
+
112
126
  test("deep project setup units declare required workflow MCP tools", () => {
113
127
  assert.deepEqual(getRequiredWorkflowToolsForGuidedUnit("discuss-project"), [
114
128
  "ask_user_questions",
@@ -615,23 +629,47 @@ test("usesWorkflowMcpTransport matches local externalCli providers", () => {
615
629
  assert.equal(usesWorkflowMcpTransport("oauth", "local://custom"), false);
616
630
  });
617
631
 
618
- test("supportsStructuredQuestions disables local workflow MCP questions unless explicitly enabled", () => {
632
+ test("supportsStructuredQuestions recognizes workflow MCP question tools", () => {
619
633
  assert.equal(
620
634
  supportsStructuredQuestions(["ask_user_questions"], {
621
635
  authMode: "externalCli",
622
636
  baseUrl: "local://claude-code",
623
637
  env: {},
624
638
  }),
625
- false,
639
+ true,
626
640
  );
627
641
  assert.equal(
628
642
  supportsStructuredQuestions(["mcp__gsd-workflow__ask_user_questions"], {
629
643
  authMode: "externalCli",
630
644
  baseUrl: "local://claude-code",
631
- env: { GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS: "1" } as NodeJS.ProcessEnv,
645
+ env: {},
646
+ }),
647
+ true,
648
+ );
649
+ assert.equal(
650
+ supportsStructuredQuestions(["mcp__gsd-workflow__*"], {
651
+ authMode: "externalCli",
652
+ baseUrl: "local://claude-code",
653
+ env: {},
632
654
  }),
633
655
  true,
634
656
  );
657
+ assert.equal(
658
+ supportsStructuredQuestions(["mcp__gsd-browser__*"], {
659
+ authMode: "externalCli",
660
+ baseUrl: "local://claude-code",
661
+ env: {},
662
+ }),
663
+ false,
664
+ );
665
+ assert.equal(
666
+ supportsStructuredQuestions(["mcp__gsd-workflow__ask_user_questions"], {
667
+ authMode: "externalCli",
668
+ baseUrl: "local://claude-code",
669
+ env: { GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS: "0" } as NodeJS.ProcessEnv,
670
+ }),
671
+ false,
672
+ );
635
673
  assert.equal(
636
674
  supportsStructuredQuestions(["ask_user_questions"], {
637
675
  authMode: "oauth",
@@ -648,6 +686,39 @@ test("supportsStructuredQuestions disables local workflow MCP questions unless e
648
686
  );
649
687
  });
650
688
 
689
+ test("supportsStructuredQuestions gates non-local externalCli providers", () => {
690
+ assert.equal(
691
+ supportsStructuredQuestions(["ask_user_questions"], {
692
+ authMode: "externalCli",
693
+ env: {},
694
+ }),
695
+ true,
696
+ );
697
+ assert.equal(
698
+ supportsStructuredQuestions(["ask_user_questions"], {
699
+ authMode: "externalCli",
700
+ baseUrl: "https://api.example.com",
701
+ env: {},
702
+ }),
703
+ true,
704
+ );
705
+ assert.equal(
706
+ supportsStructuredQuestions(["ask_user_questions"], {
707
+ authMode: "externalCli",
708
+ env: { GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS: "0" } as NodeJS.ProcessEnv,
709
+ }),
710
+ false,
711
+ );
712
+ assert.equal(
713
+ supportsStructuredQuestions(["ask_user_questions"], {
714
+ authMode: "externalCli",
715
+ baseUrl: "https://api.example.com",
716
+ env: { GSD_WORKFLOW_MCP_STRUCTURED_QUESTIONS: "0" } as NodeJS.ProcessEnv,
717
+ }),
718
+ false,
719
+ );
720
+ });
721
+
651
722
  test("transport compatibility passes when required tools fit current MCP surface", () => {
652
723
  const error = getWorkflowTransportSupportError(
653
724
  "claude-code",
@@ -835,7 +906,7 @@ test("transport compatibility now allows replan-slice over workflow MCP surface"
835
906
  assert.equal(error, null);
836
907
  });
837
908
 
838
- test("transport compatibility rejects MCP tools not connected in active tool surface", () => {
909
+ test("transport compatibility accepts workflow MCP tools absent from parent active tool surface", () => {
839
910
  const error = getWorkflowTransportSupportError(
840
911
  "claude-code",
841
912
  ["gsd_summary_save"],
@@ -850,10 +921,10 @@ test("transport compatibility rejects MCP tools not connected in active tool sur
850
921
  },
851
922
  );
852
923
 
853
- assert.match(error ?? "", /requires gsd_summary_save/);
924
+ assert.equal(error, null);
854
925
  });
855
926
 
856
- test("transport compatibility checks all required tools against active tool surface", () => {
927
+ test("transport compatibility still checks non-MCP tools against parent active tool surface", () => {
857
928
  const error = getWorkflowTransportSupportError(
858
929
  "claude-code",
859
930
  ["gsd_summary_save", "secure_env_collect"],
@@ -868,9 +939,54 @@ test("transport compatibility checks all required tools against active tool surf
868
939
  },
869
940
  );
870
941
 
871
- assert.match(error ?? "", /requires.*(?:gsd_summary_save|secure_env_collect)/);
872
- assert.match(error ?? "", /gsd_summary_save/);
873
- assert.match(error ?? "", /secure_env_collect/);
942
+ assert.match(error ?? "", /requires secure_env_collect/);
943
+ assert.doesNotMatch(error ?? "", /gsd_summary_save/);
944
+ });
945
+
946
+ test("transport compatibility allows plan-slice MCP tools when parent surface is scoped (regression #457)", () => {
947
+ const error = getWorkflowTransportSupportError(
948
+ "claude-code",
949
+ getRequiredWorkflowToolsForAutoUnit("plan-slice"),
950
+ {
951
+ projectRoot: "/tmp/project",
952
+ env: { GSD_WORKFLOW_MCP_COMMAND: "node" },
953
+ surface: "auto-mode",
954
+ unitType: "plan-slice",
955
+ authMode: "externalCli",
956
+ baseUrl: "local://claude-code",
957
+ activeTools: [
958
+ "ScheduleWakeup",
959
+ "ToolSearch",
960
+ "ask_user_questions",
961
+ "async_bash",
962
+ "await_job",
963
+ "bash",
964
+ "bg_shell",
965
+ "cancel_job",
966
+ "capture_thought",
967
+ "discover_configs",
968
+ "edit",
969
+ "fetch_page",
970
+ "get_library_docs",
971
+ "gsd_checkpoint_db",
972
+ "gsd_exec",
973
+ "gsd_exec_search",
974
+ "gsd_milestone_status",
975
+ "gsd_resume",
976
+ "mcp_call",
977
+ "mcp_discover",
978
+ "mcp_servers",
979
+ "memory_query",
980
+ "read",
981
+ "resolve_library",
982
+ "secure_env_collect",
983
+ "subagent",
984
+ "write",
985
+ ],
986
+ },
987
+ );
988
+
989
+ assert.equal(error, null);
874
990
  });
875
991
 
876
992
  test("transport compatibility still blocks units whose MCP tools are not exposed", () => {
@@ -895,6 +1011,7 @@ test("discuss-milestone guided flow does not abort when all required tools are o
895
1011
  // Guided flow starts the workflow MCP server as part of dispatch, so the
896
1012
  // parent session active-tool list is not authoritative for MCP tools.
897
1013
  const discussMilestoneTools = [
1014
+ "ask_user_questions",
898
1015
  "gsd_summary_save",
899
1016
  "gsd_requirement_save",
900
1017
  "gsd_requirement_update",
@@ -109,6 +109,21 @@ test("ensureWorkspaceGitReadyForPath blocks product file conflicts", async () =>
109
109
  }
110
110
  });
111
111
 
112
+ test("ensureWorkspaceGitReadyForPath does not block on staged files with trailing whitespace", async () => {
113
+ // Regression test for #599: git diff --check exits non-zero for whitespace
114
+ // errors as well as conflict markers. Staged files from auto-generated code
115
+ // often have trailing whitespace; these must not trigger the conflict gate.
116
+ const base = makeTempRepo("gsd-ws-git-whitespace-");
117
+ try {
118
+ writeFileSync(join(base, "app.ts"), "const x = 1; \n"); // trailing whitespace
119
+ git(base, "add", "app.ts");
120
+ const ready = await ensureWorkspaceGitReadyForPath(base);
121
+ assert.equal(ready.ok, true, "trailing whitespace in staged files must not block");
122
+ } finally {
123
+ cleanup(base);
124
+ }
125
+ });
126
+
112
127
  test("isWorkspaceGitAllowedCommand allowlists doctor, closeout, and dispatch complete-milestone", () => {
113
128
  assert.equal(isWorkspaceGitAllowedCommand("doctor"), true);
114
129
  assert.equal(isWorkspaceGitAllowedCommand("doctor fix"), true);
@@ -121,6 +121,27 @@ describe("createWorktree", () => {
121
121
  run("git rev-parse --git-dir", info.path);
122
122
  assert.ok(!existsSync(join(info.path, "orphan.txt")), "stale file removed by recovery");
123
123
  });
124
+
125
+ test("removes stale worktree directory with .git file not registered with git and recreates", () => {
126
+ // Simulate the scenario from issue #590: removeWorktree() failed to delete
127
+ // the directory (e.g. EPERM on Windows) but git worktree prune cleaned up
128
+ // the registry — leaving an orphaned directory with a .git *file* (not
129
+ // directory) that git no longer knows about.
130
+ const staleDir = worktreePath(base, "M010");
131
+ mkdirSync(staleDir, { recursive: true });
132
+ // Write a .git file (worktree gitdir pointer) — not a directory
133
+ writeFileSync(join(staleDir, ".git"), "gitdir: ../../../../.git/worktrees/M010\n", "utf-8");
134
+ writeFileSync(join(staleDir, "orphan.txt"), "stale leftover\n", "utf-8");
135
+
136
+ // createWorktree must detect the orphan (not in git worktree list), clean it
137
+ // up, and succeed — not throw GSD_STALE_STATE as if it were a live conflict.
138
+ const info = createWorktree(base, "M010");
139
+ assert.strictEqual(info.name, "M010");
140
+ assert.ok(existsSync(info.path));
141
+ assert.ok(existsSync(join(info.path, ".git")), "recovered worktree has .git marker");
142
+ run("git rev-parse --git-dir", info.path);
143
+ assert.ok(!existsSync(join(info.path, "orphan.txt")), "stale file removed by recovery");
144
+ });
124
145
  });
125
146
 
126
147
  describe("createWorktree — duplicate rejection", () => {
@@ -171,7 +171,7 @@ test("validate-milestone invoked from the project root writes VALIDATION under t
171
171
  const projectProjection = join(projectRoot, ".gsd", "milestones", MID, "M001-VALIDATION.md");
172
172
  assert.equal(result.validationPath, expected);
173
173
  assert.equal(existsSync(expected), true);
174
- assert.equal(existsSync(projectProjection), false);
174
+ assert.equal(existsSync(projectProjection), true, "VALIDATION should mirror to project root for consistent reads");
175
175
  });
176
176
 
177
177
  test("complete-milestone writes SUMMARY under the active worktree projection", async (t) => {
@@ -150,6 +150,30 @@ describe("Worktree Safety module", () => {
150
150
  assert.equal(result.kind, "safe");
151
151
  });
152
152
 
153
+ test("accepts project root for source-writing Unit when isolation mode is branch", () => {
154
+ const safety = createWorktreeSafetyModule({
155
+ existsSync: () => true,
156
+ lstatSync: () => ({ isFile: () => false }),
157
+ listRegisteredWorktrees: () => [{ path: projectRoot, branch: "milestone/M001" }],
158
+ getCurrentBranch: () => "milestone/M001",
159
+ });
160
+
161
+ const result = safety.validateUnitRoot({
162
+ unitType: "execute-task",
163
+ unitId: "M001/S01/T01",
164
+ writeScope: "source-writing",
165
+ projectRoot,
166
+ unitRoot: projectRoot,
167
+ milestoneId: "M001",
168
+ isolationMode: "branch",
169
+ expectedBranch: "milestone/M001",
170
+ });
171
+
172
+ assert.equal(result.ok, true);
173
+ assert.equal(result.kind, "safe");
174
+ assert.equal(result.branch, "milestone/M001");
175
+ });
176
+
153
177
  test("rejects non-project root for source-writing Unit when isolation mode is none", () => {
154
178
  const safety = createWorktreeSafetyModule({
155
179
  existsSync: () => true,
@@ -18,6 +18,7 @@ import {
18
18
  emitWorktreeOrphaned,
19
19
  emitAutoExit,
20
20
  emitCanonicalRootRedirect,
21
+ autoExitReasonForTerminalOutcome,
21
22
  normalizeAutoExitReason,
22
23
  summarizeWorktreeTelemetry,
23
24
  percentile,
@@ -117,6 +118,27 @@ test("normalizeAutoExitReason maps new buckets and ignores casing", () => {
117
118
  }
118
119
  });
119
120
 
121
+ test("autoExitReasonForTerminalOutcome maps typed terminal outcomes", () => {
122
+ assert.equal(
123
+ autoExitReasonForTerminalOutcome({
124
+ code: "all-complete",
125
+ displayReason: "All milestones complete",
126
+ allMilestonesComplete: true,
127
+ }),
128
+ "all-complete",
129
+ );
130
+ assert.equal(
131
+ autoExitReasonForTerminalOutcome({
132
+ code: "settlement-blocked",
133
+ displayReason: "Milestone complete, merge blocked",
134
+ nextAction: "Retry closeout",
135
+ milestoneId: "M001",
136
+ allMilestonesComplete: false,
137
+ }),
138
+ "blocked",
139
+ );
140
+ });
141
+
120
142
  test("summarizeWorktreeTelemetry only counts unmerged exits from active worktrees", (t) => {
121
143
  const base = makeTmpBase();
122
144
  t.after(() => cleanup(base));
@@ -9,7 +9,7 @@ import test from 'node:test';
9
9
  import assert from 'node:assert/strict';
10
10
  import { join, sep } from 'node:path';
11
11
 
12
- import { GSD_PHASE_SCOPE_DISPLAY_REASON } from '../auto-unit-tool-scope.ts';
12
+ import { GSD_PHASE_SCOPE_DISPLAY_REASON, GSD_SECTION_CLOSE_GATE_DISPLAY_REASON } from '../auto-unit-tool-scope.ts';
13
13
  import { ALLOWED_PLANNING_DISPATCH_AGENTS, shouldBlockPlanningUnit } from '../bootstrap/write-gate.ts';
14
14
  import { extractSubagentAgentClasses } from '../bootstrap/subagent-input.ts';
15
15
  import { isDeterministicPolicyError } from '../auto-tool-tracking.ts';
@@ -377,14 +377,26 @@ test('auto-unit scope: execute-task allows only its task completion lifecycle to
377
377
  );
378
378
  assert.strictEqual(allowed.block, false);
379
379
 
380
+ // execute-task closes gates from summary sections, so gsd_save_gate_result gets
381
+ // the softer deterministic redirect instead of the normal HARD BLOCK wall.
380
382
  const blocked = shouldBlockPlanningUnit('gsd_save_gate_result', '', BASE, 'execute-task', ALL);
381
383
  assert.strictEqual(blocked.block, true);
382
- assert.match(blocked.reason!, /HARD BLOCK/);
384
+ assert.doesNotMatch(blocked.reason!, /HARD BLOCK/);
383
385
  assert.match(blocked.reason!, /gsd_save_gate_result/);
384
- assert.strictEqual(blocked.displayReason, GSD_PHASE_SCOPE_DISPLAY_REASON);
386
+ assert.match(blocked.reason!, /summary sections/);
387
+ assert.strictEqual(blocked.displayReason, GSD_SECTION_CLOSE_GATE_DISPLAY_REASON);
385
388
  assert.strictEqual(isDeterministicPolicyError(blocked.reason!), true);
386
389
  });
387
390
 
391
+ test('auto-unit scope: section-close gate units get the calm gsd_save_gate_result redirect', () => {
392
+ for (const unit of ['execute-task', 'complete-slice', 'validate-milestone']) {
393
+ const r = shouldBlockPlanningUnit('gsd_save_gate_result', '', BASE, unit, ALL);
394
+ assert.strictEqual(r.block, true, `${unit} should still block the call`);
395
+ assert.doesNotMatch(r.reason!, /HARD BLOCK/, `${unit} should use the calm redirect`);
396
+ assert.strictEqual(isDeterministicPolicyError(r.reason!), true, `${unit} redirect must stay deterministic`);
397
+ }
398
+ });
399
+
388
400
  test('auto-unit scope: execute-task blocks sibling task completion', () => {
389
401
  const r = shouldBlockPlanningUnit(
390
402
  'gsd_complete_task',
@@ -340,6 +340,8 @@ test('write-gate: reopening a gate revokes its previous verified approval', () =
340
340
  // ═══════════════════════════════════════════════════════════════════════
341
341
 
342
342
  import {
343
+ applyAskUserQuestionsGateResult,
344
+ formatPendingAskUserQuestionsGateMessage,
343
345
  isGateQuestionId,
344
346
  shouldBlockPendingGate,
345
347
  shouldBlockPendingGateBash,
@@ -379,6 +381,83 @@ test('write-gate: pending gate lifecycle (set, get, clear)', () => {
379
381
  assert.strictEqual(getPendingGate(), null, 'clearDiscussionFlowState clears pending gate');
380
382
  });
381
383
 
384
+ test('write-gate: applyAskUserQuestionsGateResult keeps cancelled pending gate waiting', () => {
385
+ const base = join(tmpdir(), `gsd-write-gate-ask-waiting-${randomUUID()}`);
386
+ const gateId = 'depth_verification_M001_confirm';
387
+
388
+ try {
389
+ mkdirSync(base, { recursive: true });
390
+ clearDiscussionFlowState(base);
391
+ setPendingGate(gateId, base);
392
+
393
+ const result = applyAskUserQuestionsGateResult({
394
+ basePath: base,
395
+ questions: [{
396
+ id: gateId,
397
+ options: [{ label: 'Confirm depth (Recommended)' }, { label: 'Needs adjustment' }],
398
+ }],
399
+ details: { cancelled: true, interrupted: true },
400
+ });
401
+
402
+ assert.deepEqual(result, {
403
+ status: 'waiting',
404
+ pendingGateId: gateId,
405
+ interrupted: true,
406
+ });
407
+ assert.strictEqual(getPendingGate(base), gateId, 'cancelled question must leave gate pending');
408
+ assert.strictEqual(isMilestoneDepthVerified('M001', base), false, 'cancelled question must not verify depth');
409
+ assert.match(
410
+ formatPendingAskUserQuestionsGateMessage(gateId, true),
411
+ /Re-call ask_user_questions with the same gate question id/,
412
+ );
413
+ } finally {
414
+ clearDiscussionFlowState(base);
415
+ rmSync(base, { recursive: true, force: true });
416
+ }
417
+ });
418
+
419
+ test('write-gate: applyAskUserQuestionsGateResult verifies confirmed pending gate', () => {
420
+ const base = join(tmpdir(), `gsd-write-gate-ask-verified-${randomUUID()}`);
421
+ const gateId = 'depth_verification_M001_confirm';
422
+ const confirmLabel = 'Confirm depth (Recommended)';
423
+
424
+ try {
425
+ mkdirSync(base, { recursive: true });
426
+ clearDiscussionFlowState(base);
427
+ setPendingGate(gateId, base);
428
+
429
+ const result = applyAskUserQuestionsGateResult({
430
+ basePath: base,
431
+ questions: [{
432
+ id: gateId,
433
+ options: [{ label: confirmLabel }, { label: 'Needs adjustment' }],
434
+ }],
435
+ details: {
436
+ response: {
437
+ answers: {
438
+ [gateId]: { selected: confirmLabel },
439
+ },
440
+ },
441
+ },
442
+ });
443
+
444
+ assert.deepEqual(result, {
445
+ status: 'verified',
446
+ gateId,
447
+ milestoneId: 'M001',
448
+ });
449
+ assert.strictEqual(getPendingGate(base), null, 'confirmed gate must clear pending state');
450
+ assert.strictEqual(isMilestoneDepthVerified('M001', base), true, 'confirmed gate must verify milestone depth');
451
+ assert.ok(
452
+ loadWriteGateSnapshot(base).verifiedApprovalGates?.includes(gateId) ?? false,
453
+ 'confirmed gate must record verified approval',
454
+ );
455
+ } finally {
456
+ clearDiscussionFlowState(base);
457
+ rmSync(base, { recursive: true, force: true });
458
+ }
459
+ });
460
+
382
461
  // ─── Scenario 21: shouldBlockPendingGate blocks non-safe tools when gate is pending ──
383
462
 
384
463
  test('write-gate: shouldBlockPendingGate blocks write/edit during pending gate', () => {
@@ -4,8 +4,10 @@
4
4
  import {
5
5
  resolveManifest,
6
6
  type ArtifactKey,
7
+ type ComputedArtifactId,
7
8
  type ContextModePolicy,
8
9
  type ToolsPolicy,
10
+ type UnitContextManifest,
9
11
  } from "./unit-context-manifest.js";
10
12
  import { getRequiredWorkflowToolsForAutoUnit } from "./workflow-mcp.js";
11
13
  import { getUnitToolSurfaceContract } from "./unit-tool-contracts.js";
@@ -21,6 +23,7 @@ export interface UnitToolContract {
21
23
  requiredWorkflowTools: readonly string[];
22
24
  forbiddenWorkflowTools: readonly { name: string; reason: string }[];
23
25
  promptObligations: readonly string[];
26
+ promptContext: UnitPromptContextContract;
24
27
  validationRules: readonly string[];
25
28
  closeoutTools: readonly string[];
26
29
  sourceObservations: UnitSourceObservationContract;
@@ -31,6 +34,22 @@ export interface UnitToolContract {
31
34
  };
32
35
  }
33
36
 
37
+ export interface UnitPromptContextContract {
38
+ unitType: string;
39
+ contextMode: ContextModePolicy;
40
+ toolsPolicy: ToolsPolicy;
41
+ obligations: readonly string[];
42
+ sourceObservations: UnitSourceObservationContract;
43
+ artifacts: {
44
+ inline: readonly ArtifactKey[];
45
+ excerpt: readonly ArtifactKey[];
46
+ onDemand: readonly ArtifactKey[];
47
+ computed: readonly ComputedArtifactId[];
48
+ prepend: readonly ComputedArtifactId[];
49
+ };
50
+ maxSystemPromptChars: number;
51
+ }
52
+
34
53
  export type UnitSourceObservationContract =
35
54
  | { mode: "none" }
36
55
  | {
@@ -45,6 +64,22 @@ export type ToolContractResult =
45
64
  | { ok: true; contract: UnitToolContract }
46
65
  | { ok: false; reason: "unknown-unit-type" | "missing-closeout-tool"; detail: string };
47
66
 
67
+ export type UnitContextContractResult =
68
+ | { ok: true; contract: UnitPromptContextContract }
69
+ | { ok: false; reason: "unknown-unit-type"; detail: string };
70
+
71
+ export function compileUnitContextContract(unitType: string): UnitContextContractResult {
72
+ const manifest = resolveManifest(unitType);
73
+ if (!manifest) {
74
+ return {
75
+ ok: false,
76
+ reason: "unknown-unit-type",
77
+ detail: `No Unit manifest is registered for ${unitType}`,
78
+ };
79
+ }
80
+ return { ok: true, contract: buildPromptContextContract(unitType, manifest) };
81
+ }
82
+
48
83
  export function compileUnitToolContract(unitType: string): ToolContractResult {
49
84
  const manifest = resolveManifest(unitType);
50
85
  const surfaceContract = getUnitToolSurfaceContract(unitType);
@@ -71,6 +106,8 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
71
106
  };
72
107
  }
73
108
 
109
+ const promptContext = buildPromptContextContract(unitType, manifest);
110
+
74
111
  return {
75
112
  ok: true,
76
113
  contract: {
@@ -79,10 +116,8 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
79
116
  toolsPolicy: manifest.tools,
80
117
  requiredWorkflowTools,
81
118
  forbiddenWorkflowTools,
82
- promptObligations: [
83
- `context-mode:${manifest.contextMode}`,
84
- `tools-policy:${manifest.tools.mode}`,
85
- ],
119
+ promptObligations: promptContext.obligations,
120
+ promptContext,
86
121
  validationRules: [
87
122
  "unit-manifest-present",
88
123
  "workflow-tool-surface-present",
@@ -90,16 +125,59 @@ export function compileUnitToolContract(unitType: string): ToolContractResult {
90
125
  ...(unitType === "execute-task" ? ["source-observation-contract-present"] : []),
91
126
  ],
92
127
  closeoutTools,
93
- sourceObservations: sourceObservationContractForUnit(unitType),
128
+ sourceObservations: promptContext.sourceObservations,
94
129
  artifacts: {
95
- inline: manifest.artifacts.inline,
96
- excerpt: manifest.artifacts.excerpt,
97
- onDemand: manifest.artifacts.onDemand,
130
+ inline: promptContext.artifacts.inline,
131
+ excerpt: promptContext.artifacts.excerpt,
132
+ onDemand: promptContext.artifacts.onDemand,
98
133
  },
99
134
  },
100
135
  };
101
136
  }
102
137
 
138
+ function buildPromptContextContract(
139
+ unitType: string,
140
+ manifest: UnitContextManifest,
141
+ ): UnitPromptContextContract {
142
+ const sourceObservations = sourceObservationContractForUnit(unitType);
143
+ return {
144
+ unitType,
145
+ contextMode: manifest.contextMode,
146
+ toolsPolicy: manifest.tools,
147
+ obligations: promptContextObligations(manifest, sourceObservations),
148
+ sourceObservations,
149
+ artifacts: {
150
+ inline: manifest.artifacts.inline,
151
+ excerpt: manifest.artifacts.excerpt,
152
+ onDemand: manifest.artifacts.onDemand,
153
+ computed: manifest.artifacts.computed ?? [],
154
+ prepend: manifest.prepend ?? [],
155
+ },
156
+ maxSystemPromptChars: manifest.maxSystemPromptChars,
157
+ };
158
+ }
159
+
160
+ function promptContextObligations(
161
+ manifest: UnitContextManifest,
162
+ sourceObservations: UnitSourceObservationContract,
163
+ ): string[] {
164
+ const obligations = [
165
+ `context-mode:${manifest.contextMode}`,
166
+ `tools-policy:${manifest.tools.mode}`,
167
+ artifactObligation("context-inline", manifest.artifacts.inline),
168
+ artifactObligation("context-excerpt", manifest.artifacts.excerpt),
169
+ artifactObligation("context-on-demand", manifest.artifacts.onDemand),
170
+ ];
171
+ if (sourceObservations.mode !== "none") {
172
+ obligations.push(`source-observations:${sourceObservations.mode}`);
173
+ }
174
+ return obligations;
175
+ }
176
+
177
+ function artifactObligation(label: string, artifacts: readonly ArtifactKey[]): string {
178
+ return `${label}:${artifacts.length > 0 ? artifacts.join(",") : "none"}`;
179
+ }
180
+
103
181
  function sourceObservationContractForUnit(unitType: string): UnitSourceObservationContract {
104
182
  if (unitType !== "execute-task") return { mode: "none" };
105
183
  return {