gemini-designer 0.1.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 (42) hide show
  1. package/dist/cli.d.ts +7 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +21 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/clients/adapters.d.ts +106 -0
  6. package/dist/clients/adapters.d.ts.map +1 -0
  7. package/dist/clients/adapters.js +198 -0
  8. package/dist/clients/adapters.js.map +1 -0
  9. package/dist/clients/index.d.ts +2 -0
  10. package/dist/clients/index.d.ts.map +1 -0
  11. package/dist/clients/index.js +2 -0
  12. package/dist/clients/index.js.map +1 -0
  13. package/dist/commands/doctor.d.ts +7 -0
  14. package/dist/commands/doctor.d.ts.map +1 -0
  15. package/dist/commands/doctor.js +87 -0
  16. package/dist/commands/doctor.js.map +1 -0
  17. package/dist/commands/index.d.ts +5 -0
  18. package/dist/commands/index.d.ts.map +1 -0
  19. package/dist/commands/index.js +5 -0
  20. package/dist/commands/index.js.map +1 -0
  21. package/dist/commands/init.d.ts +7 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +144 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/links.d.ts +7 -0
  26. package/dist/commands/links.d.ts.map +1 -0
  27. package/dist/commands/links.js +91 -0
  28. package/dist/commands/links.js.map +1 -0
  29. package/dist/commands/login.d.ts +7 -0
  30. package/dist/commands/login.d.ts.map +1 -0
  31. package/dist/commands/login.js +61 -0
  32. package/dist/commands/login.js.map +1 -0
  33. package/package.json +45 -0
  34. package/src/cli.ts +25 -0
  35. package/src/clients/adapters.ts +256 -0
  36. package/src/clients/index.ts +1 -0
  37. package/src/commands/doctor.ts +91 -0
  38. package/src/commands/index.ts +4 -0
  39. package/src/commands/init.ts +168 -0
  40. package/src/commands/links.ts +110 -0
  41. package/src/commands/login.ts +75 -0
  42. package/tsconfig.json +23 -0
