@dynamicu/chromedebug-mcp 2.2.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/CLAUDE.md +344 -0
- package/LICENSE +21 -0
- package/README.md +250 -0
- package/chrome-extension/README.md +41 -0
- package/chrome-extension/background.js +3917 -0
- package/chrome-extension/chrome-session-manager.js +706 -0
- package/chrome-extension/content.css +181 -0
- package/chrome-extension/content.js +3022 -0
- package/chrome-extension/data-buffer.js +435 -0
- package/chrome-extension/dom-tracker.js +411 -0
- package/chrome-extension/extension-config.js +78 -0
- package/chrome-extension/firebase-client.js +278 -0
- package/chrome-extension/firebase-config.js +32 -0
- package/chrome-extension/firebase-config.module.js +22 -0
- package/chrome-extension/firebase-config.module.template.js +27 -0
- package/chrome-extension/firebase-config.template.js +36 -0
- package/chrome-extension/frame-capture.js +407 -0
- package/chrome-extension/icon128.png +1 -0
- package/chrome-extension/icon16.png +1 -0
- package/chrome-extension/icon48.png +1 -0
- package/chrome-extension/license-helper.js +181 -0
- package/chrome-extension/logger.js +23 -0
- package/chrome-extension/manifest.json +73 -0
- package/chrome-extension/network-tracker.js +510 -0
- package/chrome-extension/offscreen.html +10 -0
- package/chrome-extension/options.html +203 -0
- package/chrome-extension/options.js +282 -0
- package/chrome-extension/pako.min.js +2 -0
- package/chrome-extension/performance-monitor.js +533 -0
- package/chrome-extension/pii-redactor.js +405 -0
- package/chrome-extension/popup.html +532 -0
- package/chrome-extension/popup.js +2446 -0
- package/chrome-extension/upload-manager.js +323 -0
- package/chrome-extension/web-vitals.iife.js +1 -0
- package/config/api-keys.json +11 -0
- package/config/chrome-pilot-config.json +45 -0
- package/package.json +126 -0
- package/scripts/cleanup-processes.js +109 -0
- package/scripts/config-manager.js +280 -0
- package/scripts/generate-extension-config.js +53 -0
- package/scripts/setup-security.js +64 -0
- package/src/capture/architecture.js +426 -0
- package/src/capture/error-handling-tests.md +38 -0
- package/src/capture/error-handling-types.ts +360 -0
- package/src/capture/index.js +508 -0
- package/src/capture/interfaces.js +625 -0
- package/src/capture/memory-manager.js +713 -0
- package/src/capture/types.js +342 -0
- package/src/chrome-controller.js +2658 -0
- package/src/cli.js +19 -0
- package/src/config-loader.js +303 -0
- package/src/database.js +2178 -0
- package/src/firebase-license-manager.js +462 -0
- package/src/firebase-privacy-guard.js +397 -0
- package/src/http-server.js +1516 -0
- package/src/index-direct.js +157 -0
- package/src/index-modular.js +219 -0
- package/src/index-monolithic-backup.js +2230 -0
- package/src/index.js +305 -0
- package/src/legacy/chrome-controller-old.js +1406 -0
- package/src/legacy/index-express.js +625 -0
- package/src/legacy/index-old.js +977 -0
- package/src/legacy/routes.js +260 -0
- package/src/legacy/shared-storage.js +101 -0
- package/src/logger.js +10 -0
- package/src/mcp/handlers/chrome-tool-handler.js +306 -0
- package/src/mcp/handlers/element-tool-handler.js +51 -0
- package/src/mcp/handlers/frame-tool-handler.js +957 -0
- package/src/mcp/handlers/request-handler.js +104 -0
- package/src/mcp/handlers/workflow-tool-handler.js +636 -0
- package/src/mcp/server.js +68 -0
- package/src/mcp/tools/index.js +701 -0
- package/src/middleware/auth.js +371 -0
- package/src/middleware/security.js +267 -0
- package/src/port-discovery.js +258 -0
- package/src/routes/admin.js +182 -0
- package/src/services/browser-daemon.js +494 -0
- package/src/services/chrome-service.js +375 -0
- package/src/services/failover-manager.js +412 -0
- package/src/services/git-safety-service.js +675 -0
- package/src/services/heartbeat-manager.js +200 -0
- package/src/services/http-client.js +195 -0
- package/src/services/process-manager.js +318 -0
- package/src/services/process-tracker.js +574 -0
- package/src/services/profile-manager.js +449 -0
- package/src/services/project-manager.js +415 -0
- package/src/services/session-manager.js +497 -0
- package/src/services/session-registry.js +491 -0
- package/src/services/unified-session-manager.js +678 -0
- package/src/shared-storage-old.js +267 -0
- package/src/standalone-server.js +53 -0
- package/src/utils/extension-path.js +145 -0
- package/src/utils.js +187 -0
- package/src/validation/log-transformer.js +125 -0
- package/src/validation/schemas.js +391 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Configuration management CLI for Chrome Debug
|
|
3
|
+
import { configLoader } from '../src/config-loader.js';
|
|
4
|
+
import { generateExtensionConfig } from './generate-extension-config.js';
|
|
5
|
+
|
|
6
|
+
const args = process.argv.slice(2);
|
|
7
|
+
const command = args[0];
|
|
8
|
+
|
|
9
|
+
function showHelp() {
|
|
10
|
+
console.log(`
|
|
11
|
+
Chrome Debug Configuration Manager
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
node scripts/config-manager.js <command> [options]
|
|
15
|
+
|
|
16
|
+
Commands:
|
|
17
|
+
show - Display current configuration
|
|
18
|
+
list-ports - Show current port configuration
|
|
19
|
+
set-http-ports <ports> - Set HTTP server ports (comma-separated)
|
|
20
|
+
set-mcp-ports <ports> - Set MCP server ports (comma-separated)
|
|
21
|
+
set-scan-order <order> - Set extension port scan order (httpFirst|mcpFirst|sequential)
|
|
22
|
+
set-timeout <ms> - Set server discovery timeout in milliseconds
|
|
23
|
+
set-range <start> <end> - Set port discovery range
|
|
24
|
+
reset - Reset to default configuration
|
|
25
|
+
help - Show this help message
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
node scripts/config-manager.js list-ports
|
|
29
|
+
node scripts/config-manager.js set-http-ports 3001,3000,3002
|
|
30
|
+
node scripts/config-manager.js set-scan-order httpFirst
|
|
31
|
+
node scripts/config-manager.js set-timeout 5000
|
|
32
|
+
node scripts/config-manager.js set-range 3000 3030
|
|
33
|
+
`);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function showConfig() {
|
|
37
|
+
const config = configLoader.loadConfig();
|
|
38
|
+
console.log('\nš Current Configuration:');
|
|
39
|
+
console.log(JSON.stringify(config, null, 2));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function listPorts() {
|
|
43
|
+
console.log('\nš Current Port Configuration:');
|
|
44
|
+
console.log('HTTP Server Ports:', configLoader.getHttpServerPorts());
|
|
45
|
+
console.log('MCP Server Ports:', configLoader.getMcpServerPorts());
|
|
46
|
+
console.log('Extension Port List:', configLoader.getExtensionPortList());
|
|
47
|
+
console.log('Discovery Timeout:', configLoader.getDiscoveryTimeout() + 'ms');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function setHttpPorts(portsString) {
|
|
51
|
+
try {
|
|
52
|
+
const ports = portsString.split(',').map(p => parseInt(p.trim(), 10));
|
|
53
|
+
const invalidPorts = ports.filter(p => isNaN(p) || p < 1 || p > 65535);
|
|
54
|
+
|
|
55
|
+
if (invalidPorts.length > 0) {
|
|
56
|
+
console.error('ā Invalid ports:', invalidPorts);
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const success = configLoader.updateConfig({
|
|
61
|
+
serverPorts: {
|
|
62
|
+
...configLoader.loadConfig().serverPorts,
|
|
63
|
+
httpServer: {
|
|
64
|
+
...configLoader.loadConfig().serverPorts.httpServer,
|
|
65
|
+
preferredPorts: ports
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
if (success) {
|
|
71
|
+
console.log('ā
HTTP server ports updated:', ports);
|
|
72
|
+
generateExtensionConfig();
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
} catch (error) {
|
|
76
|
+
console.error('ā Error setting HTTP ports:', error.message);
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function setMcpPorts(portsString) {
|
|
82
|
+
try {
|
|
83
|
+
const ports = portsString.split(',').map(p => parseInt(p.trim(), 10));
|
|
84
|
+
const invalidPorts = ports.filter(p => isNaN(p) || p < 1 || p > 65535);
|
|
85
|
+
|
|
86
|
+
if (invalidPorts.length > 0) {
|
|
87
|
+
console.error('ā Invalid ports:', invalidPorts);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const success = configLoader.updateConfig({
|
|
92
|
+
serverPorts: {
|
|
93
|
+
...configLoader.loadConfig().serverPorts,
|
|
94
|
+
mcpServer: {
|
|
95
|
+
...configLoader.loadConfig().serverPorts.mcpServer,
|
|
96
|
+
preferredPorts: ports
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
if (success) {
|
|
102
|
+
console.log('ā
MCP server ports updated:', ports);
|
|
103
|
+
generateExtensionConfig();
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error('ā Error setting MCP ports:', error.message);
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function setScanOrder(order) {
|
|
113
|
+
const validOrders = ['httpFirst', 'mcpFirst', 'sequential'];
|
|
114
|
+
|
|
115
|
+
if (!validOrders.includes(order)) {
|
|
116
|
+
console.error('ā Invalid scan order. Must be one of:', validOrders.join(', '));
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
try {
|
|
121
|
+
const success = configLoader.updateConfig({
|
|
122
|
+
chromeExtension: {
|
|
123
|
+
...configLoader.loadConfig().chromeExtension,
|
|
124
|
+
portScanOrder: order
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
if (success) {
|
|
129
|
+
console.log('ā
Port scan order updated:', order);
|
|
130
|
+
generateExtensionConfig();
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
} catch (error) {
|
|
134
|
+
console.error('ā Error setting scan order:', error.message);
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function setTimeout(timeoutMs) {
|
|
140
|
+
const timeout = parseInt(timeoutMs, 10);
|
|
141
|
+
|
|
142
|
+
if (isNaN(timeout) || timeout < 100 || timeout > 30000) {
|
|
143
|
+
console.error('ā Invalid timeout. Must be between 100ms and 30000ms');
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
const success = configLoader.updateConfig({
|
|
149
|
+
chromeExtension: {
|
|
150
|
+
...configLoader.loadConfig().chromeExtension,
|
|
151
|
+
serverDiscovery: {
|
|
152
|
+
...configLoader.loadConfig().chromeExtension.serverDiscovery,
|
|
153
|
+
timeoutMs: timeout
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
if (success) {
|
|
159
|
+
console.log('ā
Discovery timeout updated:', timeout + 'ms');
|
|
160
|
+
generateExtensionConfig();
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
} catch (error) {
|
|
164
|
+
console.error('ā Error setting timeout:', error.message);
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
function setRange(start, end) {
|
|
170
|
+
const startPort = parseInt(start, 10);
|
|
171
|
+
const endPort = parseInt(end, 10);
|
|
172
|
+
|
|
173
|
+
if (isNaN(startPort) || isNaN(endPort) || startPort < 1 || endPort > 65535 || startPort >= endPort) {
|
|
174
|
+
console.error('ā Invalid port range. Start must be < end, both between 1-65535');
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
try {
|
|
179
|
+
const success = configLoader.updateConfig({
|
|
180
|
+
serverPorts: {
|
|
181
|
+
...configLoader.loadConfig().serverPorts,
|
|
182
|
+
discoveryRange: {
|
|
183
|
+
...configLoader.loadConfig().serverPorts.discoveryRange,
|
|
184
|
+
start: startPort,
|
|
185
|
+
end: endPort
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
if (success) {
|
|
191
|
+
console.log(`ā
Discovery range updated: ${startPort}-${endPort}`);
|
|
192
|
+
generateExtensionConfig();
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
} catch (error) {
|
|
196
|
+
console.error('ā Error setting range:', error.message);
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function resetConfig() {
|
|
202
|
+
try {
|
|
203
|
+
const success = configLoader.updateConfig(configLoader.DEFAULT_CONFIG);
|
|
204
|
+
|
|
205
|
+
if (success) {
|
|
206
|
+
console.log('ā
Configuration reset to defaults');
|
|
207
|
+
generateExtensionConfig();
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
} catch (error) {
|
|
211
|
+
console.error('ā Error resetting configuration:', error.message);
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Main command handler
|
|
217
|
+
switch (command) {
|
|
218
|
+
case 'show':
|
|
219
|
+
showConfig();
|
|
220
|
+
break;
|
|
221
|
+
|
|
222
|
+
case 'list-ports':
|
|
223
|
+
listPorts();
|
|
224
|
+
break;
|
|
225
|
+
|
|
226
|
+
case 'set-http-ports':
|
|
227
|
+
if (!args[1]) {
|
|
228
|
+
console.error('ā Please provide ports (comma-separated)');
|
|
229
|
+
process.exit(1);
|
|
230
|
+
}
|
|
231
|
+
setHttpPorts(args[1]);
|
|
232
|
+
break;
|
|
233
|
+
|
|
234
|
+
case 'set-mcp-ports':
|
|
235
|
+
if (!args[1]) {
|
|
236
|
+
console.error('ā Please provide ports (comma-separated)');
|
|
237
|
+
process.exit(1);
|
|
238
|
+
}
|
|
239
|
+
setMcpPorts(args[1]);
|
|
240
|
+
break;
|
|
241
|
+
|
|
242
|
+
case 'set-scan-order':
|
|
243
|
+
if (!args[1]) {
|
|
244
|
+
console.error('ā Please provide scan order (httpFirst|mcpFirst|sequential)');
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
setScanOrder(args[1]);
|
|
248
|
+
break;
|
|
249
|
+
|
|
250
|
+
case 'set-timeout':
|
|
251
|
+
if (!args[1]) {
|
|
252
|
+
console.error('ā Please provide timeout in milliseconds');
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
setTimeout(args[1]);
|
|
256
|
+
break;
|
|
257
|
+
|
|
258
|
+
case 'set-range':
|
|
259
|
+
if (!args[1] || !args[2]) {
|
|
260
|
+
console.error('ā Please provide start and end ports');
|
|
261
|
+
process.exit(1);
|
|
262
|
+
}
|
|
263
|
+
setRange(args[1], args[2]);
|
|
264
|
+
break;
|
|
265
|
+
|
|
266
|
+
case 'reset':
|
|
267
|
+
resetConfig();
|
|
268
|
+
break;
|
|
269
|
+
|
|
270
|
+
case 'help':
|
|
271
|
+
case '--help':
|
|
272
|
+
case '-h':
|
|
273
|
+
showHelp();
|
|
274
|
+
break;
|
|
275
|
+
|
|
276
|
+
default:
|
|
277
|
+
console.error('ā Unknown command:', command);
|
|
278
|
+
showHelp();
|
|
279
|
+
process.exit(1);
|
|
280
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Script to generate Chrome extension configuration from main config file
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { configLoader } from '../src/config-loader.js';
|
|
7
|
+
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const EXTENSION_CONFIG_PATH = path.join(__dirname, '../chrome-extension/extension-config.js');
|
|
10
|
+
|
|
11
|
+
function generateExtensionConfig() {
|
|
12
|
+
try {
|
|
13
|
+
const ports = configLoader.getExtensionPortList();
|
|
14
|
+
const timeout = configLoader.getDiscoveryTimeout();
|
|
15
|
+
|
|
16
|
+
const configContent = `// Auto-generated configuration from Chrome Debug config
|
|
17
|
+
// DO NOT EDIT MANUALLY - Run 'npm run update-extension-config' to regenerate
|
|
18
|
+
|
|
19
|
+
const CHROMEDEBUG_CONFIG = {
|
|
20
|
+
ports: ${JSON.stringify(ports, null, 2)},
|
|
21
|
+
discoveryTimeout: ${timeout},
|
|
22
|
+
lastGenerated: '${new Date().toISOString()}'
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// Export for use in extension scripts
|
|
26
|
+
if (typeof module !== 'undefined' && module.exports) {
|
|
27
|
+
module.exports = CHROMEDEBUG_CONFIG;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// For browser environments
|
|
31
|
+
if (typeof window !== 'undefined') {
|
|
32
|
+
window.CHROMEDEBUG_CONFIG = CHROMEDEBUG_CONFIG;
|
|
33
|
+
}
|
|
34
|
+
`;
|
|
35
|
+
|
|
36
|
+
fs.writeFileSync(EXTENSION_CONFIG_PATH, configContent);
|
|
37
|
+
console.log(`ā
Extension configuration generated at: ${EXTENSION_CONFIG_PATH}`);
|
|
38
|
+
console.log(`š Port list (${ports.length} ports):`, ports);
|
|
39
|
+
console.log(`ā±ļø Discovery timeout: ${timeout}ms`);
|
|
40
|
+
|
|
41
|
+
return true;
|
|
42
|
+
} catch (error) {
|
|
43
|
+
console.error('ā Error generating extension configuration:', error.message);
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Run if called directly
|
|
49
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
50
|
+
generateExtensionConfig();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { generateExtensionConfig };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { generateApiKey, listApiKeys, ROLES } from '../src/middleware/auth.js';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { fileURLToPath } from 'url';
|
|
7
|
+
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
|
|
11
|
+
console.log('=== Chrome Debug Security Setup ===\n');
|
|
12
|
+
|
|
13
|
+
// Check if any API keys exist
|
|
14
|
+
const existingKeys = listApiKeys();
|
|
15
|
+
const adminKeys = existingKeys.filter(key => key.role === ROLES.ADMIN && key.active);
|
|
16
|
+
|
|
17
|
+
if (adminKeys.length === 0) {
|
|
18
|
+
console.log('No active admin API keys found. Creating default admin key...\n');
|
|
19
|
+
|
|
20
|
+
const adminKey = generateApiKey('Setup Admin', ROLES.ADMIN);
|
|
21
|
+
|
|
22
|
+
console.log('ā
Admin API key created successfully!');
|
|
23
|
+
console.log(`\nAPI Key: ${adminKey.apiKey}`);
|
|
24
|
+
console.log('\nā ļø IMPORTANT: Save this key securely! You won\'t see it again.\n');
|
|
25
|
+
|
|
26
|
+
// Save to a temporary file for reference
|
|
27
|
+
const keyFile = path.join(__dirname, '../.admin-key.txt');
|
|
28
|
+
fs.writeFileSync(keyFile, `Admin API Key: ${adminKey.apiKey}\nCreated: ${new Date().toISOString()}\n`);
|
|
29
|
+
console.log(`Key also saved to: ${keyFile}`);
|
|
30
|
+
console.log('Delete this file after copying the key to a secure location.\n');
|
|
31
|
+
} else {
|
|
32
|
+
console.log(`Found ${adminKeys.length} active admin key(s):\n`);
|
|
33
|
+
adminKeys.forEach(key => {
|
|
34
|
+
console.log(`- ${key.name} (created: ${key.createdAt})`);
|
|
35
|
+
});
|
|
36
|
+
console.log('\nNo new admin key created.\n');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
console.log('Current API Keys:');
|
|
40
|
+
console.log('================');
|
|
41
|
+
const allKeys = listApiKeys();
|
|
42
|
+
if (allKeys.length === 0) {
|
|
43
|
+
console.log('No API keys found.');
|
|
44
|
+
} else {
|
|
45
|
+
allKeys.forEach(key => {
|
|
46
|
+
const status = key.active ? 'ā
Active' : 'ā Revoked';
|
|
47
|
+
const lastUsed = key.lastUsed ? new Date(key.lastUsed).toLocaleString() : 'Never';
|
|
48
|
+
console.log(`${key.name} (${key.role}) - ${status} - Last used: ${lastUsed}`);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
console.log('\nNext Steps:');
|
|
53
|
+
console.log('===========');
|
|
54
|
+
console.log('1. Copy your admin API key to a secure location');
|
|
55
|
+
console.log('2. Set up environment variables (see .env.example)');
|
|
56
|
+
console.log('3. Create additional API keys for your applications:');
|
|
57
|
+
console.log(' curl -X POST http://localhost:3000/chrome-pilot/admin/api-keys \\');
|
|
58
|
+
console.log(' -H "X-API-Key: YOUR_ADMIN_KEY" \\');
|
|
59
|
+
console.log(' -H "Content-Type: application/json" \\');
|
|
60
|
+
console.log(' -d \'{"name": "My App", "role": "user"}\'');
|
|
61
|
+
console.log('4. Test authentication:');
|
|
62
|
+
console.log(' curl -H "X-API-Key: YOUR_KEY" http://localhost:3000/chrome-pilot/auth-test');
|
|
63
|
+
console.log('\nSee SECURITY.md for complete security documentation.');
|
|
64
|
+
console.log('\n=== Setup Complete ===');
|