Files
jackwener__opencli/docs/comparison.md
jakevin 70b1145b5e refactor: migrate all CLI adapters from YAML to TypeScript (#887)
* refactor: remove version field from GenerateOutcome and EarlyHint

All consumers are in the same repo and evolve together — version field
adds ceremony without practical value at this stage.

Keeps schema_version in VerifiedArtifactMetadata (sidecar file format).

* refactor: migrate all 123 CLI adapters from YAML to TypeScript

Remove YAML as an adapter format entirely. All adapters now use
TypeScript with cli() from @jackwener/opencli/registry.

- Convert 123 YAML adapter files to TypeScript via batch script
- Remove YAML scanning from discovery.ts (registerYamlCli, yaml import)
- Remove scanYaml() and shouldReplaceManifestEntry() from build-manifest.ts
- Change synthesize.ts to output JSON candidates (internal format)
- Change generate-verified.ts to write .ts adapter files instead of .yaml
- Delete yaml-schema.ts (dead code) and scripts/yaml-to-ts.mjs (one-time tool)
- Update all tests to match new format

Closes discussion in #OpenCLI thread 47ddba82.

* fix: close YAML migration gaps in plugin scaffold, validation, and scan

- plugin-scaffold.ts: generate hello.ts (TS pipeline) instead of hello.yaml
- plugin.ts validatePluginStructure: no longer accept .yaml as valid command file
- plugin.ts scanPluginCommands: remove .yaml/.yml from scanned extensions
- discovery.ts: add explicit log.warn() when YAML files detected in clis/ or plugins/
- plugin.test.ts: update all test fixtures from .yaml to .js
- plugin-scaffold.test.ts: update hello.yaml references to hello.ts
- Delete dead src/yaml-schema.ts

Resolves PR #887 review blockers from @mbp-codex-pr0.

* refactor: complete YAML removal across docs, skills, record, and binance adapters

Code changes:
- record.ts: candidate output changed from .yaml (yaml.dump) to .json (JSON.stringify), removed js-yaml import
- src/clis/binance: convert all 11 YAML adapters to TypeScript cli() format
- binance/commands.test.ts: rewrite to use registry instead of yaml.load
- skill-generate.test.ts, diagnostic.test.ts: update mock paths from .yaml to .ts
- build-manifest.ts, synthesize.ts: update stale YAML comments

Documentation:
- README.md: remove .yaml from Dynamic Loader, fix plugin types, fix synthesize comment
- README.zh-CN.md: fix synthesize comment
- CONTRIBUTING.md: replace YAML Adapter section with Pipeline Adapter (TS), update arg examples
- docs/developer/yaml-adapter.md: replaced with deprecation redirect
- docs/developer/architecture.md: remove YAML pipeline references
- docs/developer/contributing.md: remove YAML adapter section
- docs/developer/ai-workflow.md: YAML → TS in synthesize description
- docs/guide/getting-started.md: remove .yaml from loader, update engine description
- docs/guide/plugins.md: remove YAML plugin option, update plugin types
- docs/index.md, docs/comparison.md: remove YAML adapter references
- docs/zh/guide/plugins.md: remove .yaml from scan description

Skills:
- opencli-explorer/SKILL.md: rewrite YAML vs TS decision tree to TS-only
- opencli-oneshot/SKILL.md: replace YAML templates with TS cli() templates
- opencli-generate/SKILL.md: YAML artifact path → TS artifact path
- opencli-usage/SKILL.md, plugins.md: update adapter format references

* fix: clean up remaining YAML adapter references in docs

- docs/zh/guide/plugins.md: replace YAML plugin example with TS pipeline
- docs/developer/testing.md: YAML Adapter heading → Adapter, remove validate line
- TESTING.md: same fix in root testing doc
- CONTRIBUTING.md: remove "YAML validation" comment
- docs/.vitepress/config.mts: mark YAML Adapter Guide as (Deprecated) in nav
- docs/advanced/download.md: remove "YAML Adapters" from pipeline step heading
2026-04-08 23:01:08 +08:00

6.5 KiB

Comparison Guide

OpenCLI occupies a specific niche in the browser automation ecosystem. This guide honestly evaluates where opencli excels, where it's a viable option, and where other tools are a better fit.

At a Glance

Tool Approach Best for
opencli Pre-built TypeScript adapters Deterministic site commands, broad platform coverage, desktop apps
Browser-Use LLM-driven browser control General-purpose AI browser automation
Crawl4AI Async web crawler Large-scale data crawling
Firecrawl Scraping API / self-hosted Clean markdown extraction, managed or self-hosted infrastructure
agent-browser Browser primitive CLI Token-efficient AI agent browsing
Stagehand AI browser framework Developer-friendly browser automation
Skyvern Visual AI automation Cross-site generalized workflows

Scenario Comparison

1. Scheduled Batch Data Extraction

"I want to pull trending posts from Bilibili/Reddit/HackerNews every hour into my pipeline."

Tool Fit Notes
opencli Best One command, structured JSON output, zero runtime cost. Runs in cron/CI without tokens or API keys.
Crawl4AI Good Strong for large-scale crawling, but requires writing extraction logic per site.
Firecrawl Viable Managed service with clean output, but costs scale with volume.
Browser-Use / Stagehand Poor LLM inference on every run is slow, expensive, and non-deterministic for repeated tasks.

Why opencli wins here: A command like opencli bilibili hot -f json returns the same structured schema every time, costs nothing to run, and finishes in seconds. For recurring data extraction from known sites, pre-built adapters beat LLM-driven approaches on cost, speed, and reliability.

2. AI Agent Site Operations

"My AI agent needs to search Twitter, read Reddit threads, or post to Xiaohongshu."

Tool Fit Notes
opencli Best Structured JSON output, fast deterministic execution, hundreds of commands ready to use.
agent-browser Good Token-efficient browser primitives, but requires LLM reasoning for every step.
Browser-Use Viable General-purpose, but each operation costs tokens and takes 10-60s.
Stagehand Viable Good DX, but same LLM-per-action cost model.

Why opencli wins here: When your agent needs twitter search "AI news" -f json, a deterministic command that returns in seconds is strictly better than an LLM clicking through a webpage. The agent saves tokens for reasoning, not navigation.

3. Authenticated Operations (Login-Required Sites)

"I need to access my bookmarks, post content, or interact with sites that require login."

Tool Fit Notes
opencli Best Reuses your Chrome login session via Browser Bridge. No credentials stored or transmitted.
Browser-Use Viable Can use browser profiles, but credential management is manual.
Firecrawl Poor Cloud service cannot access your authenticated sessions.
Crawl4AI Poor Requires manual cookie/session injection.

Why opencli wins here: The Browser Bridge extension reuses your existing Chrome login state in real-time. You log in once in Chrome, and opencli commands work immediately. No OAuth setup, no API keys, no credential files.

4. General Web Browsing & Exploration

"I need to explore an unknown website, fill forms, or navigate complex multi-step flows."

Tool Fit Notes
Browser-Use Best LLM-driven, handles arbitrary websites and flows.
Stagehand Best Clean API for act(), extract(), observe() on any page.
agent-browser Good Token-efficient primitives for AI agents.
Skyvern Good Visual AI that generalizes across sites.
opencli Poor Only works with sites that have pre-built adapters. Cannot handle arbitrary websites.

opencli is not the right tool here. If you need to explore unknown websites or handle one-off tasks on sites without adapters, use an LLM-driven browser tool. opencli trades generality for determinism and cost.

5. Desktop App Control

"I want to script Cursor, ChatGPT, Notion, or other Electron apps from the terminal."

Tool Fit Notes
opencli Best 8 desktop adapters via CDP + AppleScript. The only CLI tool with this capability.
All others N/A Browser automation tools cannot control desktop applications.

This is unique to opencli. No other tool in this comparison can send a prompt to ChatGPT desktop, extract code from Cursor, or write to Notion pages via CLI.

Key Trade-offs

opencli's Strengths

  • Zero LLM cost — No tokens consumed at runtime. Run 10,000 times for free.
  • Deterministic output — Same command always returns the same schema. Pipeable, scriptable, CI-friendly.
  • Speed — Adapter commands return in seconds, not minutes.
  • Broad platform coverage — 73+ sites spanning global platforms (Reddit, HackerNews, Twitter, YouTube) and Chinese platforms (Bilibili, Zhihu, Xiaohongshu, Douban, Weibo) with adapters that understand local anti-bot patterns.
  • Desktop app control — CDP adapters for Cursor, Codex, Notion, ChatGPT, Discord, and more.
  • Easy to extend — Drop a .ts adapter into the clis/ folder for auto-registration. Contributing a new site adapter is straightforward.

opencli's Limitations

  • Coverage requires adapters — opencli only works with sites that have pre-built adapters. Adding a new site means writing a TypeScript adapter.
  • Adapter maintenance — When a website updates its DOM or API, the corresponding adapter may need updating. The community maintains these, but breakage is possible.
  • Not general-purpose — Cannot handle arbitrary websites. For unknown sites, pair opencli with a general browser tool as a fallback.

Complementary Usage

opencli works best alongside general-purpose browser tools, not as a replacement:

Has adapter?  ──yes──▶  opencli (fast, free, deterministic)
     │
     no
     │
     ▼
One-off task?  ──yes──▶  Browser-Use / Stagehand (LLM-driven)
     │
     no
     │
     ▼
Recurring?    ──yes──▶  Write an opencli adapter, then use opencli

Further Reading