gravity-core 1.0.2 ā 1.0.4
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/README.md +109 -38
- package/SETUP.md +193 -346
- package/dist/cli-utils.d.ts +64 -0
- package/dist/cli-utils.d.ts.map +1 -0
- package/dist/cli-utils.js +256 -0
- package/dist/cli-utils.js.map +1 -0
- package/dist/cli.d.ts +7 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +254 -252
- package/dist/cli.js.map +1 -1
- package/dist/mcp-server.d.ts +10 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +223 -0
- package/dist/mcp-server.js.map +1 -0
- package/native-host/devtools-bridge-host.bat +11 -0
- package/native-host/manifest.json +9 -0
- package/package.json +2 -4
package/dist/cli.js
CHANGED
|
@@ -1,60 +1,82 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Gravity
|
|
3
|
+
* Gravity CLI
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* - npx gravity-core setup-extension Extract and setup Chrome extension
|
|
7
|
+
* - npx gravity-core setup-native-host Setup native messaging host
|
|
8
|
+
* - npx gravity-core test-connection Test connection to extension
|
|
9
|
+
* - npx gravity-core Start MCP server
|
|
10
|
+
* - npx gravity-core --help Show help
|
|
8
11
|
*/
|
|
9
|
-
import {
|
|
10
|
-
import { existsSync, cpSync } from 'fs';
|
|
11
|
-
import { dirname, join
|
|
12
|
+
import { getGravityExtensionDir, getGravityHostDir, detectGravityExtensionId, patchManifest, writeRegistryKey, registryKeyExists, promptConfirm, promptRestartChrome, validateManifest, nativeHostExists, testWebSocketConnection, } from './cli-utils.js';
|
|
13
|
+
import { existsSync, cpSync, readFileSync } from 'fs';
|
|
14
|
+
import { dirname, join } from 'path';
|
|
12
15
|
import { fileURLToPath } from 'url';
|
|
16
|
+
import { platform } from 'os';
|
|
13
17
|
const __filename = fileURLToPath(import.meta.url);
|
|
14
18
|
const __dirname = dirname(__filename);
|
|
15
|
-
//
|
|
19
|
+
// Parse command line arguments
|
|
16
20
|
const args = process.argv.slice(2);
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
const command = args[0];
|
|
22
|
+
// Route to appropriate handler
|
|
23
|
+
if (command === 'setup-extension') {
|
|
24
|
+
handleSetupExtension();
|
|
19
25
|
}
|
|
20
|
-
else if (
|
|
26
|
+
else if (command === 'setup-native-host') {
|
|
27
|
+
handleSetupNativeHost();
|
|
28
|
+
}
|
|
29
|
+
else if (command === 'test-connection') {
|
|
30
|
+
handleTestConnection();
|
|
31
|
+
}
|
|
32
|
+
else if (command === '--help' || command === '-h' || command === 'help') {
|
|
21
33
|
showHelp();
|
|
22
34
|
}
|
|
23
|
-
else {
|
|
24
|
-
// Default: run MCP server
|
|
35
|
+
else if (!command) {
|
|
25
36
|
runMCPServer();
|
|
26
37
|
}
|
|
38
|
+
else {
|
|
39
|
+
console.error(`ā Unknown command: ${command}`);
|
|
40
|
+
console.error('Run "npx gravity-core --help" for usage information');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
27
43
|
/**
|
|
28
44
|
* Show help message
|
|
29
45
|
*/
|
|
30
46
|
function showHelp() {
|
|
31
|
-
console.
|
|
47
|
+
console.error(`
|
|
32
48
|
š Gravity - AI-powered CSS layout diagnostics
|
|
33
49
|
|
|
34
50
|
Usage:
|
|
35
|
-
npx gravity-core
|
|
36
|
-
npx gravity-core setup-extension
|
|
37
|
-
npx gravity-core
|
|
51
|
+
npx gravity-core Start the MCP server
|
|
52
|
+
npx gravity-core setup-extension Extract Chrome extension to ~/.gravity-extension
|
|
53
|
+
npx gravity-core setup-native-host Setup native messaging host for Chrome
|
|
54
|
+
npx gravity-core test-connection Test connection to extension
|
|
55
|
+
npx gravity-core --help Show this help message
|
|
38
56
|
|
|
39
|
-
Setup:
|
|
57
|
+
Setup Instructions:
|
|
40
58
|
1. Run: npx gravity-core setup-extension
|
|
41
|
-
2.
|
|
42
|
-
3.
|
|
43
|
-
4.
|
|
44
|
-
5.
|
|
45
|
-
6.
|
|
59
|
+
2. Run: npx gravity-core setup-native-host
|
|
60
|
+
3. Open Chrome and go to: chrome://extensions
|
|
61
|
+
4. Enable "Developer mode" (toggle in top right)
|
|
62
|
+
5. Click "Load unpacked"
|
|
63
|
+
6. Select the ~/.gravity-extension folder
|
|
64
|
+
7. Run: npx gravity-core test-connection
|
|
65
|
+
8. Configure your IDE with the MCP server
|
|
46
66
|
|
|
47
67
|
Environment Variables:
|
|
48
68
|
GRAVITY_PORT WebSocket port (default: 9224)
|
|
49
69
|
GRAVITY_TIMEOUT Connection timeout in ms (default: 10000)
|
|
70
|
+
|
|
71
|
+
For more information, visit: https://github.com/DharuNamikaze/Gravity-Package
|
|
50
72
|
`);
|
|
51
73
|
process.exit(0);
|
|
52
74
|
}
|
|
53
75
|
/**
|
|
54
|
-
*
|
|
76
|
+
* Handle setup-extension command
|
|
55
77
|
*/
|
|
56
|
-
function
|
|
57
|
-
console.
|
|
78
|
+
async function handleSetupExtension() {
|
|
79
|
+
console.error('š Gravity Extension Setup\n');
|
|
58
80
|
// Find the extension folder in the package
|
|
59
81
|
const packageExtensionPath = join(__dirname, '..', 'extension');
|
|
60
82
|
if (!existsSync(packageExtensionPath)) {
|
|
@@ -63,253 +85,233 @@ function setupExtension() {
|
|
|
63
85
|
console.error(' https://github.com/DharuNamikaze/Gravity-Package/issues');
|
|
64
86
|
process.exit(1);
|
|
65
87
|
}
|
|
66
|
-
// Target directory in user's
|
|
67
|
-
const targetDir =
|
|
88
|
+
// Target directory in user's home
|
|
89
|
+
const targetDir = getGravityExtensionDir();
|
|
68
90
|
if (existsSync(targetDir)) {
|
|
69
|
-
console.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
// Copy extension folder
|
|
75
|
-
cpSync(packageExtensionPath, targetDir, { recursive: true });
|
|
76
|
-
console.log(`ā
Extension extracted to: ${targetDir}\n`);
|
|
77
|
-
}
|
|
78
|
-
catch (error) {
|
|
79
|
-
console.error('ā Failed to extract extension:', error.message);
|
|
80
|
-
process.exit(1);
|
|
91
|
+
console.error(`š Extension folder already exists at: ${targetDir}`);
|
|
92
|
+
const overwrite = await promptConfirm(' Overwrite existing extension?');
|
|
93
|
+
if (!overwrite) {
|
|
94
|
+
console.error(' Skipped.');
|
|
95
|
+
process.exit(0);
|
|
81
96
|
}
|
|
97
|
+
// Remove existing folder
|
|
98
|
+
const { rmSync } = await import('fs');
|
|
99
|
+
rmSync(targetDir, { recursive: true, force: true });
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
// Copy extension folder
|
|
103
|
+
cpSync(packageExtensionPath, targetDir, { recursive: true });
|
|
104
|
+
console.error(`ā
Extension extracted to: ${targetDir}\n`);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error('ā Failed to extract extension:', error.message);
|
|
108
|
+
process.exit(1);
|
|
82
109
|
}
|
|
83
110
|
// Show next steps
|
|
84
|
-
console.
|
|
85
|
-
console.
|
|
86
|
-
console.
|
|
87
|
-
console.
|
|
88
|
-
console.
|
|
89
|
-
console.
|
|
90
|
-
console.
|
|
91
|
-
console.
|
|
92
|
-
console.
|
|
93
|
-
console.
|
|
111
|
+
console.error('š Next Steps:');
|
|
112
|
+
console.error('');
|
|
113
|
+
console.error(' 1. Run: npx gravity-core setup-native-host');
|
|
114
|
+
console.error(' 2. Open Chrome and go to: chrome://extensions');
|
|
115
|
+
console.error(' 3. Enable "Developer mode" (toggle in top right)');
|
|
116
|
+
console.error(' 4. Click "Load unpacked"');
|
|
117
|
+
console.error(` 5. Select this folder: ${targetDir}`);
|
|
118
|
+
console.error(' 6. Run: npx gravity-core test-connection');
|
|
119
|
+
console.error('');
|
|
120
|
+
console.error('š Then configure your IDE with the MCP server!');
|
|
94
121
|
}
|
|
95
122
|
/**
|
|
96
|
-
*
|
|
123
|
+
* Handle setup-native-host command
|
|
97
124
|
*/
|
|
98
|
-
async function
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
// Tool definitions for MCP
|
|
105
|
-
const tools = [
|
|
106
|
-
{
|
|
107
|
-
name: 'diagnose_layout',
|
|
108
|
-
description: 'Diagnose CSS layout issues for a DOM element',
|
|
109
|
-
inputSchema: {
|
|
110
|
-
type: 'object',
|
|
111
|
-
properties: {
|
|
112
|
-
selector: {
|
|
113
|
-
type: 'string',
|
|
114
|
-
description: 'CSS selector for the element to diagnose (e.g., "#modal", ".button")',
|
|
115
|
-
},
|
|
116
|
-
},
|
|
117
|
-
required: ['selector'],
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
name: 'check_connection',
|
|
122
|
-
description: 'Check if browser is connected',
|
|
123
|
-
inputSchema: {
|
|
124
|
-
type: 'object',
|
|
125
|
-
properties: {},
|
|
126
|
-
},
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
name: 'highlight_element',
|
|
130
|
-
description: 'Highlight an element in the browser',
|
|
131
|
-
inputSchema: {
|
|
132
|
-
type: 'object',
|
|
133
|
-
properties: {
|
|
134
|
-
selector: {
|
|
135
|
-
type: 'string',
|
|
136
|
-
description: 'CSS selector for the element to highlight',
|
|
137
|
-
},
|
|
138
|
-
color: {
|
|
139
|
-
type: 'string',
|
|
140
|
-
description: 'Color for the highlight (default: red)',
|
|
141
|
-
},
|
|
142
|
-
duration: {
|
|
143
|
-
type: 'number',
|
|
144
|
-
description: 'Duration in milliseconds (default: 3000)',
|
|
145
|
-
},
|
|
146
|
-
},
|
|
147
|
-
required: ['selector'],
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
];
|
|
151
|
-
/**
|
|
152
|
-
* Handle MCP tool calls
|
|
153
|
-
*/
|
|
154
|
-
async function handleToolCall(toolName, params) {
|
|
155
|
-
switch (toolName) {
|
|
156
|
-
case 'diagnose_layout': {
|
|
157
|
-
if (!bridge.isConnected()) {
|
|
158
|
-
throw new Error('Not connected to browser. Make sure the Gravity extension is loaded and you clicked "Connect to Tab".');
|
|
159
|
-
}
|
|
160
|
-
const result = await bridge.diagnoseLayout(params.selector);
|
|
161
|
-
return result;
|
|
162
|
-
}
|
|
163
|
-
case 'check_connection': {
|
|
164
|
-
const status = bridge.getStatus();
|
|
165
|
-
return {
|
|
166
|
-
connected: status.connected,
|
|
167
|
-
message: status.message,
|
|
168
|
-
timestamp: status.timestamp,
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
case 'highlight_element': {
|
|
172
|
-
if (!bridge.isConnected()) {
|
|
173
|
-
throw new Error('Not connected to browser');
|
|
174
|
-
}
|
|
175
|
-
// This would require additional implementation in the bridge
|
|
176
|
-
// For now, return a message
|
|
177
|
-
return {
|
|
178
|
-
success: true,
|
|
179
|
-
message: `Highlight request sent for ${params.selector}`,
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
default:
|
|
183
|
-
throw new Error(`Unknown tool: ${toolName}`);
|
|
184
|
-
}
|
|
125
|
+
async function handleSetupNativeHost() {
|
|
126
|
+
console.error('š Gravity Native Host Setup\n');
|
|
127
|
+
if (platform() !== 'win32') {
|
|
128
|
+
console.error('ā Native host setup is currently only supported on Windows.');
|
|
129
|
+
console.error(' macOS and Linux support coming soon.');
|
|
130
|
+
process.exit(1);
|
|
185
131
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
id: request.id,
|
|
222
|
-
result: {
|
|
223
|
-
type: 'text',
|
|
224
|
-
text: JSON.stringify(result, null, 2),
|
|
225
|
-
},
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
return {
|
|
229
|
-
jsonrpc: '2.0',
|
|
230
|
-
id: request.id,
|
|
231
|
-
error: {
|
|
232
|
-
code: -32601,
|
|
233
|
-
message: 'Method not found',
|
|
234
|
-
},
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
catch (error) {
|
|
238
|
-
return {
|
|
239
|
-
jsonrpc: '2.0',
|
|
240
|
-
id: request.id,
|
|
241
|
-
error: {
|
|
242
|
-
code: -32603,
|
|
243
|
-
message: error.message || 'Internal error',
|
|
244
|
-
data: {
|
|
245
|
-
type: error.constructor.name,
|
|
246
|
-
},
|
|
247
|
-
},
|
|
248
|
-
};
|
|
249
|
-
}
|
|
132
|
+
// Step 1: Detect extension ID
|
|
133
|
+
console.error('š Detecting Gravity extension ID...');
|
|
134
|
+
const extensionId = detectGravityExtensionId();
|
|
135
|
+
if (!extensionId) {
|
|
136
|
+
console.error('ā Could not find Gravity extension.');
|
|
137
|
+
console.error('');
|
|
138
|
+
console.error('Make sure you have:');
|
|
139
|
+
console.error('1. Run: npx gravity-core setup-extension');
|
|
140
|
+
console.error('2. Opened Chrome and gone to: chrome://extensions');
|
|
141
|
+
console.error('3. Enabled "Developer mode" (toggle in top right)');
|
|
142
|
+
console.error('4. Clicked "Load unpacked"');
|
|
143
|
+
console.error('5. Selected the ~/.gravity-extension folder');
|
|
144
|
+
console.error('');
|
|
145
|
+
console.error('Then run this command again.');
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
console.error(`ā
Found extension ID: ${extensionId}\n`);
|
|
149
|
+
// Step 2: Confirm registry modification
|
|
150
|
+
const confirmed = await promptConfirm('ā ļø Gravity needs to add a native-messaging registry entry. Proceed?');
|
|
151
|
+
if (!confirmed) {
|
|
152
|
+
console.error(' Cancelled.');
|
|
153
|
+
process.exit(0);
|
|
154
|
+
}
|
|
155
|
+
console.error('');
|
|
156
|
+
// Step 3: Copy native host files
|
|
157
|
+
console.error('š Setting up native host...');
|
|
158
|
+
const packageHostPath = join(__dirname, '..', 'native-host');
|
|
159
|
+
const targetHostDir = getGravityHostDir();
|
|
160
|
+
if (!existsSync(packageHostPath)) {
|
|
161
|
+
console.error('ā Native host files not found in package.');
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
if (existsSync(targetHostDir)) {
|
|
165
|
+
const { rmSync } = await import('fs');
|
|
166
|
+
rmSync(targetHostDir, { recursive: true, force: true });
|
|
250
167
|
}
|
|
251
|
-
console.log('š Gravity MCP Server starting...');
|
|
252
|
-
console.log(`š” Connecting to extension on port ${port}...`);
|
|
253
|
-
// Connect to browser
|
|
254
168
|
try {
|
|
255
|
-
|
|
256
|
-
console.
|
|
169
|
+
cpSync(packageHostPath, targetHostDir, { recursive: true });
|
|
170
|
+
console.error(`ā
Native host copied to: ${targetHostDir}`);
|
|
257
171
|
}
|
|
258
172
|
catch (error) {
|
|
259
|
-
console.error('ā Failed to
|
|
260
|
-
console.error('');
|
|
261
|
-
console.error('Make sure:');
|
|
262
|
-
console.error('1. Chrome/Edge is open');
|
|
263
|
-
console.error('2. Gravity extension is loaded (chrome://extensions)');
|
|
264
|
-
console.error('3. You clicked "Connect to Tab" in the extension popup');
|
|
265
|
-
console.error('4. Port 9224 is not blocked by firewall');
|
|
266
|
-
console.error('');
|
|
267
|
-
console.error('Need to install the extension? Run:');
|
|
268
|
-
console.error(' npx gravity-core setup-extension');
|
|
173
|
+
console.error('ā Failed to copy native host:', error.message);
|
|
269
174
|
process.exit(1);
|
|
270
175
|
}
|
|
271
|
-
//
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
176
|
+
// Step 4: Patch manifest with extension ID and path
|
|
177
|
+
const manifestPath = join(targetHostDir, 'manifest.json');
|
|
178
|
+
const hostBatPath = join(targetHostDir, 'devtools-bridge-host.bat');
|
|
179
|
+
try {
|
|
180
|
+
patchManifest(manifestPath, extensionId, hostBatPath);
|
|
181
|
+
console.error('ā
Manifest patched with extension ID and path');
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
console.error('ā Failed to patch manifest:', error.message);
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
// Step 5: Write registry key
|
|
188
|
+
console.error('š Writing registry key...');
|
|
189
|
+
try {
|
|
190
|
+
writeRegistryKey('com.devtools.bridge', manifestPath);
|
|
191
|
+
console.error('ā
Registry key written successfully');
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
console.error('ā Failed to write registry key:', error.message);
|
|
195
|
+
console.error(' You may need to run as Administrator.');
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
console.error('');
|
|
199
|
+
console.error('ā
Native host setup complete!\n');
|
|
200
|
+
// Step 6: Prompt to restart Chrome
|
|
201
|
+
await promptRestartChrome();
|
|
202
|
+
console.error('');
|
|
203
|
+
console.error('š Next Steps:');
|
|
204
|
+
console.error(' 1. Open Chrome and go to: chrome://extensions');
|
|
205
|
+
console.error(' 2. Enable "Developer mode" (toggle in top right)');
|
|
206
|
+
console.error(' 3. Click "Load unpacked"');
|
|
207
|
+
console.error(` 4. Select this folder: ${getGravityExtensionDir()}`);
|
|
208
|
+
console.error(' 5. Run: npx gravity-core test-connection');
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Handle test-connection command
|
|
212
|
+
*/
|
|
213
|
+
async function handleTestConnection() {
|
|
214
|
+
console.error('š Gravity Connection Test\n');
|
|
215
|
+
const checks = [];
|
|
216
|
+
// Check 1: Registry key exists
|
|
217
|
+
console.error('š Checking registry key...');
|
|
218
|
+
const regKeyExists = registryKeyExists('com.devtools.bridge');
|
|
219
|
+
checks.push({ name: 'Registry key exists', passed: regKeyExists });
|
|
220
|
+
if (regKeyExists) {
|
|
221
|
+
console.error(' ā
Registry key found');
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
console.error(' ā Registry key not found');
|
|
225
|
+
console.error(' Run: npx gravity-core setup-native-host');
|
|
226
|
+
}
|
|
227
|
+
// Check 2: Manifest file exists
|
|
228
|
+
console.error('š Checking manifest file...');
|
|
229
|
+
const manifestPath = join(getGravityHostDir(), 'manifest.json');
|
|
230
|
+
const manifestExists = existsSync(manifestPath);
|
|
231
|
+
checks.push({ name: 'Manifest file exists', passed: manifestExists });
|
|
232
|
+
if (manifestExists) {
|
|
233
|
+
console.error(' ā
Manifest file found');
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
console.error(' ā Manifest file not found');
|
|
237
|
+
}
|
|
238
|
+
// Check 3: Validate manifest
|
|
239
|
+
if (manifestExists) {
|
|
240
|
+
console.error('š Validating manifest...');
|
|
241
|
+
const validation = validateManifest(manifestPath);
|
|
242
|
+
checks.push({ name: 'Manifest valid', passed: validation.valid });
|
|
243
|
+
if (validation.valid) {
|
|
244
|
+
console.error(' ā
Manifest is valid');
|
|
245
|
+
// Check extension ID in manifest
|
|
246
|
+
const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
247
|
+
if (manifest.allowed_origins && manifest.allowed_origins.length > 0) {
|
|
248
|
+
console.error(` ā
Extension ID configured: ${manifest.allowed_origins[0]}`);
|
|
290
249
|
}
|
|
291
250
|
}
|
|
251
|
+
else {
|
|
252
|
+
console.error(' ā Manifest validation failed:');
|
|
253
|
+
validation.errors.forEach((err) => console.error(` - ${err}`));
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Check 4: Native host executable exists
|
|
257
|
+
console.error('š Checking native host executable...');
|
|
258
|
+
const hostPath = join(getGravityHostDir(), 'devtools-bridge-host.bat');
|
|
259
|
+
const hostExists = nativeHostExists(hostPath);
|
|
260
|
+
checks.push({ name: 'Native host executable found', passed: hostExists });
|
|
261
|
+
if (hostExists) {
|
|
262
|
+
console.error(' ā
Native host executable found');
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
console.error(' ā Native host executable not found');
|
|
266
|
+
}
|
|
267
|
+
// Check 5: WebSocket connection
|
|
268
|
+
console.error('š Testing WebSocket connection...');
|
|
269
|
+
const wsConnected = await testWebSocketConnection(9224);
|
|
270
|
+
checks.push({ name: 'WebSocket connection', passed: wsConnected });
|
|
271
|
+
if (wsConnected) {
|
|
272
|
+
console.error(' ā
WebSocket connection successful');
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
console.error(' ā WebSocket connection failed');
|
|
276
|
+
console.error(' Make sure the MCP server is running: gravity');
|
|
277
|
+
}
|
|
278
|
+
// Summary
|
|
279
|
+
console.error('\nš Connection Status:\n');
|
|
280
|
+
checks.forEach((check) => {
|
|
281
|
+
const icon = check.passed ? 'ā
' : 'ā';
|
|
282
|
+
console.error(` ${icon} ${check.name}`);
|
|
292
283
|
});
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
284
|
+
const allPassed = checks.every((c) => c.passed);
|
|
285
|
+
console.error('');
|
|
286
|
+
if (allPassed) {
|
|
287
|
+
console.error('š Gravity is ready! All checks passed.\n');
|
|
288
|
+
console.error(' You can now use Gravity in your IDE.');
|
|
296
289
|
process.exit(0);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
console.error('Fatal error:', error);
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
console.error('ā ļø Some checks failed. Please review the errors above.\n');
|
|
301
293
|
process.exit(1);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Run the MCP server
|
|
298
|
+
* Delegates to mcp-server.ts for strict JSON-RPC protocol compliance
|
|
299
|
+
*/
|
|
300
|
+
async function runMCPServer() {
|
|
301
|
+
// Import the dedicated MCP server module
|
|
302
|
+
const { spawn } = await import('child_process');
|
|
303
|
+
// Run mcp-server.js directly as a subprocess
|
|
304
|
+
// This ensures strict JSON-RPC protocol compliance with no CLI output
|
|
305
|
+
const mcpServer = spawn('node', [require.resolve('./mcp-server.js')], {
|
|
306
|
+
stdio: ['inherit', 'inherit', 'inherit'],
|
|
307
|
+
env: process.env,
|
|
302
308
|
});
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
console.log('\nShutting down gracefully...');
|
|
306
|
-
await bridge.disconnectBrowser();
|
|
307
|
-
process.exit(0);
|
|
309
|
+
mcpServer.on('exit', (code) => {
|
|
310
|
+
process.exit(code || 0);
|
|
308
311
|
});
|
|
309
|
-
|
|
310
|
-
console.
|
|
311
|
-
|
|
312
|
-
process.exit(0);
|
|
312
|
+
mcpServer.on('error', (error) => {
|
|
313
|
+
console.error('Failed to start MCP server:', error.message);
|
|
314
|
+
process.exit(1);
|
|
313
315
|
});
|
|
314
316
|
}
|
|
315
317
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|