From 1799f5a3deee8ed90eec58e19cc6f436aaac1fef Mon Sep 17 00:00:00 2001 From: Topher Hindman Date: Sun, 9 Aug 2026 11:22:53 -0700 Subject: [PATCH] Regenerate browse SKILL.md and llms.txt Generated by bun run gen:skill-docs --host all. --- browse/SKILL.md | 35 ++++++++++++++++++++++++++++++++--- gstack/llms.txt | 1 + 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/browse/SKILL.md b/browse/SKILL.md index a8138dbbc..ef59b95c1 100644 --- a/browse/SKILL.md +++ b/browse/SKILL.md @@ -656,7 +656,35 @@ $B diff https://staging.app.com https://prod.app.com ### 11. Show screenshots to the user After `$B screenshot`, `$B snapshot -a -o`, or `$B responsive`, always use the Read tool on the output PNG(s) so the user can see them. Without this, screenshots are invisible. -### 12. Render local HTML (no HTTP server needed) +### 12. Record a video of an interactive bug +A screenshot proves what a page looked like; it can't show what a page *did*. When +the bug is in the timing — a double-submit, a loading flicker, focus jumping, a +drag that drops in the wrong place — record the repro instead of describing it. + +```bash +$B record start # or: record start /tmp/repro --size 1280x720 +$B goto https://app.example.com/checkout +$B click @e4 +$B record stop # flushes and lists the .webm files +``` + +Recording is a browser-context setting, so `start` and `stop` each rebuild the +context. Cookies, storage, and open tabs survive that, but `@e` refs do not — +re-snapshot after `record stop` before you act on the page again. One `.webm` is +written per tab that rendered while recording ran, including tabs you closed +along the way; a tab opened and closed in the same instant never paints and +produces nothing. Keep clips short: a few seconds around the moment it breaks +beats a minute of navigation. Stick with screenshots for static bugs (a typo, a +clipped element, a wrong color) — they are cheaper to produce and easier to read. + +`record stop` is what hands you the file paths, so stop before you walk away: a +recording still running when the daemon idles out leaves its `.webm` in the +directory, but nothing prints the paths. Recording is headless-only (`handoff` +and `connect` hand the browser to the user, and their window is theirs to +capture), and it needs control scope — the video keeps whatever was on screen, +including anything typed into a login form. + +### 13. Render local HTML (no HTTP server needed) Two paths, pick the cleaner one: ```bash # HTML file on disk → goto file:// (absolute, or cwd-relative) @@ -671,7 +699,7 @@ $B load-html /tmp/tweet.html `goto file://...` is usually cleaner (URL is saved in state, relative asset URLs resolve against the file's dir, scale changes replay naturally). `load-html` uses `page.setContent()` — URL stays `about:blank`, but the content survives `viewport --scale` via in-memory replay. Both are scoped to files under cwd or `$TMPDIR`. -### 13. Retina screenshots (deviceScaleFactor) +### 14. Retina screenshots (deviceScaleFactor) ```bash $B viewport 480x600 --scale 2 # 2x deviceScaleFactor $B load-html /tmp/tweet.html # or: $B goto file://./tweet.html @@ -680,7 +708,7 @@ $B screenshot /tmp/out.png --selector .tweet-card ``` Scale must be 1-3 (gstack policy cap). Changing `--scale` recreates the browser context; refs from `snapshot` are invalidated (rerun `snapshot`), but `load-html` content is replayed automatically. Not supported in headed mode. -### 14. Offline render mode (rasterize your own HTML/JSON, zero network) +### 15. Offline render mode (rasterize your own HTML/JSON, zero network) This is the blessed path for "I just want to turn my own local HTML or JSON into a PNG/PDF/bytes on disk" — Excalidraw diagrams, tweet/quote cards, og-images, @@ -995,6 +1023,7 @@ $B prettyscreenshot --cleanup --scroll-to ".pricing" --width 1440 ~/Desktop/hero | `domain-skill save|list|show|edit|promote-to-global|rollback|rm ` | Per-site notes the agent writes for itself. Host is derived from the active tab. Lifecycle: `save` adds a quarantined note → after N=3 successful uses without the prompt-injection classifier flagging it, the note auto-promotes to "active" → `promote-to-global` lifts it to the global tier (machine-wide, all projects). The classifier flag is set automatically by the L4 prompt-injection scan; agents do not set it manually. Use `list` / `show` to inspect, `edit` to revise, `rollback` to demote, `rm` to tombstone. | | `frame ` | Switch to iframe context (or main to return) | | `inbox [--clear]` | List messages from sidebar scout inbox | +| `record start [dir] [--size WxH] | record stop | record status` | Record video of browser activity (interactive bug repros) | | `skill list|show|run|test|rm [--arg k=v]... [--timeout=Ns]` | Run a browser-skill: deterministic Playwright script that drives the daemon over loopback HTTP. 3-tier lookup (project > global > bundled). Spawned scripts get a per-spawn scoped token (read+write only) — never the daemon root token. | | `watch [stop]` | Passive observation — periodic snapshots while user browses | diff --git a/gstack/llms.txt b/gstack/llms.txt index efe522f90..ca503982d 100644 --- a/gstack/llms.txt +++ b/gstack/llms.txt @@ -117,6 +117,7 @@ Run with `browse [args]`. Full reference: `browse/SKILL.md`. - `domain-skill save|list|show|edit|promote-to-global|rollback|rm `: Per-site notes the agent writes for itself. - `frame `: Switch to iframe context (or main to return) - `inbox [--clear]`: List messages from sidebar scout inbox +- `record start [dir] [--size WxH] | record stop | record status`: Record video of browser activity (interactive bug repros) - `skill list|show|run|test|rm [--arg k=v]... [--timeout=Ns]`: Run a browser-skill: deterministic Playwright script that drives the daemon over loopback HTTP. - `watch [stop]`: Passive observation — periodic snapshots while user browses