--- name: browser-skill description: | Use when the user asks to perform browser automation tasks against their logged-in browser: visit and read pages, fill forms, scrape data, click through a flow, regression-test a PR's UI, validate a deployed page. Requires the bsk CLI installed and the browser-skill extension loaded. --- # browser-skill Drive the user's **real Chromium browser** (with their logins and cookies) through the `bsk` CLI. The extension opens an isolated **Agent Window** for automation; the user's normal windows stay protected unless you explicitly borrow a tab. ## When to use - Open pages, read titles/text, scrape structured data from sites the user can already access - Fill forms, click through multi-step flows, smoke-test a UI change - Understand pages with `bsk snapshot` first; use `bsk get-html` or `bsk screenshot` only when the snapshot is insufficient - Operate on a specific user tab they point you at (after `bsk tab borrow`) ## When NOT to use - Tasks with **no browser** involved (files, APIs, databases only) - Installing or configuring the extension (point the user to setup docs instead) - **Credential harvesting** — never run `bsk evaluate` on banking, SSO, or password-manager pages to extract tokens, cookies, or secrets - Long-lived control of a user's personal login window — borrow only for the immediate step, then `bsk tab return` or end the session - Replacing the user's manual browsing when they only wanted an explanation ## Prerequisites 1. `bsk` on `PATH` (Rust CLI from browser-skill) 2. browser-skill **extension** loaded in Chromium and connected (popup shows green) 3. Any `bsk` command auto-starts background services as needed; use `bsk doctor` if anything fails ## Mandatory workflow Every automation task **must** follow this lifecycle. Do **not** rely on idle timeouts (default session idle is 5 minutes). ``` 1. bsk session start → capture the 4-letter session id printed on stdout 2. … every tool command … → always pass --session 3. bsk session stop → REQUIRED when done (even on error paths) ``` Optional: `bsk session start --browser ` when multiple browsers are connected (`bsk browsers` / error output lists them). Emergency cleanup: `bsk session stop --all` or the Agent Window overlay **Stop all**. ## Core interaction loop Write operations only affect tabs in the **Agent Window** (or tabs you **borrowed** into it). ``` bsk navigate --session bsk snapshot --session → aria tree with @e1, @e2, … refs bsk click @e3 --session → or bsk fill, bsk select, bsk press bsk snapshot --session → again after navigation / DOM change ``` **Refs invalidate after navigation** — always re-snapshot before clicking, filling, or selecting on a new page. Prefer `@eN` refs from the latest snapshot over raw CSS selectors. Use `--ref` / `--selector` when ambiguous (`bsk click --help`). ## Observation priority Start with `bsk snapshot` to understand page structure, text, controls, and element refs. Only escalate when the latest snapshot cannot answer the question: 1. `bsk snapshot` — default for page understanding and interaction planning 2. `bsk get-html` — when hidden DOM, metadata, or markup details are required 3. `bsk screenshot` — when visual layout, canvas/image content, or styling cannot be inferred from the snapshot. Use `--ref @eN` (from the latest snapshot) to crop to one element; omit `--ref` for the full visible tab. Do **not** call `bsk get-html` or `bsk screenshot` first just to inspect a page. ## Sandbox rules | Rule | Detail | |------|--------| | Agent Window | `bsk tab create`, `bsk navigate`, `bsk click`, etc. work on agent tabs by default | | User tabs | Read-only until borrowed: `bsk tab list --session --scope user` then `bsk tab borrow --session ` | | Return borrowed tabs | Call `bsk tab return --session ` when finished; unreturned tabs are **auto-returned** on `bsk session stop` | | Writes off-agent | Commands that mutate the page fail if the tab is not in the Agent Window — borrow or create a tab first | ## Global flags | Flag | Purpose | |------|---------| | `--json` | Machine-readable JSON on stdout (errors too) | | `--quiet` | Suppress informational stderr | | `-v` / `-vv` | More verbose logging | Command-specific flags (timeouts, `--tab-id`, `--wait-until`, …): **`bsk --help`** ## CLI command reference (one line each) Details and flags: **`bsk --help`** ### Diagnostics | Command | Summary | |---------|---------| | `bsk status` | Connection health, connected browsers, active sessions | | `bsk doctor` | Deep diagnostics and repair hints | | `bsk browsers` | List connected browser instances (ids, labels, versions) | ### Session | Command | Summary | |---------|---------| | `bsk session start` | Open Agent Window; prints **4-letter session id** | | `bsk session stop ` | End session, close Agent Window, auto-return borrowed tabs | | `bsk session stop --all` | Stop every active session | | `bsk session list` | List active sessions | ### Tabs (require `--session `) | Command | Summary | |---------|---------| | `bsk tab list` | List tabs (`--scope user\|agent\|all`, default `all`) | | `bsk tab create` | New tab in Agent Window (`--url`, `--no-active`, `--index`) | | `bsk tab close ` | Close an agent tab | | `bsk tab select ` | Focus an agent tab | | `bsk tab borrow ` | Move a user tab into the Agent Window | | `bsk tab return ` | Return a borrowed tab to its original window | ### Observation (require `--session` unless noted) | Command | Summary | |---------|---------| | `bsk snapshot` | First-choice page understanding: accessibility tree with `@eN` element refs | | `bsk get-html` | Raw HTML dump after snapshot is insufficient (high token cost) | | `bsk screenshot` | PNG capture after snapshot is insufficient: full visible tab, or `--ref @eN` to crop to one element (`--out` path optional) | ### Navigation | Command | Summary | |---------|---------| | `bsk navigate ` | Go to URL in agent tab (`--wait-until`, `--timeout`) | | `bsk navigate-back` | History back one step | | `bsk navigate-forward` | History forward one step | | `bsk reload` | Reload current tab (`--hard` bypass cache) | (`bsk navigate back` / `bsk navigate forward` are equivalent subcommands.) ### Interaction | Command | Summary | |---------|---------| | `bsk click ` | Click element (`--button`, `--click-count`, `--modifiers`) | | `bsk fill --value ` | Clear and type into input | | `bsk select --value ` | Set `