@opengsd/gsd-pi 1.1.1-dev.616a1a1 → 1.1.1-dev.9bb7453

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 (395) hide show
  1. package/dist/cli.js +3 -2
  2. package/dist/help-text.js +10 -6
  3. package/dist/resources/.managed-resources-content-hash +1 -1
  4. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +495 -0
  5. package/dist/resources/extensions/browser-tools/engine/selection.js +16 -0
  6. package/dist/resources/extensions/browser-tools/extension-manifest.json +2 -2
  7. package/dist/resources/extensions/browser-tools/index.js +57 -9
  8. package/dist/resources/extensions/browser-tools/package.json +5 -1
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +167 -16
  10. package/dist/resources/extensions/gsd/auto/orchestrator.js +0 -1
  11. package/dist/resources/extensions/gsd/auto/phases.js +4 -3
  12. package/dist/resources/extensions/gsd/auto-dashboard.js +92 -17
  13. package/dist/resources/extensions/gsd/auto-dispatch.js +44 -0
  14. package/dist/resources/extensions/gsd/auto-post-unit.js +134 -10
  15. package/dist/resources/extensions/gsd/auto-prompts.js +68 -22
  16. package/dist/resources/extensions/gsd/auto-recovery.js +4 -4
  17. package/dist/resources/extensions/gsd/auto-runtime-state.js +3 -0
  18. package/dist/resources/extensions/gsd/auto-start.js +94 -15
  19. package/dist/resources/extensions/gsd/auto-tool-tracking.js +1 -1
  20. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +2 -1
  21. package/dist/resources/extensions/gsd/auto.js +31 -6
  22. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +83 -4
  23. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
  24. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +39 -14
  25. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +16 -10
  26. package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
  27. package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
  28. package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -2
  29. package/dist/resources/extensions/gsd/commands/handlers/ops.js +9 -5
  30. package/dist/resources/extensions/gsd/commands-handlers.js +76 -11
  31. package/dist/resources/extensions/gsd/commands-maintenance.js +172 -2
  32. package/dist/resources/extensions/gsd/commands-mcp-status.js +109 -60
  33. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +3 -1
  34. package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
  35. package/dist/resources/extensions/gsd/config-overlay.js +2 -1
  36. package/dist/resources/extensions/gsd/dashboard-overlay.js +21 -7
  37. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  38. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +2 -2
  39. package/dist/resources/extensions/gsd/error-classifier.js +2 -1
  40. package/dist/resources/extensions/gsd/escalation.js +4 -4
  41. package/dist/resources/extensions/gsd/exec-sandbox.js +2 -0
  42. package/dist/resources/extensions/gsd/forensics.js +74 -2
  43. package/dist/resources/extensions/gsd/gsd-db.js +42 -6
  44. package/dist/resources/extensions/gsd/guided-flow.js +30 -69
  45. package/dist/resources/extensions/gsd/mcp-filter.js +3 -0
  46. package/dist/resources/extensions/gsd/mcp-project-config.js +76 -84
  47. package/dist/resources/extensions/gsd/memory-store.js +4 -1
  48. package/dist/resources/extensions/gsd/migration-auto-check.js +2 -2
  49. package/dist/resources/extensions/gsd/post-unit-hooks.js +9 -0
  50. package/dist/resources/extensions/gsd/preferences-validation.js +39 -0
  51. package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
  52. package/dist/resources/extensions/gsd/prompts/forensics.md +61 -1
  53. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  54. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  55. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  56. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  57. package/dist/resources/extensions/gsd/prompts/run-uat.md +48 -24
  58. package/dist/resources/extensions/gsd/prompts/system.md +3 -1
  59. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  60. package/dist/resources/extensions/gsd/rule-registry.js +428 -52
  61. package/dist/resources/extensions/gsd/safety/destructive-guard.js +3 -0
  62. package/dist/resources/extensions/gsd/skill-activation.js +20 -3
  63. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +4 -2
  64. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
  65. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +18 -1
  66. package/dist/resources/extensions/gsd/state-reconciliation/index.js +6 -0
  67. package/dist/resources/extensions/gsd/state.js +17 -14
  68. package/dist/resources/extensions/gsd/templates/plan.md +3 -1
  69. package/dist/resources/extensions/gsd/tool-presentation-plan.js +120 -0
  70. package/dist/resources/extensions/gsd/tools/complete-slice.js +15 -1
  71. package/dist/resources/extensions/gsd/tools/complete-task.js +11 -1
  72. package/dist/resources/extensions/gsd/tools/exec-tool.js +109 -0
  73. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -9
  74. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  75. package/dist/resources/extensions/gsd/tools/validate-milestone.js +46 -16
  76. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +403 -3
  77. package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
  78. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  79. package/dist/resources/extensions/gsd/verdict-parser.js +59 -15
  80. package/dist/resources/extensions/gsd/verification-gate.js +72 -1
  81. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -1
  82. package/dist/resources/extensions/gsd/workflow-mcp.js +5 -1
  83. package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -0
  84. package/dist/resources/extensions/mcp-client/manager.js +31 -1
  85. package/dist/resources/extensions/shared/gsd-browser-cli.js +145 -0
  86. package/dist/rtk.d.ts +7 -1
  87. package/dist/rtk.js +27 -11
  88. package/dist/update-check.d.ts +15 -1
  89. package/dist/update-check.js +87 -12
  90. package/dist/update-cmd.d.ts +1 -0
  91. package/dist/update-cmd.js +53 -2
  92. package/dist/web/standalone/.next/BUILD_ID +1 -1
  93. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  94. package/dist/web/standalone/.next/build-manifest.json +2 -2
  95. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  96. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  100. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  101. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  102. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  103. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  104. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/index.html +1 -1
  114. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  121. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  122. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  124. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  125. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  126. package/package.json +5 -3
  127. package/packages/cloud-mcp-gateway/package.json +2 -2
  128. package/packages/contracts/dist/workflow.d.ts +14 -0
  129. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  130. package/packages/contracts/dist/workflow.js +16 -0
  131. package/packages/contracts/dist/workflow.js.map +1 -1
  132. package/packages/contracts/package.json +1 -1
  133. package/packages/daemon/package.json +4 -4
  134. package/packages/gsd-agent-core/dist/agent-session.d.ts +9 -0
  135. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  136. package/packages/gsd-agent-core/dist/agent-session.js +32 -0
  137. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  138. package/packages/gsd-agent-core/dist/index.d.ts +1 -0
  139. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  140. package/packages/gsd-agent-core/dist/index.js +1 -0
  141. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  142. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts +2 -0
  143. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts.map +1 -1
  144. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js +8 -2
  145. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js.map +1 -1
  146. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +7 -0
  147. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  148. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  149. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  150. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +69 -1
  151. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  152. package/packages/gsd-agent-core/dist/turn-latency.d.ts +47 -0
  153. package/packages/gsd-agent-core/dist/turn-latency.d.ts.map +1 -0
  154. package/packages/gsd-agent-core/dist/turn-latency.js +123 -0
  155. package/packages/gsd-agent-core/dist/turn-latency.js.map +1 -0
  156. package/packages/gsd-agent-core/package.json +6 -6
  157. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +21 -0
  158. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +1 -0
  159. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +213 -0
  160. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +1 -0
  161. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  162. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  163. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  164. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  165. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +1 -0
  166. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  167. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +92 -31
  168. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  169. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  170. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +7 -1
  171. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  172. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.d.ts.map +1 -1
  173. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js +6 -0
  174. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js.map +1 -1
  175. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -1
  176. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -0
  177. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  178. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -1
  179. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
  180. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -1
  181. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
  182. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  183. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +1 -0
  184. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  186. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +5 -0
  187. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  188. package/packages/gsd-agent-modes/package.json +7 -7
  189. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
  190. package/packages/mcp-server/dist/remote-questions.js +23 -9
  191. package/packages/mcp-server/dist/remote-questions.js.map +1 -1
  192. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  193. package/packages/mcp-server/dist/workflow-tools.js +84 -2
  194. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  195. package/packages/mcp-server/package.json +3 -3
  196. package/packages/native/package.json +1 -1
  197. package/packages/pi-agent-core/dist/agent-loop.js +38 -0
  198. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  199. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  200. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  201. package/packages/pi-agent-core/dist/agent.js +2 -0
  202. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  203. package/packages/pi-agent-core/dist/types.d.ts +3 -0
  204. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  205. package/packages/pi-agent-core/dist/types.js.map +1 -1
  206. package/packages/pi-agent-core/package.json +1 -1
  207. package/packages/pi-ai/dist/api-registry.d.ts +2 -0
  208. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  209. package/packages/pi-ai/dist/api-registry.js +23 -0
  210. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  211. package/packages/pi-ai/dist/image-models.generated.d.ts +15 -0
  212. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  213. package/packages/pi-ai/dist/image-models.generated.js +15 -0
  214. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  215. package/packages/pi-ai/dist/models.generated.d.ts +406 -17
  216. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  217. package/packages/pi-ai/dist/models.generated.js +484 -116
  218. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  219. package/packages/pi-ai/dist/stream.js +6 -6
  220. package/packages/pi-ai/dist/stream.js.map +1 -1
  221. package/packages/pi-ai/package.json +1 -1
  222. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  223. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  224. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  226. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  227. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  228. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  229. package/packages/pi-coding-agent/package.json +7 -7
  230. package/packages/pi-tui/dist/terminal.d.ts +1 -0
  231. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  232. package/packages/pi-tui/dist/terminal.js +8 -4
  233. package/packages/pi-tui/dist/terminal.js.map +1 -1
  234. package/packages/pi-tui/package.json +1 -1
  235. package/packages/rpc-client/package.json +2 -2
  236. package/pkg/package.json +1 -1
  237. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +579 -0
  238. package/src/resources/extensions/browser-tools/engine/selection.ts +19 -0
  239. package/src/resources/extensions/browser-tools/extension-manifest.json +2 -2
  240. package/src/resources/extensions/browser-tools/index.ts +60 -9
  241. package/src/resources/extensions/browser-tools/package.json +5 -1
  242. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +35 -0
  243. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +33 -0
  244. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +196 -16
  245. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +239 -63
  246. package/src/resources/extensions/gsd/auto/orchestrator.ts +0 -1
  247. package/src/resources/extensions/gsd/auto/phases.ts +5 -3
  248. package/src/resources/extensions/gsd/auto-dashboard.ts +98 -18
  249. package/src/resources/extensions/gsd/auto-dispatch.ts +53 -0
  250. package/src/resources/extensions/gsd/auto-post-unit.ts +166 -9
  251. package/src/resources/extensions/gsd/auto-prompts.ts +102 -15
  252. package/src/resources/extensions/gsd/auto-recovery.ts +4 -4
  253. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
  254. package/src/resources/extensions/gsd/auto-start.ts +112 -17
  255. package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
  256. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +2 -1
  257. package/src/resources/extensions/gsd/auto.ts +47 -5
  258. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +90 -4
  259. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
  260. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +60 -19
  261. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +21 -10
  262. package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
  263. package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
  264. package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -2
  265. package/src/resources/extensions/gsd/commands/handlers/ops.ts +9 -5
  266. package/src/resources/extensions/gsd/commands-handlers.ts +76 -11
  267. package/src/resources/extensions/gsd/commands-maintenance.ts +197 -2
  268. package/src/resources/extensions/gsd/commands-mcp-status.ts +136 -58
  269. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +4 -1
  270. package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
  271. package/src/resources/extensions/gsd/config-overlay.ts +3 -1
  272. package/src/resources/extensions/gsd/dashboard-overlay.ts +28 -7
  273. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  274. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +2 -2
  275. package/src/resources/extensions/gsd/error-classifier.ts +2 -1
  276. package/src/resources/extensions/gsd/escalation.ts +4 -4
  277. package/src/resources/extensions/gsd/exec-sandbox.ts +4 -0
  278. package/src/resources/extensions/gsd/forensics.ts +99 -5
  279. package/src/resources/extensions/gsd/gsd-db.ts +46 -8
  280. package/src/resources/extensions/gsd/guided-flow.ts +91 -83
  281. package/src/resources/extensions/gsd/mcp-filter.ts +3 -0
  282. package/src/resources/extensions/gsd/mcp-project-config.ts +105 -88
  283. package/src/resources/extensions/gsd/memory-store.ts +4 -1
  284. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  285. package/src/resources/extensions/gsd/post-unit-hooks.ts +14 -1
  286. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  287. package/src/resources/extensions/gsd/preferences-validation.ts +36 -0
  288. package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
  289. package/src/resources/extensions/gsd/prompts/forensics.md +61 -1
  290. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  291. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  292. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  293. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  294. package/src/resources/extensions/gsd/prompts/run-uat.md +48 -24
  295. package/src/resources/extensions/gsd/prompts/system.md +3 -1
  296. package/src/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  297. package/src/resources/extensions/gsd/rule-registry.ts +558 -58
  298. package/src/resources/extensions/gsd/rule-types.ts +2 -0
  299. package/src/resources/extensions/gsd/safety/destructive-guard.ts +3 -0
  300. package/src/resources/extensions/gsd/skill-activation.ts +20 -2
  301. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +4 -2
  302. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
  303. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +20 -0
  304. package/src/resources/extensions/gsd/state-reconciliation/index.ts +6 -0
  305. package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -0
  306. package/src/resources/extensions/gsd/state.ts +18 -14
  307. package/src/resources/extensions/gsd/templates/plan.md +3 -1
  308. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +156 -4
  309. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +123 -0
  310. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +143 -2
  311. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +24 -2
  312. package/src/resources/extensions/gsd/tests/browser-evidence.test.ts +142 -0
  313. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +38 -3
  314. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +6 -2
  315. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +30 -0
  316. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  317. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +45 -0
  318. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +53 -0
  319. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +8 -0
  320. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +50 -13
  321. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +31 -0
  322. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +60 -0
  323. package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +27 -0
  324. package/src/resources/extensions/gsd/tests/escalation.test.ts +16 -27
  325. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +18 -0
  326. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +69 -0
  327. package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +20 -0
  328. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +3 -0
  329. package/src/resources/extensions/gsd/tests/forensics-tool-scope.test.ts +69 -0
  330. package/src/resources/extensions/gsd/tests/gsd-rebuild.test.ts +199 -0
  331. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +75 -0
  332. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +40 -1
  333. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +86 -0
  334. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +12 -9
  335. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
  336. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +66 -10
  337. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +13 -6
  338. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +15 -0
  339. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +100 -0
  340. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +179 -0
  341. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +39 -8
  342. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +3 -3
  343. package/src/resources/extensions/gsd/tests/new-milestone-discuss-routing.test.ts +3 -3
  344. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +54 -7
  345. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +9 -0
  346. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +39 -1
  347. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +157 -0
  348. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +179 -0
  349. package/src/resources/extensions/gsd/tests/preferences.test.ts +29 -0
  350. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +53 -1
  351. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +14 -0
  352. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +18 -1
  353. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +7 -8
  354. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +36 -0
  355. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +35 -0
  356. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +1 -1
  357. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +75 -0
  358. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +100 -0
  359. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +55 -0
  360. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +6 -2
  361. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
  362. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +84 -10
  363. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
  364. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +12 -2
  365. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +7 -1
  366. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +29 -6
  367. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +29 -6
  368. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +6 -3
  369. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +133 -0
  370. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +21 -0
  371. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +51 -0
  372. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +17 -2
  373. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +213 -0
  374. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +25 -0
  375. package/src/resources/extensions/gsd/tool-presentation-plan.ts +167 -0
  376. package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -1
  377. package/src/resources/extensions/gsd/tools/complete-task.ts +20 -2
  378. package/src/resources/extensions/gsd/tools/exec-tool.ts +130 -0
  379. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -9
  380. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  381. package/src/resources/extensions/gsd/tools/validate-milestone.ts +46 -15
  382. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +489 -3
  383. package/src/resources/extensions/gsd/types.ts +69 -5
  384. package/src/resources/extensions/gsd/unit-context-manifest.ts +14 -5
  385. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  386. package/src/resources/extensions/gsd/verdict-parser.ts +54 -13
  387. package/src/resources/extensions/gsd/verification-gate.ts +87 -1
  388. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -1
  389. package/src/resources/extensions/gsd/workflow-mcp.ts +5 -1
  390. package/src/resources/extensions/gsd/worktree-lifecycle.ts +26 -0
  391. package/src/resources/extensions/mcp-client/manager.ts +33 -1
  392. package/src/resources/extensions/mcp-client/tests/manager.test.ts +35 -0
  393. package/src/resources/extensions/shared/gsd-browser-cli.ts +172 -0
  394. /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → jBtwT9v1u2lUA3UEOy_ZH}/_buildManifest.js +0 -0
  395. /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → jBtwT9v1u2lUA3UEOy_ZH}/_ssgManifest.js +0 -0
