gsd-pi 2.70.0 → 2.70.1-dev.bef631a

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 (233) hide show
  1. package/dist/loader.js +4 -0
  2. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +152 -2
  3. package/dist/resources/extensions/gsd/auto-model-selection.js +33 -19
  4. package/dist/resources/extensions/gsd/auto-prompts.js +7 -3
  5. package/dist/resources/extensions/gsd/auto-start.js +28 -12
  6. package/dist/resources/extensions/gsd/auto.js +12 -8
  7. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +4 -0
  8. package/dist/resources/extensions/gsd/commands-handlers.js +22 -8
  9. package/dist/resources/extensions/gsd/doctor-engine-checks.js +12 -0
  10. package/dist/resources/extensions/gsd/doctor-format.js +2 -0
  11. package/dist/resources/extensions/gsd/guided-flow.js +33 -20
  12. package/dist/resources/extensions/gsd/init-wizard.js +3 -11
  13. package/dist/resources/extensions/gsd/pre-execution-checks.js +5 -3
  14. package/dist/resources/extensions/gsd/prompts/discuss.md +31 -13
  15. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +34 -0
  16. package/dist/resources/extensions/gsd/validate-directory.js +30 -12
  17. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +56 -0
  18. package/dist/resources/extensions/gsd/workflow-mcp.js +12 -1
  19. package/dist/resources/extensions/slash-commands/audit.js +2 -1
  20. package/dist/resources/extensions/subagent/isolation.js +4 -2
  21. package/dist/update-check.d.ts +1 -0
  22. package/dist/update-check.js +30 -27
  23. package/dist/update-cmd.js +3 -11
  24. package/dist/web/standalone/.next/BUILD_ID +1 -1
  25. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  26. package/dist/web/standalone/.next/build-manifest.json +4 -4
  27. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  28. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  29. package/dist/web/standalone/.next/required-server-files.json +4 -4
  30. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  31. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  32. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  33. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  36. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  41. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  42. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  43. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  44. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  45. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  46. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  47. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  48. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  49. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  50. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  51. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  52. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  53. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  54. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  55. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  56. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  57. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  58. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  59. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  60. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  61. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  62. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  63. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  64. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  65. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  66. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  67. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  68. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  69. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  70. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  71. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  72. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  73. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  74. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  75. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  76. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  77. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  78. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  79. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  80. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  81. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  82. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  83. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  84. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  85. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  86. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  87. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  88. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  89. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  90. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  91. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  92. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  93. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  94. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  95. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  96. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  97. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  98. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  99. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  100. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  101. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  102. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  103. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  105. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  106. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  107. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  108. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  109. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  116. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  121. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  125. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  128. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  134. package/dist/web/standalone/.next/server/app/index.html +1 -1
  135. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  136. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  137. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  138. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  140. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/page.js +2 -2
  142. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  144. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  145. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  146. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/middleware.js +2 -2
  149. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  151. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  152. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  153. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  154. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +9 -0
  155. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  156. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  157. package/dist/web/standalone/.next/static/chunks/app/page-f1e30ab6bb269149.js +1 -0
  158. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  159. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  160. package/dist/web/standalone/.next/static/chunks/{webpack-6e4d7e9a4f57bed4.js → webpack-b868033a5834586d.js} +1 -1
  161. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  162. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  163. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  164. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  165. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  166. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  167. package/dist/web/standalone/server.js +1 -1
  168. package/dist/web-mode.js +4 -0
  169. package/package.json +11 -11
  170. package/packages/mcp-server/dist/workflow-tools.d.ts +2 -0
  171. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  172. package/packages/mcp-server/dist/workflow-tools.js +35 -3
  173. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  174. package/packages/mcp-server/src/import-candidates.test.ts +48 -0
  175. package/packages/mcp-server/src/workflow-tools.ts +34 -1
  176. package/packages/pi-agent-core/dist/agent.d.ts +8 -0
  177. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  178. package/packages/pi-agent-core/dist/agent.js +3 -0
  179. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  180. package/packages/pi-agent-core/src/agent.test.ts +82 -0
  181. package/packages/pi-agent-core/src/agent.ts +12 -0
  182. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +1 -0
  183. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  184. package/packages/pi-coding-agent/dist/core/lsp/config.js +38 -15
  185. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  186. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  187. package/packages/pi-coding-agent/dist/core/sdk.js +10 -0
  188. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  190. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +3 -1
  191. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  192. package/packages/pi-coding-agent/package.json +1 -1
  193. package/packages/pi-coding-agent/src/core/lsp/config.ts +43 -17
  194. package/packages/pi-coding-agent/src/core/sdk.ts +8 -0
  195. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +7 -5
  196. package/pkg/package.json +1 -1
  197. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +229 -2
  198. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +205 -0
  199. package/src/resources/extensions/gsd/auto-model-selection.ts +39 -25
  200. package/src/resources/extensions/gsd/auto-prompts.ts +7 -3
  201. package/src/resources/extensions/gsd/auto-start.ts +37 -14
  202. package/src/resources/extensions/gsd/auto.ts +12 -8
  203. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +4 -0
  204. package/src/resources/extensions/gsd/commands-handlers.ts +22 -7
  205. package/src/resources/extensions/gsd/doctor-engine-checks.ts +14 -0
  206. package/src/resources/extensions/gsd/doctor-format.ts +1 -0
  207. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  208. package/src/resources/extensions/gsd/guided-flow.ts +36 -17
  209. package/src/resources/extensions/gsd/init-wizard.ts +3 -13
  210. package/src/resources/extensions/gsd/pre-execution-checks.ts +6 -3
  211. package/src/resources/extensions/gsd/prompts/discuss.md +31 -13
  212. package/src/resources/extensions/gsd/tests/discuss-incremental-persistence.test.ts +9 -0
  213. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +43 -0
  214. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +207 -0
  215. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +48 -1
  216. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +8 -7
  217. package/src/resources/extensions/gsd/tests/validate-directory.test.ts +33 -1
  218. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +87 -1
  219. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +76 -0
  220. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +180 -1
  221. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +22 -0
  222. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +60 -25
  223. package/src/resources/extensions/gsd/validate-directory.ts +33 -11
  224. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +76 -0
  225. package/src/resources/extensions/gsd/workflow-mcp.ts +16 -1
  226. package/src/resources/extensions/slash-commands/audit.ts +2 -1
  227. package/src/resources/extensions/subagent/isolation.ts +4 -3
  228. package/dist/web/standalone/.next/static/chunks/2826.821e01b07d92e948.js +0 -9
  229. package/dist/web/standalone/.next/static/chunks/app/page-7115e62689b5fd84.js +0 -1
  230. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  231. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  232. /package/dist/web/standalone/.next/static/{Nl6lg7zP5dNgNBV1107v1 → UlX0WGGZ8aBPN0uSZ5Ki4}/_buildManifest.js +0 -0
  233. /package/dist/web/standalone/.next/static/{Nl6lg7zP5dNgNBV1107v1 → UlX0WGGZ8aBPN0uSZ5Ki4}/_ssgManifest.js +0 -0
