@jobshimo/browser-link 0.0.1 → 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.
@@ -1,31 +1,30 @@
1
- import { stdout } from 'node:process';
2
- import { ansi, clearScreen, hideCursor, readKey, renderBox, showCursor, } from './tty.js';
1
+ import * as p from '@clack/prompts';
3
2
  export const I18N_ABOUT = {
4
3
  en: {
5
4
  title: 'browser-link — about',
6
- whatItIs: [
7
- `${ansi.bold}What is this?${ansi.reset}`,
8
- '',
9
- 'browser-link is an MCP (Model Context Protocol) server. It lets',
10
- 'Claude Code observe and act on the Google Chrome tabs you explicitly',
11
- 'enable through a companion extension. It is split in two pieces:',
12
- ' 1) This Node binary, the MCP server Claude Code spawns over stdio.',
5
+ whatTitle: 'What is this?',
6
+ what: [
7
+ 'browser-link is an MCP (Model Context Protocol) server. It lets an',
8
+ 'MCP client (Claude Code, OpenCode, ) observe and act on the Google',
9
+ 'Chrome tabs you explicitly enable through a companion extension.',
10
+ '',
11
+ 'It is split in two pieces:',
12
+ ' 1) This Node binary, the MCP server the client spawns over stdio.',
13
13
  ' 2) A small Chrome extension that you load manually. The extension',
14
14
  ' stays inert on every tab until you press "Conectar" on it. You',
15
- ' can enable as many tabs as you want, one by one. Tabs you do',
16
- ' not connect remain invisible to the agent.',
17
- ],
18
- howItWorks: [
19
- `${ansi.bold}How does it work?${ansi.reset}`,
20
- '',
21
- 'The Node binary listens on 127.0.0.1:17529 (loopback only never on a',
22
- 'public interface). Each tab where you press "Conectar" opens its own',
23
- 'WebSocket to that port and registers a tab_id. From that moment on,',
24
- 'the agent can call tools targeting that tab_id, and the server',
15
+ ' can enable as many tabs as you want, one by one. Tabs you do not',
16
+ ' connect remain invisible to the agent.',
17
+ ].join('\n'),
18
+ howTitle: 'How does it work?',
19
+ how: [
20
+ 'The Node binary listens on 127.0.0.1:17529 (loopback only — never on',
21
+ 'a public interface). Each tab where you press "Conectar" opens its',
22
+ 'own WebSocket to that port and registers a tab_id. From that moment',
23
+ 'on, the agent can call tools targeting that tab_id, and the server',
25
24
  'forwards each request to the extension over the WebSocket.',
26
- '',
27
- `${ansi.bold}Process binding (zero-config defense)${ansi.reset}`,
28
- '',
25
+ ].join('\n'),
26
+ bindingTitle: 'Process binding (zero-config defense)',
27
+ binding: [
29
28
  'Before accepting any WebSocket handshake, the server asks the OS',
30
29
  'kernel which process opened the incoming TCP connection. Connections',
31
30
  'whose owner is not a known Chromium-based browser binary (Chrome,',
@@ -34,57 +33,50 @@ export const I18N_ABOUT = {
34
33
  'the bridge" vector without asking you to copy or paste tokens.',
35
34
  '',
36
35
  'It does NOT defend against malware that has already injected itself',
37
- 'inside Chrome (chrome.debugger from another extension, etc.). That',
38
- 'attacker already controls the browser directly and the bridge adds',
39
- 'no surface they did not already have.',
40
- ],
41
- bridgeTools: {
42
- title: `${ansi.bold}Tools the agent gets over the bridge${ansi.reset}`,
43
- items: [
44
- ' browser.list_tabs list connected tabs',
45
- ' browser.ping check the bridge to a tab',
46
- ' browser.snapshot dump title, url, text and interactive elements',
47
- ' browser.navigate change the tab URL',
48
- ' browser.click click an element by CSS selector',
49
- ' browser.type type into an input',
50
- ' browser.evaluate run JavaScript in the page context',
51
- ' browser.console recent console messages (rolling 200)',
52
- ' browser.network recent network requests (rolling 200)',
53
- ' browser.network_body fetch the body of a specific request',
54
- ],
55
- },
56
- mapTools: {
57
- title: `${ansi.bold}Persistent UI map (private, on your machine)${ansi.reset}`,
58
- items: [
59
- 'The server keeps a small SQLite database with what the agent has',
60
- 'learned about each app it operates: stable selectors, multi-step',
61
- 'flows, and gotchas. Three kinds of entries (selector, flow, gotcha)',
62
- 'indexed by app + pathname. Tools the agent uses:',
63
- '',
64
- ' browser.map.recall what do we know about this app/route?',
65
- ' browser.map.save persist a selector, flow, or gotcha',
66
- ' browser.map.record_use verified / failed timestamp per entry',
67
- ' browser.map.forget delete an entry or an entire app',
68
- ' browser.map.rename_app fix a bad app_key from the first save',
69
- ' browser.map.apps list known apps',
70
- ],
71
- },
36
+ 'inside Chrome. That attacker already controls the browser directly',
37
+ 'and the bridge adds no surface they did not already have.',
38
+ ].join('\n'),
39
+ bridgeToolsTitle: 'Tools the agent gets over the bridge',
40
+ bridgeTools: [
41
+ ' browser.list_tabs list connected tabs',
42
+ ' browser.ping check the bridge to a tab',
43
+ ' browser.snapshot dump title, url, text and interactive elements',
44
+ ' browser.navigate change the tab URL',
45
+ ' browser.click click an element by CSS selector',
46
+ ' browser.type type into an input',
47
+ ' browser.evaluate run JavaScript in the page context',
48
+ ' browser.console recent console messages (rolling 200)',
49
+ ' browser.network recent network requests (rolling 200)',
50
+ ' browser.network_body fetch the body of a specific request',
51
+ ].join('\n'),
52
+ mapToolsTitle: 'Persistent UI map (private, on your machine)',
53
+ mapTools: [
54
+ 'The server keeps a small SQLite database with what the agent has',
55
+ 'learned about each app it operates: stable selectors, multi-step',
56
+ 'flows, and gotchas. Three kinds of entries (selector, flow, gotcha)',
57
+ 'indexed by app + pathname. Tools the agent uses:',
58
+ '',
59
+ ' browser.map.recall what do we know about this app/route?',
60
+ ' browser.map.save persist a selector, flow, or gotcha',
61
+ ' browser.map.record_use verified / failed timestamp per entry',
62
+ ' browser.map.forget delete an entry or an entire app',
63
+ ' browser.map.rename_app fix a bad app_key from the first save',
64
+ ' browser.map.apps list known apps',
65
+ ].join('\n'),
66
+ privacyTitle: 'Where your data lives',
72
67
  privacy: [
73
- `${ansi.bold}Where your data lives${ansi.reset}`,
74
- '',
75
- ' The UI map is at:',
76
- ' Linux $XDG_DATA_HOME/browser-link/map.db',
77
- ' macOS ~/Library/Application Support/browser-link/map.db',
78
- ' Windows %APPDATA%/browser-link/map.db',
79
- ' Override with BROWSER_LINK_DATA_DIR.',
80
- ' Nothing is uploaded anywhere by this package. The bridge only',
81
- ' talks loopback to your local Chrome extension.',
82
- ' • What you save in the map is your responsibility. Never save',
83
- ' domain data (IDs, names, dates) — the map is for UI structure.',
84
- ],
85
- whereToGetHelp: [
86
- `${ansi.bold}Get help / report issues${ansi.reset}`,
87
- '',
68
+ '• The UI map is at:',
69
+ ' Linux $XDG_DATA_HOME/browser-link/map.db',
70
+ ' macOS ~/Library/Application Support/browser-link/map.db',
71
+ ' Windows %APPDATA%/browser-link/map.db',
72
+ ' Override with BROWSER_LINK_DATA_DIR.',
73
+ '• Nothing is uploaded anywhere by this package. The bridge only',
74
+ ' talks loopback to your local Chrome extension.',
75
+ '• What you save in the map is your responsibility. Never save',
76
+ ' domain data (IDs, names, dates) the map is for UI structure.',
77
+ ].join('\n'),
78
+ helpTitle: 'Get help / report issues',
79
+ help: [
88
80
  ' GitHub https://github.com/jobshimo/browser-link',
89
81
  ' Issues https://github.com/jobshimo/browser-link/issues',
90
82
  '',
@@ -94,97 +86,90 @@ export const I18N_ABOUT = {
94
86
  ' browser-link install register browser-link in your MCP client',
95
87
  ' browser-link about show this page',
96
88
  ' browser-link help list every subcommand',
97
- ],
98
- prompt: 'Press any key to return.',
89
+ ].join('\n'),
99
90
  },
100
91
  es: {
101
92
  title: 'browser-link — información',
102
- whatItIs: [
103
- `${ansi.bold}¿Qué es esto?${ansi.reset}`,
104
- '',
105
- 'browser-link es un servidor MCP (Model Context Protocol). Permite que',
106
- 'Claude Code observe y actúe sobre las pestañas de Google Chrome a las',
107
- 'que vos le des acceso explícito mediante una extensión que acompaña',
108
- 'al paquete. Tiene dos piezas:',
109
- ' 1) Este binario de Node, el servidor MCP que Claude Code arranca',
93
+ whatTitle: '¿Qué es esto?',
94
+ what: [
95
+ 'browser-link es un servidor MCP (Model Context Protocol). Permite',
96
+ 'que un cliente MCP (Claude Code, OpenCode, …) observe y actúe sobre',
97
+ 'las pestañas de Google Chrome a las que vos le des acceso explícito',
98
+ 'mediante una extensión que acompaña al paquete.',
99
+ '',
100
+ 'Tiene dos piezas:',
101
+ ' 1) Este binario de Node, el servidor MCP que el cliente arranca',
110
102
  ' por stdio.',
111
103
  ' 2) Una pequeña extensión de Chrome que cargás vos a mano. La',
112
104
  ' extensión queda inerte en cada pestaña hasta que pulsás',
113
105
  ' "Conectar" sobre ella. Podés habilitar todas las pestañas que',
114
106
  ' quieras, una por una. Las pestañas que no conectes siguen',
115
107
  ' invisibles al agente.',
116
- ],
117
- howItWorks: [
118
- `${ansi.bold}¿Cómo funciona?${ansi.reset}`,
119
- '',
108
+ ].join('\n'),
109
+ howTitle: '¿Cómo funciona?',
110
+ how: [
120
111
  'El binario de Node escucha en 127.0.0.1:17529 (solo loopback — nunca',
121
112
  'en una interfaz pública). Cada pestaña donde pulsás "Conectar" abre',
122
113
  'su propio WebSocket contra ese puerto y se registra con un tab_id.',
123
114
  'Desde ahí, el agente puede llamar herramientas que apuntan a ese',
124
115
  'tab_id y el servidor reenvía cada petición a la extensión.',
125
- '',
126
- `${ansi.bold}Validación por proceso (sin configuración)${ansi.reset}`,
127
- '',
116
+ ].join('\n'),
117
+ bindingTitle: 'Validación por proceso (sin configuración)',
118
+ binding: [
128
119
  'Antes de aceptar cualquier handshake WebSocket, el servidor le',
129
120
  'pregunta al kernel del SO qué proceso abrió la conexión TCP entrante.',
130
121
  'Conexiones cuyo dueño no es un binario conocido de un navegador',
131
122
  'Chromium-based (Chrome, Edge, Brave, Vivaldi, Chromium) se rechazan',
132
- 'antes de intercambiar bytes de aplicación. Eso cierra el vector "cualquier',
133
- 'proceso local puede hablar con el puente" sin pedirte copiar tokens.',
134
- '',
135
- 'NO te protege contra malware que ya se inyectó dentro de Chrome',
136
- '(chrome.debugger desde otra extensión maliciosa, etc.). Ese atacante',
137
- 'ya controla el navegador directamente y el puente no le suma',
138
- 'superficie nueva.',
139
- ],
140
- bridgeTools: {
141
- title: `${ansi.bold}Herramientas que el agente expone vía el puente${ansi.reset}`,
142
- items: [
143
- ' browser.list_tabs listar pestañas conectadas',
144
- ' browser.ping comprobar el puente a una pestaña',
145
- ' browser.snapshot volcar título, url, texto y elementos interactivos',
146
- ' browser.navigate cambiar la URL de la pestaña',
147
- ' browser.click hacer click en un elemento por CSS selector',
148
- ' browser.type escribir en un input',
149
- ' browser.evaluate ejecutar JavaScript en el contexto de la página',
150
- ' browser.console mensajes recientes de consola (200 últimos)',
151
- ' browser.network peticiones de red recientes (200 últimas)',
152
- ' browser.network_body traer el body de una petición concreta',
153
- ],
154
- },
155
- mapTools: {
156
- title: `${ansi.bold}Mapa de UI persistente (privado, en tu máquina)${ansi.reset}`,
157
- items: [
158
- 'El servidor mantiene una pequeña base SQLite con lo que el agente',
159
- 'va aprendiendo de cada app: selectores estables, flujos de pasos y',
160
- 'gotchas. Tres tipos de entradas (selector, flow, gotcha) indexadas',
161
- 'por app + path. Herramientas que el agente usa:',
162
- '',
163
- ' browser.map.recall ¿qué sabemos de esta app/ruta?',
164
- ' browser.map.save guardar un selector, flujo o gotcha',
165
- ' browser.map.record_use marcar verified / failed por entrada',
166
- ' browser.map.forget borrar una entrada o una app entera',
167
- ' browser.map.rename_app corregir un app_key mal derivado',
168
- ' browser.map.apps listar apps conocidas',
169
- ],
170
- },
123
+ 'antes de intercambiar bytes de aplicación. Eso cierra el vector',
124
+ '"cualquier proceso local puede hablar con el puente" sin pedirte',
125
+ 'copiar tokens.',
126
+ '',
127
+ 'NO te protege contra malware que ya se inyectó dentro de Chrome.',
128
+ 'Ese atacante ya controla el navegador directamente y el puente no',
129
+ 'le suma superficie nueva.',
130
+ ].join('\n'),
131
+ bridgeToolsTitle: 'Herramientas que el agente expone vía el puente',
132
+ bridgeTools: [
133
+ ' browser.list_tabs listar pestañas conectadas',
134
+ ' browser.ping comprobar el puente a una pestaña',
135
+ ' browser.snapshot volcar título, url, texto y elementos interactivos',
136
+ ' browser.navigate cambiar la URL de la pestaña',
137
+ ' browser.click hacer click en un elemento por CSS selector',
138
+ ' browser.type escribir en un input',
139
+ ' browser.evaluate ejecutar JavaScript en el contexto de la página',
140
+ ' browser.console mensajes recientes de consola (200 últimos)',
141
+ ' browser.network peticiones de red recientes (200 últimas)',
142
+ ' browser.network_body traer el body de una petición concreta',
143
+ ].join('\n'),
144
+ mapToolsTitle: 'Mapa de UI persistente (privado, en tu máquina)',
145
+ mapTools: [
146
+ 'El servidor mantiene una pequeña base SQLite con lo que el agente',
147
+ 'va aprendiendo de cada app: selectores estables, flujos de pasos y',
148
+ 'gotchas. Tres tipos de entradas (selector, flow, gotcha) indexadas',
149
+ 'por app + path. Herramientas que el agente usa:',
150
+ '',
151
+ ' browser.map.recall ¿qué sabemos de esta app/ruta?',
152
+ ' browser.map.save guardar un selector, flujo o gotcha',
153
+ ' browser.map.record_use marcar verified / failed por entrada',
154
+ ' browser.map.forget borrar una entrada o una app entera',
155
+ ' browser.map.rename_app corregir un app_key mal derivado',
156
+ ' browser.map.apps listar apps conocidas',
157
+ ].join('\n'),
158
+ privacyTitle: 'Dónde vive tu información',
171
159
  privacy: [
172
- `${ansi.bold}Dónde vive tu información${ansi.reset}`,
173
- '',
174
- ' El mapa de UI está en:',
175
- ' Linux $XDG_DATA_HOME/browser-link/map.db',
176
- ' macOS ~/Library/Application Support/browser-link/map.db',
177
- ' Windows %APPDATA%/browser-link/map.db',
178
- ' Sobreescribilo con BROWSER_LINK_DATA_DIR.',
179
- ' Este paquete no sube nada a ningún lado. El puente solo habla',
180
- ' loopback con la extensión local de Chrome.',
181
- ' Lo que guardes en el mapa es responsabilidad tuya. No guardes',
182
- ' datos de dominio (IDs, nombres, fechas) — el mapa es para',
183
- ' estructura de UI, no para data.',
184
- ],
185
- whereToGetHelp: [
186
- `${ansi.bold}Ayuda / reportar bugs${ansi.reset}`,
187
- '',
160
+ '• El mapa de UI está en:',
161
+ ' Linux $XDG_DATA_HOME/browser-link/map.db',
162
+ ' macOS ~/Library/Application Support/browser-link/map.db',
163
+ ' Windows %APPDATA%/browser-link/map.db',
164
+ ' Sobreescribilo con BROWSER_LINK_DATA_DIR.',
165
+ '• Este paquete no sube nada a ningún lado. El puente solo habla',
166
+ ' loopback con la extensión local de Chrome.',
167
+ '• Lo que guardes en el mapa es responsabilidad tuya. No guardes',
168
+ ' datos de dominio (IDs, nombres, fechas) — el mapa es para',
169
+ ' estructura de UI, no para data.',
170
+ ].join('\n'),
171
+ helpTitle: 'Ayuda / reportar bugs',
172
+ help: [
188
173
  ' GitHub https://github.com/jobshimo/browser-link',
189
174
  ' Issues https://github.com/jobshimo/browser-link/issues',
190
175
  '',
@@ -194,55 +179,45 @@ export const I18N_ABOUT = {
194
179
  ' browser-link install registrar browser-link en tu cliente MCP',
195
180
  ' browser-link about mostrar esta página',
196
181
  ' browser-link help listar todos los subcomandos',
197
- ],
198
- prompt: 'Pulsá cualquier tecla para volver.',
182
+ ].join('\n'),
199
183
  },
200
184
  };
201
- export function buildAboutScreen(t) {
202
- const lines = [];
203
- lines.push(`${ansi.bold}${ansi.cyan}${t.title}${ansi.reset}`);
204
- lines.push('');
205
- for (const l of t.whatItIs)
206
- lines.push(l);
207
- lines.push('');
208
- for (const l of t.howItWorks)
209
- lines.push(l);
210
- lines.push('');
211
- lines.push(t.bridgeTools.title);
212
- lines.push('');
213
- for (const l of t.bridgeTools.items)
214
- lines.push(l);
215
- lines.push('');
216
- lines.push(t.mapTools.title);
217
- lines.push('');
218
- for (const l of t.mapTools.items)
219
- lines.push(l);
220
- lines.push('');
221
- for (const l of t.privacy)
222
- lines.push(l);
223
- lines.push('');
224
- for (const l of t.whereToGetHelp)
225
- lines.push(l);
226
- return renderBox(lines, { borderColor: ansi.gray });
185
+ function renderAbout(t) {
186
+ p.note(t.what, t.whatTitle);
187
+ p.note(t.how, t.howTitle);
188
+ p.note(t.binding, t.bindingTitle);
189
+ p.note(t.bridgeTools, t.bridgeToolsTitle);
190
+ p.note(t.mapTools, t.mapToolsTitle);
191
+ p.note(t.privacy, t.privacyTitle);
192
+ p.note(t.help, t.helpTitle);
227
193
  }
194
+ /** Interactive about screen — used from the setup menu. Falls back to the
195
+ * caller's prompt loop afterwards (no explicit "press any key"). */
228
196
  export async function runAbout(language = 'en') {
229
197
  const t = I18N_ABOUT[language];
230
- hideCursor();
231
- try {
232
- clearScreen();
233
- stdout.write(buildAboutScreen(t));
234
- stdout.write('\n\n');
235
- stdout.write(`${ansi.dim}${t.prompt}${ansi.reset} `);
236
- await readKey();
237
- }
238
- finally {
239
- showCursor();
240
- stdout.write('\n');
241
- }
198
+ p.log.message(t.title);
199
+ renderAbout(t);
242
200
  }
243
- /** Plain-text render of About for non-interactive output (browser-link about). */
201
+ /** Non-interactive about `browser-link about`. Plain output, no prompts. */
244
202
  export function printAbout(language = 'en') {
245
203
  const t = I18N_ABOUT[language];
246
- console.log(buildAboutScreen(t));
204
+ const sections = [
205
+ { title: t.whatTitle, body: t.what },
206
+ { title: t.howTitle, body: t.how },
207
+ { title: t.bindingTitle, body: t.binding },
208
+ { title: t.bridgeToolsTitle, body: t.bridgeTools },
209
+ { title: t.mapToolsTitle, body: t.mapTools },
210
+ { title: t.privacyTitle, body: t.privacy },
211
+ { title: t.helpTitle, body: t.help },
212
+ ];
213
+ console.log(t.title);
214
+ console.log('='.repeat(t.title.length));
215
+ console.log('');
216
+ for (const { title, body } of sections) {
217
+ console.log(title);
218
+ console.log('-'.repeat(title.length));
219
+ console.log(body);
220
+ console.log('');
221
+ }
247
222
  }
248
223
  //# sourceMappingURL=about.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/commands/about.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/commands/about.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { type Language } from './welcome.js';
2
2
  interface MenuI18n {
3
3
  title: string;
4
+ outro: string;
4
5
  prompt: string;
5
- pressEnter: string;
6
6
  options: {
7
7
  register: string;
8
8
  extension: string;
@@ -18,9 +18,8 @@ interface MenuI18n {
18
18
  registerSuccessHint: string;
19
19
  repoOpened: string;
20
20
  repoFallback: string;
21
+ pickClient: string;
21
22
  }
22
23
  export declare const I18N_MENU: Record<Language, MenuI18n>;
23
- export declare function claudeStatus(t: MenuI18n): string;
24
- export declare function renderMenuScreen(t: MenuI18n, selectedIndex: number, options: string[]): string;
25
24
  export declare function runMenu(initialLanguage?: Language): Promise<void>;
26
25
  export {};