@jobshimo/browser-link 0.1.0 → 0.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/README.md CHANGED
@@ -3,12 +3,12 @@
3
3
  > ⚠️ **Read this before installing**
4
4
  >
5
5
  > This package opens a bridge between your MCP client (Claude Code,
6
- > OpenCode, …) and the Chrome tabs you explicitly enable through a
7
- > companion extension. On every tab where you press "Conectar" in the
8
- > extension popup, the agent can read its DOM, click, type, run
9
- > arbitrary JavaScript, and follow links — including any logged-in
10
- > session, saved card, wallet, banking page or admin panel that tab is
11
- > currently showing.
6
+ > OpenCode, GitHub Copilot CLI…) and the Chrome tabs you explicitly
7
+ > enable through a companion extension. On every tab where you press
8
+ > "Conectar" in the extension popup, the agent can read its DOM, click,
9
+ > type, run arbitrary JavaScript, and follow links — including any
10
+ > logged-in session, saved card, wallet, banking page or admin panel
11
+ > that tab is currently showing.
12
12
  >
13
13
  > Treat the agent like a junior dev with remote control of those tabs.
14
14
  > Only enable tabs where you would let an automated process act on your
@@ -16,10 +16,10 @@
16
16
  > every action the agent performs on the tabs you explicitly enable.
17
17
 
18
18
  MCP server that bridges any MCP-compatible client (Claude Code, OpenCode,
19
- and friends) to the Chrome tabs you grant access to, through a small
20
- WebSocket relay and a companion Chrome extension. Ships with a persistent
21
- UI map so the agent remembers selectors, flows and gotchas it learned
22
- about each app, across sessions.
19
+ GitHub Copilot CLI, and friends) to the Chrome tabs you grant access to,
20
+ through a small WebSocket relay and a companion Chrome extension. Ships
21
+ with a persistent UI map so the agent remembers selectors, flows and
22
+ gotchas it learned about each app, across sessions.
23
23
 
24
24
  ## Install
25
25
 
@@ -31,18 +31,16 @@ This puts the `browser-link` binary on your PATH on macOS, Linux and Windows.
31
31
 
32
32
  ## Set it up
33
33
 
