{"id":21463,"plugin_id":"plugins_6aaeb2c568208191bd71d62167ba2ba3","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T23:16:57.245Z","digest":"4ddaed8ad5cfd6046690bc9a47005c002d00b4b9c4c8f3d3bce586b195d287f7","against":null,"payload":{"description":"Web browsing and page extraction. Attaches to Chrome over CDP when it is running, otherwise one-shot headless Chrome. Use for /browse, \"open URL\", public competitor pages, interactive search UIs, or a session where you are already logged in.","included_files":[{"relative_path":"run.mjs","size_in_bytes":1094}],"name":"browse","skill_md_contents":"---\nname: browse\ndescription: Web browsing and page extraction. Attaches to Chrome over CDP when it is running, otherwise one-shot headless Chrome. Use for /browse, \"open URL\", public competitor pages, interactive search UIs, or a session where you are already logged in.\nmenu-description: browser automation and web extraction\n---\n\n# Browse\n\nDrive a real browser. Prefer this over naive Playwright scripts. Extracted text is sanitized before it hits the model.\n\n## How to invoke\n\nFrom any harness:\n\n```bash\nnpx @scino/fstack browse <command>\n```\n\nFrom this skill folder (works when the skill is a junction into the fstack package):\n\n```bash\nnode run.mjs <command>\n```\n\nFrom a clone:\n\n```bash\nnode bin/fstack.js browse <command>\n```\n\n## Commands\n\n```bash\nfstack browse goto https://example.com\nfstack browse text\nfstack browse text https://example.com\nfstack browse screenshot\nfstack browse screenshot https://example.com out.png\nfstack browse eval \"document.title\"\nfstack browse eval https://example.com \"document.title\"\nfstack browse check-cdp\nfstack browse sanitize ./raw.txt\n```\n\n`goto` / `text` / `screenshot` / `eval` without a URL need Chrome CDP (your session). With a URL they can run headless in one shot.\n\n`text` waits for visible body text, then fails if the body is still empty. That is usually a search shell, a challenge page, or JS that never painted. Do not retry the same URL. Search or click, then `text` again.\n\n## Strategy 1: One-shot headless\n\nPublic pages where the URL already has the content. Pass the URL on the command.\n\n```bash\nfstack browse text https://example.com\n```\n\nUses installed Chrome when possible. Text is injection-sanitized.\n\n## Strategy 2: Real Chrome (interaction and login-walled sites)\n\nUse CDP when you need to type, click, or wait on a page, or when headless is blocked.\n\nEmpty extract is not a login problem by itself. Many public UIs start as a search shell. Attach CDP, complete the query or click in that window (or `goto` a URL that already encodes the query), wait until results exist, then `fstack browse text` with no URL.\n\nLogin-walled sites (LinkedIn, X, and similar) still need you to log in by hand in that Chrome. Only use sessions you own.\n\nStart Chrome once:\n\n**Windows** (throwaway profile; does not fight an already-open Chrome):\n\n```powershell\n& \"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe\" --remote-debugging-port=9222 --user-data-dir=\"$env:TEMP\\chrome-fstack-cdp\"\n```\n\nTo reuse your real cookies, quit Chrome first, then point `--user-data-dir` at `$env:LOCALAPPDATA\\Google\\Chrome\\User Data`.\n\n**macOS:**\n\n```bash\n/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --remote-debugging-port=9222\n```\n\nConfirm with `fstack browse check-cdp`.\n\n## Strategy 3: Harness native browser\n\nIf the host agent already has a working browser tool (Cursor, Antigravity), use it for ordinary pages. Use this skill when you need CDP attach, sanitization, or a harness that has no browser.\n\n## Needs\n\n`playwright-core` (ships with `@scino/fstack`). Headless one-shot wants Chrome installed, or `npx playwright install chromium`.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}