@@ -0,0 +1,69 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Verifies /gsd forensics scopes issue-filing tools for its queued turn.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+
7
+ import {
8
+ applyForensicsToolScope,
9
+ buildForensicsToolingSection,
10
+ createForensicsToolScope,
11
+ restoreForensicsToolScope,
12
+ } from "../forensics.ts";
13
+
14
+ function tool(name: string): { name: string } {
15
+ return { name };
16
+ }
17
+
18
+ test("forensics adds registered filing tools for the queued turn and restores the prior tools", () => {
19
+ const originalTools = ["read"];
20
+ let activeTools = [...originalTools];
21
+ const pi = {
22
+ getActiveTools: () => [...activeTools],
23
+ getAllTools: () => ["read", "bash", "write"].map(tool),
24
+ setActiveTools: (tools: string[]) => {
25
+ activeTools = [...tools];
26
+ },
27
+ };
28
+
29
+ const scope = createForensicsToolScope(pi as any);
30
+
31
+ assert.deepEqual(scope.savedTools, originalTools);
32
+ assert.deepEqual(scope.activeToolsForTurn, ["read", "bash", "write"]);
33
+ assert.deepEqual(scope.availableFilingTools, ["bash", "write"]);
34
+ assert.deepEqual(scope.missingFilingTools, []);
35
+ assert.equal(scope.toolsChanged, true);
36
+ assert.deepEqual(activeTools, originalTools, "scope creation must not mutate active tools");
37
+
38
+ applyForensicsToolScope(pi as any, scope);
39
+ assert.deepEqual(activeTools, ["read", "bash", "write"]);
40
+
41
+ const toolingSection = buildForensicsToolingSection(scope);
42
+ assert.match(toolingSection, /`bash`: available/);
43
+ assert.match(toolingSection, /`write`: available/);
44
+ assert.match(toolingSection, /GitHub duplicate-check and issue-creation protocols/);
45
+
46
+ restoreForensicsToolScope(pi as any, scope);
47
+ assert.deepEqual(activeTools, originalTools);
48
+ });
49
+
50
+ test("forensics tooling guidance falls back when bash is not registered", () => {
51
+ let activeTools = ["read"];
52
+ const pi = {
53
+ getActiveTools: () => [...activeTools],
54
+ getAllTools: () => ["read", "write"].map(tool),
55
+ setActiveTools: (tools: string[]) => {
56
+ activeTools = [...tools];
57
+ },
58
+ };
59
+
60
+ const scope = createForensicsToolScope(pi as any);
61
+
62
+ assert.deepEqual(scope.availableFilingTools, ["write"]);
63
+ assert.deepEqual(scope.missingFilingTools, ["bash"]);
64
+ assert.deepEqual(scope.activeToolsForTurn, ["read", "write"]);
65
+
66
+ const toolingSection = buildForensicsToolingSection(scope);
67
+ assert.match(toolingSection, /`bash`: unavailable/);
68
+ assert.match(toolingSection, /paste-once shell script fallback/);
69
+ });
@@ -0,0 +1,199 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import {
4
+ existsSync,
5
+ mkdirSync,
6
+ mkdtempSync,
7
+ readdirSync,
8
+ readFileSync,
9
+ rmSync,
10
+ writeFileSync,
11
+ } from "node:fs";
12
+ import { join } from "node:path";
13
+ import { tmpdir } from "node:os";
14
+
15
+ import { handleRebuild } from "../commands-maintenance.ts";
16
+ import {
17
+ closeDatabase,
18
+ getTask,
19
+ insertMilestone,
20
+ insertSlice,
21
+ insertTask,
22
+ openDatabase,
23
+ } from "../gsd-db.ts";
24
+ import { invalidateStateCache } from "../state.ts";
25
+
26
+ type Note = { message: string; kind: string };
27
+
28
+ function makeBase(): string {
29
+ const base = mkdtempSync(join(tmpdir(), "gsd-rebuild-"));
30
+ mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks"), {
31
+ recursive: true,
32
+ });
33
+ return base;
34
+ }
35
+
36
+ function cleanup(base: string): void {
37
+ closeDatabase();
38
+ invalidateStateCache();
39
+ rmSync(base, { recursive: true, force: true });
40
+ }
41
+
42
+ function makeCtx(): { ctx: any; notes: Note[] } {
43
+ const notes: Note[] = [];
44
+ return {
45
+ ctx: {
46
+ ui: {
47
+ notify: (message: string, kind: string) => notes.push({ message, kind }),
48
+ },
49
+ },
50
+ notes,
51
+ };
52
+ }
53
+
54
+ function seedOpenTask(): void {
55
+ insertMilestone({ id: "M001", title: "Milestone", status: "active" });
56
+ insertSlice({
57
+ id: "S01",
58
+ milestoneId: "M001",
59
+ title: "Slice",
60
+ status: "in_progress",
61
+ risk: "low",
62
+ depends: [],
63
+ });
64
+ insertTask({
65
+ id: "T01",
66
+ sliceId: "S01",
67
+ milestoneId: "M001",
68
+ title: "Task",
69
+ status: "pending",
70
+ });
71
+ }
72
+
73
+ function listFiles(dir: string): string[] {
74
+ if (!existsSync(dir)) return [];
75
+ const out: string[] = [];
76
+ const stack = [dir];
77
+ while (stack.length > 0) {
78
+ const current = stack.pop()!;
79
+ for (const entry of readdirSync(current, { withFileTypes: true })) {
80
+ const full = join(current, entry.name);
81
+ if (entry.isDirectory()) {
82
+ stack.push(full);
83
+ } else {
84
+ out.push(full);
85
+ }
86
+ }
87
+ }
88
+ return out.sort();
89
+ }
90
+
91
+ test("handleRebuild quarantines stale completion projections without mutating DB state", async () => {
92
+ const base = makeBase();
93
+ try {
94
+ openDatabase(join(base, ".gsd", "gsd.db"));
95
+ seedOpenTask();
96
+
97
+ const summaryPath = join(
98
+ base,
99
+ ".gsd",
100
+ "milestones",
101
+ "M001",
102
+ "slices",
103
+ "S01",
104
+ "tasks",
105
+ "T01-SUMMARY.md",
106
+ );
107
+ writeFileSync(summaryPath, "# T01 Summary\n\nDisk-only completion.\n", "utf-8");
108
+
109
+ const { ctx, notes } = makeCtx();
110
+ await handleRebuild(ctx, base, "markdown");
111
+
112
+ assert.equal(existsSync(summaryPath), false, "stale SUMMARY projection should be moved aside");
113
+ const task = getTask("M001", "S01", "T01");
114
+ assert.equal(task?.status, "pending", "DB task status remains authoritative");
115
+ assert.equal(task?.full_summary_md, "", "disk summary must not be imported into DB");
116
+
117
+ const quarantined = listFiles(join(base, ".gsd", "quarantine", "projections"));
118
+ assert.equal(quarantined.length, 1);
119
+ assert.match(readFileSync(quarantined[0]!, "utf-8"), /Disk-only completion/);
120
+ assert.match(notes.at(-1)?.message ?? "", /Quarantined:\s+1/);
121
+ assert.equal(notes.at(-1)?.kind, "success");
122
+ } finally {
123
+ cleanup(base);
124
+ }
125
+ });
126
+
127
+ test("handleRebuild re-renders missing task summary projections from DB", async () => {
128
+ const base = makeBase();
129
+ try {
130
+ openDatabase(join(base, ".gsd", "gsd.db"));
131
+ seedOpenTask();
132
+ insertTask({
133
+ id: "T01",
134
+ sliceId: "S01",
135
+ milestoneId: "M001",
136
+ title: "Task",
137
+ status: "complete",
138
+ oneLiner: "Task complete",
139
+ narrative: "Finished through the DB.",
140
+ verificationResult: "passed",
141
+ fullSummaryMd: "# T01 Summary\n\nRendered from DB.\n",
142
+ });
143
+
144
+ const summaryPath = join(
145
+ base,
146
+ ".gsd",
147
+ "milestones",
148
+ "M001",
149
+ "slices",
150
+ "S01",
151
+ "tasks",
152
+ "T01-SUMMARY.md",
153
+ );
154
+ rmSync(summaryPath, { force: true });
155
+
156
+ const { ctx, notes } = makeCtx();
157
+ await handleRebuild(ctx, base);
158
+
159
+ assert.equal(existsSync(summaryPath), true, "missing SUMMARY projection should be regenerated");
160
+ assert.equal(readFileSync(summaryPath, "utf-8"), "# T01 Summary\n\nRendered from DB.\n");
161
+ assert.match(notes.at(-1)?.message ?? "", /rebuilt markdown projections from the canonical DB/);
162
+ assert.match(notes.at(-1)?.message ?? "", /Quarantined:\s+0/);
163
+ } finally {
164
+ cleanup(base);
165
+ }
166
+ });
167
+
168
+ test("handleRebuild database target is reserved and does not import markdown", async () => {
169
+ const base = makeBase();
170
+ try {
171
+ openDatabase(join(base, ".gsd", "gsd.db"));
172
+ seedOpenTask();
173
+
174
+ const summaryPath = join(
175
+ base,
176
+ ".gsd",
177
+ "milestones",
178
+ "M001",
179
+ "slices",
180
+ "S01",
181
+ "tasks",
182
+ "T01-SUMMARY.md",
183
+ );
184
+ writeFileSync(summaryPath, "# T01 Summary\n\nShould not import.\n", "utf-8");
185
+
186
+ const { ctx, notes } = makeCtx();
187
+ await handleRebuild(ctx, base, "database");
188
+
189
+ assert.equal(existsSync(summaryPath), true, "reserved DB rebuild must not move projection files");
190
+ const task = getTask("M001", "S01", "T01");
191
+ assert.equal(task?.status, "pending", "reserved DB rebuild must not mutate task status");
192
+ assert.equal(task?.full_summary_md, "", "reserved DB rebuild must not import markdown");
193
+ assert.match(notes.at(-1)?.message ?? "", /reserved/);
194
+ assert.match(notes.at(-1)?.message ?? "", /\/gsd recover --confirm/);
195
+ assert.equal(notes.at(-1)?.kind, "warning");
196
+ } finally {
197
+ cleanup(base);
198
+ }
199
+ });
@@ -24,6 +24,7 @@ import {
24
24
  } from '../gsd-db.ts';
