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.
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +3 -0
- package/dist/resources/extensions/gsd/auto/phases.js +17 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +12 -0
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +11 -435
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -4
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +7 -64
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -8
- package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -24
- package/dist/resources/extensions/gsd/commands/index.js +8 -1
- package/dist/resources/extensions/gsd/guided-flow.js +16 -0
- package/dist/resources/extensions/gsd/init-wizard.js +34 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +508 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +18 -3
- package/dist/resources/extensions/gsd/workflow-mcp.js +190 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/package.json +1 -1
- package/packages/mcp-server/README.md +38 -0
- package/packages/mcp-server/src/server.ts +6 -2
- package/packages/mcp-server/src/workflow-tools.test.ts +976 -0
- package/packages/mcp-server/src/workflow-tools.ts +986 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +3 -0
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +121 -0
- package/src/resources/extensions/gsd/auto/phases.ts +25 -0
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +20 -0
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +22 -435
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -5
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +7 -72
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +122 -6
- package/src/resources/extensions/gsd/commands/handlers/core.ts +52 -25
- package/src/resources/extensions/gsd/commands/index.ts +7 -1
- package/src/resources/extensions/gsd/guided-flow.ts +24 -0
- package/src/resources/extensions/gsd/init-wizard.ts +34 -0
- package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/init-bootstrap-completeness.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +301 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +625 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +629 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +19 -3
- package/src/resources/extensions/gsd/workflow-mcp.ts +233 -0
- /package/dist/web/standalone/.next/static/{PHqEommYRR8CRn3i84CGM → xR6qurkuYSvyjBjRyJLxG}/_buildManifest.js +0 -0
- /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) {
|