@opengsd/gsd-pi 1.1.1-dev.616a1a1 → 1.1.1-dev.75048e7

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 (452) 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 +55 -0
  14. package/dist/resources/extensions/gsd/auto-post-unit.js +134 -10
  15. package/dist/resources/extensions/gsd/auto-prompts.js +72 -22
  16. package/dist/resources/extensions/gsd/auto-recovery.js +7 -8
  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 +18 -65
  21. package/dist/resources/extensions/gsd/auto-worktree.js +18 -5
  22. package/dist/resources/extensions/gsd/auto.js +31 -6
  23. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +89 -4
  24. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +43 -0
  25. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +56 -20
  26. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +33 -38
  27. package/dist/resources/extensions/gsd/browser-evidence.js +29 -2
  28. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +61 -0
  29. package/dist/resources/extensions/gsd/commands/catalog.js +6 -1
  30. package/dist/resources/extensions/gsd/commands/handlers/core.js +6 -2
  31. package/dist/resources/extensions/gsd/commands/handlers/ops.js +9 -5
  32. package/dist/resources/extensions/gsd/commands-handlers.js +76 -11
  33. package/dist/resources/extensions/gsd/commands-maintenance.js +172 -2
  34. package/dist/resources/extensions/gsd/commands-mcp-status.js +109 -60
  35. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +3 -1
  36. package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
  37. package/dist/resources/extensions/gsd/config-overlay.js +2 -1
  38. package/dist/resources/extensions/gsd/dashboard-overlay.js +21 -7
  39. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  40. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +2 -2
  41. package/dist/resources/extensions/gsd/error-classifier.js +2 -1
  42. package/dist/resources/extensions/gsd/escalation.js +4 -4
  43. package/dist/resources/extensions/gsd/exec-sandbox.js +2 -0
  44. package/dist/resources/extensions/gsd/forensics.js +74 -2
  45. package/dist/resources/extensions/gsd/gsd-db.js +42 -6
  46. package/dist/resources/extensions/gsd/guided-flow.js +119 -176
  47. package/dist/resources/extensions/gsd/mcp-filter.js +3 -0
  48. package/dist/resources/extensions/gsd/mcp-project-config.js +76 -84
  49. package/dist/resources/extensions/gsd/memory-store.js +4 -1
  50. package/dist/resources/extensions/gsd/migration-auto-check.js +2 -2
  51. package/dist/resources/extensions/gsd/milestone-closeout.js +3 -1
  52. package/dist/resources/extensions/gsd/pending-auto-start.js +0 -1
  53. package/dist/resources/extensions/gsd/post-unit-hooks.js +9 -0
  54. package/dist/resources/extensions/gsd/preferences-validation.js +39 -0
  55. package/dist/resources/extensions/gsd/prompt-loader.js +7 -0
  56. package/dist/resources/extensions/gsd/prompts/forensics.md +61 -1
  57. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  58. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  59. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  60. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  61. package/dist/resources/extensions/gsd/prompts/run-uat.md +33 -23
  62. package/dist/resources/extensions/gsd/prompts/system.md +3 -1
  63. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  64. package/dist/resources/extensions/gsd/recovery-classification.js +20 -0
  65. package/dist/resources/extensions/gsd/rule-registry.js +428 -52
  66. package/dist/resources/extensions/gsd/safety/destructive-guard.js +3 -0
  67. package/dist/resources/extensions/gsd/skill-activation.js +20 -3
  68. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +4 -2
  69. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
  70. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +18 -1
  71. package/dist/resources/extensions/gsd/state-reconciliation/index.js +6 -0
  72. package/dist/resources/extensions/gsd/state.js +17 -14
  73. package/dist/resources/extensions/gsd/templates/plan.md +3 -1
  74. package/dist/resources/extensions/gsd/tool-contract.js +5 -0
  75. package/dist/resources/extensions/gsd/tool-presentation-plan.js +143 -0
  76. package/dist/resources/extensions/gsd/tools/complete-slice.js +15 -1
  77. package/dist/resources/extensions/gsd/tools/complete-task.js +11 -1
  78. package/dist/resources/extensions/gsd/tools/exec-tool.js +109 -0
  79. package/dist/resources/extensions/gsd/tools/plan-slice.js +14 -9
  80. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  81. package/dist/resources/extensions/gsd/tools/validate-milestone.js +46 -16
  82. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +483 -6
  83. package/dist/resources/extensions/gsd/unit-context-manifest.js +8 -3
  84. package/dist/resources/extensions/gsd/unit-tool-contracts.js +169 -0
  85. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  86. package/dist/resources/extensions/gsd/verdict-parser.js +59 -15
  87. package/dist/resources/extensions/gsd/verification-gate.js +72 -1
  88. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +3 -1
  89. package/dist/resources/extensions/gsd/workflow-mcp.js +5 -73
  90. package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -0
  91. package/dist/resources/extensions/mcp-client/manager.js +31 -1
  92. package/dist/resources/extensions/shared/gsd-browser-cli.js +145 -0
  93. package/dist/rtk.d.ts +7 -1
  94. package/dist/rtk.js +27 -11
  95. package/dist/update-check.d.ts +15 -1
  96. package/dist/update-check.js +87 -12
  97. package/dist/update-cmd.d.ts +1 -0
  98. package/dist/update-cmd.js +53 -2
  99. package/dist/web/standalone/.next/BUILD_ID +1 -1
  100. package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
  101. package/dist/web/standalone/.next/build-manifest.json +2 -2
  102. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  103. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  112. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/index.html +1 -1
  121. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
  128. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  129. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  131. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  132. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  133. package/package.json +5 -3
  134. package/packages/cloud-mcp-gateway/package.json +2 -2
  135. package/packages/contracts/dist/workflow.d.ts +14 -0
  136. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  137. package/packages/contracts/dist/workflow.js +16 -0
  138. package/packages/contracts/dist/workflow.js.map +1 -1
  139. package/packages/contracts/package.json +1 -1
  140. package/packages/daemon/package.json +4 -4
  141. package/packages/gsd-agent-core/dist/agent-session.d.ts +9 -0
  142. package/packages/gsd-agent-core/dist/agent-session.d.ts.map +1 -1
  143. package/packages/gsd-agent-core/dist/agent-session.js +32 -0
  144. package/packages/gsd-agent-core/dist/agent-session.js.map +1 -1
  145. package/packages/gsd-agent-core/dist/index.d.ts +1 -0
  146. package/packages/gsd-agent-core/dist/index.d.ts.map +1 -1
  147. package/packages/gsd-agent-core/dist/index.js +1 -0
  148. package/packages/gsd-agent-core/dist/index.js.map +1 -1
  149. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts +2 -0
  150. package/packages/gsd-agent-core/dist/session/agent-session-compaction.d.ts.map +1 -1
  151. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js +8 -2
  152. package/packages/gsd-agent-core/dist/session/agent-session-compaction.js.map +1 -1
  153. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts +7 -0
  154. package/packages/gsd-agent-core/dist/session/agent-session-host.d.ts.map +1 -1
  155. package/packages/gsd-agent-core/dist/session/agent-session-host.js.map +1 -1
  156. package/packages/gsd-agent-core/dist/session/agent-session-prompt.d.ts.map +1 -1
  157. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js +69 -1
  158. package/packages/gsd-agent-core/dist/session/agent-session-prompt.js.map +1 -1
  159. package/packages/gsd-agent-core/dist/turn-latency.d.ts +47 -0
  160. package/packages/gsd-agent-core/dist/turn-latency.d.ts.map +1 -0
  161. package/packages/gsd-agent-core/dist/turn-latency.js +123 -0
  162. package/packages/gsd-agent-core/dist/turn-latency.js.map +1 -0
  163. package/packages/gsd-agent-core/package.json +6 -6
  164. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +21 -0
  165. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +1 -0
  166. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +213 -0
  167. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +1 -0
  168. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  169. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  170. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  171. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  172. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  173. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +5 -0
  174. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  175. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +1 -0
  176. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  177. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +92 -31
  178. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  179. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  180. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +7 -1
  181. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  182. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.d.ts.map +1 -1
  183. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js +6 -0
  184. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-command-handlers.js.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -1
  186. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -0
  187. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  188. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -1
  189. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
  190. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
  192. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +1 -0
  194. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  196. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +5 -0
  197. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  198. package/packages/gsd-agent-modes/package.json +7 -7
  199. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -1
  200. package/packages/mcp-server/dist/remote-questions.js +23 -9
  201. package/packages/mcp-server/dist/remote-questions.js.map +1 -1
  202. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  203. package/packages/mcp-server/dist/workflow-tools.js +84 -2
  204. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  205. package/packages/mcp-server/package.json +3 -3
  206. package/packages/native/package.json +1 -1
  207. package/packages/pi-agent-core/dist/agent-loop.js +42 -3
  208. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  209. package/packages/pi-agent-core/dist/agent.d.ts +5 -1
  210. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  211. package/packages/pi-agent-core/dist/agent.js +2 -0
  212. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  213. package/packages/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  214. package/packages/pi-agent-core/dist/harness/agent-harness.js +3 -1
  215. package/packages/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  216. package/packages/pi-agent-core/dist/harness/types.d.ts +1 -0
  217. package/packages/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  218. package/packages/pi-agent-core/dist/harness/types.js.map +1 -1
  219. package/packages/pi-agent-core/dist/types.d.ts +6 -1
  220. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  221. package/packages/pi-agent-core/dist/types.js.map +1 -1
  222. package/packages/pi-agent-core/package.json +1 -1
  223. package/packages/pi-ai/dist/api-registry.d.ts +2 -0
  224. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  225. package/packages/pi-ai/dist/api-registry.js +23 -0
  226. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  227. package/packages/pi-ai/dist/image-models.generated.d.ts +15 -0
  228. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  229. package/packages/pi-ai/dist/image-models.generated.js +15 -0
  230. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  231. package/packages/pi-ai/dist/models.generated.d.ts +411 -39
  232. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  233. package/packages/pi-ai/dist/models.generated.js +504 -153
  234. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  235. package/packages/pi-ai/dist/stream.js +6 -6
  236. package/packages/pi-ai/dist/stream.js.map +1 -1
  237. package/packages/pi-ai/package.json +1 -1
  238. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +3 -0
  239. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  240. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/core/model-registry.js +2 -2
  243. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  245. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  246. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  247. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/tools/bash.js +2 -2
  249. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/tools/edit.js +3 -2
  252. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts +1 -0
  254. package/packages/pi-coding-agent/dist/core/tools/render-utils.d.ts.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/tools/render-utils.js +6 -0
  256. package/packages/pi-coding-agent/dist/core/tools/render-utils.js.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/tools/write.js +3 -2
  259. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  260. package/packages/pi-coding-agent/package.json +7 -7
  261. package/packages/pi-tui/dist/terminal.d.ts +1 -0
  262. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  263. package/packages/pi-tui/dist/terminal.js +8 -4
  264. package/packages/pi-tui/dist/terminal.js.map +1 -1
  265. package/packages/pi-tui/package.json +1 -1
  266. package/packages/rpc-client/package.json +2 -2
  267. package/pkg/package.json +1 -1
  268. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +579 -0
  269. package/src/resources/extensions/browser-tools/engine/selection.ts +19 -0
  270. package/src/resources/extensions/browser-tools/extension-manifest.json +2 -2
  271. package/src/resources/extensions/browser-tools/index.ts +60 -9
  272. package/src/resources/extensions/browser-tools/package.json +5 -1
  273. package/src/resources/extensions/browser-tools/tests/browser-engine-selection.test.mjs +35 -0
  274. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +33 -0
  275. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +196 -16
  276. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +239 -63
  277. package/src/resources/extensions/gsd/auto/orchestrator.ts +0 -1
  278. package/src/resources/extensions/gsd/auto/phases.ts +5 -3
  279. package/src/resources/extensions/gsd/auto-dashboard.ts +98 -18
  280. package/src/resources/extensions/gsd/auto-dispatch.ts +67 -0
  281. package/src/resources/extensions/gsd/auto-post-unit.ts +166 -9
  282. package/src/resources/extensions/gsd/auto-prompts.ts +106 -15
  283. package/src/resources/extensions/gsd/auto-recovery.ts +7 -7
  284. package/src/resources/extensions/gsd/auto-runtime-state.ts +4 -0
  285. package/src/resources/extensions/gsd/auto-start.ts +112 -17
  286. package/src/resources/extensions/gsd/auto-tool-tracking.ts +1 -1
  287. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +43 -73
  288. package/src/resources/extensions/gsd/auto-worktree.ts +23 -5
  289. package/src/resources/extensions/gsd/auto.ts +47 -5
  290. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +96 -4
  291. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +51 -0
  292. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +81 -25
  293. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +70 -63
  294. package/src/resources/extensions/gsd/browser-evidence.ts +26 -2
  295. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +137 -0
  296. package/src/resources/extensions/gsd/commands/catalog.ts +6 -1
  297. package/src/resources/extensions/gsd/commands/handlers/core.ts +6 -2
  298. package/src/resources/extensions/gsd/commands/handlers/ops.ts +9 -5
  299. package/src/resources/extensions/gsd/commands-handlers.ts +76 -11
  300. package/src/resources/extensions/gsd/commands-maintenance.ts +197 -2
  301. package/src/resources/extensions/gsd/commands-mcp-status.ts +136 -58
  302. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +4 -1
  303. package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
  304. package/src/resources/extensions/gsd/config-overlay.ts +3 -1
  305. package/src/resources/extensions/gsd/dashboard-overlay.ts +28 -7
  306. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  307. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +2 -2
  308. package/src/resources/extensions/gsd/error-classifier.ts +2 -1
  309. package/src/resources/extensions/gsd/escalation.ts +4 -4
  310. package/src/resources/extensions/gsd/exec-sandbox.ts +4 -0
  311. package/src/resources/extensions/gsd/forensics.ts +99 -5
  312. package/src/resources/extensions/gsd/gsd-db.ts +46 -8
  313. package/src/resources/extensions/gsd/guided-flow.ts +215 -217
  314. package/src/resources/extensions/gsd/mcp-filter.ts +3 -0
  315. package/src/resources/extensions/gsd/mcp-project-config.ts +105 -88
  316. package/src/resources/extensions/gsd/memory-store.ts +4 -1
  317. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  318. package/src/resources/extensions/gsd/milestone-closeout.ts +3 -1
  319. package/src/resources/extensions/gsd/pending-auto-start.ts +0 -2
  320. package/src/resources/extensions/gsd/post-unit-hooks.ts +14 -1
  321. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  322. package/src/resources/extensions/gsd/preferences-validation.ts +36 -0
  323. package/src/resources/extensions/gsd/prompt-loader.ts +8 -0
  324. package/src/resources/extensions/gsd/prompts/forensics.md +61 -1
  325. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +3 -1
  326. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +3 -1
  327. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  328. package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -1
  329. package/src/resources/extensions/gsd/prompts/run-uat.md +33 -23
  330. package/src/resources/extensions/gsd/prompts/system.md +3 -1
  331. package/src/resources/extensions/gsd/prompts/validate-milestone.md +3 -3
  332. package/src/resources/extensions/gsd/recovery-classification.ts +20 -0
  333. package/src/resources/extensions/gsd/rule-registry.ts +558 -58
  334. package/src/resources/extensions/gsd/rule-types.ts +2 -0
  335. package/src/resources/extensions/gsd/safety/destructive-guard.ts +3 -0
  336. package/src/resources/extensions/gsd/skill-activation.ts +20 -2
  337. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +4 -2
  338. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
  339. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +20 -0
  340. package/src/resources/extensions/gsd/state-reconciliation/index.ts +6 -0
  341. package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -0
  342. package/src/resources/extensions/gsd/state.ts +18 -14
  343. package/src/resources/extensions/gsd/templates/plan.md +3 -1
  344. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +156 -4
  345. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +123 -0
  346. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +10 -2
  347. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +4 -1
  348. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +143 -2
  349. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +24 -2
  350. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +12 -2
  351. package/src/resources/extensions/gsd/tests/browser-evidence.test.ts +142 -0
  352. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +9 -15
  353. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +26 -16
  354. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +21 -0
  355. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +38 -3
  356. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +6 -2
  357. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +30 -0
  358. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  359. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +45 -0
  360. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +53 -0
  361. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +8 -0
  362. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +50 -13
  363. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +31 -0
  364. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +40 -1
  365. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +60 -0
  366. package/src/resources/extensions/gsd/tests/doctor-runtime-checks.test.ts +27 -0
  367. package/src/resources/extensions/gsd/tests/escalation.test.ts +16 -27
  368. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +18 -0
  369. package/src/resources/extensions/gsd/tests/exec-tool.test.ts +69 -0
  370. package/src/resources/extensions/gsd/tests/forensics-issue-routing.test.ts +20 -0
  371. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +3 -0
  372. package/src/resources/extensions/gsd/tests/forensics-tool-scope.test.ts +69 -0
  373. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +31 -79
  374. package/src/resources/extensions/gsd/tests/gsd-rebuild.test.ts +199 -0
  375. package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +75 -0
  376. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +40 -1
  377. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +86 -0
  378. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +5 -3
  379. package/src/resources/extensions/gsd/tests/guided-flow-state-rebuild.test.ts +40 -4
  380. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +12 -9
  381. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +4 -4
  382. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +8 -0
  383. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +16 -0
  384. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +72 -10
  385. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +13 -6
  386. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +15 -0
  387. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +100 -0
  388. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +179 -0
  389. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +39 -8
  390. package/src/resources/extensions/gsd/tests/merge-closeout-consistency-gate.test.ts +63 -0
  391. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +10 -1
  392. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +3 -3
  393. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +9 -1
  394. package/src/resources/extensions/gsd/tests/new-milestone-discuss-routing.test.ts +3 -3
  395. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +54 -7
  396. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +9 -0
  397. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +39 -1
  398. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +157 -0
  399. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +179 -0
  400. package/src/resources/extensions/gsd/tests/preferences.test.ts +29 -0
  401. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +83 -1
  402. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +14 -0
  403. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +18 -1
  404. package/src/resources/extensions/gsd/tests/queued-discuss-fast-path.test.ts +7 -8
  405. package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +36 -0
  406. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -0
  407. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +1 -1
  408. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +75 -0
  409. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +4 -0
  410. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +36 -0
  411. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +100 -0
  412. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +55 -0
  413. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +6 -2
  414. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +191 -0
  415. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +84 -10
  416. package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
  417. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +12 -2
  418. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +7 -1
  419. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +29 -6
  420. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +29 -6
  421. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +6 -3
  422. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +133 -0
  423. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +21 -0
  424. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +51 -0
  425. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +17 -2
  426. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +493 -0
  427. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +40 -0
  428. package/src/resources/extensions/gsd/tool-contract.ts +6 -0
  429. package/src/resources/extensions/gsd/tool-presentation-plan.ts +223 -0
  430. package/src/resources/extensions/gsd/tools/complete-slice.ts +14 -1
  431. package/src/resources/extensions/gsd/tools/complete-task.ts +20 -2
  432. package/src/resources/extensions/gsd/tools/exec-tool.ts +130 -0
  433. package/src/resources/extensions/gsd/tools/plan-slice.ts +14 -9
  434. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  435. package/src/resources/extensions/gsd/tools/validate-milestone.ts +46 -15
  436. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +589 -8
  437. package/src/resources/extensions/gsd/types.ts +69 -5
  438. package/src/resources/extensions/gsd/unit-context-manifest.ts +14 -5
  439. package/src/resources/extensions/gsd/unit-tool-contracts.ts +186 -0
  440. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  441. package/src/resources/extensions/gsd/verdict-parser.ts +54 -13
  442. package/src/resources/extensions/gsd/verification-gate.ts +87 -1
  443. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -1
  444. package/src/resources/extensions/gsd/workflow-mcp.ts +5 -73
  445. package/src/resources/extensions/gsd/worktree-lifecycle.ts +26 -0
  446. package/src/resources/extensions/mcp-client/manager.ts +33 -1
  447. package/src/resources/extensions/mcp-client/tests/manager.test.ts +35 -0
  448. package/src/resources/extensions/shared/gsd-browser-cli.ts +172 -0
  449. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +0 -246
  450. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +0 -218
  451. /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_buildManifest.js +0 -0
  452. /package/dist/web/standalone/.next/static/{L9N5SPFi7f-Ne4u2uXzCe → h4TGni4xJzlZjGkxaT6uU}/_ssgManifest.js +0 -0
