@jobshimo/browser-link 0.20.0 → 0.21.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 +74 -70
- package/dist/cli.js +48 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/map.d.ts +2 -0
- package/dist/commands/map.js +698 -0
- package/dist/commands/map.js.map +1 -0
- package/dist/extension/manifest.json +1 -1
- package/dist/map/queries.d.ts +107 -0
- package/dist/map/queries.js +174 -0
- package/dist/map/queries.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,9 +17,23 @@
|
|
|
17
17
|
|
|
18
18
|
MCP server that bridges any MCP-compatible client (Claude Code, OpenCode,
|
|
19
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.
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
through a small WebSocket relay and a companion Chrome extension. Only
|
|
21
|
+
tabs you explicitly connect are ever reachable; everything else stays
|
|
22
|
+
invisible to the agent.
|
|
23
|
+
|
|
24
|
+
It exposes 31 MCP tools — 25 for driving the connected tab (read the DOM,
|
|
25
|
+
click, type, run JS, watch console/network, drive multi-step flows…) and 6
|
|
26
|
+
for a persistent UI map, a small local SQLite DB where the agent saves
|
|
27
|
+
selectors, flows and gotchas it learns about each app so it does not
|
|
28
|
+
rediscover them every session. Every tool is individually toggle-able, and
|
|
29
|
+
the whole thing runs loopback-only — nothing here talks to the network
|
|
30
|
+
except the npm registry, on `browser-link updates`.
|
|
31
|
+
|
|
32
|
+
A `browser-link` CLI binary handles setup (register with your MCP client,
|
|
33
|
+
show the extension install steps, diagnose the current state) and, new in
|
|
34
|
+
this release, lets a human inspect and manage the persistent map directly
|
|
35
|
+
from a terminal — list known apps, read what was saved about one of them,
|
|
36
|
+
delete stale knowledge, or export/import it as JSON.
|
|
23
37
|
|
|
24
38
|
## Install
|
|
25
39
|
|
|
@@ -29,98 +43,81 @@ npm install -g @jobshimo/browser-link
|
|
|
29
43
|
|
|
30
44
|
This puts the `browser-link` binary on your PATH on macOS, Linux and Windows.
|
|
31
45
|
|
|
32
|
-
##
|
|
46
|
+
## Quick start
|
|
33
47
|
|
|
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
|
|
48
|
+
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:
|
|
35
49
|
|
|
36
50
|
```bash
|
|
37
51
|
browser-link
|
|
38
52
|
```
|
|
39
53
|
|
|
40
|
-
That opens the welcome
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
54
|
+
That opens the welcome screen and then a setup menu to register with
|
|
55
|
+
**Claude Code**, **OpenCode** or **GitHub Copilot CLI**, see the Chrome
|
|
56
|
+
extension install steps, run a doctor diagnose, and manage per-tool
|
|
57
|
+
permissions.
|
|
44
58
|
|
|
45
|
-
|
|
59
|
+
Or drive it directly:
|
|
46
60
|
|
|
47
61
|
```bash
|
|
48
62
|
browser-link install # register in every detected client
|
|
49
63
|
browser-link install --client claude # register only in Claude Code
|
|
50
|
-
browser-link install --client opencode # register only in OpenCode
|
|
51
|
-
browser-link install --client copilot # register only in GitHub Copilot CLI
|
|
52
|
-
browser-link uninstall --client opencode # remove from one client
|
|
53
64
|
browser-link extension # show the Chrome extension assets path + steps
|
|
54
65
|
browser-link doctor # diagnose current setup
|
|
55
|
-
browser-link tools # show which MCP tools are enabled
|
|
56
|
-
browser-link tools disable browser.evaluate
|
|
66
|
+
browser-link tools # show which of the 31 MCP tools are enabled
|
|
57
67
|
browser-link tools preset readonly # all | readonly | no-eval | no-map
|
|
58
|
-
browser-link
|
|
59
|
-
browser-link about #
|
|
68
|
+
browser-link map # list apps the persistent UI map knows about
|
|
69
|
+
browser-link about # full help — every command, every tool
|
|
60
70
|
```
|
|
61
71
|
|
|
62
|
-
|
|
72
|
+
After `install`, restart your MCP client. After `extension`, load the
|
|
73
|
+
unpacked extension as instructed, then click "Connect this tab" on every
|
|
74
|
+
tab you want the agent to reach.
|
|
63
75
|
|
|
64
|
-
|
|
65
|
-
6 UI-map tools, and `browser.events` for bridge traceability. You can
|
|
66
|
-
disable any subset per machine, either through the **Permissions** screen
|
|
67
|
-
in the interactive menu (toggle with Space, apply a preset with Enter,
|
|
68
|
-
save with `s`) or through the scriptable `browser-link tools` subcommand.
|
|
69
|
-
Available presets: `all` (default), `readonly`, `no-eval`, `no-map`.
|
|
70
|
-
Changes take effect the next time your MCP client starts the server.
|
|
76
|
+
## The 31 tools, at a glance
|
|
71
77
|
|
|
72
|
-
|
|
78
|
+
| Family | Count | What it covers |
|
|
79
|
+
| -------------------------- | ----: | ----------------------------------------------------------------------------------- |
|
|
80
|
+
| Browser bridge — read | 13 | list/claim tabs, snapshot/find/state, console, network, wait_for(_tab), events |
|
|
81
|
+
| Browser bridge — actions | 12 | navigate, click, type, press, drag, flow, evaluate, dialogs, permissions, reset |
|
|
82
|
+
| Persistent UI map | 6 | recall, save, record_use, forget, rename_app, apps |
|
|
73
83
|
|
|
74
|
-
|
|
75
|
-
(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
84
|
+
Every tool can be disabled per machine via `browser-link tools disable
|
|
85
|
+
<name>` or a preset (`all` / `readonly` / `no-eval` / `no-map`). The full
|
|
86
|
+
tool-by-tool reference — every name, its exact contract, and the
|
|
87
|
+
Shadow-DOM/iframe piercing and occlusion rules the bridge tools follow —
|
|
88
|
+
lives in the [GitHub README](https://github.com/jobshimo/browser-link#what-the-agent-can-do);
|
|
89
|
+
this page stays a landing page on purpose.
|
|
80
90
|
|
|
81
|
-
|
|
82
|
-
browser-link multi-agent enable
|
|
83
|
-
browser-link multi-agent auto-reelect enable # optional
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
With `auto-reelect` on, secondary proxies survive the primary closing:
|
|
87
|
-
they enter a 5-second reconnect window, return `-32001 "temporarily
|
|
88
|
-
unavailable"` for in-flight requests, and hot-swap to the fresh primary
|
|
89
|
-
once it appears. The agent self-recovers from stale tab ids via the new
|
|
90
|
-
`browser.events` tool, which surfaces a ring buffer of bridge lifecycle
|
|
91
|
-
events (`primary-elected`, `tab-registered`, `tab-disconnected`,
|
|
92
|
-
`tab-renamed`). The Chrome extension preserves the per-tab id across
|
|
93
|
-
primary swaps via `chrome.storage.session`.
|
|
94
|
-
|
|
95
|
-
After `install`, restart the MCP client so it picks up the new entry.
|
|
96
|
-
After `extension`, follow the printed steps to load the unpacked extension
|
|
97
|
-
in Chrome. Then click "Connect this tab" on every tab you want the agent to reach
|
|
98
|
-
— and only on those.
|
|
99
|
-
|
|
100
|
-
## Supported MCP clients
|
|
91
|
+
## `browser-link map` — inspect and manage the persistent map
|
|
101
92
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
| [OpenCode](https://opencode.ai) | `~/.config/opencode/opencode.json` on **every** OS (Win incl.) |
|
|
106
|
-
| [GitHub Copilot CLI](https://docs.github.com/en/copilot/copilot-cli) | `~/.copilot/mcp-config.json` (override via `COPILOT_HOME` env) |
|
|
93
|
+
The 6 map tools above are how an *agent* reads and writes the map while it
|
|
94
|
+
works. `browser-link map` is how a *human* looks at the same data from a
|
|
95
|
+
terminal, no agent required:
|
|
107
96
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
97
|
+
```bash
|
|
98
|
+
browser-link map # list every known app
|
|
99
|
+
browser-link map show <app> # entries + flows for one app (app_key or origin)
|
|
100
|
+
browser-link map forget <app> --yes # delete a whole app and its data
|
|
101
|
+
browser-link map forget <app> --flow <name> # delete just one named flow
|
|
102
|
+
browser-link map export --out map.json # back up the map as JSON
|
|
103
|
+
browser-link map import map.json # restore it (merge by default, --replace to overwrite)
|
|
104
|
+
```
|
|
113
105
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
106
|
+
> **Privacy note.** An export can contain UI structure and flow steps an
|
|
107
|
+
> agent saved — selectors, page notes, multi-step recipes. Review a file
|
|
108
|
+
> before sharing it. The map is designed so agents never write real domain
|
|
109
|
+
> data into it (IDs, names, dates — placeholders like `<QUERY>` stand in
|
|
110
|
+
> instead), but an export is only as clean as what was actually saved.
|
|
117
111
|
|
|
118
|
-
|
|
119
|
-
`browser.map.save`, `browser.map.record_use`, `browser.map.forget`,
|
|
120
|
-
`browser.map.rename_app`, `browser.map.apps`.
|
|
112
|
+
## Also inside
|
|
121
113
|
|
|
122
|
-
|
|
123
|
-
|
|
114
|
+
- **Supported clients**: Claude Code, OpenCode, GitHub Copilot CLI — see
|
|
115
|
+
[Quick start](https://github.com/jobshimo/browser-link#quick-start) for
|
|
116
|
+
exact config paths.
|
|
117
|
+
- **Multi-agent mode** (on by default): more than one MCP client can share
|
|
118
|
+
the same bridge and map. `browser-link multi-agent` shows the current
|
|
119
|
+
state; see [Multi-agent mode](https://github.com/jobshimo/browser-link#multi-agent-mode)
|
|
120
|
+
for how it works.
|
|
124
121
|
|
|
125
122
|
## Where the data lives
|
|
126
123
|
|
|
@@ -134,6 +131,13 @@ Override with `BROWSER_LINK_DATA_DIR`. The database is local to your
|
|
|
134
131
|
machine and never uploaded anywhere by this package. The WebSocket relay
|
|
135
132
|
binds to `127.0.0.1:17529` (loopback only).
|
|
136
133
|
|
|
134
|
+
## Learn more
|
|
135
|
+
|
|
136
|
+
The [GitHub README](https://github.com/jobshimo/browser-link#readme) has
|
|
137
|
+
the full picture: every tool's contract, multi-agent mode, the "how it
|
|
138
|
+
works" architecture diagram, supported MCP clients, and the FAQ on
|
|
139
|
+
Chrome's debugger infobar.
|
|
140
|
+
|
|
137
141
|
## License
|
|
138
142
|
|
|
139
143
|
MIT — see [LICENSE](https://github.com/jobshimo/browser-link/blob/main/LICENSE).
|
package/dist/cli.js
CHANGED
|
@@ -9,6 +9,7 @@ import { runToolsCommand } from './commands/tools.js';
|
|
|
9
9
|
import { runMultiAgentCommand } from './commands/multi-agent.js';
|
|
10
10
|
import { runFreePort } from './commands/free-port.js';
|
|
11
11
|
import { runConfigCommand } from './commands/config.js';
|
|
12
|
+
import { runMapCommand } from './commands/map.js';
|
|
12
13
|
import { formatStatus as formatInstructionsStatus, installInstructionsAll, installInstructionsFor, statusAll as instructionsStatusAll, statusFor as instructionsStatusFor, uninstallInstructionsAll, uninstallInstructionsFor, } from './commands/instructions.js';
|
|
13
14
|
import { loadConfig } from './config.js';
|
|
14
15
|
import { VERSION } from './version.js';
|
|
@@ -49,6 +50,29 @@ Uso:
|
|
|
49
50
|
extensión — gana la última escritura (ver README). Bajar el TTL
|
|
50
51
|
cuenta desde la última actividad de cada pestaña: una pestaña ya
|
|
51
52
|
inactiva puede desconectarse en el próximo barrido.
|
|
53
|
+
browser-link map Lista las apps que el mapa persistente de UI conoce
|
|
54
|
+
(app_key, origin, cantidad de entradas/flows, última vez).
|
|
55
|
+
browser-link map show <app> Muestra las entradas y flows guardados de una app
|
|
56
|
+
(identificada por app_key u origin).
|
|
57
|
+
browser-link map forget <app> [--flow <nombre>]
|
|
58
|
+
Elimina un flow puntual por nombre, o (con --yes) toda
|
|
59
|
+
una app y sus datos. Sin --yes solo muestra qué se
|
|
60
|
+
borraría y el comando exacto para confirmar. --flow
|
|
61
|
+
también pide --yes cuando <app> coincide con más de un
|
|
62
|
+
origin.
|
|
63
|
+
browser-link map export [<app>] [--out <archivo.json>]
|
|
64
|
+
Exporta el mapa (o una sola app) como JSON a stdout, o
|
|
65
|
+
a --out. El archivo puede contener estructura de UI y
|
|
66
|
+
pasos de flows guardados — revisalo antes de compartirlo.
|
|
67
|
+
browser-link map import <archivo.json> [--replace]
|
|
68
|
+
Importa una exportación del mapa. Por defecto hace un
|
|
69
|
+
merge (upsert de apps/flows, agrega entradas nuevas,
|
|
70
|
+
omite duplicados exactos); --replace primero borra los
|
|
71
|
+
datos existentes de cada app importada. Todo el archivo
|
|
72
|
+
se valida antes de escribir (pasos de flows, campos de
|
|
73
|
+
entradas, versión de exportación, límites de tamaño) —
|
|
74
|
+
cualquier elemento inválido aborta la importación sin
|
|
75
|
+
escribir nada.
|
|
52
76
|
browser-link instructions Muestra si el bloque de instrucciones de browser-link
|
|
53
77
|
está presente en el .md global de cada cliente
|
|
54
78
|
(Claude, OpenCode, Copilot CLI).
|
|
@@ -105,6 +129,26 @@ Usage:
|
|
|
105
129
|
last write wins (see README). Lowering the TTL counts from each
|
|
106
130
|
tab's last activity: an already-idle tab may disconnect on the
|
|
107
131
|
next sweep.
|
|
132
|
+
browser-link map List apps known to the persistent UI map (app_key,
|
|
133
|
+
origin, entry/flow counts, last seen).
|
|
134
|
+
browser-link map show <app> Show the saved entries and flows for one app
|
|
135
|
+
(looked up by app_key or origin).
|
|
136
|
+
browser-link map forget <app> [--flow <name>]
|
|
137
|
+
Delete one named flow, or (with --yes) a whole app and
|
|
138
|
+
its data. Without --yes, only prints what would be
|
|
139
|
+
deleted and the exact command to confirm. --flow also
|
|
140
|
+
asks for --yes when <app> matches more than one origin.
|
|
141
|
+
browser-link map export [<app>] [--out <file.json>]
|
|
142
|
+
Export the map (or one app) as JSON, to stdout or to
|
|
143
|
+
--out. The file may contain UI structure and flow steps
|
|
144
|
+
that were saved — review it before sharing.
|
|
145
|
+
browser-link map import <file.json> [--replace]
|
|
146
|
+
Import a map export. Default is a merge (upsert apps/
|
|
147
|
+
flows, append new entries, skip exact duplicates);
|
|
148
|
+
--replace deletes each imported app's existing data
|
|
149
|
+
first. The whole file is validated up front (flow
|
|
150
|
+
steps, entry fields, export version, sanity caps) —
|
|
151
|
+
any invalid item aborts the import without writing.
|
|
108
152
|
browser-link instructions Show whether the browser-link instructions block
|
|
109
153
|
is present in each client's global .md file
|
|
110
154
|
(Claude, OpenCode, Copilot CLI).
|
|
@@ -246,6 +290,10 @@ async function dispatch(argv) {
|
|
|
246
290
|
console.log(await runConfigCommand(rest, language));
|
|
247
291
|
return;
|
|
248
292
|
}
|
|
293
|
+
case 'map': {
|
|
294
|
+
console.log(runMapCommand(rest, language));
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
249
297
|
case 'instructions': {
|
|
250
298
|
// `rest.at(0)` correctly types the missing-arg case as `undefined`
|
|
251
299
|
// (vs. `rest[0]: string` under the project's loose index access).
|
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,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,YAAY,IAAI,wBAAwB,EACxC,sBAAsB,EACtB,sBAAsB,EACtB,SAAS,IAAI,qBAAqB,EAClC,SAAS,IAAI,qBAAqB,EAClC,wBAAwB,EACxB,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAgBvC,SAAS,SAAS,CAAC,QAAkB;IACnC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,gBAAgB,OAAO
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|