34
- The fastest path is the interactive menu (built on `@clack/prompts`
35
- flicker-free in PowerShell, Windows Terminal, macOS Terminal, iTerm, every
36
- Linux TTY):
34
+ The fastest path is the interactive UI a full-screen [Ink](https://github.com/vadimdemedes/ink)-based app with a pinned header, live status of every MCP client, and sub-screens that swap in place (no flicker, no scroll-off):
37
35
 
38
36
  ```bash
39
37
  browser-link
40
38
  ```
41
39
 
42
40
  That opens the welcome / disclaimer screen (English or Spanish), and then
43
- the setup menu where you can register browser-link with **Claude Code** or
44
- **OpenCode**, see the Chrome extension install steps, run a doctor
45
- diagnose, and open the about / help page.
41
+ the setup menu where you can register `browser-link` with **Claude Code**,
42
+ **OpenCode**, or **GitHub Copilot CLI**, see the Chrome extension install
43
+ steps, run a doctor diagnose, and open the about / help page.
46
44
 
47
45
  If you prefer direct commands:
48
46
 
@@ -50,6 +48,7 @@ If you prefer direct commands:
50
48
  browser-link install # register in every detected client
51
49
  browser-link install --client claude # register only in Claude Code
52
50
  browser-link install --client opencode # register only in OpenCode
51
+ browser-link install --client copilot # register only in GitHub Copilot CLI
53
52
  browser-link uninstall --client opencode # remove from one client
54
53
  browser-link extension # show the Chrome extension assets path + steps
55
54
  browser-link doctor # diagnose current setup
@@ -63,12 +62,13 @@ in Chrome. Then click "Conectar" on every tab you want the agent to reach
63
62
 
64
63
  ## Supported MCP clients
65
64
 
66
- | Client | Config file written |
67
- | ------------------------------------------------- | -------------------------------------------------------------- |
68
- | [Claude Code](https://docs.claude.com/claude-code) | `~/.claude.json` (`%USERPROFILE%\.claude.json` on Windows) |
69
- | [OpenCode](https://opencode.ai) | `~/.config/opencode/opencode.json` on **every** OS (Win incl.) |
65
+ | Client | Config file written |
66
+ | -------------------------------------------------------------------- | ---------------------------------------------------------------- |
67
+ | [Claude Code](https://docs.claude.com/claude-code) | `~/.claude.json` (`%USERPROFILE%\.claude.json` on Windows) |
68
+ | [OpenCode](https://opencode.ai) | `~/.config/opencode/opencode.json` on **every** OS (Win incl.) |
69
+ | [GitHub Copilot CLI](https://docs.github.com/en/copilot/copilot-cli) | `~/.copilot/mcp-config.json` (override via `COPILOT_HOME` env) |
70
70
 
71
- Both registrations are idempotent — re-running `install` updates the
71
+ Every registration is idempotent — re-running `install` updates the
72
72
  entry instead of duplicating it. `uninstall --client <id>` removes it
73
73
  cleanly without touching anything else in the file.
74
74
 
package/dist/cli.js CHANGED
@@ -4,35 +4,45 @@ import { installAll, installFor } from './commands/install.js';
4
4
  import { uninstallAll, uninstallFor } from './commands/uninstall.js';
5
5
  import { printExtensionInstructions } from './commands/extension.js';
6
6
  import { printAbout } from './commands/about.js';
7
+ import { checkUpdates, formatUpdate } from './commands/updates.js';
7
8
  import { loadConfig } from './config.js';
8
- const HELP = `browser-link bridge Claude Code to the Chrome tabs you enable.
9
+ import { VERSION } from './version.js';
10
+ const HELP = `browser-link ${VERSION} — bridge any MCP client to the Chrome tabs you enable.
9
11
 
10
12
  Usage:
11
13
  browser-link When invoked from an interactive terminal,
12
- opens a setup menu (register Claude Code,
13
- show extension steps, run doctor, about).
14
- When invoked by Claude Code (no TTY),
15
- starts the MCP server over stdio.
16
- browser-link install Register browser-link with Claude Code.
17
- browser-link uninstall Remove the registration.
18
- browser-link extension Show the path of the Chrome extension assets
19
- and per-OS install instructions.
20
- browser-link doctor Diagnose current setup (Claude Code, server, extension, map DB).
14
+ opens the setup UI (register a client, show
15
+ extension steps, run doctor, check updates).
16
+ When invoked by an MCP client over stdio,
17
+ starts the MCP server.
18
+ browser-link install Register browser-link in every detected client.
19
+ browser-link install --client <claude|opencode|copilot>
20
+ Register only in the named client.
21
+ browser-link uninstall Remove every registration.
22
+ browser-link uninstall --client <id>
23
+ Remove only the named registration.
24
+ browser-link extension Show the Chrome extension assets path and
25
+ per-OS install instructions.
26
+ browser-link doctor Diagnose current setup (clients, server, extension, map DB).
27
+ browser-link updates Check the npm registry for a newer version.
21
28
  browser-link about Show the full explanation of what this is and how it works.
29
+ browser-link version Print the installed version (also: --version, -v).
22
30
  browser-link help This message.
23
31
 
24
32
  Environment:
25
33
  BROWSER_LINK_DATA_DIR Override the DB location (defaults per OS).
26
34
  BROWSER_LINK_BIN Override the command stored in client configs
27
- (e.g. "node /path/to/dist/index.js" for dev).`;
35
+ (e.g. "node /path/to/dist/index.js" for dev).
36
+ COPILOT_HOME Override GitHub Copilot CLI's config dir
37
+ (default ~/.copilot).`;
28
38
  function parseClient(argv) {
29
39
  const idx = argv.findIndex((a) => a === '--client');
30
40
  if (idx === -1 || idx === argv.length - 1)
31
41
  return null;
32
42
  const val = argv[idx + 1];
33
- if (val === 'claude' || val === 'opencode')
43
+ if (val === 'claude' || val === 'opencode' || val === 'copilot')
34
44
  return val;
35
- throw new Error(`Unknown --client value: ${val}. Use claude or opencode.`);
45
+ throw new Error(`Unknown --client value: ${val}. Use claude, opencode or copilot.`);
36
46
  }
37
47
  async function dispatch(argv) {
38
48
  const [cmd, ...rest] = argv;
@@ -82,6 +92,20 @@ async function dispatch(argv) {
82
92
  printAbout(cfg.language ?? 'en');
83
93
  return;
84
94
  }
95
+ case 'updates': {
96
+ const info = await checkUpdates();
97
+ console.log(formatUpdate(info));
98
+ // Non-zero exit when we could not reach the registry, so scripts can detect it.
99
+ if (info.error || info.latest === null)
100
+ process.exit(2);
101
+ return;
102
+ }
103
+ case 'version':
104
+ case '-v':
105
+ case '--version': {
106
+ console.log(VERSION);
107
+ return;
108
+ }
85
109
  default: {
86
110
  console.error(`Unknown command: ${cmd}`);
87
111
  console.error('');
@@ -91,22 +115,12 @@ async function dispatch(argv) {
91
115
  }
92
116
  }
93
117
  const argv = process.argv.slice(2);
94
- // No args + both stdin and stdout are TTYs → human in a terminal: show the
95
- // welcome / disclaimer screen (unless previously dismissed) and then the
96
- // setup menu in the chosen language.
118
+ // No args + both stdin and stdout are TTYs → human in a terminal: mount the
119
+ // Ink-based UI (welcome on first run, then the setup menu).
97
120
  // Otherwise (no TTY anywhere, or output piped) → start the MCP server over stdio.
98
121
  if (argv.length === 0 && process.stdin.isTTY && process.stdout.isTTY) {
99
- const cfg = loadConfig();
100
- const { runMenu } = await import('./commands/menu.js');
101
- let language = cfg.language ?? 'en';
102
- if (!cfg.skipWelcome) {
103
- const { runWelcome } = await import('./commands/welcome.js');
104
- const welcome = await runWelcome({ initial: language });
105
- if (welcome.action === 'quit')
106
- process.exit(0);
107
- language = welcome.language;
108
- }
109
- await runMenu(language);
122
+ const { startUI } = await import('./ui/start.js');
123
+ await startUI();
110
124
  process.exit(0);
111
125
  }
112
126
  dispatch(argv).catch((err) => {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;8EAmBiE,CAAC;AAE/E,SAAS,WAAW,CAAC,IAAc;IACjC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC;IACpD,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC;IACvD,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,2BAA2B,CAAC,CAAC;AAC7E,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAc;IACpC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAE5B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,SAAS,CAAC;QACf,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,SAAS,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,IAAI,CAAC;QACV,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;YAC7D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;YACjE,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,0BAA0B,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;YACzB,UAAU,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,2EAA2E;AAC3E,yEAAyE;AACzE,qCAAqC;AACrC,kFAAkF;AAClF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACrE,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACvD,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QACxD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC9B,CAAC;IACD,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC3B,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Language } from './welcome.js';
2
- interface AboutI18n {
2
+ export interface AboutI18n {
3
3
  title: string;
4
4
  whatTitle: string;
5
5
  what: string;
@@ -17,9 +17,6 @@ interface AboutI18n {
17
17
  help: string;
18
18
  }
19
19
  export declare const I18N_ABOUT: Record<Language, AboutI18n>;
20
- /** Interactive about screen used from the setup menu. Falls back to the
21
- * caller's prompt loop afterwards (no explicit "press any key"). */
22
- export declare function runAbout(language?: Language): Promise<void>;
23
- /** Non-interactive about — `browser-link about`. Plain output, no prompts. */
20
+ /** Non-interactive about — `browser-link about`. Plain output, no prompts.
21
+ * The interactive version lives in the Ink UI (`ui/screens.tsx`). */
24
22
  export declare function printAbout(language?: Language): void;
25
- export {};
@@ -1,4 +1,3 @@
1
- import * as p from '@clack/prompts';
2
1
  export const I18N_ABOUT = {
3
2
  en: {
4
3
  title: 'browser-link — about',
@@ -182,23 +181,8 @@ export const I18N_ABOUT = {
182
181
  ].join('\n'),
183
182
  },
184
183
  };
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);
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"). */
196
- export async function runAbout(language = 'en') {
197
- const t = I18N_ABOUT[language];
198
- p.log.message(t.title);
199
- renderAbout(t);
200
- }
201
- /** Non-interactive about — `browser-link about`. Plain output, no prompts. */
184
+ /** Non-interactive about — `browser-link about`. Plain output, no prompts.
185
+ * The interactive version lives in the Ink UI (`ui/screens.tsx`). */
202
186
  export function printAbout(language = 'en') {
203
187
  const t = I18N_ABOUT[language];
204
188
  const sections = [
@@ -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":"AAoBA,MAAM,CAAC,MAAM,UAAU,GAAgC;IACrD,EAAE,EAAE;QACF,KAAK,EAAE,sBAAsB;QAC7B,SAAS,EAAE,eAAe;QAC1B,IAAI,EAAE;YACJ,oEAAoE;YACpE,qEAAqE;YACrE,kEAAkE;YAClE,EAAE;YACF,4BAA4B;YAC5B,qEAAqE;YACrE,qEAAqE;YACrE,qEAAqE;YACrE,uEAAuE;YACvE,6CAA6C;SAC9C,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,QAAQ,EAAE,mBAAmB;QAC7B,GAAG,EAAE;YACH,sEAAsE;YACtE,oEAAoE;YACpE,qEAAqE;YACrE,oEAAoE;YACpE,4DAA4D;SAC7D,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,YAAY,EAAE,uCAAuC;QACrD,OAAO,EAAE;YACP,kEAAkE;YAClE,sEAAsE;YACtE,mEAAmE;YACnE,qEAAqE;YACrE,qEAAqE;YACrE,gEAAgE;YAChE,EAAE;YACF,qEAAqE;YACrE,oEAAoE;YACpE,2DAA2D;SAC5D,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,gBAAgB,EAAE,sCAAsC;QACxD,WAAW,EAAE;YACX,gDAAgD;YAChD,sDAAsD;YACtD,2EAA2E;YAC3E,+CAA+C;YAC/C,6DAA6D;YAC7D,+CAA+C;YAC/C,+DAA+D;YAC/D,kEAAkE;YAClE,kEAAkE;YAClE,iEAAiE;SAClE,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,aAAa,EAAE,8CAA8C;QAC7D,QAAQ,EAAE;YACR,kEAAkE;YAClE,kEAAkE;YAClE,qEAAqE;YACrE,kDAAkD;YAClD,EAAE;YACF,kEAAkE;YAClE,gEAAgE;YAChE,kEAAkE;YAClE,6DAA6D;YAC7D,kEAAkE;YAClE,4CAA4C;SAC7C,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,YAAY,EAAE,uBAAuB;QACrC,OAAO,EAAE;YACP,qBAAqB;YACrB,iDAAiD;YACjD,gEAAgE;YAChE,4CAA4C;YAC5C,wCAAwC;YACxC,iEAAiE;YACjE,kDAAkD;YAClD,+DAA+D;YAC/D,kEAAkE;SACnE,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,SAAS,EAAE,0BAA0B;QACrC,IAAI,EAAE;YACJ,oDAAoD;YACpD,2DAA2D;YAC3D,EAAE;YACF,qBAAqB;YACrB,+DAA+D;YAC/D,uEAAuE;YACvE,qEAAqE;YACrE,2CAA2C;YAC3C,kDAAkD;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC;KACb;IACD,EAAE,EAAE;QACF,KAAK,EAAE,4BAA4B;QACnC,SAAS,EAAE,eAAe;QAC1B,IAAI,EAAE;YACJ,mEAAmE;YACnE,qEAAqE;YACrE,qEAAqE;YACrE,iDAAiD;YACjD,EAAE;YACF,mBAAmB;YACnB,mEAAmE;YACnE,iBAAiB;YACjB,gEAAgE;YAChE,8DAA8D;YAC9D,oEAAoE;YACpE,gEAAgE;YAChE,4BAA4B;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,QAAQ,EAAE,iBAAiB;QAC3B,GAAG,EAAE;YACH,sEAAsE;YACtE,qEAAqE;YACrE,oEAAoE;YACpE,kEAAkE;YAClE,4DAA4D;SAC7D,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,YAAY,EAAE,4CAA4C;QAC1D,OAAO,EAAE;YACP,gEAAgE;YAChE,uEAAuE;YACvE,iEAAiE;YACjE,qEAAqE;YACrE,iEAAiE;YACjE,kEAAkE;YAClE,gBAAgB;YAChB,EAAE;YACF,kEAAkE;YAClE,mEAAmE;YACnE,2BAA2B;SAC5B,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,gBAAgB,EAAE,iDAAiD;QACnE,WAAW,EAAE;YACX,uDAAuD;YACvD,8DAA8D;YAC9D,+EAA+E;YAC/E,yDAAyD;YACzD,wEAAwE;YACxE,iDAAiD;YACjD,4EAA4E;YAC5E,wEAAwE;YACxE,sEAAsE;YACtE,mEAAmE;SACpE,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,aAAa,EAAE,iDAAiD;QAChE,QAAQ,EAAE;YACR,mEAAmE;YACnE,oEAAoE;YACpE,oEAAoE;YACpE,iDAAiD;YACjD,EAAE;YACF,2DAA2D;YAC3D,gEAAgE;YAChE,iEAAiE;YACjE,gEAAgE;YAChE,6DAA6D;YAC7D,kDAAkD;SACnD,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,YAAY,EAAE,2BAA2B;QACzC,OAAO,EAAE;YACP,0BAA0B;YAC1B,iDAAiD;YACjD,gEAAgE;YAChE,4CAA4C;YAC5C,6CAA6C;YAC7C,iEAAiE;YACjE,8CAA8C;YAC9C,iEAAiE;YACjE,6DAA6D;YAC7D,mCAAmC;SACpC,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,SAAS,EAAE,uBAAuB;QAClC,IAAI,EAAE;YACJ,oDAAoD;YACpD,2DAA2D;YAC3D,EAAE;YACF,qBAAqB;YACrB,gEAAgE;YAChE,uEAAuE;YACvE,qEAAqE;YACrE,gDAAgD;YAChD,yDAAyD;SAC1D,CAAC,IAAI,CAAC,IAAI,CAAC;KACb;CACF,CAAC;AAEF;qEACqE;AACrE,MAAM,UAAU,UAAU,CAAC,WAAqB,IAAI;IAClD,MAAM,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAsC;QAClD,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACpC,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE;QAClC,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;QAC1C,EAAE,KAAK,EAAE,CAAC,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;QAClD,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC5C,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;QAC1C,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;KACrC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ export interface UpdateInfo {
2
+ current: string;
3
+ latest: string | null;
4
+ /** `null` means we could not reach the registry; check `error` for why. */
5
+ newer: boolean | null;
6
+ error?: string;
7
+ }
8
+ /**
9
+ * Ask the npm registry for the `latest` dist-tag and compare it to the
10
+ * version baked into this package. Network round-trip is one tiny GET.
11
+ *
12
+ * Compares plain MAJOR.MINOR.PATCH numerically. Pre-release suffixes
13
+ * (`0.3.0-beta.1`) are not handled — current and latest are both expected
14
+ * to be plain semver. If they are not, the comparison still produces a
15
+ * consistent ordering, just not the semver-correct one.
16
+ */
17
+ export declare function checkUpdates(timeoutMs?: number): Promise<UpdateInfo>;
18
+ /** Plain-text formatter for the non-interactive `browser-link updates`. */
19
+ export declare function formatUpdate(info: UpdateInfo): string;
@@ -0,0 +1,83 @@
1
+ import { PACKAGE_NAME, VERSION } from '../version.js';
2
+ /**
3
+ * Ask the npm registry for the `latest` dist-tag and compare it to the
4
+ * version baked into this package. Network round-trip is one tiny GET.
5
+ *
6
+ * Compares plain MAJOR.MINOR.PATCH numerically. Pre-release suffixes
7
+ * (`0.3.0-beta.1`) are not handled — current and latest are both expected
8
+ * to be plain semver. If they are not, the comparison still produces a
9
+ * consistent ordering, just not the semver-correct one.
10
+ */
11
+ export async function checkUpdates(timeoutMs = 4000) {
12
+ const url = `https://registry.npmjs.org/-/package/${PACKAGE_NAME}/dist-tags`;
13
+ const controller = new AbortController();
14
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
15
+ try {
16
+ const res = await fetch(url, {
17
+ headers: { accept: 'application/json' },
18
+ signal: controller.signal,
19
+ });
20
+ if (!res.ok) {
21
+ return {
22
+ current: VERSION,
23
+ latest: null,
24
+ newer: null,
25
+ error: `npm registry returned HTTP ${res.status}`,
26
+ };
27
+ }
28
+ const body = (await res.json());
29
+ const latest = body.latest ?? null;
30
+ if (!latest) {
31
+ return {
32
+ current: VERSION,
33
+ latest: null,
34
+ newer: null,
35
+ error: 'registry response had no "latest" dist-tag',
36
+ };
37
+ }
38
+ return { current: VERSION, latest, newer: isNewer(latest, VERSION) };
39
+ }
40
+ catch (err) {
41
+ const reason = err instanceof Error
42
+ ? err.name === 'AbortError'
43
+ ? `timed out after ${timeoutMs}ms`
44
+ : err.message
45
+ : String(err);
46
+ return { current: VERSION, latest: null, newer: null, error: reason };
47
+ }
48
+ finally {
49
+ clearTimeout(timer);
50
+ }
51
+ }
52
+ function isNewer(latest, current) {
53
+ const a = latest.split('.').map((s) => parseInt(s, 10) || 0);
54
+ const b = current.split('.').map((s) => parseInt(s, 10) || 0);
55
+ const n = Math.max(a.length, b.length);
56
+ for (let i = 0; i < n; i++) {
57
+ const ai = a[i] ?? 0;
58
+ const bi = b[i] ?? 0;
59
+ if (ai > bi)
60
+ return true;
61
+ if (ai < bi)
62
+ return false;
63
+ }
64
+ return false;
65
+ }
66
+ /** Plain-text formatter for the non-interactive `browser-link updates`. */
67
+ export function formatUpdate(info) {
68
+ if (info.error || info.latest === null) {
69
+ return [
70
+ `Current: ${info.current}`,
71
+ `Could not check the registry: ${info.error ?? 'unknown error'}`,
72
+ ].join('\n');
73
+ }
74
+ if (info.newer) {
75
+ return [
76
+ `Current: ${info.current}`,
77
+ `Latest: ${info.latest}`,
78
+ `Update available. Run: npm install -g ${PACKAGE_NAME}@latest`,
79
+ ].join('\n');
80
+ }
81
+ return [`Current: ${info.current}`, `Latest: ${info.latest}`, `You are up to date.`].join('\n');
82
+ }
83
+ //# sourceMappingURL=updates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/commands/updates.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ export type Language = 'en' | 'es';
2
2
  export interface WelcomeResult {
3
3
  action: 'continue' | 'quit';
4
4
  language: Language;
5
+ /** True when the user opted "Accept and don't show again" — the App
6
+ * persists `skipWelcome: true` in config when this is set. */
5
7
  persisted: boolean;
6
8
  }
7
9
  export interface WelcomeOptions {
@@ -30,5 +32,4 @@ interface I18n {
30
32
  };
31
33
  }
32
34
  export declare const I18N_WELCOME: Record<Language, I18n>;
33
- export declare function runWelcome(opts?: WelcomeOptions): Promise<WelcomeResult>;
34
35
  export {};
@@ -1,14 +1,15 @@
1
- import * as p from '@clack/prompts';
2
- import { saveConfig } from '../config.js';
1
+ /* Welcome screen strings (English / Spanish) shared by the interactive Ink
2
+ * Welcome view and any future non-interactive caller. No runtime logic here
3
+ * — every screen consumes this as a pure data module. */
3
4
  export const I18N_WELCOME = {
4
5
  en: {
5
6
  title: 'browser-link',
6
7
  aboutTitle: 'What this is',
7
8
  about: [
8
9
  'An MCP server that opens a small WebSocket bridge between an MCP',
9
- 'client (Claude Code, OpenCode, …) and the Google Chrome tabs you',
10
- 'explicitly grant access to through a custom companion extension you',
11
- 'load locally.',
10
+ 'client (Claude Code, OpenCode, GitHub Copilot CLI…) and the Google',
11
+ 'Chrome tabs you explicitly grant access to through a custom companion',
12
+ 'extension you load locally.',
12
13
  ].join('\n'),
13
14
  capabilitiesTitle: 'What the agent can do on a connected tab',
14
15
  capabilities: [
@@ -22,7 +23,7 @@ export const I18N_WELCOME = {
22
23
  'about each app across sessions in a local SQLite map (selectors,',
23
24
  'flows, gotchas — never uploaded anywhere).',
24
25
  ].join('\n'),
25
- warningTitle: 'Read this before you continue',
26
+ warningTitle: 'Read this before you continue',
26
27
  warning: [
27
28
  'Connecting a tab gives the agent access to whatever is on it — any',
28
29
  'logged-in session, saved card, wallet, banking page, work console or',
@@ -51,9 +52,9 @@ export const I18N_WELCOME = {
51
52
  aboutTitle: 'Qué es esto',
52
53
  about: [
53
54
  'Un servidor MCP que abre un puente WebSocket entre un cliente MCP',
54
- '(Claude Code, OpenCode, …) y las pestañas de Google Chrome a las que',
55
- 'vos le des acceso explícito a través de una extensión que cargás vos',
56
- 'manualmente.',
55
+ '(Claude Code, OpenCode, GitHub Copilot CLI…) y las pestañas de Google',
56
+ 'Chrome a las que vos le des acceso explícito a través de una extensión',
57
+ 'que cargás vos manualmente.',
57
58
  ].join('\n'),
58
59
  capabilitiesTitle: 'Qué puede hacer el agente en una pestaña conectada',
59
60
  capabilities: [
@@ -67,7 +68,7 @@ export const I18N_WELCOME = {
67
68
  'aprende de cada app entre sesiones en un mapa SQLite local (selectores,',
68
69
  'flujos, gotchas — nunca se sube a ningún lado).',
69
70
  ].join('\n'),
70
- warningTitle: 'Leelo antes de continuar',
71
+ warningTitle: 'Leelo antes de continuar',
71
72
  warning: [
72
73
  'Conectar una pestaña le da al agente acceso a todo lo que esté en esa',
73
74
  'pestaña: sesiones iniciadas, tarjetas guardadas, wallets, banca,',
@@ -94,41 +95,4 @@ export const I18N_WELCOME = {
94
95
  },
95
96
  },
96
97
  };
97
- export async function runWelcome(opts = {}) {
98
- let lang = opts.initial ?? 'en';
99
- const hideDismiss = opts.hideDismiss === true;
100
- while (true) {
101
- const t = I18N_WELCOME[lang];
102
- p.intro(t.title);
103
- p.note(t.about, t.aboutTitle);
104
- p.note(t.capabilities, t.capabilitiesTitle);
105
- p.note(t.warning, t.warningTitle);
106
- p.note(`${t.responsibility}\n\n${t.extensionNote}`);
107
- const options = [
108
- { value: 'accept', label: t.options.accept },
109
- ];
110
- if (!hideDismiss)
111
- options.push({ value: 'dismiss', label: t.options.dismiss });
112
- options.push({ value: 'swap', label: t.options.swap }, { value: 'quit', label: t.options.quit });
113
- const choice = (await p.select({
114
- message: t.prompt,
115
- options,
116
- initialValue: 'accept',
117
- }));
118
- if (p.isCancel(choice) || choice === 'quit') {
119
- p.cancel(lang === 'es' ? 'Cancelado.' : 'Cancelled.');
120
- return { action: 'quit', language: lang, persisted: false };
121
- }
122
- if (choice === 'swap') {
123
- lang = lang === 'en' ? 'es' : 'en';
124
- continue;
125
- }
126
- if (choice === 'dismiss') {
127
- saveConfig({ skipWelcome: true, language: lang });
128
- return { action: 'continue', language: lang, persisted: true };
129
- }
130
- // accept
131
- return { action: 'continue', language: lang, persisted: false };
132
- }
133
- }
134
98
  //# sourceMappingURL=welcome.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/commands/welcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAgC1C,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,EAAE,EAAE;QACF,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE;YACL,kEAAkE;YAClE,kEAAkE;YAClE,qEAAqE;YACrE,eAAe;SAChB,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,iBAAiB,EAAE,0CAA0C;QAC7D,YAAY,EAAE;YACZ,gCAAgC;YAChC,6CAA6C;YAC7C,oCAAoC;YACpC,oDAAoD;YACpD,EAAE;YACF,oEAAoE;YACpE,uEAAuE;YACvE,kEAAkE;YAClE,4CAA4C;SAC7C,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,YAAY,EAAE,kCAAkC;QAChD,OAAO,EAAE;YACP,oEAAoE;YACpE,sEAAsE;YACtE,2DAA2D;YAC3D,EAAE;YACF,uEAAuE;YACvE,wEAAwE;YACxE,qEAAqE;YACrE,EAAE;YACF,uEAAuE;YACvE,uEAAuE;YACvE,4BAA4B;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,cAAc,EACZ,iLAAiL;QACnL,aAAa,EACX,yLAAyL;QAC3L,MAAM,EAAE,6BAA6B;QACrC,OAAO,EAAE;YACP,MAAM,EAAE,wBAAwB;YAChC,OAAO,EAAE,6BAA6B;YACtC,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,MAAM;SACb;KACF;IACD,EAAE,EAAE;QACF,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,aAAa;QACzB,KAAK,EAAE;YACL,mEAAmE;YACnE,sEAAsE;YACtE,sEAAsE;YACtE,cAAc;SACf,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,iBAAiB,EAAE,oDAAoD;QACvE,YAAY,EAAE;YACZ,uCAAuC;YACvC,+CAA+C;YAC/C,2CAA2C;YAC3C,8DAA8D;YAC9D,EAAE;YACF,qEAAqE;YACrE,uEAAuE;YACvE,yEAAyE;YACzE,iDAAiD;SAClD,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,YAAY,EAAE,6BAA6B;QAC3C,OAAO,EAAE;YACP,uEAAuE;YACvE,kEAAkE;YAClE,qEAAqE;YACrE,wCAAwC;YACxC,EAAE;YACF,iEAAiE;YACjE,4DAA4D;YAC5D,qEAAqE;YACrE,oCAAoC;YACpC,EAAE;YACF,oEAAoE;YACpE,uEAAuE;YACvE,4BAA4B;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,cAAc,EACZ,oMAAoM;QACtM,aAAa,EACX,qNAAqN;QACvN,MAAM,EAAE,sBAAsB;QAC9B,OAAO,EAAE;YACP,MAAM,EAAE,sBAAsB;YAC9B,OAAO,EAAE,+BAA+B;YACxC,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,OAAO;SACd;KACF;CACF,CAAC;AAIF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB,EAAE;IACxD,IAAI,IAAI,GAAa,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC;IAE9C,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAE7B,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAuC;YAClD,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE;SAC7C,CAAC;QACF,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/E,OAAO,CAAC,IAAI,CACV,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EACxC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CACzC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YAC7B,OAAO,EAAE,CAAC,CAAC,MAAM;YACjB,OAAO;YACP,YAAY,EAAE,QAAkB;SACjC,CAAC,CAAoB,CAAC;QAEvB,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5C,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YACtD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9D,CAAC;QAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACnC,SAAS;QACX,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACjE,CAAC;QAED,SAAS;QACT,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAClE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/commands/welcome.ts"],"names":[],"mappings":"AAAA;;yDAEyD;AAkCzD,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,EAAE,EAAE;QACF,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,cAAc;QAC1B,KAAK,EAAE;YACL,kEAAkE;YAClE,oEAAoE;YACpE,uEAAuE;YACvE,6BAA6B;SAC9B,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,iBAAiB,EAAE,0CAA0C;QAC7D,YAAY,EAAE;YACZ,gCAAgC;YAChC,6CAA6C;YAC7C,oCAAoC;YACpC,oDAAoD;YACpD,EAAE;YACF,oEAAoE;YACpE,uEAAuE;YACvE,kEAAkE;YAClE,4CAA4C;SAC7C,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,YAAY,EAAE,+BAA+B;QAC7C,OAAO,EAAE;YACP,oEAAoE;YACpE,sEAAsE;YACtE,2DAA2D;YAC3D,EAAE;YACF,uEAAuE;YACvE,wEAAwE;YACxE,qEAAqE;YACrE,EAAE;YACF,uEAAuE;YACvE,uEAAuE;YACvE,4BAA4B;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,cAAc,EACZ,iLAAiL;QACnL,aAAa,EACX,yLAAyL;QAC3L,MAAM,EAAE,6BAA6B;QACrC,OAAO,EAAE;YACP,MAAM,EAAE,wBAAwB;YAChC,OAAO,EAAE,6BAA6B;YACtC,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,MAAM;SACb;KACF;IACD,EAAE,EAAE;QACF,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,aAAa;QACzB,KAAK,EAAE;YACL,mEAAmE;YACnE,uEAAuE;YACvE,wEAAwE;YACxE,6BAA6B;SAC9B,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,iBAAiB,EAAE,oDAAoD;QACvE,YAAY,EAAE;YACZ,uCAAuC;YACvC,+CAA+C;YAC/C,2CAA2C;YAC3C,8DAA8D;YAC9D,EAAE;YACF,qEAAqE;YACrE,uEAAuE;YACvE,yEAAyE;YACzE,iDAAiD;SAClD,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,YAAY,EAAE,0BAA0B;QACxC,OAAO,EAAE;YACP,uEAAuE;YACvE,kEAAkE;YAClE,qEAAqE;YACrE,wCAAwC;YACxC,EAAE;YACF,iEAAiE;YACjE,4DAA4D;YAC5D,qEAAqE;YACrE,oCAAoC;YACpC,EAAE;YACF,oEAAoE;YACpE,uEAAuE;YACvE,4BAA4B;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,cAAc,EACZ,oMAAoM;QACtM,aAAa,EACX,qNAAqN;QACvN,MAAM,EAAE,sBAAsB;QAC9B,OAAO,EAAE;YACP,MAAM,EAAE,sBAAsB;YAC9B,OAAO,EAAE,+BAA+B;YACxC,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,OAAO;SACd;KACF;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Installer } from './types.js';
2
+ export declare const copilotInstaller: Installer;
@@ -0,0 +1,72 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { dirname, join } from 'node:path';
4
+ const SERVER_NAME = 'browser-link';
5
+ function configFile() {
6
+ // GitHub Copilot CLI reads from ~/.copilot/mcp-config.json by default.
7
+ // COPILOT_HOME overrides the directory (the same env var the CLI honours).
8
+ const root = process.env.COPILOT_HOME ?? join(homedir(), '.copilot');
9
+ return join(root, 'mcp-config.json');
10
+ }
11
+ function readConfig(path) {
12
+ if (!existsSync(path))
13
+ return {};
14
+ try {
15
+ return JSON.parse(readFileSync(path, 'utf8'));
16
+ }
17
+ catch {
18
+ throw new Error(`Could not parse Copilot config at ${path}. Fix the file or delete it.`);
19
+ }
20
+ }
21
+ function writeConfig(path, cfg) {
22
+ mkdirSync(dirname(path), { recursive: true });
23
+ writeFileSync(path, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
24
+ }
25
+ function isRegistered(cfg) {
26
+ return !!cfg.mcpServers?.[SERVER_NAME];
27
+ }
28
+ export const copilotInstaller = {
29
+ id: 'copilot',
30
+ displayName: 'GitHub Copilot CLI',
31
+ configPath() {
32
+ return configFile();
33
+ },
34
+ detect() {
35
+ const path = configFile();
36
+ if (!existsSync(path)) {
37
+ return { installed: false, registered: false, configPath: path };
38
+ }
39
+ const cfg = readConfig(path);
40
+ return { installed: true, registered: isRegistered(cfg), configPath: path };
41
+ },
42
+ install(command, args) {
43
+ const path = configFile();
44
+ const cfg = readConfig(path);
45
+ cfg.mcpServers = cfg.mcpServers ?? {};
46
+ const existing = cfg.mcpServers[SERVER_NAME];
47
+ // Copilot requires `env` and `tools` even when empty/wildcard.
48
+ cfg.mcpServers[SERVER_NAME] = {
49
+ type: 'local',
50
+ command,
51
+ args,
52
+ env: {},
53
+ tools: ['*'],
54
+ };
55
+ writeConfig(path, cfg);
56
+ return existing
57
+ ? `Updated ${SERVER_NAME} entry in ${path}.`
58
+ : `Added ${SERVER_NAME} entry to ${path}.`;
59
+ },
60
+ uninstall() {
61
+ const path = configFile();
62
+ if (!existsSync(path))
63
+ return `No Copilot CLI config at ${path}; nothing to remove.`;
64
+ const cfg = readConfig(path);
65
+ if (!cfg.mcpServers?.[SERVER_NAME])
66
+ return `${SERVER_NAME} was not registered in ${path}.`;
67
+ delete cfg.mcpServers[SERVER_NAME];
68
+ writeConfig(path, cfg);
69
+ return `Removed ${SERVER_NAME} entry from ${path}.`;
70
+ },
71
+ };
72
+ //# sourceMappingURL=copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../src/installers/copilot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,WAAW,GAAG,cAAc,CAAC;AAiBnC,SAAS,UAAU;IACjB,uEAAuE;IACvE,2EAA2E;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAkB,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,8BAA8B,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,GAAkB;IACnD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,GAAkB;IACtC,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAc;IACzC,EAAE,EAAE,SAAS;IACb,WAAW,EAAE,oBAAoB;IAEjC,UAAU;QACR,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;IAED,MAAM;QACJ,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACnE,CAAC;QACD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9E,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,IAAc;QACrC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7B,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7C,+DAA+D;QAC/D,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG;YAC5B,IAAI,EAAE,OAAO;YACb,OAAO;YACP,IAAI;YACJ,GAAG,EAAE,EAAE;YACP,KAAK,EAAE,CAAC,GAAG,CAAC;SACb,CAAC;QACF,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACvB,OAAO,QAAQ;YACb,CAAC,CAAC,WAAW,WAAW,aAAa,IAAI,GAAG;YAC5C,CAAC,CAAC,SAAS,WAAW,aAAa,IAAI,GAAG,CAAC;IAC/C,CAAC;IAED,SAAS;QACP,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,4BAA4B,IAAI,sBAAsB,CAAC;QACrF,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC;YAAE,OAAO,GAAG,WAAW,0BAA0B,IAAI,GAAG,CAAC;QAC3F,OAAO,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACnC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACvB,OAAO,WAAW,WAAW,eAAe,IAAI,GAAG,CAAC;IACtD,CAAC;CACF,CAAC"}
@@ -1,10 +1,11 @@
1
1
  import { claudeInstaller } from './claude.js';
2
+ import { copilotInstaller } from './copilot.js';
2
3
  import { opencodeInstaller } from './opencode.js';
3
4
  /**
4
5
  * Installers wired into the CLI surface (`install`, `install --client X`,
5
6
  * the interactive menu, and `doctor`). Order here is the display order.
6
7
  */
7
- export const INSTALLERS = [claudeInstaller, opencodeInstaller];
8
+ export const INSTALLERS = [claudeInstaller, opencodeInstaller, copilotInstaller];
8
9
  export function getInstaller(id) {
9
10
  const found = INSTALLERS.find((i) => i.id === id);
10
11
  if (!found)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAgB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;AAE5E,MAAM,UAAU,YAAY,CAAC,EAAY;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;IACpE,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/installers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAgB,CAAC,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AAE9F,MAAM,UAAU,YAAY,CAAC,EAAY;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;IACpE,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,4 +1,4 @@
1
- export type ClientId = 'claude' | 'opencode';
1
+ export type ClientId = 'claude' | 'opencode' | 'copilot';
2
2
  export interface ClientInfo {
3
3
  id: ClientId;
4
4
  displayName: string;