agentleFS
MathiasPaulenkoMathiasPaulenko/ai-toolkit/skills/wave-ecosystem-guide/SKILL.md

wave-ecosystem-guide

Skill2 starsChanged 3 months agoMITView on GitHub

Guide to the Wave browser automation ecosystem: cdpwave (CDP client), bidiwave (WebDriver BiDi client), wavexis (CLI), and wavexis-mcp (MCP server). Helps choose the right tool for each use case.

  • Installs packages

We split this skill into the rules it gives an agent

4 rules. About 0 are common, 3 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈3

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    No browser download (uses your existing Chrome/Edge)

    line 255
  2. Very specific:

    No Node.js required (100% Python)

    line 256
  3. Distinctive:

    No ChromeDriver needed for CDP (direct WebSocket)

    line 272
  4. Distinctive:

    No Selenium Server / Grid needed (wavexis serve mode)

    line 273

≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Wave Ecosystem Guide

Description

The Wave ecosystem is a collection of browser automation tools built in 100% Python. No Node.js, no Chromium download, no Selenium, no Playwright. This skill helps you choose the right Wave tool for each use case and understand how the pieces fit together.

When to Invoke

  • Choosing between cdpwave, bidiwave, wavexis, or wavexis-mcp for a browser automation task
  • Understanding the Wave ecosystem architecture and how the repos relate
  • Migrating from Playwright, Selenium, pyppeteer, or Puppeteer to the Wave ecosystem
  • Deciding between CDP (Chromium-specific) and BiDi (W3C cross-browser) backends
  • Setting up browser automation in a Python project for the first time
  • Answering "which Wave tool should I use for X?"

1. Architecture

wavexis-mcp (MCP server, 220 tools, 13 tiers)
└─ wraps → wavexis (CLI, 130+ commands, 480+ sub-commands)
               ├─ cdpwave (CDP backend, 60 domains, 689 methods)
               └─ bidiwave (BiDi backend, W3C cross-browser)

Each layer builds on the one below:

LayerRepoRolePyPI
Low-level CDPcdpwaveDirect WebSocket to Chrome/Edge DevTools Protocolpip install cdpwave
Low-level BiDibidiwaveW3C WebDriver BiDi protocol for Chrome, Firefox, Edgepip install bidiwave
High-level CLIwavexisUnified CLI wrapping cdpwave + bidiwavepip install wavexis[cdp]
MCP serverwavexis-mcp220 MCP tools for LLM browser automationpip install wavexis-mcp[cdp]

2. Tool Selection

Decision Tree

What do you need?
│
├── LLM / AI agent needs to control a browser
│   └──► wavexis-mcp
│        (MCP server, 220 tools, works with Claude, Cursor, Windsurf, VS Code)
│
├── Quick one-off task from the command line
│   ├── Screenshot / PDF / scrape a single page
│   ├── CI assertion (title contains X, exit code 0/1)
│   ├── Batch process multiple URLs
│   └──► wavexis CLI
│        (130+ commands, REPL, multi-action YAML, stealth, serve mode)
│
├── Programmatic browser control in Python
│   ├── Chrome / Edge only
│   │   └──► cdpwave
│   │        (60 CDP domains, 689 typed methods, no driver needed)
│   │
│   ├── Cross-browser (Chrome + Firefox + Edge)
│   │   └──► bidiwave
│   │        (W3C WebDriver BiDi, 12 modules, Pydantic v2 models)
│   │
│   └── Both backends with a unified API
│       └──► wavexis as a library
│            (AbstractBackend interface, switch with --backend bidi)
│
└── Not sure?
    └──► Start with wavexis CLI for quick tasks
         Move to cdpwave/bidiwave when you need programmatic control
         Move to wavexis-mcp when you need LLM integration

Quick Reference

Use CaseRecommended ToolWhy
LLM agent controls browserwavexis-mcp220 MCP tools, capability tiers, NL interaction
Screenshot from CLIwavexis screenshotOne command, no code
CI performance gatewavexis cwv --budgetCore Web Vitals with budgets, exit codes
Web scraping with stealthwavexis --stealth scrapeAnti-bot hiding, crawl, batch
Chrome-specific CDP accesscdpwaveFull 60-domain CDP coverage, escape hatch
Cross-browser testingbidiwaveW3C standard, Chrome + Firefox + Edge
Multi-tab async automationcdpwaveMulti-tab sessions, event handling, typed methods
Network interception (cross-browser)bidiwaveW3C network interception, mock responses
Debugging with breakpointscdpwaveDebugger, HeapProfiler, Profiler domains
Visual regression in CIwavexis visual-diffBaseline comparison, PR integration
Form filling via natural languagewavexis-mcp (wavexis_act)NL element matching, no selectors needed
HAR capture and replaywavexis har / wavexis har-replayNetwork recording and replay
Session recording and replaywavexis record / wavexis replayInteractive recording to YAML
Docker browser servicewavexis serveHTTP API + WebSocket streaming in container

