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.
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +21 -0
- package/dist/cli.js.map +1 -0
- package/dist/clients/adapters.d.ts +106 -0
- package/dist/clients/adapters.d.ts.map +1 -0
- package/dist/clients/adapters.js +198 -0
- package/dist/clients/adapters.js.map +1 -0
- package/dist/clients/index.d.ts +2 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +2 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +87 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/index.d.ts +5 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +5 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +144 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/links.d.ts +7 -0
- package/dist/commands/links.d.ts.map +1 -0
- package/dist/commands/links.js +91 -0
- package/dist/commands/links.js.map +1 -0
- package/dist/commands/login.d.ts +7 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +61 -0
- package/dist/commands/login.js.map +1 -0
- package/package.json +45 -0
- package/src/cli.ts +25 -0
- package/src/clients/adapters.ts +256 -0
- package/src/clients/index.ts +1 -0
- package/src/commands/doctor.ts +91 -0
- package/src/commands/index.ts +4 -0
- package/src/commands/init.ts +168 -0
- package/src/commands/links.ts +110 -0
- package/src/commands/login.ts +75 -0
- package/tsconfig.json +23 -0
package/dist/cli.d.ts
ADDED
|
@@ -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
|
package/dist/cli.js.map
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|