package/dist/cli.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * gemini-designer CLI
4
+ * Installer and configuration tool for Gemini Designer MCP Server
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG"}
package/dist/cli.js ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * gemini-designer CLI
4
+ * Installer and configuration tool for Gemini Designer MCP Server
5
+ */
6
+ import { Command } from 'commander';
7
+ import { initCommand } from './commands/init.js';
8
+ import { loginCommand } from './commands/login.js';
9
+ import { doctorCommand } from './commands/doctor.js';
10
+ import { linksCommand } from './commands/links.js';
11
+ const program = new Command();
12
+ program
13
+ .name('gemini-designer')
14
+ .description('CLI installer for Gemini Designer MCP server')
15
+ .version('0.1.0');
16
+ program.addCommand(initCommand);
17
+ program.addCommand(loginCommand);
18
+ program.addCommand(doctorCommand);
19
+ program.addCommand(linksCommand);
20
+ program.parse();
21
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,iBAAiB,CAAC;KACvB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * MCP Client adapters for configuration detection and writing
3
+ */
4
+ export interface McpServerConfig {
5
+ command?: string;
6
+ args?: string[];
7
+ env?: Record<string, string>;
8
+ url?: string;
9
+ headers?: Record<string, string>;
10
+ }
11
+ export interface ClientAdapter {
12
+ name: string;
13
+ displayName: string;
14
+ configPath: string;
15
+ detected: boolean;
16
+ detect(): boolean;
17
+ configure(config: McpServerConfig): void;
18
+ getExistingConfig(): Record<string, unknown> | null;
19
+ }
20
+ /**
21
+ * Cursor IDE adapter
22
+ * Config: ~/.cursor/mcp.json
23
+ */
24
+ export declare class CursorAdapter implements ClientAdapter {
25
+ name: string;
26
+ displayName: string;
27
+ configPath: string;
28
+ detected: boolean;
29
+ detect(): boolean;
30
+ getExistingConfig(): Record<string, unknown> | null;
31
+ configure(config: McpServerConfig): void;
32
+ }
33
+ /**
34
+ * Gemini CLI adapter
35
+ * Config: ~/.gemini/settings.json
36
+ */
37
+ export declare class GeminiCliAdapter implements ClientAdapter {
38
+ name: string;
39
+ displayName: string;
40
+ configPath: string;
41
+ detected: boolean;
42
+ detect(): boolean;
43
+ getExistingConfig(): Record<string, unknown> | null;
44
+ configure(config: McpServerConfig): void;
45
+ }
46
+ /**
47
+ * VS Code adapter
48
+ * Config: ~/.vscode/settings.json (or workspace settings)
49
+ */
50
+ export declare class VSCodeAdapter implements ClientAdapter {
51
+ name: string;
52
+ displayName: string;
53
+ configPath: string;
54
+ detected: boolean;
55
+ detect(): boolean;
56
+ getExistingConfig(): Record<string, unknown> | null;
57
+ configure(config: McpServerConfig): void;
58
+ }
59
+ /**
60
+ * Claude Code adapter
61
+ * Config: ~/.claude/mcp.json
62
+ */
63
+ export declare class ClaudeCodeAdapter implements ClientAdapter {
64
+ name: string;
65
+ displayName: string;
66
+ configPath: string;
67
+ detected: boolean;
68
+ detect(): boolean;
69
+ getExistingConfig(): Record<string, unknown> | null;
70
+ configure(config: McpServerConfig): void;
71
+ }
72
+ /**
73
+ * Windsurf adapter
74
+ * Config: ~/.codeium/windsurf/mcp_config.json
75
+ */
76
+ export declare class WindsurfAdapter implements ClientAdapter {
77
+ name: string;
78
+ displayName: string;
79
+ configPath: string;
80
+ detected: boolean;
81
+ detect(): boolean;
82
+ getExistingConfig(): Record<string, unknown> | null;
83
+ configure(config: McpServerConfig): void;
84
+ }
85
+ /**
86
+ * Zed Editor adapter
87
+ * Config: ~/.config/zed/settings.json
88
+ */
89
+ export declare class ZedAdapter implements ClientAdapter {
90
+ name: string;
91
+ displayName: string;
92
+ configPath: string;
93
+ detected: boolean;
94
+ detect(): boolean;
95
+ getExistingConfig(): Record<string, unknown> | null;
96
+ configure(config: McpServerConfig): void;
97
+ }
98
+ /**
99
+ * Get all available client adapters
100
+ */
101
+ export declare function getAllAdapters(): ClientAdapter[];
102
+ /**
103
+ * Detect all installed clients
104
+ */
105
+ export declare function detectClients(): ClientAdapter[];
106
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/clients/adapters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,eAAe;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,IAAI,OAAO,CAAC;IAClB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACvD;AAyBD;;;GAGG;AACH,qBAAa,aAAc,YAAW,aAAa;IAC/C,IAAI,SAAY;IAChB,WAAW,SAAgB;IAC3B,UAAU,SAA4B;IACtC,QAAQ,UAAS;IAEjB,MAAM,IAAI,OAAO;IAMjB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInD,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;CAS3C;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,aAAa;IAClD,IAAI,SAAgB;IACpB,WAAW,SAAgB;IAC3B,UAAU,SAAiC;IAC3C,QAAQ,UAAS;IAEjB,MAAM,IAAI,OAAO;IAMjB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInD,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;CAS3C;AAED;;;GAGG;AACH,qBAAa,aAAc,YAAW,aAAa;IAC/C,IAAI,SAAY;IAChB,WAAW,SAAa;IACxB,UAAU,SAAiC;IAC3C,QAAQ,UAAS;IAEjB,MAAM,IAAI,OAAO;IAQjB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInD,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;CAS3C;AAED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACnD,IAAI,SAAiB;IACrB,WAAW,SAAiB;IAC5B,UAAU,SAA4B;IACtC,QAAQ,UAAS;IAEjB,MAAM,IAAI,OAAO;IAKjB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInD,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;CAS3C;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,aAAa;IACjD,IAAI,SAAc;IAClB,WAAW,SAAc;IACzB,UAAU,SAA6C;IACvD,QAAQ,UAAS;IAEjB,MAAM,IAAI,OAAO;IAKjB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInD,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;CAS3C;AAED;;;GAGG;AACH,qBAAa,UAAW,YAAW,aAAa;IAC5C,IAAI,SAAS;IACb,WAAW,SAAgB;IAC3B,UAAU,SAAqC;IAC/C,QAAQ,UAAS;IAEjB,MAAM,IAAI,OAAO;IAMjB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAInD,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;CAS3C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,aAAa,EAAE,CAShD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,aAAa,EAAE,CAG/C"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * MCP Client adapters for configuration detection and writing
3
+ */
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
6
+ import * as os from 'node:os';
7
+ function home(p) {
8
+ return path.join(os.homedir(), p);
9
+ }
10
+ function readJsonSafe(filePath) {
11
+ try {
12
+ if (fs.existsSync(filePath)) {
13
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
14
+ }
15
+ }
16
+ catch {
17
+ // Invalid JSON, return null
18
+ }
19
+ return null;
20
+ }
21
+ function writeJsonSafe(filePath, data) {
22
+ const dir = path.dirname(filePath);
23
+ if (!fs.existsSync(dir)) {
24
+ fs.mkdirSync(dir, { recursive: true });
25
+ }
26
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
27
+ }
28
+ /**
29
+ * Cursor IDE adapter
30
+ * Config: ~/.cursor/mcp.json
31
+ */
32
+ export class CursorAdapter {
33
+ name = 'cursor';
34
+ displayName = 'Cursor IDE';
35
+ configPath = home('.cursor/mcp.json');
36
+ detected = false;
37
+ detect() {
38
+ // Cursor is detected if the .cursor directory exists
39
+ this.detected = fs.existsSync(home('.cursor'));
40
+ return this.detected;
41
+ }
42
+ getExistingConfig() {
43
+ return readJsonSafe(this.configPath);
44
+ }
45
+ configure(config) {
46
+ const existing = this.getExistingConfig() || {};
47
+ const mcpServers = existing.mcpServers || {};
48
+ mcpServers['gemini-designer'] = config;
49
+ existing.mcpServers = mcpServers;
50
+ writeJsonSafe(this.configPath, existing);
51
+ }
52
+ }
53
+ /**
54
+ * Gemini CLI adapter
55
+ * Config: ~/.gemini/settings.json
56
+ */
57
+ export class GeminiCliAdapter {
58
+ name = 'gemini-cli';
59
+ displayName = 'Gemini CLI';
60
+ configPath = home('.gemini/settings.json');
61
+ detected = false;
62
+ detect() {
63
+ // Detected if settings.json exists or .gemini dir exists
64
+ this.detected = fs.existsSync(home('.gemini'));
65
+ return this.detected;
66
+ }
67
+ getExistingConfig() {
68
+ return readJsonSafe(this.configPath);
69
+ }
70
+ configure(config) {
71
+ const existing = this.getExistingConfig() || {};
72
+ const mcpServers = existing.mcpServers || {};
73
+ mcpServers['gemini-designer'] = config;
74
+ existing.mcpServers = mcpServers;
75
+ writeJsonSafe(this.configPath, existing);
76
+ }
77
+ }
78
+ /**
79
+ * VS Code adapter
80
+ * Config: ~/.vscode/settings.json (or workspace settings)
81
+ */
82
+ export class VSCodeAdapter {
83
+ name = 'vscode';
84
+ displayName = 'VS Code';
85
+ configPath = home('.vscode/settings.json');
86
+ detected = false;
87
+ detect() {
88
+ // Check for VS Code config directory or common install locations
89
+ this.detected = fs.existsSync(home('.vscode')) ||
90
+ fs.existsSync('/Applications/Visual Studio Code.app') ||
91
+ fs.existsSync(home('Library/Application Support/Code'));
92
+ return this.detected;
93
+ }
94
+ getExistingConfig() {
95
+ return readJsonSafe(this.configPath);
96
+ }
97
+ configure(config) {
98
+ const existing = this.getExistingConfig() || {};
99
+ const mcpServers = existing['mcp.servers'] || {};
100
+ mcpServers['gemini-designer'] = config;
101
+ existing['mcp.servers'] = mcpServers;
102
+ writeJsonSafe(this.configPath, existing);
103
+ }
104
+ }
105
+ /**
106
+ * Claude Code adapter
107
+ * Config: ~/.claude/mcp.json
108
+ */
109
+ export class ClaudeCodeAdapter {
110
+ name = 'claude-code';
111
+ displayName = 'Claude Code';
112
+ configPath = home('.claude/mcp.json');
113
+ detected = false;
114
+ detect() {
115
+ this.detected = fs.existsSync(home('.claude'));
116
+ return this.detected;
117
+ }
118
+ getExistingConfig() {
119
+ return readJsonSafe(this.configPath);
120
+ }
121
+ configure(config) {
122
+ const existing = this.getExistingConfig() || {};
123
+ const mcpServers = existing.mcpServers || {};
124
+ mcpServers['gemini-designer'] = config;
125
+ existing.mcpServers = mcpServers;
126
+ writeJsonSafe(this.configPath, existing);
127
+ }
128
+ }
129
+ /**
130
+ * Windsurf adapter
131
+ * Config: ~/.codeium/windsurf/mcp_config.json
132
+ */
133
+ export class WindsurfAdapter {
134
+ name = 'windsurf';
135
+ displayName = 'Windsurf';
136
+ configPath = home('.codeium/windsurf/mcp_config.json');
137
+ detected = false;
138
+ detect() {
139
+ this.detected = fs.existsSync(home('.codeium/windsurf'));
140
+ return this.detected;
141
+ }
142
+ getExistingConfig() {
143
+ return readJsonSafe(this.configPath);
144
+ }
145
+ configure(config) {
146
+ const existing = this.getExistingConfig() || {};
147
+ const mcpServers = existing.mcpServers || {};
148
+ mcpServers['gemini-designer'] = config;
149
+ existing.mcpServers = mcpServers;
150
+ writeJsonSafe(this.configPath, existing);
151
+ }
152
+ }
153
+ /**
154
+ * Zed Editor adapter
155
+ * Config: ~/.config/zed/settings.json
156
+ */
157
+ export class ZedAdapter {
158
+ name = 'zed';
159
+ displayName = 'Zed Editor';
160
+ configPath = home('.config/zed/settings.json');
161
+ detected = false;
162
+ detect() {
163
+ this.detected = fs.existsSync(home('.config/zed')) ||
164
+ fs.existsSync('/Applications/Zed.app');
165
+ return this.detected;
166
+ }
167
+ getExistingConfig() {
168
+ return readJsonSafe(this.configPath);
169
+ }
170
+ configure(config) {
171
+ const existing = this.getExistingConfig() || {};
172
+ const contextServers = existing.context_servers || {};
173
+ contextServers['gemini-designer'] = config;
174
+ existing.context_servers = contextServers;
175
+ writeJsonSafe(this.configPath, existing);
176
+ }
177
+ }
178
+ /**
179
+ * Get all available client adapters
180
+ */
181
+ export function getAllAdapters() {
182
+ return [
183
+ new CursorAdapter(),
184
+ new GeminiCliAdapter(),
185
+ new VSCodeAdapter(),
186
+ new ClaudeCodeAdapter(),
187
+ new WindsurfAdapter(),
188
+ new ZedAdapter(),
189
+ ];
190
+ }
191
+ /**
192
+ * Detect all installed clients
193
+ */
194
+ export function detectClients() {
195
+ const adapters = getAllAdapters();
196
+ return adapters.filter(adapter => adapter.detect());
197
+ }
198
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/clients/adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './adapters.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './adapters.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * doctor command
3
+ * Diagnostics and validation
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare const doctorCommand: Command;
7
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,eAAO,MAAM,aAAa,SA8EpB,CAAC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * doctor command
3
+ * Diagnostics and validation
4
+ */
5
+ import { Command } from 'commander';
6
+ import chalk from 'chalk';
7
+ import * as fs from 'node:fs';
8
+ import { detectClients } from '../clients/index.js';
9
+ const REMOTE_ENDPOINT = 'https://api.gemini-designer.dev/health';
10
+ export const doctorCommand = new Command('doctor')
11
+ .description('Check your Gemini Designer setup for issues')
12
+ .action(async () => {
13
+ console.log(chalk.bold.cyan('\n🩺 Gemini Designer Doctor\n'));
14
+ let hasIssues = false;
15
+ // Check Node.js version
16
+ const nodeVersion = process.version;
17
+ const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0], 10);
18
+ if (majorVersion >= 20) {
19
+ console.log(chalk.green(`āœ“ Node.js ${nodeVersion}`));
20
+ }
21
+ else {
22
+ console.log(chalk.red(`āœ— Node.js ${nodeVersion} (requires >=20.0.0)`));
23
+ hasIssues = true;
24
+ }
25
+ // Check for npx
26
+ const { execSync } = await import('node:child_process');
27
+ try {
28
+ execSync('npx --version', { stdio: 'pipe' });
29
+ console.log(chalk.green('āœ“ npx available'));
30
+ }
31
+ catch {
32
+ console.log(chalk.red('āœ— npx not found'));
33
+ hasIssues = true;
34
+ }
35
+ // Detect clients
36
+ console.log(chalk.gray('\nMCP Clients:'));
37
+ const clients = detectClients();
38
+ if (clients.length === 0) {
39
+ console.log(chalk.yellow(' āš ļø No MCP clients detected'));
40
+ hasIssues = true;
41
+ }
42
+ else {
43
+ for (const client of clients) {
44
+ const configExists = fs.existsSync(client.configPath);
45
+ const existingConfig = client.getExistingConfig();
46
+ const hasGeminiDesigner = existingConfig?.mcpServers &&
47
+ typeof existingConfig.mcpServers === 'object' &&
48
+ 'gemini-designer' in existingConfig.mcpServers;
49
+ if (hasGeminiDesigner) {
50
+ console.log(chalk.green(` āœ“ ${client.displayName} (configured)`));
51
+ }
52
+ else if (configExists) {
53
+ console.log(chalk.yellow(` āš ļø ${client.displayName} (not configured)`));
54
+ }
55
+ else {
56
+ console.log(chalk.gray(` • ${client.displayName} (no config file)`));
57
+ }
58
+ }
59
+ }
60
+ // Check remote endpoint
61
+ console.log(chalk.gray('\nRemote Endpoint:'));
62
+ try {
63
+ const response = await fetch(REMOTE_ENDPOINT, {
64
+ method: 'GET',
65
+ signal: AbortSignal.timeout(5000),
66
+ });
67
+ if (response.ok) {
68
+ console.log(chalk.green(` āœ“ ${REMOTE_ENDPOINT} reachable`));
69
+ }
70
+ else {
71
+ console.log(chalk.yellow(` āš ļø ${REMOTE_ENDPOINT} returned ${response.status}`));
72
+ }
73
+ }
74
+ catch (error) {
75
+ console.log(chalk.red(` āœ— ${REMOTE_ENDPOINT} unreachable`));
76
+ console.log(chalk.gray(` (This is expected if the gateway isn't deployed yet)`));
77
+ }
78
+ // Summary
79
+ console.log();
80
+ if (hasIssues) {
81
+ console.log(chalk.yellow('āš ļø Some issues detected. Run `gemini-designer init` to configure.\n'));
82
+ }
83
+ else {
84
+ console.log(chalk.green('āœ“ Everything looks good!\n'));
85
+ }
86
+ });
87
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './init.js';
2
+ export * from './login.js';
3
+ export * from './doctor.js';
4
+ export * from './links.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './init.js';
2
+ export * from './login.js';
3
+ export * from './doctor.js';
4
+ export * from './links.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * init command
3
+ * Interactive setup: choose mode → choose clients → configure
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare const initCommand: Command;
7
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,WAAW,SAqJlB,CAAC"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * init command
3
+ * Interactive setup: choose mode → choose clients → configure
4
+ */
5
+ import { Command } from 'commander';
6
+ import chalk from 'chalk';
7
+ import Enquirer from 'enquirer';
8
+ import { detectClients } from '../clients/index.js';
9
+ const { Select, MultiSelect, Password } = Enquirer;
10
+ const REMOTE_ENDPOINT = 'https://api.gemini-designer.dev/mcp';
11
+ export const initCommand = new Command('init')
12
+ .description('Initialize Gemini Designer MCP for your development environment')
13
+ .option('--dry-run', 'Show what would be configured without making changes')
14
+ .option('--local', 'Use local mode with your own Gemini API key')
15
+ .option('--remote', 'Use remote mode with Gemini Designer API key')
16
+ .action(async (options) => {
17
+ console.log(chalk.bold.cyan('\nšŸŽØ Gemini Designer MCP Setup\n'));
18
+ // Detect installed clients
19
+ console.log(chalk.gray('Detecting MCP clients...'));
20
+ const detectedClients = detectClients();
21
+ if (detectedClients.length === 0) {
22
+ console.log(chalk.yellow('\nāš ļø No MCP clients detected.'));
23
+ console.log(chalk.gray('Supported clients: Cursor, Gemini CLI, VS Code, Claude Code, Windsurf, Zed'));
24
+ console.log(chalk.gray('Install one of these to use Gemini Designer MCP.\n'));
25
+ return;
26
+ }
27
+ console.log(chalk.green(`āœ“ Found ${detectedClients.length} client(s):\n`));
28
+ for (const client of detectedClients) {
29
+ console.log(chalk.gray(` • ${client.displayName} (${client.configPath})`));
30
+ }
31
+ console.log();
32
+ // Choose mode
33
+ let mode;
34
+ if (options.local) {
35
+ mode = 'local';
36
+ }
37
+ else if (options.remote) {
38
+ mode = 'remote';
39
+ }
40
+ else {
41
+ const modePrompt = new Select({
42
+ name: 'mode',
43
+ message: 'Choose mode:',
44
+ choices: [
45
+ { name: 'remote', message: `${chalk.green('Remote')} (Pro/Team - recommended)` },
46
+ { name: 'local', message: `${chalk.gray('Local')} (use your own Gemini API key)` },
47
+ ],
48
+ });
49
+ mode = await modePrompt.run();
50
+ }
51
+ // Select clients to configure
52
+ const clientPrompt = new MultiSelect({
53
+ name: 'clients',
54
+ message: 'Select MCP clients to configure:',
55
+ choices: detectedClients.map((client) => ({
56
+ name: client.name,
57
+ message: `${client.displayName}`,
58
+ value: client.name,
59
+ enabled: true, // Pre-select all detected
60
+ })),
61
+ });
62
+ const selectedClientNames = await clientPrompt.run();
63
+ const selectedClients = detectedClients.filter((c) => selectedClientNames.includes(c.name));
64
+ if (selectedClients.length === 0) {
65
+ console.log(chalk.yellow('\nāš ļø No clients selected. Exiting.\n'));
66
+ return;
67
+ }
68
+ // Get API key
69
+ let config;
70
+ if (mode === 'remote') {
71
+ console.log(chalk.gray('\nFor remote mode, you need a Gemini Designer API key.'));
72
+ console.log(chalk.gray('Get one at: https://gemini-designer.dev/dashboard\n'));
73
+ const keyPrompt = new Password({
74
+ name: 'apiKey',
75
+ message: 'Enter your Gemini Designer API key (gd_pro_xxx):',
76
+ });
77
+ const apiKey = await keyPrompt.run();
78
+ if (!apiKey.startsWith('gd_')) {
79
+ console.log(chalk.red('\nāŒ Invalid API key format. Expected: gd_<tier>_<key>\n'));
80
+ return;
81
+ }
82
+ config = {
83
+ url: REMOTE_ENDPOINT,
84
+ headers: {
85
+ Authorization: `Bearer ${apiKey}`,
86
+ },
87
+ };
88
+ }
89
+ else {
90
+ console.log(chalk.gray('\nFor local mode, you need a Google Gemini API key.'));
91
+ console.log(chalk.gray('Get one at: https://aistudio.google.com/apikey\n'));
92
+ const keyPrompt = new Password({
93
+ name: 'apiKey',
94
+ message: 'Enter your Gemini API key (AIzaSy...):',
95
+ });
96
+ const apiKey = await keyPrompt.run();
97
+ if (!apiKey.startsWith('AIza')) {
98
+ console.log(chalk.red('\nāŒ Invalid API key format. Expected: AIzaSy...\n'));
99
+ return;
100
+ }
101
+ config = {
102
+ command: 'npx',
103
+ args: ['-y', '@gemini-designer/mcp-server'],
104
+ env: {
105
+ GEMINI_API_KEY: apiKey,
106
+ GEMINI_DESIGNER_MODE: 'local',
107
+ },
108
+ };
109
+ }
110
+ // Configure clients
111
+ if (options.dryRun) {
112
+ console.log(chalk.yellow('\nšŸ” Dry run mode - no changes made:\n'));
113
+ console.log(chalk.gray('Would configure:'));
114
+ for (const client of selectedClients) {
115
+ console.log(chalk.gray(` • ${client.displayName}: ${client.configPath}`));
116
+ }
117
+ console.log(chalk.gray('\nWith config:'));
118
+ console.log(chalk.gray(JSON.stringify(config, null, 2)));
119
+ return;
120
+ }
121
+ console.log(chalk.gray('\nConfiguring clients...'));
122
+ for (const client of selectedClients) {
123
+ try {
124
+ client.configure(config);
125
+ console.log(chalk.green(`āœ“ ${client.displayName}`));
126
+ }
127
+ catch (error) {
128
+ console.log(chalk.red(`āœ— ${client.displayName}: ${error}`));
129
+ }
130
+ }
131
+ // Success message
132
+ console.log(chalk.bold.green('\nšŸŽ‰ Setup complete!\n'));
133
+ console.log(chalk.gray('Try asking your AI assistant:'));
134
+ console.log(chalk.cyan(' "Generate a login form using Gemini Designer"\n'));
135
+ if (mode === 'remote') {
136
+ console.log(chalk.gray('Mode: Remote (Pro/Team)'));
137
+ console.log(chalk.gray(`Endpoint: ${REMOTE_ENDPOINT}`));
138
+ }
139
+ else {
140
+ console.log(chalk.gray('Mode: Local (BYO Gemini key)'));
141
+ }
142
+ console.log();
143
+ });
144
+ //# sourceMappingURL=init.js.map