{"id":48441902,"url":"https://github.com/olo-dot-io/uni-cli","last_synced_at":"2026-04-19T12:04:42.128Z","repository":{"id":349095929,"uuid":"1201041209","full_name":"olo-dot-io/Uni-CLI","owner":"olo-dot-io","description":"CLI is all agents need. Universal CLI for AI agents to control internet apps and local software.","archived":false,"fork":false,"pushed_at":"2026-04-17T10:13:14.000Z","size":2444,"stargazers_count":4,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-17T10:30:42.316Z","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":null,"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-15T15:12:09.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":18,"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":32005837,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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-06T16:01:11.365Z","updated_at":"2026-04-19T12:04:42.117Z","avatar_url":"https://github.com/olo-dot-io.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- AGENT: npm install -g @zenalexa/unicli \u0026\u0026 unicli search \"your intent\" — hundreds of commands across ~200 sites. JSON when piped. Self-repairing YAML adapters. Bilingual EN/ZH search. See AGENTS.md for live counts. --\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"assets/logo-dark.svg\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"assets/logo-light.svg\"\u003e\n  \u003cimg alt=\"Uni-CLI\" src=\"assets/logo-light.svg\" width=\"420\"\u003e\n\u003c/picture\u003e\n\n\u003cbr\u003e\u003cbr\u003e\n\n**CLI is all agents need.**\n\nThe execution layer for agent skills. Deterministic, editable, cross-vendor.\n\n\u003cbr\u003e\n\n\u003ca href=\"https://www.npmjs.com/package/@zenalexa/unicli\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@zenalexa/unicli?style=flat-square\u0026color=cb3837\" alt=\"npm\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/olo-dot-io/Uni-CLI/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://img.shields.io/github/actions/workflow/status/olo-dot-io/Uni-CLI/ci.yml?style=flat-square\u0026label=CI\" alt=\"CI\"\u003e\u003c/a\u003e\n\u003ca href=\"./LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/olo-dot-io/Uni-CLI?style=flat-square\" alt=\"license\"\u003e\u003c/a\u003e\n\u003cimg src=\"https://img.shields.io/badge/tests-\u003c!-- STATS:test_count --\u003e7083\u003c!-- /STATS --\u003e-44cc11?style=flat-square\" alt=\"tests\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/agent--reach-ally-6a5acd?style=flat-square\" alt=\"agent-reach ally\"\u003e\n\n\u003cbr\u003e\u003cbr\u003e\n\n```\nnpm install -g @zenalexa/unicli\n```\n\n\u003cbr\u003e\n\n\u003cimg src=\"docs/demo/demo.svg\" alt=\"Uni-CLI in 30 seconds\" width=\"720\"\u003e\n\n\u003c/div\u003e\n\n---\n\n## What\n\nUni-CLI is a universal interface that compiles agent intent into deterministic CLI programs. One binary reaches \u003c!-- STATS:site_count --\u003e200\u003c!-- /STATS --\u003e sites, 30+ desktop apps, 35 CLI bridges, and the local OS — \u003c!-- STATS:command_count --\u003e968\u003c!-- /STATS --\u003e commands in total. Every adapter is a 20-line YAML pipeline, so agents can read, edit, and re-run them without a compiler.\n\nCoverage is cross-cutting: web APIs and browser automation, desktop subprocesses (ffmpeg, Blender, LibreOffice), macOS system calls (screenshot, clipboard, Calendar), and Computer Use Agents (Anthropic, OpenAI, Google) — all behind the same `unicli \u003csite\u003e \u003ccommand\u003e` surface. Output is a table in a terminal and JSON when piped. Errors are structured JSON on stderr with the adapter path, the failing step, and a suggestion — enough directional feedback for an agent to fix the adapter and retry.\n\nSelf-repair is a first-class capability. When a site changes its API, an agent reads the 20-line YAML, edits the selector or endpoint, saves to `~/.unicli/adapters/`, and retries. Fixes survive `npm update`. No human in the loop.\n\n## Why\n\nMCP tool catalogs cost 4–35× more tokens per call than an equivalent CLI invocation, and 55K tokens of cold-start tax before the agent touches a tool (Firecrawl, Scalekit, Apideck benchmarks; see [`docs/BENCHMARK.md`](docs/BENCHMARK.md)). Agents perform better with executable programs than with catalogs of tool descriptions. Retrieval-over-catalog research in 2025–2026 (Semantic Tool Discovery, ITR Dynamic Tool Exposure, JSPLIT) reports 95–99% context reduction when tools are fetched on demand.\n\nUni-CLI is the execution half of that equation. The MCP server exposes 4 meta-tools (~200 tokens cold-start) — `unicli_run`, `unicli_list`, `unicli_search`, `unicli_explore` — and the agent pulls the exact tool it needs via BM25 bilingual search over a 50KB index. The CLI itself costs one subprocess per call.\n\n## Quick start\n\nFive minutes, top-to-bottom:\n\n```bash\n# 1. Install\nnpm install -g @zenalexa/unicli\n\n# 2. Discover\nunicli list                                   # all sites + commands\nunicli search \"推特热门\"                       # → twitter trending (bilingual)\n\n# 3. Run\nunicli reddit hot --limit 3                   # zero-config web API\nunicli hackernews top --json | jq '.[].title' # pipe + transform\n\n# 4. Wire into an agent\nclaude mcp add unicli -- npx @zenalexa/unicli mcp serve   # Claude Code (MCP stdio)\nunicli mcp serve --transport streamable --port 19826      # Any MCP client (HTTP)\nunicli acp                                                # avante.nvim / Zed (ACP)\n```\n\nFull walkthrough with 5 worked examples: [`docs/QUICKSTART.md`](docs/QUICKSTART.md).\n\n## Architecture\n\n```mermaid\ngraph TB\n    CMD[\"unicli \u0026lt;site\u0026gt; \u0026lt;command\u0026gt;\"]\n\n    CMD --\u003e ADAPT[\"Adapter layer\u003cbr/\u003e887 YAML · 72 TS · 35 bridges\"]\n\n    ADAPT --\u003e ENGINE[\"Pipeline engine — \u003c!-- STATS:pipeline_step_count --\u003e54\u003c!-- /STATS --\u003e+ steps\u003cbr/\u003efetch · navigate · exec · extract · each · if · parallel\"]\n\n    ENGINE --\u003e T1[\"HTTP\u003cbr/\u003e(web APIs)\"]\n    ENGINE --\u003e T2[\"CDP Browser\u003cbr/\u003e(raw WebSocket)\"]\n    ENGINE --\u003e T3[\"Subprocess\u003cbr/\u003e(ffmpeg, yt-dlp, gh)\"]\n    ENGINE --\u003e T4[\"Desktop-AX\u003cbr/\u003e(macOS AppleScript)\"]\n    ENGINE --\u003e T5[\"Desktop-UIA\u003cbr/\u003e(Windows UIAutomation)\"]\n    ENGINE --\u003e T6[\"Desktop-AT-SPI\u003cbr/\u003e(Linux accessibility)\"]\n    ENGINE --\u003e T7[\"CUA\u003cbr/\u003e(Anthropic · OpenAI · Google)\"]\n\n    T1 --\u003e OUT[\"Formatter\u003cbr/\u003etable · json · yaml · csv · md\"]\n    T2 --\u003e OUT\n    T3 --\u003e OUT\n    T4 --\u003e OUT\n    T5 --\u003e OUT\n    T6 --\u003e OUT\n    T7 --\u003e OUT\n```\n\nSeven TransportAdapters, one adapter layer, one formatter. Adapters are declarative YAML by default (Rice-decidable, no imports) and TypeScript when a site genuinely needs it. The full step reference lives in [`docs/ADAPTER-FORMAT.md`](docs/ADAPTER-FORMAT.md).\n\n## Self-repair\n\nWhen a command breaks:\n\n```\nunicli \u003csite\u003e \u003ccmd\u003e fails\n  → structured JSON error on stderr\n    { adapter_path, step, action, suggestion }\n  → agent opens the ~20-line YAML\n  → agent edits the selector / URL / auth\n  → unicli \u003csite\u003e \u003ccmd\u003e works\n  → fix persists in ~/.unicli/adapters/ (survives npm update)\n```\n\n```bash\nunicli repair hackernews top      # Diagnose + suggest fix\nunicli test hackernews            # Validate adapter\nunicli repair --loop              # Autonomous fix loop\n```\n\nExit codes follow `sysexits.h`: `0` ok, `66` empty, `69` unavailable, `75` temporary, `77` auth, `78` config. Agents parse those directly — no regex over human error text.\n\n## Feature matrix\n\n| Capability               | What it means                                                                                        |\n| ------------------------ | ---------------------------------------------------------------------------------------------------- |\n| **CUA backends**         | Anthropic `computer-use`, OpenAI Operator, Google CUA, and direct CDP — 4 transports behind one flag |\n| **MCP transports**       | stdio · Streamable HTTP (spec 2025-11-25) · SSE · OAuth 2.1 PKCE                                     |\n| **ACP ready**            | `unicli acp` speaks JSON-RPC 2.0 for avante.nvim, Zed, Gemini CLI                                    |\n| **Cross-vendor skills**  | Skills in `skills/` work in Claude Code, OpenCode, Codex, Cursor, Cline                              |\n| **Self-repair envelope** | Every error ships `adapter_path` + `step` + `suggestion` (Banach-convergent)                         |\n| **Bilingual search**     | BM25 + TF-IDF, 50KB index, \u003c10ms queries, 200-entry ZH↔EN alias table                                |\n| **Browser daemon**       | Persistent Chrome via CDP, reuses your login sessions, 13-layer stealth                              |\n\nDetailed benchmarks (p50/p95 token cost per category, vs GitHub MCP cold-start): [`docs/BENCHMARK.md`](docs/BENCHMARK.md).\n\n## Platform coverage\n\n\u003c!-- STATS:site_count --\u003e200\u003c!-- /STATS --\u003e sites · \u003c!-- STATS:command_count --\u003e968\u003c!-- /STATS --\u003e commands — the live list is auto-generated in [`AGENTS.md`](AGENTS.md) and split by domain:\n\n| Domain                | Highlights                                                              |\n| --------------------- | ----------------------------------------------------------------------- |\n| **Social (25)**       | twitter, reddit, instagram, tiktok, xiaohongshu, bilibili, zhihu, weibo |\n| **Tech (19)**         | hackernews, stackoverflow, producthunt, github-trending, npm, pypi      |\n| **News (11)**         | bbc, reuters, bloomberg, nytimes, techcrunch, 36kr                      |\n| **Finance (8)**       | xueqiu, yahoo-finance, eastmoney, binance, coinbase                     |\n| **AI / ML (14)**      | huggingface, ollama, replicate, perplexity, deepseek, doubao            |\n| **Desktop (30+)**     | blender, ffmpeg, imagemagick, gimp, freecad, musescore, kdenlive        |\n| **macOS system (58)** | screenshot, clipboard, Calendar, Mail, Reminders, Shortcuts, Safari     |\n| **CLI bridges (35)**  | gh, yt-dlp, jq, aws, vercel, supabase, wrangler, stripe                 |\n\nRun `unicli list` for the live catalog, or `unicli list --category=\u003cdomain\u003e` to filter.\n\n## Agent integration\n\nEvery major agent platform works out of the box:\n\n| Platform        | One-liner                                                  | Notes                                     |\n| --------------- | ---------------------------------------------------------- | ----------------------------------------- |\n| **Claude Code** | `claude mcp add unicli -- npx @zenalexa/unicli mcp serve`  | 4 meta-tools, stdio                       |\n| **Codex CLI**   | Add `[mcp_servers.unicli]` to `~/.codex/config.toml`       | First-class AGENTS.md citizen             |\n| **Cursor**      | MCP Settings → `unicli` → `npx @zenalexa/unicli mcp serve` | Bilingual search works inside Cursor chat |\n| **avante.nvim** | `type = \"acp\", command = \"unicli\", args = { \"acp\" }`       | See [`docs/AVANTE.md`](docs/AVANTE.md)    |\n| **OpenCode**    | MCP via `opencode.jsonc` — `command: \"unicli mcp serve\"`   | AGENTS.md auto-loaded                     |\n| **Cline**       | Add MCP server in settings — stdio transport               | Same 4 meta-tools, 200-token cold start   |\n\nDirect shell access (any agent with Bash or exec):\n\n```bash\nunicli twitter search \"AI agents\"\nunicli blender render scene.blend --output /tmp/frame.png\nunicli macos screenshot --region 0,0,1920,1080\n```\n\n## Authentication\n\nFive auth strategies, auto-probed in a cascade (`public → cookie → header`):\n\n| Strategy    | How                                                    |\n| ----------- | ------------------------------------------------------ |\n| `public`    | Direct HTTP, no credentials                            |\n| `cookie`    | `~/.unicli/cookies/\u003csite\u003e.json` injected into headers  |\n| `header`    | Cookie + auto-extracted CSRF (ct0, bili_jct, …)        |\n| `intercept` | Chrome navigates, Uni-CLI captures XHR/fetch responses |\n| `ui`        | Direct DOM interaction via CDP (click, type, submit)   |\n\n```bash\nunicli auth setup twitter    # Print required cookies + target path\nunicli auth check twitter    # Validate cookie file\nunicli auth list             # All configured sites\n```\n\nThe browser daemon (`unicli browser start`) reuses your signed-in Chrome session via CDP — no cookie export, no extension install. Auto-exits after 4h idle.\n\n## Write an adapter\n\nMost adapters are ~20 lines of YAML. No TypeScript, no build step, no imports:\n\n```yaml\nsite: hackernews\nname: top\ntype: web-api\nstrategy: public\npipeline:\n  - fetch:\n      url: \"https://hacker-news.firebaseio.com/v0/topstories.json\"\n  - limit: { count: \"${{ args.limit | default(30) }}\" }\n  - each:\n      do:\n        - fetch:\n            url: \"https://hacker-news.firebaseio.com/v0/item/${{ item }}.json\"\n  - map:\n      title: \"${{ item.title }}\"\n      score: \"${{ item.score }}\"\n      url: \"${{ item.url }}\"\ncolumns: [title, score, url]\n```\n\nFive adapter types: `web-api`, `desktop`, `browser`, `bridge`, `service`. 29 template filters (`join`, `urlencode`, `truncate`, `slugify`, `default`, `json`, …) run in a sandboxed VM.\n\nScaffold, dev, test:\n\n```bash\nunicli init \u003csite\u003e \u003ccommand\u003e     # Scaffold new adapter\nunicli dev \u003cpath\u003e                # Hot-reload during dev\nunicli test \u003csite\u003e               # Validate\nunicli record \u003curl\u003e              # Auto-generate adapter from traffic\n```\n\nFull reference: [`docs/ADAPTER-FORMAT.md`](docs/ADAPTER-FORMAT.md). Migrating from OpenCLI: [`docs/MIGRATING-FROM-OPENCLI.md`](docs/MIGRATING-FROM-OPENCLI.md) and the one-shot `unicli import opencli-yaml`.\n\n## Search\n\nAgents find commands by intent, bilingual:\n\n```bash\nunicli search \"推特热门\"            # → twitter trending\nunicli search \"download video\"      # → bilibili download, yt-dlp download, twitter download\nunicli search \"股票行情\"            # → binance ticker, xueqiu quote, barchart quote\nunicli search --category finance    # browse by category\n```\n\nBM25 + TF-IDF scoring with a 200-entry ZH↔EN alias table. The index is 50KB, queries complete in under 10ms.\n\n## Theory + benchmarks\n\nThe design rests on five principles, each tied to a citation in [`docs/refs.bib`](docs/refs.bib):\n\n1. **Rice's restriction** — every adapter has decidable semantics (YAML pipeline, no Turing-complete logic).\n2. **Lehman's mandate** — no adapter is permanent; self-repair is first-class.\n3. **Shannon's compression** — CLI invocations are near-optimal compression of the underlying API call.\n4. **Agent tool trilemma (original)** — coverage × accuracy × performance, pick two. We choose accuracy × performance.\n5. **Banach convergence** — structured errors must provide directional feedback (`adapter_path` + `step` + `suggestion`) so repair iterations converge.\n\nFull treatment with 42 citations: [`docs/THEORY.md`](docs/THEORY.md). Reproducible benchmarks comparing Uni-CLI to GitHub MCP and Firecrawl MCP: [`docs/BENCHMARK.md`](docs/BENCHMARK.md).\n\n## Development\n\n```bash\ngit clone https://github.com/olo-dot-io/Uni-CLI.git \u0026\u0026 cd Uni-CLI\nnpm install\nnpm run verify     # typecheck + lint + test + build + stats check\n```\n\n| Command                | Purpose                                                   |\n| ---------------------- | --------------------------------------------------------- |\n| `npm run dev`          | Run from source                                           |\n| `npm run build`        | Production build                                          |\n| `npm run typecheck`    | TypeScript strict                                         |\n| `npm run lint`         | Oxlint                                                    |\n| `npm run test`         | Unit tests (\u003c!-- STATS:test_count --\u003e7083\u003c!-- /STATS --\u003e) |\n| `npm run test:adapter` | Validate all adapters                                     |\n| `npm run verify`       | Full pipeline (7 gates)                                   |\n\nSeven production dependencies: `chalk`, `cli-table3`, `commander`, `js-yaml`, `turndown`, `undici`, `ws`.\n\n## Release cadence\n\nPatches ship every **Friday 09:00 HKT** when substantive commits have landed since the last tag. Quiet weeks are recorded and skipped — silence is success, not failure. Dependabot bumps are grouped into one PR per Monday so they ride along in the Friday cut without flooding the commit log.\n\n\u003ca href=\"https://github.com/olo-dot-io/Uni-CLI/commits/main\"\u003e\u003cimg src=\"https://img.shields.io/github/last-commit/olo-dot-io/Uni-CLI?style=flat-square\u0026label=last-commit\" alt=\"last commit\"\u003e\u003c/a\u003e\n\nFull policy — manual overrides, cancellation procedure, escalation rules: [`docs/RELEASE-CADENCE.md`](docs/RELEASE-CADENCE.md).\n\n## Contributing\n\nThe fastest path to a merged PR: write a 20-line YAML adapter for a site you use every day. Per-domain guides live in [`contributing/`](contributing/):\n\n| Area             | Guide                                                    |\n| ---------------- | -------------------------------------------------------- |\n| New adapter      | [`contributing/adapter.md`](contributing/adapter.md)     |\n| New transport    | [`contributing/transport.md`](contributing/transport.md) |\n| CUA backend      | [`contributing/cua.md`](contributing/cua.md)             |\n| MCP server       | [`contributing/mcp.md`](contributing/mcp.md)             |\n| ACP integration  | [`contributing/acp.md`](contributing/acp.md)             |\n| Release process  | [`contributing/release.md`](contributing/release.md)     |\n| Schema migration | [`contributing/schema.md`](contributing/schema.md)       |\n\n## License\n\n[Apache-2.0](./LICENSE)\n\nRepo: \u003chttps://github.com/olo-dot-io/Uni-CLI\u003e · npm: [`@zenalexa/unicli`](https://www.npmjs.com/package/@zenalexa/unicli) · Issues welcome.\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/olo-dot-io/Uni-CLI/graphs/contributors\"\u003e\n    \u003cimg src=\"https://contrib.rocks/image?repo=olo-dot-io/Uni-CLI\" alt=\"Contributors\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003ev0.213.3 — Vostok · Gagarin TC0 Patch R2\u003c/sub\u003e\u003cbr\u003e\n  \u003csub\u003e\u003c!-- STATS:site_count --\u003e200\u003c!-- /STATS --\u003e sites · \u003c!-- STATS:command_count --\u003e968\u003c!-- /STATS --\u003e commands · \u003c!-- STATS:pipeline_step_count --\u003e54\u003c!-- /STATS --\u003e pipeline steps · BM25+TF-IDF bilingual search · MCP 2025-11-25 · \u003c!-- STATS:test_count --\u003e7083\u003c!-- /STATS --\u003e tests\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"}