3. Backend Comparison: CDP vs BiDi

Featurecdpwave (CDP)bidiwave (BiDi)
ProtocolChrome DevTools ProtocolW3C WebDriver BiDi
StandardChromium-specific (proprietary)W3C standard
BrowsersChrome, Edge, Brave, ChromiumChrome, Firefox, Edge
Driver neededNo (direct WebSocket)Yes (ChromeDriver / geckodriver)
Coverage60 domains, 689 methods12 modules, W3C spec
Type systemTyped dicts, mypy --strictPydantic v2 models, mypy clean
Event handlingsession.on(), wait_for_event()27 event types, async handlers
Escape hatchsession.send("Any.CDPMethod", params)CDP bridge (client.cdp)
Network interceptionFetch domainNative BiDi network module
Cross-browserNoYes
ReconnectionWebSocket keepaliveExponential backoff
Best forChrome-only, low-level CDP accessCross-browser, W3C compliance

When to use which

  • cdpwave — You only target Chrome/Edge and need maximum CDP coverage (debugging, profiling, heap snapshots, DOM debugger, WebAuthn, Bluetooth, Cast)
  • bidiwave — You need cross-browser support (Firefox), W3C standard compliance, or network interception with a clean API
  • Both — Use wavexis which abstracts both behind a unified AbstractBackend interface. Switch with --backend bidi

4. Installation

cdpwave (CDP backend)

pip install cdpwave

Requirements: Python 3.11+, a Chromium-based browser already installed.

bidiwave (BiDi backend)

pip install bidiwave

Requirements: Python 3.11+, a BiDi-capable browser endpoint (ChromeDriver, Firefox with --remote-debugging-port, or EdgeDriver).

wavexis (CLI)

# CDP backend (default, recommended)
pip install wavexis[cdp]

# BiDi backend
pip install wavexis[bidi]

# Serve mode + image extras
pip install wavexis[cdp,serve,image]

wavexis-mcp (MCP server)

pip install wavexis-mcp[cdp]

# Or run without installing
uvx wavexis-mcp --caps all

5. Quick Start Examples

cdpwave — Screenshot and evaluate

import asyncio
from cdpwave import CDPClient

async def main() -> None:
    async with await CDPClient.launch(headless=True) as client:
        session = await client.new_page("https://example.com")
        result = await session.runtime.evaluate("document.title", return_by_value=True)
        print(result["result"]["value"])  # "Example Domain"
        await session.close()

asyncio.run(main())

bidiwave — Cross-browser evaluate

import asyncio
from bidiwave import BiDiClient, StringValue

async def main():
    async with await BiDiClient.connect("ws://localhost:9515/session") as client:
        async with await client.browsing.open("https://example.com") as page:
            result = await page.evaluate("document.title")
            match result:
                case StringValue(value=title):
                    print(f"Title: {title}")

asyncio.run(main())

wavexis CLI — Screenshot and scrape

# Screenshot
wavexis screenshot https://example.com -o out.png

# Full-page screenshot
wavexis screenshot https://example.com -o full.png --full-page

# Scrape content
wavexis scrape https://example.com --selector "article"

# Evaluate JavaScript
wavexis eval https://example.com -e "document.title"

wavexis-mcp — MCP config

{
  "mcpServers": {
    "wavexis": {
      "command": "uvx",
      "args": ["wavexis-mcp", "--caps", "all"]
    }
  }
}

Then ask your LLM: "Take a full-page screenshot of https://example.com"


6. Migration Paths

From Playwright

PlaywrightWave equivalent
playwright.chromium.launch()CDPClient.launch() (cdpwave)
playwright.firefox.launch()BiDiClient.connect() (bidiwave)
page.goto()session.page.navigate() / page.navigate()
page.screenshot()session.page.capture_screenshot() / page.screenshot()
page.evaluate()session.runtime.evaluate() / page.evaluate()
page.click()client.input.click() (bidiwave) / JS via eval
Playwright MCPwavexis-mcp (220 tools vs ~21)

Key differences:

  • No browser download (uses your existing Chrome/Edge)
  • No Node.js required (100% Python)
  • CDP + BiDi dual backend (Playwright is CDP-only for Chromium)
  • 220 MCP tools vs ~21 in Playwright MCP

From Selenium

