gsd-pi 2.69.0 → 2.70.0

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 (87) hide show
  1. package/dist/resources/extensions/gsd/bootstrap/system-context.js +6 -2
  2. package/dist/resources/extensions/gsd/commands-cmux.js +30 -1
  3. package/dist/resources/extensions/gsd/workflow-mcp.js +53 -6
  4. package/dist/web/standalone/.next/BUILD_ID +1 -1
  5. package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
  6. package/dist/web/standalone/.next/build-manifest.json +2 -2
  7. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  8. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  9. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  10. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  12. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  13. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  17. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  18. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  19. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  20. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  21. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  22. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  23. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  24. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  25. package/dist/web/standalone/.next/server/app/index.html +1 -1
  26. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  27. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  28. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  29. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  30. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  31. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  32. package/dist/web/standalone/.next/server/app-paths-manifest.json +12 -12
  33. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  34. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  35. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  36. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  37. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  38. package/package.json +1 -1
  39. package/packages/daemon/src/orchestrator.ts +9 -84
  40. package/packages/mcp-server/README.md +25 -3
  41. package/packages/mcp-server/dist/cli.d.ts +0 -1
  42. package/packages/mcp-server/dist/cli.d.ts.map +1 -1
  43. package/packages/mcp-server/dist/cli.js +4 -2
  44. package/packages/mcp-server/dist/cli.js.map +1 -1
  45. package/packages/mcp-server/dist/server.d.ts +32 -1
  46. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  47. package/packages/mcp-server/dist/server.js +118 -1
  48. package/packages/mcp-server/dist/server.js.map +1 -1
  49. package/packages/mcp-server/dist/tool-credentials.d.ts +6 -0
  50. package/packages/mcp-server/dist/tool-credentials.d.ts.map +1 -0
  51. package/packages/mcp-server/dist/tool-credentials.js +90 -0
  52. package/packages/mcp-server/dist/tool-credentials.js.map +1 -0
  53. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -0
  54. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  55. package/packages/mcp-server/dist/workflow-tools.js +274 -2
  56. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  57. package/packages/mcp-server/src/cli.ts +5 -3
  58. package/packages/mcp-server/src/mcp-server.test.ts +85 -1
  59. package/packages/mcp-server/src/server.ts +188 -1
  60. package/packages/mcp-server/src/tool-credentials.test.ts +95 -0
  61. package/packages/mcp-server/src/tool-credentials.ts +97 -0
  62. package/packages/mcp-server/src/workflow-tools.test.ts +32 -25
  63. package/packages/mcp-server/src/workflow-tools.ts +365 -2
  64. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  65. package/packages/pi-ai/dist/providers/anthropic.js +1 -23
  66. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  67. package/packages/pi-ai/dist/utils/oauth/index.d.ts +3 -2
  68. package/packages/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
  69. package/packages/pi-ai/dist/utils/oauth/index.js +3 -5
  70. package/packages/pi-ai/dist/utils/oauth/index.js.map +1 -1
  71. package/packages/pi-ai/src/providers/anthropic.ts +1 -31
  72. package/packages/pi-ai/src/utils/oauth/index.ts +3 -5
  73. package/packages/pi-coding-agent/package.json +1 -1
  74. package/pkg/package.json +1 -1
  75. package/src/resources/extensions/gsd/bootstrap/system-context.ts +9 -5
  76. package/src/resources/extensions/gsd/commands-cmux.ts +32 -1
  77. package/src/resources/extensions/gsd/tests/cmux.test.ts +67 -1
  78. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +6 -2
  79. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +23 -7
  80. package/src/resources/extensions/gsd/workflow-mcp.ts +59 -5
  81. package/packages/pi-ai/dist/utils/oauth/anthropic.d.ts +0 -17
  82. package/packages/pi-ai/dist/utils/oauth/anthropic.d.ts.map +0 -1
  83. package/packages/pi-ai/dist/utils/oauth/anthropic.js +0 -106
  84. package/packages/pi-ai/dist/utils/oauth/anthropic.js.map +0 -1
  85. package/packages/pi-ai/src/utils/oauth/anthropic.ts +0 -140
  86. /package/dist/web/standalone/.next/static/{DrWdzskk28E5Qz-Wjw1mj → Nl6lg7zP5dNgNBV1107v1}/_buildManifest.js +0 -0
  87. /package/dist/web/standalone/.next/static/{DrWdzskk28E5Qz-Wjw1mj → Nl6lg7zP5dNgNBV1107v1}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP Server — registers GSD orchestration, project-state, and workflow tools.\n *\n * Session tools (6): gsd_execute, gsd_status, gsd_result, gsd_cancel, gsd_query, gsd_resolve_blocker\n * Read-only tools (6): gsd_progress, gsd_roadmap, gsd_history, gsd_doctor, gsd_captures, gsd_knowledge\n * Workflow tools (17): planning, replanning, completion, validation, reassessment, gate result, and milestone status tools\n *\n * Uses dynamic imports for @modelcontextprotocol/sdk because TS Node16\n * cannot resolve the SDK's subpath exports statically (same pattern as\n * src/mcp-server.ts in the main package).\n */\n\nimport { readFile, readdir, stat } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { z } from 'zod';\nimport type { SessionManager } from './session-manager.js';\nimport { readProgress } from './readers/state.js';\nimport { readRoadmap } from './readers/roadmap.js';\nimport { readHistory } from './readers/metrics.js';\nimport { readCaptures } from './readers/captures.js';\nimport { readKnowledge } from './readers/knowledge.js';\nimport { runDoctorLite } from './readers/doctor-lite.js';\nimport { registerWorkflowTools } from './workflow-tools.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MCP_PKG = '@modelcontextprotocol/sdk';\nconst SERVER_NAME = 'gsd';\nconst SERVER_VERSION = '2.53.0';\n\n// ---------------------------------------------------------------------------\n// Tool result helpers\n// ---------------------------------------------------------------------------\n\n/** Wrap a JSON-serializable value as MCP tool content. */\nfunction jsonContent(data: unknown): { content: Array<{ type: 'text'; text: string }> } {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }] };\n}\n\n/** Return an MCP error response. */\nfunction errorContent(message: string): { isError: true; content: Array<{ type: 'text'; text: string }> } {\n return { isError: true, content: [{ type: 'text' as const, text: message }] };\n}\n\n// ---------------------------------------------------------------------------\n// gsd_query filesystem reader\n// ---------------------------------------------------------------------------\n\nasync function readProjectState(projectDir: string, _query: string): Promise<Record<string, unknown>> {\n const gsdDir = join(resolve(projectDir), '.gsd');\n const result: Record<string, unknown> = { projectDir: resolve(projectDir) };\n\n // STATE.md — current execution state\n try {\n result.state = await readFile(join(gsdDir, 'STATE.md'), 'utf-8');\n } catch {\n result.state = null;\n }\n\n // PROJECT.md — project description\n try {\n result.project = await readFile(join(gsdDir, 'PROJECT.md'), 'utf-8');\n } catch {\n result.project = null;\n }\n\n // REQUIREMENTS.md — requirement contract\n try {\n result.requirements = await readFile(join(gsdDir, 'REQUIREMENTS.md'), 'utf-8');\n } catch {\n result.requirements = null;\n }\n\n // List milestones with basic metadata\n const milestonesDir = join(gsdDir, 'milestones');\n try {\n const entries = await readdir(milestonesDir, { withFileTypes: true });\n const milestones: Array<{ id: string; hasRoadmap: boolean; hasSummary: boolean }> = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const mDir = join(milestonesDir, entry.name);\n const hasRoadmap = await fileExists(join(mDir, `${entry.name}-ROADMAP.md`));\n const hasSummary = await fileExists(join(mDir, `${entry.name}-SUMMARY.md`));\n milestones.push({ id: entry.name, hasRoadmap, hasSummary });\n }\n result.milestones = milestones;\n } catch {\n result.milestones = [];\n }\n\n return result;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// MCP Server type — minimal interface for the dynamically-imported McpServer\n// ---------------------------------------------------------------------------\n\ninterface McpServerInstance {\n tool(name: string, description: string, params: Record<string, unknown>, handler: (args: Record<string, unknown>) => Promise<unknown>): unknown;\n connect(transport: unknown): Promise<void>;\n close(): Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// createMcpServer\n// ---------------------------------------------------------------------------\n\n/**\n * Create and configure an MCP server with session, read-only, and workflow tools.\n *\n * Returns the McpServer instance — call `connect(transport)` to start serving.\n * Uses dynamic imports for the MCP SDK to avoid TS subpath resolution issues.\n */\nexport async function createMcpServer(sessionManager: SessionManager): Promise<{\n server: McpServerInstance;\n}> {\n // Dynamic import — same workaround as src/mcp-server.ts\n const mcpMod = await import(`${MCP_PKG}/server/mcp.js`);\n const McpServer = mcpMod.McpServer;\n\n const server: McpServerInstance = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } },\n );\n\n // -----------------------------------------------------------------------\n // gsd_execute — start a new GSD auto-mode session\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_execute',\n 'Start a GSD auto-mode session for a project directory. Returns a sessionId for tracking.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n command: z.string().optional().describe('Command to send (default: \"/gsd auto\")'),\n model: z.string().optional().describe('Model ID override'),\n bare: z.boolean().optional().describe('Run in bare mode (skip user config)'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, command, model, bare } = args as {\n projectDir: string; command?: string; model?: string; bare?: boolean;\n };\n try {\n const sessionId = await sessionManager.startSession(projectDir, { command, model, bare });\n return jsonContent({ sessionId, status: 'started' });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_status — poll session status\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_status',\n 'Get the current status of a GSD session including progress, recent events, and pending blockers.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId } = args as { sessionId: string };\n try {\n const session = sessionManager.getSession(sessionId);\n if (!session) return errorContent(`Session not found: ${sessionId}`);\n\n const durationMs = Date.now() - session.startTime;\n const toolCallCount = session.events.filter(\n (e) => (e as Record<string, unknown>).type === 'tool_use' ||\n (e as Record<string, unknown>).type === 'tool_execution_start'\n ).length;\n\n return jsonContent({\n status: session.status,\n progress: {\n eventCount: session.events.length,\n toolCalls: toolCallCount,\n },\n recentEvents: session.events.slice(-10),\n pendingBlocker: session.pendingBlocker\n ? {\n id: session.pendingBlocker.id,\n method: session.pendingBlocker.method,\n message: session.pendingBlocker.message,\n }\n : null,\n cost: session.cost,\n durationMs,\n });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_result — get accumulated session result\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_result',\n 'Get the result of a GSD session. Returns partial results if the session is still running.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId } = args as { sessionId: string };\n try {\n const result = sessionManager.getResult(sessionId);\n return jsonContent(result);\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_cancel — cancel a running session\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_cancel',\n 'Cancel a running GSD session. Aborts the current operation and stops the process.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId } = args as { sessionId: string };\n try {\n await sessionManager.cancelSession(sessionId);\n return jsonContent({ cancelled: true });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_query — read project state from filesystem (no session needed)\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_query',\n 'Query GSD project state from the filesystem. Returns STATE.md, PROJECT.md, requirements, and milestone listing. Does not require an active session.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n query: z.string().describe('What to query (e.g. \"status\", \"milestones\", \"requirements\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, query } = args as { projectDir: string; query: string };\n try {\n const state = await readProjectState(projectDir, query);\n return jsonContent(state);\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_resolve_blocker — resolve a pending blocker\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_resolve_blocker',\n 'Resolve a pending blocker in a GSD session by sending a response to the UI request.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n response: z.string().describe('Response to send for the pending blocker'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId, response } = args as { sessionId: string; response: string };\n try {\n await sessionManager.resolveBlocker(sessionId, response);\n return jsonContent({ resolved: true });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // =======================================================================\n // READ-ONLY TOOLS — no session required, pure filesystem reads\n // =======================================================================\n\n // -----------------------------------------------------------------------\n // gsd_progress — structured project progress metrics\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_progress',\n 'Get structured project progress: active milestone/slice/task, phase, completion counts, blockers, and next action. No session required — reads directly from .gsd/ on disk.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir } = args as { projectDir: string };\n try {\n return jsonContent(readProgress(projectDir));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_roadmap — milestone/slice/task structure with status\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_roadmap',\n 'Get the full project roadmap structure: milestones with their slices, tasks, status, risk, and dependencies. Optionally filter to a single milestone. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n milestoneId: z.string().optional().describe('Filter to a specific milestone (e.g. \"M001\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, milestoneId } = args as { projectDir: string; milestoneId?: string };\n try {\n return jsonContent(readRoadmap(projectDir, milestoneId));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_history — execution history with cost/token metrics\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_history',\n 'Get execution history with cost, token usage, model, and duration per unit. Returns totals across all units. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n limit: z.number().optional().describe('Max entries to return (most recent first). Default: all.'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, limit } = args as { projectDir: string; limit?: number };\n try {\n return jsonContent(readHistory(projectDir, limit));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_doctor — lightweight structural health check\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_doctor',\n 'Run a lightweight structural health check on the .gsd/ directory. Checks for missing files, status inconsistencies, and orphaned state. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n scope: z.string().optional().describe('Limit checks to a specific milestone (e.g. \"M001\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, scope } = args as { projectDir: string; scope?: string };\n try {\n return jsonContent(runDoctorLite(projectDir, scope));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_captures — pending captures and ideas\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_captures',\n 'Get captured ideas and thoughts from CAPTURES.md with triage status. Filter by pending, actionable, or all. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n filter: z.enum(['all', 'pending', 'actionable']).optional().describe('Filter captures (default: \"all\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, filter } = args as { projectDir: string; filter?: 'all' | 'pending' | 'actionable' };\n try {\n return jsonContent(readCaptures(projectDir, filter ?? 'all'));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_knowledge — project knowledge base\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_knowledge',\n 'Get the project knowledge base: rules, patterns, and lessons learned accumulated during development. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir } = args as { projectDir: string };\n try {\n return jsonContent(readKnowledge(projectDir));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n registerWorkflowTools(server);\n\n return { server };\n}\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MCP Server — registers GSD orchestration, project-state, and workflow tools.\n *\n * Session tools (6): gsd_execute, gsd_status, gsd_result, gsd_cancel, gsd_query, gsd_resolve_blocker\n * Interactive tools (1): ask_user_questions via MCP form elicitation\n * Read-only tools (6): gsd_progress, gsd_roadmap, gsd_history, gsd_doctor, gsd_captures, gsd_knowledge\n * Workflow tools (29): headless-safe planning, metadata persistence, replanning, completion, validation, reassessment, gate result, status, and journal tools\n *\n * Uses dynamic imports for @modelcontextprotocol/sdk because TS Node16\n * cannot resolve the SDK's subpath exports statically (same pattern as\n * src/mcp-server.ts in the main package).\n */\n\nimport { readFile, readdir, stat } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { z } from 'zod';\nimport type { SessionManager } from './session-manager.js';\nimport { readProgress } from './readers/state.js';\nimport { readRoadmap } from './readers/roadmap.js';\nimport { readHistory } from './readers/metrics.js';\nimport { readCaptures } from './readers/captures.js';\nimport { readKnowledge } from './readers/knowledge.js';\nimport { runDoctorLite } from './readers/doctor-lite.js';\nimport { registerWorkflowTools } from './workflow-tools.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MCP_PKG = '@modelcontextprotocol/sdk';\nconst SERVER_NAME = 'gsd';\nconst SERVER_VERSION = '2.53.0';\n\n// ---------------------------------------------------------------------------\n// Tool result helpers\n// ---------------------------------------------------------------------------\n\n/** Wrap a JSON-serializable value as MCP tool content. */\nfunction jsonContent(data: unknown): { content: Array<{ type: 'text'; text: string }> } {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }] };\n}\n\n/** Return an MCP error response. */\nfunction errorContent(message: string): { isError: true; content: Array<{ type: 'text'; text: string }> } {\n return { isError: true, content: [{ type: 'text' as const, text: message }] };\n}\n\n/** Return raw text content without JSON wrapping. */\nfunction textContent(text: string): { content: Array<{ type: 'text'; text: string }> } {\n return { content: [{ type: 'text' as const, text }] };\n}\n\n// ---------------------------------------------------------------------------\n// gsd_query filesystem reader\n// ---------------------------------------------------------------------------\n\nasync function readProjectState(projectDir: string, _query: string): Promise<Record<string, unknown>> {\n const gsdDir = join(resolve(projectDir), '.gsd');\n const result: Record<string, unknown> = { projectDir: resolve(projectDir) };\n\n // STATE.md — current execution state\n try {\n result.state = await readFile(join(gsdDir, 'STATE.md'), 'utf-8');\n } catch {\n result.state = null;\n }\n\n // PROJECT.md — project description\n try {\n result.project = await readFile(join(gsdDir, 'PROJECT.md'), 'utf-8');\n } catch {\n result.project = null;\n }\n\n // REQUIREMENTS.md — requirement contract\n try {\n result.requirements = await readFile(join(gsdDir, 'REQUIREMENTS.md'), 'utf-8');\n } catch {\n result.requirements = null;\n }\n\n // List milestones with basic metadata\n const milestonesDir = join(gsdDir, 'milestones');\n try {\n const entries = await readdir(milestonesDir, { withFileTypes: true });\n const milestones: Array<{ id: string; hasRoadmap: boolean; hasSummary: boolean }> = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const mDir = join(milestonesDir, entry.name);\n const hasRoadmap = await fileExists(join(mDir, `${entry.name}-ROADMAP.md`));\n const hasSummary = await fileExists(join(mDir, `${entry.name}-SUMMARY.md`));\n milestones.push({ id: entry.name, hasRoadmap, hasSummary });\n }\n result.milestones = milestones;\n } catch {\n result.milestones = [];\n }\n\n return result;\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// MCP Server type — minimal interface for the dynamically-imported McpServer\n// ---------------------------------------------------------------------------\n\ninterface McpServerInstance {\n tool(name: string, description: string, params: Record<string, unknown>, handler: (args: Record<string, unknown>) => Promise<unknown>): unknown;\n server: {\n elicitInput(\n params: AskUserQuestionsElicitRequest,\n options?: unknown,\n ): Promise<AskUserQuestionsElicitResult>;\n };\n connect(transport: unknown): Promise<void>;\n close(): Promise<void>;\n}\n\ninterface AskUserQuestionOption {\n label: string;\n description: string;\n}\n\ninterface AskUserQuestion {\n id: string;\n header: string;\n question: string;\n options: AskUserQuestionOption[];\n allowMultiple?: boolean;\n}\n\ninterface AskUserQuestionsParams {\n questions: AskUserQuestion[];\n}\n\ntype AskUserQuestionsContentValue = string | number | boolean | string[];\n\ninterface AskUserQuestionsElicitResult {\n action: 'accept' | 'decline' | 'cancel';\n content?: Record<string, AskUserQuestionsContentValue>;\n}\n\ninterface AskUserQuestionsElicitRequest {\n mode: 'form';\n message: string;\n requestedSchema: {\n type: 'object';\n properties: Record<string, Record<string, unknown>>;\n required?: string[];\n };\n}\n\nconst OTHER_OPTION_LABEL = 'None of the above';\n\nfunction normalizeAskUserQuestionsNote(value: AskUserQuestionsContentValue | undefined): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction normalizeAskUserQuestionsAnswers(\n value: AskUserQuestionsContentValue | undefined,\n allowMultiple: boolean,\n): string[] {\n if (allowMultiple) {\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === 'string') : [];\n }\n\n return typeof value === 'string' && value.length > 0 ? [value] : [];\n}\n\nfunction validateAskUserQuestionsPayload(questions: AskUserQuestion[]): string | null {\n if (questions.length === 0 || questions.length > 3) {\n return 'Error: questions must contain 1-3 items';\n }\n\n for (const question of questions) {\n if (!question.options || question.options.length === 0) {\n return `Error: ask_user_questions requires non-empty options for every question (question \"${question.id}\" has none)`;\n }\n }\n\n return null;\n}\n\nexport function buildAskUserQuestionsElicitRequest(questions: AskUserQuestion[]): AskUserQuestionsElicitRequest {\n const properties: Record<string, Record<string, unknown>> = {};\n const required = questions.map((question) => question.id);\n\n for (const question of questions) {\n if (question.allowMultiple) {\n properties[question.id] = {\n type: 'array',\n title: question.header,\n description: question.question,\n minItems: 1,\n maxItems: question.options.length,\n items: {\n anyOf: question.options.map((option) => ({\n const: option.label,\n title: option.label,\n })),\n },\n };\n continue;\n }\n\n properties[question.id] = {\n type: 'string',\n title: question.header,\n description: question.question,\n oneOf: [...question.options, { label: OTHER_OPTION_LABEL, description: 'Choose this when the listed options do not fit.' }].map((option) => ({\n const: option.label,\n title: option.label,\n })),\n };\n\n properties[`${question.id}__note`] = {\n type: 'string',\n title: `${question.header} Note`,\n description: `Optional note for \"${OTHER_OPTION_LABEL}\".`,\n maxLength: 500,\n };\n }\n\n return {\n mode: 'form',\n message: 'Please answer the following question(s). For single-select questions, choose \"None of the above\" and add a note if the provided options do not fit.',\n requestedSchema: {\n type: 'object',\n properties,\n required,\n },\n };\n}\n\nexport function formatAskUserQuestionsElicitResult(\n questions: AskUserQuestion[],\n result: AskUserQuestionsElicitResult,\n): string {\n const answers: Record<string, { answers: string[] }> = {};\n const content = result.content ?? {};\n\n for (const question of questions) {\n const answerList = normalizeAskUserQuestionsAnswers(content[question.id], !!question.allowMultiple);\n\n if (!question.allowMultiple && answerList[0] === OTHER_OPTION_LABEL) {\n const note = normalizeAskUserQuestionsNote(content[`${question.id}__note`]);\n if (note) {\n answerList.push(`user_note: ${note}`);\n }\n }\n\n answers[question.id] = { answers: answerList };\n }\n\n return JSON.stringify({ answers });\n}\n\n// ---------------------------------------------------------------------------\n// createMcpServer\n// ---------------------------------------------------------------------------\n\n/**\n * Create and configure an MCP server with session, read-only, and workflow tools.\n *\n * Returns the McpServer instance — call `connect(transport)` to start serving.\n * Uses dynamic imports for the MCP SDK to avoid TS subpath resolution issues.\n */\nexport async function createMcpServer(sessionManager: SessionManager): Promise<{\n server: McpServerInstance;\n}> {\n // Dynamic import — same workaround as src/mcp-server.ts\n const mcpMod = await import(`${MCP_PKG}/server/mcp.js`);\n const McpServer = mcpMod.McpServer;\n\n const server: McpServerInstance = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } },\n );\n\n // -----------------------------------------------------------------------\n // gsd_execute — start a new GSD auto-mode session\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_execute',\n 'Start a GSD auto-mode session for a project directory. Returns a sessionId for tracking.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n command: z.string().optional().describe('Command to send (default: \"/gsd auto\")'),\n model: z.string().optional().describe('Model ID override'),\n bare: z.boolean().optional().describe('Run in bare mode (skip user config)'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, command, model, bare } = args as {\n projectDir: string; command?: string; model?: string; bare?: boolean;\n };\n try {\n const sessionId = await sessionManager.startSession(projectDir, { command, model, bare });\n return jsonContent({ sessionId, status: 'started' });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_status — poll session status\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_status',\n 'Get the current status of a GSD session including progress, recent events, and pending blockers.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId } = args as { sessionId: string };\n try {\n const session = sessionManager.getSession(sessionId);\n if (!session) return errorContent(`Session not found: ${sessionId}`);\n\n const durationMs = Date.now() - session.startTime;\n const toolCallCount = session.events.filter(\n (e) => (e as Record<string, unknown>).type === 'tool_use' ||\n (e as Record<string, unknown>).type === 'tool_execution_start'\n ).length;\n\n return jsonContent({\n status: session.status,\n progress: {\n eventCount: session.events.length,\n toolCalls: toolCallCount,\n },\n recentEvents: session.events.slice(-10),\n pendingBlocker: session.pendingBlocker\n ? {\n id: session.pendingBlocker.id,\n method: session.pendingBlocker.method,\n message: session.pendingBlocker.message,\n }\n : null,\n cost: session.cost,\n durationMs,\n });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_result — get accumulated session result\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_result',\n 'Get the result of a GSD session. Returns partial results if the session is still running.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId } = args as { sessionId: string };\n try {\n const result = sessionManager.getResult(sessionId);\n return jsonContent(result);\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_cancel — cancel a running session\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_cancel',\n 'Cancel a running GSD session. Aborts the current operation and stops the process.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId } = args as { sessionId: string };\n try {\n await sessionManager.cancelSession(sessionId);\n return jsonContent({ cancelled: true });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_query — read project state from filesystem (no session needed)\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_query',\n 'Query GSD project state from the filesystem. Returns STATE.md, PROJECT.md, requirements, and milestone listing. Does not require an active session.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n query: z.string().describe('What to query (e.g. \"status\", \"milestones\", \"requirements\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, query } = args as { projectDir: string; query: string };\n try {\n const state = await readProjectState(projectDir, query);\n return jsonContent(state);\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_resolve_blocker — resolve a pending blocker\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_resolve_blocker',\n 'Resolve a pending blocker in a GSD session by sending a response to the UI request.',\n {\n sessionId: z.string().describe('Session ID returned from gsd_execute'),\n response: z.string().describe('Response to send for the pending blocker'),\n },\n async (args: Record<string, unknown>) => {\n const { sessionId, response } = args as { sessionId: string; response: string };\n try {\n await sessionManager.resolveBlocker(sessionId, response);\n return jsonContent({ resolved: true });\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // ask_user_questions — structured user input via MCP form elicitation\n // -----------------------------------------------------------------------\n server.tool(\n 'ask_user_questions',\n 'Request user input for one to three short questions and wait for the response. Single-select questions include a free-form \"None of the above\" path. Multi-select questions allow multiple choices.',\n {\n questions: z.array(z.object({\n id: z.string().describe('Stable identifier for mapping answers (snake_case)'),\n header: z.string().describe('Short header label shown in the UI (12 or fewer chars)'),\n question: z.string().describe('Single-sentence prompt shown to the user'),\n options: z.array(z.object({\n label: z.string().describe('User-facing label (1-5 words)'),\n description: z.string().describe('One short sentence explaining impact/tradeoff if selected'),\n })).describe('Provide 2-3 mutually exclusive choices. Put the recommended option first and suffix its label with \"(Recommended)\". Do not include an \"Other\" option for single-select questions.'),\n allowMultiple: z.boolean().optional().describe('If true, the user can select multiple options. No \"None of the above\" option is added.'),\n })).describe('Questions to show the user. Prefer 1 and do not exceed 3.'),\n },\n async (args: Record<string, unknown>) => {\n const { questions } = args as unknown as AskUserQuestionsParams;\n try {\n const validationError = validateAskUserQuestionsPayload(questions);\n if (validationError) return errorContent(validationError);\n\n const elicitation = await server.server.elicitInput(buildAskUserQuestionsElicitRequest(questions));\n if (elicitation.action !== 'accept' || !elicitation.content) {\n return textContent('ask_user_questions was cancelled before receiving a response');\n }\n\n return textContent(formatAskUserQuestionsElicitResult(questions, elicitation));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // =======================================================================\n // READ-ONLY TOOLS — no session required, pure filesystem reads\n // =======================================================================\n\n // -----------------------------------------------------------------------\n // gsd_progress — structured project progress metrics\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_progress',\n 'Get structured project progress: active milestone/slice/task, phase, completion counts, blockers, and next action. No session required — reads directly from .gsd/ on disk.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir } = args as { projectDir: string };\n try {\n return jsonContent(readProgress(projectDir));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_roadmap — milestone/slice/task structure with status\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_roadmap',\n 'Get the full project roadmap structure: milestones with their slices, tasks, status, risk, and dependencies. Optionally filter to a single milestone. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n milestoneId: z.string().optional().describe('Filter to a specific milestone (e.g. \"M001\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, milestoneId } = args as { projectDir: string; milestoneId?: string };\n try {\n return jsonContent(readRoadmap(projectDir, milestoneId));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_history — execution history with cost/token metrics\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_history',\n 'Get execution history with cost, token usage, model, and duration per unit. Returns totals across all units. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n limit: z.number().optional().describe('Max entries to return (most recent first). Default: all.'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, limit } = args as { projectDir: string; limit?: number };\n try {\n return jsonContent(readHistory(projectDir, limit));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_doctor — lightweight structural health check\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_doctor',\n 'Run a lightweight structural health check on the .gsd/ directory. Checks for missing files, status inconsistencies, and orphaned state. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n scope: z.string().optional().describe('Limit checks to a specific milestone (e.g. \"M001\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, scope } = args as { projectDir: string; scope?: string };\n try {\n return jsonContent(runDoctorLite(projectDir, scope));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_captures — pending captures and ideas\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_captures',\n 'Get captured ideas and thoughts from CAPTURES.md with triage status. Filter by pending, actionable, or all. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n filter: z.enum(['all', 'pending', 'actionable']).optional().describe('Filter captures (default: \"all\")'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir, filter } = args as { projectDir: string; filter?: 'all' | 'pending' | 'actionable' };\n try {\n return jsonContent(readCaptures(projectDir, filter ?? 'all'));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n // -----------------------------------------------------------------------\n // gsd_knowledge — project knowledge base\n // -----------------------------------------------------------------------\n server.tool(\n 'gsd_knowledge',\n 'Get the project knowledge base: rules, patterns, and lessons learned accumulated during development. No session required.',\n {\n projectDir: z.string().describe('Absolute path to the project directory'),\n },\n async (args: Record<string, unknown>) => {\n const { projectDir } = args as { projectDir: string };\n try {\n return jsonContent(readKnowledge(projectDir));\n } catch (err) {\n return errorContent(err instanceof Error ? err.message : String(err));\n }\n },\n );\n\n registerWorkflowTools(server);\n\n return { server };\n}\n"]}
