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
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
|
|
5
|
+
export interface WorkflowMcpLaunchConfig {
|
|
6
|
+
name: string;
|
|
7
|
+
command: string;
|
|
8
|
+
args?: string[];
|
|
9
|
+
cwd?: string;
|
|
10
|
+
env?: Record<string, string>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface WorkflowCapabilityOptions {
|
|
14
|
+
projectRoot?: string;
|
|
15
|
+
env?: NodeJS.ProcessEnv;
|
|
16
|
+
surface?: string;
|
|
17
|
+
unitType?: string;
|
|
18
|
+
authMode?: "apiKey" | "oauth" | "externalCli" | "none";
|
|
19
|
+
baseUrl?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const MCP_WORKFLOW_TOOL_SURFACE = new Set([
|
|
23
|
+
"gsd_complete_milestone",
|
|
24
|
+
"gsd_complete_task",
|
|
25
|
+
"gsd_complete_slice",
|
|
26
|
+
"gsd_milestone_complete",
|
|
27
|
+
"gsd_milestone_status",
|
|
28
|
+
"gsd_milestone_validate",
|
|
29
|
+
"gsd_plan_milestone",
|
|
30
|
+
"gsd_plan_slice",
|
|
31
|
+
"gsd_replan_slice",
|
|
32
|
+
"gsd_reassess_roadmap",
|
|
33
|
+
"gsd_roadmap_reassess",
|
|
34
|
+
"gsd_save_gate_result",
|
|
35
|
+
"gsd_slice_replan",
|
|
36
|
+
"gsd_slice_complete",
|
|
37
|
+
"gsd_summary_save",
|
|
38
|
+
"gsd_task_complete",
|
|
39
|
+
"gsd_validate_milestone",
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
function parseLookupOutput(output: Buffer | string): string {
|
|
43
|
+
return output
|
|
44
|
+
.toString()
|
|
45
|
+
.trim()
|
|
46
|
+
.split(/\r?\n/)[0] ?? "";
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function parseJsonEnv<T>(env: NodeJS.ProcessEnv, name: string): T | undefined {
|
|
50
|
+
const raw = env[name];
|
|
51
|
+
if (!raw) return undefined;
|
|
52
|
+
try {
|
|
53
|
+
return JSON.parse(raw) as T;
|
|
54
|
+
} catch {
|
|
55
|
+
throw new Error(`Invalid JSON in ${name}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function lookupCommand(command: string, platform: NodeJS.Platform = process.platform): string | null {
|
|
60
|
+
const lookup = platform === "win32" ? `where ${command}` : `which ${command}`;
|
|
61
|
+
try {
|
|
62
|
+
const resolved = parseLookupOutput(execSync(lookup, { timeout: 5_000, stdio: "pipe" }));
|
|
63
|
+
return resolved || null;
|
|
64
|
+
} catch {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function detectWorkflowMcpLaunchConfig(
|
|
70
|
+
projectRoot = process.cwd(),
|
|
71
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
72
|
+
): WorkflowMcpLaunchConfig | null {
|
|
73
|
+
const name = env.GSD_WORKFLOW_MCP_NAME?.trim() || "gsd-workflow";
|
|
74
|
+
const explicitCommand = env.GSD_WORKFLOW_MCP_COMMAND?.trim();
|
|
75
|
+
const explicitArgs = parseJsonEnv<unknown>(env, "GSD_WORKFLOW_MCP_ARGS");
|
|
76
|
+
const explicitEnv = parseJsonEnv<Record<string, string>>(env, "GSD_WORKFLOW_MCP_ENV");
|
|
77
|
+
const explicitCwd = env.GSD_WORKFLOW_MCP_CWD?.trim();
|
|
78
|
+
const workflowProjectRoot =
|
|
79
|
+
explicitEnv?.GSD_WORKFLOW_PROJECT_ROOT?.trim() ||
|
|
80
|
+
env.GSD_WORKFLOW_PROJECT_ROOT?.trim() ||
|
|
81
|
+
explicitCwd ||
|
|
82
|
+
projectRoot;
|
|
83
|
+
|
|
84
|
+
if (explicitCommand) {
|
|
85
|
+
const launchEnv = {
|
|
86
|
+
...(explicitEnv ?? {}),
|
|
87
|
+
...(env.GSD_CLI_PATH ? { GSD_CLI_PATH: env.GSD_CLI_PATH } : {}),
|
|
88
|
+
GSD_PERSIST_WRITE_GATE_STATE: "1",
|
|
89
|
+
GSD_WORKFLOW_PROJECT_ROOT: resolve(workflowProjectRoot),
|
|
90
|
+
};
|
|
91
|
+
return {
|
|
92
|
+
name,
|
|
93
|
+
command: explicitCommand,
|
|
94
|
+
args: Array.isArray(explicitArgs) && explicitArgs.length > 0 ? explicitArgs.map(String) : undefined,
|
|
95
|
+
cwd: explicitCwd || undefined,
|
|
96
|
+
env: Object.keys(launchEnv).length > 0 ? launchEnv : undefined,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const distCli = resolve(projectRoot, "packages", "mcp-server", "dist", "cli.js");
|
|
101
|
+
if (existsSync(distCli)) {
|
|
102
|
+
return {
|
|
103
|
+
name,
|
|
104
|
+
command: process.execPath,
|
|
105
|
+
args: [distCli],
|
|
106
|
+
cwd: projectRoot,
|
|
107
|
+
env: {
|
|
108
|
+
...(env.GSD_CLI_PATH ? { GSD_CLI_PATH: env.GSD_CLI_PATH } : {}),
|
|
109
|
+
GSD_PERSIST_WRITE_GATE_STATE: "1",
|
|
110
|
+
GSD_WORKFLOW_PROJECT_ROOT: resolve(projectRoot),
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const binPath = lookupCommand("gsd-mcp-server");
|
|
116
|
+
if (binPath) {
|
|
117
|
+
return {
|
|
118
|
+
name,
|
|
119
|
+
command: binPath,
|
|
120
|
+
env: {
|
|
121
|
+
...(env.GSD_CLI_PATH ? { GSD_CLI_PATH: env.GSD_CLI_PATH } : {}),
|
|
122
|
+
GSD_PERSIST_WRITE_GATE_STATE: "1",
|
|
123
|
+
GSD_WORKFLOW_PROJECT_ROOT: resolve(projectRoot),
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export function buildWorkflowMcpServers(
|
|
132
|
+
projectRoot = process.cwd(),
|
|
133
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
134
|
+
): Record<string, Record<string, unknown>> | undefined {
|
|
135
|
+
const launch = detectWorkflowMcpLaunchConfig(projectRoot, env);
|
|
136
|
+
if (!launch) return undefined;
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
[launch.name]: {
|
|
140
|
+
command: launch.command,
|
|
141
|
+
...(launch.args && launch.args.length > 0 ? { args: launch.args } : {}),
|
|
142
|
+
...(launch.env ? { env: launch.env } : {}),
|
|
143
|
+
...(launch.cwd ? { cwd: launch.cwd } : {}),
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export function getRequiredWorkflowToolsForGuidedUnit(unitType: string): string[] {
|
|
149
|
+
switch (unitType) {
|
|
150
|
+
case "discuss-milestone":
|
|
151
|
+
return ["gsd_summary_save", "gsd_plan_milestone"];
|
|
152
|
+
case "discuss-slice":
|
|
153
|
+
return ["gsd_summary_save"];
|
|
154
|
+
case "research-milestone":
|
|
155
|
+
case "research-slice":
|
|
156
|
+
return ["gsd_summary_save"];
|
|
157
|
+
case "plan-milestone":
|
|
158
|
+
return ["gsd_plan_milestone"];
|
|
159
|
+
case "plan-slice":
|
|
160
|
+
return ["gsd_plan_slice"];
|
|
161
|
+
case "execute-task":
|
|
162
|
+
return ["gsd_task_complete"];
|
|
163
|
+
case "complete-slice":
|
|
164
|
+
return ["gsd_slice_complete"];
|
|
165
|
+
default:
|
|
166
|
+
return [];
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function getRequiredWorkflowToolsForAutoUnit(unitType: string): string[] {
|
|
171
|
+
switch (unitType) {
|
|
172
|
+
case "discuss-milestone":
|
|
173
|
+
return ["gsd_summary_save", "gsd_plan_milestone"];
|
|
174
|
+
case "research-milestone":
|
|
175
|
+
case "research-slice":
|
|
176
|
+
case "run-uat":
|
|
177
|
+
return ["gsd_summary_save"];
|
|
178
|
+
case "plan-milestone":
|
|
179
|
+
return ["gsd_plan_milestone"];
|
|
180
|
+
case "plan-slice":
|
|
181
|
+
return ["gsd_plan_slice"];
|
|
182
|
+
case "execute-task":
|
|
183
|
+
case "execute-task-simple":
|
|
184
|
+
case "reactive-execute":
|
|
185
|
+
return ["gsd_complete_task"];
|
|
186
|
+
case "complete-slice":
|
|
187
|
+
return ["gsd_complete_slice"];
|
|
188
|
+
case "replan-slice":
|
|
189
|
+
return ["gsd_replan_slice"];
|
|
190
|
+
case "reassess-roadmap":
|
|
191
|
+
return ["gsd_milestone_status", "gsd_reassess_roadmap"];
|
|
192
|
+
case "gate-evaluate":
|
|
193
|
+
return ["gsd_save_gate_result"];
|
|
194
|
+
case "validate-milestone":
|
|
195
|
+
return ["gsd_milestone_status", "gsd_validate_milestone"];
|
|
196
|
+
case "complete-milestone":
|
|
197
|
+
return ["gsd_milestone_status", "gsd_complete_milestone"];
|
|
198
|
+
default:
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export function usesWorkflowMcpTransport(
|
|
204
|
+
authMode: WorkflowCapabilityOptions["authMode"],
|
|
205
|
+
baseUrl: string | undefined,
|
|
206
|
+
): boolean {
|
|
207
|
+
return authMode === "externalCli" && typeof baseUrl === "string" && baseUrl.startsWith("local://");
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export function getWorkflowTransportSupportError(
|
|
211
|
+
provider: string | undefined,
|
|
212
|
+
requiredTools: string[],
|
|
213
|
+
options: WorkflowCapabilityOptions = {},
|
|
214
|
+
): string | null {
|
|
215
|
+
if (!provider || requiredTools.length === 0) return null;
|
|
216
|
+
if (!usesWorkflowMcpTransport(options.authMode, options.baseUrl)) return null;
|
|
217
|
+
|
|
218
|
+
const projectRoot = options.projectRoot ?? process.cwd();
|
|
219
|
+
const env = options.env ?? process.env;
|
|
220
|
+
const launch = detectWorkflowMcpLaunchConfig(projectRoot, env);
|
|
221
|
+
const surface = options.surface ?? "workflow dispatch";
|
|
222
|
+
const unitLabel = options.unitType ? ` for ${options.unitType}` : "";
|
|
223
|
+
const providerLabel = `"${provider}"`;
|
|
224
|
+
|
|
225
|
+
if (!launch) {
|
|
226
|
+
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.`;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const missing = [...new Set(requiredTools)].filter((tool) => !MCP_WORKFLOW_TOOL_SURFACE.has(tool));
|
|
230
|
+
if (missing.length === 0) return null;
|
|
231
|
+
|
|
232
|
+
return `Provider ${providerLabel} cannot run ${surface}${unitLabel}: this unit requires ${missing.join(", ")}, but the workflow MCP transport currently exposes only ${Array.from(MCP_WORKFLOW_TOOL_SURFACE).sort().join(", ")}.`;
|
|
233
|
+
}
|
|
File without changes
|
|
File without changes
|