@@ -0,0 +1,76 @@
1
+ import type { ExtensionContext } from "@gsd/pi-coding-agent";
2
+
3
+ import {
4
+ type EnsureProjectWorkflowMcpConfigResult,
5
+ ensureProjectWorkflowMcpConfig,
6
+ } from "./mcp-project-config.js";
7
+ import { usesWorkflowMcpTransport } from "./workflow-mcp.js";
8
+
9
+ interface WorkflowMcpAutoPrepContext {
10
+ model?: { provider?: string; baseUrl?: string };
11
+ modelRegistry?: {
12
+ getProviderAuthMode?: (provider: string) => string;
13
+ isProviderRequestReady?: (provider: string) => boolean;
14
+ };
15
+ ui?: Pick<ExtensionContext["ui"], "notify">;
16
+ }
17
+
18
+ function getAuthModeSafe(
19
+ ctx: WorkflowMcpAutoPrepContext,
20
+ provider: string | undefined,
21
+ ): string | undefined {
22
+ if (!provider) return undefined;
23
+ const getAuthMode = ctx.modelRegistry?.getProviderAuthMode;
24
+ if (typeof getAuthMode !== "function") return undefined;
25
+ try {
26
+ return getAuthMode(provider);
27
+ } catch {
28
+ return undefined;
29
+ }
30
+ }
31
+
32
+ function hasClaudeCodeProvider(ctx: WorkflowMcpAutoPrepContext): boolean {
33
+ return getAuthModeSafe(ctx, "claude-code") === "externalCli";
34
+ }
35
+
36
+ function isClaudeCodeProviderReady(ctx: WorkflowMcpAutoPrepContext): boolean {
37
+ const readyCheck = ctx.modelRegistry?.isProviderRequestReady;
38
+ if (typeof readyCheck !== "function") return false;
39
+ try {
40
+ return readyCheck("claude-code");
41
+ } catch {
42
+ return false;
43
+ }
44
+ }
45
+
46
+ export function shouldAutoPrepareWorkflowMcp(ctx: WorkflowMcpAutoPrepContext): boolean {
47
+ const provider = ctx.model?.provider;
48
+ const baseUrl = ctx.model?.baseUrl;
49
+ const authMode = getAuthModeSafe(ctx, provider);
50
+
51
+ if (usesWorkflowMcpTransport(authMode as any, baseUrl)) return true;
52
+ if (provider === "claude-code") return true;
53
+ if (hasClaudeCodeProvider(ctx)) return true;
54
+ return isClaudeCodeProviderReady(ctx);
55
+ }
56
+
57
+ export function prepareWorkflowMcpForProject(
58
+ ctx: WorkflowMcpAutoPrepContext,
59
+ projectRoot: string,
60
+ ): EnsureProjectWorkflowMcpConfigResult | null {
61
+ if (!shouldAutoPrepareWorkflowMcp(ctx)) return null;
62
+
63
+ try {
64
+ const result = ensureProjectWorkflowMcpConfig(projectRoot);
65
+ if (result.status !== "unchanged") {
66
+ ctx.ui?.notify?.(`Claude Code MCP prepared at ${result.configPath}`, "info");
67
+ }
68
+ return result;
69
+ } catch (err) {
70
+ ctx.ui?.notify?.(
71
+ `Claude Code MCP prep failed: ${err instanceof Error ? err.message : String(err)}. Detected Claude Code model but no workflow MCP. Please run /gsd mcp init . from your project root.`,
72
+ "warning",
73
+ );
74
+ return null;
75
+ }
76
+ }
@@ -348,6 +348,21 @@ export function usesWorkflowMcpTransport(
348
348
  return authMode === "externalCli" && typeof baseUrl === "string" && baseUrl.startsWith("local://");
349
349
  }