25
25
  import { migrateHierarchyToDb } from '../md-importer.ts';
26
26
  import { deriveStateFromDb, invalidateStateCache } from '../state.ts';
27
+ import { handleRecover } from '../commands-maintenance.ts';
27
28
  // ─── Fixture Helpers ───────────────────────────────────────────────────────
28
29
 
29
30
  function createFixtureBase(): string {
@@ -42,6 +43,22 @@ function cleanup(base: string): void {
42
43
  rmSync(base, { recursive: true, force: true });
43
44
  }
44
45
 
46
+ function makeCtx(confirm?: () => Promise<boolean>): {
47
+ ctx: any;
48
+ notes: Array<{ message: string; kind: string }>;
49
+ } {
50
+ const notes: Array<{ message: string; kind: string }> = [];
51
+ return {
52
+ ctx: {
53
+ ui: {
54
+ notify: (message: string, kind: string) => notes.push({ message, kind }),
55
+ ...(confirm ? { confirm: async () => confirm() } : {}),
56
+ },
57
+ },
58
+ notes,
59
+ };
60
+ }
61
+
45
62
  // ─── Fixture Content ──────────────────────────────────────────────────────
46
63
 
47
64
  const ROADMAP_M001 = `# M001: Recovery Test
@@ -437,4 +454,62 @@ describe('gsd-recover', async () => {
437
454
  cleanup(base);
438
455
  }
439
456
  });
457
+
458
+ test('handleRecover warns and does not import markdown without confirmation', async () => {
459
+ const base = createFixtureBase();
460
+ try {
461
+ writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_M001);
462
+ openDatabase(':memory:');
463
+ insertMilestone({ id: 'M999', title: 'Existing DB State', status: 'active' });
464
+
465
+ const { ctx, notes } = makeCtx();
466
+ await handleRecover(ctx, base);
467
+
468
+ assert.ok(getMilestone('M999'), 'existing DB row remains when recover is unconfirmed');
469
+ assert.equal(getMilestone('M001'), null, 'markdown milestone is not imported without confirmation');
470
+ assert.equal(notes.at(-1)?.kind, 'warning');
471
+ assert.match(notes.at(-1)?.message ?? '', /\/gsd recover --confirm/);
472
+ } finally {
473
+ closeDatabase();
474
+ cleanup(base);
475
+ }
476
+ });
477
+
478
+ test('handleRecover interactive cancellation leaves DB unchanged', async () => {
479
+ const base = createFixtureBase();
480
+ try {
481
+ writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_M001);
482
+ openDatabase(':memory:');
483
+ insertMilestone({ id: 'M999', title: 'Existing DB State', status: 'active' });
484
+
485
+ const { ctx, notes } = makeCtx(async () => false);
486
+ await handleRecover(ctx, base);
487
+
488
+ assert.ok(getMilestone('M999'), 'existing DB row remains when recover is cancelled');
489
+ assert.equal(getMilestone('M001'), null, 'markdown milestone is not imported after cancellation');
490
+ assert.match(notes.at(-1)?.message ?? '', /cancelled/);
491
+ } finally {
492
+ closeDatabase();
493
+ cleanup(base);
494
+ }
495
+ });
496
+
497
+ test('handleRecover imports markdown after explicit confirmation', async () => {
498
+ const base = createFixtureBase();
499
+ try {
500
+ writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_M001);
501
+ openDatabase(':memory:');
502
+ insertMilestone({ id: 'M999', title: 'Existing DB State', status: 'active' });
503
+
504
+ const { ctx, notes } = makeCtx();
505
+ await handleRecover(ctx, base, '--confirm');
506
+
507
+ assert.equal(getMilestone('M999'), null, 'confirmed recover clears old hierarchy rows');
508
+ assert.ok(getMilestone('M001'), 'confirmed recover imports markdown hierarchy');
509
+ assert.equal(notes.at(-1)?.kind, 'success');
510
+ } finally {
511
+ closeDatabase();
512
+ cleanup(base);
513
+ }
514
+ });
440
515
  });
@@ -3,10 +3,11 @@
3
3
 
4
4
  import test from "node:test";
5
5
  import assert from "node:assert/strict";
6
- import { mkdtempSync, rmSync } from "node:fs";
6
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
7
7
  import { tmpdir } from "node:os";
8
8
  import { join } from "node:path";
9
9
  import { VISION_ASK_VARIANTS } from "../vision-ask.ts";
10
+ import { buildDiscussMilestonePrompt } from "../auto-prompts.ts";
10
11
 
11
12
  test("guided milestone prompt renders compact interview and context guidance", async (t) => {
12
13
  const previousGsdHome = process.env.GSD_HOME;
@@ -47,3 +48,41 @@ test("guided milestone prompt renders compact interview and context guidance", a
47
48
  assert.match(prompt, /milestone_id: M001/);
48
49
  assert.doesNotMatch(prompt, /\{\{[a-zA-Z][a-zA-Z0-9_]*\}\}/);
49
50
  });
51
+
52
+ test("guided milestone prompt builder preloads milestone planning context", async () => {
53
+ const base = mkdtempSync(join(tmpdir(), "gsd-guided-milestone-context-"));
54
+ try {
55
+ const milestonesRoot = join(base, ".gsd", "milestones");
56
+ const priorDir = join(milestonesRoot, "M001");
57
+ const currentDir = join(milestonesRoot, "M002");
58
+ const futureDir = join(milestonesRoot, "M003");
59
+ mkdirSync(priorDir, { recursive: true });
60
+ mkdirSync(currentDir, { recursive: true });
61
+ mkdirSync(futureDir, { recursive: true });
62
+
63
+ writeFileSync(join(base, ".gsd", "DECISIONS.md"), "# Decisions\n\nDECISION-SIGNAL", "utf-8");
64
+ writeFileSync(join(priorDir, "M001-SUMMARY.md"), "# M001 Summary\n\nPRIOR-SUMMARY-SIGNAL", "utf-8");
65
+ writeFileSync(join(currentDir, "M002-ROADMAP.md"), "# M002 Roadmap\n\nROADMAP-SIGNAL", "utf-8");
66
+ writeFileSync(join(currentDir, "M002-CONTEXT.md"), "# M002 Context\n\nCONTEXT-SIGNAL", "utf-8");
67
+ writeFileSync(join(currentDir, "M002-RESEARCH.md"), "# M002 Research\n\nRESEARCH-SIGNAL", "utf-8");
68
+ writeFileSync(join(futureDir, "M003-SUMMARY.md"), "# M003 Summary\n\nFUTURE-SUMMARY-SIGNAL", "utf-8");
69
+
70
+ const prompt = await buildDiscussMilestonePrompt("M002", "Checkout Polish", base, "true");
71
+
72
+ assert.match(prompt, /## Inlined Context \(preloaded — do not re-read these files\)/);
73
+ assert.match(prompt, /### Milestone Roadmap/);
74
+ assert.match(prompt, /ROADMAP-SIGNAL/);
75
+ assert.match(prompt, /### Milestone Context/);
76
+ assert.match(prompt, /CONTEXT-SIGNAL/);
77
+ assert.match(prompt, /### Milestone Research/);
78
+ assert.match(prompt, /RESEARCH-SIGNAL/);
79
+ assert.match(prompt, /### Decisions Register/);
80
+ assert.match(prompt, /DECISION-SIGNAL/);
81
+ assert.match(prompt, /### M001 Prior Milestone Summary/);
82
+ assert.match(prompt, /PRIOR-SUMMARY-SIGNAL/);
83
+ assert.doesNotMatch(prompt, /FUTURE-SUMMARY-SIGNAL/);
84
+ assert.match(prompt, /### Output Template: Context/);
85
+ } finally {
86
+ rmSync(base, { recursive: true, force: true });
87
+ }
88
+ });
@@ -104,3 +104,89 @@ test("guided dispatch passes the explicit project root through model and compati
104
104
  rmSync(otherRoot, { recursive: true, force: true });
105
105
  }
106
106
  });
107
+
108
+ test("guided dispatch accepts workflow MCP tools absent from parent active tool surface", async () => {
109
+ const explicitRoot = mkdtempSync(join(tmpdir(), "gsd-guided-mcp-surface-"));
110
+ const workflowPath = join(explicitRoot, "GSD-WORKFLOW.md");
111
+ const originalWorkflowPath = process.env.GSD_WORKFLOW_PATH;
112
+ const originalMcpCommand = process.env.GSD_WORKFLOW_MCP_COMMAND;
113
+ const notifications: string[] = [];
114
+ let sent = false;
115
+
116
+ const ctx = {
117
+ model: { provider: "claude-code", baseUrl: "local://claude-code" },
118
+ modelRegistry: {
119
+ getProviderAuthMode: () => "externalCli",
120
+ },
121
+ ui: {
122
+ notify: (message: string) => {
123
+ notifications.push(message);
124
+ },
125
+ },
126
+ };
127
+
128
+ let activeTools = [
129
+ "ScheduleWakeup",
130
+ "ToolSearch",
131
+ "ask_user_questions",
132
+ "bash",
133
+ "read",
134
+ "write",
135
+ ];
136
+
137
+ const pi = {
138
+ getActiveTools: () => [...activeTools],
139
+ setActiveTools: (tools: string[]) => {
140
+ activeTools = [...tools];
141
+ },
142
+ sendMessage: () => {
143
+ sent = true;
144
+ },
145
+ };
146
+
147
+ try {
148
+ writeFileSync(workflowPath, "# Workflow\n", "utf-8");
149
+ process.env.GSD_WORKFLOW_PATH = workflowPath;
150
+ process.env.GSD_WORKFLOW_MCP_COMMAND = "node";
151
+
152
+ await _dispatchWorkflowForTest(
153
+ pi as any,
154
+ "Discuss the milestone.",
155
+ "gsd-discuss",
156
+ ctx as any,
157
+ "discuss-milestone",
158
+ {
159
+ basePath: explicitRoot,
160
+ deps: {
161
+ loadPreferences: () => ({ preferences: {} }) as any,
162
+ selectModel: (async () => ({
163
+ routing: null,
164
+ appliedModel: {
165
+ provider: "claude-code",
166
+ id: "claude-opus-4-8",
167
+ baseUrl: "local://claude-code",
168
+ },
169
+ })) as any,
170
+ },
171
+ },
172
+ );
173
+
174
+ assert.equal(sent, true);
175
+ assert.equal(
176
+ notifications.some((message) => message.includes("cannot run guided flow")),
177
+ false,
178
+ );
179
+ } finally {
180
+ if (originalWorkflowPath === undefined) {
181
+ delete process.env.GSD_WORKFLOW_PATH;
182
+ } else {
183
+ process.env.GSD_WORKFLOW_PATH = originalWorkflowPath;
184
+ }
185
+ if (originalMcpCommand === undefined) {
186
+ delete process.env.GSD_WORKFLOW_MCP_COMMAND;
187
+ } else {
188
+ process.env.GSD_WORKFLOW_MCP_COMMAND = originalMcpCommand;
189
+ }
190
+ rmSync(explicitRoot, { recursive: true, force: true });
191
+ }
192
+ });
@@ -8,14 +8,17 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
8
8
 
9
9
  test("guided milestone discussion callsites pass workingDirectory to loadPrompt", () => {
10
10
  const source = readFileSync(join(__dirname, "..", "guided-flow.ts"), "utf-8");
11
- const calls = [...source.matchAll(/loadPrompt\("guided-discuss-milestone",\s*\{([\s\S]*?)\}\)/g)];
12
11
 
13
- assert.equal(calls.length, 8, "all guided-flow guided-discuss-milestone callsites should be covered");
14
- for (const call of calls) {
15
- assert.match(
16
- call[1] ?? "",
17
- /\bworkingDirectory:\s*basePath\b/,
18
- "guided-discuss-milestone prompts need workingDirectory so template validation does not crash",
19
- );
20
- }
12
+ // All guided-discuss-milestone dispatches now go through buildDiscussMilestonePrompt,
13
+ // which centralises the loadPrompt call and always passes workingDirectory.
14
+ // Verify no callsite bypasses the builder by calling loadPrompt directly.
15
+ const directCalls = [...source.matchAll(/loadPrompt\("guided-discuss-milestone"/g)];
16
+ assert.equal(
17
+ directCalls.length,
18
+ 0,
19
+ 'guided-flow.ts must not call loadPrompt("guided-discuss-milestone") directly — use buildDiscussMilestonePrompt',
20
+ );
21
+
22
+ const calls = [...source.matchAll(/\bawait buildDiscussMilestonePrompt\(/g)];
23
+ assert.equal(calls.length, 9, "all guided-flow guided-discuss-milestone callsites should be covered");
21
24
  });
@@ -119,8 +119,8 @@ test("resolveExpectedArtifactPath returns correct path for all slice-level types
119
119
  // ─── run-uat artifact path contract (#2873) ──────────────────────────────
120
120
 
121
121
  test("resolveExpectedArtifactPath for run-uat returns ASSESSMENT path, not UAT (#2873)", (t) => {
122
- // The run-uat prompt instructs the agent to call gsd_summary_save with
123
- // artifact_type: "ASSESSMENT", which writes S##-ASSESSMENT.md. The artifact
122
+ // The run-uat prompt instructs the agent to call gsd_uat_result_save, which
123
+ // writes S##-ASSESSMENT.md through the workflow persistence path. The artifact
124
124
  // verification path must match — otherwise verification fails and auto-mode
125
125
  // retries the unit in an infinite loop.
126
126
  const base = makeTmpBase();
@@ -147,12 +147,12 @@ test("diagnoseExpectedArtifact for run-uat references ASSESSMENT (#2873)", (t) =
147
147
  });
148
148
 
149
149
  test("verifyExpectedArtifact passes for run-uat when ASSESSMENT file exists (#2873)", (t) => {
150
- // Regression test: run-uat writes S##-ASSESSMENT.md via gsd_summary_save,
150
+ // Regression test: run-uat writes S##-ASSESSMENT.md via gsd_uat_result_save,
151
151
  // but verification looked for S##-UAT.md, causing false stuck retries.
152
152
  const base = makeTmpBase();
153
153
  t.after(() => cleanup(base));
154
154
 
155
- // Write the ASSESSMENT file (what gsd_summary_save actually produces)
155
+ // Write the ASSESSMENT file (what gsd_uat_result_save actually produces)
156
156
  const assessPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-ASSESSMENT.md");
157
157
  writeFileSync(assessPath, "---\nverdict: PASS\n---\n# UAT Assessment\n");
158
158