gsd-pi 2.67.0-dev.1cd1e0f → 2.67.0-dev.2142d3e

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 (74) hide show
  1. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +3 -0
  2. package/dist/resources/extensions/gsd/auto/phases.js +17 -0
  3. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +12 -0
  4. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -435
  5. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -4
  6. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +7 -64
  7. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -8
  8. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -24
  9. package/dist/resources/extensions/gsd/commands/index.js +8 -1
  10. package/dist/resources/extensions/gsd/guided-flow.js +16 -0
  11. package/dist/resources/extensions/gsd/init-wizard.js +34 -0
  12. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +508 -0
  13. package/dist/resources/extensions/gsd/workflow-logger.js +18 -3
  14. package/dist/resources/extensions/gsd/workflow-mcp.js +190 -0
  15. package/dist/web/standalone/.next/BUILD_ID +1 -1
  16. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  17. package/dist/web/standalone/.next/build-manifest.json +2 -2
  18. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  19. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  20. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  22. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  25. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  26. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  28. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  33. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  34. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  35. package/dist/web/standalone/.next/server/app/index.html +1 -1
  36. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  37. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  38. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  39. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  40. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  41. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  42. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  43. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  44. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  45. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  46. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  47. package/package.json +1 -1
  48. package/packages/mcp-server/README.md +38 -0
  49. package/packages/mcp-server/src/server.ts +6 -2
  50. package/packages/mcp-server/src/workflow-tools.test.ts +976 -0
  51. package/packages/mcp-server/src/workflow-tools.ts +986 -0
  52. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +3 -0
  53. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +121 -0
  54. package/src/resources/extensions/gsd/auto/phases.ts +25 -0
  55. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +20 -0
  56. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +22 -435
  57. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -5
  58. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +7 -72
  59. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +122 -6
  60. package/src/resources/extensions/gsd/commands/handlers/core.ts +52 -25
  61. package/src/resources/extensions/gsd/commands/index.ts +7 -1
  62. package/src/resources/extensions/gsd/guided-flow.ts +24 -0
  63. package/src/resources/extensions/gsd/init-wizard.ts +34 -0
  64. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +101 -0
  65. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +66 -0
  66. package/src/resources/extensions/gsd/tests/init-bootstrap-completeness.test.ts +121 -0
  67. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +16 -0
  68. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +301 -0
  69. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +625 -0
  70. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +629 -0
  71. package/src/resources/extensions/gsd/workflow-logger.ts +19 -3
  72. package/src/resources/extensions/gsd/workflow-mcp.ts +233 -0
  73. /package/dist/web/standalone/.next/static/{PHqEommYRR8CRn3i84CGM → xR6qurkuYSvyjBjRyJLxG}/_buildManifest.js +0 -0
  74. /package/dist/web/standalone/.next/static/{PHqEommYRR8CRn3i84CGM → xR6qurkuYSvyjBjRyJLxG}/_ssgManifest.js +0 -0