350
350
 
351
+ export function supportsStructuredQuestions(
352
+ activeTools: string[],
353
+ options: Pick<WorkflowCapabilityOptions, "authMode" | "baseUrl"> = {},
354
+ ): boolean {
355
+ if (!activeTools.includes("ask_user_questions")) return false;
356
+
357
+ // Workflow MCP currently exposes ask_user_questions via MCP form elicitation.
358
+ // Local external CLI transports such as Claude Code can invoke the tool, but
359
+ // do not reliably complete that elicitation round-trip yet, so guided discuss
360
+ // prompts must fall back to plain-text questioning.
361
+ if (usesWorkflowMcpTransport(options.authMode, options.baseUrl)) return false;
362
+
363
+ return true;
364
+ }
365
+
351
366
  export function getWorkflowTransportSupportError(
352
367
  provider: string | undefined,
353
368
  requiredTools: string[],
@@ -364,7 +379,7 @@ export function getWorkflowTransportSupportError(
364
379
  const providerLabel = `"${provider}"`;
365
380
 
366
381
  if (!launch) {
367
- return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: the GSD workflow MCP server is not configured or discoverable. Configure GSD_WORKFLOW_MCP_COMMAND, build packages/mcp-server/dist/cli.js, or install gsd-mcp-server on PATH.`;
382
+ return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: the GSD workflow MCP server is not configured or discoverable. Detected Claude Code model but no workflow MCP. Please run /gsd mcp init . from your project root. You can also configure GSD_WORKFLOW_MCP_COMMAND, build packages/mcp-server/dist/cli.js, or install gsd-mcp-server on PATH.`;
368
383
  }
369
384
 
370
385
  const missing = [...new Set(requiredTools)].filter((tool) => !MCP_WORKFLOW_TOOL_SURFACE.has(tool));
@@ -1,4 +1,5 @@
1
1
  import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
2
+ import { mkdirSync } from "node:fs";
2
3
 
3
4
  export default function auditCommand(pi: ExtensionAPI) {
4
5
  pi.registerCommand("audit", {
@@ -39,7 +40,7 @@ export default function auditCommand(pi: ExtensionAPI) {
39
40
 
40
41
  // ── Step 3: Ensure the output directory exists ───────────────────────
41
42
 
42
- await pi.exec("mkdir", ["-p", ".gsd/audits"]);
43
+ mkdirSync(".gsd/audits", { recursive: true });
43
44
 
44
45
  // ── Step 4: Send the audit prompt to the agent ───────────────────────
45
46
 
@@ -53,8 +53,10 @@ interface Baseline {
53
53
  // Directory helpers
54
54
  // ============================================================================
55
55
 
56
- function encodeCwd(cwd: string): string {
57
- return cwd.replace(/\//g, "--");
56
+ export function encodeCwd(cwd: string): string {
57
+ // Encode the entire cwd so Windows drive letters, separators, and UNC
58
+ // prefixes cannot leak into the isolation path.
59
+ return Buffer.from(cwd, "utf8").toString("base64url");
58
60
  }
59
61
 
60
62
  const gsdHome = process.env.GSD_HOME || path.join(os.homedir(), ".gsd");
@@ -500,4 +502,3 @@ export function readIsolationMode(): IsolationMode {
500
502
  return "none";
501
503
  }
502
504
  }
503
-