SeleniumWave equivalent
webdriver.Chrome()CDPClient.launch() (cdpwave)
webdriver.Firefox()BiDiClient.connect() (bidiwave)
driver.get()session.page.navigate() / page.navigate()
driver.find_element()DOM queries via session.dom / JS eval
driver.execute_script()session.runtime.evaluate() / page.evaluate()
Selenium Gridwavexis serve (HTTP API + WebSocket)

Key differences:

  • No ChromeDriver needed for CDP (direct WebSocket)
  • No Selenium Server / Grid needed (wavexis serve mode)
  • Async-first (Selenium is sync)
  • Full CDP domain access (Selenium hides most CDP)

From pyppeteer / pychrome

pyppeteer / pychromeWave equivalent
pyppeteer.launch()CDPClient.launch() (cdpwave)
pyppeteer.connect()CDPClient.connect() (cdpwave)
page.evaluate()session.runtime.evaluate() (cdpwave)
Untyped responsesTyped dicts, mypy --strict
Partial CDP coverageFull 60-domain, 689-method coverage

See references/migration-pyppeteer.md for detailed migration guide.


7. Feature Parity Matrix

Featurecdpwavebidiwavewavexis CLIwavexis-mcp
ScreenshotYesYesYesYes
PDF generationYesYesYesYes
JavaScript evalYesYesYesYes
Cookie managementYesYesYesYes
Network interceptionYesYesYesYes
Device emulationYesYesYesYes
Multi-tab sessionsYesYesYesYes
Event handlingYesYesYesYes
Stealth mode——YesYes
REPL——Yes—
Multi-action YAML——YesYes
Session recording——Yes—
CI assertions——Yes—
Serve mode (HTTP API)——Yes—
LLM tool calls———Yes
Natural language interaction———Yes
Capability tiers———Yes
MCP resources & prompts———Yes
Debugging (breakpoints)Yes—YesYes
Heap profilerYes—YesYes
CPU profilerYes—YesYes
Code coverageYes—YesYes
WebAuthnYes—YesYes
BluetoothYes—YesYes
CastYes—YesYes
Web extensions—YesYesYes
Preload scripts—YesYesYes
Cross-browser (Firefox)—YesYesYes
Lighthouse audits——YesYes
Core Web Vitals scoring——YesYes
Visual diff——YesYes
HAR captureYes—YesYes
HAR replay——Yes—
Accessibility auditYes—YesYes
Shadow DOM——YesYes
Crawl——YesYes
Batch processing——Yes—
Docker——YesYes

8. Ecosystem Links


9. Best Practices

  • Start simple — Use wavexis CLI for one-off tasks before writing Python scripts
  • Choose backend early — CDP for Chrome-only, BiDi for cross-browser. Switch in wavexis with --backend bidi
  • Use stealth for scraping — --stealth hides navigator.webdriver and fakes browser fingerprints
  • Leverage capability tiers — In wavexis-mcp, start with --caps core (72 tools) and add tiers as needed to save tokens
  • Use multi-action YAML — Chain actions in a single browser session to avoid launch overhead
  • Close sessions — Always close sessions in wavexis-mcp to avoid resource leaks
  • Use the escape hatch — session.send("Any.CDPMethod", params) in cdpwave for any uncovered CDP method
  • Preload scripts for monitoring — Inject JS before page load with bidiwave's client.preload.add_preload_script()
  • CI assertions — Use --assert with eval for CI gates that pass/fail based on page state
  • Action caching — Use --cache-ttl to avoid re-analyzing pages in repeated multi-action workflows

10. Common Pitfalls

PitfallCauseSolution
Using cdpwave for FirefoxCDP is Chromium-onlyUse bidiwave for Firefox
Installing Chromium separatelyNot neededWave uses your existing browser
Using wavexis-mcp without tiersAll 220 tools loadedUse --caps core to start, add tiers as needed
Not closing MCP sessionsResource leakAlways call wavexis_session_close
Using sync code with cdpwavecdpwave is async-onlyUse asyncio.run() and async/await
Missing ChromeDriver for BiDiBiDi needs a driverRun chromedriver --port=9515 or use Firefox (native BiDi)
Exposing wavexis-mcp remotelySecurity riskUse --allow-remote only behind a reverse proxy
Large MCP tier in CIToken wasteUse minimal --caps for the task at hand

11. References

  • references/ecosystem-comparison.md — Full feature comparison table with all 220 MCP tools
  • references/decision-tree.md — Detailed flowchart for tool and backend selection
  • references/migration-pyppeteer.md — Step-by-step migration from pyppeteer/pychrome to cdpwave
  • assets/ecosystem-cheatsheet.md — Quick reference card for printing
  • Related skills: wavexis-cli-automation, wavexis-mcp-agent-integration, cdpwave-testing, bidiwave-cross-browser

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.