@@ -18,6 +18,7 @@ import type {
18
18
  import { EventStream } from "@gsd/pi-ai";
19
19
  import { execSync } from "node:child_process";
20
20
  import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
21
+ import { buildWorkflowMcpServers } from "../gsd/workflow-mcp.js";
21
22
  import type {
22
23
  SDKAssistantMessage,
23
24
  SDKMessage,
@@ -246,6 +247,7 @@ export function buildFinalClaudeCodeContent(
246
247
  * beta flags, and other configuration without mocking the full SDK.
247
248
  */
248
249
  export function buildSdkOptions(modelId: string, prompt: string): Record<string, unknown> {
250
+ const mcpServers = buildWorkflowMcpServers();
249
251
  return {
250
252
  pathToClaudeCodeExecutable: getClaudePath(),
251
253
  model: modelId,
@@ -256,6 +258,7 @@ export function buildSdkOptions(modelId: string, prompt: string): Record<string,
256
258
  allowDangerouslySkipPermissions: true,
257
259
  settingSources: ["project"],
258
260
  systemPrompt: { type: "preset", preset: "claude_code" },
261
+ ...(mcpServers ? { mcpServers } : {}),
259
262
  betas: modelId.includes("sonnet") ? ["context-1m-2025-08-07"] : [],
260
263
  };
261
264
  }
@@ -1,5 +1,8 @@
1
1
  import { describe, test } from "node:test";
2
2
  import assert from "node:assert/strict";
3
+ import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
4
+ import { join, resolve } from "node:path";
5
+ import { tmpdir } from "node:os";
3
6
  import {
4
7
  buildPromptFromContext,
5
8
  buildFinalClaudeCodeContent,
@@ -129,6 +132,124 @@ describe("stream-adapter — session persistence (#2859)", () => {
129
132
  "non-sonnet models should have empty betas",
130
133
  );
131
134
  });
135
+
136
+ test("buildSdkOptions includes workflow MCP server config when env is set", () => {
137
+ const prev = {
138
+ GSD_WORKFLOW_MCP_COMMAND: process.env.GSD_WORKFLOW_MCP_COMMAND,
139
+ GSD_WORKFLOW_MCP_NAME: process.env.GSD_WORKFLOW_MCP_NAME,
140
+ GSD_WORKFLOW_MCP_ARGS: process.env.GSD_WORKFLOW_MCP_ARGS,
141
+ GSD_WORKFLOW_MCP_ENV: process.env.GSD_WORKFLOW_MCP_ENV,
142
+ GSD_WORKFLOW_MCP_CWD: process.env.GSD_WORKFLOW_MCP_CWD,
143
+ };
144
+ try {
145
+ process.env.GSD_WORKFLOW_MCP_COMMAND = "node";
146
+ process.env.GSD_WORKFLOW_MCP_NAME = "gsd-workflow";
147
+ process.env.GSD_WORKFLOW_MCP_ARGS = JSON.stringify(["packages/mcp-server/dist/cli.js"]);
148
+ process.env.GSD_WORKFLOW_MCP_ENV = JSON.stringify({ GSD_CLI_PATH: "/tmp/gsd" });
149
+ process.env.GSD_WORKFLOW_MCP_CWD = "/tmp/project";
150
+
151
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "test");
152
+ assert.deepEqual(options.mcpServers, {
153
+ "gsd-workflow": {
154
+ command: "node",
155
+ args: ["packages/mcp-server/dist/cli.js"],
156
+ env: {
157
+ GSD_CLI_PATH: "/tmp/gsd",
158
+ GSD_PERSIST_WRITE_GATE_STATE: "1",
159
+ GSD_WORKFLOW_PROJECT_ROOT: "/tmp/project",
160
+ },
161
+ cwd: "/tmp/project",
162
+ },
163
+ });
164
+ } finally {
165
+ process.env.GSD_WORKFLOW_MCP_COMMAND = prev.GSD_WORKFLOW_MCP_COMMAND;
166
+ process.env.GSD_WORKFLOW_MCP_NAME = prev.GSD_WORKFLOW_MCP_NAME;
167
+ process.env.GSD_WORKFLOW_MCP_ARGS = prev.GSD_WORKFLOW_MCP_ARGS;
168
+ process.env.GSD_WORKFLOW_MCP_ENV = prev.GSD_WORKFLOW_MCP_ENV;
169
+ process.env.GSD_WORKFLOW_MCP_CWD = prev.GSD_WORKFLOW_MCP_CWD;
170
+ }
171
+ });
172
+
173
+ test("buildSdkOptions omits workflow MCP server config when env is unset", () => {
174
+ const prev = {
175
+ GSD_WORKFLOW_MCP_COMMAND: process.env.GSD_WORKFLOW_MCP_COMMAND,
176
+ GSD_WORKFLOW_MCP_NAME: process.env.GSD_WORKFLOW_MCP_NAME,
177
+ GSD_WORKFLOW_MCP_ARGS: process.env.GSD_WORKFLOW_MCP_ARGS,
178
+ GSD_WORKFLOW_MCP_ENV: process.env.GSD_WORKFLOW_MCP_ENV,
179
+ GSD_WORKFLOW_MCP_CWD: process.env.GSD_WORKFLOW_MCP_CWD,
180
+ };
181
+ try {
182
+ delete process.env.GSD_WORKFLOW_MCP_COMMAND;
183
+ delete process.env.GSD_WORKFLOW_MCP_NAME;
184
+ delete process.env.GSD_WORKFLOW_MCP_ARGS;
185
+ delete process.env.GSD_WORKFLOW_MCP_ENV;
186
+ delete process.env.GSD_WORKFLOW_MCP_CWD;
187
+
188
+ const originalCwd = process.cwd();
189
+ const emptyDir = mkdtempSync(join(tmpdir(), "claude-mcp-none-"));
190
+ process.chdir(emptyDir);
191
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "test");
192
+ process.chdir(originalCwd);
193
+ assert.equal((options as any).mcpServers, undefined);
194
+ rmSync(emptyDir, { recursive: true, force: true });
195
+ } finally {
196
+ process.env.GSD_WORKFLOW_MCP_COMMAND = prev.GSD_WORKFLOW_MCP_COMMAND;
197
+ process.env.GSD_WORKFLOW_MCP_NAME = prev.GSD_WORKFLOW_MCP_NAME;
198
+ process.env.GSD_WORKFLOW_MCP_ARGS = prev.GSD_WORKFLOW_MCP_ARGS;
199
+ process.env.GSD_WORKFLOW_MCP_ENV = prev.GSD_WORKFLOW_MCP_ENV;
200
+ process.env.GSD_WORKFLOW_MCP_CWD = prev.GSD_WORKFLOW_MCP_CWD;
201
+ }
202
+ });
203
+
204
+ test("buildSdkOptions auto-detects local workflow MCP dist CLI when present", () => {
205
+ const prev = {
206
+ GSD_WORKFLOW_MCP_COMMAND: process.env.GSD_WORKFLOW_MCP_COMMAND,
207
+ GSD_WORKFLOW_MCP_NAME: process.env.GSD_WORKFLOW_MCP_NAME,
208
+ GSD_WORKFLOW_MCP_ARGS: process.env.GSD_WORKFLOW_MCP_ARGS,
209
+ GSD_WORKFLOW_MCP_ENV: process.env.GSD_WORKFLOW_MCP_ENV,
210
+ GSD_WORKFLOW_MCP_CWD: process.env.GSD_WORKFLOW_MCP_CWD,
211
+ GSD_CLI_PATH: process.env.GSD_CLI_PATH,
212
+ };
213
+ const originalCwd = process.cwd();
214
+ const repoDir = mkdtempSync(join(tmpdir(), "claude-mcp-detect-"));
215
+ try {
216
+ delete process.env.GSD_WORKFLOW_MCP_COMMAND;
217
+ delete process.env.GSD_WORKFLOW_MCP_NAME;
218
+ delete process.env.GSD_WORKFLOW_MCP_ARGS;
219
+ delete process.env.GSD_WORKFLOW_MCP_ENV;
220
+ delete process.env.GSD_WORKFLOW_MCP_CWD;
221
+ process.env.GSD_CLI_PATH = "/tmp/gsd";
222
+
223
+ const distDir = join(repoDir, "packages", "mcp-server", "dist");
224
+ mkdirSync(distDir, { recursive: true });
225
+ writeFileSync(join(distDir, "cli.js"), "#!/usr/bin/env node\n");
226
+ process.chdir(repoDir);
227
+ const resolvedRepoDir = realpathSync(repoDir);
228
+
229
+ const options = buildSdkOptions("claude-sonnet-4-20250514", "test");
230
+ assert.deepEqual(options.mcpServers, {
231
+ "gsd-workflow": {
232
+ command: process.execPath,
233
+ args: [realpathSync(resolve(repoDir, "packages", "mcp-server", "dist", "cli.js"))],
234
+ env: {
235
+ GSD_CLI_PATH: "/tmp/gsd",
236
+ GSD_PERSIST_WRITE_GATE_STATE: "1",
237
+ GSD_WORKFLOW_PROJECT_ROOT: resolvedRepoDir,
238
+ },
239
+ cwd: resolvedRepoDir,
240
+ },
241
+ });
242
+ } finally {
243
+ process.chdir(originalCwd);
244
+ rmSync(repoDir, { recursive: true, force: true });
245
+ process.env.GSD_WORKFLOW_MCP_COMMAND = prev.GSD_WORKFLOW_MCP_COMMAND;
246
+ process.env.GSD_WORKFLOW_MCP_NAME = prev.GSD_WORKFLOW_MCP_NAME;
247
+ process.env.GSD_WORKFLOW_MCP_ARGS = prev.GSD_WORKFLOW_MCP_ARGS;
248
+ process.env.GSD_WORKFLOW_MCP_ENV = prev.GSD_WORKFLOW_MCP_ENV;
249
+ process.env.GSD_WORKFLOW_MCP_CWD = prev.GSD_WORKFLOW_MCP_CWD;
250
+ process.env.GSD_CLI_PATH = prev.GSD_CLI_PATH;
251
+ }
252
+ });
132
253
  });