@@ -0,0 +1,6 @@
1
+ export declare function resolveAuthPath(env?: NodeJS.ProcessEnv): string;
2
+ export declare function loadStoredCredentialEnvKeys(options?: {
3
+ env?: NodeJS.ProcessEnv;
4
+ authPath?: string;
5
+ }): string[];
6
+ //# sourceMappingURL=tool-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-credentials.d.ts","sourceRoot":"","sources":["../src/tool-credentials.ts"],"names":[],"mappings":"AA8DA,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAI5E;AAED,wBAAgB,2BAA2B,CAAC,OAAO,GAAE;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,MAAM,EAAE,CAyBhB"}
@@ -0,0 +1,90 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ const AUTH_ENV_KEYS = [
5
+ ["anthropic", "ANTHROPIC_API_KEY"],
6
+ ["openai", "OPENAI_API_KEY"],
7
+ ["github-copilot", "GITHUB_TOKEN"],
8
+ ["google", "GEMINI_API_KEY"],
9
+ ["groq", "GROQ_API_KEY"],
10
+ ["xai", "XAI_API_KEY"],
11
+ ["openrouter", "OPENROUTER_API_KEY"],
12
+ ["mistral", "MISTRAL_API_KEY"],
13
+ ["ollama-cloud", "OLLAMA_API_KEY"],
14
+ ["custom-openai", "CUSTOM_OPENAI_API_KEY"],
15
+ ["cerebras", "CEREBRAS_API_KEY"],
16
+ ["azure-openai-responses", "AZURE_OPENAI_API_KEY"],
17
+ ["vercel-ai-gateway", "AI_GATEWAY_API_KEY"],
18
+ ["zai", "ZAI_API_KEY"],
19
+ ["minimax", "MINIMAX_API_KEY"],
20
+ ["minimax-cn", "MINIMAX_CN_API_KEY"],
21
+ ["huggingface", "HF_TOKEN"],
22
+ ["opencode", "OPENCODE_API_KEY"],
23
+ ["opencode-go", "OPENCODE_API_KEY"],
24
+ ["kimi-coding", "KIMI_API_KEY"],
25
+ ["alibaba-coding-plan", "ALIBABA_API_KEY"],
26
+ ["brave", "BRAVE_API_KEY"],
27
+ ["brave_answers", "BRAVE_ANSWERS_KEY"],
28
+ ["context7", "CONTEXT7_API_KEY"],
29
+ ["jina", "JINA_API_KEY"],
30
+ ["tavily", "TAVILY_API_KEY"],
31
+ ["slack_bot", "SLACK_BOT_TOKEN"],
32
+ ["discord_bot", "DISCORD_BOT_TOKEN"],
33
+ ["telegram_bot", "TELEGRAM_BOT_TOKEN"],
34
+ ];
35
+ function expandHome(pathValue) {
36
+ if (pathValue === "~")
37
+ return homedir();
38
+ if (pathValue.startsWith("~/"))
39
+ return join(homedir(), pathValue.slice(2));
40
+ return pathValue;
41
+ }
42
+ function getStoredApiKey(data, providerId) {
43
+ const raw = data[providerId];
44
+ const credentials = Array.isArray(raw) ? raw : raw ? [raw] : [];
45
+ for (const credential of credentials) {
46
+ if (credential?.type !== "api_key")
47
+ continue;
48
+ if (typeof credential.key !== "string")
49
+ continue;
50
+ if (credential.key.trim().length === 0)
51
+ continue;
52
+ return credential.key;
53
+ }
54
+ return undefined;
55
+ }
56
+ export function resolveAuthPath(env = process.env) {
57
+ const agentDir = env.GSD_CODING_AGENT_DIR?.trim();
58
+ if (agentDir)
59
+ return join(expandHome(agentDir), "auth.json");
60
+ return join(homedir(), ".gsd", "agent", "auth.json");
61
+ }
62
+ export function loadStoredCredentialEnvKeys(options = {}) {
63
+ const env = options.env ?? process.env;
64
+ const authPath = options.authPath ?? resolveAuthPath(env);
65
+ if (!existsSync(authPath))
66
+ return [];
67
+ let parsed;
68
+ try {
69
+ const raw = readFileSync(authPath, "utf-8");
70
+ const data = JSON.parse(raw);
71
+ if (!data || typeof data !== "object" || Array.isArray(data))
72
+ return [];
73
+ parsed = data;
74
+ }
75
+ catch {
76
+ return [];
77
+ }
78
+ const loaded = [];
79
+ for (const [providerId, envVar] of AUTH_ENV_KEYS) {
80
+ if (env[envVar])
81
+ continue;
82
+ const key = getStoredApiKey(parsed, providerId);
83
+ if (!key)
84
+ continue;
85
+ env[envVar] = key;
86
+ loaded.push(envVar);
87
+ }
88
+ return loaded;
89
+ }
90
+ //# sourceMappingURL=tool-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-credentials.js","sourceRoot":"","sources":["../src/tool-credentials.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\ntype AuthCredential =\n | { type?: unknown; key?: unknown }\n | Array<{ type?: unknown; key?: unknown }>;\n\ntype AuthStorageData = Record<string, AuthCredential>;\n\nconst AUTH_ENV_KEYS = [\n [\"anthropic\", \"ANTHROPIC_API_KEY\"],\n [\"openai\", \"OPENAI_API_KEY\"],\n [\"github-copilot\", \"GITHUB_TOKEN\"],\n [\"google\", \"GEMINI_API_KEY\"],\n [\"groq\", \"GROQ_API_KEY\"],\n [\"xai\", \"XAI_API_KEY\"],\n [\"openrouter\", \"OPENROUTER_API_KEY\"],\n [\"mistral\", \"MISTRAL_API_KEY\"],\n [\"ollama-cloud\", \"OLLAMA_API_KEY\"],\n [\"custom-openai\", \"CUSTOM_OPENAI_API_KEY\"],\n [\"cerebras\", \"CEREBRAS_API_KEY\"],\n [\"azure-openai-responses\", \"AZURE_OPENAI_API_KEY\"],\n [\"vercel-ai-gateway\", \"AI_GATEWAY_API_KEY\"],\n [\"zai\", \"ZAI_API_KEY\"],\n [\"minimax\", \"MINIMAX_API_KEY\"],\n [\"minimax-cn\", \"MINIMAX_CN_API_KEY\"],\n [\"huggingface\", \"HF_TOKEN\"],\n [\"opencode\", \"OPENCODE_API_KEY\"],\n [\"opencode-go\", \"OPENCODE_API_KEY\"],\n [\"kimi-coding\", \"KIMI_API_KEY\"],\n [\"alibaba-coding-plan\", \"ALIBABA_API_KEY\"],\n [\"brave\", \"BRAVE_API_KEY\"],\n [\"brave_answers\", \"BRAVE_ANSWERS_KEY\"],\n [\"context7\", \"CONTEXT7_API_KEY\"],\n [\"jina\", \"JINA_API_KEY\"],\n [\"tavily\", \"TAVILY_API_KEY\"],\n [\"slack_bot\", \"SLACK_BOT_TOKEN\"],\n [\"discord_bot\", \"DISCORD_BOT_TOKEN\"],\n [\"telegram_bot\", \"TELEGRAM_BOT_TOKEN\"],\n] as const;\n\nfunction expandHome(pathValue: string): string {\n if (pathValue === \"~\") return homedir();\n if (pathValue.startsWith(\"~/\")) return join(homedir(), pathValue.slice(2));\n return pathValue;\n}\n\nfunction getStoredApiKey(data: AuthStorageData, providerId: string): string | undefined {\n const raw = data[providerId];\n const credentials = Array.isArray(raw) ? raw : raw ? [raw] : [];\n\n for (const credential of credentials) {\n if (credential?.type !== \"api_key\") continue;\n if (typeof credential.key !== \"string\") continue;\n if (credential.key.trim().length === 0) continue;\n return credential.key;\n }\n\n return undefined;\n}\n\nexport function resolveAuthPath(env: NodeJS.ProcessEnv = process.env): string {\n const agentDir = env.GSD_CODING_AGENT_DIR?.trim();\n if (agentDir) return join(expandHome(agentDir), \"auth.json\");\n return join(homedir(), \".gsd\", \"agent\", \"auth.json\");\n}\n\nexport function loadStoredCredentialEnvKeys(options: {\n env?: NodeJS.ProcessEnv;\n authPath?: string;\n} = {}): string[] {\n const env = options.env ?? process.env;\n const authPath = options.authPath ?? resolveAuthPath(env);\n if (!existsSync(authPath)) return [];\n\n let parsed: AuthStorageData;\n try {\n const raw = readFileSync(authPath, \"utf-8\");\n const data = JSON.parse(raw) as unknown;\n if (!data || typeof data !== \"object\" || Array.isArray(data)) return [];\n parsed = data as AuthStorageData;\n } catch {\n return [];\n }\n\n const loaded: string[] = [];\n for (const [providerId, envVar] of AUTH_ENV_KEYS) {\n if (env[envVar]) continue;\n const key = getStoredApiKey(parsed, providerId);\n if (!key) continue;\n env[envVar] = key;\n loaded.push(envVar);\n }\n\n return loaded;\n}\n"]}
@@ -4,6 +4,7 @@
4
4
  interface McpToolServer {
5
5
  tool(name: string, description: string, params: Record<string, unknown>, handler: (args: Record<string, unknown>) => Promise<unknown>): unknown;
6
6
  }