@@ -5,6 +5,8 @@
5
5
  * handleRunHook, handleUpdate, handleSkillHealth
6
6
  */
7
7
  import { existsSync, readFileSync, mkdirSync } from "node:fs";
8
+ import { execFileSync } from "node:child_process";
9
+ import { createRequire } from "node:module";
8
10
  import { join, resolve as resolvePath, sep } from "node:path";
9
11
  import { homedir } from "node:os";
10
12
  import { deriveState } from "./state.js";
@@ -20,7 +22,10 @@ import { loadPrompt } from "./prompt-loader.js";
20
22
  import { isPnpmInstall } from "../../shared/package-manager-detection.js";
21
23
  import { buildDoctorHealIssuePayload, buildDoctorHealSummary, buildWorkflowDispatchContent, } from "./workflow-protocol.js";
22
24
  import { restoreGsdWorkflowTools, scopeGsdWorkflowToolsForDispatch, } from "./bootstrap/register-hooks.js";
25
+ const GSD_PI_PACKAGE = "@opengsd/gsd-pi";
26
+ const GSD_BROWSER_PACKAGE = "@opengsd/gsd-browser";
23
27
  const UPDATE_REGISTRY_URL = "https://registry.npmjs.org/@opengsd%2fgsd-pi/latest";
28
+ const BROWSER_UPDATE_REGISTRY_URL = "https://registry.npmjs.org/@opengsd%2fgsd-browser/latest";
24
29
  const UPDATE_FETCH_TIMEOUT_MS = 5000;
