browser-ipc-cdp 1.3.0 → 1.5.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/bin/cli.js CHANGED
@@ -152,16 +152,28 @@ async function main() {
152
152
 
153
153
  // Resumen
154
154
  console.log('');
155
+ // URL correcta segun entorno
156
+ const cdpLocalUrl = `http://127.0.0.1:${port}`;
157
+ const cdpWslUrl = `http://${wslIp}:${port}`;
158
+ const cdpUrl = (IS_WSL || wslIp !== '127.0.0.1') ? cdpWslUrl : cdpLocalUrl;
159
+
155
160
  console.log('='.repeat(55));
156
161
  console.log(` MODO: ${mode}${mode === 'ATTACHED' ? ' (sin reiniciar)' : ' (nuevo proceso)'}`);
162
+ console.log(` Plataforma: ${platform}`);
157
163
  console.log(` Navegador: ${browserVersion}`);
158
164
  console.log(` Puerto CDP: ${port} (dinamico via IPC)`);
159
165
  console.log(` Paginas: ${pages}`);
160
- console.log(` WSL IP: ${wslIp}`);
161
- console.log(` Portproxy: 0.0.0.0:${port} -> 127.0.0.1:${port}`);
162
- console.log(` .mcp.json: Actualizado`);
163
166
  console.log('='.repeat(55));
164
167
  console.log('');
168
+ console.log(' URLs de conexion:');
169
+ console.log(` Desde Windows: ${cdpLocalUrl}`);
170
+ if (wslIp !== '127.0.0.1') {
171
+ console.log(` Desde WSL: ${cdpWslUrl}`);
172
+ }
173
+ console.log('');
174
+ console.log(' MCP configurado en .mcp.json:');
175
+ console.log(` browserUrl: ${cdpUrl}`);
176
+ console.log('');
165
177
  console.log(' Siguiente paso en Claude Code:');
166
178
  console.log(' /mcp (para conectar el MCP brave)');
167
179
  console.log('');
package/lib/browser.js CHANGED
@@ -396,13 +396,16 @@ function launchBrowser(browser, { port = 0, clean = false } = {}) {
396
396
 
397
397
  // Wait for process to die
398
398
  setTimeout(() => {
399
+ const defaultUserData = browser.userData || getBrowserPaths(browser.name).userData || '';
399
400
  const userData = clean
400
- ? path.join(process.env.USERPROFILE || '', 'browser-cdp-profile')
401
- : browser.userData;
401
+ ? path.join(process.env.USERPROFILE || process.env.HOME || '', 'browser-cdp-profile')
402
+ : defaultUserData;
402
403
 
403
404
  // Clean DevToolsActivePort
404
- const portFile = path.join(userData, 'DevToolsActivePort');
405
- try { if (fs.existsSync(portFile)) fs.unlinkSync(portFile); } catch (e) {}
405
+ if (userData) {
406
+ const portFile = path.join(userData, 'DevToolsActivePort');
407
+ try { if (fs.existsSync(portFile)) fs.unlinkSync(portFile); } catch (e) {}
408
+ }
406
409
 
407
410
  const args = [
408
411
  `--remote-debugging-port=${port}`,
@@ -434,14 +437,15 @@ function launchBrowser(browser, { port = 0, clean = false } = {}) {
434
437
 
435
438
  // Wait for DevToolsActivePort
436
439
  if (port === 0) {
440
+ const activePortFile = userData ? path.join(userData, 'DevToolsActivePort') : null;
437
441
  const deadline = Date.now() + 30000;
438
442
  const check = () => {
439
443
  if (Date.now() > deadline) {
440
444
  return reject(new Error('Timeout esperando DevToolsActivePort'));
441
445
  }
442
- if (fs.existsSync(portFile)) {
446
+ if (activePortFile && fs.existsSync(activePortFile)) {
443
447
  try {
444
- const lines = fs.readFileSync(portFile, 'utf-8').trim().split('\n');
448
+ const lines = fs.readFileSync(activePortFile, 'utf-8').trim().split('\n');
445
449
  const detected = parseInt(lines[0].trim());
446
450
  if (detected > 0) {
447
451
  return resolve({ port: detected, pid: child.pid });
package/lib/mcp.js CHANGED
@@ -6,10 +6,12 @@ const { log, success, warn } = require('./logger');
6
6
  function getWslHostIp() {
7
7
  const IS_WIN = process.platform === 'win32';
8
8
 
9
- // Mac/Linux: localhost funciona directo, no necesita IP especial
10
- if (!IS_WIN) return '127.0.0.1';
9
+ // Mac/Linux nativo (sin WSL): localhost directo
10
+ if (!IS_WIN && !fs.existsSync('/proc/version')) return '127.0.0.1';
11
11
 
12
- // Windows: detectar IP para WSL
12
+ // Windows o WSL: Claude Code SIEMPRE corre en WSL,
13
+ // asi que SIEMPRE necesitamos la IP del host Windows.
14
+ // No importa si el usuario ejecuta npx desde Windows o WSL.
13
15
 
14
16
  // 1. Desde WSL: leer resolv.conf directamente
15
17
  try {
@@ -50,12 +52,44 @@ function updateMcpJson(port, wslIp) {
50
52
  args: ['-y', 'chrome-devtools-mcp@latest', '--browserUrl', `http://${wslIp}:${port}`],
51
53
  };
52
54
 
53
- // Actualizar .mcp.json en home y directorio actual
54
- const mcpPaths = [
55
- path.join(process.env.USERPROFILE || process.env.HOME || '', '.mcp.json'),
56
- path.join(process.cwd(), '.mcp.json'),
57
- ];
55
+ // Rutas base donde buscar .mcp.json
56
+ const home = process.env.USERPROFILE || process.env.HOME || '';
57
+ const cwd = process.cwd();
58
+ const scriptDir = path.join(__dirname, '..');
58
59
 
60
+ // 1. Rutas fijas conocidas
61
+ const mcpPaths = new Set([
62
+ path.join(home, '.mcp.json'), // Home del usuario
63
+ path.join(cwd, '.mcp.json'), // Donde ejecuto npx
64
+ path.join(scriptDir, '.mcp.json'), // Carpeta del paquete IPC
65
+ ]);
66
+
67
+ // 2. Buscar .mcp.json existentes en subdirectorios del home (1 nivel)
68
+ try {
69
+ const homeItems = fs.readdirSync(home);
70
+ for (const item of homeItems) {
71
+ const candidate = path.join(home, item, '.mcp.json');
72
+ if (fs.existsSync(candidate)) {
73
+ mcpPaths.add(candidate);
74
+ }
75
+ }
76
+ } catch (e) {}
77
+
78
+ // 3. En Windows: buscar en Desktop y sus subcarpetas
79
+ const desktop = path.join(home, 'Desktop');
80
+ try {
81
+ if (fs.existsSync(desktop)) {
82
+ const desktopItems = fs.readdirSync(desktop);
83
+ for (const item of desktopItems) {
84
+ const candidate = path.join(desktop, item, '.mcp.json');
85
+ if (fs.existsSync(candidate)) {
86
+ mcpPaths.add(candidate);
87
+ }
88
+ }
89
+ }
90
+ } catch (e) {}
91
+
92
+ // 4. Actualizar todos los .mcp.json encontrados
59
93
  let updated = 0;
60
94
  for (const mcpPath of mcpPaths) {
61
95
  try {
@@ -64,9 +98,15 @@ function updateMcpJson(port, wslIp) {
64
98
  data = JSON.parse(fs.readFileSync(mcpPath, 'utf-8'));
65
99
  }
66
100
  if (!data.mcpServers) data.mcpServers = {};
101
+
102
+ // Solo actualizar si el archivo existe o es el home
103
+ const isHome = mcpPath === path.join(home, '.mcp.json');
104
+ if (!fs.existsSync(mcpPath) && !isHome) continue;
105
+
67
106
  data.mcpServers.brave = braveEntry;
68
107
  fs.writeFileSync(mcpPath, JSON.stringify(data, null, 2));
69
108
  updated++;
109
+ log(` -> ${mcpPath}`);
70
110
  } catch (e) {}
71
111
  }
72
112
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "browser-ipc-cdp",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "description": "Control remoto de navegadores Chromium (Brave, Chrome, Edge) via IPC + CDP dinamico. Un comando para conectar Claude Code a tu navegador real.",
5
5
  "bin": {
6
6
  "browser-ipc-cdp": "bin/cli.js"