dev3000 0.0.0 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +47 -0
- package/dist/cli.js.map +1 -0
- package/dist/dev-environment.d.ts +36 -0
- package/dist/dev-environment.d.ts.map +1 -0
- package/dist/dev-environment.js +602 -0
- package/dist/dev-environment.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/mcp-server/app/api/config/route.ts +10 -0
- package/mcp-server/app/api/logs/head/route.ts +32 -0
- package/mcp-server/app/api/logs/stream/route.ts +61 -0
- package/mcp-server/app/api/logs/tail/route.ts +32 -0
- package/mcp-server/app/api/mcp/[transport]/route.ts +188 -0
- package/mcp-server/app/layout.tsx +15 -0
- package/mcp-server/app/logs/LogsClient.tsx +292 -0
- package/mcp-server/app/logs/page.tsx +7 -0
- package/mcp-server/app/page.tsx +45 -0
- package/mcp-server/next-env.d.ts +6 -0
- package/mcp-server/next.config.ts +14 -0
- package/mcp-server/package.json +23 -0
- package/mcp-server/tsconfig.json +40 -0
- package/package.json +53 -7
|
@@ -0,0 +1,602 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { chromium } from 'playwright';
|
|
3
|
+
import { writeFileSync, appendFileSync, mkdirSync, existsSync, copyFileSync, readFileSync } from 'fs';
|
|
4
|
+
import { join, dirname } from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { tmpdir } from 'os';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import * as cliProgress from 'cli-progress';
|
|
9
|
+
class Logger {
|
|
10
|
+
logFile;
|
|
11
|
+
constructor(logFile) {
|
|
12
|
+
this.logFile = logFile;
|
|
13
|
+
// Ensure directory exists
|
|
14
|
+
const logDir = dirname(logFile);
|
|
15
|
+
if (!existsSync(logDir)) {
|
|
16
|
+
mkdirSync(logDir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
// Clear log file
|
|
19
|
+
writeFileSync(this.logFile, '');
|
|
20
|
+
}
|
|
21
|
+
log(source, message) {
|
|
22
|
+
const timestamp = new Date().toISOString();
|
|
23
|
+
const logEntry = `[${timestamp}] [${source.toUpperCase()}] ${message}\n`;
|
|
24
|
+
appendFileSync(this.logFile, logEntry);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function detectPackageManager() {
|
|
28
|
+
if (existsSync('pnpm-lock.yaml'))
|
|
29
|
+
return 'pnpx';
|
|
30
|
+
if (existsSync('yarn.lock'))
|
|
31
|
+
return 'yarn dlx';
|
|
32
|
+
if (existsSync('package-lock.json'))
|
|
33
|
+
return 'npx';
|
|
34
|
+
return 'npx'; // fallback
|
|
35
|
+
}
|
|
36
|
+
function detectPackageManagerForRun() {
|
|
37
|
+
if (existsSync('pnpm-lock.yaml'))
|
|
38
|
+
return 'pnpm';
|
|
39
|
+
if (existsSync('yarn.lock'))
|
|
40
|
+
return 'yarn';
|
|
41
|
+
if (existsSync('package-lock.json'))
|
|
42
|
+
return 'npm';
|
|
43
|
+
return 'npm'; // fallback
|
|
44
|
+
}
|
|
45
|
+
export class DevEnvironment {
|
|
46
|
+
serverProcess = null;
|
|
47
|
+
mcpServerProcess = null;
|
|
48
|
+
browser = null;
|
|
49
|
+
browserContext = null;
|
|
50
|
+
logger;
|
|
51
|
+
stateTimer = null;
|
|
52
|
+
browserType = null;
|
|
53
|
+
options;
|
|
54
|
+
screenshotDir;
|
|
55
|
+
mcpPublicDir;
|
|
56
|
+
pidFile;
|
|
57
|
+
progressBar;
|
|
58
|
+
constructor(options) {
|
|
59
|
+
this.options = options;
|
|
60
|
+
this.logger = new Logger(options.logFile);
|
|
61
|
+
this.screenshotDir = join(dirname(options.logFile), 'screenshots');
|
|
62
|
+
this.pidFile = join(tmpdir(), 'dev3000.pid');
|
|
63
|
+
// Set up MCP server public directory for web-accessible screenshots
|
|
64
|
+
const currentFile = fileURLToPath(import.meta.url);
|
|
65
|
+
const packageRoot = dirname(dirname(currentFile));
|
|
66
|
+
this.mcpPublicDir = join(packageRoot, 'mcp-server', 'public', 'screenshots');
|
|
67
|
+
// Initialize progress bar
|
|
68
|
+
this.progressBar = new cliProgress.SingleBar({
|
|
69
|
+
format: chalk.blue('Starting dev3000') + ' |' + chalk.cyan('{bar}') + '| {percentage}% | {stage}',
|
|
70
|
+
barCompleteChar: '█',
|
|
71
|
+
barIncompleteChar: '░',
|
|
72
|
+
hideCursor: true,
|
|
73
|
+
barsize: 40
|
|
74
|
+
}, cliProgress.Presets.shades_classic);
|
|
75
|
+
// Ensure directories exist
|
|
76
|
+
if (!existsSync(this.screenshotDir)) {
|
|
77
|
+
mkdirSync(this.screenshotDir, { recursive: true });
|
|
78
|
+
}
|
|
79
|
+
if (!existsSync(this.mcpPublicDir)) {
|
|
80
|
+
mkdirSync(this.mcpPublicDir, { recursive: true });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async checkPortsAvailable() {
|
|
84
|
+
const ports = [this.options.port, this.options.mcpPort];
|
|
85
|
+
for (const port of ports) {
|
|
86
|
+
try {
|
|
87
|
+
const result = await new Promise((resolve) => {
|
|
88
|
+
const proc = spawn('lsof', ['-ti', `:${port}`], { stdio: 'pipe' });
|
|
89
|
+
let output = '';
|
|
90
|
+
proc.stdout?.on('data', (data) => output += data.toString());
|
|
91
|
+
proc.on('exit', () => resolve(output.trim()));
|
|
92
|
+
});
|
|
93
|
+
if (result) {
|
|
94
|
+
const pids = result.split('\n').filter(line => line.trim());
|
|
95
|
+
console.log(chalk.red(`❌ Port ${port} is already in use`));
|
|
96
|
+
console.log(chalk.yellow(`💡 To free up port ${port}, run: lsof -ti:${port} | xargs kill -9`));
|
|
97
|
+
throw new Error(`Port ${port} is already in use. Please free the port and try again.`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
if (error instanceof Error && error.message.includes('Port')) {
|
|
102
|
+
throw error; // Re-throw our custom error
|
|
103
|
+
}
|
|
104
|
+
// Ignore other errors - port might just be free
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async start() {
|
|
109
|
+
// Start progress bar
|
|
110
|
+
this.progressBar.start(100, 0, { stage: 'Checking ports...' });
|
|
111
|
+
// Check if ports are available first
|
|
112
|
+
await this.checkPortsAvailable();
|
|
113
|
+
this.progressBar.update(10, { stage: 'Starting servers...' });
|
|
114
|
+
// Write our process group ID to PID file for cleanup
|
|
115
|
+
writeFileSync(this.pidFile, process.pid.toString());
|
|
116
|
+
// Setup cleanup handlers
|
|
117
|
+
this.setupCleanupHandlers();
|
|
118
|
+
// Start user's dev server
|
|
119
|
+
await this.startServer();
|
|
120
|
+
this.progressBar.update(20, { stage: 'Starting MCP server...' });
|
|
121
|
+
// Start MCP server
|
|
122
|
+
await this.startMcpServer();
|
|
123
|
+
this.progressBar.update(30, { stage: 'Waiting for your app server...' });
|
|
124
|
+
// Wait for both servers to be ready
|
|
125
|
+
await this.waitForServer();
|
|
126
|
+
this.progressBar.update(50, { stage: 'Waiting for MCP server...' });
|
|
127
|
+
await this.waitForMcpServer();
|
|
128
|
+
this.progressBar.update(70, { stage: 'Starting browser...' });
|
|
129
|
+
// Start browser monitoring
|
|
130
|
+
await this.startBrowserMonitoring();
|
|
131
|
+
this.progressBar.update(100, { stage: 'Complete!' });
|
|
132
|
+
// Stop progress bar and show results
|
|
133
|
+
this.progressBar.stop();
|
|
134
|
+
console.log(chalk.green('\n✅ Development environment ready!'));
|
|
135
|
+
console.log(chalk.blue(`📊 Logs: ${this.options.logFile}`));
|
|
136
|
+
console.log(chalk.gray(`🔧 MCP Server Logs: ${join(dirname(this.options.logFile), 'dev3000-mcp.log')}`));
|
|
137
|
+
console.log(chalk.yellow('☝️ Give this to an AI to auto debug and fix your app\n'));
|
|
138
|
+
console.log(chalk.blue(`🌐 Your App: http://localhost:${this.options.port}`));
|
|
139
|
+
console.log(chalk.blue(`🤖 MCP Server: http://localhost:${this.options.mcpPort}/api/mcp/http`));
|
|
140
|
+
console.log(chalk.magenta(`📸 Visual Timeline: http://localhost:${this.options.mcpPort}/logs`));
|
|
141
|
+
console.log(chalk.gray('\n💡 To stop all servers and kill dev3000: Ctrl-C'));
|
|
142
|
+
}
|
|
143
|
+
async startServer() {
|
|
144
|
+
const [command, ...args] = this.options.serverCommand.split(' ');
|
|
145
|
+
this.serverProcess = spawn(command, args, {
|
|
146
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
147
|
+
shell: true,
|
|
148
|
+
detached: true, // Run independently
|
|
149
|
+
});
|
|
150
|
+
// Log server output (to file only, reduce stdout noise)
|
|
151
|
+
this.serverProcess.stdout?.on('data', (data) => {
|
|
152
|
+
const message = data.toString().trim();
|
|
153
|
+
if (message) {
|
|
154
|
+
this.logger.log('server', message);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
this.serverProcess.stderr?.on('data', (data) => {
|
|
158
|
+
const message = data.toString().trim();
|
|
159
|
+
if (message) {
|
|
160
|
+
this.logger.log('server', `ERROR: ${message}`);
|
|
161
|
+
// Only show critical server errors in stdout
|
|
162
|
+
if (message.includes('FATAL') || message.includes('Error:')) {
|
|
163
|
+
console.error(chalk.red('[SERVER ERROR]'), message);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
this.serverProcess.on('exit', (code) => {
|
|
168
|
+
console.log(chalk.red(`Server process exited with code ${code}`));
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async startMcpServer() {
|
|
172
|
+
// Get the path to our bundled MCP server
|
|
173
|
+
const currentFile = fileURLToPath(import.meta.url);
|
|
174
|
+
const packageRoot = dirname(dirname(currentFile)); // Go up from dist/ to package root
|
|
175
|
+
const mcpServerPath = join(packageRoot, 'mcp-server');
|
|
176
|
+
if (!existsSync(mcpServerPath)) {
|
|
177
|
+
throw new Error(`MCP server directory not found at ${mcpServerPath}`);
|
|
178
|
+
}
|
|
179
|
+
// Read version from package.json
|
|
180
|
+
const versionCurrentFile = fileURLToPath(import.meta.url);
|
|
181
|
+
const versionPackageRoot = dirname(dirname(versionCurrentFile));
|
|
182
|
+
const packageJsonPath = join(versionPackageRoot, 'package.json');
|
|
183
|
+
let version = '0.0.0';
|
|
184
|
+
try {
|
|
185
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
186
|
+
version = packageJson.version;
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
console.log(chalk.yellow('⚠️ Could not read version from package.json'));
|
|
190
|
+
}
|
|
191
|
+
// Start the MCP server using detected package manager
|
|
192
|
+
const packageManagerForRun = detectPackageManagerForRun();
|
|
193
|
+
this.mcpServerProcess = spawn(packageManagerForRun, ['run', 'dev'], {
|
|
194
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
195
|
+
shell: true,
|
|
196
|
+
detached: true, // Run independently
|
|
197
|
+
cwd: mcpServerPath,
|
|
198
|
+
env: {
|
|
199
|
+
...process.env,
|
|
200
|
+
PORT: this.options.mcpPort,
|
|
201
|
+
LOG_FILE_PATH: this.options.logFile, // Pass log file path to MCP server
|
|
202
|
+
DEV3000_VERSION: version, // Pass version to MCP server
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
// Log MCP server output to separate file for debugging
|
|
206
|
+
const mcpLogFile = join(dirname(this.options.logFile), 'dev3000-mcp.log');
|
|
207
|
+
writeFileSync(mcpLogFile, ''); // Clear the file
|
|
208
|
+
this.mcpServerProcess.stdout?.on('data', (data) => {
|
|
209
|
+
const message = data.toString().trim();
|
|
210
|
+
if (message) {
|
|
211
|
+
const timestamp = new Date().toISOString();
|
|
212
|
+
appendFileSync(mcpLogFile, `[${timestamp}] [MCP-STDOUT] ${message}\n`);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
this.mcpServerProcess.stderr?.on('data', (data) => {
|
|
216
|
+
const message = data.toString().trim();
|
|
217
|
+
if (message) {
|
|
218
|
+
const timestamp = new Date().toISOString();
|
|
219
|
+
appendFileSync(mcpLogFile, `[${timestamp}] [MCP-STDERR] ${message}\n`);
|
|
220
|
+
// Only show critical errors in stdout for debugging
|
|
221
|
+
if (message.includes('FATAL') || message.includes('Error:')) {
|
|
222
|
+
console.error(chalk.red('[LOG VIEWER ERROR]'), message);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
this.mcpServerProcess.on('exit', (code) => {
|
|
227
|
+
console.log(chalk.red(`MCP server process exited with code ${code}`));
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
async waitForServer() {
|
|
231
|
+
const maxAttempts = 30;
|
|
232
|
+
let attempts = 0;
|
|
233
|
+
while (attempts < maxAttempts) {
|
|
234
|
+
try {
|
|
235
|
+
const response = await fetch(`http://localhost:${this.options.port}`, {
|
|
236
|
+
method: 'HEAD',
|
|
237
|
+
signal: AbortSignal.timeout(2000)
|
|
238
|
+
});
|
|
239
|
+
if (response.ok || response.status === 404) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
// Server not ready yet, continue waiting
|
|
245
|
+
}
|
|
246
|
+
attempts++;
|
|
247
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
248
|
+
}
|
|
249
|
+
// Continue anyway if health check fails
|
|
250
|
+
}
|
|
251
|
+
async waitForMcpServer() {
|
|
252
|
+
const maxAttempts = 30;
|
|
253
|
+
let attempts = 0;
|
|
254
|
+
while (attempts < maxAttempts) {
|
|
255
|
+
try {
|
|
256
|
+
const response = await fetch(`http://localhost:${this.options.mcpPort}`, {
|
|
257
|
+
method: 'HEAD',
|
|
258
|
+
signal: AbortSignal.timeout(2000)
|
|
259
|
+
});
|
|
260
|
+
if (response.ok || response.status === 404) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
// MCP server not ready yet, continue waiting
|
|
266
|
+
}
|
|
267
|
+
attempts++;
|
|
268
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
269
|
+
}
|
|
270
|
+
// Continue anyway if health check fails
|
|
271
|
+
}
|
|
272
|
+
async startBrowserMonitoring() {
|
|
273
|
+
// Ensure profile directory exists
|
|
274
|
+
if (!existsSync(this.options.profileDir)) {
|
|
275
|
+
mkdirSync(this.options.profileDir, { recursive: true });
|
|
276
|
+
}
|
|
277
|
+
try {
|
|
278
|
+
// Try to use system Chrome first
|
|
279
|
+
this.browser = await chromium.launch({
|
|
280
|
+
headless: false,
|
|
281
|
+
channel: 'chrome', // Use system Chrome
|
|
282
|
+
// Remove automation flags to allow normal dialog behavior
|
|
283
|
+
args: [
|
|
284
|
+
'--disable-web-security', // Keep this for dev server access
|
|
285
|
+
'--hide-crash-restore-bubble', // Don't ask to restore pages
|
|
286
|
+
'--disable-infobars', // Remove info bars
|
|
287
|
+
'--disable-blink-features=AutomationControlled', // Hide automation detection
|
|
288
|
+
'--disable-features=VizDisplayCompositor', // Reduce automation fingerprinting
|
|
289
|
+
],
|
|
290
|
+
});
|
|
291
|
+
this.browserType = 'system-chrome';
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
// Fallback to Playwright's bundled chromium
|
|
295
|
+
try {
|
|
296
|
+
this.browser = await chromium.launch({
|
|
297
|
+
headless: false,
|
|
298
|
+
// Remove automation flags to allow normal dialog behavior
|
|
299
|
+
args: [
|
|
300
|
+
'--disable-web-security', // Keep this for dev server access
|
|
301
|
+
'--hide-crash-restore-bubble', // Don't ask to restore pages
|
|
302
|
+
'--disable-infobars', // Remove info bars
|
|
303
|
+
'--disable-blink-features=AutomationControlled', // Hide automation detection
|
|
304
|
+
'--disable-features=VizDisplayCompositor', // Reduce automation fingerprinting
|
|
305
|
+
],
|
|
306
|
+
});
|
|
307
|
+
this.browserType = 'playwright-chromium';
|
|
308
|
+
}
|
|
309
|
+
catch (playwrightError) {
|
|
310
|
+
if (playwrightError.message?.includes('Executable doesn\'t exist')) {
|
|
311
|
+
const packageManager = detectPackageManager();
|
|
312
|
+
console.log(chalk.yellow('📦 Installing Playwright chromium browser...'));
|
|
313
|
+
await this.installPlaywrightBrowsers();
|
|
314
|
+
// Retry with bundled chromium
|
|
315
|
+
this.browser = await chromium.launch({
|
|
316
|
+
headless: false,
|
|
317
|
+
// Remove automation flags to allow normal dialog behavior
|
|
318
|
+
args: [
|
|
319
|
+
'--disable-web-security', // Keep this for dev server access
|
|
320
|
+
'--hide-crash-restore-bubble', // Don't ask to restore pages
|
|
321
|
+
'--disable-infobars', // Remove info bars
|
|
322
|
+
],
|
|
323
|
+
});
|
|
324
|
+
this.browserType = 'playwright-chromium';
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
throw playwrightError;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// Create context with viewport: null to enable window resizing + persistent storage
|
|
332
|
+
try {
|
|
333
|
+
const stateFile = join(this.options.profileDir, 'state.json');
|
|
334
|
+
this.browserContext = await this.browser.newContext({
|
|
335
|
+
viewport: null, // This makes the page size depend on the window size
|
|
336
|
+
storageState: existsSync(stateFile) ? stateFile : undefined, // Load persistent state if it exists
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
console.error(chalk.red('[BROWSER CONTEXT ERROR]'), error);
|
|
341
|
+
// Fallback: create context without storage state
|
|
342
|
+
this.browserContext = await this.browser.newContext({
|
|
343
|
+
viewport: null,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
// Set up periodic storage state saving (every 30 seconds)
|
|
347
|
+
this.stateTimer = setInterval(async () => {
|
|
348
|
+
if (this.browserContext) {
|
|
349
|
+
try {
|
|
350
|
+
const stateFile = join(this.options.profileDir, 'state.json');
|
|
351
|
+
await this.browserContext.storageState({ path: stateFile });
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
// Ignore errors - context might be closed
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}, 15000); // Save every 15 seconds
|
|
358
|
+
// Navigate to the app using the existing blank page
|
|
359
|
+
const pages = this.browserContext.pages();
|
|
360
|
+
const page = pages.length > 0 ? pages[0] : await this.browserContext.newPage();
|
|
361
|
+
// Disable automatic dialog handling - let dialogs behave naturally
|
|
362
|
+
page.removeAllListeners('dialog');
|
|
363
|
+
// Add a no-op dialog handler to prevent auto-dismissal
|
|
364
|
+
page.on('dialog', async (dialog) => {
|
|
365
|
+
// Don't accept or dismiss - let user handle it manually
|
|
366
|
+
// This prevents Playwright from auto-handling the dialog
|
|
367
|
+
});
|
|
368
|
+
await page.goto(`http://localhost:${this.options.port}`);
|
|
369
|
+
// Take initial screenshot
|
|
370
|
+
const initialScreenshot = await this.takeScreenshot(page, 'initial-load');
|
|
371
|
+
if (initialScreenshot) {
|
|
372
|
+
this.logger.log('browser', `[SCREENSHOT] ${initialScreenshot}`);
|
|
373
|
+
}
|
|
374
|
+
// Set up monitoring
|
|
375
|
+
await this.setupPageMonitoring(page);
|
|
376
|
+
// Monitor new pages
|
|
377
|
+
this.browserContext.on('page', async (newPage) => {
|
|
378
|
+
// Disable automatic dialog handling for new pages too
|
|
379
|
+
newPage.removeAllListeners('dialog');
|
|
380
|
+
// Add a no-op dialog handler to prevent auto-dismissal
|
|
381
|
+
newPage.on('dialog', async (dialog) => {
|
|
382
|
+
// Don't accept or dismiss - let user handle it manually
|
|
383
|
+
});
|
|
384
|
+
await this.setupPageMonitoring(newPage);
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
async installPlaywrightBrowsers() {
|
|
388
|
+
this.progressBar.update(75, { stage: 'Installing Playwright browser (2-3 min)...' });
|
|
389
|
+
return new Promise((resolve, reject) => {
|
|
390
|
+
const packageManager = detectPackageManager();
|
|
391
|
+
const [command, ...args] = packageManager.split(' ');
|
|
392
|
+
console.log(chalk.gray(`Running: ${command} ${[...args, 'playwright', 'install', 'chromium'].join(' ')}`));
|
|
393
|
+
const installProcess = spawn(command, [...args, 'playwright', 'install', 'chromium'], {
|
|
394
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
395
|
+
shell: true,
|
|
396
|
+
});
|
|
397
|
+
// Add timeout (5 minutes)
|
|
398
|
+
const timeout = setTimeout(() => {
|
|
399
|
+
installProcess.kill('SIGKILL');
|
|
400
|
+
reject(new Error('Playwright installation timed out after 5 minutes'));
|
|
401
|
+
}, 5 * 60 * 1000);
|
|
402
|
+
let hasOutput = false;
|
|
403
|
+
installProcess.stdout?.on('data', (data) => {
|
|
404
|
+
hasOutput = true;
|
|
405
|
+
const message = data.toString().trim();
|
|
406
|
+
if (message) {
|
|
407
|
+
console.log(chalk.gray('[PLAYWRIGHT]'), message);
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
installProcess.stderr?.on('data', (data) => {
|
|
411
|
+
hasOutput = true;
|
|
412
|
+
const message = data.toString().trim();
|
|
413
|
+
if (message) {
|
|
414
|
+
console.log(chalk.gray('[PLAYWRIGHT]'), message);
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
installProcess.on('exit', (code) => {
|
|
418
|
+
clearTimeout(timeout);
|
|
419
|
+
if (code === 0) {
|
|
420
|
+
console.log(chalk.green('✅ Playwright chromium installed successfully!'));
|
|
421
|
+
resolve();
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
reject(new Error(`Playwright installation failed with exit code ${code}`));
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
installProcess.on('error', (error) => {
|
|
428
|
+
clearTimeout(timeout);
|
|
429
|
+
reject(new Error(`Failed to start Playwright installation: ${error.message}`));
|
|
430
|
+
});
|
|
431
|
+
// Check if process seems stuck
|
|
432
|
+
setTimeout(() => {
|
|
433
|
+
if (!hasOutput) {
|
|
434
|
+
console.log(chalk.yellow('⚠️ Installation seems stuck. This is normal for the first run - downloading ~100MB...'));
|
|
435
|
+
}
|
|
436
|
+
}, 10000); // Show message after 10 seconds of no output
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
async takeScreenshot(page, event) {
|
|
440
|
+
try {
|
|
441
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
442
|
+
const filename = `${timestamp}-${event}.png`;
|
|
443
|
+
const screenshotPath = join(this.screenshotDir, filename);
|
|
444
|
+
const mcpScreenshotPath = join(this.mcpPublicDir, filename);
|
|
445
|
+
await page.screenshot({
|
|
446
|
+
path: screenshotPath,
|
|
447
|
+
fullPage: false, // Just viewport for speed
|
|
448
|
+
animations: 'disabled' // Disable animations during screenshot
|
|
449
|
+
});
|
|
450
|
+
// Copy to MCP server public folder for web access
|
|
451
|
+
copyFileSync(screenshotPath, mcpScreenshotPath);
|
|
452
|
+
// Return web-accessible URL
|
|
453
|
+
return `http://localhost:${this.options.mcpPort}/screenshots/${filename}`;
|
|
454
|
+
}
|
|
455
|
+
catch (error) {
|
|
456
|
+
console.error(chalk.red('[SCREENSHOT ERROR]'), error);
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
async setupPageMonitoring(page) {
|
|
461
|
+
const url = page.url();
|
|
462
|
+
// Only monitor localhost pages
|
|
463
|
+
if (!url.includes(`localhost:${this.options.port}`) && url !== 'about:blank') {
|
|
464
|
+
return;
|
|
465
|
+
}
|
|
466
|
+
this.logger.log('browser', `📄 New page: ${url}`);
|
|
467
|
+
// Console logs
|
|
468
|
+
page.on('console', (msg) => {
|
|
469
|
+
if (page.url().includes(`localhost:${this.options.port}`)) {
|
|
470
|
+
const level = msg.type().toUpperCase();
|
|
471
|
+
const text = msg.text();
|
|
472
|
+
this.logger.log('browser', `[CONSOLE ${level}] ${text}`);
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
// Page errors
|
|
476
|
+
page.on('pageerror', async (error) => {
|
|
477
|
+
if (page.url().includes(`localhost:${this.options.port}`)) {
|
|
478
|
+
const screenshotPath = await this.takeScreenshot(page, 'error');
|
|
479
|
+
this.logger.log('browser', `[PAGE ERROR] ${error.message}`);
|
|
480
|
+
if (screenshotPath) {
|
|
481
|
+
this.logger.log('browser', `[SCREENSHOT] ${screenshotPath}`);
|
|
482
|
+
}
|
|
483
|
+
if (error.stack) {
|
|
484
|
+
this.logger.log('browser', `[PAGE ERROR STACK] ${error.stack}`);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
// Network requests
|
|
489
|
+
page.on('request', (request) => {
|
|
490
|
+
if (page.url().includes(`localhost:${this.options.port}`) && !request.url().includes(`localhost:${this.options.mcpPort}`)) {
|
|
491
|
+
this.logger.log('browser', `[NETWORK REQUEST] ${request.method()} ${request.url()}`);
|
|
492
|
+
}
|
|
493
|
+
});
|
|
494
|
+
page.on('response', async (response) => {
|
|
495
|
+
if (page.url().includes(`localhost:${this.options.port}`) && !response.url().includes(`localhost:${this.options.mcpPort}`)) {
|
|
496
|
+
const status = response.status();
|
|
497
|
+
const url = response.url();
|
|
498
|
+
if (status >= 400) {
|
|
499
|
+
const screenshotPath = await this.takeScreenshot(page, 'network-error');
|
|
500
|
+
this.logger.log('browser', `[NETWORK ERROR] ${status} ${url}`);
|
|
501
|
+
if (screenshotPath) {
|
|
502
|
+
this.logger.log('browser', `[SCREENSHOT] ${screenshotPath}`);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
// Navigation (only screenshot on route changes, not every navigation)
|
|
508
|
+
let lastRoute = '';
|
|
509
|
+
page.on('framenavigated', async (frame) => {
|
|
510
|
+
if (frame === page.mainFrame() && frame.url().includes(`localhost:${this.options.port}`)) {
|
|
511
|
+
const currentRoute = new URL(frame.url()).pathname;
|
|
512
|
+
this.logger.log('browser', `[NAVIGATION] ${frame.url()}`);
|
|
513
|
+
// Only screenshot if route actually changed
|
|
514
|
+
if (currentRoute !== lastRoute) {
|
|
515
|
+
const screenshotPath = await this.takeScreenshot(page, 'route-change');
|
|
516
|
+
if (screenshotPath) {
|
|
517
|
+
this.logger.log('browser', `[SCREENSHOT] ${screenshotPath}`);
|
|
518
|
+
}
|
|
519
|
+
lastRoute = currentRoute;
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
setupCleanupHandlers() {
|
|
525
|
+
// Handle Ctrl+C to kill all processes
|
|
526
|
+
process.on('SIGINT', async () => {
|
|
527
|
+
console.log(chalk.yellow('\n🛑 Received interrupt signal. Cleaning up processes...'));
|
|
528
|
+
// Kill processes on both ports FIRST - this is most important
|
|
529
|
+
const killPortProcess = async (port, name) => {
|
|
530
|
+
try {
|
|
531
|
+
const { spawn } = await import('child_process');
|
|
532
|
+
const killProcess = spawn('sh', ['-c', `lsof -ti:${port} | xargs kill -9`], { stdio: 'inherit' });
|
|
533
|
+
return new Promise((resolve) => {
|
|
534
|
+
killProcess.on('exit', (code) => {
|
|
535
|
+
if (code === 0) {
|
|
536
|
+
console.log(chalk.green(`✅ Killed ${name} on port ${port}`));
|
|
537
|
+
}
|
|
538
|
+
resolve();
|
|
539
|
+
});
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
catch (error) {
|
|
543
|
+
console.log(chalk.gray(`⚠️ Could not kill ${name} on port ${port}`));
|
|
544
|
+
}
|
|
545
|
+
};
|
|
546
|
+
// Kill servers immediately - don't wait for browser cleanup
|
|
547
|
+
console.log(chalk.blue('🔄 Killing servers...'));
|
|
548
|
+
await Promise.all([
|
|
549
|
+
killPortProcess(this.options.port, 'your app server'),
|
|
550
|
+
killPortProcess(this.options.mcpPort, 'dev3000 MCP server')
|
|
551
|
+
]);
|
|
552
|
+
// Clear the state saving timer
|
|
553
|
+
if (this.stateTimer) {
|
|
554
|
+
clearInterval(this.stateTimer);
|
|
555
|
+
}
|
|
556
|
+
// Try to save browser state quickly (with timeout)
|
|
557
|
+
if (this.browserContext) {
|
|
558
|
+
try {
|
|
559
|
+
console.log(chalk.blue('💾 Saving browser state...'));
|
|
560
|
+
const stateFile = join(this.options.profileDir, 'state.json');
|
|
561
|
+
const savePromise = this.browserContext.storageState({ path: stateFile });
|
|
562
|
+
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), 2000));
|
|
563
|
+
await Promise.race([savePromise, timeoutPromise]);
|
|
564
|
+
console.log(chalk.green('✅ Browser state saved'));
|
|
565
|
+
}
|
|
566
|
+
catch (error) {
|
|
567
|
+
console.log(chalk.gray('⚠️ Could not save browser state (timed out)'));
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
// Close browser quickly (with timeout)
|
|
571
|
+
if (this.browser) {
|
|
572
|
+
try {
|
|
573
|
+
if (this.browserType === 'system-chrome') {
|
|
574
|
+
console.log(chalk.blue('🔄 Closing browser tab (keeping Chrome open)...'));
|
|
575
|
+
}
|
|
576
|
+
else {
|
|
577
|
+
console.log(chalk.blue('🔄 Closing browser...'));
|
|
578
|
+
}
|
|
579
|
+
const closePromise = this.browser.close();
|
|
580
|
+
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout')), 2000));
|
|
581
|
+
await Promise.race([closePromise, timeoutPromise]);
|
|
582
|
+
console.log(chalk.green('✅ Browser closed'));
|
|
583
|
+
}
|
|
584
|
+
catch (error) {
|
|
585
|
+
if (this.browserType === 'system-chrome') {
|
|
586
|
+
console.log(chalk.gray('⚠️ Chrome tab close failed (this is normal - your Chrome stays open)'));
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
console.log(chalk.gray('⚠️ Browser close timed out'));
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
console.log(chalk.green('✅ Cleanup complete'));
|
|
594
|
+
process.exit(0);
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
export async function startDevEnvironment(options) {
|
|
599
|
+
const devEnv = new DevEnvironment(options);
|
|
600
|
+
await devEnv.start();
|
|
601
|
+
}
|
|
602
|
+
//# sourceMappingURL=dev-environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-environment.js","sourceRoot":"","sources":["../src/dev-environment.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|