@_davideast/stitch-mcp 0.5.2 → 0.5.3
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/chunk-22bymmh9.js +137 -0
- package/dist/chunk-22bymmh9.js.map +10 -0
- package/dist/chunk-387yyye2.js +248 -0
- package/dist/chunk-387yyye2.js.map +14 -0
- package/dist/chunk-3ff2k44g.js +19 -0
- package/dist/chunk-3ff2k44g.js.map +9 -0
- package/dist/chunk-46cay1zp.js +273 -0
- package/dist/chunk-46cay1zp.js.map +10 -0
- package/dist/chunk-48e1jpm8.js +167 -0
- package/dist/chunk-48e1jpm8.js.map +10 -0
- package/dist/chunk-4arzkk1s.js +69 -0
- package/dist/chunk-4arzkk1s.js.map +10 -0
- package/dist/chunk-4js7vw6h.js +415 -0
- package/dist/chunk-4js7vw6h.js.map +20 -0
- package/dist/chunk-4p1wfk3t.js +736 -0
- package/dist/chunk-4p1wfk3t.js.map +16 -0
- package/dist/chunk-4zg969tc.js +370 -0
- package/dist/chunk-4zg969tc.js.map +16 -0
- package/dist/chunk-5jjt7tgw.js +247 -0
- package/dist/chunk-5jjt7tgw.js.map +14 -0
- package/dist/chunk-5t2h8z2n.js +273 -0
- package/dist/chunk-5t2h8z2n.js.map +10 -0
- package/dist/chunk-5zy3et1m.js +759 -0
- package/dist/chunk-5zy3et1m.js.map +19 -0
- package/dist/chunk-6wvst7z8.js +125 -0
- package/dist/chunk-6wvst7z8.js.map +12 -0
- package/dist/chunk-8mm08arm.js +256 -0
- package/dist/chunk-8mm08arm.js.map +11 -0
- package/dist/chunk-8nv4wwv0.js +19 -0
- package/dist/chunk-8nv4wwv0.js.map +9 -0
- package/dist/chunk-9cjny9z2.js +19 -0
- package/dist/chunk-9cjny9z2.js.map +9 -0
- package/dist/chunk-9ggfw78s.js +19 -0
- package/dist/chunk-9ggfw78s.js.map +9 -0
- package/dist/chunk-9nyyn1hn.js +125 -0
- package/dist/chunk-9nyyn1hn.js.map +12 -0
- package/dist/chunk-9nzbvp6r.js +19 -0
- package/dist/chunk-9nzbvp6r.js.map +9 -0
- package/dist/chunk-a0gmbh8e.js +415 -0
- package/dist/chunk-a0gmbh8e.js.map +20 -0
- package/dist/chunk-acv998mp.js +941 -0
- package/dist/chunk-acv998mp.js.map +27 -0
- package/dist/chunk-cpjsvven.js +10 -0
- package/dist/chunk-cpjsvven.js.map +9 -0
- package/dist/chunk-dmrahbs1.js +31467 -0
- package/dist/chunk-dmrahbs1.js.map +245 -0
- package/dist/chunk-dts6851a.js +137 -0
- package/dist/chunk-dts6851a.js.map +10 -0
- package/dist/chunk-efd0rm6g.js +69 -0
- package/dist/chunk-efd0rm6g.js.map +10 -0
- package/dist/chunk-f1kjn6cd.js +16554 -0
- package/dist/chunk-f1kjn6cd.js.map +98 -0
- package/dist/chunk-f5f6ekgp.js +109 -0
- package/dist/chunk-f5f6ekgp.js.map +10 -0
- package/dist/chunk-fmewhfh3.js +137 -0
- package/dist/chunk-fmewhfh3.js.map +10 -0
- package/dist/chunk-fmhrn6cg.js +6382 -0
- package/dist/chunk-fmhrn6cg.js.map +109 -0
- package/dist/chunk-gh7dzfhb.js +256 -0
- package/dist/chunk-gh7dzfhb.js.map +11 -0
- package/dist/chunk-gwhtc0fe.js +370 -0
- package/dist/chunk-gwhtc0fe.js.map +16 -0
- package/dist/chunk-hc7sdwmn.js +449 -0
- package/dist/chunk-hc7sdwmn.js.map +17 -0
- package/dist/chunk-k4xwb3wp.js +44184 -0
- package/dist/chunk-k4xwb3wp.js.map +237 -0
- package/dist/chunk-k751yfm6.js +736 -0
- package/dist/chunk-k751yfm6.js.map +16 -0
- package/dist/chunk-kkc2tvar.js +19 -0
- package/dist/chunk-kkc2tvar.js.map +9 -0
- package/dist/chunk-kva47mgc.js +10 -0
- package/dist/chunk-kva47mgc.js.map +9 -0
- package/dist/chunk-nv2j020p.js +45210 -0
- package/dist/chunk-nv2j020p.js.map +258 -0
- package/dist/chunk-pdj9s41r.js +683 -0
- package/dist/chunk-pdj9s41r.js.map +17 -0
- package/dist/chunk-ppphsy4t.js +273 -0
- package/dist/chunk-ppphsy4t.js.map +10 -0
- package/dist/chunk-psmw9zpa.js +941 -0
- package/dist/chunk-psmw9zpa.js.map +27 -0
- package/dist/chunk-pz31v3ma.js +24 -0
- package/dist/chunk-pz31v3ma.js.map +9 -0
- package/dist/chunk-qbt0906e.js +1495 -0
- package/dist/chunk-qbt0906e.js.map +23 -0
- package/dist/chunk-rh3k09h7.js +19 -0
- package/dist/chunk-rh3k09h7.js.map +9 -0
- package/dist/chunk-saznae7w.js +10 -0
- package/dist/chunk-saznae7w.js.map +9 -0
- package/dist/chunk-sscqdg1j.js +69 -0
- package/dist/chunk-sscqdg1j.js.map +10 -0
- package/dist/chunk-stgj6y85.js +835 -0
- package/dist/chunk-stgj6y85.js.map +19 -0
- package/dist/chunk-t3tqmxyj.js +42 -0
- package/dist/chunk-t3tqmxyj.js.map +9 -0
- package/dist/chunk-v8ak35zd.js +94 -0
- package/dist/chunk-v8ak35zd.js.map +10 -0
- package/dist/chunk-w9acw256.js +167 -0
- package/dist/chunk-w9acw256.js.map +10 -0
- package/dist/chunk-wq60thjn.js +167 -0
- package/dist/chunk-wq60thjn.js.map +10 -0
- package/dist/chunk-wzkdeb8a.js +736 -0
- package/dist/chunk-wzkdeb8a.js.map +16 -0
- package/dist/chunk-xxv6j815.js +256 -0
- package/dist/chunk-xxv6j815.js.map +11 -0
- package/dist/chunk-yjnj35q8.js +1495 -0
- package/dist/chunk-yjnj35q8.js.map +23 -0
- package/dist/chunk-yvzzrczy.js +45206 -0
- package/dist/chunk-yvzzrczy.js.map +258 -0
- package/dist/chunk-ywax1akt.js +370 -0
- package/dist/chunk-ywax1akt.js.map +16 -0
- package/dist/chunk-zakq9pc0.js +4989 -0
- package/dist/chunk-zakq9pc0.js.map +65 -0
- package/dist/commands/doctor/command.js +1 -1
- package/dist/commands/doctor/steps/AdcProjectCheckStep.d.ts +8 -0
- package/dist/commands/init/command.js +1 -1
- package/dist/commands/logout/command.js +1 -1
- package/dist/commands/proxy/command.js +1 -1
- package/dist/commands/screens/command.js +2 -2
- package/dist/commands/serve/command.js +3 -3
- package/dist/commands/site/command.js +1 -1
- package/dist/commands/snapshot/command.js +1 -1
- package/dist/commands/tool/command.js +1 -1
- package/dist/commands/view/command.js +1 -1
- package/dist/index.js +4 -4
- package/dist/lib/server/AssetGateway.d.ts +12 -0
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/services/project/handler.ts", "../src/services/mcp-config/handler.ts", "../src/ui/checklist/handler.ts", "../src/commands/init/steps/ClientSelectionStep.ts", "../src/commands/init/steps/AuthModeStep.ts", "../src/commands/init/steps/GcloudInstallStep.ts", "../src/platform/environment.ts", "../src/commands/init/steps/AuthStep.ts", "../src/commands/init/steps/TransportStep.ts", "../src/commands/init/steps/ProjectSelectStep.ts", "../src/commands/init/steps/IamApiStep.ts", "../src/commands/init/steps/ConfigStep.ts", "../src/commands/init/steps/TestConnectionStep.ts", "../src/commands/init/handler.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import {\n type ProjectService,\n type SelectProjectInput,\n type ProjectSelectionResult,\n} from './spec.js';\nimport { type GcloudService } from '../gcloud/spec.js';\nimport { promptSelect, promptInput, promptConfirm } from '../../ui/wizard.js';\nimport { theme } from '../../ui/theme.js';\n\nexport class ProjectHandler implements ProjectService {\n constructor(private gcloudService: GcloudService) { }\n\n async selectProject(input: SelectProjectInput): Promise<ProjectSelectionResult> {\n try {\n // Get recent projects\n const projectsResult = await this.gcloudService.listProjects({\n limit: input.limit,\n sortBy: '~createTime',\n });\n\n if (!projectsResult.success) {\n return {\n success: false,\n error: {\n code: 'SEARCH_FAILED',\n message: 'Failed to fetch projects',\n suggestion: 'Ensure you are authenticated and have access to GCP projects',\n recoverable: true,\n },\n };\n }\n\n const projects = projectsResult.data.projects;\n\n if (projects.length === 0) {\n return {\n success: false,\n error: {\n code: 'NO_PROJECTS_FOUND',\n message: 'No projects found in your account',\n suggestion: 'Create a project at https://console.cloud.google.com',\n recoverable: false,\n },\n };\n }\n\n // Build menu choices\n const choices = [\n ...(input.allowSearch ? [{ name: theme.gray('🔍 Search for a project...'), value: '__SEARCH__' }] : []),\n ...projects.map((p) => ({\n name: `${p.name} ${theme.gray(`(${p.projectId})`)}`,\n value: p.projectId,\n })),\n ];\n\n const selected = await promptSelect('Select a project', choices);\n\n if (selected === '__SEARCH__') {\n return await this.searchAndSelect();\n }\n\n const selectedProject = projects.find((p) => p.projectId === selected);\n\n if (!selectedProject) {\n return {\n success: false,\n error: {\n code: 'SELECTION_CANCELLED',\n message: 'Project selection failed',\n recoverable: true,\n },\n };\n }\n\n return {\n success: true,\n data: {\n projectId: selectedProject.projectId,\n name: selectedProject.name,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'UNKNOWN_ERROR',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n }\n }\n\n async getProjectDetails(input: { projectId: string }): Promise<ProjectSelectionResult> {\n try {\n const projectResult = await this.gcloudService.listProjects({\n filter: `projectId:${input.projectId}`,\n limit: 1,\n });\n\n if (!projectResult.success) {\n return {\n success: false,\n error: {\n code: 'PROJECT_FETCH_FAILED',\n message: `Failed to fetch project details: ${projectResult.error.message}`,\n recoverable: true,\n },\n };\n }\n\n if (projectResult.data.projects.length === 0) {\n return {\n success: false,\n error: {\n code: 'PROJECT_NOT_FOUND',\n message: `Project not found: ${input.projectId}`,\n recoverable: true,\n },\n };\n }\n\n const project = projectResult.data.projects[0]!;\n\n return {\n success: true,\n data: {\n projectId: project.projectId,\n name: project.name,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'UNKNOWN_ERROR',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n }\n }\n\n private async searchAndSelect(): Promise<ProjectSelectionResult> {\n try {\n const query = await promptInput('Enter project name or ID to search (press Enter)');\n\n if (!query.trim()) {\n return {\n success: false,\n error: {\n code: 'SELECTION_CANCELLED',\n message: 'Search cancelled',\n recoverable: true,\n },\n };\n }\n\n // Search for projects\n const searchResult = await this.gcloudService.listProjects({\n filter: `name:*${query}* OR projectId:*${query}*`,\n limit: 5,\n });\n\n if (!searchResult.success) {\n return {\n success: false,\n error: {\n code: 'SEARCH_FAILED',\n message: `Search failed: ${searchResult.error.message}`,\n recoverable: true,\n },\n };\n }\n\n const projects = searchResult.data.projects;\n\n if (projects.length === 0) {\n // Offer to use query as manual project ID\n const useManual = await promptConfirm(\n `No projects found matching \"${query}\". Use \"${query}\" as project ID?`,\n false\n );\n\n if (useManual) {\n return {\n success: true,\n data: {\n projectId: query,\n name: query,\n },\n };\n }\n\n return {\n success: false,\n error: {\n code: 'NO_PROJECTS_FOUND',\n message: `No projects found matching \"${query}\"`,\n suggestion: 'Try a different search term or select from recent projects',\n recoverable: true,\n },\n };\n }\n\n // Show search results\n const choices = projects.map((p) => ({\n name: `${p.name} ${theme.gray(`(${p.projectId})`)}`,\n value: p.projectId,\n }));\n\n const selected = await promptSelect(`Search results for \"${query}\"`, choices);\n\n const selectedProject = projects.find((p) => p.projectId === selected);\n\n if (!selectedProject) {\n return {\n success: false,\n error: {\n code: 'SELECTION_CANCELLED',\n message: 'Selection cancelled',\n recoverable: true,\n },\n };\n }\n\n return {\n success: true,\n data: {\n projectId: selectedProject.projectId,\n name: selectedProject.name,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'UNKNOWN_ERROR',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n }\n }\n}\n",
|
|
6
|
+
"import { type McpConfigService, type GenerateConfigInput, type McpConfigResult, type McpClient } from './spec.js';\nimport { theme } from '../../ui/theme.js';\n\nexport class McpConfigHandler implements McpConfigService {\n async generateConfig(input: GenerateConfigInput): Promise<McpConfigResult> {\n try {\n const config = input.transport === 'http'\n ? this.generateHttpConfig(input)\n : this.generateStdioConfig(input);\n\n // Command-based clients return null\n const configString = config ? JSON.stringify(config, null, 2) : '';\n const instructions = this.getInstructionsForClient(\n input.client,\n configString,\n input.transport,\n input.projectId,\n input.apiKey\n );\n\n return {\n success: true,\n data: {\n config: configString,\n instructions,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'CONFIG_GENERATION_FAILED',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n }\n }\n\n private generateHttpConfig(input: GenerateConfigInput) {\n switch (input.client) {\n case 'cursor':\n return this.generateCursorConfig(input.projectId, input.apiKey);\n case 'antigravity':\n return this.generateAntigravityConfig(input.projectId, input.apiKey);\n case 'vscode':\n return this.generateVSCodeConfig(input.projectId, input.apiKey);\n case 'claude-code':\n return this.generateClaudeCodeConfig();\n case 'gemini-cli':\n return this.generateGeminiCliConfig();\n case 'codex':\n return null;\n case 'opencode':\n return this.generateOpencodeConfig(input.apiKey);\n }\n }\n\n private generateCursorConfig(projectId: string, apiKey?: string) {\n const headers: Record<string, string> = apiKey\n ? { 'X-Goog-Api-Key': apiKey }\n : {\n Authorization: 'Bearer <YOUR_ACCESS_TOKEN>',\n 'X-Goog-User-Project': projectId,\n };\n\n return {\n mcpServers: {\n stitch: {\n url: 'https://stitch.googleapis.com/mcp',\n headers,\n },\n },\n };\n }\n\n private generateAntigravityConfig(projectId: string, apiKey?: string) {\n const headers: Record<string, string> = apiKey\n ? { 'X-Goog-Api-Key': apiKey }\n : {\n Authorization: 'Bearer <YOUR_ACCESS_TOKEN>',\n 'X-Goog-User-Project': projectId,\n };\n\n return {\n mcpServers: {\n stitch: {\n serverUrl: 'https://stitch.googleapis.com/mcp',\n headers,\n },\n },\n };\n }\n\n private generateVSCodeConfig(projectId: string, apiKey?: string) {\n if (apiKey) {\n return {\n servers: {\n stitch: {\n type: 'http',\n url: 'https://stitch.googleapis.com/mcp',\n headers: {\n Accept: 'application/json',\n 'X-Goog-Api-Key': apiKey,\n },\n },\n },\n };\n }\n\n return {\n inputs: [\n {\n type: 'promptString',\n id: 'stitch-access-token',\n description: 'Google Cloud Access Token (run: gcloud auth print-access-token)',\n password: true,\n },\n ],\n servers: {\n stitch: {\n type: 'http',\n url: 'https://stitch.googleapis.com/mcp',\n headers: {\n 'Authorization': 'Bearer ${input:stitch-access-token}',\n 'X-Goog-User-Project': projectId,\n },\n },\n },\n };\n }\n\n private generateClaudeCodeConfig() {\n // Claude Code uses CLI command, not JSON config\n return null;\n }\n\n private generateGeminiCliConfig() {\n // Gemini CLI uses extension install command, not JSON config\n return null;\n }\n\n private generateOpencodeConfig(apiKey?: string) {\n const headers = apiKey\n ? { \"X-Goog-Api-Key\": apiKey }\n : {\n Authorization: \"Bearer $STITCH_ACCESS_TOKEN\",\n \"X-Goog-User-Project\": \"$GOOGLE_CLOUD_PROJECT\",\n };\n\n return {\n \"$schema\": \"https://opencode.ai/config.json\",\n mcp: {\n stitch: {\n type: \"remote\",\n url: \"https://stitch.googleapis.com/mcp\",\n headers,\n },\n },\n };\n }\n\n private generateStdioConfig(input: GenerateConfigInput) {\n // Command-based clients use CLI commands, not JSON config\n if (input.client === 'claude-code' || input.client === 'gemini-cli' || input.client === 'codex') {\n return null;\n }\n\n const env: Record<string, string> = {};\n\n // Only include project ID for OAuth flows (not needed for API key auth)\n if (!input.apiKey) {\n env.STITCH_PROJECT_ID = input.projectId;\n } else {\n env.STITCH_API_KEY = input.apiKey;\n }\n\n// VS Code uses different format\n if (input.client === 'vscode') {\n return {\n servers: {\n stitch: {\n type: 'stdio',\n command: 'npx',\n args: ['@_davideast/stitch-mcp', 'proxy'],\n env,\n },\n },\n };\n }\n\n if (input.client === 'opencode') {\n return {\n \"$schema\": \"https://opencode.ai/config.json\",\n mcp: {\n stitch: {\n type: \"local\",\n command: [\"npx\", \"@_davideast/stitch-mcp\", \"proxy\"],\n environment: env,\n },\n },\n };\n }\n\n // Other clients (Cursor, Antigravity, etc.) use mcpServers format\n return {\n mcpServers: {\n stitch: {\n command: 'npx',\n args: ['@_davideast/stitch-mcp', 'proxy'],\n env,\n },\n },\n };\n }\n\n private getInstructionsForClient(\n client: McpClient,\n config: string,\n transport: 'http' | 'stdio',\n projectId: string,\n apiKey?: string\n ): string {\n const baseInstructions = `\\n${theme.blue('MCP Configuration Generated')}\\n\\n${config}\\n`;\n\n const transportNote = transport === 'stdio'\n ? `\\n${theme.yellow('Note:')} This uses the proxy server. Keep it running with:\\n npx @_davideast/stitch-mcp proxy\\n`\n : '';\n\n const tokenHint = (transport === 'http' && !apiKey)\n ? `\\n${theme.yellow('To get your access token, run:')}\\n` +\n ` CLOUDSDK_CONFIG=~/.stitch-mcp/config ~/.stitch-mcp/google-cloud-sdk/bin/gcloud auth print-access-token\\n` +\n `\\n${theme.yellow('Important:')} Replace ${theme.blue('<YOUR_ACCESS_TOKEN>')} in the config with the token from the command above.\\n` +\n `Access tokens expire after 1 hour. Consider using ${theme.blue('stdio')} transport for automatic refresh.\\n`\n : '';\n\n const vscodeTokenHint = (transport === 'http' && !apiKey)\n ? `\\n${theme.yellow('To get your access token, run:')}\\n` +\n ` CLOUDSDK_CONFIG=~/.stitch-mcp/config ~/.stitch-mcp/google-cloud-sdk/bin/gcloud auth print-access-token\\n` +\n `\\n${theme.yellow('Important:')} When prompted, paste the token from the command above.\\n` +\n `Access tokens expire after 1 hour. Consider using ${theme.blue('stdio')} transport for automatic refresh.\\n`\n : '';\n\n switch (client) {\n case 'antigravity':\n if (transport === 'stdio') {\n return (\n baseInstructions +\n transportNote +\n `\\n${theme.green('Next Steps for Antigravity:')}\\n` +\n `1. In the Agent Panel, click the three dots in the top right\\n` +\n `2. Select \"MCP Servers\" → \"Manage MCP Servers\"\\n` +\n `3. Select \"View raw config\" and add the above configuration\\n` +\n `4. Restart Antigravity to load the configuration\\n`\n );\n }\n return (\n baseInstructions +\n tokenHint +\n `\\n${theme.green('Next Steps for Antigravity:')}\\n` +\n `1. In the Agent Panel, click the three dots in the top right\\n` +\n `2. Select \"MCP Servers\" → \"Manage MCP Servers\"\\n` +\n `3. Select \"View raw config\" and add the above configuration\\n` +\n `4. Restart Antigravity to load the configuration\\n`\n );\n\n case 'vscode':\n if (transport === 'stdio') {\n return (\n baseInstructions +\n `\\n${theme.green('Next Steps for VSCode:')}\\n` +\n `1. Open the Command Palette (Ctrl+Shift+P or Cmd+Shift+P)\\n` +\n `2. Run \"MCP: Open User Configuration\" or \"MCP: Open Workspace Folder Configuration\"\\n` +\n `3. Add the above configuration to the mcp.json file\\n` +\n `4. VS Code will automatically start the proxy server when needed\\n`\n );\n }\n return (\n baseInstructions +\n vscodeTokenHint +\n `\\n${theme.green('Next Steps for VSCode:')}\\n` +\n `1. Open the Command Palette (Ctrl+Shift+P or Cmd+Shift+P)\\n` +\n `2. Run \"MCP: Open User Configuration\" or \"MCP: Open Workspace Folder Configuration\"\\n` +\n `3. Add the above configuration to the mcp.json file\\n` +\n (apiKey ? '' : `4. When prompted, paste the access token from the command above\\n`) +\n `5. Restart VS Code or run \"MCP: List Servers\" to start the server\\n`\n );\n\n case 'cursor':\n if (transport === 'stdio') {\n return (\n baseInstructions +\n transportNote +\n `\\n${theme.green('Next Steps for Cursor:')}\\n` +\n `1. Create a .cursor/mcp.json file in your project root\\n` +\n `2. Add the above configuration to the file\\n` +\n `3. Restart Cursor to load the configuration\\n`\n );\n }\n return (\n baseInstructions +\n tokenHint +\n `\\n${theme.green('Next Steps for Cursor:')}\\n` +\n `1. Create a .cursor/mcp.json file in your project root\\n` +\n `2. Add the above configuration to the file\\n` +\n `3. Restart Cursor to load the configuration\\n`\n );\n\n case 'claude-code':\n if (transport === 'stdio') {\n let envHint = '';\n if (apiKey) {\n envHint = `${theme.blue(` -e STITCH_API_KEY=${apiKey} \\\\`)}\\n`;\n } else if (projectId) {\n envHint = `${theme.blue(` -e STITCH_PROJECT_ID=${projectId} \\\\`)}\\n`;\n }\n return (\n transportNote +\n `\\n${theme.green('Setup Claude Code:')}\\n\\n` +\n `Run the following command to add the Stitch MCP server:\\n\\n` +\n `${theme.blue('claude mcp add stitch \\\\')}\\n` +\n envHint +\n `${theme.blue(' -- npx @_davideast/stitch-mcp proxy')}`\n );\n } else {\n if (apiKey) {\n return (\n `\\n${theme.green('Setup Claude Code:')}\\n\\n` +\n `Run the following command to add the Stitch MCP server:\\n\\n` +\n `${theme.blue('claude mcp add stitch \\\\')}\\n` +\n `${theme.blue(' --transport http https://stitch.googleapis.com/mcp \\\\')}\\n` +\n `${theme.blue(` --header \"X-Goog-Api-Key: ${apiKey}\" \\\\`)}\\n` +\n `${theme.blue(' -s user')}\\n\\n` +\n `${theme.yellow('Note:')} -s user saves to $HOME/.claude.json, use -s project for ./.mcp.json\\n`\n );\n }\n return (\n tokenHint +\n `\\n${theme.green('Setup Claude Code:')}\\n\\n` +\n `Run the following command to add the Stitch MCP server:\\n\\n` +\n `${theme.blue('claude mcp add stitch \\\\')}\\n` +\n `${theme.blue(' --transport http https://stitch.googleapis.com/mcp \\\\')}\\n` +\n `${theme.blue(' --header \"Authorization: Bearer <YOUR_ACCESS_TOKEN>\" \\\\')}\\n` +\n `${theme.blue(` --header \"X-Goog-User-Project: ${projectId}\" \\\\`)}\\n` +\n `${theme.blue(' -s user')}\\n\\n` +\n `${theme.yellow('Note:')} -s user saves to $HOME/.claude.json, use -s project for ./.mcp.json\\n`\n );\n }\n\n case 'gemini-cli':\n return (\n transportNote +\n `\\n${theme.green('Setup Gemini CLI:')}\\n\\n` +\n `Install the Stitch extension for the Gemini CLI:\\n\\n` +\n `${theme.blue('gemini extensions install https://github.com/gemini-cli-extensions/stitch')}\\n`\n );\n\n case 'codex': {\n const isHttp = transport === 'http';\n let configBlock: string;\n\n if (isHttp) {\n if (apiKey) {\n configBlock = [\n '[mcp_servers.stitch]',\n 'url = \"https://stitch.googleapis.com/mcp\"',\n '',\n '[mcp_servers.stitch.env_http_headers]',\n `X-Goog-Api-Key = \"${apiKey}\"`,\n ].join('\\n');\n } else {\n configBlock = [\n '[mcp_servers.stitch]',\n 'url = \"https://stitch.googleapis.com/mcp\"',\n 'bearer_token_env_var = \"STITCH_ACCESS_TOKEN\"',\n '',\n '[mcp_servers.stitch.env_http_headers]',\n 'X-Goog-User-Project = \"GOOGLE_CLOUD_PROJECT\"',\n ].join('\\n');\n }\n } else {\n // stdio transport\n if (apiKey) {\n configBlock = [\n '[mcp_servers.stitch]',\n 'command = \"npx\"',\n 'args = [\"@_davideast/stitch-mcp\", \"proxy\"]',\n '',\n '[mcp_servers.stitch.env]',\n `STITCH_API_KEY = \"${apiKey}\"`,\n ].join('\\n');\n } else {\n configBlock = [\n '[mcp_servers.stitch]',\n 'command = \"npx\"',\n 'args = [\"@_davideast/stitch-mcp\", \"proxy\"]',\n '',\n '[mcp_servers.stitch.env]',\n `STITCH_PROJECT_ID = \"${projectId}\"`,\n ].join('\\n');\n }\n }\n\n const note = isHttp && !apiKey\n ? `${theme.yellow('Note:')} Direct mode requires a valid access token in ${theme.blue('STITCH_ACCESS_TOKEN')} and a project id in ${theme.blue('GOOGLE_CLOUD_PROJECT')}.\\n`\n : `${theme.yellow('Note:')} Proxy mode handles token refresh automatically.\\n`;\n\n return (\n `\\n${theme.green('Setup Codex CLI:')}\\n\\n` +\n `Add this to ${theme.blue('~/.codex/config.toml')}:\\n\\n` +\n `${configBlock}\\n\\n` +\n note\n );\n }\n\n case 'opencode': {\n const fileName = transport === 'http' ? 'opencode.json' : 'opencode.json';\n return (\n baseInstructions +\n transportNote +\n `\\n${theme.green('Setup OpenCode:')}\\n\\n` +\n `1. Add the above configuration to ${theme.blue(fileName)} in your project root\\n` +\n `2. If using HTTP transport, OpenCode will automatically handle OAuth when you first use the MCP server\\n` +\n `3. If using STDIO transport, make sure the proxy server is running with:\\n` +\n ` ${theme.blue('npx @_davideast/stitch-mcp proxy')}\\n\\n` +\n `${theme.gray('Note:')} You can now use Stitch tools by adding \"use the stitch tool\" to your prompts.\\n`\n );\n }\n\n default:\n return baseInstructions + transportNote + `\\n${theme.yellow('Add this configuration to your MCP client.')}\\n`;\n }\n }\n}\n",
|
|
7
|
+
"import type {\n ChecklistUI,\n ChecklistConfig,\n ChecklistItem,\n UpdateItemInput,\n UpdateResult,\n RenderResult,\n ChecklistItemStateType\n} from './spec.js';\nimport { theme } from '../theme.js';\n\n// State icons\nconst STATE_ICONS: Record<ChecklistItemStateType, string> = {\n PENDING: '○',\n IN_PROGRESS: '▸',\n COMPLETE: '✓',\n SKIPPED: '−',\n FAILED: '✗',\n};\n\ninterface ItemState {\n state: ChecklistItemStateType;\n detail?: string;\n reason?: string;\n}\n\nexport class ChecklistUIHandler implements ChecklistUI {\n private config!: ChecklistConfig;\n private states: Map<string, ItemState> = new Map();\n private lastOutputLines = 0;\n\n initialize(config: ChecklistConfig): void {\n this.config = config;\n this.states.clear();\n\n // Initialize all items as PENDING\n const initItem = (item: ChecklistItem) => {\n this.states.set(item.id, { state: 'PENDING' });\n item.children?.forEach(initItem);\n };\n config.items.forEach(initItem);\n }\n\n updateItem(input: UpdateItemInput): UpdateResult {\n const current = this.states.get(input.itemId);\n\n if (!current) {\n return {\n success: false,\n error: {\n code: 'ITEM_NOT_FOUND',\n message: `Item \"${input.itemId}\" not found`,\n recoverable: false,\n },\n };\n }\n\n const previousState = current.state;\n this.states.set(input.itemId, {\n state: input.state,\n detail: input.detail,\n reason: input.reason,\n });\n\n return {\n success: true,\n data: {\n itemId: input.itemId,\n previousState,\n newState: input.state,\n },\n };\n }\n\n render(): RenderResult {\n try {\n const lines: string[] = [];\n const { completed, total, percent } = this.getProgress();\n\n // Header\n lines.push(`🧵 ${this.config.title}`);\n lines.push('');\n\n // Items\n this.config.items.forEach((item, idx) => {\n const state = this.states.get(item.id)!;\n const icon = STATE_ICONS[state.state];\n const color = this.getStateColor(state.state);\n\n let line = ` ${color(icon)} ${idx + 1}. ${item.label}`;\n if (state.detail) {\n line += ` ${theme.gray('·')} ${state.detail}`;\n }\n lines.push(line);\n\n if (state.reason) {\n lines.push(` └─ ${theme.gray(state.reason)}`);\n }\n });\n\n // Progress bar\n if (this.config.showProgress) {\n lines.push('');\n const barWidth = 40;\n const filled = Math.round((percent / 100) * barWidth);\n const bar = '━'.repeat(filled) + '─'.repeat(barWidth - filled);\n lines.push(` ${bar} ${percent}%`);\n }\n\n return {\n success: true,\n data: {\n output: lines.join('\\n'),\n completedCount: completed,\n totalCount: total,\n percentComplete: percent,\n },\n };\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'RENDER_FAILED',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n }\n }\n\n print(options?: { clearPrevious?: boolean }): void {\n if (options?.clearPrevious && this.lastOutputLines > 0) {\n // Move cursor up and clear lines\n process.stdout.write(`\\x1b[${this.lastOutputLines}A\\x1b[0J`);\n }\n\n const result = this.render();\n if (result.success) {\n console.log(result.data.output);\n this.lastOutputLines = result.data.output.split('\\n').length;\n }\n }\n\n getProgress(): { completed: number; total: number; percent: number } {\n const total = this.states.size;\n let completed = 0;\n\n this.states.forEach(state => {\n if (state.state === 'COMPLETE' || state.state === 'SKIPPED') {\n completed++;\n }\n });\n\n return {\n completed,\n total,\n percent: Math.round((completed / total) * 100),\n };\n }\n\n isComplete(): boolean {\n for (const state of this.states.values()) {\n if (state.state === 'PENDING' || state.state === 'IN_PROGRESS') {\n return false;\n }\n }\n return true;\n }\n\n private getStateColor(state: ChecklistItemStateType) {\n switch (state) {\n case 'COMPLETE': return theme.green;\n case 'SKIPPED': return theme.gray;\n case 'FAILED': return theme.red;\n case 'IN_PROGRESS': return theme.yellow;\n default: return theme.gray;\n }\n }\n}\n\n/**\n * Create a new ChecklistUI instance\n */\nexport function createChecklistUI(): ChecklistUI {\n return new ChecklistUIHandler();\n}\n",
|
|
8
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type InitContext } from '../context.js';\nimport { type McpClient } from '../../../ui/wizard.js';\n\nexport class ClientSelectionStep implements CommandStep<InitContext> {\n id = 'mcp-client';\n name = 'Select MCP client';\n\n async shouldRun(context: InitContext): Promise<boolean> {\n return true;\n }\n\n async run(context: InitContext): Promise<StepResult> {\n if (context.input.client) {\n try {\n context.mcpClient = this.resolveMcpClient(context.input.client);\n return {\n success: true,\n detail: context.mcpClient,\n status: 'SKIPPED',\n reason: 'Set via --client flag'\n };\n } catch (e) {\n return {\n success: false,\n error: e instanceof Error ? e : new Error(String(e))\n };\n }\n }\n\n context.mcpClient = await context.ui.promptMcpClient();\n return {\n success: true,\n detail: context.mcpClient\n };\n }\n\n private resolveMcpClient(input: string): McpClient {\n const map: Record<string, McpClient> = {\n 'antigravity': 'antigravity', 'agy': 'antigravity',\n 'vscode': 'vscode', 'vsc': 'vscode',\n 'cursor': 'cursor', 'cur': 'cursor',\n 'claude-code': 'claude-code', 'cc': 'claude-code',\n 'gemini-cli': 'gemini-cli', 'gcli': 'gemini-cli',\n 'codex': 'codex', 'cdx': 'codex',\n 'opencode': 'opencode', 'opc': 'opencode'\n };\n\n const normalized = input.trim().toLowerCase();\n const client = map[normalized];\n if (!client) {\n throw new Error(`Invalid client '${input}'. Supported: antigravity (agy), vscode (vsc), cursor (cur), claude-code (cc), gemini-cli (gcli), codex (cdx), opencode (opc)`);\n }\n return client;\n }\n}\n",
|
|
9
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type InitContext } from '../context.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport class AuthModeStep implements CommandStep<InitContext> {\n id = 'authentication-mode';\n name = 'Select Authentication Mode';\n\n async shouldRun(context: InitContext): Promise<boolean> {\n return true;\n }\n\n async run(context: InitContext): Promise<StepResult> {\n const authMode = await context.ui.promptAuthMode();\n context.authMode = authMode;\n\n if (authMode === 'apiKey') {\n const storage = await context.ui.promptApiKeyStorage();\n if (storage === 'config') {\n context.apiKey = await context.ui.promptApiKey();\n } else if (storage === 'skip') {\n context.apiKey = 'YOUR-API-KEY';\n } else if (storage === '.env') {\n const inputKey = await context.ui.promptApiKey();\n context.apiKey = 'YOUR-API-KEY';\n\n // Handle .env file\n const envPath = path.join(process.cwd(), '.env');\n const envContent = `\\nSTITCH_API_KEY=${inputKey}\\n`;\n\n try {\n // fs.promises.writeFile with mode 0o600 creates the file with restricted permissions\n await fs.promises.writeFile(envPath, envContent, { flag: 'a', mode: 0o600 });\n\n // Handle .gitignore\n const gitignorePath = path.join(process.cwd(), '.gitignore');\n try {\n const gitignoreContent = await fs.promises.readFile(gitignorePath, 'utf8');\n if (!gitignoreContent.includes('.env')) {\n await fs.promises.appendFile(gitignorePath, '\\n.env\\n');\n }\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n await fs.promises.writeFile(gitignorePath, '.env\\n');\n } else {\n throw err;\n }\n }\n } catch (e) {\n context.ui.warn(`Warning: Failed to update .env or .gitignore: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n return {\n success: true,\n detail: 'API Key',\n status: 'COMPLETE'\n };\n }\n\n return {\n success: true,\n detail: 'OAuth',\n status: 'COMPLETE'\n };\n }\n}\n",
|
|
10
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type InitContext } from '../context.js';\n\nexport class GcloudInstallStep implements CommandStep<InitContext> {\n id = 'gcloud-cli';\n name = 'Install Google Cloud CLI';\n\n async shouldRun(context: InitContext): Promise<boolean> {\n return context.authMode !== 'apiKey';\n }\n\n async run(context: InitContext): Promise<StepResult> {\n if (context.authMode === 'apiKey') {\n return { success: true, status: 'SKIPPED', reason: 'Not required for API Key' };\n }\n\n const gcloudResult = await context.gcloudService.ensureInstalled({\n minVersion: '400.0.0',\n forceLocal: context.input.local,\n });\n\n if (!gcloudResult.success) {\n return {\n success: false,\n error: new Error(gcloudResult.error.message),\n detail: gcloudResult.error.message\n };\n }\n\n return {\n success: true,\n detail: `v${gcloudResult.data.version} (${gcloudResult.data.location})`\n };\n }\n}\n",
|
|
11
|
+
"import fs from 'node:fs';\n\nexport interface EnvironmentInfo {\n isWSL: boolean;\n isSSH: boolean;\n isDocker: boolean;\n isCloudShell: boolean;\n hasDisplay: boolean;\n needsNoBrowser: boolean;\n reason?: string;\n}\n\n/**\n * Detect if running in WSL (Windows Subsystem for Linux)\n */\nfunction detectWSL(): boolean {\n try {\n const procVersion = fs.readFileSync('/proc/version', 'utf8').toLowerCase();\n return procVersion.includes('microsoft') || procVersion.includes('wsl');\n } catch {\n return false;\n }\n}\n\n/**\n * Detect if running in an SSH session\n */\nfunction detectSSH(): boolean {\n return Boolean(process.env.SSH_CLIENT || process.env.SSH_TTY || process.env.SSH_CONNECTION);\n}\n\n/**\n * Detect if running inside Docker\n */\nfunction detectDocker(): boolean {\n try {\n return fs.existsSync('/.dockerenv');\n } catch {\n return false;\n }\n}\n\n/**\n * Detect if running in Google Cloud Shell\n */\nfunction detectCloudShell(): boolean {\n return Boolean(process.env.CLOUD_SHELL);\n}\n\n/**\n * Detect if a display is available (X11/Wayland)\n */\nfunction detectDisplay(): boolean {\n return Boolean(process.env.DISPLAY || process.env.WAYLAND_DISPLAY);\n}\n\n/**\n * Detect environment characteristics that affect browser auth\n */\nexport function detectEnvironment(): EnvironmentInfo {\n const isWSL = detectWSL();\n const isSSH = detectSSH();\n const isDocker = detectDocker();\n const isCloudShell = detectCloudShell();\n const hasDisplay = detectDisplay();\n\n // Determine if --no-browser is needed\n let needsNoBrowser = false;\n let reason: string | undefined;\n\n if (isWSL) {\n needsNoBrowser = true;\n reason = 'WSL detected - browser redirect to localhost may not work';\n } else if (isSSH && !hasDisplay) {\n needsNoBrowser = true;\n reason = 'SSH session without display forwarding';\n } else if (isDocker) {\n needsNoBrowser = true;\n reason = 'Docker container detected';\n } else if (isCloudShell) {\n needsNoBrowser = true;\n reason = 'Cloud Shell detected';\n } else if (!hasDisplay) {\n needsNoBrowser = true;\n reason = 'No display detected (headless environment)';\n }\n\n return {\n isWSL,\n isSSH,\n isDocker,\n isCloudShell,\n hasDisplay,\n needsNoBrowser,\n reason,\n };\n}\n",
|
|
12
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type InitContext } from '../context.js';\nimport { detectEnvironment } from '../../../platform/environment.js';\nimport path from 'node:path';\nimport { theme } from '../../../ui/theme.js';\n\nexport class AuthStep implements CommandStep<InitContext> {\n id = 'authentication';\n name = 'Authenticate with Google';\n\n async shouldRun(context: InitContext): Promise<boolean> {\n return context.authMode !== 'apiKey';\n }\n\n async run(context: InitContext): Promise<StepResult> {\n if (context.authMode === 'apiKey') {\n return { success: true, status: 'SKIPPED', reason: 'Using API Key' };\n }\n\n // Detect environment for auth guidance\n const env = detectEnvironment();\n if (env.needsNoBrowser && env.reason) {\n context.ui.warn(`\\n ⚠ ${env.reason}`);\n context.ui.log(' If browser auth fails, copy the URL from terminal and open manually.\\n');\n }\n\n // Check existing auth state\n const existingAccount = await context.gcloudService.getActiveAccount();\n const hasADC = await context.gcloudService.hasADC();\n\n if (existingAccount && hasADC) {\n context.authAccount = existingAccount;\n return {\n success: true,\n detail: existingAccount,\n status: 'SKIPPED',\n reason: 'Already authenticated'\n };\n }\n\n const gcloudInfo = await context.gcloudService.ensureInstalled({\n minVersion: '400.0.0',\n forceLocal: context.input.local\n });\n if (!gcloudInfo.success) return { success: false, error: new Error('Gcloud not found') };\n\n const isBundled = gcloudInfo.data.location === 'bundled';\n const gcloudBinDir = path.dirname(gcloudInfo.data.path);\n let configPrefix = '';\n\n if (isBundled) {\n const configPath = path.dirname(gcloudBinDir) + '/../config';\n configPrefix = `CLOUDSDK_CONFIG=\"${configPath}\"`;\n\n context.ui.warn('\\nConfigure gcloud PATH\\n');\n context.ui.log(' Open a NEW terminal tab/window and run this command:\\n');\n context.ui.log(theme.cyan(` export PATH=\"${gcloudBinDir}:$PATH\"\\n`));\n\n try {\n const { default: clipboard } = await import('clipboardy');\n await clipboard.write(`export PATH=\"${gcloudBinDir}:$PATH\"`);\n context.ui.log(theme.gray(' (copied to clipboard)'));\n } catch { /* clipboard not available */ }\n\n await context.ui.promptConfirm('Press Enter when complete', true);\n }\n\n // User auth\n if (!existingAccount) {\n context.ui.warn('\\nAuthenticate with Google Cloud\\n');\n context.ui.log(theme.cyan(` ${configPrefix} gcloud auth login\\n`));\n await context.ui.promptConfirm('Press Enter when complete', true);\n }\n\n // ADC auth\n if (!hasADC) {\n context.ui.warn('\\nAuthorize Application Default Credentials\\n');\n context.ui.log(theme.cyan(` ${configPrefix} gcloud auth application-default login\\n`));\n await context.ui.promptConfirm('Press Enter when complete', true);\n }\n\n const verifyAccount = await context.gcloudService.getActiveAccount();\n if (!verifyAccount) {\n return {\n success: false,\n error: new Error('No authenticated account found after setup'),\n detail: 'No account found',\n errorCode: 'AUTH_FAILED'\n };\n }\n context.authAccount = verifyAccount;\n\n return {\n success: true,\n detail: verifyAccount\n };\n }\n}\n",
|
|
13
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type InitContext } from '../context.js';\n\nexport class TransportStep implements CommandStep<InitContext> {\n id = 'connection-method';\n name = 'Choose connection method';\n\n async shouldRun(context: InitContext): Promise<boolean> {\n return true;\n }\n\n async run(context: InitContext): Promise<StepResult> {\n if (context.input.transport) {\n context.transport = this.resolveTransport(context.input.transport);\n const transportLabel = context.transport === 'http' ? 'Direct' : 'Proxy';\n return {\n success: true,\n detail: transportLabel,\n status: 'SKIPPED',\n reason: 'Set via --transport flag'\n };\n }\n\n context.transport = await context.ui.promptTransportType(context.authMode);\n const transportLabel = context.transport === 'http' ? 'Direct' : 'Proxy';\n return {\n success: true,\n detail: transportLabel\n };\n }\n\n private resolveTransport(input: string): 'http' | 'stdio' {\n const normalized = input.trim().toLowerCase();\n if (normalized === 'http') return 'http';\n if (normalized === 'stdio') return 'stdio';\n throw new Error(`Invalid transport '${input}'. Supported: http, stdio`);\n }\n}\n",
|
|
14
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type InitContext } from '../context.js';\nimport { type ProjectSelectionResult } from '../../../services/project/spec.js';\n\nexport class ProjectSelectStep implements CommandStep<InitContext> {\n id = 'project-selection';\n name = 'Select Google Cloud project';\n\n async shouldRun(context: InitContext): Promise<boolean> {\n return context.authMode !== 'apiKey';\n }\n\n async run(context: InitContext): Promise<StepResult> {\n if (context.authMode === 'apiKey') {\n return { success: true, status: 'SKIPPED', reason: 'Not required for API Key' };\n }\n\n let projectResult: ProjectSelectionResult | null = null;\n const activeProjectId = await context.gcloudService.getProjectId();\n\n if (activeProjectId) {\n const detailsResult = await context.projectService.getProjectDetails({ projectId: activeProjectId });\n if (detailsResult.success) {\n const useActive = (context.input.defaults || context.input.autoVerify) ? true : await context.ui.promptConfirm(\n `Use active project: ${detailsResult.data.name} (${detailsResult.data.projectId})?`,\n true\n );\n if (useActive) {\n projectResult = detailsResult;\n }\n }\n }\n\n if (!projectResult) {\n projectResult = await context.projectService.selectProject({\n allowSearch: true,\n limit: 5,\n });\n }\n\n if (!projectResult.success) {\n const error = (projectResult as any).error || { message: 'Unknown error' };\n return { success: false, error: new Error(error.message) };\n }\n\n // Set active project\n const setProjectResult = await context.gcloudService.setProject({\n projectId: projectResult.data.projectId,\n });\n\n if (!setProjectResult.success) {\n const error = (setProjectResult as any).error || { message: 'Unknown error' };\n return { success: false, error: new Error(error.message) };\n }\n\n context.projectId = projectResult.data.projectId;\n return {\n success: true,\n detail: context.projectId\n };\n }\n}\n",
|
|
15
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type InitContext } from '../context.js';\n\nexport class IamApiStep implements CommandStep<InitContext> {\n id = 'iam-and-api';\n name = 'Configure IAM & enable API';\n\n async shouldRun(context: InitContext): Promise<boolean> {\n return context.authMode !== 'apiKey';\n }\n\n async run(context: InitContext): Promise<StepResult> {\n if (context.authMode === 'apiKey') {\n return { success: true, status: 'SKIPPED', reason: 'Not required for API Key' };\n }\n\n if (!context.projectId || !context.authAccount) {\n return { success: false, error: new Error('Project ID or Auth Account missing') };\n }\n\n // Check IAM\n const hasIAMRole = await context.stitchService.checkIAMRole({\n projectId: context.projectId,\n userEmail: context.authAccount,\n });\n\n if (!hasIAMRole) {\n const shouldConfigureIam = context.input.autoVerify || await context.ui.promptConfirm(\n 'Add the required IAM role to your account?',\n true\n );\n\n if (shouldConfigureIam) {\n await context.stitchService.configureIAM({\n projectId: context.projectId,\n userEmail: context.authAccount,\n });\n }\n }\n\n await context.gcloudService.installBetaComponents();\n\n const isApiEnabled = await context.stitchService.checkAPIEnabled({\n projectId: context.projectId,\n });\n\n if (!isApiEnabled) {\n await context.stitchService.enableAPI({\n projectId: context.projectId,\n });\n }\n\n context.accessToken = await context.gcloudService.getAccessToken() || undefined;\n if (!context.accessToken) {\n return { success: false, error: new Error('Could not obtain access token') };\n }\n\n return { success: true, detail: 'Ready' };\n }\n}\n",
|
|
16
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type InitContext } from '../context.js';\nimport { createSpinner } from '../../../ui/spinner.js';\nimport { theme } from '../../../ui/theme.js';\nimport { execCommand } from '../../../platform/shell.js';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport class ConfigStep implements CommandStep<InitContext> {\n id = 'mcp-config';\n name = 'Generate MCP configuration';\n\n async shouldRun(context: InitContext): Promise<boolean> {\n return true;\n }\n\n async run(context: InitContext): Promise<StepResult> {\n // Special setup for Gemini CLI\n if (context.mcpClient === 'gemini-cli') {\n await this.setupGeminiExtension(context);\n }\n\n const configResult = await context.mcpConfigService.generateConfig({\n client: context.mcpClient!,\n projectId: context.projectId || 'ignored-project-id',\n accessToken: context.accessToken,\n transport: context.transport!,\n authMode: context.authMode!,\n apiKey: context.apiKey,\n });\n\n if (!configResult.success) {\n const error = (configResult as any).error || { message: 'Unknown error' };\n return { success: false, error: new Error(error.message) };\n }\n\n context.instructions = configResult.data.instructions;\n context.finalConfig = configResult.data.config;\n\n return { success: true, detail: 'Generated' };\n }\n\n private async setupGeminiExtension(context: InitContext): Promise<void> {\n const spinner = createSpinner();\n const extensionPath = path.join(os.homedir(), '.gemini', 'extensions', 'Stitch', 'gemini-extension.json');\n let isInstalled = false;\n try {\n await fs.promises.access(extensionPath);\n isInstalled = true;\n } catch {\n isInstalled = false;\n }\n\n if (isInstalled) {\n spinner.succeed('Stitch extension is already installed');\n } else {\n context.ui.log(theme.gray(' > gemini extensions install https://github.com/gemini-cli-extensions/stitch'));\n\n const shouldInstall = await context.ui.promptConfirm(\n 'Run this command?',\n true\n );\n\n if (shouldInstall) {\n spinner.start('Installing Stitch extension...');\n\n const installResult = await execCommand(['gemini', 'extensions', 'install', 'https://github.com/gemini-cli-extensions/stitch']);\n\n if (!installResult.success) {\n spinner.fail('Failed to install Stitch extension');\n context.ui.log(theme.red(` Error: ${installResult.stderr || installResult.error}`));\n context.ui.log(theme.gray(' Attempting to configure existing extension...'));\n } else {\n spinner.succeed('Extension installed');\n }\n }\n }\n\n spinner.start('Configuring extension...');\n\n try {\n await fs.promises.access(extensionPath);\n } catch {\n spinner.fail('Extension configuration file not found');\n context.ui.log(theme.gray(` Expected path: ${extensionPath}`));\n return;\n }\n\n try {\n const content = await fs.promises.readFile(extensionPath, 'utf8');\n const config = JSON.parse(content);\n\n if (!config.mcpServers?.stitch) {\n spinner.fail('Invalid extension configuration format detected');\n return;\n }\n\n if (context.transport === 'stdio') {\n const env: Record<string, string> = {\n PATH: process.env.PATH || '',\n };\n\n if (context.apiKey) {\n env.STITCH_API_KEY = context.apiKey;\n } else {\n env.STITCH_PROJECT_ID = context.projectId!;\n }\n\n config.mcpServers.stitch = {\n command: 'npx',\n args: ['@_davideast/stitch-mcp', 'proxy'],\n env,\n };\n\n await fs.promises.writeFile(extensionPath, JSON.stringify(config, null, 4));\n const successMsg = context.apiKey\n ? 'Stitch extension configured for STDIO with API Key'\n : `Stitch extension configured for STDIO: Project ID set to ${theme.blue(context.projectId!)}`;\n spinner.succeed(successMsg);\n } else {\n // HTTP\n const existingHeaders = config.mcpServers.stitch.headers || {};\n if (context.apiKey) {\n config.mcpServers.stitch = {\n url: 'https://stitch.googleapis.com/mcp',\n headers: {\n ...existingHeaders,\n 'X-Goog-Api-Key': context.apiKey,\n },\n };\n // Ensure optional deletion of other headers if they were there\n delete config.mcpServers.stitch.headers['Authorization'];\n delete config.mcpServers.stitch.headers['X-Goog-User-Project'];\n\n await fs.promises.writeFile(extensionPath, JSON.stringify(config, null, 4));\n spinner.succeed(`Stitch extension configured for HTTP with API Key`);\n } else {\n config.mcpServers.stitch = {\n url: 'https://stitch.googleapis.com/mcp',\n headers: {\n 'Authorization': 'Bearer $STITCH_ACCESS_TOKEN',\n ...existingHeaders,\n 'X-Goog-User-Project': context.projectId!,\n },\n };\n await fs.promises.writeFile(extensionPath, JSON.stringify(config, null, 4));\n spinner.succeed(`Stitch extension configured for HTTP: Project ID set to ${theme.blue(context.projectId!)}`);\n }\n }\n\n context.ui.log(theme.gray(` File: ${extensionPath}`));\n\n } catch (e) {\n spinner.fail('Failed to update extension configuration');\n context.ui.log(theme.red(` Error: ${e instanceof Error ? e.message : String(e)}`));\n }\n }\n}\n",
|
|
17
|
+
"import { type CommandStep, type StepResult } from '../../../framework/CommandStep.js';\nimport { type InitContext } from '../context.js';\nimport { theme, icons } from '../../../ui/theme.js';\n\nexport class TestConnectionStep implements CommandStep<InitContext> {\n id = 'connection-test';\n name = 'Test connection';\n\n async shouldRun(context: InitContext): Promise<boolean> {\n return context.authMode === 'oauth';\n }\n\n async run(context: InitContext): Promise<StepResult> {\n if (context.authMode !== 'oauth') {\n return { success: true, status: 'SKIPPED', reason: 'Not supported for API Key yet' };\n }\n if (!context.accessToken) {\n // Should have been caught before\n return { success: false, status: 'SKIPPED', reason: 'No access token' };\n }\n\n const testResult = await context.stitchService.testConnection({\n projectId: context.projectId!,\n accessToken: context.accessToken,\n });\n\n if (!testResult.success) {\n const error = (testResult as any).error || { message: 'Unknown error', suggestion: '' };\n context.ui.log(theme.red(`\\n ${icons.error} Error: ${error.message}`));\n context.ui.warn(` ${error.suggestion}`);\n return {\n success: false,\n detail: error.message,\n error: new Error(error.message)\n };\n }\n\n return { success: true, detail: `${testResult.data.statusCode} OK` };\n }\n}\n",
|
|
18
|
+
"import { type InitCommand, type InitInput, type InitResult } from './spec.js';\nimport { GcloudHandler } from '../../services/gcloud/handler.js';\nimport { type GcloudService } from '../../services/gcloud/spec.js';\nimport { ProjectHandler } from '../../services/project/handler.js';\nimport { type ProjectService } from '../../services/project/spec.js';\nimport { StitchHandler } from '../../services/stitch/handler.js';\nimport { type StitchService } from '../../services/stitch/spec.js';\nimport { McpConfigHandler } from '../../services/mcp-config/handler.js';\nimport { type McpConfigService } from '../../services/mcp-config/spec.js';\nimport { ChecklistUIHandler } from '../../ui/checklist/handler.js';\nimport { theme } from '../../ui/theme.js';\nimport { ConsoleUI } from '../../framework/ConsoleUI.js';\nimport { type UserInterface } from '../../framework/UserInterface.js';\nimport { type InitContext } from './context.js';\nimport { type CommandStep } from '../../framework/CommandStep.js';\nimport { type ChecklistItemStateType } from '../../ui/checklist/spec.js';\nimport { runSteps } from '../../framework/StepRunner.js';\n\nimport { ClientSelectionStep } from './steps/ClientSelectionStep.js';\nimport { AuthModeStep } from './steps/AuthModeStep.js';\nimport { GcloudInstallStep } from './steps/GcloudInstallStep.js';\nimport { AuthStep } from './steps/AuthStep.js';\nimport { TransportStep } from './steps/TransportStep.js';\nimport { ProjectSelectStep } from './steps/ProjectSelectStep.js';\nimport { IamApiStep } from './steps/IamApiStep.js';\nimport { ConfigStep } from './steps/ConfigStep.js';\nimport { TestConnectionStep } from './steps/TestConnectionStep.js';\n\nexport class InitHandler implements InitCommand {\n private readonly gcloudService: GcloudService;\n private readonly mcpConfigService: McpConfigService;\n private readonly projectService: ProjectService;\n private readonly stitchService: StitchService;\n private readonly ui: UserInterface;\n private checklist: ChecklistUIHandler;\n private steps: CommandStep<InitContext>[];\n\n constructor(\n gcloudService?: GcloudService,\n mcpConfigService?: McpConfigService,\n projectService?: ProjectService,\n stitchService?: StitchService,\n ui?: UserInterface\n ) {\n this.gcloudService = gcloudService || new GcloudHandler();\n this.mcpConfigService = mcpConfigService || new McpConfigHandler();\n this.projectService = projectService || new ProjectHandler(this.gcloudService);\n this.stitchService = stitchService || new StitchHandler();\n this.checklist = new ChecklistUIHandler();\n this.ui = ui || new ConsoleUI();\n\n this.steps = [\n new ClientSelectionStep(),\n new AuthModeStep(),\n new GcloudInstallStep(),\n new AuthStep(),\n new TransportStep(),\n new ProjectSelectStep(),\n new IamApiStep(),\n new ConfigStep(),\n new TestConnectionStep(),\n ];\n }\n\n async execute(input: InitInput): Promise<InitResult> {\n // Initialize Checklist\n this.checklist.initialize({\n title: 'Stitch MCP Setup',\n items: this.steps.map(s => ({ id: s.id, label: s.name })),\n showProgress: true,\n animationDelayMs: 100,\n });\n\n if (!input.json) console.log(`\\n${theme.blue('🧵 Stitch MCP Setup')}\\n`);\n\n const context: InitContext = {\n input,\n ui: this.ui,\n gcloudService: this.gcloudService,\n mcpConfigService: this.mcpConfigService,\n projectService: this.projectService,\n stitchService: this.stitchService,\n };\n\n try {\n const { stoppedAt } = await runSteps(this.steps, context, {\n onBeforeStep: (step) => { if (!input.json) this.updateStep(step.id, 'IN_PROGRESS'); },\n onAfterStep: (step, result) => {\n if (!result.success) {\n const message = result.error?.message || result.detail || 'Failed';\n if (!input.json) this.updateStep(step.id, 'FAILED', message);\n return true; // stop on failure\n }\n const status = (result.status as ChecklistItemStateType) || 'COMPLETE';\n if (!input.json) this.updateStep(step.id, status, result.detail, result.reason);\n return false;\n },\n onSkippedStep: (step) => { if (!input.json) this.updateStep(step.id, 'SKIPPED', 'Not required'); },\n });\n\n if (stoppedAt) {\n const message = stoppedAt.result.error?.message || stoppedAt.result.detail || 'Failed';\n return {\n success: false,\n error: {\n code: (stoppedAt.result.errorCode as any) || 'UNKNOWN_ERROR',\n message,\n recoverable: true,\n },\n };\n }\n\n const result = {\n success: true as const,\n data: {\n projectId: context.projectId || 'ignored',\n mcpConfig: context.finalConfig || '',\n instructions: context.instructions || '',\n },\n };\n\n if (input.json) {\n console.log(JSON.stringify(result, null, 2));\n return result;\n }\n\n // Human output\n const { percent } = this.checklist.getProgress();\n const barWidth = 40;\n const filled = Math.round((percent / 100) * barWidth);\n const bar = '━'.repeat(filled) + '─'.repeat(barWidth - filled);\n console.log(`\\n ${bar} ${percent}%`);\n\n if (this.checklist.isComplete()) {\n console.log(`\\n${theme.green('🎉 Setup complete!')}\\n`);\n }\n\n if (context.instructions) {\n console.log(context.instructions);\n }\n\n return result;\n\n } catch (error) {\n return {\n success: false,\n error: {\n code: 'UNKNOWN_ERROR',\n message: error instanceof Error ? error.message : String(error),\n recoverable: false,\n },\n };\n }\n }\n\n private updateStep(\n stepId: string,\n state: ChecklistItemStateType,\n detail?: string,\n reason?: string\n ): void {\n this.checklist.updateItem({ itemId: stepId, state, detail, reason });\n if (state !== 'IN_PROGRESS') {\n const step = this.steps.find(s => s.id === stepId);\n this.printStepResult(stepId, step?.name || stepId, state, detail, reason);\n }\n }\n\n private printStepResult(\n stepId: string,\n label: string,\n state: ChecklistItemStateType,\n detail?: string,\n reason?: string\n ): void {\n // Find index for step number\n const stepIndex = this.steps.findIndex(s => s.id === stepId);\n const stepNum = stepIndex + 1;\n\n const icons: Record<ChecklistItemStateType, string> = {\n PENDING: '○',\n IN_PROGRESS: '▸',\n COMPLETE: '✓',\n SKIPPED: '−',\n FAILED: '✗',\n };\n const icon = icons[state];\n\n const colors: Record<ChecklistItemStateType, (s: string) => string> = {\n PENDING: theme.gray,\n IN_PROGRESS: theme.yellow,\n COMPLETE: theme.green,\n SKIPPED: theme.gray,\n FAILED: theme.red,\n };\n const color = colors[state];\n\n let line = ` ${color(icon)} ${stepNum}. ${label}`;\n if (detail) {\n line += ` ${theme.gray('·')} ${detail}`;\n }\n console.log(line);\n\n if (reason) {\n console.log(` └─ ${theme.gray(reason)}`);\n }\n }\n}\n"
|
|
19
|
+
],
|
|
20
|
+
"mappings": "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",
|
|
21
|
+
"debugId": "D9F76D12D96878B564756E2164756E21",
|
|
22
|
+
"names": []
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SiteBuilder
|
|
3
|
+
} from "./chunk-k751yfm6.js";
|
|
4
|
+
import"./chunk-krfqppg2.js";
|
|
5
|
+
import"./chunk-k4xwb3wp.js";
|
|
6
|
+
import"./chunk-abf1r0jh.js";
|
|
7
|
+
import"./chunk-7y4xzvkz.js";
|
|
8
|
+
import"./chunk-4jwmvjb4.js";
|
|
9
|
+
import"./chunk-6gw9apqb.js";
|
|
10
|
+
import"./chunk-a5xra9jn.js";
|
|
11
|
+
import"./chunk-nq68kghz.js";
|
|
12
|
+
import"./chunk-q6sv0243.js";
|
|
13
|
+
import"./chunk-3sfn889r.js";
|
|
14
|
+
import"./chunk-9wyra8hs.js";
|
|
15
|
+
export {
|
|
16
|
+
SiteBuilder
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
//# debugId=1C4BD3D870A3482964756E2164756E21
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import {
|
|
2
|
+
StitchViteServer
|
|
3
|
+
} from "./chunk-nv2j020p.js";
|
|
4
|
+
import"./chunk-w8q7nsm7.js";
|
|
5
|
+
import {
|
|
6
|
+
downloadText
|
|
7
|
+
} from "./chunk-4vxy1qce.js";
|
|
8
|
+
import"./chunk-384jmtpy.js";
|
|
9
|
+
import {
|
|
10
|
+
pLimit
|
|
11
|
+
} from "./chunk-a5xra9jn.js";
|
|
12
|
+
import"./chunk-4jygt4d6.js";
|
|
13
|
+
import"./chunk-tz7wnw4s.js";
|
|
14
|
+
import"./chunk-9wyra8hs.js";
|
|
15
|
+
|
|
16
|
+
// src/commands/serve/json-server/handler.ts
|
|
17
|
+
class JsonServerHandler {
|
|
18
|
+
client;
|
|
19
|
+
downloadHtml;
|
|
20
|
+
constructor(client, downloadHtml = downloadText) {
|
|
21
|
+
this.client = client;
|
|
22
|
+
this.downloadHtml = downloadHtml;
|
|
23
|
+
}
|
|
24
|
+
async execute(input) {
|
|
25
|
+
let sdkScreens;
|
|
26
|
+
try {
|
|
27
|
+
const project = this.client.project(input.projectId);
|
|
28
|
+
sdkScreens = await project.screens();
|
|
29
|
+
} catch (e) {
|
|
30
|
+
return {
|
|
31
|
+
success: false,
|
|
32
|
+
error: { code: "SCREENS_FETCH_FAILED", message: e.message, recoverable: false }
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const server = new StitchViteServer;
|
|
36
|
+
let baseUrl;
|
|
37
|
+
try {
|
|
38
|
+
baseUrl = await server.start(0);
|
|
39
|
+
} catch (e) {
|
|
40
|
+
return {
|
|
41
|
+
success: false,
|
|
42
|
+
error: { code: "SERVER_START_FAILED", message: e.message, recoverable: false }
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const limit = pLimit(3);
|
|
46
|
+
const screens = [];
|
|
47
|
+
await Promise.all(sdkScreens.map((s) => limit(async () => {
|
|
48
|
+
try {
|
|
49
|
+
const codeUrl = await s.getHtml();
|
|
50
|
+
if (codeUrl) {
|
|
51
|
+
const html = await this.downloadHtml(codeUrl);
|
|
52
|
+
server.mount(`/screens/${s.screenId}`, html);
|
|
53
|
+
}
|
|
54
|
+
screens.push({
|
|
55
|
+
screenId: s.screenId,
|
|
56
|
+
title: s.title ?? s.screenId,
|
|
57
|
+
url: `${baseUrl}/screens/${s.screenId}`
|
|
58
|
+
});
|
|
59
|
+
} catch {}
|
|
60
|
+
})));
|
|
61
|
+
screens.sort((a, b) => a.title.localeCompare(b.title));
|
|
62
|
+
return { success: true, url: baseUrl, screens };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
JsonServerHandler
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
//# debugId=48EA0F841F0EE79D64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/commands/serve/json-server/handler.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { Stitch } from '@google/stitch-sdk';\nimport pLimit from 'p-limit';\nimport { StitchViteServer } from '../../../lib/server/vite/StitchViteServer.js';\nimport { downloadText } from '../../../ui/copy-behaviors/clipboard.js';\nimport type { JsonServerSpec, JsonServerInput, JsonServerResult } from './spec.js';\n\nexport class JsonServerHandler implements JsonServerSpec {\n constructor(\n private readonly client: Stitch,\n private readonly downloadHtml: (url: string) => Promise<string> = downloadText,\n ) {}\n\n async execute(input: JsonServerInput): Promise<JsonServerResult> {\n let sdkScreens: any[];\n\n try {\n const project = this.client.project(input.projectId);\n sdkScreens = await project.screens();\n } catch (e: any) {\n return {\n success: false,\n error: { code: 'SCREENS_FETCH_FAILED', message: e.message, recoverable: false },\n };\n }\n\n const server = new StitchViteServer();\n let baseUrl: string;\n\n try {\n baseUrl = await server.start(0);\n } catch (e: any) {\n return {\n success: false,\n error: { code: 'SERVER_START_FAILED', message: e.message, recoverable: false },\n };\n }\n\n // Mount screens concurrently\n const limit = pLimit(3);\n const screens: Array<{ screenId: string; title: string; url: string }> = [];\n\n await Promise.all(\n sdkScreens.map((s: any) => limit(async () => {\n try {\n const codeUrl = await s.getHtml();\n if (codeUrl) {\n const html = await this.downloadHtml(codeUrl);\n server.mount(`/screens/${s.screenId}`, html);\n }\n screens.push({\n screenId: s.screenId,\n title: s.title ?? s.screenId,\n url: `${baseUrl}/screens/${s.screenId}`,\n });\n } catch {\n // Skip screens that fail to load\n }\n }))\n );\n\n screens.sort((a, b) => a.title.localeCompare(b.title));\n\n return { success: true, url: baseUrl, screens };\n }\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;AAMO,MAAM,kBAA4C;AAAA,EAEpC;AAAA,EACA;AAAA,EAFnB,WAAW,CACQ,QACA,eAAiD,cAClE;AAAA,IAFiB;AAAA,IACA;AAAA;AAAA,OAGb,QAAO,CAAC,OAAmD;AAAA,IAC/D,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,MAAM,UAAU,KAAK,OAAO,QAAQ,MAAM,SAAS;AAAA,MACnD,aAAa,MAAM,QAAQ,QAAQ;AAAA,MACnC,OAAO,GAAQ;AAAA,MACf,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,EAAE,MAAM,wBAAwB,SAAS,EAAE,SAAS,aAAa,MAAM;AAAA,MAChF;AAAA;AAAA,IAGF,MAAM,SAAS,IAAI;AAAA,IACnB,IAAI;AAAA,IAEJ,IAAI;AAAA,MACF,UAAU,MAAM,OAAO,MAAM,CAAC;AAAA,MAC9B,OAAO,GAAQ;AAAA,MACf,OAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,EAAE,MAAM,uBAAuB,SAAS,EAAE,SAAS,aAAa,MAAM;AAAA,MAC/E;AAAA;AAAA,IAIF,MAAM,QAAQ,OAAO,CAAC;AAAA,IACtB,MAAM,UAAmE,CAAC;AAAA,IAE1E,MAAM,QAAQ,IACZ,WAAW,IAAI,CAAC,MAAW,MAAM,YAAY;AAAA,MAC3C,IAAI;AAAA,QACF,MAAM,UAAU,MAAM,EAAE,QAAQ;AAAA,QAChC,IAAI,SAAS;AAAA,UACX,MAAM,OAAO,MAAM,KAAK,aAAa,OAAO;AAAA,UAC5C,OAAO,MAAM,YAAY,EAAE,YAAY,IAAI;AAAA,QAC7C;AAAA,QACA,QAAQ,KAAK;AAAA,UACX,UAAU,EAAE;AAAA,UACZ,OAAO,EAAE,SAAS,EAAE;AAAA,UACpB,KAAK,GAAG,mBAAmB,EAAE;AAAA,QAC/B,CAAC;AAAA,QACD,MAAM;AAAA,KAGT,CAAC,CACJ;AAAA,IAEA,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC;AAAA,IAErD,OAAO,EAAE,SAAS,MAAM,KAAK,SAAS,QAAQ;AAAA;AAElD;",
|
|
8
|
+
"debugId": "48EA0F841F0EE79D64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|