{"id":47263393,"url":"https://github.com/jackwener/opencli","last_synced_at":"2026-04-25T16:04:28.561Z","repository":{"id":344480822,"uuid":"1181982220","full_name":"jackwener/OpenCLI","owner":"jackwener","description":"Make Any Website \u0026 Tool Your CLI. A universal CLI Hub and AI-native runtime. Transform any website, Electron app, or local binary into a standardized command-line interface. Built for AI Agents to discover, learn, and execute tools seamlessly via a unified AGENT.md integration.","archived":false,"fork":false,"pushed_at":"2026-04-18T18:19:10.000Z","size":6844,"stargazers_count":16334,"open_issues_count":106,"forks_count":1583,"subscribers_count":43,"default_branch":"main","last_synced_at":"2026-04-18T20:25:58.312Z","etag":null,"topics":["ai-agent","ai-agents","ai-tools","cli"],"latest_commit_sha":null,"homepage":"https://opencli.info/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jackwener.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-14T22:10:23.000Z","updated_at":"2026-04-18T19:37:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jackwener/OpenCLI","commit_stats":null,"previous_names":["jackwener/opencli"],"tags_count":86,"template":false,"template_full_name":null,"purl":"pkg:github/jackwener/OpenCLI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jackwener%2FOpenCLI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jackwener%2FOpenCLI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jackwener%2FOpenCLI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jackwener%2FOpenCLI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jackwener","download_url":"https://codeload.github.com/jackwener/OpenCLI/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jackwener%2FOpenCLI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32143815,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T15:33:03.595Z","status":"ssl_error","status_checked_at":"2026-04-22T15:30:42.712Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","ai-agents","ai-tools","cli"],"created_at":"2026-03-15T01:01:53.172Z","updated_at":"2026-04-25T16:04:28.554Z","avatar_url":"https://github.com/jackwener.png","language":"JavaScript","readme":"# OpenCLI\n\n\u003e **Turn websites, browser sessions, Electron apps, and local tools into deterministic interfaces for humans and AI agents.**\n\u003e Reuse your logged-in browser, automate live workflows, and crystallize repeated actions into reusable CLI commands.\n\n[![中文文档](https://img.shields.io/badge/docs-%E4%B8%AD%E6%96%87-0F766E?style=flat-square)](./README.zh-CN.md)\n[![npm](https://img.shields.io/npm/v/@jackwener/opencli?style=flat-square)](https://www.npmjs.com/package/@jackwener/opencli)\n[![Node.js Version](https://img.shields.io/node/v/@jackwener/opencli?style=flat-square)](https://nodejs.org)\n[![License](https://img.shields.io/npm/l/@jackwener/opencli?style=flat-square)](./LICENSE)\n\nOpenCLI gives you one surface for three different kinds of automation:\n\n- **Use built-in adapters** for sites like Bilibili, Zhihu, Xiaohongshu, Reddit, HackerNews, Twitter/X, and [many more](#built-in-commands).\n- **Let AI Agents operate any website** — install the `opencli-adapter-author` skill in your AI agent (Claude Code, Cursor, etc.), and it can navigate, click, type, extract, and inspect any page through your logged-in browser via `opencli browser` primitives.\n- **Write new adapters** end-to-end with `opencli browser` + the `opencli-adapter-author` skill, which guides from first recon through field decoding, code, and `opencli browser verify`.\n\nIt also works as a **CLI hub** for local tools such as `gh`, `docker`, and other binaries you register yourself, plus **desktop app adapters** for Electron apps like Cursor, Codex, Antigravity, ChatGPT, and Notion.\n\n## Highlights\n\n- **Desktop App Control** — Drive Electron apps (Cursor, Codex, ChatGPT, Notion, etc.) directly from the terminal via CDP.\n- **Browser Automation for AI Agents** — Install the `opencli-adapter-author` skill, and your AI agent can operate any website: navigate, click, type, extract, screenshot — all through your logged-in Chrome session.\n- **Website → CLI** — Turn any website into a deterministic CLI: 90+ pre-built adapters, or write your own with the `opencli-adapter-author` skill + `opencli browser verify`.\n- **Account-safe** — Reuses Chrome/Chromium logged-in state; your credentials never leave the browser.\n- **AI Agent ready** — One skill takes you from site recon through API discovery, field decoding, adapter writing, and verification.\n- **CLI Hub** — Discover, auto-install, and passthrough commands to any external CLI (gh, docker, obsidian, etc).\n- **Zero LLM cost** — No tokens consumed at runtime. Run 10,000 times and pay nothing.\n- **Deterministic** — Same command, same output schema, every time. Pipeable, scriptable, CI-friendly.\n\n---\n\n## Quick Start\n\n### 1. Install OpenCLI\n\n```bash\nnpm install -g @jackwener/opencli\n```\n\n### 2. Install the Browser Bridge Extension\n\nOpenCLI connects to Chrome/Chromium through a lightweight Browser Bridge extension plus a small local daemon. The daemon auto-starts when needed.\n\n1. Download the latest `opencli-extension-v{version}.zip` from the GitHub [Releases page](https://github.com/jackwener/opencli/releases).\n2. Unzip it, open `chrome://extensions`, and enable **Developer mode**.\n3. Click **Load unpacked** and select the unzipped folder.\n\n### 3. Verify the setup\n\n```bash\nopencli doctor\n```\n\n### 4. Run your first commands\n\n```bash\nopencli list\nopencli hackernews top --limit 5\nopencli bilibili hot --limit 5\n```\n\n## For Humans\n\nUse OpenCLI directly when you want a reliable command instead of a live browser session:\n\n- `opencli list` shows every registered command.\n- `opencli \u003csite\u003e \u003ccommand\u003e` runs a built-in or generated adapter.\n- `opencli register mycli` exposes a local CLI through the same discovery surface.\n- `opencli doctor` helps diagnose browser connectivity.\n\n## For AI Agents\n\nOpenCLI's browser commands are designed to be used by AI Agents — not run manually. Install skills into your AI agent (Claude Code, Cursor, etc.), and the agent operates websites on your behalf using your logged-in Chrome session.\n\n### Install skills\n\n```bash\nnpx skills add jackwener/opencli\n```\n\nOr install only what you need:\n\n```bash\nnpx skills add jackwener/opencli --skill opencli-adapter-author\nnpx skills add jackwener/opencli --skill opencli-autofix\nnpx skills add jackwener/opencli --skill opencli-browser\nnpx skills add jackwener/opencli --skill opencli-usage\nnpx skills add jackwener/opencli --skill smart-search\n```\n\n### Which skill to use\n\n| Skill | When to use | Example prompt to your AI agent |\n|-------|------------|-------------------------------|\n| **opencli-adapter-author** | Operate a site in real time, or write a reusable adapter for a new site | \"Help me check my Xiaohongshu notifications\" / \"Write an adapter for douyin trending\" / \"Make a command that grabs the top posts from this page\" |\n| **opencli-autofix** | Repair a broken adapter when a built-in command fails | \"`opencli zhihu hot` is returning empty — fix it\" |\n| **opencli-browser** | Browser automation reference for AI agents | \"Use browser commands to scrape this page\" |\n| **opencli-usage** | Quick reference for all OpenCLI commands and sites | \"What commands does OpenCLI have for Twitter?\" |\n| **smart-search** | Search across existing OpenCLI capabilities | \"Find me a Bilibili trending adapter\" |\n\n### How it works\n\nOnce `opencli-adapter-author` is installed, your AI agent can:\n\n1. **Navigate** to any URL using your logged-in browser\n2. **Read** page content via structured DOM snapshots (not screenshots)\n3. **Interact** — click buttons, fill forms, select options, press keys\n4. **Extract** data from the page or intercept network API responses\n5. **Wait** for elements, text, or page transitions\n\nThe agent handles all the `opencli browser` commands internally — you just describe what you want done in natural language.\n\n**Skill references:**\n- [`skills/opencli-adapter-author/SKILL.md`](./skills/opencli-adapter-author/SKILL.md) — browser operation + adapter authoring, end-to-end\n- [`skills/opencli-autofix/SKILL.md`](./skills/opencli-autofix/SKILL.md) — repair broken adapters\n- [`skills/opencli-browser/SKILL.md`](./skills/opencli-browser/SKILL.md) — browser automation reference\n- [`skills/opencli-usage/SKILL.md`](./skills/opencli-usage/SKILL.md) — command and site reference\n- [`skills/smart-search/SKILL.md`](./skills/smart-search/SKILL.md) — capability search\n\nAvailable browser commands include `open`, `state`, `click`, `type`, `select`, `keys`, `wait`, `get`, `find`, `extract`, `frames`, `screenshot`, `scroll`, `back`, `eval`, `network`, `tab list`, `tab new`, `tab select`, `tab close`, `init`, `verify`, and `close`.\n\n`opencli browser open \u003curl\u003e` and `opencli browser tab new [url]` both return a target ID. Use `opencli browser tab list` to inspect the target IDs of tabs that already exist, then pass `--tab \u003ctargetId\u003e` to route a command to a specific tab. `tab new` creates a new tab without changing the default browser target; only `tab select \u003ctargetId\u003e` promotes that tab to the default target for later untargeted `opencli browser ...` commands.\n\n## Core Concepts\n\n### `browser`: AI Agent browser control\n\n`opencli browser` commands are the low-level primitives that AI Agents use to operate websites. You don't run these manually — instead, install the `opencli-adapter-author` skill into your AI agent, describe what you want in natural language, and the agent handles the browser operations.\n\nFor example, tell your agent: *\"Help me check my Xiaohongshu notifications\"* — the agent will use `opencli browser open`, `state`, `click`, etc. under the hood.\n\n### Built-in adapters: stable commands\n\nUse site-specific commands such as `opencli hackernews top` or `opencli reddit hot` when the capability already exists. These are deterministic and work without browser — ideal for both humans and AI agents.\n\n### Writing a new adapter\n\nWhen the site you need is not yet covered, use the `opencli-adapter-author` skill. It takes the agent end-to-end:\n\n1. Recon the site and classify its pattern (SPA / SSR / JSONP / Token / Streaming).\n2. Discover the right endpoint — network inspection, initial state, bundle search, token trace, or interceptor fallback.\n3. Decide the auth strategy — `PUBLIC` / `COOKIE` / `HEADER` / `INTERCEPT`.\n4. Decode response fields and design output columns.\n5. `opencli browser init \u003csite\u003e/\u003cname\u003e` → write adapter → `opencli browser verify \u003csite\u003e/\u003cname\u003e`.\n6. Persist site knowledge to `~/.opencli/sites/\u003csite\u003e/` so the next adapter for the same site is faster.\n\n### CLI Hub and desktop adapters\n\nOpenCLI is not only for websites. It can also:\n\n- expose local binaries like `gh`, `docker`, `obsidian`, or custom tools through `opencli \u003ctool\u003e ...`\n- control Electron desktop apps through dedicated adapters and CDP-backed integrations\n\n## Prerequisites\n\n- **Node.js**: \u003e= 21.0.0 (or **Bun** \u003e= 1.0)\n- **Chrome or Chromium** running and logged into the target site for browser-backed commands\n\n\u003e **Important**: Browser-backed commands reuse your Chrome/Chromium login session. If you get empty data or permission-like failures, first confirm the site is already open and authenticated in Chrome/Chromium.\n\n## Configuration\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `OPENCLI_DAEMON_PORT` | `19825` | HTTP port for the daemon-extension bridge |\n| `OPENCLI_WINDOW_FOCUSED` | `false` | Set to `1` to open automation windows in the foreground (useful for debugging). The `--focus` flag sets this. |\n| `OPENCLI_LIVE` | `false` | Set to `1` to keep the automation window open after an adapter command finishes (useful for inspection). The `--live` flag sets this. |\n| `OPENCLI_BROWSER_CONNECT_TIMEOUT` | `30` | Seconds to wait for browser connection |\n| `OPENCLI_BROWSER_COMMAND_TIMEOUT` | `60` | Seconds to wait for a single browser command |\n| `OPENCLI_CDP_ENDPOINT` | — | Chrome DevTools Protocol endpoint for remote browser or Electron apps |\n| `OPENCLI_CDP_TARGET` | — | Filter CDP targets by URL substring (e.g. `detail.1688.com`) |\n| `OPENCLI_VERBOSE` | `false` | Enable verbose logging (`-v` flag also works) |\n| `OPENCLI_DIAGNOSTIC` | `false` | Set to `1` to capture structured diagnostic context on failures |\n| `DEBUG_SNAPSHOT` | — | Set to `1` for DOM snapshot debug output |\n\n`--focus` works for both `opencli browser *` and browser-backed adapter commands. `--live` is mainly for adapter commands: browser subcommands already keep the automation window open until you run `opencli browser close` or the idle timeout expires.\n\n## Update\n\n```bash\nnpm install -g @jackwener/opencli@latest\n\n# If you use the packaged OpenCLI skills, refresh them too\nnpx skills add jackwener/opencli\n```\n\nOr refresh only the skills you actually use:\n\n```bash\nnpx skills add jackwener/opencli --skill opencli-adapter-author\nnpx skills add jackwener/opencli --skill opencli-autofix\nnpx skills add jackwener/opencli --skill opencli-browser\nnpx skills add jackwener/opencli --skill opencli-usage\nnpx skills add jackwener/opencli --skill smart-search\n```\n\n## For Developers\n\nInstall from source:\n\n```bash\ngit clone git@github.com:jackwener/opencli.git\ncd opencli\nnpm install\nnpm run build\nnpm link\n```\n\nTo load the source Browser Bridge extension:\n\n1. Open `chrome://extensions` and enable **Developer mode**.\n2. Click **Load unpacked** and select this repository's `extension/` directory.\n\n## Built-in Commands\n\n| Site | Commands |\n|------|----------|\n| **xiaohongshu** | `search` `note` `comments` `feed` `user` `download` `publish` `notifications` `creator-notes` `creator-notes-summary` `creator-note-detail` `creator-profile` `creator-stats` |\n| **bilibili** | `hot` `search` `history` `feed` `ranking` `download` `comments` `dynamic` `favorite` `following` `me` `subtitle` `video` `user-videos` |\n| **tieba** | `hot` `posts` `search` `read` |\n| **hupu** | `hot` `search` `detail` `mentions` `reply` `like` `unlike` |\n| **twitter** | `trending` `search` `timeline` `tweets` `lists` `list-tweets` `list-add` `list-remove` `bookmarks` `post` `download` `profile` `article` `like` `likes` `notifications` `reply` `reply-dm` `thread` `follow` `unfollow` `followers` `following` `block` `unblock` `bookmark` `unbookmark` `delete` `hide-reply` `accept` |\n| **reddit** | `hot` `frontpage` `popular` `search` `subreddit` `read` `user` `user-posts` `user-comments` `upvote` `upvoted` `save` `saved` `comment` `subscribe` |\n| **zhihu** | `hot` `search` `question` `download` `follow` `like` `favorite` `comment` `answer` |\n| **amazon** | `bestsellers` `search` `product` `offer` `discussion` `movers-shakers` `new-releases` `rankings` |\n| **1688** | `search` `item` `assets` `download` `store` |\n| **gitee** | `trending` `search` `user` |\n| **gemini** | `new` `ask` `image` `deep-research` `deep-research-result` |\n| **yuanbao** | `new` `ask` |\n| **notebooklm** | `status` `list` `open` `current` `get` `history` `summary` `note-list` `notes-get` `source-list` `source-get` `source-fulltext` `source-guide` |\n| **spotify** | `auth` `status` `play` `pause` `next` `prev` `volume` `search` `queue` `shuffle` `repeat` |\n| **xianyu** | `search` `item` `chat` |\n| **xiaoe** | `courses` `detail` `catalog` `play-url` `content` |\n| **quark** | `ls` `mkdir` `mv` `rename` `rm` `save` `share-tree` |\n| **uiverse** | `code` `preview` |\n| **baidu-scholar** | `search` |\n| **google-scholar** | `search` |\n| **gov-law** | `search` `recent` |\n| **gov-policy** | `search` `recent` |\n| **nowcoder** | `hot` `trending` `topics` `recommend` `creators` `companies` `jobs` `search` `suggest` `experience` `referral` `salary` `papers` `practice` `notifications` `detail` |\n| **wanfang** | `search` |\n| **hackernews** | `top` `new` `best` `ask` `show` `jobs` `search` `user` |\n| **xiaoyuzhou** | `auth*` `podcast*` `podcast-episodes*` `episode*` `download*` `transcript*` |\n\n90+ adapters in total — **[→ see all supported sites \u0026 commands](./docs/adapters/index.md)**\n\n`*` `opencli xiaoyuzhou podcast`, `podcast-episodes`, `episode`, `download`, and `transcript` require local Xiaoyuzhou credentials in `~/.opencli/xiaoyuzhou.json`.\n\n## CLI Hub\n\nOpenCLI acts as a universal hub for your existing command-line tools — unified discovery, pure passthrough execution, and auto-install (if a tool isn't installed, OpenCLI runs `brew install \u003ctool\u003e` automatically before re-running the command).\n\n| External CLI | Description | Example |\n|--------------|-------------|---------|\n| **gh** | GitHub CLI | `opencli gh pr list --limit 5` |\n| **obsidian** | Obsidian vault management | `opencli obsidian search query=\"AI\"` |\n| **docker** | Docker | `opencli docker ps` |\n| **lark-cli** | Lark/Feishu — messages, docs, calendar, tasks, 200+ commands | `opencli lark-cli calendar +agenda` |\n| **dws** | DingTalk — cross-platform CLI for DingTalk's full suite, designed for humans and AI agents | `opencli dws msg send --to user \"hello\"` |\n| **wecom-cli** | WeCom/企业微信 — CLI for WeCom open platform, for humans and AI agents | `opencli wecom-cli msg send --to user \"hello\"` |\n| **vercel** | Vercel — deploy projects, manage domains, env vars, logs | `opencli vercel deploy --prod` |\n\n**Register your own** — add any local CLI so AI agents can discover it via `opencli list`:\n\n```bash\nopencli register mycli\n```\n\n### Desktop App Adapters\n\nControl Electron desktop apps directly from the terminal. Each adapter has its own detailed documentation:\n\n| App | Description | Doc |\n|-----|-------------|-----|\n| **Cursor** | Control Cursor IDE — Composer, chat, code extraction | [Doc](./docs/adapters/desktop/cursor.md) |\n| **Codex** | Drive OpenAI Codex CLI agent headlessly | [Doc](./docs/adapters/desktop/codex.md) |\n| **Antigravity** | Control Antigravity Ultra from terminal | [Doc](./docs/adapters/desktop/antigravity.md) |\n| **ChatGPT App** | Automate ChatGPT macOS desktop app | [Doc](./docs/adapters/desktop/chatgpt-app.md) |\n| **ChatWise** | Multi-LLM client (GPT-4, Claude, Gemini) | [Doc](./docs/adapters/desktop/chatwise.md) |\n| **Notion** | Search, read, write Notion pages | [Doc](./docs/adapters/desktop/notion.md) |\n| **Discord** | Discord Desktop — messages, channels, servers | [Doc](./docs/adapters/desktop/discord.md) |\n| **Doubao** | Control Doubao AI desktop app via CDP | [Doc](./docs/adapters/desktop/doubao-app.md) |\n\nTo add a new Electron app, start with [docs/guide/electron-app-cli.md](./docs/guide/electron-app-cli.md).\n\n## Download Support\n\nOpenCLI supports downloading images, videos, and articles from supported platforms.\n\n| Platform | Content Types | Notes |\n|----------|---------------|-------|\n| **xiaohongshu** | Images, Videos | Downloads all media from a note |\n| **bilibili** | Videos | Requires `yt-dlp` installed |\n| **twitter** | Images, Videos | From user media tab or single tweet |\n| **douban** | Images | Poster / still image lists |\n| **pixiv** | Images | Original-quality illustrations, multi-page |\n| **1688** | Images, Videos | Downloads page-visible product media from item pages |\n| **xiaoyuzhou** | Audio, Transcript | Downloads episode audio and transcript JSON/text with local credentials |\n| **zhihu** | Articles (Markdown) | Exports with optional image download |\n| **weixin** | Articles (Markdown) | WeChat Official Account articles |\n\nFor video downloads, install `yt-dlp` first: `brew install yt-dlp`\n\n```bash\nopencli xiaohongshu download \"https://www.xiaohongshu.com/search_result/\u003cid\u003e?xsec_token=...\" --output ./xhs\nopencli xiaohongshu download \"https://xhslink.com/...\" --output ./xhs\nopencli bilibili download BV1xxx --output ./bilibili\nopencli twitter download elonmusk --limit 20 --output ./twitter\nopencli 1688 download 841141931191 --output ./1688-downloads\nopencli xiaoyuzhou download 69b3b675772ac2295bfc01d0 --output ./xiaoyuzhou\nopencli xiaoyuzhou transcript 69dd0c98e2c8be31551f6a33 --output ./xiaoyuzhou-transcripts\n```\n\n`opencli xiaoyuzhou download` and `transcript` require local Xiaoyuzhou credentials in `~/.opencli/xiaoyuzhou.json`.\n\n## Output Formats\n\nAll built-in commands support `--format` / `-f` with `table` (default), `json`, `yaml`, `md`, and `csv`.\n\n```bash\nopencli bilibili hot -f json    # Pipe to jq or LLMs\nopencli bilibili hot -f csv     # Spreadsheet-friendly\nopencli bilibili hot -v         # Verbose: show pipeline debug steps\n```\n\n## Exit Codes\n\nopencli follows Unix `sysexits.h` conventions so it integrates naturally with shell pipelines and CI scripts:\n\n| Code | Meaning | When |\n|------|---------|------|\n| `0` | Success | Command completed normally |\n| `1` | Generic error | Unexpected / unclassified failure |\n| `2` | Usage error | Bad arguments or unknown command |\n| `66` | Empty result | No data returned (`EX_NOINPUT`) |\n| `69` | Service unavailable | Browser Bridge not connected (`EX_UNAVAILABLE`) |\n| `75` | Temporary failure | Command timed out — retry (`EX_TEMPFAIL`) |\n| `77` | Auth required | Not logged in to target site (`EX_NOPERM`) |\n| `78` | Config error | Missing credentials or bad config (`EX_CONFIG`) |\n| `130` | Interrupted | Ctrl-C / SIGINT |\n\n```bash\nopencli spotify status || echo \"exit $?\"   # 69 if browser not running\nopencli gh issue list 2\u003e/dev/null\n[ $? -eq 77 ] \u0026\u0026 opencli gh auth login      # auto-auth if not logged in\n```\n\n## Plugins\n\nExtend OpenCLI with community-contributed adapters:\n\n```bash\nopencli plugin install github:user/opencli-plugin-my-tool\nopencli plugin list\nopencli plugin update --all\nopencli plugin uninstall my-tool\n```\n\n| Plugin | Type | Description |\n|--------|------|-------------|\n| [opencli-plugin-github-trending](https://github.com/ByteYue/opencli-plugin-github-trending) | JS | GitHub Trending repositories |\n| [opencli-plugin-hot-digest](https://github.com/ByteYue/opencli-plugin-hot-digest) | JS | Multi-platform trending aggregator |\n| [opencli-plugin-juejin](https://github.com/Astro-Han/opencli-plugin-juejin) | JS | 稀土掘金 (Juejin) hot articles |\n| [opencli-plugin-vk](https://github.com/flobo3/opencli-plugin-vk) | JS | VK (VKontakte) wall, feed, and search |\n\nSee [Plugins Guide](./docs/guide/plugins.md) for creating your own plugin.\n\n## For AI Agents (Developer Guide)\n\nBefore writing any adapter code, read the [`opencli-adapter-author` skill](./skills/opencli-adapter-author/SKILL.md). It takes you end-to-end:\n\n- Recon the site and pick a pattern (SPA / SSR / JSONP / Token / Streaming).\n- Discover the right endpoint via `opencli browser network`, `eval`, or the interceptor fallback.\n- Decide auth strategy (`PUBLIC` / `COOKIE` / `HEADER` / `INTERCEPT`).\n- Decode response fields, design columns, scaffold with `opencli browser init`.\n- Verify with `opencli browser verify \u003csite\u003e/\u003cname\u003e` before shipping.\n\nAdapters you write outside the repo live at `~/.opencli/clis/\u003csite\u003e/\u003cname\u003e.js`. Site knowledge (endpoints, field maps, fixtures) accumulates in `~/.opencli/sites/\u003csite\u003e/` so the next adapter for the same site starts from context instead of zero.\n\n## Testing\n\nSee **[TESTING.md](./TESTING.md)** for how to run and write tests.\n\n## Troubleshooting\n\n- **\"Extension not connected\"** — Ensure the Browser Bridge extension is installed and **enabled** in `chrome://extensions` in Chrome or Chromium.\n- **\"attach failed: Cannot access a chrome-extension:// URL\"** — Another extension may be interfering. Try disabling other extensions temporarily.\n- **Empty data or 'Unauthorized' error** — Your Chrome/Chromium login session may have expired. Navigate to the target site and log in again.\n- **Node API errors** — Ensure Node.js \u003e= 21. Some features require `node:util` styleText (stable in Node 21+).\n- **Daemon issues** — Check status: `curl localhost:19825/status` · View logs: `curl localhost:19825/logs`\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=jackwener/opencli\u0026type=Date)](https://star-history.com/#jackwener/opencli\u0026Date)\n\n## License\n\n[Apache-2.0](./LICENSE)\n","funding_links":[],"categories":["GUI \u0026 Computer Control AI Agents","TypeScript","AI Agent Frameworks"],"sub_categories":["Browser \u0026 Web Automation"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjackwener%2Fopencli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjackwener%2Fopencli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjackwener%2Fopencli/lists"}