Skip to content
Research
Skill

/browser-use

Use this skill to drive Wisp Browser Runtime sessions (shared daily Chrome or workspace Chrome) — open pages, read them, click, fill and submit forms, navigate, switch tabs, or scrape content that needs the user's existing cookies and login state. Triggers when the user asks to

BOOST
From plugin
wisp-science
1k27 skills
Install
$ npx -y skills add xuzhougeng/wisp-science --skill browser-use --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/browser-use

Context preview

The summary Claude sees to decide when to auto-load this skill.

Use this skill to drive Wisp Browser Runtime sessions (shared daily Chrome or workspace Chrome) — open pages, read them, click, fill and submit forms, navigate, switch tabs, or scrape content that needs the user's existing cookies and login state. Triggers when the user asks to

SKILL.md

browser-use.SKILL.md
name: browser-use
description: "Use this skill to drive Wisp Browser Runtime sessions (shared daily Chrome or workspace Chrome) — open pages, read them, click, fill and submit forms, navigate, switch tabs, or scrape content that needs the user's existing cookies and login state. Triggers when the user asks to do something in their browser, log into a site and act inside it, fill out a web form, click through a flow, or extract data from a page that requires being signed in. Tools: browser_setup (check/connect the extension), web_open_tab (open a URL), web_scan (read visible content + actionable elements with ready-made selectors), web_execute_js (click/type/navigate, or a JSON command for tabs/CDP), web_screenshot (see what the tab is showing — layout, charts, canvas, QR codes). Not for the built-in read-only web fetch — this is for interacting with a live browser."
fold_cue: "instead_of=guessing-selectors use=web_scan first — it returns a unique CSS selector and rect for every actionable element; never invent selectors"

Browser Use — act inside the user's real Chrome

Wisp talks to the **Browser Runtime**. Shared mode uses the user's daily Chrome via the unpacked extension — every action runs in their real profile: existing cookies, logins, extensions, and normal fingerprint all apply. Workspace mode can launch a separate Chrome profile. Omitting `session` always uses shared, even when workspace is connected. Pass `session: "workspace"` only when the user explicitly requests isolation. If Settings → Browser has **Open browser automatically** enabled (the default) and the shared extension is disconnected, Wisp may start the installed Chrome/Chromium/Edge so the extension can reconnect. That is still the user's profile, not Playwright or Selenium.

**Shared is the default; workspace is not a fallback.** Google Chrome 137 and later ignore `--load-extension`, so on a machine with only branded Chrome the workspace window cannot load the Wisp extension at all. `browser_setup {"action":"start_workspace"}` therefore returns only once the workspace extension has connected, and otherwise closes the window and fails with `WORKSPACE_EXTENSION_BLOCKED`. On that error: relay the message, do not retry `start_workspace`, do not claim any workspace page was opened or read, and get the shared session working instead.

Start with `browser_setup` without an action (an empty action is also a status check). If the task supplies a target URL, pass it as `url` so a disconnected daily browser opens that page directly; otherwise startup uses its new-tab page. A connected shared browser is reused without opening another window. Startup does not close existing tabs, including pre-existing blank or new-tab pages.

For figures/code extraction use `web_scan` with `mode: "article"` then `web_save_assets`. For an already-logged-in in-browser chat (ChatGPT, Gemini, or Google AI Mode at `google.com/search?udm=50`) use `web_agent_send`, `web_agent_wait`, `web_agent_read` on that tab.

Every `web_scan` and `web_execute_js` call needs the user's approval by design. Do not treat that as a bug to route around.

Before anything: confirm the bridge is live

Call `browser_setup`. If `status` is not `connected` (or `live_retrieval` is false), relay its `steps` (load the unpacked extension from `extension_path`, verbatim) and **stop**. Do not answer live, latest, current, or URL-specific questions from prior knowledge. Tell the user this turn contains no live web retrieval and wait until the popup shows *Connected to Wisp*. Only continue from memory if they explicitly ask for a knowledge-only answer. Never invent the path.

Two fields say *why* a browser that looks connected is not usable — never report a bare "not connected" when either is set:

  • `refused_connection` — something reached the bridge port and Wisp

refused it (usually a different extension id, or another loopback bridge holding the port). Its popup can still read *Connected to Wisp*. Relay `refused_connection.explanation`.

  • `update_required` / `reload_required` — a connected extension is older than

this build. Call `browser_setup {"action":"update_extension"}` first. If it returns `updated`, call `browser_setup` again and continue only when `update_required=false`. If it returns `manual_reload_required`, relay the current and bundled versions plus `extension_path` verbatim, ask the user to **Reload** Wisp Real Browser Bridge on `chrome://extensions`, and wait. Older unpacked extensions cannot accept Wisp's automatic service-worker reload.

One exception: the user says the extension is already installed. Chrome suspends its service worker when idle and reconnects on a one-minute alarm, so `disconnected` can just be a sleeping worker. Try `web_open_tab` or `web_scan` once — a successful call proves the bridge is live — and relay the install steps only if that call fails too.

The loop

1. **`web_open_tab`** `{url}` — open the page (works even with no tab open yet). Waits until the document is complete, then returns the new tab id plus `ready`. If `ready` is false, the load timed out — call `web_scan` before acting. 2. **`web_scan`** — read the page (after waiting for document complete). Returns `page.text`, `page.title`, `page.ready_state`, and `page.elements[]`, where each element carries a **unique `selector`**, its visible `text`/`aria_label`, and a `rect` `[x,y,w,h]`. Use these selectors directly — do not guess. If `ready` is false, scan again; do not click a partial page. Use `tabs_only:true` first when you are unsure which tab to target; pass `switch_tab_id:<id>` to pin one. 3. **`web_execute_js`** — act, then re-scan to confirm the effect. The extension waits for complete before running the script, and again if the script navigates.

Recipes (`web_execute_js` `script`)

| Goal | script | |---|---| | Click | `document.querySelector('<selector>').click()` | | Type into a field | `const e=docu

Read more
Ships withwisp-science

The open-source, local-first AI research workbench. WISP — Workspace for Intelligent Scientific Practice Search the literature, run Python and R, query ~80 scientific databases, and keep the trail — figures, runs, decisions, and drafts — in one project.

Get the whole plugin
Stats
1,042
Stars
106
Forks
Active
Maintenance
Rust
Language
AGPL-3.0
License
32m ago
Last commit
3mo ago
Created
5h ago
Added

Repo: xuzhougeng/wisp-science

Other skills on wisp-science.