@zenalexa/unicli 0.209.0 → 0.211.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +75 -20
- package/README.md +832 -285
- package/dist/adapters/cursor/cursor.d.ts +2 -1
- package/dist/adapters/cursor/cursor.d.ts.map +1 -1
- package/dist/adapters/cursor/cursor.js +87 -1
- package/dist/adapters/cursor/cursor.js.map +1 -1
- package/dist/adapters/discord-app/discord-app.d.ts +1 -1
- package/dist/adapters/discord-app/discord-app.js +94 -1
- package/dist/adapters/discord-app/discord-app.js.map +1 -1
- package/dist/browser/bridge.d.ts +45 -0
- package/dist/browser/bridge.d.ts.map +1 -1
- package/dist/browser/bridge.js +94 -1
- package/dist/browser/bridge.js.map +1 -1
- package/dist/browser/cdp-client.d.ts +24 -1
- package/dist/browser/cdp-client.d.ts.map +1 -1
- package/dist/browser/cdp-client.js +56 -2
- package/dist/browser/cdp-client.js.map +1 -1
- package/dist/browser/launcher.d.ts +5 -0
- package/dist/browser/launcher.d.ts.map +1 -1
- package/dist/browser/launcher.js +7 -0
- package/dist/browser/launcher.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +72 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts +14 -3
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +369 -140
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/browser.d.ts.map +1 -1
- package/dist/commands/browser.js +79 -1
- package/dist/commands/browser.js.map +1 -1
- package/dist/commands/ext.d.ts +11 -0
- package/dist/commands/ext.d.ts.map +1 -0
- package/dist/commands/ext.js +122 -0
- package/dist/commands/ext.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -4
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +47 -62
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/schema.d.ts +12 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +72 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/search.d.ts +12 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +47 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skills.d.ts +2 -3
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +2 -3
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/status.d.ts +12 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +137 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/discovery/aliases.d.ts +31 -0
- package/dist/discovery/aliases.d.ts.map +1 -0
- package/dist/discovery/aliases.js +477 -0
- package/dist/discovery/aliases.js.map +1 -0
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +25 -0
- package/dist/discovery/loader.js.map +1 -1
- package/dist/discovery/search.d.ts +73 -0
- package/dist/discovery/search.d.ts.map +1 -0
- package/dist/discovery/search.js +355 -0
- package/dist/discovery/search.js.map +1 -0
- package/dist/engine/yaml-runner.d.ts +10 -0
- package/dist/engine/yaml-runner.d.ts.map +1 -1
- package/dist/engine/yaml-runner.js +51 -3
- package/dist/engine/yaml-runner.js.map +1 -1
- package/dist/hub/index.d.ts +37 -0
- package/dist/hub/index.d.ts.map +1 -0
- package/dist/hub/index.js +98 -0
- package/dist/hub/index.js.map +1 -0
- package/dist/hub/passthrough.d.ts +21 -0
- package/dist/hub/passthrough.d.ts.map +1 -0
- package/dist/hub/passthrough.js +71 -0
- package/dist/hub/passthrough.js.map +1 -0
- package/dist/manifest-compact.txt +15 -0
- package/dist/manifest-search.json +1 -0
- package/dist/manifest.json +2163 -268
- package/dist/mcp/oauth.d.ts +33 -0
- package/dist/mcp/oauth.d.ts.map +1 -0
- package/dist/mcp/oauth.js +220 -0
- package/dist/mcp/oauth.js.map +1 -0
- package/dist/mcp/schema.d.ts +65 -0
- package/dist/mcp/schema.d.ts.map +1 -0
- package/dist/mcp/schema.js +136 -0
- package/dist/mcp/schema.js.map +1 -0
- package/dist/mcp/server.d.ts +23 -10
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +350 -182
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/sse-transport.d.ts +34 -0
- package/dist/mcp/sse-transport.d.ts.map +1 -0
- package/dist/mcp/sse-transport.js +182 -0
- package/dist/mcp/sse-transport.js.map +1 -0
- package/dist/mcp/streamable-http.d.ts +64 -0
- package/dist/mcp/streamable-http.d.ts.map +1 -0
- package/dist/mcp/streamable-http.js +312 -0
- package/dist/mcp/streamable-http.js.map +1 -0
- package/dist/permissions/sensitive-paths.js +2 -2
- package/dist/permissions/sensitive-paths.js.map +1 -1
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +8 -7
- package/src/adapters/1688/_site.json +9 -0
- package/src/adapters/36kr/latest.yaml +36 -0
- package/src/adapters/arxiv/trending.yaml +37 -0
- package/src/adapters/baidu/hot.yaml +37 -0
- package/src/adapters/baidu/search.yaml +41 -0
- package/src/adapters/barchart/_site.json +10 -0
- package/src/adapters/bbc/technology.yaml +26 -0
- package/src/adapters/bbc/top.yaml +26 -0
- package/src/adapters/bbc/world.yaml +26 -0
- package/src/adapters/bilibili/coin.yaml +33 -0
- package/src/adapters/bilibili/later.yaml +31 -0
- package/src/adapters/bilibili/live.yaml +41 -0
- package/src/adapters/bilibili/trending.yaml +29 -0
- package/src/adapters/binance/hot.yaml +39 -0
- package/src/adapters/binance/kline.yaml +35 -0
- package/src/adapters/binance/ticker.yaml +33 -0
- package/src/adapters/bluesky/likes.yaml +35 -0
- package/src/adapters/bluesky/notifications.yaml +30 -0
- package/src/adapters/bluesky/post.yaml +25 -0
- package/src/adapters/chrome/bookmarks.yaml +26 -0
- package/src/adapters/chrome/tabs.yaml +25 -0
- package/src/adapters/cnki/search.yaml +40 -0
- package/src/adapters/cnn/technology.yaml +26 -0
- package/src/adapters/cocoapods/info.yaml +33 -0
- package/src/adapters/coinbase/prices.yaml +27 -0
- package/src/adapters/coinbase/rates.yaml +24 -0
- package/src/adapters/coupang/hot.yaml +29 -0
- package/src/adapters/crates-io/info.yaml +29 -0
- package/src/adapters/crates-io/versions.yaml +33 -0
- package/src/adapters/ctrip/hot.yaml +28 -0
- package/src/adapters/cursor/cursor.ts +91 -1
- package/src/adapters/dangdang/hot.yaml +38 -0
- package/src/adapters/dangdang/search.yaml +43 -0
- package/src/adapters/deepseek/chat.yaml +33 -0
- package/src/adapters/deepseek/models.yaml +18 -0
- package/src/adapters/devto/latest.yaml +29 -0
- package/src/adapters/devto/search.yaml +34 -0
- package/src/adapters/dianping/hot.yaml +43 -0
- package/src/adapters/dianping/search.yaml +48 -0
- package/src/adapters/discord-app/discord-app.ts +99 -1
- package/src/adapters/docker/networks.yaml +20 -0
- package/src/adapters/docker/volumes.yaml +19 -0
- package/src/adapters/docker-hub/info.yaml +26 -0
- package/src/adapters/docker-hub/tags.yaml +34 -0
- package/src/adapters/douban/group-hot.yaml +29 -0
- package/src/adapters/douban/new-movies.yaml +32 -0
- package/src/adapters/douban/tv-hot.yaml +32 -0
- package/src/adapters/doubao/ask.yaml +64 -0
- package/src/adapters/doubao/new.yaml +18 -0
- package/src/adapters/doubao/status.yaml +21 -0
- package/src/adapters/douyu/hot.yaml +34 -0
- package/src/adapters/douyu/search.yaml +42 -0
- package/src/adapters/eastmoney/fund.yaml +36 -0
- package/src/adapters/eastmoney/market.yaml +26 -0
- package/src/adapters/ele/hot.yaml +40 -0
- package/src/adapters/ele/search.yaml +47 -0
- package/src/adapters/exchangerate/list.yaml +25 -0
- package/src/adapters/facebook/marketplace.yaml +43 -0
- package/src/adapters/facebook/post.yaml +29 -0
- package/src/adapters/futu/hot.yaml +49 -0
- package/src/adapters/futu/quote.yaml +46 -0
- package/src/adapters/gitee/repos.yaml +34 -0
- package/src/adapters/github-trending/developers.yaml +33 -0
- package/src/adapters/github-trending/weekly.yaml +34 -0
- package/src/adapters/gitlab/projects.yaml +34 -0
- package/src/adapters/godot/scene-export.yaml +1 -1
- package/src/adapters/hackernews/comments.yaml +36 -0
- package/src/adapters/hackernews/item.yaml +28 -0
- package/src/adapters/hf/datasets.yaml +34 -0
- package/src/adapters/hf/spaces.yaml +34 -0
- package/src/adapters/homebrew/search.yaml +27 -0
- package/src/adapters/huggingface-papers/search.yaml +33 -0
- package/src/adapters/imdb/box-office.yaml +28 -0
- package/src/adapters/infoq/latest.yaml +26 -0
- package/src/adapters/instagram/activity.yaml +45 -0
- package/src/adapters/instagram/highlights.yaml +48 -0
- package/src/adapters/instagram/reels-trending.yaml +51 -0
- package/src/adapters/instagram/reels.yaml +34 -0
- package/src/adapters/instagram/stories.yaml +29 -0
- package/src/adapters/instagram/suggested.yaml +40 -0
- package/src/adapters/instagram/tags.yaml +52 -0
- package/src/adapters/itch-io/search.yaml +35 -0
- package/src/adapters/itch-io/top.yaml +31 -0
- package/src/adapters/ithome/hot.yaml +27 -0
- package/src/adapters/ithome/latest.yaml +26 -0
- package/src/adapters/jd/_site.json +9 -0
- package/src/adapters/jianyu/search.yaml +42 -0
- package/src/adapters/ke/ershoufang.yaml +75 -0
- package/src/adapters/ke/xiaoqu.yaml +73 -0
- package/src/adapters/kuaishou/hot.yaml +39 -0
- package/src/adapters/kuaishou/search.yaml +44 -0
- package/src/adapters/linkedin/_site.json +10 -0
- package/src/adapters/linkedin/jobs.yaml +47 -0
- package/src/adapters/lobsters/search.yaml +35 -0
- package/src/adapters/macos/active-app.yaml +16 -0
- package/src/adapters/macos/apps-list.yaml +14 -0
- package/src/adapters/macos/apps.yaml +31 -0
- package/src/adapters/macos/battery.yaml +26 -0
- package/src/adapters/macos/bluetooth.yaml +14 -0
- package/src/adapters/macos/brightness.yaml +22 -0
- package/src/adapters/macos/caffeinate.yaml +25 -0
- package/src/adapters/macos/calendar-create.yaml +81 -0
- package/src/adapters/macos/calendar-list.yaml +53 -0
- package/src/adapters/macos/calendar-today.yaml +30 -0
- package/src/adapters/macos/clipboard.yaml +23 -0
- package/src/adapters/macos/contacts-search.yaml +59 -0
- package/src/adapters/macos/dark-mode.yaml +19 -0
- package/src/adapters/macos/disk-info.yaml +31 -0
- package/src/adapters/macos/disk-usage.yaml +14 -0
- package/src/adapters/macos/do-not-disturb.yaml +21 -0
- package/src/adapters/macos/empty-trash.yaml +16 -0
- package/src/adapters/macos/finder-copy.yaml +40 -0
- package/src/adapters/macos/finder-move.yaml +40 -0
- package/src/adapters/macos/finder-new-folder.yaml +36 -0
- package/src/adapters/macos/finder-recent.yaml +24 -0
- package/src/adapters/macos/finder-selection.yaml +22 -0
- package/src/adapters/macos/finder-tags.yaml +40 -0
- package/src/adapters/macos/lock-screen.yaml +16 -0
- package/src/adapters/macos/mail-send.yaml +54 -0
- package/src/adapters/macos/mail-status.yaml +38 -0
- package/src/adapters/macos/messages-send.yaml +42 -0
- package/src/adapters/macos/music-control.yaml +43 -0
- package/src/adapters/macos/music-now.yaml +34 -0
- package/src/adapters/macos/notes-list.yaml +30 -0
- package/src/adapters/macos/notes-search.yaml +45 -0
- package/src/adapters/macos/notification.yaml +27 -0
- package/src/adapters/macos/notify.yaml +46 -0
- package/src/adapters/macos/open-app.yaml +21 -0
- package/src/adapters/macos/open.yaml +24 -0
- package/src/adapters/macos/photos-search.yaml +44 -0
- package/src/adapters/macos/processes.yaml +14 -0
- package/src/adapters/macos/reminder-create.yaml +75 -0
- package/src/adapters/macos/reminders-complete.yaml +33 -0
- package/src/adapters/macos/reminders-list.yaml +28 -0
- package/src/adapters/macos/safari-history.yaml +23 -0
- package/src/adapters/macos/safari-tabs.yaml +26 -0
- package/src/adapters/macos/safari-url.yaml +22 -0
- package/src/adapters/macos/say.yaml +36 -0
- package/src/adapters/macos/screen-lock.yaml +16 -0
- package/src/adapters/macos/screen-recording.yaml +32 -0
- package/src/adapters/macos/screenshot.yaml +34 -0
- package/src/adapters/macos/shortcuts-list.yaml +14 -0
- package/src/adapters/macos/shortcuts-run.yaml +28 -0
- package/src/adapters/macos/sleep.yaml +14 -0
- package/src/adapters/macos/spotlight.yaml +43 -0
- package/src/adapters/macos/system-info.yaml +32 -0
- package/src/adapters/macos/trash.yaml +32 -0
- package/src/adapters/macos/uptime.yaml +14 -0
- package/src/adapters/macos/volume.yaml +19 -0
- package/src/adapters/macos/wallpaper.yaml +33 -0
- package/src/adapters/macos/wifi-info.yaml +14 -0
- package/src/adapters/macos/wifi.yaml +63 -0
- package/src/adapters/maimai/search.yaml +62 -0
- package/src/adapters/maoyan/hot.yaml +33 -0
- package/src/adapters/maoyan/search.yaml +40 -0
- package/src/adapters/mastodon/timeline.yaml +33 -0
- package/src/adapters/mastodon/user.yaml +32 -0
- package/src/adapters/medium/article.yaml +22 -0
- package/src/adapters/medium/trending.yaml +30 -0
- package/src/adapters/meituan/hot.yaml +26 -0
- package/src/adapters/mubu/list.yaml +36 -0
- package/src/adapters/mubu/search.yaml +54 -0
- package/src/adapters/netease-music/playlist.yaml +34 -0
- package/src/adapters/netease-music/top.yaml +33 -0
- package/src/adapters/notion/databases.yaml +41 -0
- package/src/adapters/notion/pages.yaml +44 -0
- package/src/adapters/notion/search.yaml +41 -0
- package/src/adapters/npm/downloads.yaml +28 -0
- package/src/adapters/npm/info.yaml +25 -0
- package/src/adapters/npm/search.yaml +35 -0
- package/src/adapters/npm/versions.yaml +33 -0
- package/src/adapters/npm-trends/trending.yaml +17 -0
- package/src/adapters/nytimes/search.yaml +35 -0
- package/src/adapters/obsidian/daily.yaml +23 -0
- package/src/adapters/obsidian/open.yaml +26 -0
- package/src/adapters/obsidian/search.yaml +28 -0
- package/src/adapters/ollama/generate.yaml +33 -0
- package/src/adapters/ollama/models.yaml +29 -0
- package/src/adapters/ollama/ps.yaml +20 -0
- package/src/adapters/openrouter/search.yaml +31 -0
- package/src/adapters/perplexity/ask.yaml +33 -0
- package/src/adapters/pexels/curated.yaml +31 -0
- package/src/adapters/pinduoduo/search.yaml +36 -0
- package/src/adapters/producthunt/search.yaml +41 -0
- package/src/adapters/pypi/search.yaml +37 -0
- package/src/adapters/pypi/versions.yaml +31 -0
- package/src/adapters/quark/ls.yaml +39 -0
- package/src/adapters/quark/search.yaml +39 -0
- package/src/adapters/qweather/forecast.yaml +37 -0
- package/src/adapters/reddit/new.yaml +34 -0
- package/src/adapters/reddit/rising.yaml +33 -0
- package/src/adapters/reddit/top.yaml +40 -0
- package/src/adapters/reddit/trending.yaml +25 -0
- package/src/adapters/replicate/run.yaml +39 -0
- package/src/adapters/reuters/_site.json +9 -0
- package/src/adapters/reuters/latest.yaml +26 -0
- package/src/adapters/sinablog/_site.json +9 -0
- package/src/adapters/sinafinance/market.yaml +21 -0
- package/src/adapters/slack/messages.yaml +41 -0
- package/src/adapters/slack/post.yaml +32 -0
- package/src/adapters/slack/search.yaml +28 -0
- package/src/adapters/slack/send.yaml +35 -0
- package/src/adapters/slack/status.yaml +19 -0
- package/src/adapters/slack/users.yaml +37 -0
- package/src/adapters/slock/servers.yaml +32 -0
- package/src/adapters/smzdm/_site.json +9 -0
- package/src/adapters/spotify/now-playing.yaml +28 -0
- package/src/adapters/spotify/playlists.yaml +37 -0
- package/src/adapters/spotify/top-tracks.yaml +42 -0
- package/src/adapters/stackoverflow/question.yaml +34 -0
- package/src/adapters/stackoverflow/tags.yaml +30 -0
- package/src/adapters/steam/app-details.yaml +32 -0
- package/src/adapters/steam/new-releases.yaml +28 -0
- package/src/adapters/steam/search.yaml +36 -0
- package/src/adapters/steam/specials.yaml +29 -0
- package/src/adapters/steam/wishlist.yaml +36 -0
- package/src/adapters/substack/trending.yaml +28 -0
- package/src/adapters/taobao/hot.yaml +31 -0
- package/src/adapters/taobao/search.yaml +44 -0
- package/src/adapters/techcrunch/search.yaml +33 -0
- package/src/adapters/theverge/search.yaml +33 -0
- package/src/adapters/threads/hot.yaml +44 -0
- package/src/adapters/threads/search.yaml +47 -0
- package/src/adapters/tiktok/trending.yaml +28 -0
- package/src/adapters/toutiao/hot.yaml +31 -0
- package/src/adapters/toutiao/search.yaml +47 -0
- package/src/adapters/twitch/games.yaml +31 -0
- package/src/adapters/twitch/search.yaml +39 -0
- package/src/adapters/twitch/streams.yaml +38 -0
- package/src/adapters/twitter/lists.yaml +49 -0
- package/src/adapters/twitter/media.yaml +48 -0
- package/src/adapters/twitter/mentions.yaml +38 -0
- package/src/adapters/twitter/mute.yaml +42 -0
- package/src/adapters/twitter/pin.yaml +43 -0
- package/src/adapters/twitter/quotes.yaml +43 -0
- package/src/adapters/twitter/retweets.yaml +44 -0
- package/src/adapters/twitter/spaces.yaml +43 -0
- package/src/adapters/twitter/unmute.yaml +42 -0
- package/src/adapters/unsplash/random.yaml +27 -0
- package/src/adapters/v2ex/search.yaml +36 -0
- package/src/adapters/vscode/extensions.yaml +23 -0
- package/src/adapters/vscode/install-ext.yaml +26 -0
- package/src/adapters/vscode/open.yaml +25 -0
- package/src/adapters/wechat-channels/hot.yaml +39 -0
- package/src/adapters/wechat-channels/search.yaml +57 -0
- package/src/adapters/weibo/trending.yaml +28 -0
- package/src/adapters/weixin/_site.json +9 -0
- package/src/adapters/weixin/hot.yaml +22 -0
- package/src/adapters/wikipedia/today.yaml +25 -0
- package/src/adapters/xiaohongshu/follow.yaml +35 -0
- package/src/adapters/xiaohongshu/hashtag.yaml +44 -0
- package/src/adapters/xiaohongshu/hot.yaml +34 -0
- package/src/adapters/xiaohongshu/like.yaml +27 -0
- package/src/adapters/xiaohongshu/profile.yaml +39 -0
- package/src/adapters/xiaohongshu/save.yaml +27 -0
- package/src/adapters/xiaohongshu/suggest.yaml +34 -0
- package/src/adapters/xiaohongshu/trending.yaml +35 -0
- package/src/adapters/xiaohongshu/unfollow.yaml +40 -0
- package/src/adapters/xueqiu/market.yaml +25 -0
- package/src/adapters/yahoo-finance/quote.yaml +35 -0
- package/src/adapters/yahoo-finance/search.yaml +42 -0
- package/src/adapters/yahoo-finance/trending.yaml +30 -0
- package/src/adapters/youtube/playlist.yaml +43 -0
- package/src/adapters/youtube/shorts.yaml +42 -0
- package/src/adapters/youtube/trending.yaml +41 -0
- package/src/adapters/zhihu/answer.yaml +29 -0
- package/src/adapters/zhihu/answers.yaml +38 -0
- package/src/adapters/zhihu/article.yaml +27 -0
- package/src/adapters/zhihu/articles.yaml +38 -0
- package/src/adapters/zhihu/collections.yaml +37 -0
- package/src/adapters/zhihu/columns.yaml +38 -0
- package/src/adapters/zhihu/comment.yaml +42 -0
- package/src/adapters/zhihu/followers.yaml +37 -0
- package/src/adapters/zhihu/following.yaml +37 -0
- package/src/adapters/zhihu/pins.yaml +37 -0
- package/src/adapters/zhihu/topic.yaml +35 -0
- package/src/adapters/zhihu/topics.yaml +37 -0
- package/src/adapters/zhihu/trending.yaml +36 -0
- package/src/adapters/zhihu/user.yaml +30 -0
- package/src/adapters/zoom/join.yaml +24 -0
- package/src/adapters/zoom/start.yaml +17 -0
- package/src/hub/external-clis.yaml +343 -0
- package/src/hub/index.ts +128 -0
- package/src/hub/passthrough.ts +85 -0
- package/src/adapters/1688/manifest.yaml +0 -7
- package/src/adapters/barchart/manifest.yaml +0 -8
- package/src/adapters/jd/manifest.yaml +0 -7
- package/src/adapters/linkedin/manifest.yaml +0 -8
- package/src/adapters/reuters/manifest.yaml +0 -7
- package/src/adapters/sinablog/manifest.yaml +0 -7
- package/src/adapters/smzdm/manifest.yaml +0 -7
- package/src/adapters/weixin/manifest.yaml +0 -7
package/README.md
CHANGED
|
@@ -1,342 +1,883 @@
|
|
|
1
|
-
<!-- AGENT: npm install -g @zenalexa/unicli && unicli
|
|
1
|
+
<!-- AGENT: npm install -g @zenalexa/unicli && unicli search "your intent" | 1020 commands across 198 sites. JSON when piped. Self-repairing YAML adapters. Bilingual search (EN/ZH). See AGENTS.md -->
|
|
2
2
|
|
|
3
|
-
<
|
|
3
|
+
<div align="center">
|
|
4
4
|
|
|
5
|
-
<
|
|
6
|
-
<
|
|
7
|
-
|
|
5
|
+
<picture>
|
|
6
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logo-dark.svg">
|
|
7
|
+
<source media="(prefers-color-scheme: light)" srcset="assets/logo-light.svg">
|
|
8
|
+
<img alt="Uni-CLI" src="assets/logo-light.svg" width="420">
|
|
9
|
+
</picture>
|
|
8
10
|
|
|
9
|
-
<
|
|
10
|
-
<a href="https://www.npmjs.com/package/@zenalexa/unicli"><img src="https://img.shields.io/npm/v/@zenalexa/unicli?style=flat-square" alt="npm"></a>
|
|
11
|
-
<a href="https://nodejs.org"><img src="https://img.shields.io/node/v/@zenalexa/unicli?style=flat-square" alt="Node.js"></a>
|
|
12
|
-
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache--2.0-blue?style=flat-square" alt="Apache-2.0"></a>
|
|
13
|
-
</p>
|
|
11
|
+
<br><br>
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
167 sites · 756 commands · 35 pipeline steps · 29 template filters · Zero runtime dependencies beyond Node.js
|
|
17
|
-
</p>
|
|
13
|
+
**The compiler that turns the internet into CLI commands for AI agents.**
|
|
18
14
|
|
|
19
|
-
|
|
15
|
+
<br>
|
|
20
16
|
|
|
21
|
-
|
|
17
|
+
<img src="https://img.shields.io/badge/198_sites-1020_commands-00d4aa?style=flat-square" alt="coverage">
|
|
18
|
+
<img src="https://img.shields.io/badge/~80_tokens-per_call-E8A838?style=flat-square" alt="tokens">
|
|
19
|
+
<img src="https://img.shields.io/badge/self--repairing-YAML_adapters-8B5CF6?style=flat-square" alt="self-repair">
|
|
20
|
+
<a href="https://www.npmjs.com/package/@zenalexa/unicli"><img src="https://img.shields.io/npm/v/@zenalexa/unicli?style=flat-square&color=cb3837" alt="npm"></a>
|
|
21
|
+
<a href="https://github.com/olo-dot-io/Uni-CLI/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/olo-dot-io/Uni-CLI/ci.yml?style=flat-square&label=CI" alt="CI"></a>
|
|
22
|
+
<a href="./LICENSE"><img src="https://img.shields.io/github/license/olo-dot-io/Uni-CLI?style=flat-square" alt="license"></a>
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
<br><br>
|
|
24
25
|
|
|
25
|
-
```
|
|
26
|
+
```
|
|
26
27
|
npm install -g @zenalexa/unicli
|
|
27
|
-
unicli hackernews top --limit 5 # Public API
|
|
28
|
-
unicli bilibili hot # Chinese platform
|
|
29
|
-
unicli twitter search "AI agents" # Authenticated
|
|
30
|
-
unicli blender render scene.blend # Desktop software
|
|
31
|
-
unicli cursor ask "explain this code" # Electron app
|
|
32
28
|
```
|
|
33
29
|
|
|
34
|
-
|
|
30
|
+
</div>
|
|
35
31
|
|
|
36
|
-
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
unicli search "推特热门" # Bilingual discovery → twitter trending
|
|
36
|
+
unicli hackernews top --limit 5 # Hacker News front page
|
|
37
|
+
unicli twitter search "AI agents" # Twitter (authenticated)
|
|
38
|
+
unicli bilibili hot # Bilibili trending
|
|
39
|
+
unicli blender render scene.blend # Render a 3D scene
|
|
40
|
+
unicli notion search "meeting notes" # Search Notion
|
|
41
|
+
unicli macos screenshot # macOS screenshot
|
|
42
|
+
unicli ffmpeg compress video.mp4 # Compress video
|
|
43
|
+
```
|
|
37
44
|
|
|
38
|
-
|
|
39
|
-
| ----------------------------- | ---------------------------------- | ----------------------------------- | ---------------------------------------------------- |
|
|
40
|
-
| **opencli** (14K) | TypeScript adapter hub | The genome — Uni-CLI extends it | Uni-CLI = 35 pipeline steps vs 15, +eval, +repair |
|
|
41
|
-
| **CLI-Anything** (29K, HKUDS) | Python adapter hub + skill gen | Desktop-app coverage (44 harnesses) | Uni-CLI = 167 sites web breadth, single-binary |
|
|
42
|
-
| **browser-use** (86K) | Python library, LLM per step | Open-ended browser tasks | Different shape — embed vs invoke |
|
|
43
|
-
| **goose** (38K, MCP-first) | MCP-host runtime | MCP-only environments | `unicli mcp serve` mounts as MCP server |
|
|
44
|
-
| **hermes-agent** (30K) | Agent w/ memory + multi-platform | Long-running personal agent | Different category — hermes is agent, Uni-CLI = tool |
|
|
45
|
-
| **Stagehand** | Browser-only `observe/act/extract` | Vision-grounded web tasks | Uni-CLI v0.209 ships `unicli operate observe` |
|
|
45
|
+
Every command outputs **structured JSON when piped** — zero flags needed. Every error emits structured JSON to stderr with the adapter path, the failing step, and a fix suggestion. **~80 tokens per call.**
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
```mermaid
|
|
48
|
+
graph LR
|
|
49
|
+
A[AI Agent] -->|"unicli search 'intent'"| B["Uni-CLI"]
|
|
50
|
+
B --> C["YAML Adapter<br>~20 lines"]
|
|
51
|
+
C --> D["Web API"]
|
|
52
|
+
C --> E["Chrome CDP"]
|
|
53
|
+
C --> F["Subprocess"]
|
|
54
|
+
B -.->|self-repair| C
|
|
55
|
+
```
|
|
48
56
|
|
|
49
|
-
|
|
50
|
-
| ------------------- | --------------------------------------- | ---------------------------------------- |
|
|
51
|
-
| Cost per invocation | 550–1,400 tokens (tool definition) | ~80 tokens |
|
|
52
|
-
| Context overhead | 3 servers = 72% of 200K window consumed | Zero |
|
|
53
|
-
| Composability | Single-tool calls | Unix pipes, `jq`, shell scripts |
|
|
54
|
-
| Self-repair | Agents cannot read server source | Agent reads 20-line YAML, edits, retries |
|
|
55
|
-
| Universality | Requires MCP client support | Every agent has Bash |
|
|
56
|
-
| Auth reuse | Per-server configuration | Chrome login sessions via daemon |
|
|
57
|
+
## Key Ideas
|
|
57
58
|
|
|
58
|
-
|
|
59
|
+
**Universal** — 198 sites, 30+ desktop apps, 8 Electron apps, 35 CLI bridges, 51 macOS system commands. One interface: `unicli <site> <command>`.
|
|
59
60
|
|
|
60
|
-
|
|
61
|
+
**Discoverable** — BM25 bilingual search engine. `unicli search "推特热门"` finds `twitter trending`. `unicli search "download video"` finds `bilibili download`. Agents find what they need in one call.
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
YAML Adapter TS Adapter Bridge (passthrough)
|
|
68
|
-
(20 lines) (complex logic) (gh, docker, vercel)
|
|
69
|
-
│ │ │
|
|
70
|
-
▼ ▼ ▼
|
|
71
|
-
┌─────────────────────────────────────────┐
|
|
72
|
-
│ Pipeline Engine (30 steps) │
|
|
73
|
-
│ fetch · navigate · evaluate · click │
|
|
74
|
-
│ type · press · scroll · wait · tap │
|
|
75
|
-
│ intercept · snapshot · download │
|
|
76
|
-
│ websocket · exec · write_temp · ... │
|
|
77
|
-
└─────────┬───────────────┬───────────────┘
|
|
78
|
-
│ │
|
|
79
|
-
┌─────────▼─────┐ ┌───────▼───────┐
|
|
80
|
-
│ Direct CDP │ │ Daemon │
|
|
81
|
-
│ (fast, local)│ │ (persistent, │
|
|
82
|
-
│ │ │ reuses Chrome │
|
|
83
|
-
│ │ │ login state) │
|
|
84
|
-
└───────────────┘ └───────────────┘
|
|
85
|
-
│ │
|
|
86
|
-
┌─────────▼───────────────▼───────┐
|
|
87
|
-
│ Output Formatter │
|
|
88
|
-
│ table · json · yaml · csv · md │
|
|
89
|
-
│ (auto-JSON when piped) │
|
|
90
|
-
└─────────────────────────────────┘
|
|
91
|
-
```
|
|
63
|
+
**Self-repairing** — When a site changes its API, the agent reads the ~20 line YAML adapter, fixes it, retries. No human in the loop. Fixes persist across updates.
|
|
64
|
+
|
|
65
|
+
**Agent-native** — Piped output auto-switches to JSON. Errors are machine-parseable. Exit codes follow `sysexits.h`. The agent doesn't need flags or special handling.
|
|
66
|
+
|
|
67
|
+
**Cheap** — ~80 tokens per CLI invocation vs 55,000 tokens for an MCP tool catalog. Three orders of magnitude cheaper in context window cost.
|
|
92
68
|
|
|
93
69
|
## Self-Repair
|
|
94
70
|
|
|
95
|
-
|
|
71
|
+
The core differentiator. When a command breaks, agents fix it themselves:
|
|
96
72
|
|
|
73
|
+
```mermaid
|
|
74
|
+
flowchart LR
|
|
75
|
+
A["unicli site cmd\n❌ fails"] --> B["Structured error\n{adapter_path, step, suggestion}"]
|
|
76
|
+
B --> C["Agent reads\n20-line YAML"]
|
|
77
|
+
C --> D["Agent edits\nthe adapter"]
|
|
78
|
+
D --> E["unicli site cmd\n✅ works"]
|
|
79
|
+
E --> F["Fix persists in\n~/.unicli/adapters/"]
|
|
97
80
|
```
|
|
98
|
-
unicli <site> <cmd> fails
|
|
99
|
-
→ structured error JSON: { adapter_path, step, action, suggestion }
|
|
100
|
-
→ agent reads the 20-line YAML at that path
|
|
101
|
-
→ agent edits the YAML (selector changed, API versioned, auth rotated)
|
|
102
|
-
→ agent retries → fixed
|
|
103
|
-
→ fix persists in ~/.unicli/adapters/ (survives npm update)
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
Verification: `unicli repair <site> <command>` diagnoses, `unicli test [site]` validates.
|
|
107
|
-
|
|
108
|
-
## Coverage
|
|
109
|
-
|
|
110
|
-
### Web Platforms (67 sites)
|
|
111
|
-
|
|
112
|
-
| Category | Sites |
|
|
113
|
-
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
|
114
|
-
| **Tech / Dev** | hackernews, stackoverflow, devto, lobsters, producthunt, hf, github-trending, substack, lesswrong |
|
|
115
|
-
| **Social — International** | twitter (25 cmds), reddit (16), instagram (19), tiktok (15), facebook (10), bluesky, medium |
|
|
116
|
-
| **Social — Chinese** | bilibili (13), weibo, zhihu, xiaohongshu (13), douyin (13), jike, douban, weread, tieba, v2ex, linux-do, zsxq, xiaoyuzhou |
|
|
117
|
-
| **Video / Media** | youtube (5), bilibili, douyin, tiktok |
|
|
118
|
-
| **Finance** | xueqiu, sinafinance, barchart, yahoo-finance |
|
|
119
|
-
| **News** | bbc, bloomberg (10), reuters, 36kr, google news |
|
|
120
|
-
| **Shopping** | amazon (8), xianyu, coupang, smzdm, jd |
|
|
121
|
-
| **Jobs** | boss (14), linkedin |
|
|
122
|
-
| **AI Platforms** | gemini (5), grok, doubao-web (9), notebooklm (15), yollomi (12), jimeng, yuanbao |
|
|
123
|
-
| **Education** | chaoxing, arxiv, wikipedia |
|
|
124
|
-
| **Other** | ones (11), band, xiaoe, pixiv (6), hupu (7), ctrip, sinablog, steam, lobsters |
|
|
125
|
-
|
|
126
|
-
### Desktop Software (28 apps)
|
|
127
|
-
|
|
128
|
-
| Category | Apps |
|
|
129
|
-
| ---------------- | ----------------------------------------------------------- |
|
|
130
|
-
| **3D / CAD** | blender (13 cmds), freecad (15), cloudcompare (4), openscad |
|
|
131
|
-
| **Image** | gimp (12), inkscape, imagemagick (6), krita (4) |
|
|
132
|
-
| **Video** | ffmpeg (11), kdenlive (3), shotcut (3), musescore (5) |
|
|
133
|
-
| **Diagram** | drawio, mermaid |
|
|
134
|
-
| **Document** | libreoffice, pandoc |
|
|
135
|
-
| **Audio** | audacity (8) |
|
|
136
|
-
| **Streaming** | obs (8, WebSocket) |
|
|
137
|
-
| **Productivity** | zotero (8) |
|
|
138
|
-
| **Dev Services** | wiremock (5), adguardhome (5), novita (3) |
|
|
139
|
-
| **Game** | slay-the-spire-ii (6, HTTP bridge mod) |
|
|
140
|
-
| **Design** | sketch (3) |
|
|
141
|
-
|
|
142
|
-
### Electron Apps (8 apps, 66 commands)
|
|
143
|
-
|
|
144
|
-
| App | Commands | Method |
|
|
145
|
-
| --------------- | ---------------------------------------------------------------------------------------------- | --------- |
|
|
146
|
-
| **Cursor** | ask, send, read, model, composer, extract-code, new, status, screenshot, dump, history, export | CDP :9226 |
|
|
147
|
-
| **Codex** | ask, send, read, model, extract-diff, new, status, screenshot, dump, history, export | CDP :9222 |
|
|
148
|
-
| **ChatGPT** | ask, send, read, model, new, status, screenshot, dump | CDP :9236 |
|
|
149
|
-
| **Notion** | search, read, write, new, status, sidebar, favorites, export, screenshot | CDP :9230 |
|
|
150
|
-
| **Discord** | servers, channels, read, send, search, members, status | CDP :9232 |
|
|
151
|
-
| **ChatWise** | ask, send, read, model, new, status, screenshot, dump | CDP :9228 |
|
|
152
|
-
| **Doubao** | ask, send, read, new, status, screenshot, dump | CDP :9225 |
|
|
153
|
-
| **Antigravity** | ask, send, read, model, new, status, screenshot, dump | CDP :9234 |
|
|
154
|
-
|
|
155
|
-
### Bridge (passthrough to existing CLIs)
|
|
156
|
-
|
|
157
|
-
docker, gh, jq, yt-dlp, vercel, supabase, wrangler, lark, dingtalk, hf, claude-code, codex-cli, opencode, aws, gcloud, az, doctl, netlify, railway, flyctl, pscale, neonctl, slack
|
|
158
|
-
|
|
159
|
-
## Pipeline Engine
|
|
160
|
-
|
|
161
|
-
30 steps execute in sequence. Each YAML adapter is a pipeline of these steps.
|
|
162
|
-
|
|
163
|
-
| Step | Type | What it does |
|
|
164
|
-
| ------------ | --------- | ----------------------------------------------------------------------------- |
|
|
165
|
-
| `fetch` | API | HTTP JSON with retry, backoff, cookie injection, concurrent fan-out (limit=5) |
|
|
166
|
-
| `fetch_text` | API | HTTP raw text (RSS, HTML, XML) |
|
|
167
|
-
| `parse_rss` | API | RSS 2.0 + Atom feed parser |
|
|
168
|
-
| `html_to_md` | API | HTML → Markdown via Turndown |
|
|
169
|
-
| `select` | Transform | Navigate JSON by dot-path (`data.items[]`) |
|
|
170
|
-
| `map` | Transform | Transform each item via `${{ }}` templates |
|
|
171
|
-
| `filter` | Transform | Keep items matching expression |
|
|
172
|
-
| `sort` | Transform | Sort by field (numeric-aware) |
|
|
173
|
-
| `limit` | Transform | Cap result count |
|
|
174
|
-
| `exec` | Desktop | Run subprocess with stdin, env, file output |
|
|
175
|
-
| `write_temp` | Desktop | Create ephemeral script file |
|
|
176
|
-
| `navigate` | Browser | Navigate Chrome to URL via CDP |
|
|
177
|
-
| `evaluate` | Browser | Execute JS in page context |
|
|
178
|
-
| `click` | Browser | Click element by CSS selector |
|
|
179
|
-
| `type` | Browser | Type text into input |
|
|
180
|
-
| `press` | Browser | Keyboard key with modifiers (Ctrl+A, Enter) |
|
|
181
|
-
| `wait` | Browser | Wait for time, selector, or text |
|
|
182
|
-
| `scroll` | Browser | Direction scroll, auto-scroll to bottom |
|
|
183
|
-
| `intercept` | Browser | Capture fetch + XHR responses (dual-patched, stealthed) |
|
|
184
|
-
| `snapshot` | Browser | DOM accessibility tree with interactive refs |
|
|
185
|
-
| `tap` | Browser | Vue Store Action Bridge (Pinia/Vuex → capture network) |
|
|
186
|
-
| `download` | Media | HTTP + yt-dlp, batch concurrent, skip_existing |
|
|
187
|
-
| `websocket` | Service | WebSocket connect/send/receive (OBS auth support) |
|
|
188
|
-
| `set` | Control | Store variables into `vars` context for templates |
|
|
189
|
-
| `if` | Control | Conditional execution of sub-pipeline branches |
|
|
190
|
-
| `append` | Control | Push ctx.data into vars array for accumulation |
|
|
191
|
-
| `each` | Control | Loop sub-pipeline with do-while + max iteration limit |
|
|
192
|
-
| `parallel` | Control | Run sub-pipelines concurrently with merge strategies |
|
|
193
|
-
| `rate_limit` | Control | Per-domain token bucket request throttling |
|
|
194
|
-
|
|
195
|
-
### Template Expressions
|
|
196
|
-
|
|
197
|
-
29 pipe filters: `join`, `urlencode`, `urldecode`, `slice`, `replace`, `lowercase`, `uppercase`, `trim`, `default`, `split`, `first`, `last`, `length`, `strip_html`, `truncate`, `slugify`, `sanitize`, `ext`, `basename`, `keys`, `json`, `abs`, `round`, `ceil`, `floor`, `int`, `float`, `str`, `reverse`, `unique`
|
|
198
81
|
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
${{ item.url | basename | sanitize }}
|
|
204
|
-
${{ item.score > 100 ? 'hot' : 'normal' }}
|
|
82
|
+
```bash
|
|
83
|
+
unicli repair hackernews top # Diagnose + suggest fix
|
|
84
|
+
unicli test hackernews # Validate adapter
|
|
85
|
+
unicli repair --loop # Autonomous fix loop
|
|
205
86
|
```
|
|
206
87
|
|
|
207
|
-
|
|
88
|
+
Fixes are saved to `~/.unicli/adapters/` and survive `npm update`.
|
|
89
|
+
|
|
90
|
+
## Supported Platforms
|
|
91
|
+
|
|
92
|
+
<table><tr><td>
|
|
93
|
+
|
|
94
|
+
**198 sites** · **1020 commands** · **35 pipeline steps** · **BM25 bilingual search**
|
|
95
|
+
|
|
96
|
+
</td></tr></table>
|
|
97
|
+
|
|
98
|
+
<!-- =========================== -->
|
|
99
|
+
<!-- WEB — SOCIAL MEDIA -->
|
|
100
|
+
<!-- =========================== -->
|
|
101
|
+
|
|
102
|
+
<details open>
|
|
103
|
+
<summary><strong>Social Media — 25 sites</strong></summary>
|
|
104
|
+
<br>
|
|
105
|
+
<table>
|
|
106
|
+
<tr>
|
|
107
|
+
<td><img src="https://www.google.com/s2/favicons?domain=x.com&sz=32" width="16"> <b>Twitter</b> <sup>35</sup></td>
|
|
108
|
+
<td><img src="https://www.google.com/s2/favicons?domain=reddit.com&sz=32" width="16"> <b>Reddit</b> <sup>20</sup></td>
|
|
109
|
+
<td><img src="https://www.google.com/s2/favicons?domain=instagram.com&sz=32" width="16"> <b>Instagram</b> <sup>26</sup></td>
|
|
110
|
+
<td><img src="https://www.google.com/s2/favicons?domain=tiktok.com&sz=32" width="16"> <b>TikTok</b> <sup>16</sup></td>
|
|
111
|
+
</tr>
|
|
112
|
+
<tr>
|
|
113
|
+
<td><img src="https://www.google.com/s2/favicons?domain=facebook.com&sz=32" width="16"> <b>Facebook</b> <sup>12</sup></td>
|
|
114
|
+
<td><img src="https://www.google.com/s2/favicons?domain=bsky.app&sz=32" width="16"> <b>Bluesky</b> <sup>12</sup></td>
|
|
115
|
+
<td><img src="https://www.google.com/s2/favicons?domain=medium.com&sz=32" width="16"> <b>Medium</b> <sup>5</sup></td>
|
|
116
|
+
<td><img src="https://www.google.com/s2/favicons?domain=threads.net&sz=32" width="16"> <b>Threads</b> <sup>2</sup></td>
|
|
117
|
+
</tr>
|
|
118
|
+
<tr>
|
|
119
|
+
<td><img src="https://www.google.com/s2/favicons?domain=mastodon.social&sz=32" width="16"> <b>Mastodon</b> <sup>4</sup></td>
|
|
120
|
+
<td><img src="https://www.google.com/s2/favicons?domain=bilibili.com&sz=32" width="16"> <b>Bilibili</b> <sup>18</sup></td>
|
|
121
|
+
<td><img src="https://www.google.com/s2/favicons?domain=weibo.com&sz=32" width="16"> <b>Weibo</b> <sup>10</sup></td>
|
|
122
|
+
<td><img src="https://www.google.com/s2/favicons?domain=zhihu.com&sz=32" width="16"> <b>Zhihu</b> <sup>21</sup></td>
|
|
123
|
+
</tr>
|
|
124
|
+
<tr>
|
|
125
|
+
<td><img src="https://www.google.com/s2/favicons?domain=xiaohongshu.com&sz=32" width="16"> <b>Xiaohongshu</b> <sup>24</sup></td>
|
|
126
|
+
<td><img src="https://www.google.com/s2/favicons?domain=douyin.com&sz=32" width="16"> <b>Douyin</b> <sup>23</sup></td>
|
|
127
|
+
<td><img src="https://www.google.com/s2/favicons?domain=okjike.com&sz=32" width="16"> <b>Jike</b> <sup>10</sup></td>
|
|
128
|
+
<td><img src="https://www.google.com/s2/favicons?domain=douban.com&sz=32" width="16"> <b>Douban</b> <sup>12</sup></td>
|
|
129
|
+
</tr>
|
|
130
|
+
<tr>
|
|
131
|
+
<td><img src="https://www.google.com/s2/favicons?domain=v2ex.com&sz=32" width="16"> <b>V2EX</b> <sup>12</sup></td>
|
|
132
|
+
<td><img src="https://www.google.com/s2/favicons?domain=linux.do&sz=32" width="16"> <b>Linux.do</b> <sup>10</sup></td>
|
|
133
|
+
<td><img src="https://www.google.com/s2/favicons?domain=weread.qq.com&sz=32" width="16"> <b>WeRead</b> <sup>7</sup></td>
|
|
134
|
+
<td><img src="https://www.google.com/s2/favicons?domain=tieba.baidu.com&sz=32" width="16"> <b>Tieba</b> <sup>4</sup></td>
|
|
135
|
+
</tr>
|
|
136
|
+
<tr>
|
|
137
|
+
<td><img src="https://www.google.com/s2/favicons?domain=zsxq.com&sz=32" width="16"> <b>Zsxq</b> <sup>5</sup></td>
|
|
138
|
+
<td><img src="https://www.google.com/s2/favicons?domain=xiaoyuzhou.fm&sz=32" width="16"> <b>Xiaoyuzhou</b> <sup>3</sup></td>
|
|
139
|
+
<td><img src="https://www.google.com/s2/favicons?domain=blog.sina.com.cn&sz=32" width="16"> <b>Sinablog</b> <sup>4</sup></td>
|
|
140
|
+
<td><img src="https://www.google.com/s2/favicons?domain=toutiao.com&sz=32" width="16"> <b>Toutiao</b> <sup>2</sup></td>
|
|
141
|
+
</tr>
|
|
142
|
+
<tr>
|
|
143
|
+
<td><img src="https://www.google.com/s2/favicons?domain=baidu.com&sz=32" width="16"> <b>Baidu</b> <sup>2</sup></td>
|
|
144
|
+
<td></td>
|
|
145
|
+
<td></td>
|
|
146
|
+
<td></td>
|
|
147
|
+
</tr>
|
|
148
|
+
</table>
|
|
149
|
+
</details>
|
|
150
|
+
|
|
151
|
+
<!-- =========================== -->
|
|
152
|
+
<!-- WEB — TECH & DEV -->
|
|
153
|
+
<!-- =========================== -->
|
|
154
|
+
|
|
155
|
+
<details>
|
|
156
|
+
<summary><strong>Tech & Developer — 19 sites</strong></summary>
|
|
157
|
+
<br>
|
|
158
|
+
<table>
|
|
159
|
+
<tr>
|
|
160
|
+
<td><img src="https://www.google.com/s2/favicons?domain=news.ycombinator.com&sz=32" width="16"> <b>Hacker News</b> <sup>10</sup></td>
|
|
161
|
+
<td><img src="https://www.google.com/s2/favicons?domain=stackoverflow.com&sz=32" width="16"> <b>Stack Overflow</b> <sup>6</sup></td>
|
|
162
|
+
<td><img src="https://www.google.com/s2/favicons?domain=dev.to&sz=32" width="16"> <b>DEV</b> <sup>5</sup></td>
|
|
163
|
+
<td><img src="https://www.google.com/s2/favicons?domain=lobste.rs&sz=32" width="16"> <b>Lobsters</b> <sup>5</sup></td>
|
|
164
|
+
</tr>
|
|
165
|
+
<tr>
|
|
166
|
+
<td><img src="https://www.google.com/s2/favicons?domain=producthunt.com&sz=32" width="16"> <b>Product Hunt</b> <sup>5</sup></td>
|
|
167
|
+
<td><img src="https://www.google.com/s2/favicons?domain=github.com&sz=32" width="16"> <b>GitHub Trending</b> <sup>3</sup></td>
|
|
168
|
+
<td><img src="https://www.google.com/s2/favicons?domain=substack.com&sz=32" width="16"> <b>Substack</b> <sup>4</sup></td>
|
|
169
|
+
<td><img src="https://www.google.com/s2/favicons?domain=lesswrong.com&sz=32" width="16"> <b>LessWrong</b> <sup>15</sup></td>
|
|
170
|
+
</tr>
|
|
171
|
+
<tr>
|
|
172
|
+
<td><img src="https://www.google.com/s2/favicons?domain=npmjs.com&sz=32" width="16"> <b>npm</b> <sup>4</sup></td>
|
|
173
|
+
<td><img src="https://www.google.com/s2/favicons?domain=pypi.org&sz=32" width="16"> <b>PyPI</b> <sup>3</sup></td>
|
|
174
|
+
<td><img src="https://www.google.com/s2/favicons?domain=crates.io&sz=32" width="16"> <b>crates.io</b> <sup>3</sup></td>
|
|
175
|
+
<td><img src="https://www.google.com/s2/favicons?domain=cocoapods.org&sz=32" width="16"> <b>CocoaPods</b> <sup>2</sup></td>
|
|
176
|
+
</tr>
|
|
177
|
+
<tr>
|
|
178
|
+
<td><img src="https://www.google.com/s2/favicons?domain=brew.sh&sz=32" width="16"> <b>Homebrew</b> <sup>2</sup></td>
|
|
179
|
+
<td><img src="https://www.google.com/s2/favicons?domain=gitlab.com&sz=32" width="16"> <b>GitLab</b> <sup>3</sup></td>
|
|
180
|
+
<td><img src="https://www.google.com/s2/favicons?domain=gitee.com&sz=32" width="16"> <b>Gitee</b> <sup>3</sup></td>
|
|
181
|
+
<td><img src="https://www.google.com/s2/favicons?domain=npmtrends.com&sz=32" width="16"> <b>npm trends</b> <sup>2</sup></td>
|
|
182
|
+
</tr>
|
|
183
|
+
<tr>
|
|
184
|
+
<td><img src="https://www.google.com/s2/favicons?domain=hub.docker.com&sz=32" width="16"> <b>Docker Hub</b> <sup>3</sup></td>
|
|
185
|
+
<td><img src="https://www.google.com/s2/favicons?domain=ycombinator.com&sz=32" width="16"> <b>Y Combinator</b> <sup>1</sup></td>
|
|
186
|
+
<td><img src="https://www.google.com/s2/favicons?domain=itch.io&sz=32" width="16"> <b>itch.io</b> <sup>3</sup></td>
|
|
187
|
+
<td></td>
|
|
188
|
+
</tr>
|
|
189
|
+
</table>
|
|
190
|
+
</details>
|
|
191
|
+
|
|
192
|
+
<!-- =========================== -->
|
|
193
|
+
<!-- WEB — AI & ML -->
|
|
194
|
+
<!-- =========================== -->
|
|
195
|
+
|
|
196
|
+
<details>
|
|
197
|
+
<summary><strong>AI & ML — 17 sites</strong></summary>
|
|
198
|
+
<br>
|
|
199
|
+
<table>
|
|
200
|
+
<tr>
|
|
201
|
+
<td><img src="https://www.google.com/s2/favicons?domain=gemini.google.com&sz=32" width="16"> <b>Gemini</b> <sup>5</sup></td>
|
|
202
|
+
<td><img src="https://www.google.com/s2/favicons?domain=grok.x.ai&sz=32" width="16"> <b>Grok</b> <sup>1</sup></td>
|
|
203
|
+
<td><img src="https://www.google.com/s2/favicons?domain=deepseek.com&sz=32" width="16"> <b>DeepSeek</b> <sup>2</sup></td>
|
|
204
|
+
<td><img src="https://www.google.com/s2/favicons?domain=perplexity.ai&sz=32" width="16"> <b>Perplexity</b> <sup>1</sup></td>
|
|
205
|
+
</tr>
|
|
206
|
+
<tr>
|
|
207
|
+
<td><img src="https://www.google.com/s2/favicons?domain=doubao.com&sz=32" width="16"> <b>Doubao Web</b> <sup>9</sup></td>
|
|
208
|
+
<td><img src="https://www.google.com/s2/favicons?domain=notebooklm.google.com&sz=32" width="16"> <b>NotebookLM</b> <sup>15</sup></td>
|
|
209
|
+
<td><img src="https://www.google.com/s2/favicons?domain=yollomi.com&sz=32" width="16"> <b>Yollomi</b> <sup>12</sup></td>
|
|
210
|
+
<td><img src="https://www.google.com/s2/favicons?domain=jimeng.jianying.com&sz=32" width="16"> <b>Jimeng</b> <sup>2</sup></td>
|
|
211
|
+
</tr>
|
|
212
|
+
<tr>
|
|
213
|
+
<td><img src="https://www.google.com/s2/favicons?domain=yuanbao.tencent.com&sz=32" width="16"> <b>Yuanbao</b> <sup>3</sup></td>
|
|
214
|
+
<td><img src="https://www.google.com/s2/favicons?domain=ollama.com&sz=32" width="16"> <b>Ollama</b> <sup>4</sup></td>
|
|
215
|
+
<td><img src="https://www.google.com/s2/favicons?domain=openrouter.ai&sz=32" width="16"> <b>OpenRouter</b> <sup>2</sup></td>
|
|
216
|
+
<td><img src="https://www.google.com/s2/favicons?domain=huggingface.co&sz=32" width="16"> <b>Hugging Face</b> <sup>6</sup></td>
|
|
217
|
+
</tr>
|
|
218
|
+
<tr>
|
|
219
|
+
<td><img src="https://www.google.com/s2/favicons?domain=replicate.com&sz=32" width="16"> <b>Replicate</b> <sup>3</sup></td>
|
|
220
|
+
<td><img src="https://www.google.com/s2/favicons?domain=minimaxi.com&sz=32" width="16"> <b>MiniMax</b> <sup>3</sup></td>
|
|
221
|
+
<td><img src="https://www.google.com/s2/favicons?domain=doubao.com&sz=32" width="16"> <b>Doubao API</b> <sup>3</sup></td>
|
|
222
|
+
<td><img src="https://www.google.com/s2/favicons?domain=novita.ai&sz=32" width="16"> <b>Novita</b> <sup>3</sup></td>
|
|
223
|
+
</tr>
|
|
224
|
+
</table>
|
|
225
|
+
</details>
|
|
226
|
+
|
|
227
|
+
<!-- =========================== -->
|
|
228
|
+
<!-- WEB — VIDEO & STREAMING -->
|
|
229
|
+
<!-- =========================== -->
|
|
230
|
+
|
|
231
|
+
<details>
|
|
232
|
+
<summary><strong>Video & Streaming — 8 sites</strong></summary>
|
|
233
|
+
<br>
|
|
234
|
+
<table>
|
|
235
|
+
<tr>
|
|
236
|
+
<td><img src="https://www.google.com/s2/favicons?domain=youtube.com&sz=32" width="16"> <b>YouTube</b> <sup>9</sup></td>
|
|
237
|
+
<td><img src="https://www.google.com/s2/favicons?domain=twitch.tv&sz=32" width="16"> <b>Twitch</b> <sup>4</sup></td>
|
|
238
|
+
<td><img src="https://www.google.com/s2/favicons?domain=kuaishou.com&sz=32" width="16"> <b>Kuaishou</b> <sup>2</sup></td>
|
|
239
|
+
<td><img src="https://www.google.com/s2/favicons?domain=douyu.com&sz=32" width="16"> <b>Douyu</b> <sup>2</sup></td>
|
|
240
|
+
</tr>
|
|
241
|
+
<tr>
|
|
242
|
+
<td><img src="https://www.google.com/s2/favicons?domain=channels.weixin.qq.com&sz=32" width="16"> <b>WeChat Channels</b> <sup>2</sup></td>
|
|
243
|
+
<td><img src="https://www.google.com/s2/favicons?domain=podcasts.apple.com&sz=32" width="16"> <b>Apple Podcasts</b> <sup>3</sup></td>
|
|
244
|
+
<td><img src="https://www.google.com/s2/favicons?domain=spotify.com&sz=32" width="16"> <b>Spotify</b> <sup>4</sup></td>
|
|
245
|
+
<td><img src="https://www.google.com/s2/favicons?domain=music.163.com&sz=32" width="16"> <b>NetEase Music</b> <sup>4</sup></td>
|
|
246
|
+
</tr>
|
|
247
|
+
</table>
|
|
248
|
+
</details>
|
|
249
|
+
|
|
250
|
+
<!-- =========================== -->
|
|
251
|
+
<!-- WEB — NEWS & MEDIA -->
|
|
252
|
+
<!-- =========================== -->
|
|
253
|
+
|
|
254
|
+
<details>
|
|
255
|
+
<summary><strong>News & Media — 10 sites</strong></summary>
|
|
256
|
+
<br>
|
|
257
|
+
<table>
|
|
258
|
+
<tr>
|
|
259
|
+
<td><img src="https://www.google.com/s2/favicons?domain=bloomberg.com&sz=32" width="16"> <b>Bloomberg</b> <sup>10</sup></td>
|
|
260
|
+
<td><img src="https://www.google.com/s2/favicons?domain=reuters.com&sz=32" width="16"> <b>Reuters</b> <sup>4</sup></td>
|
|
261
|
+
<td><img src="https://www.google.com/s2/favicons?domain=bbc.com&sz=32" width="16"> <b>BBC</b> <sup>4</sup></td>
|
|
262
|
+
<td><img src="https://www.google.com/s2/favicons?domain=cnn.com&sz=32" width="16"> <b>CNN</b> <sup>2</sup></td>
|
|
263
|
+
</tr>
|
|
264
|
+
<tr>
|
|
265
|
+
<td><img src="https://www.google.com/s2/favicons?domain=nytimes.com&sz=32" width="16"> <b>NYTimes</b> <sup>2</sup></td>
|
|
266
|
+
<td><img src="https://www.google.com/s2/favicons?domain=36kr.com&sz=32" width="16"> <b>36Kr</b> <sup>5</sup></td>
|
|
267
|
+
<td><img src="https://www.google.com/s2/favicons?domain=techcrunch.com&sz=32" width="16"> <b>TechCrunch</b> <sup>2</sup></td>
|
|
268
|
+
<td><img src="https://www.google.com/s2/favicons?domain=theverge.com&sz=32" width="16"> <b>The Verge</b> <sup>2</sup></td>
|
|
269
|
+
</tr>
|
|
270
|
+
<tr>
|
|
271
|
+
<td><img src="https://www.google.com/s2/favicons?domain=infoq.com&sz=32" width="16"> <b>InfoQ</b> <sup>2</sup></td>
|
|
272
|
+
<td><img src="https://www.google.com/s2/favicons?domain=ithome.com&sz=32" width="16"> <b>IT Home</b> <sup>3</sup></td>
|
|
273
|
+
<td></td>
|
|
274
|
+
<td></td>
|
|
275
|
+
</tr>
|
|
276
|
+
</table>
|
|
277
|
+
</details>
|
|
278
|
+
|
|
279
|
+
<!-- =========================== -->
|
|
280
|
+
<!-- WEB — FINANCE -->
|
|
281
|
+
<!-- =========================== -->
|
|
282
|
+
|
|
283
|
+
<details>
|
|
284
|
+
<summary><strong>Finance & Trading — 8 sites</strong></summary>
|
|
285
|
+
<br>
|
|
286
|
+
<table>
|
|
287
|
+
<tr>
|
|
288
|
+
<td><img src="https://www.google.com/s2/favicons?domain=xueqiu.com&sz=32" width="16"> <b>Xueqiu</b> <sup>12</sup></td>
|
|
289
|
+
<td><img src="https://www.google.com/s2/favicons?domain=finance.sina.com.cn&sz=32" width="16"> <b>Sina Finance</b> <sup>5</sup></td>
|
|
290
|
+
<td><img src="https://www.google.com/s2/favicons?domain=barchart.com&sz=32" width="16"> <b>Barchart</b> <sup>4</sup></td>
|
|
291
|
+
<td><img src="https://www.google.com/s2/favicons?domain=finance.yahoo.com&sz=32" width="16"> <b>Yahoo Finance</b> <sup>3</sup></td>
|
|
292
|
+
</tr>
|
|
293
|
+
<tr>
|
|
294
|
+
<td><img src="https://www.google.com/s2/favicons?domain=binance.com&sz=32" width="16"> <b>Binance</b> <sup>3</sup></td>
|
|
295
|
+
<td><img src="https://www.google.com/s2/favicons?domain=futunn.com&sz=32" width="16"> <b>Futu</b> <sup>2</sup></td>
|
|
296
|
+
<td><img src="https://www.google.com/s2/favicons?domain=coinbase.com&sz=32" width="16"> <b>Coinbase</b> <sup>2</sup></td>
|
|
297
|
+
<td><img src="https://www.google.com/s2/favicons?domain=eastmoney.com&sz=32" width="16"> <b>Eastmoney</b> <sup>4</sup></td>
|
|
298
|
+
</tr>
|
|
299
|
+
</table>
|
|
300
|
+
</details>
|
|
301
|
+
|
|
302
|
+
<!-- =========================== -->
|
|
303
|
+
<!-- WEB — SHOPPING & LIFE -->
|
|
304
|
+
<!-- =========================== -->
|
|
305
|
+
|
|
306
|
+
<details>
|
|
307
|
+
<summary><strong>Shopping & Lifestyle — 14 sites</strong></summary>
|
|
308
|
+
<br>
|
|
309
|
+
<table>
|
|
310
|
+
<tr>
|
|
311
|
+
<td><img src="https://www.google.com/s2/favicons?domain=amazon.com&sz=32" width="16"> <b>Amazon</b> <sup>8</sup></td>
|
|
312
|
+
<td><img src="https://www.google.com/s2/favicons?domain=jd.com&sz=32" width="16"> <b>JD</b> <sup>3</sup></td>
|
|
313
|
+
<td><img src="https://www.google.com/s2/favicons?domain=taobao.com&sz=32" width="16"> <b>Taobao</b> <sup>2</sup></td>
|
|
314
|
+
<td><img src="https://www.google.com/s2/favicons?domain=1688.com&sz=32" width="16"> <b>1688</b> <sup>3</sup></td>
|
|
315
|
+
</tr>
|
|
316
|
+
<tr>
|
|
317
|
+
<td><img src="https://www.google.com/s2/favicons?domain=pinduoduo.com&sz=32" width="16"> <b>Pinduoduo</b> <sup>2</sup></td>
|
|
318
|
+
<td><img src="https://www.google.com/s2/favicons?domain=smzdm.com&sz=32" width="16"> <b>SMZDM</b> <sup>3</sup></td>
|
|
319
|
+
<td><img src="https://www.google.com/s2/favicons?domain=meituan.com&sz=32" width="16"> <b>Meituan</b> <sup>2</sup></td>
|
|
320
|
+
<td><img src="https://www.google.com/s2/favicons?domain=ele.me&sz=32" width="16"> <b>Ele.me</b> <sup>2</sup></td>
|
|
321
|
+
</tr>
|
|
322
|
+
<tr>
|
|
323
|
+
<td><img src="https://www.google.com/s2/favicons?domain=dianping.com&sz=32" width="16"> <b>Dianping</b> <sup>2</sup></td>
|
|
324
|
+
<td><img src="https://www.google.com/s2/favicons?domain=coupang.com&sz=32" width="16"> <b>Coupang</b> <sup>3</sup></td>
|
|
325
|
+
<td><img src="https://www.google.com/s2/favicons?domain=ctrip.com&sz=32" width="16"> <b>Ctrip</b> <sup>2</sup></td>
|
|
326
|
+
<td><img src="https://www.google.com/s2/favicons?domain=xianyu.com&sz=32" width="16"> <b>Xianyu</b> <sup>3</sup></td>
|
|
327
|
+
</tr>
|
|
328
|
+
<tr>
|
|
329
|
+
<td><img src="https://www.google.com/s2/favicons?domain=dangdang.com&sz=32" width="16"> <b>Dangdang</b> <sup>2</sup></td>
|
|
330
|
+
<td><img src="https://www.google.com/s2/favicons?domain=maoyan.com&sz=32" width="16"> <b>Maoyan</b> <sup>2</sup></td>
|
|
331
|
+
<td></td>
|
|
332
|
+
<td></td>
|
|
333
|
+
</tr>
|
|
334
|
+
</table>
|
|
335
|
+
</details>
|
|
336
|
+
|
|
337
|
+
<!-- =========================== -->
|
|
338
|
+
<!-- WEB — JOBS -->
|
|
339
|
+
<!-- =========================== -->
|
|
340
|
+
|
|
341
|
+
<details>
|
|
342
|
+
<summary><strong>Jobs & Careers — 2 sites</strong></summary>
|
|
343
|
+
<br>
|
|
344
|
+
<table>
|
|
345
|
+
<tr>
|
|
346
|
+
<td><img src="https://www.google.com/s2/favicons?domain=zhipin.com&sz=32" width="16"> <b>Boss Zhipin</b> <sup>14</sup></td>
|
|
347
|
+
<td><img src="https://www.google.com/s2/favicons?domain=linkedin.com&sz=32" width="16"> <b>LinkedIn</b> <sup>4</sup></td>
|
|
348
|
+
<td></td>
|
|
349
|
+
<td></td>
|
|
350
|
+
</tr>
|
|
351
|
+
</table>
|
|
352
|
+
</details>
|
|
353
|
+
|
|
354
|
+
<!-- =========================== -->
|
|
355
|
+
<!-- WEB — REFERENCE -->
|
|
356
|
+
<!-- =========================== -->
|
|
357
|
+
|
|
358
|
+
<details>
|
|
359
|
+
<summary><strong>Education & Reference — 15 sites</strong></summary>
|
|
360
|
+
<br>
|
|
361
|
+
<table>
|
|
362
|
+
<tr>
|
|
363
|
+
<td><img src="https://www.google.com/s2/favicons?domain=google.com&sz=32" width="16"> <b>Google</b> <sup>4</sup></td>
|
|
364
|
+
<td><img src="https://www.google.com/s2/favicons?domain=wikipedia.org&sz=32" width="16"> <b>Wikipedia</b> <sup>5</sup></td>
|
|
365
|
+
<td><img src="https://www.google.com/s2/favicons?domain=arxiv.org&sz=32" width="16"> <b>arXiv</b> <sup>3</sup></td>
|
|
366
|
+
<td><img src="https://www.google.com/s2/favicons?domain=cnki.net&sz=32" width="16"> <b>CNKI</b> <sup>1</sup></td>
|
|
367
|
+
</tr>
|
|
368
|
+
<tr>
|
|
369
|
+
<td><img src="https://www.google.com/s2/favicons?domain=chaoxing.com&sz=32" width="16"> <b>Chaoxing</b> <sup>2</sup></td>
|
|
370
|
+
<td><img src="https://www.google.com/s2/favicons?domain=dictionary.com&sz=32" width="16"> <b>Dictionary</b> <sup>3</sup></td>
|
|
371
|
+
<td><img src="https://www.google.com/s2/favicons?domain=imdb.com&sz=32" width="16"> <b>IMDb</b> <sup>7</sup></td>
|
|
372
|
+
<td><img src="https://www.google.com/s2/favicons?domain=paperreview.com&sz=32" width="16"> <b>PaperReview</b> <sup>3</sup></td>
|
|
373
|
+
</tr>
|
|
374
|
+
<tr>
|
|
375
|
+
<td><img src="https://www.google.com/s2/favicons?domain=exchangerate-api.com&sz=32" width="16"> <b>Exchange Rate</b> <sup>2</sup></td>
|
|
376
|
+
<td><img src="https://www.google.com/s2/favicons?domain=ipinfo.io&sz=32" width="16"> <b>IP Info</b> <sup>1</sup></td>
|
|
377
|
+
<td><img src="https://www.google.com/s2/favicons?domain=qweather.com&sz=32" width="16"> <b>QWeather</b> <sup>2</sup></td>
|
|
378
|
+
<td><img src="https://www.google.com/s2/favicons?domain=unsplash.com&sz=32" width="16"> <b>Unsplash</b> <sup>2</sup></td>
|
|
379
|
+
</tr>
|
|
380
|
+
<tr>
|
|
381
|
+
<td><img src="https://www.google.com/s2/favicons?domain=pexels.com&sz=32" width="16"> <b>Pexels</b> <sup>2</sup></td>
|
|
382
|
+
<td><img src="https://www.google.com/s2/favicons?domain=sspai.com&sz=32" width="16"> <b>Sspai</b> <sup>2</sup></td>
|
|
383
|
+
<td></td>
|
|
384
|
+
<td></td>
|
|
385
|
+
</tr>
|
|
386
|
+
</table>
|
|
387
|
+
</details>
|
|
388
|
+
|
|
389
|
+
<!-- =========================== -->
|
|
390
|
+
<!-- WEB — OTHER -->
|
|
391
|
+
<!-- =========================== -->
|
|
392
|
+
|
|
393
|
+
<details>
|
|
394
|
+
<summary><strong>Other Web — 16 sites</strong></summary>
|
|
395
|
+
<br>
|
|
396
|
+
<table>
|
|
397
|
+
<tr>
|
|
398
|
+
<td><img src="https://www.google.com/s2/favicons?domain=ones.com&sz=32" width="16"> <b>Ones</b> <sup>11</sup></td>
|
|
399
|
+
<td><img src="https://www.google.com/s2/favicons?domain=pixiv.net&sz=32" width="16"> <b>Pixiv</b> <sup>6</sup></td>
|
|
400
|
+
<td><img src="https://www.google.com/s2/favicons?domain=hupu.com&sz=32" width="16"> <b>Hupu</b> <sup>7</sup></td>
|
|
401
|
+
<td><img src="https://www.google.com/s2/favicons?domain=steampowered.com&sz=32" width="16"> <b>Steam</b> <sup>6</sup></td>
|
|
402
|
+
</tr>
|
|
403
|
+
<tr>
|
|
404
|
+
<td><img src="https://www.google.com/s2/favicons?domain=band.us&sz=32" width="16"> <b>Band</b> <sup>4</sup></td>
|
|
405
|
+
<td><img src="https://www.google.com/s2/favicons?domain=xiaoe-tech.com&sz=32" width="16"> <b>Xiaoe</b> <sup>5</sup></td>
|
|
406
|
+
<td><img src="https://www.google.com/s2/favicons?domain=quark.cn&sz=32" width="16"> <b>Quark</b> <sup>2</sup></td>
|
|
407
|
+
<td><img src="https://www.google.com/s2/favicons?domain=mubu.com&sz=32" width="16"> <b>Mubu</b> <sup>2</sup></td>
|
|
408
|
+
</tr>
|
|
409
|
+
<tr>
|
|
410
|
+
<td><img src="https://www.google.com/s2/favicons?domain=ke.com&sz=32" width="16"> <b>Ke.com</b> <sup>2</sup></td>
|
|
411
|
+
<td><img src="https://www.google.com/s2/favicons?domain=maimai.cn&sz=32" width="16"> <b>Maimai</b> <sup>1</sup></td>
|
|
412
|
+
<td><img src="https://www.google.com/s2/favicons?domain=feishu.cn&sz=32" width="16"> <b>Feishu</b> <sup>4</sup></td>
|
|
413
|
+
<td><img src="https://www.google.com/s2/favicons?domain=slock.it&sz=32" width="16"> <b>Slock</b> <sup>1</sup></td>
|
|
414
|
+
</tr>
|
|
415
|
+
<tr>
|
|
416
|
+
<td><img src="https://www.google.com/s2/favicons?domain=jianyu.com&sz=32" width="16"> <b>Jianyu</b> <sup>1</sup></td>
|
|
417
|
+
<td><img src="https://www.google.com/s2/favicons?domain=weixin.qq.com&sz=32" width="16"> <b>WeChat</b> <sup>4</sup></td>
|
|
418
|
+
<td></td>
|
|
419
|
+
<td></td>
|
|
420
|
+
</tr>
|
|
421
|
+
</table>
|
|
422
|
+
</details>
|
|
423
|
+
|
|
424
|
+
<!-- =========================== -->
|
|
425
|
+
<!-- DESKTOP SOFTWARE -->
|
|
426
|
+
<!-- =========================== -->
|
|
427
|
+
|
|
428
|
+
<details>
|
|
429
|
+
<summary><strong>Desktop Software — 30 apps</strong></summary>
|
|
430
|
+
<br>
|
|
431
|
+
<table>
|
|
432
|
+
<tr>
|
|
433
|
+
<th colspan="4">3D / CAD</th>
|
|
434
|
+
</tr>
|
|
435
|
+
<tr>
|
|
436
|
+
<td><img src="https://cdn.simpleicons.org/blender/E87D0D" width="16"> <b>Blender</b> <sup>13</sup></td>
|
|
437
|
+
<td><img src="https://www.google.com/s2/favicons?domain=freecad.org&sz=32" width="16"> <b>FreeCAD</b> <sup>15</sup></td>
|
|
438
|
+
<td><img src="https://www.google.com/s2/favicons?domain=cloudcompare.org&sz=32" width="16"> <b>CloudCompare</b> <sup>4</sup></td>
|
|
439
|
+
<td><img src="https://cdn.simpleicons.org/godotengine/478CBF" width="16"> <b>Godot</b> <sup>2</sup></td>
|
|
440
|
+
</tr>
|
|
441
|
+
<tr>
|
|
442
|
+
<td><img src="https://www.google.com/s2/favicons?domain=renderdoc.org&sz=32" width="16"> <b>RenderDoc</b> <sup>2</sup></td>
|
|
443
|
+
<td></td>
|
|
444
|
+
<td></td>
|
|
445
|
+
<td></td>
|
|
446
|
+
</tr>
|
|
447
|
+
<tr>
|
|
448
|
+
<th colspan="4">Image</th>
|
|
449
|
+
</tr>
|
|
450
|
+
<tr>
|
|
451
|
+
<td><img src="https://cdn.simpleicons.org/gimp/5C5543" width="16"> <b>GIMP</b> <sup>12</sup></td>
|
|
452
|
+
<td><img src="https://cdn.simpleicons.org/inkscape/000000" width="16"> <b>Inkscape</b> <sup>3</sup></td>
|
|
453
|
+
<td><img src="https://www.google.com/s2/favicons?domain=imagemagick.org&sz=32" width="16"> <b>ImageMagick</b> <sup>6</sup></td>
|
|
454
|
+
<td><img src="https://www.google.com/s2/favicons?domain=krita.org&sz=32" width="16"> <b>Krita</b> <sup>4</sup></td>
|
|
455
|
+
</tr>
|
|
456
|
+
<tr>
|
|
457
|
+
<td><img src="https://cdn.simpleicons.org/sketch/F7B500" width="16"> <b>Sketch</b> <sup>3</sup></td>
|
|
458
|
+
<td></td>
|
|
459
|
+
<td></td>
|
|
460
|
+
<td></td>
|
|
461
|
+
</tr>
|
|
462
|
+
<tr>
|
|
463
|
+
<th colspan="4">Video / Audio</th>
|
|
464
|
+
</tr>
|
|
465
|
+
<tr>
|
|
466
|
+
<td><img src="https://cdn.simpleicons.org/ffmpeg/007808" width="16"> <b>FFmpeg</b> <sup>11</sup></td>
|
|
467
|
+
<td><img src="https://cdn.simpleicons.org/kdenlive/527EB2" width="16"> <b>Kdenlive</b> <sup>3</sup></td>
|
|
468
|
+
<td><img src="https://www.google.com/s2/favicons?domain=shotcut.org&sz=32" width="16"> <b>Shotcut</b> <sup>3</sup></td>
|
|
469
|
+
<td><img src="https://cdn.simpleicons.org/audacity/0000CC" width="16"> <b>Audacity</b> <sup>8</sup></td>
|
|
470
|
+
</tr>
|
|
471
|
+
<tr>
|
|
472
|
+
<td><img src="https://www.google.com/s2/favicons?domain=musescore.org&sz=32" width="16"> <b>MuseScore</b> <sup>5</sup></td>
|
|
473
|
+
<td></td>
|
|
474
|
+
<td></td>
|
|
475
|
+
<td></td>
|
|
476
|
+
</tr>
|
|
477
|
+
<tr>
|
|
478
|
+
<th colspan="4">Productivity</th>
|
|
479
|
+
</tr>
|
|
480
|
+
<tr>
|
|
481
|
+
<td><img src="https://cdn.simpleicons.org/obsstudio/302E31" width="16"> <b>OBS Studio</b> <sup>8</sup></td>
|
|
482
|
+
<td><img src="https://www.google.com/s2/favicons?domain=zotero.org&sz=32" width="16"> <b>Zotero</b> <sup>8</sup></td>
|
|
483
|
+
<td><img src="https://cdn.simpleicons.org/visualstudiocode/007ACC" width="16"> <b>VS Code</b> <sup>3</sup></td>
|
|
484
|
+
<td><img src="https://cdn.simpleicons.org/obsidian/7C3AED" width="16"> <b>Obsidian</b> <sup>3</sup></td>
|
|
485
|
+
</tr>
|
|
486
|
+
<tr>
|
|
487
|
+
<td><img src="https://cdn.simpleicons.org/notion/000000" width="16"> <b>Notion</b> <sup>3</sup></td>
|
|
488
|
+
<td><img src="https://cdn.simpleicons.org/libreoffice/18A303" width="16"> <b>LibreOffice</b> <sup>2</sup></td>
|
|
489
|
+
<td><img src="https://www.google.com/s2/favicons?domain=pandoc.org&sz=32" width="16"> <b>Pandoc</b> <sup>1</sup></td>
|
|
490
|
+
<td><img src="https://www.google.com/s2/favicons?domain=draw.io&sz=32" width="16"> <b>Draw.io</b> <sup>1</sup></td>
|
|
491
|
+
</tr>
|
|
492
|
+
<tr>
|
|
493
|
+
<td><img src="https://www.google.com/s2/favicons?domain=mermaid.js.org&sz=32" width="16"> <b>Mermaid</b> <sup>1</sup></td>
|
|
494
|
+
<td></td>
|
|
495
|
+
<td></td>
|
|
496
|
+
<td></td>
|
|
497
|
+
</tr>
|
|
498
|
+
<tr>
|
|
499
|
+
<th colspan="4">Other</th>
|
|
500
|
+
</tr>
|
|
501
|
+
<tr>
|
|
502
|
+
<td><img src="https://cdn.simpleicons.org/googlechrome/4285F4" width="16"> <b>Chrome</b> <sup>2</sup></td>
|
|
503
|
+
<td><img src="https://cdn.simpleicons.org/zoom/0B5CFF" width="16"> <b>Zoom</b> <sup>2</sup></td>
|
|
504
|
+
<td><img src="https://www.google.com/s2/favicons?domain=wiremock.org&sz=32" width="16"> <b>WireMock</b> <sup>5</sup></td>
|
|
505
|
+
<td><img src="https://www.google.com/s2/favicons?domain=adguard.com&sz=32" width="16"> <b>AdGuard Home</b> <sup>5</sup></td>
|
|
506
|
+
</tr>
|
|
507
|
+
<tr>
|
|
508
|
+
<td><img src="https://www.google.com/s2/favicons?domain=comfyui.com&sz=32" width="16"> <b>ComfyUI</b> <sup>4</sup></td>
|
|
509
|
+
<td><img src="https://www.google.com/s2/favicons?domain=steampowered.com&sz=32" width="16"> <b>Slay the Spire II</b> <sup>6</sup></td>
|
|
510
|
+
<td></td>
|
|
511
|
+
<td></td>
|
|
512
|
+
</tr>
|
|
513
|
+
</table>
|
|
514
|
+
</details>
|
|
515
|
+
|
|
516
|
+
<!-- =========================== -->
|
|
517
|
+
<!-- ELECTRON APPS -->
|
|
518
|
+
<!-- =========================== -->
|
|
519
|
+
|
|
520
|
+
<details>
|
|
521
|
+
<summary><strong>Electron Apps — 8 apps, 70+ commands</strong></summary>
|
|
522
|
+
<br>
|
|
523
|
+
|
|
524
|
+
All via Chrome DevTools Protocol — no extensions, no hacks.
|
|
525
|
+
|
|
526
|
+
<table>
|
|
527
|
+
<tr>
|
|
528
|
+
<td><img src="https://www.google.com/s2/favicons?domain=cursor.com&sz=32" width="16"> <b>Cursor</b></td>
|
|
529
|
+
<td>ask, send, read, model, composer, extract-code, new, status, screenshot, dump, history, export</td>
|
|
530
|
+
<td><code>9226</code></td>
|
|
531
|
+
</tr>
|
|
532
|
+
<tr>
|
|
533
|
+
<td><img src="https://www.google.com/s2/favicons?domain=openai.com&sz=32" width="16"> <b>Codex</b></td>
|
|
534
|
+
<td>ask, send, read, model, extract-diff, new, status, screenshot, dump, history, export</td>
|
|
535
|
+
<td><code>9222</code></td>
|
|
536
|
+
</tr>
|
|
537
|
+
<tr>
|
|
538
|
+
<td><img src="https://www.google.com/s2/favicons?domain=chat.openai.com&sz=32" width="16"> <b>ChatGPT</b></td>
|
|
539
|
+
<td>ask, send, read, model, new, status, screenshot, dump</td>
|
|
540
|
+
<td><code>9236</code></td>
|
|
541
|
+
</tr>
|
|
542
|
+
<tr>
|
|
543
|
+
<td><img src="https://www.google.com/s2/favicons?domain=notion.so&sz=32" width="16"> <b>Notion</b></td>
|
|
544
|
+
<td>search, read, write, new, status, sidebar, favorites, export, screenshot</td>
|
|
545
|
+
<td><code>9230</code></td>
|
|
546
|
+
</tr>
|
|
547
|
+
<tr>
|
|
548
|
+
<td><img src="https://www.google.com/s2/favicons?domain=discord.com&sz=32" width="16"> <b>Discord</b></td>
|
|
549
|
+
<td>servers, channels, read, send, search, members, status, delete</td>
|
|
550
|
+
<td><code>9232</code></td>
|
|
551
|
+
</tr>
|
|
552
|
+
<tr>
|
|
553
|
+
<td><img src="https://www.google.com/s2/favicons?domain=chatwise.app&sz=32" width="16"> <b>ChatWise</b></td>
|
|
554
|
+
<td>ask, send, read, model, new, status, screenshot, dump</td>
|
|
555
|
+
<td><code>9228</code></td>
|
|
556
|
+
</tr>
|
|
557
|
+
<tr>
|
|
558
|
+
<td><img src="https://www.google.com/s2/favicons?domain=doubao.com&sz=32" width="16"> <b>Doubao</b></td>
|
|
559
|
+
<td>ask, send, read, new, status, screenshot, dump</td>
|
|
560
|
+
<td><code>9225</code></td>
|
|
561
|
+
</tr>
|
|
562
|
+
<tr>
|
|
563
|
+
<td><img src="https://www.google.com/s2/favicons?domain=antigravity.ai&sz=32" width="16"> <b>Antigravity</b></td>
|
|
564
|
+
<td>ask, send, read, model, new, status, screenshot, dump</td>
|
|
565
|
+
<td><code>9234</code></td>
|
|
566
|
+
</tr>
|
|
567
|
+
</table>
|
|
568
|
+
</details>
|
|
569
|
+
|
|
570
|
+
<!-- =========================== -->
|
|
571
|
+
<!-- CLI BRIDGES -->
|
|
572
|
+
<!-- =========================== -->
|
|
573
|
+
|
|
574
|
+
<details>
|
|
575
|
+
<summary><strong>CLI Bridges — 35 tools</strong></summary>
|
|
576
|
+
<br>
|
|
577
|
+
|
|
578
|
+
Passthrough wrappers that normalize output to JSON:
|
|
579
|
+
|
|
580
|
+
<table>
|
|
581
|
+
<tr>
|
|
582
|
+
<td><img src="https://cdn.simpleicons.org/docker/2496ED" width="16"> Docker</td>
|
|
583
|
+
<td><img src="https://cdn.simpleicons.org/github/181717" width="16"> gh</td>
|
|
584
|
+
<td><img src="https://www.google.com/s2/favicons?domain=jqlang.github.io&sz=32" width="16"> jq</td>
|
|
585
|
+
<td><img src="https://www.google.com/s2/favicons?domain=yt-dl.org&sz=32" width="16"> yt-dlp</td>
|
|
586
|
+
</tr>
|
|
587
|
+
<tr>
|
|
588
|
+
<td><img src="https://cdn.simpleicons.org/vercel/000000" width="16"> Vercel</td>
|
|
589
|
+
<td><img src="https://cdn.simpleicons.org/supabase/3FCF8E" width="16"> Supabase</td>
|
|
590
|
+
<td><img src="https://cdn.simpleicons.org/cloudflare/F38020" width="16"> Wrangler</td>
|
|
591
|
+
<td><img src="https://www.google.com/s2/favicons?domain=feishu.cn&sz=32" width="16"> Lark</td>
|
|
592
|
+
</tr>
|
|
593
|
+
<tr>
|
|
594
|
+
<td><img src="https://www.google.com/s2/favicons?domain=dingtalk.com&sz=32" width="16"> DingTalk</td>
|
|
595
|
+
<td><img src="https://www.google.com/s2/favicons?domain=huggingface.co&sz=32" width="16"> HF CLI</td>
|
|
596
|
+
<td><img src="https://www.google.com/s2/favicons?domain=anthropic.com&sz=32" width="16"> Claude Code</td>
|
|
597
|
+
<td><img src="https://www.google.com/s2/favicons?domain=openai.com&sz=32" width="16"> Codex CLI</td>
|
|
598
|
+
</tr>
|
|
599
|
+
<tr>
|
|
600
|
+
<td><img src="https://www.google.com/s2/favicons?domain=opencode.ai&sz=32" width="16"> OpenCode</td>
|
|
601
|
+
<td><img src="https://cdn.simpleicons.org/amazonaws/232F3E" width="16"> AWS</td>
|
|
602
|
+
<td><img src="https://cdn.simpleicons.org/googlecloud/4285F4" width="16"> GCloud</td>
|
|
603
|
+
<td><img src="https://cdn.simpleicons.org/microsoftazure/0078D4" width="16"> Azure</td>
|
|
604
|
+
</tr>
|
|
605
|
+
<tr>
|
|
606
|
+
<td><img src="https://cdn.simpleicons.org/digitalocean/0080FF" width="16"> DigitalOcean</td>
|
|
607
|
+
<td><img src="https://cdn.simpleicons.org/netlify/00C7B7" width="16"> Netlify</td>
|
|
608
|
+
<td><img src="https://www.google.com/s2/favicons?domain=railway.app&sz=32" width="16"> Railway</td>
|
|
609
|
+
<td><img src="https://www.google.com/s2/favicons?domain=fly.io&sz=32" width="16"> Fly.io</td>
|
|
610
|
+
</tr>
|
|
611
|
+
<tr>
|
|
612
|
+
<td><img src="https://www.google.com/s2/favicons?domain=planetscale.com&sz=32" width="16"> PlanetScale</td>
|
|
613
|
+
<td><img src="https://www.google.com/s2/favicons?domain=neon.tech&sz=32" width="16"> Neon</td>
|
|
614
|
+
<td><img src="https://cdn.simpleicons.org/slack/4A154B" width="16"> Slack</td>
|
|
615
|
+
<td><img src="https://www.google.com/s2/favicons?domain=kimi.ai&sz=32" width="16"> Kimi CLI</td>
|
|
616
|
+
</tr>
|
|
617
|
+
<tr>
|
|
618
|
+
<td><img src="https://www.google.com/s2/favicons?domain=workspace.google.com&sz=32" width="16"> GWS</td>
|
|
619
|
+
<td><img src="https://www.google.com/s2/favicons?domain=deepagents.ai&sz=32" width="16"> DeepAgents</td>
|
|
620
|
+
<td><img src="https://cdn.simpleicons.org/stripe/635BFF" width="16"> Stripe</td>
|
|
621
|
+
<td><img src="https://cdn.simpleicons.org/firebase/DD2C00" width="16"> Firebase</td>
|
|
622
|
+
</tr>
|
|
623
|
+
<tr>
|
|
624
|
+
<td><img src="https://www.google.com/s2/favicons?domain=minimaxi.com&sz=32" width="16"> MMX CLI</td>
|
|
625
|
+
<td><img src="https://www.google.com/s2/favicons?domain=wecom.work&sz=32" width="16"> WeCom</td>
|
|
626
|
+
<td><img src="https://www.google.com/s2/favicons?domain=mem0.ai&sz=32" width="16"> Mem0</td>
|
|
627
|
+
<td>+ more</td>
|
|
628
|
+
</tr>
|
|
629
|
+
</table>
|
|
630
|
+
</details>
|
|
631
|
+
|
|
632
|
+
<!-- =========================== -->
|
|
633
|
+
<!-- macOS SYSTEM -->
|
|
634
|
+
<!-- =========================== -->
|
|
635
|
+
|
|
636
|
+
<details>
|
|
637
|
+
<summary><strong><img src="https://cdn.simpleicons.org/apple/000000" width="16"> macOS System — 51 commands</strong></summary>
|
|
638
|
+
<br>
|
|
639
|
+
<table>
|
|
640
|
+
<tr>
|
|
641
|
+
<th>Audio/Display</th>
|
|
642
|
+
<td>volume, brightness, dark-mode, say</td>
|
|
643
|
+
</tr>
|
|
644
|
+
<tr>
|
|
645
|
+
<th>Power/System</th>
|
|
646
|
+
<td>battery, lock-screen, caffeinate, sleep, uptime, system-info</td>
|
|
647
|
+
</tr>
|
|
648
|
+
<tr>
|
|
649
|
+
<th>Files/Search</th>
|
|
650
|
+
<td>spotlight, disk-info, trash, empty-trash, open, finder-tags, finder-recent, finder-selection</td>
|
|
651
|
+
</tr>
|
|
652
|
+
<tr>
|
|
653
|
+
<th>Network</th>
|
|
654
|
+
<td>wifi, wifi-info, bluetooth</td>
|
|
655
|
+
</tr>
|
|
656
|
+
<tr>
|
|
657
|
+
<th>Notifications</th>
|
|
658
|
+
<td>notify, notification, do-not-disturb</td>
|
|
659
|
+
</tr>
|
|
660
|
+
<tr>
|
|
661
|
+
<th>Apps</th>
|
|
662
|
+
<td>apps, apps-list, active-app, open-app, safari-tabs, shortcuts-list, shortcuts-run</td>
|
|
663
|
+
</tr>
|
|
664
|
+
<tr>
|
|
665
|
+
<th>PIM</th>
|
|
666
|
+
<td>calendar-list, calendar-create, calendar-today, contacts-search, mail-status, mail-send, messages-send, reminders-list, reminders-create, reminders-complete</td>
|
|
667
|
+
</tr>
|
|
668
|
+
<tr>
|
|
669
|
+
<th>Media</th>
|
|
670
|
+
<td>music-now, music-control, photos-search, notes-list, notes-search, screenshot, clipboard, processes</td>
|
|
671
|
+
</tr>
|
|
672
|
+
</table>
|
|
673
|
+
</details>
|
|
674
|
+
|
|
675
|
+
<!-- =========================== -->
|
|
676
|
+
<!-- AGENT PLATFORMS -->
|
|
677
|
+
<!-- =========================== -->
|
|
678
|
+
|
|
679
|
+
<details>
|
|
680
|
+
<summary><strong>Agent Platforms — 6 integrations</strong></summary>
|
|
681
|
+
<br>
|
|
682
|
+
<table>
|
|
683
|
+
<tr>
|
|
684
|
+
<td><img src="https://www.google.com/s2/favicons?domain=hermes.ai&sz=32" width="16"> <b>Hermes</b> <sup>3</sup></td>
|
|
685
|
+
<td><img src="https://www.google.com/s2/favicons?domain=autoagent.dev&sz=32" width="16"> <b>AutoAgent</b> <sup>1</sup></td>
|
|
686
|
+
<td><img src="https://www.google.com/s2/favicons?domain=stagehand.dev&sz=32" width="16"> <b>Stagehand</b> <sup>1</sup></td>
|
|
687
|
+
</tr>
|
|
688
|
+
<tr>
|
|
689
|
+
<td><img src="https://www.google.com/s2/favicons?domain=github.com&sz=32" width="16"> <b>OpenHarness</b> <sup>2</sup></td>
|
|
690
|
+
<td><img src="https://www.google.com/s2/favicons?domain=openai.com&sz=32" width="16"> <b>CUA</b> <sup>2</sup></td>
|
|
691
|
+
<td></td>
|
|
692
|
+
</tr>
|
|
693
|
+
</table>
|
|
694
|
+
</details>
|
|
208
695
|
|
|
209
|
-
##
|
|
696
|
+
## Architecture
|
|
210
697
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
| `cookie` | Cookie file | `~/.unicli/cookies/<site>.json` injected into headers |
|
|
215
|
-
| `header` | Cookie + CSRF | Cookie + auto-extracted CSRF token (ct0, bili_jct, etc.) |
|
|
216
|
-
| `intercept` | Browser | Navigate page, capture XHR/fetch responses |
|
|
217
|
-
| `ui` | Browser | Direct DOM interaction (click, type, submit) |
|
|
698
|
+
```mermaid
|
|
699
|
+
graph TB
|
|
700
|
+
CMD["unicli <site> <command> [args]"]
|
|
218
701
|
|
|
219
|
-
|
|
702
|
+
CMD --> YAML["YAML Adapter<br/><i>~20 lines, agent-editable</i>"]
|
|
703
|
+
CMD --> TS["TS Adapter<br/><i>complex logic</i>"]
|
|
704
|
+
CMD --> BRIDGE["Bridge<br/><i>passthrough to CLI</i>"]
|
|
220
705
|
|
|
221
|
-
|
|
706
|
+
YAML --> ENGINE
|
|
707
|
+
TS --> ENGINE
|
|
708
|
+
BRIDGE --> ENGINE
|
|
222
709
|
|
|
223
|
-
|
|
710
|
+
subgraph ENGINE ["Pipeline Engine — 35 steps"]
|
|
711
|
+
direction LR
|
|
712
|
+
API["fetch fetch_text<br/>parse_rss html_to_md"]
|
|
713
|
+
TRANSFORM["select map filter<br/>sort limit"]
|
|
714
|
+
BROWSER["navigate evaluate<br/>click type press<br/>scroll intercept<br/>snapshot tap extract"]
|
|
715
|
+
CONTROL["set if each<br/>parallel append<br/>rate_limit assert retry"]
|
|
716
|
+
OTHER["exec write_temp<br/>download websocket"]
|
|
717
|
+
end
|
|
224
718
|
|
|
719
|
+
ENGINE --> CDP["Direct CDP"]
|
|
720
|
+
ENGINE --> DAEMON["Browser Daemon<br/><i>reuses Chrome logins</i>"]
|
|
721
|
+
|
|
722
|
+
CDP --> OUT["Output Formatter<br/><i>table · json · yaml · csv · md</i>"]
|
|
723
|
+
DAEMON --> OUT
|
|
225
724
|
```
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
725
|
+
|
|
726
|
+
Remote browser support via `UNICLI_CDP_ENDPOINT` — connect to any CDP WebSocket (Cloudflare Browser Rendering, Browserless, or self-hosted).
|
|
727
|
+
|
|
728
|
+
## Write an Adapter
|
|
729
|
+
|
|
730
|
+
Most adapters are ~20 lines of YAML:
|
|
731
|
+
|
|
732
|
+
```yaml
|
|
733
|
+
site: hackernews
|
|
734
|
+
name: top
|
|
735
|
+
type: web-api
|
|
736
|
+
strategy: public
|
|
737
|
+
pipeline:
|
|
738
|
+
- fetch:
|
|
739
|
+
url: "https://hacker-news.firebaseio.com/v0/topstories.json"
|
|
740
|
+
- limit: { count: "${{ args.limit | default(30) }}" }
|
|
741
|
+
- each:
|
|
742
|
+
do:
|
|
743
|
+
- fetch:
|
|
744
|
+
url: "https://hacker-news.firebaseio.com/v0/item/${{ item }}.json"
|
|
745
|
+
max: "${{ args.limit | default(30) }}"
|
|
746
|
+
- map:
|
|
747
|
+
title: "${{ item.title }}"
|
|
748
|
+
score: "${{ item.score }}"
|
|
749
|
+
url: "${{ item.url }}"
|
|
750
|
+
by: "${{ item.by }}"
|
|
751
|
+
columns: [title, score, by, url]
|
|
238
752
|
```
|
|
239
753
|
|
|
240
|
-
|
|
754
|
+
Five adapter types: `web-api`, `desktop`, `browser`, `bridge`, `service`.
|
|
755
|
+
|
|
756
|
+
29 template filters in a sandboxed VM: `join`, `urlencode`, `truncate`, `slugify`, `sanitize`, `basename`, `strip_html`, `default`, `split`, `first`, `last`, `length`, `keys`, `json`, `replace`, `lowercase`, `uppercase`, `trim`, `slice`, `reverse`, `unique`, `abs`, `round`, `ceil`, `floor`, `int`, `float`, `str`, `ext`.
|
|
757
|
+
|
|
758
|
+
## Authentication
|
|
759
|
+
|
|
760
|
+
Five strategies, auto-detected via cascade (`PUBLIC → COOKIE → HEADER`):
|
|
761
|
+
|
|
762
|
+
| Strategy | How |
|
|
763
|
+
| ----------- | -------------------------------------------------------- |
|
|
764
|
+
| `public` | Direct HTTP — no credentials |
|
|
765
|
+
| `cookie` | Injects cookies from `~/.unicli/cookies/<site>.json` |
|
|
766
|
+
| `header` | Cookie + auto-extracted CSRF token (ct0, bili_jct, etc.) |
|
|
767
|
+
| `intercept` | Navigates page in Chrome, captures XHR/fetch responses |
|
|
768
|
+
| `ui` | Direct DOM interaction (click, type, submit) |
|
|
241
769
|
|
|
242
770
|
```bash
|
|
243
|
-
unicli
|
|
244
|
-
unicli
|
|
245
|
-
unicli
|
|
246
|
-
unicli plugin update # Update all
|
|
771
|
+
unicli auth setup twitter # Show required cookies + template
|
|
772
|
+
unicli auth check twitter # Validate cookie file
|
|
773
|
+
unicli auth list # List configured sites
|
|
247
774
|
```
|
|
248
775
|
|
|
249
|
-
|
|
776
|
+
## Browser Daemon
|
|
777
|
+
|
|
778
|
+
Persistent background process that reuses your Chrome login sessions — no cookie export, no extension install:
|
|
250
779
|
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
780
|
+
```bash
|
|
781
|
+
unicli daemon status # Check daemon
|
|
782
|
+
unicli operate open <url> # Navigate
|
|
783
|
+
unicli operate state # DOM accessibility snapshot
|
|
784
|
+
unicli operate click <ref> # Click by ref
|
|
785
|
+
unicli operate type <ref> <text> # Type into element
|
|
786
|
+
unicli operate eval <js> # Execute JavaScript
|
|
787
|
+
unicli operate screenshot # Capture page
|
|
788
|
+
unicli record <url> # Auto-generate adapter from traffic
|
|
259
789
|
```
|
|
260
790
|
|
|
261
|
-
|
|
791
|
+
13-layer anti-detection stealth: webdriver removal, `chrome.runtime` mock, CDP marker cleanup, `Error.stack` filtering, iframe consistency, and more. Auto-exits after 4h idle.
|
|
792
|
+
|
|
793
|
+
## Agent Integration
|
|
794
|
+
|
|
795
|
+
Works with every major agent platform:
|
|
262
796
|
|
|
263
797
|
```bash
|
|
264
|
-
|
|
265
|
-
unicli
|
|
266
|
-
|
|
798
|
+
# Claude Code / Codex CLI — direct shell
|
|
799
|
+
unicli twitter search "AI agents"
|
|
800
|
+
|
|
801
|
+
# MCP — one command to expose all 969 commands
|
|
802
|
+
unicli mcp serve
|
|
803
|
+
|
|
804
|
+
# AGENTS.md — discovery file already included in repo
|
|
805
|
+
cat AGENTS.md
|
|
267
806
|
```
|
|
268
807
|
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
4. Language header consistency
|
|
277
|
-
5. Permissions API notification fix
|
|
278
|
-
6. `Function.prototype.toString` spoofing
|
|
279
|
-
7. CDP global cleanup (`cdc_`, `__playwright`, `__puppeteer`)
|
|
280
|
-
8. `Error.stack` frame filtering
|
|
281
|
-
9. `outerWidth`/`outerHeight` normalization
|
|
282
|
-
10. Performance API entry filtering
|
|
283
|
-
11. Document-level CDP marker cleanup
|
|
284
|
-
12. iframe `contentWindow.chrome` consistency
|
|
285
|
-
13. Reserved (debugger trap neutralization)
|
|
286
|
-
|
|
287
|
-
## Exit Codes
|
|
288
|
-
|
|
289
|
-
Following `sysexits.h`:
|
|
290
|
-
|
|
291
|
-
| Code | Meaning | When |
|
|
292
|
-
| ---- | ----------- | ----------------------------- |
|
|
293
|
-
| `0` | Success | Command completed |
|
|
294
|
-
| `1` | Error | Unexpected failure |
|
|
295
|
-
| `2` | Usage | Bad arguments |
|
|
296
|
-
| `66` | Empty | No data returned |
|
|
297
|
-
| `69` | Unavailable | Browser/service not connected |
|
|
298
|
-
| `75` | Temporary | Timeout — retry |
|
|
299
|
-
| `77` | Auth | Not logged in |
|
|
300
|
-
| `78` | Config | Missing credentials |
|
|
808
|
+
| Platform | Integration |
|
|
809
|
+
| --- | --- |
|
|
810
|
+
| **Claude Code** | Bash tool + MCP server + AGENTS.md |
|
|
811
|
+
| **Codex CLI** | Shell execution + MCP + AGENTS.md (first-class) |
|
|
812
|
+
| **OpenClaw** | Plugin + MCP + ClawHub skill |
|
|
813
|
+
| **Hermes Agent** | MCP + Skills Hub + persistent shell |
|
|
814
|
+
| **OpenCode** | MCP via opencode.jsonc + AGENTS.md |
|
|
301
815
|
|
|
302
816
|
## Development
|
|
303
817
|
|
|
304
818
|
```bash
|
|
305
819
|
git clone https://github.com/olo-dot-io/Uni-CLI.git && cd Uni-CLI
|
|
306
|
-
npm install
|
|
307
|
-
npm run dev -- list # Test adapter loading
|
|
308
|
-
npm run verify # format + typecheck + lint + test + build
|
|
309
|
-
npm run test:adapter # Validate all 601 YAML/TS adapters
|
|
820
|
+
npm install && npm run verify
|
|
310
821
|
```
|
|
311
822
|
|
|
312
|
-
| Command | Purpose
|
|
313
|
-
| ---------------------- |
|
|
314
|
-
| `npm run dev` |
|
|
315
|
-
| `npm run build` | Production build
|
|
316
|
-
| `npm run typecheck` | TypeScript strict
|
|
317
|
-
| `npm run lint` | Oxlint
|
|
318
|
-
| `npm run test` | Unit tests (
|
|
319
|
-
| `npm run test:adapter` |
|
|
320
|
-
| `npm run verify` | Full pipeline
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
| Layer | Technology |
|
|
325
|
-
| -------- | ---------------------------------------------------------- |
|
|
326
|
-
| Language | TypeScript (strict) |
|
|
327
|
-
| Runtime | Node.js ≥ 20 |
|
|
328
|
-
| CLI | Commander |
|
|
329
|
-
| Browser | Raw CDP via `ws` (WebSocket) — no Puppeteer, no Playwright |
|
|
330
|
-
| Test | Vitest |
|
|
331
|
-
| Lint | Oxlint |
|
|
332
|
-
| Format | Prettier |
|
|
333
|
-
| Template | VM sandbox (null-prototype, 50ms timeout) |
|
|
334
|
-
|
|
335
|
-
Zero production dependencies beyond: `chalk`, `cli-table3`, `commander`, `js-yaml`, `turndown`, `undici`, `ws`.
|
|
823
|
+
| Command | Purpose |
|
|
824
|
+
| ---------------------- | ------------------------- |
|
|
825
|
+
| `npm run dev` | Dev run |
|
|
826
|
+
| `npm run build` | Production build |
|
|
827
|
+
| `npm run typecheck` | TypeScript strict |
|
|
828
|
+
| `npm run lint` | Oxlint |
|
|
829
|
+
| `npm run test` | Unit tests (788) |
|
|
830
|
+
| `npm run test:adapter` | Validate all adapters |
|
|
831
|
+
| `npm run verify` | Full pipeline |
|
|
832
|
+
|
|
833
|
+
7 production dependencies: `chalk`, `cli-table3`, `commander`, `js-yaml`, `turndown`, `undici`, `ws`.
|
|
336
834
|
|
|
337
835
|
## Contributing
|
|
338
836
|
|
|
339
|
-
|
|
837
|
+
The fastest way to contribute: write a [20-line YAML adapter](./CONTRIBUTING.md) for a site you use.
|
|
838
|
+
|
|
839
|
+
```bash
|
|
840
|
+
unicli init <site> <command> # Scaffold new adapter
|
|
841
|
+
unicli dev <path> # Hot-reload during dev
|
|
842
|
+
unicli test <site> # Validate
|
|
843
|
+
```
|
|
844
|
+
|
|
845
|
+
## Search & Discovery
|
|
846
|
+
|
|
847
|
+
Agents find commands through bilingual semantic search — no need to memorize site names.
|
|
848
|
+
|
|
849
|
+
```bash
|
|
850
|
+
unicli search "推特热门" # → twitter trending
|
|
851
|
+
unicli search "download video" # → bilibili download, yt-dlp download, twitter download
|
|
852
|
+
unicli search "股票行情" # → binance ticker, barchart quote, xueqiu quote
|
|
853
|
+
unicli search --category finance # → all finance commands
|
|
854
|
+
```
|
|
855
|
+
|
|
856
|
+
The search engine uses BM25 scoring with a ~200-entry bilingual alias table (Chinese↔English). The entire index is 50KB, searches complete in <10ms.
|
|
857
|
+
|
|
858
|
+
## Agent Integration
|
|
859
|
+
|
|
860
|
+
```bash
|
|
861
|
+
# CLI direct (any agent with shell access)
|
|
862
|
+
npm install -g @zenalexa/unicli
|
|
863
|
+
|
|
864
|
+
# MCP server (Claude Code, Codex CLI, Hermes, OpenCode)
|
|
865
|
+
npx @zenalexa/unicli mcp serve
|
|
866
|
+
|
|
867
|
+
# MCP with SSE transport (remote connections)
|
|
868
|
+
npx @zenalexa/unicli mcp serve --transport sse --port 19826
|
|
869
|
+
|
|
870
|
+
# MCP with OAuth (enterprise)
|
|
871
|
+
npx @zenalexa/unicli mcp serve --transport http --auth
|
|
872
|
+
```
|
|
873
|
+
|
|
874
|
+
| Platform | One-line Setup |
|
|
875
|
+
|----------|---------------|
|
|
876
|
+
| **Claude Code** | `claude mcp add unicli -- npx @zenalexa/unicli mcp serve` |
|
|
877
|
+
| **Codex CLI** | Add `[mcp_servers.unicli]` to `~/.codex/config.toml` |
|
|
878
|
+
| **Any MCP client** | `npx @zenalexa/unicli mcp serve` (stdio) |
|
|
879
|
+
|
|
880
|
+
The MCP server exposes 4 meta-tools by default (~200 tokens). `unicli_search` provides bilingual semantic search across all 1020 commands.
|
|
340
881
|
|
|
341
882
|
## License
|
|
342
883
|
|
|
@@ -345,6 +886,12 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md). The fastest way to contribute: write a
|
|
|
345
886
|
---
|
|
346
887
|
|
|
347
888
|
<p align="center">
|
|
348
|
-
<
|
|
349
|
-
|
|
889
|
+
<a href="https://github.com/olo-dot-io/Uni-CLI/graphs/contributors">
|
|
890
|
+
<img src="https://contrib.rocks/image?repo=olo-dot-io/Uni-CLI" alt="Contributors">
|
|
891
|
+
</a>
|
|
892
|
+
</p>
|
|
893
|
+
|
|
894
|
+
<p align="center">
|
|
895
|
+
<sub>v0.211.2 — Vostok · Volynov</sub><br>
|
|
896
|
+
<sub>198 sites · 1020 commands · 35 pipeline steps · BM25+TF-IDF bilingual search · MCP 2025-03-26 · 855 tests</sub>
|
|
350
897
|
</p>
|