7
+ export declare const WORKFLOW_TOOL_NAMES: readonly ["gsd_decision_save", "gsd_save_decision", "gsd_requirement_update", "gsd_update_requirement", "gsd_requirement_save", "gsd_save_requirement", "gsd_milestone_generate_id", "gsd_generate_milestone_id", "gsd_plan_milestone", "gsd_plan_slice", "gsd_plan_task", "gsd_task_plan", "gsd_replan_slice", "gsd_slice_replan", "gsd_slice_complete", "gsd_complete_slice", "gsd_skip_slice", "gsd_complete_milestone", "gsd_milestone_complete", "gsd_validate_milestone", "gsd_milestone_validate", "gsd_reassess_roadmap", "gsd_roadmap_reassess", "gsd_save_gate_result", "gsd_summary_save", "gsd_task_complete", "gsd_complete_task", "gsd_milestone_status", "gsd_journal_query"];
7
8
  export declare function registerWorkflowTools(server: McpToolServer): void;
8
9
  export {};
9
10
  //# sourceMappingURL=workflow-tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-tools.d.ts","sourceRoot":"","sources":["../src/workflow-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2ZH,UAAU,aAAa;IACrB,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAC3D,OAAO,CAAC;CACZ;AAiYD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CA+LjE"}
1
+ {"version":3,"file":"workflow-tools.d.ts","sourceRoot":"","sources":["../src/workflow-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+ZH,UAAU,aAAa;IACrB,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAC3D,OAAO,CAAC;CACZ;AAED,eAAO,MAAM,mBAAmB,8pBA8BtB,CAAC;AAydX,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CA8ajE"}