{"id":48837161,"url":"https://github.com/olo-dot-io/Uni-CLI","last_synced_at":"2026-05-01T00:00:54.887Z","repository":{"id":349095929,"uuid":"1201041209","full_name":"olo-dot-io/Uni-CLI","owner":"olo-dot-io","description":"The universal interface between AI agents and the world's software. CLI-native discovery, execution, verification, and self-repair across web, desktop, local tools, and external CLIs.","archived":false,"fork":false,"pushed_at":"2026-04-26T14:53:36.000Z","size":5415,"stargazers_count":5,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-26T15:12:49.577Z","etag":null,"topics":["agent-infrastructure","ai-agents","ai-tools","automation","browser-automation","cdp","chrome","cli","developer-tools","mcp","nodejs","self-repair","typescript","web-scraping","yaml"],"latest_commit_sha":null,"homepage":"https://olo-dot-io.github.io/Uni-CLI/","language":"TypeScript","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/olo-dot-io.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":"GOVERNANCE.md","roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":"CLA.md"}},"created_at":"2026-04-04T06:04:36.000Z","updated_at":"2026-04-26T14:53:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/olo-dot-io/Uni-CLI","commit_stats":null,"previous_names":["zenalexa/uni-cli","olo-dot-io/uni-cli"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/olo-dot-io/Uni-CLI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olo-dot-io%2FUni-CLI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olo-dot-io%2FUni-CLI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olo-dot-io%2FUni-CLI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olo-dot-io%2FUni-CLI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/olo-dot-io","download_url":"https://codeload.github.com/olo-dot-io/Uni-CLI/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/olo-dot-io%2FUni-CLI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32480557,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-30T13:12:12.517Z","status":"ssl_error","status_checked_at":"2026-04-30T13:12:06.837Z","response_time":57,"last_error":"SSL_read: 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":["agent-infrastructure","ai-agents","ai-tools","automation","browser-automation","cdp","chrome","cli","developer-tools","mcp","nodejs","self-repair","typescript","web-scraping","yaml"],"created_at":"2026-04-15T00:00:40.746Z","updated_at":"2026-05-01T00:00:54.869Z","avatar_url":"https://github.com/olo-dot-io.png","language":"TypeScript","funding_links":[],"categories":["MCP 服务器精选列表","Runtimes, Harnesses \u0026 Reference Implementations","Applications","🛠️ Developer Productivity \u0026 Utilities","13. Developer Tools \u0026 Integrations","🔧 Utilities"],"sub_categories":["🖥️ 命令行与 Shell 交互","Tools"],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/mascot-otter.png\" alt=\"Uni-CLI otter mascot\" width=\"180\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eUni-CLI\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eThe agent execution substrate for the world's software.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://olo-dot-io.github.io/Uni-CLI/\"\u003eDocs\u003c/a\u003e\n  ·\n  \u003ca href=\"https://olo-dot-io.github.io/Uni-CLI/reference/sites\"\u003eSites catalog\u003c/a\u003e\n  ·\n  \u003ca href=\"https://olo-dot-io.github.io/Uni-CLI/llms.txt\"\u003ellms.txt\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Search by intent, execute governed commands across web, apps, local tools, and system capabilities, then return evidence-rich AgentEnvelopes that agents can inspect and repair.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@zenalexa/unicli\"\u003e\u003cimg alt=\"npm\" src=\"https://img.shields.io/npm/v/@zenalexa/unicli?style=flat-square\"\u003e\u003c/a\u003e\n  \u003ca href=\"./LICENSE\"\u003e\u003cimg alt=\"license\" src=\"https://img.shields.io/badge/license-Apache--2.0-blue?style=flat-square\"\u003e\u003c/a\u003e\n  \u003cimg alt=\"Node 20+\" src=\"https://img.shields.io/badge/node-20%2B-339933?style=flat-square\u0026logo=node.js\u0026logoColor=white\"\u003e\n  \u003cimg alt=\"MCP\" src=\"https://img.shields.io/badge/MCP-2025--11--25-6f42c1?style=flat-square\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003e\u003c!-- STATS:site_count --\u003e235\u003c!-- /STATS --\u003e sites · \u003c!-- STATS:command_count --\u003e1450\u003c!-- /STATS --\u003e commands · \u003c!-- STATS:pipeline_step_count --\u003e59\u003c!-- /STATS --\u003e pipeline steps · \u003c!-- STATS:test_count --\u003e7591\u003c!-- /STATS --\u003e tests\u003c/sub\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eWeb / Social / Knowledge\u003c/strong\u003e\u003cbr\u003e\n  \u003cimg src=\"https://img.shields.io/badge/X-000000?style=flat-square\u0026logo=x\u0026logoColor=white\" alt=\"X\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Reddit-FF4500?style=flat-square\u0026logo=reddit\u0026logoColor=white\" alt=\"Reddit\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Instagram-E4405F?style=flat-square\u0026logo=instagram\u0026logoColor=white\" alt=\"Instagram\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/TikTok-000000?style=flat-square\u0026logo=tiktok\u0026logoColor=white\" alt=\"TikTok\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/YouTube-FF0000?style=flat-square\u0026logo=youtube\u0026logoColor=white\" alt=\"YouTube\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Bilibili-00A1D6?style=flat-square\u0026logo=bilibili\u0026logoColor=white\" alt=\"Bilibili\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Zhihu-0084FF?style=flat-square\u0026logo=zhihu\u0026logoColor=white\" alt=\"Zhihu\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Weibo-E6162D?style=flat-square\u0026logo=sinaweibo\u0026logoColor=white\" alt=\"Weibo\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Xiaohongshu-FF2442?style=flat-square\u0026logoColor=white\" alt=\"Xiaohongshu\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Douyin-000000?style=flat-square\u0026logo=tiktok\u0026logoColor=white\" alt=\"Douyin\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Hacker%20News-FF6600?style=flat-square\u0026logo=ycombinator\u0026logoColor=white\" alt=\"Hacker News\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/GitHub-181717?style=flat-square\u0026logo=github\u0026logoColor=white\" alt=\"GitHub\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Stack%20Overflow-F58025?style=flat-square\u0026logo=stackoverflow\u0026logoColor=white\" alt=\"Stack Overflow\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Product%20Hunt-DA552F?style=flat-square\u0026logo=producthunt\u0026logoColor=white\" alt=\"Product Hunt\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/npm-CB3837?style=flat-square\u0026logo=npm\u0026logoColor=white\" alt=\"npm\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/PyPI-3775A9?style=flat-square\u0026logo=pypi\u0026logoColor=white\" alt=\"PyPI\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Wikipedia-000000?style=flat-square\u0026logo=wikipedia\u0026logoColor=white\" alt=\"Wikipedia\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Spotify-1DB954?style=flat-square\u0026logo=spotify\u0026logoColor=white\" alt=\"Spotify\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/IMDb-F5C518?style=flat-square\u0026logo=imdb\u0026logoColor=black\" alt=\"IMDb\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Bloomberg-000000?style=flat-square\u0026logoColor=white\" alt=\"Bloomberg\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Reuters-FF8000?style=flat-square\u0026logo=reuters\u0026logoColor=white\" alt=\"Reuters\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/BBC-B80000?style=flat-square\u0026logo=bbc\u0026logoColor=white\" alt=\"BBC\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Binance-F0B90B?style=flat-square\u0026logo=binance\u0026logoColor=black\" alt=\"Binance\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Coinbase-0052FF?style=flat-square\u0026logo=coinbase\u0026logoColor=white\" alt=\"Coinbase\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Yahoo%20Finance-6001D2?style=flat-square\u0026logo=yahoo\u0026logoColor=white\" alt=\"Yahoo Finance\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eAgent / IDE / Coding Surfaces\u003c/strong\u003e\u003cbr\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Claude%20Code-D97757?style=flat-square\u0026logo=anthropic\u0026logoColor=white\" alt=\"Claude Code\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Codex-111111?style=flat-square\u0026logo=openai\u0026logoColor=white\" alt=\"Codex\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/OpenCode-101010?style=flat-square\u0026logoColor=white\" alt=\"OpenCode\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Cursor-000000?style=flat-square\u0026logoColor=white\" alt=\"Cursor\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Kiro-FF9900?style=flat-square\u0026logo=amazon\u0026logoColor=black\" alt=\"Kiro\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Gemini-4285F4?style=flat-square\u0026logo=googlegemini\u0026logoColor=white\" alt=\"Gemini\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Qwen-1E88E5?style=flat-square\u0026logoColor=white\" alt=\"Qwen\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Kimi-6C5CE7?style=flat-square\u0026logoColor=white\" alt=\"Kimi\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/MiniMax-00A6FB?style=flat-square\u0026logoColor=white\" alt=\"MiniMax\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Cline-6E56CF?style=flat-square\u0026logoColor=white\" alt=\"Cline\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Roo%20Code-2E7D32?style=flat-square\u0026logoColor=white\" alt=\"Roo Code\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Windsurf-00C2FF?style=flat-square\u0026logoColor=white\" alt=\"Windsurf\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Aider-6F42C1?style=flat-square\u0026logo=python\u0026logoColor=white\" alt=\"Aider\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Goose-111827?style=flat-square\u0026logoColor=white\" alt=\"Goose\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/OpenHands-FF6B00?style=flat-square\u0026logoColor=white\" alt=\"OpenHands\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/SWE--agent-0F172A?style=flat-square\u0026logoColor=white\" alt=\"SWE-agent\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/GitHub%20Copilot-181717?style=flat-square\u0026logo=githubcopilot\u0026logoColor=white\" alt=\"GitHub Copilot\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/AgentAPI-334155?style=flat-square\u0026logoColor=white\" alt=\"AgentAPI\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/acpx-475569?style=flat-square\u0026logoColor=white\" alt=\"acpx\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eDesktop / Media / DevOps / Cloud\u003c/strong\u003e\u003cbr\u003e\n  \u003cimg src=\"https://img.shields.io/badge/macOS-000000?style=flat-square\u0026logo=apple\u0026logoColor=white\" alt=\"macOS\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Chrome-4285F4?style=flat-square\u0026logo=googlechrome\u0026logoColor=white\" alt=\"Chrome\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Blender-F5792A?style=flat-square\u0026logo=blender\u0026logoColor=white\" alt=\"Blender\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/FFmpeg-007808?style=flat-square\u0026logo=ffmpeg\u0026logoColor=white\" alt=\"FFmpeg\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/ImageMagick-0074C1?style=flat-square\u0026logoColor=white\" alt=\"ImageMagick\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/GIMP-5C5543?style=flat-square\u0026logo=gimp\u0026logoColor=white\" alt=\"GIMP\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/FreeCAD-729FCF?style=flat-square\u0026logo=freecad\u0026logoColor=white\" alt=\"FreeCAD\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Audacity-0000CC?style=flat-square\u0026logo=audacity\u0026logoColor=white\" alt=\"Audacity\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Docker-2496ED?style=flat-square\u0026logo=docker\u0026logoColor=white\" alt=\"Docker\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/GitHub%20CLI-181717?style=flat-square\u0026logo=github\u0026logoColor=white\" alt=\"GitHub CLI\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/jq-C7254E?style=flat-square\u0026logo=json\u0026logoColor=white\" alt=\"jq\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/yt--dlp-4A5568?style=flat-square\u0026logo=youtube\u0026logoColor=white\" alt=\"yt-dlp\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/AWS-232F3E?style=flat-square\u0026logo=amazonaws\u0026logoColor=white\" alt=\"AWS\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Vercel-000000?style=flat-square\u0026logo=vercel\u0026logoColor=white\" alt=\"Vercel\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Supabase-3ECF8E?style=flat-square\u0026logo=supabase\u0026logoColor=black\" alt=\"Supabase\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Cloudflare-F38020?style=flat-square\u0026logo=cloudflare\u0026logoColor=white\" alt=\"Cloudflare\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Stripe-635BFF?style=flat-square\u0026logo=stripe\u0026logoColor=white\" alt=\"Stripe\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Firebase-FFCA28?style=flat-square\u0026logo=firebase\u0026logoColor=black\" alt=\"Firebase\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Netlify-00C7B7?style=flat-square\u0026logo=netlify\u0026logoColor=white\" alt=\"Netlify\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Railway-0B0D0E?style=flat-square\u0026logo=railway\u0026logoColor=white\" alt=\"Railway\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Azure-0078D4?style=flat-square\u0026logo=microsoftazure\u0026logoColor=white\" alt=\"Azure\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Google%20Cloud-4285F4?style=flat-square\u0026logo=googlecloud\u0026logoColor=white\" alt=\"Google Cloud\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Slack-4A154B?style=flat-square\u0026logo=slack\u0026logoColor=white\" alt=\"Slack\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Notion-000000?style=flat-square\u0026logo=notion\u0026logoColor=white\" alt=\"Notion\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Linear-5E6AD2?style=flat-square\u0026logo=linear\u0026logoColor=white\" alt=\"Linear\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Figma-F24E1E?style=flat-square\u0026logo=figma\u0026logoColor=white\" alt=\"Figma\"\u003e\n\u003c/p\u003e\n\n```bash\nnpm install -g @zenalexa/unicli\nunicli search \"hacker news frontpage\"\nunicli hackernews top -f json\n```\n\n\u003c!-- IF YOU ARE AN AI AGENT: Start here.\nInstall: npm install -g @zenalexa/unicli\nDiscover: unicli search \"your intent\"\nRun: unicli \u003csite\u003e \u003ccommand\u003e [args] [-f json|md|yaml|csv|compact]\nRepair: read the error envelope, edit the adapter_path, run unicli repair \u003csite\u003e \u003ccommand\u003e\nPrefer native CLI / JSON stream / MCP for agent runtimes. Use ACP as an editor compatibility gateway.\n--\u003e\n\n## What It Does\n\nUni-CLI sits under agent applications and turns software surfaces into commands that agents can discover, execute, record, and repair.\n\n| Surface            | What you get                                                                                                                                                                                             |\n| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Websites and APIs  | Declarative adapters for public, cookie, header, and browser-intercept workflows                                                                                                                         |\n| Browser automation | CDP steps for navigate, click, type, intercept, snapshot, extract, wait, and related browser work                                                                                                        |\n| Desktop and macOS  | System commands, app adapters, real-time Shortcuts/App Intent discovery, screenshots, clipboard, calendar, brightness, and local tools                                                                   |\n| External CLIs      | 58 registered pass-through bridges with install/status discovery                                                                                                                                         |\n| Agent backends     | Route matrix for native CLI, JSON stream, MCP, ACP, HTTP API, OpenAI-compatible, and bridge routes                                                                                                       |\n| Operation policy   | `open`, `confirm`, and `locked` profiles with effect/risk scopes, local deny rules, `--yes`, and persisted approval memory                                                                               |\n| Evidence           | Run traces with environment snapshots, probe/replay/compare scores, structured gate results, browser session leases with tab/auth posture, render-aware evidence, movement checks, and stale-ref details |\n| Output             | v2 `AgentEnvelope` in Markdown, JSON, YAML, CSV, or compact format                                                                                                                                       |\n| Repair             | Structured errors with `adapter_path`, failing `step`, retryability, suggestions, and alternatives                                                                                                       |\n\n## For Agents\n\nUse search first, then run the smallest matching command.\n\n```bash\nunicli search \"connect slack messages\" --limit 5\nunicli slack search \"deploy incident\" -f json\nunicli macos app-actions --app WhatsApp -f json\nunicli macos automation-smoke -f json\nunicli repair slack search\n```\n\nOutput defaults to structured Markdown for non-TTY and agent-user-agent runs. Force a machine format when you need one:\n\n```bash\nUNICLI_OUTPUT=json unicli reddit hot --limit 10\nunicli hackernews top --limit 5 -f yaml\nunicli --record --permission-profile confirm twitter search \"coding agents\" -f json\nunicli runs list -f json\nunicli runs show \u003crun_id\u003e -f json\nunicli runs probe \u003crun_id\u003e -f json\nunicli runs replay \u003crun_id\u003e --permission-profile confirm --yes --min-score 1 --min-context-score 1 --min-overall-score 1 -f json\nunicli runs compare \u003crun_id\u003e \u003creplay_run_id\u003e -f json\nunicli runs compare \u003crun_id\u003e \u003creplay_run_id\u003e --min-score 1 --min-context-score 1 --min-overall-score 1 -f json\nunicli --permission-profile locked --yes --remember-approval word set-font \"Inter\"\nunicli approvals list -f json\nunicli approvals revoke \u003capproval_key\u003e -f json\nunicli browser evidence --render-aware --expect-domain example.com -f json\n```\n\nProtocol entry points:\n\n```bash\nnpx @zenalexa/unicli mcp serve\nnpx @zenalexa/unicli mcp serve --transport streamable --port 19826\nunicli acp\nunicli agents recommend codex\nunicli agents matrix\n```\n\nACP is supported for editors and bridge tooling. The primary runtime path stays native CLI, JSON stream, or MCP when those routes are available.\n\n## Coverage\n\nThe catalog is intentionally broad. Every command is discoverable, typed, and repairable.\n\n| Area                    | Examples                                                                                                    |\n| ----------------------- | ----------------------------------------------------------------------------------------------------------- |\n| Chinese platforms       | xiaohongshu, zhihu, bilibili, douyin, douban, v2ex, jike, linux-do                                          |\n| International platforms | twitter, reddit, instagram, tiktok, discord, slack, hackernews, lesswrong                                   |\n| AI and developer tools  | Claude, ChatGPT, Gemini, Codex, Cursor, VS Code, Docker Desktop, Postman                                    |\n| Finance and news        | xueqiu, eastmoney, yahoo-finance, bloomberg, reuters, bbc, 36kr                                             |\n| Desktop apps            | Blender, FreeCAD, GIMP, Audacity, Figma, Docker, ImageMagick, ffmpeg                                        |\n| Agent CLIs              | Claude Code, Codex, OpenCode, Gemini CLI, Qwen Code, Aider, Goose, Cursor Agent, Kiro, OpenHands, SWE-agent |\n\nSee the live catalog:\n\n```bash\nunicli list\nunicli list --site macos\nunicli ext list\nunicli ext list --tag agent\n```\n\nBrowse the same generated catalog on the docs site:\n\u003chttps://olo-dot-io.github.io/Uni-CLI/reference/sites\u003e\n\n## Output Contract\n\nEvery normal command returns a v2 envelope. `mcp serve` and `acp` are protocol servers and keep their raw stdio protocol.\n\n```yaml\nok: true\nschema_version: \"2\"\ncommand: \"twitter.search\"\nmeta:\n  duration_ms: 412\n  count: 20\n  surface: web\ndata:\n  - { id: \"...\", text: \"...\", author: \"...\" }\nerror: null\n```\n\nErrors are meant to be acted on:\n\n```yaml\nok: false\nschema_version: \"2\"\ncommand: \"twitter.search\"\nmeta:\n  duration_ms: 91\ndata: null\nerror:\n  code: auth_required\n  message: \"401 Unauthorized\"\n  adapter_path: \"src/adapters/twitter/search.yaml\"\n  step: 1\n  suggestion: \"Run: unicli auth setup twitter\"\n  retryable: false\n  alternatives: [\"twitter.timeline\", \"twitter.profile\"]\n```\n\nExit codes: `0` ok, `66` empty, `69` unavailable, `75` temporary failure, `77` auth, `78` config.\n\n## Self-Repair\n\nAdapters are small YAML files by default. A failed command gives an agent enough context to patch the broken part without waiting for a package release.\n\n```text\n1. Run the command.\n2. Read the error envelope.\n3. Open error.adapter_path.\n4. Patch the failing step.\n5. Save the override in ~/.unicli/adapters/\u003csite\u003e/\u003ccommand\u003e.yaml.\n6. Verify with unicli repair \u003csite\u003e \u003ccommand\u003e.\n```\n\nLocal overrides survive npm updates.\n\n## Write An Adapter\n\n```yaml\nsite: example\nname: search\ndescription: \"Search example.com\"\ntransport: http\nstrategy: public\ncapabilities: [fetch, select, map, limit]\nminimum_capability: http.fetch\ntrust: public\nconfidentiality: public\nquarantine: false\npipeline:\n  - fetch:\n      url: \"https://api.example.com/search?q=${{ args.query }}\"\n  - select: data.results\n  - map:\n      title: \"${{ item.title }}\"\n      url: \"${{ item.url }}\"\n  - limit: \"${{ args.limit }}\"\nargs:\n  - { name: query, type: string, required: true, positional: true }\n  - { name: limit, type: int, default: 20 }\ncolumns: [title, url]\n```\n\nDocs:\n\n- [Documentation site](https://olo-dot-io.github.io/Uni-CLI/)\n- [Getting started](docs/guide/getting-started.md)\n- [Integrations](docs/guide/integrations.md)\n- [Adapter format](docs/ADAPTER-FORMAT.md)\n- [Pipeline reference](docs/reference/pipeline.md)\n- [Exit codes](docs/reference/exit-codes.md)\n\n## Trust And Limits\n\n- Auth-required sites use local cookie files under `~/.unicli/cookies/\u003csite\u003e.json`.\n- Browser adapters require a reachable Chrome/CDP session.\n- Permission profiles are user-selected runtime policy. The default is `open`;\n  stricter `confirm` and `locked` profiles require `--yes` or `UNICLI_APPROVE=1`\n  for blocked operations. Add `--remember-approval` with `--yes` to store the\n  same command capability and resource scope under `~/.unicli/approvals.jsonl`.\n  Resource scope covers stable metadata such as domain, account surface, app,\n  process family, and path argument slots. Use\n  `unicli approvals list`, `revoke`, and `clear` to inspect or remove remembered\n  scopes. The file stores scope metadata; runtime args stay out of approval\n  memory.\n- Local deny rules live at `~/.unicli/permission-rules.json`, or at\n  `UNICLI_PERMISSION_RULES_PATH`. They match site, command, effect, capability\n  dimensions, and resource metadata, then block before `--yes` and remembered\n  approvals. Runtime guards also check fetched domains, browser navigation\n  targets, download and output paths, and subprocess executables before the\n  request, write, or process spawn happens.\n- Run recording is opt-in. Use `--record` or `UNICLI_RECORD_RUN=1` when you need\n  append-only evidence under `~/.unicli/runs`.\n- CUA routes require a configured real backend. Declared-but-unavailable providers fail closed with structured errors.\n- User adapters and repairs live in `~/.unicli/adapters/`; committed adapters remain the package baseline.\n- If a site blocks automation or changes a private API, Uni-CLI returns a clear failure envelope.\n\n## Development\n\n```bash\npnpm install\npnpm typecheck\npnpm lint\nnpm run verify\n```\n\n## License\n\n[Apache-2.0](./LICENSE)\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003ev0.217.2 — Apollo · Swigert\u003c/sub\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folo-dot-io%2FUni-CLI","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Folo-dot-io%2FUni-CLI","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Folo-dot-io%2FUni-CLI/lists"}