133
254
 
134
255
  describe("stream-adapter — final content filtering (#3861)", () => {
@@ -41,6 +41,10 @@ import { isDbAvailable, getMilestoneSlices } from "../gsd-db.js";
41
41
  import { resetEvidence } from "../safety/evidence-collector.js";
42
42
  import { createCheckpoint, cleanupCheckpoint, rollbackToCheckpoint } from "../safety/git-checkpoint.js";
43
43
  import { resolveSafetyHarnessConfig } from "../safety/safety-harness.js";
44
+ import {
45
+ getWorkflowTransportSupportError,
46
+ getRequiredWorkflowToolsForAutoUnit,
47
+ } from "../workflow-mcp.js";
44
48
 
45
49
  // ─── generateMilestoneReport ──────────────────────────────────────────────────
46
50
 
@@ -1216,6 +1220,27 @@ export async function runUnitPhase(
1216
1220
  ? `${(s.currentUnitModel as any).provider ?? ""}/${(s.currentUnitModel as any).id ?? ""}`
1217
1221
  : null;
1218
1222
 
1223
+ const compatibilityError = getWorkflowTransportSupportError(
1224
+ s.currentUnitModel?.provider ?? ctx.model?.provider,
1225
+ getRequiredWorkflowToolsForAutoUnit(unitType),
1226
+ {
1227
+ projectRoot: s.basePath,
1228
+ surface: "auto-mode",
1229
+ unitType,
1230
+ authMode: s.currentUnitModel?.provider
1231
+ ? ctx.modelRegistry.getProviderAuthMode(s.currentUnitModel.provider)
1232
+ : ctx.model?.provider
1233
+ ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
1234
+ : undefined,
1235
+ baseUrl: (s.currentUnitModel as any)?.baseUrl ?? ctx.model?.baseUrl,
1236
+ },
1237
+ );
1238
+ if (compatibilityError) {
1239
+ ctx.ui.notify(compatibilityError, "error");
1240
+ await deps.stopAuto(ctx, pi, compatibilityError);
1241
+ return { action: "break", reason: "workflow-capability" };
1242
+ }
1243
+
1219
1244
  // Progress widget + preconditions — deferred to after model selection so the
1220
1245
  // widget's first render tick shows the correct model (#2899).
1221
1246
  deps.updateProgressWidget(ctx, unitType, unitId, state);
@@ -29,6 +29,10 @@ import {
29
29
  } from "./auto-prompts.js";
30
30
  import { loadEffectiveGSDPreferences } from "./preferences.js";
31
31
  import { pauseAuto } from "./auto.js";
32
+ import {
33
+ getWorkflowTransportSupportError,
34
+ getRequiredWorkflowToolsForAutoUnit,
35
+ } from "./workflow-mcp.js";
32
36
 
33
37
  export async function dispatchDirectPhase(
34
38
  ctx: ExtensionCommandContext,
@@ -243,6 +247,22 @@ export async function dispatchDirectPhase(
243
247
  return;
244
248
  }
245
249
 
250
+ const compatibilityError = getWorkflowTransportSupportError(
251
+ ctx.model?.provider,
252
+ getRequiredWorkflowToolsForAutoUnit(unitType),
253
+ {
254
+ projectRoot: base,
255
+ surface: "direct phase dispatch",
256
+ unitType,
257
+ authMode: ctx.model?.provider ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider) : undefined,
258
+ baseUrl: ctx.model?.baseUrl,
259
+ },
260
+ );
261
+ if (compatibilityError) {
262
+ ctx.ui.notify(compatibilityError, "error");
263
+ return;
264
+ }
265
+
246
266
  ctx.ui.notify(`Dispatching ${unitType} for ${unitId}...`, "info");
247
267
  const result = await ctx.newSession();
248
268
  if (result.cancelled) {