[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FDGR9KBJG00AAM6PQT80FR":3,"skill-same:01M6FDGR9KBJG00AAM6PQT80FR":52},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":25,"linkOnly":26,"markdownContent":27,"markdownBody":27,"frontMatter":28,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":32,"repositoryHtmlUrl":33,"repositoryHomepageUrl":34,"ownerHtmlUrl":35,"ownerBlogUrl":6,"ownerDescription":36,"updatedAt":37,"install":38,"resources":51},"01M6FDGR9KBJG00AAM6PQT80FR","agent-browser",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fmxyhi\u002Fok-skills\u002Fagent-browser\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23,24],"agent browser","browser","2026-11-10 10:12:30",false,"# Browser Automation with agent-browser\n\nThe CLI uses Chrome\u002FChromium via CDP directly. Install via `npm i -g agent-browser`, `brew install agent-browser`, or `cargo install agent-browser`. Run `agent-browser install` to download Chrome.\n\n## Core Workflow\n\nEvery browser automation follows this pattern:\n\n1. **Navigate**: `agent-browser open \u003Curl>`\n2. **Snapshot**: `agent-browser snapshot -i` (get element refs like `@e1`, `@e2`)\n3. **Interact**: Use refs to click, fill, select\n4. **Re-snapshot**: After navigation or DOM changes, get fresh refs\n\n```bash\nagent-browser open https:\u002F\u002Fexample.com\u002Fform\nagent-browser snapshot -i\n# Output: @e1 [input type=\"email\"], @e2 [input type=\"password\"], @e3 [button] \"Submit\"\n\nagent-browser fill @e1 \"user@example.com\"\nagent-browser fill @e2 \"password123\"\nagent-browser click @e3\nagent-browser wait --load networkidle\nagent-browser snapshot -i  # Check result\n```\n\n## Command Chaining\n\nCommands can be chained with `&&` in a single shell invocation. The browser persists between commands via a background daemon, so chaining is safe and more efficient than separate calls.\n\n```bash\n# Chain open + wait + snapshot in one call\nagent-browser open https:\u002F\u002Fexample.com && agent-browser wait --load networkidle && agent-browser snapshot -i\n\n# Chain multiple interactions\nagent-browser fill @e1 \"user@example.com\" && agent-browser fill @e2 \"password123\" && agent-browser click @e3\n\n# Navigate and capture\nagent-browser open https:\u002F\u002Fexample.com && agent-browser wait --load networkidle && agent-browser screenshot page.png\n```\n\n**When to chain:** Use `&&` when you don't need to read the output of an intermediate command before proceeding (e.g., open + wait + screenshot). Run commands separately when you need to parse the output first (e.g., snapshot to discover refs, then interact using those refs).\n\n## Handling Authentication\n\nWhen automating a site that requires login, choose the approach that fits:\n\n**Option 1: Import auth from the user's browser (fastest for one-off tasks)**\n\n```bash\n# Connect to the user's running Chrome (they're already logged in)\nagent-browser --auto-connect state save .\u002Fauth.json\n# Use that auth state\nagent-browser --state .\u002Fauth.json open https:\u002F\u002Fapp.example.com\u002Fdashboard\n```\n\nState files contain session tokens in plaintext -- add to `.gitignore` and delete when no longer needed. Set `AGENT_BROWSER_ENCRYPTION_KEY` for encryption at rest.\n\n**Option 2: Persistent profile (simplest for recurring tasks)**\n\n```bash\n# First run: login manually or via automation\nagent-browser --profile ~\u002F.myapp open https:\u002F\u002Fapp.example.com\u002Flogin\n# ... fill credentials, submit ...\n\n# All future runs: already authenticated\nagent-browser --profile ~\u002F.myapp open https:\u002F\u002Fapp.example.com\u002Fdashboard\n```\n\n**Option 3: Session name (auto-save\u002Frestore cookies + localStorage)**\n\n```bash\nagent-browser --session-name myapp open https:\u002F\u002Fapp.example.com\u002Flogin\n# ... login flow ...\nagent-browser close  # State auto-saved\n\n# Next time: state auto-restored\nagent-browser --session-name myapp open https:\u002F\u002Fapp.example.com\u002Fdashboard\n```\n\n**Option 4: Auth vault (credentials stored encrypted, login by name)**\n\n```bash\necho \"$PASSWORD\" | agent-browser auth save myapp --url https:\u002F\u002Fapp.example.com\u002Flogin --username user --password-stdin\nagent-browser auth login myapp\n```\n\n**Option 5: State file (manual save\u002Fload)**\n\n```bash\n# After logging in:\nagent-browser state save .\u002Fauth.json\n# In a future session:\nagent-browser state load .\u002Fauth.json\nagent-browser open https:\u002F\u002Fapp.example.com\u002Fdashboard\n```\n\nSee [references\u002Fauthentication.md](references\u002Fauthentication.md) for OAuth, 2FA, cookie-based auth, and token refresh patterns.\n\n## Essential Commands\n\n```bash\n# Navigation\nagent-browser open \u003Curl>              # Navigate (aliases: goto, navigate)\nagent-browser close                   # Close browser\n\n# Snapshot\nagent-browser snapshot -i             # Interactive elements with refs (recommended)\nagent-browser snapshot -i -C          # Include cursor-interactive elements (divs with onclick, cursor:pointer)\nagent-browser snapshot -s \"#selector\" # Scope to CSS selector\n\n# Interaction (use @refs from snapshot)\nagent-browser click @e1               # Click element\nagent-browser click @e1 --new-tab     # Click and open in new tab\nagent-browser fill @e2 \"text\"         # Clear and type text\nagent-browser type @e2 \"text\"         # Type without clearing\nagent-browser select @e1 \"option\"     # Select dropdown option\nagent-browser check @e1               # Check checkbox\nagent-browser press Enter             # Press key\nagent-browser keyboard type \"text\"    # Type at current focus (no selector)\nagent-browser keyboard inserttext \"text\"  # Insert without key events\nagent-browser scroll down 500         # Scroll page\nagent-browser scroll down 500 --selector \"div.content\"  # Scroll within a specific container\n\n# Get information\nagent-browser get text @e1            # Get element text\nagent-browser get url                 # Get current URL\nagent-browser get title               # Get page title\nagent-browser get cdp-url             # Get CDP WebSocket URL\n\n# Wait\nagent-browser wait @e1                # Wait for element\nagent-browser wait --load networkidle # Wait for network idle\nagent-browser wait --url \"**\u002Fpage\"    # Wait for URL pattern\nagent-browser wait 2000               # Wait milliseconds\nagent-browser wait --text \"Welcome\"    # Wait for text to appear (substring match)\nagent-browser wait --fn \"!document.body.innerText.includes('Loading...')\"  # Wait for text to disappear\nagent-browser wait \"#spinner\" --state hidden  # Wait for element to disappear\n\n# Downloads\nagent-browser download @e1 .\u002Ffile.pdf          # Click element to trigger download\nagent-browser wait --download .\u002Foutput.zip     # Wait for any download to complete\nagent-browser --download-path .\u002Fdownloads open \u003Curl>  # Set default download directory\n\n# Viewport & Device Emulation\nagent-browser set viewport 1920 1080          # Set viewport size (default: 1280x720)\nagent-browser set viewport 1920 1080 2        # 2x retina (same CSS size, higher res screenshots)\nagent-browser set device \"iPhone 14\"          # Emulate device (viewport + user agent)\n\n# Capture\nagent-browser screenshot              # Screenshot to temp dir\nagent-browser screenshot --full       # Full page screenshot\nagent-browser screenshot --annotate   # Annotated screenshot with numbered element labels\nagent-browser screenshot --screenshot-dir .\u002Fshots  # Save to custom directory\nagent-browser screenshot --screenshot-format jpeg --screenshot-quality 80\nagent-browser pdf output.pdf          # Save as PDF\n\n# Clipboard\nagent-browser clipboard read                      # Read text from clipboard\nagent-browser clipboard write \"Hello, World!\"     # Write text to clipboard\nagent-browser clipboard copy                      # Copy current selection\nagent-browser clipboard paste                     # Paste from clipboard\n\n# Diff (compare page states)\nagent-browser diff snapshot                          # Compare current vs last snapshot\nagent-browser diff snapshot --baseline before.txt    # Compare current vs saved file\nagent-browser diff screenshot --baseline before.png  # Visual pixel diff\nagent-browser diff url \u003Curl1> \u003Curl2>                 # Compare two pages\nagent-browser diff url \u003Curl1> \u003Curl2> --wait-until networkidle  # Custom wait strategy\nagent-browser diff url \u003Curl1> \u003Curl2> --selector \"#main\"  # Scope to element\n```\n\n## Common Patterns\n\n### Form Submission\n\n```bash\nagent-browser open https:\u002F\u002Fexample.com\u002Fsignup\nagent-browser snapshot -i\nagent-browser fill @e1 \"Jane Doe\"\nagent-browser fill @e2 \"jane@example.com\"\nagent-browser select @e3 \"California\"\nagent-browser check @e4\nagent-browser click @e5\nagent-browser wait --load networkidle\n```\n\n### Authentication with Auth Vault (Recommended)\n\n```bash\n# Save credentials once (encrypted with AGENT_BROWSER_ENCRYPTION_KEY)\n# Recommended: pipe password via stdin to avoid shell history exposure\necho \"pass\" | agent-browser auth save github --url https:\u002F\u002Fgithub.com\u002Flogin --username user --password-stdin\n\n# Login using saved profile (LLM never sees password)\nagent-browser auth login github\n\n# List\u002Fshow\u002Fdelete profiles\nagent-browser auth list\nagent-browser auth show github\nagent-browser auth delete github\n```\n\n### Authentication with State Persistence\n\n```bash\n# Login once and save state\nagent-browser open https:\u002F\u002Fapp.example.com\u002Flogin\nagent-browser snapshot -i\nagent-browser fill @e1 \"$USERNAME\"\nagent-browser fill @e2 \"$PASSWORD\"\nagent-browser click @e3\nagent-browser wait --url \"**\u002Fdashboard\"\nagent-browser state save auth.json\n\n# Reuse in future sessions\nagent-browser state load auth.json\nagent-browser open https:\u002F\u002Fapp.example.com\u002Fdashboard\n```\n\n### Session Persistence\n\n```bash\n# Auto-save\u002Frestore cookies and localStorage across browser restarts\nagent-browser --session-name myapp open https:\u002F\u002Fapp.example.com\u002Flogin\n# ... login flow ...\nagent-browser close  # State auto-saved to ~\u002F.agent-browser\u002Fsessions\u002F\n\n# Next time, state is auto-loaded\nagent-browser --session-name myapp open https:\u002F\u002Fapp.example.com\u002Fdashboard\n\n# Encrypt state at rest\nexport AGENT_BROWSER_ENCRYPTION_KEY=$(openssl rand -hex 32)\nagent-browser --session-name secure open https:\u002F\u002Fapp.example.com\n\n# Manage saved states\nagent-browser state list\nagent-browser state show myapp-default.json\nagent-browser state clear myapp\nagent-browser state clean --older-than 7\n```\n\n### Data Extraction\n\n```bash\nagent-browser open https:\u002F\u002Fexample.com\u002Fproducts\nagent-browser snapshot -i\nagent-browser get text @e5           # Get specific element text\nagent-browser get text body > page.txt  # Get all page text\n\n# JSON output for parsing\nagent-browser snapshot -i --json\nagent-browser get text @e1 --json\n```\n\n### Parallel Sessions\n\n```bash\nagent-browser --session site1 open https:\u002F\u002Fsite-a.com\nagent-browser --session site2 open https:\u002F\u002Fsite-b.com\n\nagent-browser --session site1 snapshot -i\nagent-browser --session site2 snapshot -i\n\nagent-browser session list\n```\n\n### Connect to Existing Chrome\n\n```bash\n# Auto-discover running Chrome with remote debugging enabled\nagent-browser --auto-connect open https:\u002F\u002Fexample.com\nagent-browser --auto-connect snapshot\n\n# Or with explicit CDP port\nagent-browser --cdp 9222 snapshot\n```\n\n### Color Scheme (Dark Mode)\n\n```bash\n# Persistent dark mode via flag (applies to all pages and new tabs)\nagent-browser --color-scheme dark open https:\u002F\u002Fexample.com\n\n# Or via environment variable\nAGENT_BROWSER_COLOR_SCHEME=dark agent-browser open https:\u002F\u002Fexample.com\n\n# Or set during session (persists for subsequent commands)\nagent-browser set media dark\n```\n\n### Viewport & Responsive Testing\n\n```bash\n# Set a custom viewport size (default is 1280x720)\nagent-browser set viewport 1920 1080\nagent-browser screenshot desktop.png\n\n# Test mobile-width layout\nagent-browser set viewport 375 812\nagent-browser screenshot mobile.png\n\n# Retina\u002FHiDPI: same CSS layout at 2x pixel density\n# Screenshots stay at logical viewport size, but content renders at higher DPI\nagent-browser set viewport 1920 1080 2\nagent-browser screenshot retina.png\n\n# Device emulation (sets viewport + user agent in one step)\nagent-browser set device \"iPhone 14\"\nagent-browser screenshot device.png\n```\n\nThe `scale` parameter (3rd argument) sets `window.devicePixelRatio` without changing CSS layout. Use it when testing retina rendering or capturing higher-resolution screenshots.\n\n### Visual Browser (Debugging)\n\n```bash\nagent-browser --headed open https:\u002F\u002Fexample.com\nagent-browser highlight @e1          # Highlight element\nagent-browser inspect                # Open Chrome DevTools for the active page\nagent-browser record start demo.webm # Record session\nagent-browser profiler start         # Start Chrome DevTools profiling\nagent-browser profiler stop trace.json # Stop and save profile (path optional)\n```\n\nUse `AGENT_BROWSER_HEADED=1` to enable headed mode via environment variable. Browser extensions work in both headed and headless mode.\n\n### Local Files (PDFs, HTML)\n\n```bash\n# Open local files with file:\u002F\u002F URLs\nagent-browser --allow-file-access open file:\u002F\u002F\u002Fpath\u002Fto\u002Fdocument.pdf\nagent-browser --allow-file-access open file:\u002F\u002F\u002Fpath\u002Fto\u002Fpage.html\nagent-browser screenshot output.png\n```\n\n### iOS Simulator (Mobile Safari)\n\n```bash\n# List available iOS simulators\nagent-browser device list\n\n# Launch Safari on a specific device\nagent-browser -p ios --device \"iPhone 16 Pro\" open https:\u002F\u002Fexample.com\n\n# Same workflow as desktop - snapshot, interact, re-snapshot\nagent-browser -p ios snapshot -i\nagent-browser -p ios tap @e1          # Tap (alias for click)\nagent-browser -p ios fill @e2 \"text\"\nagent-browser -p ios swipe up         # Mobile-specific gesture\n\n# Take screenshot\nagent-browser -p ios screenshot mobile.png\n\n# Close session (shuts down simulator)\nagent-browser -p ios close\n```\n\n**Requirements:** macOS with Xcode, Appium (`npm install -g appium && appium driver install xcuitest`)\n\n**Real devices:** Works with physical iOS devices if pre-configured. Use `--device \"\u003CUDID>\"` where UDID is from `xcrun xctrace list devices`.\n\n## Security\n\nAll security features are opt-in. By default, agent-browser imposes no restrictions on navigation, actions, or output.\n\n### Content Boundaries (Recommended for AI Agents)\n\nEnable `--content-boundaries` to wrap page-sourced output in markers that help LLMs distinguish tool output from untrusted page content:\n\n```bash\nexport AGENT_BROWSER_CONTENT_BOUNDARIES=1\nagent-browser snapshot\n# Output:\n# --- AGENT_BROWSER_PAGE_CONTENT nonce=\u003Chex> origin=https:\u002F\u002Fexample.com ---\n# [accessibility tree]\n# --- END_AGENT_BROWSER_PAGE_CONTENT nonce=\u003Chex> ---\n```\n\n### Domain Allowlist\n\nRestrict navigation to trusted domains. Wildcards like `*.example.com` also match the bare domain `example.com`. Sub-resource requests, WebSocket, and EventSource connections to non-allowed domains are also blocked. Include CDN domains your target pages depend on:\n\n```bash\nexport AGENT_BROWSER_ALLOWED_DOMAINS=\"example.com,*.example.com\"\nagent-browser open https:\u002F\u002Fexample.com        # OK\nagent-browser open https:\u002F\u002Fmalicious.com       # Blocked\n```\n\n### Action Policy\n\nUse a policy file to gate destructive actions:\n\n```bash\nexport AGENT_BROWSER_ACTION_POLICY=.\u002Fpolicy.json\n```\n\nExample `policy.json`:\n\n```json\n{ \"default\": \"deny\", \"allow\": [\"navigate\", \"snapshot\", \"click\", \"scroll\", \"wait\", \"get\"] }\n```\n\nAuth vault operations (`auth login`, etc.) bypass action policy but domain allowlist still applies.\n\n### Output Limits\n\nPrevent context flooding from large pages:\n\n```bash\nexport AGENT_BROWSER_MAX_OUTPUT=50000\n```\n\n## Diffing (Verifying Changes)\n\nUse `diff snapshot` after performing an action to verify it had the intended effect. This compares the current accessibility tree against the last snapshot taken in the session.\n\n```bash\n# Typical workflow: snapshot -> action -> diff\nagent-browser snapshot -i          # Take baseline snapshot\nagent-browser click @e2            # Perform action\nagent-browser diff snapshot        # See what changed (auto-compares to last snapshot)\n```\n\nFor visual regression testing or monitoring:\n\n```bash\n# Save a baseline screenshot, then compare later\nagent-browser screenshot baseline.png\n# ... time passes or changes are made ...\nagent-browser diff screenshot --baseline baseline.png\n\n# Compare staging vs production\nagent-browser diff url https:\u002F\u002Fstaging.example.com https:\u002F\u002Fprod.example.com --screenshot\n```\n\n`diff snapshot` output uses `+` for additions and `-` for removals, similar to git diff. `diff screenshot` produces a diff image with changed pixels highlighted in red, plus a mismatch percentage.\n\n## Timeouts and Slow Pages\n\nThe default timeout is 25 seconds. This can be overridden with the `AGENT_BROWSER_DEFAULT_TIMEOUT` environment variable (value in milliseconds). For slow websites or large pages, use explicit waits instead of relying on the default timeout:\n\n```bash\n# Wait for network activity to settle (best for slow pages)\nagent-browser wait --load networkidle\n\n# Wait for a specific element to appear\nagent-browser wait \"#content\"\nagent-browser wait @e1\n\n# Wait for a specific URL pattern (useful after redirects)\nagent-browser wait --url \"**\u002Fdashboard\"\n\n# Wait for a JavaScript condition\nagent-browser wait --fn \"document.readyState === 'complete'\"\n\n# Wait a fixed duration (milliseconds) as a last resort\nagent-browser wait 5000\n```\n\nWhen dealing with consistently slow websites, use `wait --load networkidle` after `open` to ensure the page is fully loaded before taking a snapshot. If a specific element is slow to render, wait for it directly with `wait \u003Cselector>` or `wait @ref`.\n\n## Session Management and Cleanup\n\nWhen running multiple agents or automations concurrently, always use named sessions to avoid conflicts:\n\n```bash\n# Each agent gets its own isolated session\nagent-browser --session agent1 open site-a.com\nagent-browser --session agent2 open site-b.com\n\n# Check active sessions\nagent-browser session list\n```\n\nAlways close your browser session when done to avoid leaked processes:\n\n```bash\nagent-browser close                    # Close default session\nagent-browser --session agent1 close   # Close specific session\n```\n\nIf a previous session was not closed properly, the daemon may still be running. Use `agent-browser close` to clean it up before starting new work.\n\nTo auto-shutdown the daemon after a period of inactivity (useful for ephemeral\u002FCI environments):\n\n```bash\nAGENT_BROWSER_IDLE_TIMEOUT_MS=60000 agent-browser open example.com\n```\n\n## Ref Lifecycle (Important)\n\nRefs (`@e1`, `@e2`, etc.) are invalidated when the page changes. Always re-snapshot after:\n\n- Clicking links or buttons that navigate\n- Form submissions\n- Dynamic content loading (dropdowns, modals)\n\n```bash\nagent-browser click @e5              # Navigates to new page\nagent-browser snapshot -i            # MUST re-snapshot\nagent-browser click @e1              # Use new refs\n```\n\n## Annotated Screenshots (Vision Mode)\n\nUse `--annotate` to take a screenshot with numbered labels overlaid on interactive elements. Each label `[N]` maps to ref `@eN`. This also caches refs, so you can interact with elements immediately without a separate snapshot.\n\n```bash\nagent-browser screenshot --annotate\n# Output includes the image path and a legend:\n#   [1] @e1 button \"Submit\"\n#   [2] @e2 link \"Home\"\n#   [3] @e3 textbox \"Email\"\nagent-browser click @e2              # Click using ref from annotated screenshot\n```\n\nUse annotated screenshots when:\n\n- The page has unlabeled icon buttons or visual-only elements\n- You need to verify visual layout or styling\n- Canvas or chart elements are present (invisible to text snapshots)\n- You need spatial reasoning about element positions\n\n## Semantic Locators (Alternative to Refs)\n\nWhen refs are unavailable or unreliable, use semantic locators:\n\n```bash\nagent-browser find text \"Sign In\" click\nagent-browser find label \"Email\" fill \"user@test.com\"\nagent-browser find role button click --name \"Submit\"\nagent-browser find placeholder \"Search\" type \"query\"\nagent-browser find testid \"submit-btn\" click\n```\n\n## JavaScript Evaluation (eval)\n\nUse `eval` to run JavaScript in the browser context. **Shell quoting can corrupt complex expressions** -- use `--stdin` or `-b` to avoid issues.\n\n```bash\n# Simple expressions work with regular quoting\nagent-browser eval 'document.title'\nagent-browser eval 'document.querySelectorAll(\"img\").length'\n\n# Complex JS: use --stdin with heredoc (RECOMMENDED)\nagent-browser eval --stdin \u003C\u003C'EVALEOF'\nJSON.stringify(\n  Array.from(document.querySelectorAll(\"img\"))\n    .filter(i => !i.alt)\n    .map(i => ({ src: i.src.split(\"\u002F\").pop(), width: i.width }))\n)\nEVALEOF\n\n# Alternative: base64 encoding (avoids all shell escaping issues)\nagent-browser eval -b \"$(echo -n 'Array.from(document.querySelectorAll(\"a\")).map(a => a.href)' | base64)\"\n```\n\n**Why this matters:** When the shell processes your command, inner double quotes, `!` characters (history expansion), backticks, and `$()` can all corrupt the JavaScript before it reaches agent-browser. The `--stdin` and `-b` flags bypass shell interpretation entirely.\n\n**Rules of thumb:**\n\n- Single-line, no nested quotes -> regular `eval 'expression'` with single quotes is fine\n- Nested quotes, arrow functions, template literals, or multiline -> use `eval --stdin \u003C\u003C'EVALEOF'`\n- Programmatic\u002Fgenerated scripts -> use `eval -b` with base64\n\n## Configuration File\n\nCreate `agent-browser.json` in the project root for persistent settings:\n\n```json\n{\n  \"headed\": true,\n  \"proxy\": \"http:\u002F\u002Flocalhost:8080\",\n  \"profile\": \".\u002Fbrowser-data\"\n}\n```\n\nPriority (lowest to highest): `~\u002F.agent-browser\u002Fconfig.json` \u003C `.\u002Fagent-browser.json` \u003C env vars \u003C CLI flags. Use `--config \u003Cpath>` or `AGENT_BROWSER_CONFIG` env var for a custom config file (exits with error if missing\u002Finvalid). All CLI options map to camelCase keys (e.g., `--executable-path` -> `\"executablePath\"`). Boolean flags accept `true`\u002F`false` values (e.g., `--headed false` overrides config). Extensions from user and project configs are merged, not replaced.\n\n## Deep-Dive Documentation\n\n| Reference                                                            | When to Use                                               |\n| -------------------------------------------------------------------- | --------------------------------------------------------- |\n| [references\u002Fcommands.md](references\u002Fcommands.md)                     | Full command reference with all options                   |\n| [references\u002Fsnapshot-refs.md](references\u002Fsnapshot-refs.md)           | Ref lifecycle, invalidation rules, troubleshooting        |\n| [references\u002Fsession-management.md](references\u002Fsession-management.md) | Parallel sessions, state persistence, concurrent scraping |\n| [references\u002Fauthentication.md](references\u002Fauthentication.md)         | Login flows, OAuth, 2FA handling, state reuse             |\n| [references\u002Fvideo-recording.md](references\u002Fvideo-recording.md)       | Recording workflows for debugging and documentation       |\n| [references\u002Fprofiling.md](references\u002Fprofiling.md)                   | Chrome DevTools profiling for performance analysis        |\n| [references\u002Fproxy-support.md](references\u002Fproxy-support.md)           | Proxy configuration, geo-testing, rotating proxies        |\n\n## Browser Engine Selection\n\nUse `--engine` to choose a local browser engine. The default is `chrome`.\n\n```bash\n# Use Lightpanda (fast headless browser, requires separate install)\nagent-browser --engine lightpanda open example.com\n\n# Via environment variable\nexport AGENT_BROWSER_ENGINE=lightpanda\nagent-browser open example.com\n\n# With custom binary path\nagent-browser --engine lightpanda --executable-path \u002Fpath\u002Fto\u002Flightpanda open example.com\n```\n\nSupported engines:\n- `chrome` (default) -- Chrome\u002FChromium via CDP\n- `lightpanda` -- Lightpanda headless browser via CDP (10x faster, 10x less memory than Chrome)\n\nLightpanda does not support `--extension`, `--profile`, `--state`, or `--allow-file-access`. Install Lightpanda from https:\u002F\u002Flightpanda.io\u002Fdocs\u002Fopen-source\u002Finstallation.\n\n## Ready-to-Use Templates\n\n| Template                                                                 | Description                         |\n| ------------------------------------------------------------------------ | ----------------------------------- |\n| [templates\u002Fform-automation.sh](templates\u002Fform-automation.sh)             | Form filling with validation        |\n| [templates\u002Fauthenticated-session.sh](templates\u002Fauthenticated-session.sh) | Login once, reuse state             |\n| [templates\u002Fcapture-workflow.sh](templates\u002Fcapture-workflow.sh)           | Content extraction with screenshots |\n\n```bash\n.\u002Ftemplates\u002Fform-automation.sh https:\u002F\u002Fexample.com\u002Fform\n.\u002Ftemplates\u002Fauthenticated-session.sh https:\u002F\u002Fapp.example.com\u002Flogin\n.\u002Ftemplates\u002Fcapture-workflow.sh https:\u002F\u002Fexample.com .\u002Foutput\n```\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fmxyhi\u002Fok-skills\u002Fagent-browser",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":39,"prompt":49,"zipAvailable":50},[40,43,46],{"tool":41,"command":42},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill agent-browser",{"tool":44,"command":45},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill agent-browser",{"tool":47,"command":48},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill agent-browser","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fmxyhi\u002Fok-skills\u002Fagent-browser\u002FSKILL.md",true,[],[53,63,73,82,88,95],{"skillNo":54,"name":55,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":59,"publishedAt":25},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[58],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[60,61,62],"model","model hierarchy","model hierarchy skill",{"skillNo":64,"name":65,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":69,"publishedAt":25},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[68],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[70,71,72],"MCP","zoom","zoom mcp",{"skillNo":74,"name":75,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":25},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[79,80,81,71],"sdk","zoom apps sdk","apps",{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":25},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[84],{"skillNo":89,"name":90,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":94,"publishedAt":25},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[93],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[90],{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":25},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[97]]