25
30
  // Detects a bun-installed gsd via `process.argv[1]`. Mirrors isBunInstall in
26
31
  // src/update-check.ts — duplicated because tsconfig.resources.json rootDir
@@ -47,11 +52,11 @@ function resolveInstallCommand(pkg) {
47
52
  return `pnpm add -g ${pkg}`;
48
53
  return `npm install -g ${pkg}`;
49
54
  }
50
- async function fetchLatestVersionForCommand() {
55
+ async function fetchLatestVersionForCommand(registryUrl = UPDATE_REGISTRY_URL) {
51
56
  const controller = new AbortController();
52
57
  const timeout = setTimeout(() => controller.abort(), UPDATE_FETCH_TIMEOUT_MS);
53
58
  try {
54
- const res = await fetch(UPDATE_REGISTRY_URL, { signal: controller.signal });
59
+ const res = await fetch(registryUrl, { signal: controller.signal });
55
60
  if (!res.ok)
56
61
  return null;
57
62
  const data = (await res.json());
@@ -65,6 +70,19 @@ async function fetchLatestVersionForCommand() {
65
70
  clearTimeout(timeout);
66
71
  }
67
72
  }
73
+ function resolveInstalledPackageVersionForCommand(packageName) {
74
+ try {
75
+ const requireFromHere = createRequire(import.meta.url);
76
+ const packageJsonPath = requireFromHere.resolve(`${packageName}/package.json`);
77
+ const pkg = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
78
+ return typeof pkg.version === "string" && pkg.version.trim().length > 0
79
+ ? pkg.version.trim().replace(/^v/, "")
80
+ : null;
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
68
86
  export function dispatchDoctorHeal(pi, scope, reportText, structuredIssues) {
69
87
  const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(gsdHome(), "agent", "GSD-WORKFLOW.md");
70
88
  const workflow = readFileSync(workflowPath, "utf-8");
@@ -386,27 +404,74 @@ function compareSemverLocal(a, b) {
386
404
  }
387
405
  return 0;
388
406
  }
389
- export async function handleUpdate(ctx) {
407
+ function formatCommandVersion(version) {
408
+ return version ? `v${version}` : "unknown";
409
+ }
410
+ function pickHigherVersionForCommand(a, b) {
411
+ if (!a)
412
+ return b;
413
+ if (!b)
414
+ return a;
415
+ return compareSemverLocal(a, b) >= 0 ? a : b;
416
+ }
417
+ // Mirrors resolveGsdBrowserPathVersion in src/update-check.ts — duplicated because
418
+ // tsconfig.resources.json rootDir prevents importing from src/.
419
+ function resolveGsdBrowserPathVersionForCommand(env = process.env) {
420
+ const explicit = env.GSD_BROWSER_PATH_VERSION?.trim();
421
+ if (explicit)
422
+ return explicit.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
423
+ try {
424
+ const out = execFileSync("gsd-browser", ["--version"], {
425
+ encoding: "utf-8",
426
+ env,
427
+ stdio: ["ignore", "pipe", "ignore"],
428
+ timeout: 2000,
429
+ });
430
+ return out.match(/\b(\d+\.\d+\.\d+)\b/)?.[1] ?? null;
431
+ }
432
+ catch {
433
+ return null;
434
+ }
435
+ }
436
+ export async function handleUpdate(ctx, args = "") {
390
437
  const { execSync } = await import("node:child_process");
391
- const NPM_PACKAGE = "@opengsd/gsd-pi";
392
- const current = process.env.GSD_VERSION || "0.0.0";
393
- ctx.ui.notify(`Current version: v${current}\nChecking npm registry...`, "info");
394
- const latest = await fetchLatestVersionForCommand();
438
+ const target = args.trim();
439
+ const browserUpdate = target === "browser" || target === "gsd-browser";
440
+ if (target && !browserUpdate) {
441
+ ctx.ui.notify("Usage: /gsd update [browser]", "warning");
442
+ return;
443
+ }
444
+ const NPM_PACKAGE = browserUpdate ? GSD_BROWSER_PACKAGE : GSD_PI_PACKAGE;
445
+ const registryUrl = browserUpdate ? BROWSER_UPDATE_REGISTRY_URL : UPDATE_REGISTRY_URL;
446
+ const bundledVersion = browserUpdate
447
+ ? resolveInstalledPackageVersionForCommand(GSD_BROWSER_PACKAGE)
448
+ : null;
449
+ const current = browserUpdate
450
+ ? pickHigherVersionForCommand(bundledVersion, resolveGsdBrowserPathVersionForCommand())
451
+ : process.env.GSD_VERSION || "0.0.0";
452
+ const label = browserUpdate ? "gsd-browser version" : "version";
453
+ ctx.ui.notify(`Current ${label}: ${formatCommandVersion(current)}\nChecking npm registry...`, "info");
454
+ const latest = await fetchLatestVersionForCommand(registryUrl);
395
455
  if (!latest) {
396
456
  ctx.ui.notify("Failed to reach npm registry. Check your network connection.", "error");
397
457
  return;
398
458
  }
399
- if (compareSemverLocal(latest, current) <= 0) {
400
- ctx.ui.notify(`Already up to date (v${current}).`, "info");
459
+ if (current && compareSemverLocal(latest, current) <= 0) {
460
+ ctx.ui.notify(`Already up to date (${formatCommandVersion(current)}).`, "info");
401
461
  return;
402
462
  }
403
- ctx.ui.notify(`Updating: v${current} → v${latest}...`, "info");
463
+ ctx.ui.notify(`Updating: ${formatCommandVersion(current)} → v${latest}...`, "info");
404
464
  const installCmd = resolveInstallCommand(`${NPM_PACKAGE}@latest`);
405
465
  try {
406
466
  execSync(installCmd, {
407
467
  stdio: ["ignore", "pipe", "ignore"],
408
468
  });
409
- ctx.ui.notify(`Updated to v${latest}. Restart your GSD session to use the new version.`, "info");
469
+ const newPathVersion = browserUpdate ? resolveGsdBrowserPathVersionForCommand() : null;
470
+ const pathReady = !browserUpdate || (!!newPathVersion && compareSemverLocal(newPathVersion, latest) >= 0);
471
+ ctx.ui.notify(browserUpdate
472
+ ? `Updated gsd-browser to v${latest}. Restart your GSD session to use the new browser automation version.` +
473
+ (pathReady ? "" : "\nNote: Ensure the npm global bin directory is on your PATH so MCP automation uses the updated binary.")
474
+ : `Updated to v${latest}. Restart your GSD session to use the new version.`, "info");
410
475
  }
411
476
  catch {
412
477
  ctx.ui.notify(`Update failed. Try manually: ${installCmd}`, "error");
@@ -1,9 +1,12 @@
1
1
  /**
2
2
  * GSD Maintenance — cleanup, skip, dry-run, and recover handlers.
3
3
  *
4
- * Contains: handleCleanupBranches, handleCleanupSnapshots, handleCleanupWorktrees, handleSkip, handleDryRun, handleRecover
4
+ * Contains: handleCleanupBranches, handleCleanupSnapshots, handleCleanupWorktrees, handleSkip, handleDryRun, handleRecover, handleRebuild
5
5
  */
6
+ import { existsSync, mkdirSync, renameSync } from "node:fs";
7
+ import { dirname, isAbsolute, join, relative } from "node:path";
6
8
  import { deriveState } from "./state.js";
9
+ import { gsdProjectionRoot, gsdRoot } from "./paths.js";
7
10
  import { nativeBranchList, nativeDetectMainBranch, nativeBranchListMerged, nativeBranchDelete, nativeForEachRef, nativeUpdateRef } from "./native-git-bridge.js";
8
11
  import { logWarning } from "./workflow-logger.js";
9
12
  export async function handleCleanupBranches(ctx, basePath) {
@@ -439,6 +442,30 @@ export async function handleCleanupProjects(args, ctx) {
439
442
  }
440
443
  ctx.ui.notify(lines.join("\n"), "info");
441
444
  }
445
+ function recoverConfirmed(args) {
446
+ return args
447
+ .split(/\s+/)
448
+ .map((part) => part.trim().toLowerCase())
449
+ .some((part) => part === "--confirm" || part === "--yes" || part === "confirm");
450
+ }
451
+ async function confirmRecover(ctx, args) {
452
+ if (recoverConfirmed(args))
453
+ return true;
454
+ const warning = [
455
+ "gsd recover imports markdown into the database.",
456
+ "It clears and reconstructs milestone, slice, and task hierarchy rows from rendered markdown.",
457
+ "Use /gsd rebuild markdown for normal DB-to-markdown realignment.",
458
+ ].join("\n");
459
+ if (typeof ctx.ui.confirm === "function") {
460
+ const confirmed = await ctx.ui.confirm("Import markdown into the DB?", `${warning}\n\nContinue only if the DB is lost or corrupt and markdown is the source you intend to import.`);
461
+ if (confirmed)
462
+ return true;
463
+ ctx.ui.notify("gsd recover cancelled. No database changes made.", "info");
464
+ return false;
465
+ }
466
+ ctx.ui.notify(`${warning}\n\nNo database changes made. Re-run /gsd recover --confirm to proceed.`, "warning");
467
+ return false;
468
+ }
442
469
  /**
443
470
  * `gsd recover` — Reconstruct DB hierarchy state from rendered markdown on disk.
444
471
  *
@@ -448,7 +475,7 @@ export async function handleCleanupProjects(args, ctx) {
448
475
  *
449
476
  * Prints counts of recovered items and the resulting project phase.
450
477
  */
451
- export async function handleRecover(ctx, basePath) {
478
+ export async function handleRecover(ctx, basePath, args = "") {
452
479
  const { isDbAvailable: dbAvailable, clearEngineHierarchy, transaction: dbTransaction } = await import("./gsd-db.js");
453
480
  const { migrateHierarchyToDb } = await import("./md-importer.js");
454
481
  const { invalidateStateCache } = await import("./state.js");
@@ -456,6 +483,8 @@ export async function handleRecover(ctx, basePath) {
456
483
  ctx.ui.notify("gsd recover: No database open. Run a GSD command first to initialize the DB.", "error");
457
484
  return;
458
485
  }
486
+ if (!(await confirmRecover(ctx, args)))
487
+ return;
459
488
  try {
460
489
  // 1. Delete + re-populate inside a single transaction for atomicity.
461
490
  // clearEngineHierarchy() uses transaction() internally but transaction()
@@ -496,3 +525,144 @@ export async function handleRecover(ctx, basePath) {
496
525
  ctx.ui.notify(`gsd recover failed: ${msg}`, "error");
497
526
  }
498
527
  }
528
+ function normalizeArtifactPath(value) {
529
+ return value.replace(/\\/g, "/");
530
+ }
531
+ function pathWithin(root, candidate) {
532
+ const rel = relative(root, candidate);
533
+ return rel.length === 0 || (!rel.startsWith("..") && !isAbsolute(rel));
534
+ }
535
+ function artifactPathForDb(basePath, absPath) {
536
+ const projectionRoot = gsdProjectionRoot(basePath);
537
+ const root = pathWithin(projectionRoot, absPath) ? projectionRoot : gsdRoot(basePath);
538
+ return normalizeArtifactPath(relative(root, absPath));
539
+ }
540
+ function quarantineRelativePath(basePath, absPath) {
541
+ for (const root of [gsdProjectionRoot(basePath), gsdRoot(basePath)]) {
542
+ if (pathWithin(root, absPath)) {
543
+ return normalizeArtifactPath(relative(root, absPath));
544
+ }
545
+ }
546
+ return normalizeArtifactPath(absPath.replace(/^[/\\]+/, ""));
547
+ }
548
+ function uniquePath(path) {
549
+ if (!existsSync(path))
550
+ return path;
551
+ let idx = 2;
552
+ while (existsSync(`${path}.${idx}`))
553
+ idx++;
554
+ return `${path}.${idx}`;
555
+ }
556
+ function resolveDiskArtifactPath(basePath, artifactPath) {
557
+ if (isAbsolute(artifactPath))
558
+ return artifactPath;
559
+ const candidates = [
560
+ join(gsdProjectionRoot(basePath), artifactPath),
561
+ join(gsdRoot(basePath), artifactPath),
562
+ ];
563
+ return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0];
564
+ }
565
+ function quarantineProjectionFile(basePath, absPath, stamp) {
566
+ const rel = quarantineRelativePath(basePath, absPath);
567
+ const target = uniquePath(join(gsdProjectionRoot(basePath), "quarantine", "projections", stamp, rel));
568
+ mkdirSync(dirname(target), { recursive: true });
569
+ renameSync(absPath, target);
570
+ return target;
571
+ }
572
+ function parseRebuildTarget(args) {
573
+ const trimmed = args.trim().toLowerCase();
574
+ if (!trimmed || trimmed === "markdown")
575
+ return "markdown";
576
+ if (trimmed === "database" || trimmed === "db")
577
+ return "database";
578
+ return "usage";
579
+ }
580
+ /**
581
+ * `gsd rebuild markdown` — Re-render markdown projections from the authoritative DB.
582
+ *
583
+ * This is the DB-first realignment command. It does not import markdown into
584
+ * the DB. Completion SUMMARY files that contradict open DB rows are preserved
585
+ * under `.gsd/quarantine/projections/` before DB projections are rendered.
586
+ */
587
+ export async function handleRebuild(ctx, basePath, args = "") {
588
+ const { isDbAvailable: dbAvailable, deleteArtifactByPath } = await import("./gsd-db.js");
589
+ const { detectArtifactDbDrift } = await import("./state-reconciliation/drift/artifact-db.js");
590
+ const { renderAllFromDb } = await import("./markdown-renderer.js");
591
+ const { invalidateStateCache } = await import("./state.js");
592
+ const target = parseRebuildTarget(args);
593
+ if (target === "usage") {
594
+ ctx.ui.notify([
595
+ "Usage:",
596
+ " /gsd rebuild markdown Rebuild markdown projections from the canonical DB",
597
+ " /gsd rebuild database Reserved for DB-native rebuilds; does not import markdown",
598
+ ].join("\n"), "warning");
599
+ return;
600
+ }
601
+ if (target === "database") {
602
+ ctx.ui.notify([
603
+ "gsd rebuild database is reserved for DB-native rebuilds.",
604
+ "It will not import markdown projections into the DB.",
605
+ "For normal realignment, run /gsd rebuild markdown.",
606
+ "If the DB is lost or corrupt and markdown is the source to import, run /gsd recover --confirm.",
607
+ ].join("\n"), "warning");
608
+ return;
609
+ }
610
+ if (!dbAvailable()) {
611
+ ctx.ui.notify("gsd rebuild markdown: No database open. Run a GSD command first to initialize the DB.", "error");
612
+ return;
613
+ }
614
+ try {
615
+ invalidateStateCache();
616
+ const state = await deriveState(basePath);
617
+ const drifts = detectArtifactDbDrift(state, { basePath, state });
618
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
619
+ const quarantined = [];
620
+ const seen = new Set();
621
+ for (const drift of drifts) {
622
+ if (drift.kind !== "artifact-db-status-divergence")
623
+ continue;
624
+ if (drift.artifactType !== "SUMMARY" || !drift.artifactPath)
625
+ continue;
626
+ const absPath = resolveDiskArtifactPath(basePath, drift.artifactPath);
627
+ if (seen.has(absPath) || !existsSync(absPath))
628
+ continue;
629
+ seen.add(absPath);
630
+ const artifactDbPath = artifactPathForDb(basePath, absPath);
631
+ const target = quarantineProjectionFile(basePath, absPath, stamp);
632
+ deleteArtifactByPath(artifactDbPath);
633
+ quarantined.push(target);
634
+ }
635
+ const rendered = await renderAllFromDb(basePath);
636
+ invalidateStateCache();
637
+ const lines = [
638
+ "gsd rebuild markdown: rebuilt markdown projections from the canonical DB",
639
+ ` Rendered: ${rendered.rendered}`,
640
+ ` Skipped: ${rendered.skipped}`,
641
+ ` Quarantined: ${quarantined.length}`,
642
+ ];
643
+ if (rendered.errors.length > 0) {
644
+ lines.push(` Errors: ${rendered.errors.length}`);
645
+ for (const err of rendered.errors.slice(0, 5)) {
646
+ lines.push(` - ${err}`);
647
+ }
648
+ if (rendered.errors.length > 5) {
649
+ lines.push(` - ${rendered.errors.length - 5} more`);
650
+ }
651
+ }
652
+ if (quarantined.length > 0) {
653
+ lines.push("", " Quarantine:");
654
+ for (const target of quarantined.slice(0, 5)) {
655
+ lines.push(` - ${target}`);
656
+ }
657
+ if (quarantined.length > 5) {
658
+ lines.push(` - ${quarantined.length - 5} more`);
659
+ }
660
+ }
661
+ ctx.ui.notify(lines.join("\n"), rendered.errors.length > 0 ? "warning" : "success");
662
+ }
663
+ catch (err) {
664
+ const msg = err instanceof Error ? err.message : String(err);
665
+ logWarning("command", `rebuild failed: ${msg}`);
666
+ ctx.ui.notify(`gsd rebuild failed: ${msg}`, "error");
667
+ }
668
+ }
@@ -7,6 +7,7 @@
7
7
  * /gsd mcp — Overview of all servers (alias: /gsd mcp status)
8
8
  * /gsd mcp status — Same as bare /gsd mcp
9
9
  * /gsd mcp check <srv> — Detailed status for a specific server
10
+ * /gsd mcp discover [srv] — Connect and list tools for a server
10
11
  * /gsd mcp test <srv> — Test handshake + tools/list for a server
11
12
  * /gsd mcp enable <srv> / disable <srv> — Toggle local server exposure
12
13
  * /gsd mcp import <srv> [as <name>] — Copy a discovered server into local config
@@ -15,6 +16,7 @@
15
16
  import { resolve } from "node:path";
16
17
  import { ensureProjectWorkflowMcpConfig } from "./mcp-project-config.js";
17
18
  import { deleteProjectLocalMcpServer, readMcpManagementStatus, setProjectLocalMcpServerDisabled, testMcpServerConnection, upsertProjectLocalMcpServer, } from "../mcp-client/manager.js";
19
+ const MCP_STATUS_PROBE_TIMEOUT_MS = 10_000;
18
20
  export function hasHostMcpTool(systemPrompt, serverName) {
19
21
  const marker = `mcp__${serverName}__`;
20
22
  return systemPrompt.includes(marker);
@@ -31,7 +33,8 @@ export function formatMcpInitResult(status, configPath, targetPath) {
31
33
  `Project: ${targetPath}`,
32
34
  `Config: ${configPath}`,
33
35
  "",
34
- "MCP-capable clients can now load the GSD workflow MCP server from this folder.",
36
+ "MCP-capable clients can now load the GSD workflow and gsd-browser MCP servers from this folder.",
37
+ "Pi Providers use the managed gsd-browser engine directly; this project config is for External MCP Clients.",
35
38
  "Restart or reconnect any client that already has this project open.",
36
39
  ].join("\n");
37
40
  }
@@ -48,21 +51,23 @@ export function formatMcpStatusReport(servers) {
48
51
  }
49
52
  const lines = [`MCP Server Status — ${servers.length} server(s)\n`];
50
53
  for (const s of servers) {
51
- const icon = s.disabled ? "⊘" : s.error ? "✗" : s.connected ? "✓" : "○";
54
+ const icon = s.disabled ? "⊘" : s.error ? "✗" : s.connected || s.available ? "✓" : "○";
52
55
  const status = s.disabled
53
56
  ? "disabled"
54
57
  : s.error
55
58
  ? `error: ${s.error}`
56
59
  : s.connected
57
60
  ? `connected — ${s.toolCount} tools`
58
- : "disconnected";
61
+ : s.available
62
+ ? `available — ${s.toolCount} tools`
63
+ : "disconnected";
59
64
  const warningText = s.envWarnings?.length ? ` — ${s.envWarnings.length} warning(s)` : "";
60
65
  lines.push(` ${icon} ${s.name} (${s.transport}) — ${status}${warningText}`);
61
66
  }
62
67
  lines.push("");
63
68
  lines.push("Use /gsd mcp check <server> for details on a specific server.");
69
+ lines.push("Use /gsd mcp discover <server> to connect and list tools.");
64
70
  lines.push("Use /gsd mcp test <server> to verify handshake and tool discovery.");
65
- lines.push("Use mcp_discover to connect and list tools for a server.");
66
71
  return lines.join("\n");
67
72
  }
68
73
  export function formatMcpServerDetail(server) {
@@ -77,8 +82,8 @@ export function formatMcpServerDetail(server) {
77
82
  lines.push(` Status: error`);
78
83
  lines.push(` Error: ${server.error}`);
79
84
  }
80
- else if (server.connected) {
81
- lines.push(` Status: connected`);
85
+ else if (server.connected || server.available) {
86
+ lines.push(` Status: ${server.connected ? "connected" : "available"}`);
82
87
  lines.push(` Tools: ${server.toolCount}`);
83
88
  if (server.tools.length > 0) {
84
89
  lines.push("");
@@ -91,7 +96,7 @@ export function formatMcpServerDetail(server) {
91
96
  else {
92
97
  lines.push(` Status: disconnected`);
93
98
  lines.push("");
94
- lines.push(` Run mcp_discover("${server.name}") to connect and list tools.`);
99
+ lines.push(` Run /gsd mcp discover ${server.name} to connect and list tools.`);
95
100
  }
96
101
  if (server.envWarnings?.length) {
97
102
  lines.push("");
@@ -120,9 +125,70 @@ export function formatMcpConnectionTestResult(result) {
120
125
  ...(result.warnings.length > 0 ? ["", "Warnings:", ...result.warnings.map((warning) => ` - ${warning}`)] : []),
121
126
  ].join("\n");
122
127
  }
128
+ export function formatMcpDiscoveryResult(result) {
129
+ if (result.ok) {
130
+ return [
131
+ `MCP discovery completed for ${result.server}.`,
132
+ "",
133
+ `Transport: ${result.transport}`,
134
+ `Tools: ${result.toolCount}`,
135
+ ...(result.tools.length > 0 ? ["", "Discovered tools:", ...result.tools.map((tool) => ` - ${tool}`)] : []),
136
+ "",
137
+ `Call with: mcp_call(server="${result.server}", tool="<tool_name>", args={...})`,
138
+ ].join("\n");
139
+ }
140
+ return [
141
+ `MCP discovery failed for ${result.server}.`,
142
+ "",
143
+ `Transport: ${result.transport}`,
144
+ `Error: ${result.error ?? "Unknown error"}`,
145
+ ...(result.warnings.length > 0 ? ["", "Warnings:", ...result.warnings.map((warning) => ` - ${warning}`)] : []),
146
+ ].join("\n");
147
+ }
148
+ async function readLiveConnectionStatus(serverName) {
149
+ try {
150
+ const mcpClient = await import("../mcp-client/index.js");
151
+ const mod = mcpClient;
152
+ if (typeof mod.getConnectionStatus === "function") {
153
+ return mod.getConnectionStatus(serverName);
154
+ }
155
+ }
156
+ catch {
157
+ // mcp-client may not expose status helpers in some hosts.
158
+ }
159
+ return { connected: false, tools: [] };
160
+ }
161
+ function shouldProbeConfiguredServer(config) {
162
+ return !config.disabled && config.transport === "stdio" && (config.envWarnings?.length ?? 0) === 0;
163
+ }
164
+ async function resolveMcpRuntimeStatus(config, systemPrompt) {
165
+ const live = await readLiveConnectionStatus(config.name);
166
+ let connected = live.connected;
167
+ let tools = live.tools;
168
+ let error = live.error;
169
+ if (!connected && !error && hasHostMcpTool(systemPrompt, config.name))
170
+ connected = true;
171
+ if (!connected && !error && shouldProbeConfiguredServer(config)) {
172
+ const probed = await testMcpServerConnection(config.name, { timeoutMs: MCP_STATUS_PROBE_TIMEOUT_MS });
173
+ if (probed.ok) {
174
+ return {
175
+ connected: false,
176
+ available: true,
177
+ tools: probed.tools,
178
+ };
179
+ }
180
+ error = probed.error;
181
+ }
182
+ return {
183
+ connected,
184
+ available: false,
185
+ tools,
186
+ error,
187
+ };
188
+ }
123
189
  // ─── Command handler ────────────────────────────────────────────────────────
124
190
  /**
125
- * Handle `/gsd mcp [status|check <server>]`.
191
+ * Handle `/gsd mcp [status|check <server>|discover [server]|...]`.
126
192
  */
127
193
  export async function handleMcpStatus(args, ctx) {
128
194
  const trimmed = args.trim();
@@ -146,6 +212,24 @@ export async function handleMcpStatus(args, ctx) {
146
212
  }
147
213
  return;
148
214
  }
215
+ // /gsd mcp discover [server]
216
+ if (lowered === "discover" || lowered.startsWith("discover ")) {
217
+ const requestedServerName = trimmed.slice("discover".length).trim();
218
+ let serverName = requestedServerName;
219
+ if (!serverName) {
220
+ if (configs.length === 1) {
221
+ serverName = configs[0].name;
222
+ }
223
+ else {
224
+ const available = configs.map((config) => config.name).join(", ") || "(none)";
225
+ ctx.ui.notify(`Usage: /gsd mcp discover <server>\n\nAvailable: ${available}`, "warning");
226
+ return;
227
+ }
228
+ }
229
+ const result = await testMcpServerConnection(serverName);
230
+ ctx.ui.notify(formatMcpDiscoveryResult(result), result.ok ? "info" : "warning");
231
+ return;
232
+ }
149
233
  // /gsd mcp test <server>
150
234
  if (lowered.startsWith("test ")) {
151
235
  const serverName = trimmed.slice("test ".length).trim();
@@ -245,33 +329,15 @@ export async function handleMcpStatus(args, ctx) {
245
329
  ctx.ui.notify(`Unknown MCP server: "${serverName}"\n\nAvailable: ${available}`, "warning");
246
330
  return;
247
331
  }
248
- // Try to get connection/tool info from the mcp-client module if available
249
- let connected = false;
250
- let toolNames = [];
251
- let error;
252
- try {
253
- const mcpClient = await import("../mcp-client/index.js");
254
- // Access the module's connection state if exported; fall back gracefully
255
- const mod = mcpClient;
256
- if (typeof mod.getConnectionStatus === "function") {
257
- const status = mod.getConnectionStatus(serverName);
258
- connected = status.connected;
259
- toolNames = status.tools;
260
- error = status.error;
261
- }
262
- }
263
- catch {
264
- // mcp-client may not expose status helpers — that's fine
265
- }
266
- if (!connected && !error && hasHostMcpTool(systemPrompt, serverName))
267
- connected = true;
332
+ const runtime = await resolveMcpRuntimeStatus(config, systemPrompt);
268
333
  ctx.ui.notify(formatMcpServerDetail({
269
334
  name: config.name,
270
335
  transport: config.transport,
271
- connected,
272
- toolCount: toolNames.length,
273
- tools: toolNames,
274
- error,
336
+ connected: runtime.connected,
337
+ available: runtime.available,
338
+ toolCount: runtime.tools.length,
339
+ tools: runtime.tools,
340
+ error: runtime.error,
275
341
  disabled: config.disabled,
276
342
  sourcePath: config.sourcePath,
277
343
  envWarnings: config.envWarnings,
@@ -280,38 +346,20 @@ export async function handleMcpStatus(args, ctx) {
280
346
  }
281
347
  // /gsd mcp or /gsd mcp status
282
348
  if (!lowered || lowered === "status") {
283
- // Build status for each server
284
- const statuses = [];
285
- for (const config of configs) {
286
- let connected = false;
287
- let toolCount = 0;
288
- let error;
289
- try {
290
- const mcpClient = await import("../mcp-client/index.js");
291
- const mod = mcpClient;
292
- if (typeof mod.getConnectionStatus === "function") {
293
- const status = mod.getConnectionStatus(config.name);
294
- connected = status.connected;
295
- toolCount = status.tools.length;
296
- error = status.error;
297
- }
298
- }
299
- catch {
300
- // Fall back to unknown state
301
- }
302
- if (!connected && !error && hasHostMcpTool(systemPrompt, config.name))
303
- connected = true;
304
- statuses.push({
349
+ const statuses = await Promise.all(configs.map(async (config) => {
350
+ const runtime = await resolveMcpRuntimeStatus(config, systemPrompt);
351
+ return {
305
352
  name: config.name,
306
353
  transport: config.transport,
307
- connected,
308
- toolCount,
309
- error,
354
+ connected: runtime.connected,
355
+ available: runtime.available,
356
+ toolCount: runtime.tools.length,
357
+ error: runtime.error,
310
358
  disabled: config.disabled,
311
359
  sourcePath: config.sourcePath,
312
360
  envWarnings: config.envWarnings,
313
- });
314
- }
361
+ };
362
+ }));
315
363
  const warningLines = [
316
364
  ...management.warnings,
317
365
  ...management.duplicates.map((dup) => `Duplicate "${dup.name}" from ${dup.shadowedSourcePath} is shadowed by ${dup.keptSourcePath}.`),
@@ -323,9 +371,10 @@ export async function handleMcpStatus(args, ctx) {
323
371
  return;
324
372
  }
325
373
  // Unknown subcommand
326
- ctx.ui.notify("Usage: /gsd mcp [status|check <server>|test <server>|enable <server>|disable <server>|delete <server> --confirm|import <server> [as <name>]|init [dir]]\n\n" +
374
+ ctx.ui.notify("Usage: /gsd mcp [status|check <server>|discover [server]|test <server>|enable <server>|disable <server>|delete <server> --confirm|import <server> [as <name>]|init [dir]]\n\n" +
327
375
  " status Show all MCP server statuses (default)\n" +
328
376
  " check <server> Detailed status for a specific server\n" +
377
+ " discover [server] Connect and list tools for a server\n" +
329
378
  " test <server> Verify MCP handshake and tools/list\n" +
330
379
  " enable <server> Enable a local GSD-managed server\n" +
331
380
  " disable <server> Disable a local GSD-managed server\n" +
@@ -11,6 +11,8 @@ import { fileURLToPath } from "node:url";
11
11
  import { getGlobalGSDPreferencesPath, getLegacyGlobalGSDPreferencesPath, getProjectGSDPreferencesPath, loadGlobalGSDPreferences, loadProjectGSDPreferences, loadEffectiveGSDPreferences, normalizePreferencesShape, resolveAllSkillReferences, } from "./preferences.js";
12
12
  import { loadFile, saveFile, splitFrontmatter, parseFrontmatterMap } from "./files.js";
13
13
  import { runClaudeImportFlow } from "./claude-import.js";
14
+ const DEFAULT_WIDGET_MODE = "small";
15
+ const WIDGET_MODE_OPTIONS = [DEFAULT_WIDGET_MODE, "full", "min", "off"];
14
16
  /** Extract body content after frontmatter closing delimiter, or null if none. */
15
17
  function extractBodyAfterFrontmatter(content) {
16
18
  const closingIdx = content.indexOf("\n---", content.indexOf("---"));
@@ -1509,7 +1511,7 @@ async function configureAdvanced(ctx, prefs) {
1509
1511
  else if (minRequestInterval !== undefined) {
1510
1512
  prefs.min_request_interval_ms = minRequestInterval;
1511
1513
  }
1512
- const widget = await promptEnum(ctx, "Auto-mode widget display", prefs.widget_mode, ["full", "small", "min", "off"], "full");
1514
+ const widget = await promptEnum(ctx, "Auto-mode widget display", prefs.widget_mode, WIDGET_MODE_OPTIONS, DEFAULT_WIDGET_MODE);
1513
1515
  if (widget !== undefined)
1514
1516
  prefs.widget_mode = widget;
1515
1517
  const experimental = prefs.experimental ?? {};
@@ -166,6 +166,6 @@ export async function handleVerdict(rawArgs, ctx, basePath) {
166
166
  ctx.ui.notify(`Milestone ${milestoneId} verdict: ${prevVerdict} -> ${effectiveVerdict} (${existingValidation.source})`, "success");
167
167
  }
168
168
  if (effectiveVerdict === "needs-remediation") {
169
- ctx.ui.notify("Follow up with gsd_reassess_roadmap to add remediation slices, then re-run /gsd auto.", "info");
169
+ ctx.ui.notify("Follow up with /gsd dispatch reassess to add remediation slices, then re-run /gsd auto.", "info");
170
170
  }
171
171
  }
@@ -9,6 +9,7 @@
9
9
  import { matchesKey, Key, truncateToWidth } from "@gsd/pi-tui";
10
10
  import { renderDialogFrame, renderKeyHints } from "./tui/render-kit.js";
11
11
  import { loadEffectiveGSDPreferences, loadGlobalGSDPreferences, loadProjectGSDPreferences, getGlobalGSDPreferencesPath, getProjectGSDPreferencesPath, resolveDynamicRoutingConfig, resolveEffectiveProfile, resolveModelWithFallbacksForUnit, resolveAutoSupervisorConfig, } from "./preferences.js";
12
+ const DEFAULT_WIDGET_MODE = "small";
12
13
  function collectConfigSections() {
13
14
  const sections = [];
14
15
  const globalPrefs = loadGlobalGSDPreferences();
@@ -157,7 +158,7 @@ function collectConfigSections() {
157
158
  toggleRows.push({ label: "search_provider", value: prefs.search_provider });
158
159
  if (prefs?.context_selection)
159
160
  toggleRows.push({ label: "context_selection", value: prefs.context_selection });
160
- if (prefs?.widget_mode && prefs.widget_mode !== "full")
161
+ if (prefs?.widget_mode && prefs.widget_mode !== DEFAULT_WIDGET_MODE)
161
162
  toggleRows.push({ label: "widget_mode", value: prefs.widget_mode });
162
163
  if (prefs?.experimental?.rtk)
163
164
  toggleRows.push({ label: "experimental.rtk", value: "on" });