@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.
Files changed (399) hide show
  1. package/AGENTS.md +75 -20
  2. package/README.md +832 -285
  3. package/dist/adapters/cursor/cursor.d.ts +2 -1
  4. package/dist/adapters/cursor/cursor.d.ts.map +1 -1
  5. package/dist/adapters/cursor/cursor.js +87 -1
  6. package/dist/adapters/cursor/cursor.js.map +1 -1
  7. package/dist/adapters/discord-app/discord-app.d.ts +1 -1
  8. package/dist/adapters/discord-app/discord-app.js +94 -1
  9. package/dist/adapters/discord-app/discord-app.js.map +1 -1
  10. package/dist/browser/bridge.d.ts +45 -0
  11. package/dist/browser/bridge.d.ts.map +1 -1
  12. package/dist/browser/bridge.js +94 -1
  13. package/dist/browser/bridge.js.map +1 -1
  14. package/dist/browser/cdp-client.d.ts +24 -1
  15. package/dist/browser/cdp-client.d.ts.map +1 -1
  16. package/dist/browser/cdp-client.js +56 -2
  17. package/dist/browser/cdp-client.js.map +1 -1
  18. package/dist/browser/launcher.d.ts +5 -0
  19. package/dist/browser/launcher.d.ts.map +1 -1
  20. package/dist/browser/launcher.js +7 -0
  21. package/dist/browser/launcher.js.map +1 -1
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +72 -2
  24. package/dist/cli.js.map +1 -1
  25. package/dist/commands/agents.d.ts +14 -3
  26. package/dist/commands/agents.d.ts.map +1 -1
  27. package/dist/commands/agents.js +369 -140
  28. package/dist/commands/agents.js.map +1 -1
  29. package/dist/commands/browser.d.ts.map +1 -1
  30. package/dist/commands/browser.js +79 -1
  31. package/dist/commands/browser.js.map +1 -1
  32. package/dist/commands/ext.d.ts +11 -0
  33. package/dist/commands/ext.d.ts.map +1 -0
  34. package/dist/commands/ext.js +122 -0
  35. package/dist/commands/ext.js.map +1 -0
  36. package/dist/commands/mcp.d.ts +3 -4
  37. package/dist/commands/mcp.d.ts.map +1 -1
  38. package/dist/commands/mcp.js +47 -62
  39. package/dist/commands/mcp.js.map +1 -1
  40. package/dist/commands/schema.d.ts +12 -0
  41. package/dist/commands/schema.d.ts.map +1 -0
  42. package/dist/commands/schema.js +72 -0
  43. package/dist/commands/schema.js.map +1 -0
  44. package/dist/commands/search.d.ts +12 -0
  45. package/dist/commands/search.d.ts.map +1 -0
  46. package/dist/commands/search.js +47 -0
  47. package/dist/commands/search.js.map +1 -0
  48. package/dist/commands/skills.d.ts +2 -3
  49. package/dist/commands/skills.d.ts.map +1 -1
  50. package/dist/commands/skills.js +2 -3
  51. package/dist/commands/skills.js.map +1 -1
  52. package/dist/commands/status.d.ts +12 -0
  53. package/dist/commands/status.d.ts.map +1 -0
  54. package/dist/commands/status.js +137 -0
  55. package/dist/commands/status.js.map +1 -0
  56. package/dist/discovery/aliases.d.ts +31 -0
  57. package/dist/discovery/aliases.d.ts.map +1 -0
  58. package/dist/discovery/aliases.js +477 -0
  59. package/dist/discovery/aliases.js.map +1 -0
  60. package/dist/discovery/loader.d.ts.map +1 -1
  61. package/dist/discovery/loader.js +25 -0
  62. package/dist/discovery/loader.js.map +1 -1
  63. package/dist/discovery/search.d.ts +73 -0
  64. package/dist/discovery/search.d.ts.map +1 -0
  65. package/dist/discovery/search.js +355 -0
  66. package/dist/discovery/search.js.map +1 -0
  67. package/dist/engine/yaml-runner.d.ts +10 -0
  68. package/dist/engine/yaml-runner.d.ts.map +1 -1
  69. package/dist/engine/yaml-runner.js +51 -3
  70. package/dist/engine/yaml-runner.js.map +1 -1
  71. package/dist/hub/index.d.ts +37 -0
  72. package/dist/hub/index.d.ts.map +1 -0
  73. package/dist/hub/index.js +98 -0
  74. package/dist/hub/index.js.map +1 -0
  75. package/dist/hub/passthrough.d.ts +21 -0
  76. package/dist/hub/passthrough.d.ts.map +1 -0
  77. package/dist/hub/passthrough.js +71 -0
  78. package/dist/hub/passthrough.js.map +1 -0
  79. package/dist/manifest-compact.txt +15 -0
  80. package/dist/manifest-search.json +1 -0
  81. package/dist/manifest.json +2163 -268
  82. package/dist/mcp/oauth.d.ts +33 -0
  83. package/dist/mcp/oauth.d.ts.map +1 -0
  84. package/dist/mcp/oauth.js +220 -0
  85. package/dist/mcp/oauth.js.map +1 -0
  86. package/dist/mcp/schema.d.ts +65 -0
  87. package/dist/mcp/schema.d.ts.map +1 -0
  88. package/dist/mcp/schema.js +136 -0
  89. package/dist/mcp/schema.js.map +1 -0
  90. package/dist/mcp/server.d.ts +23 -10
  91. package/dist/mcp/server.d.ts.map +1 -1
  92. package/dist/mcp/server.js +350 -182
  93. package/dist/mcp/server.js.map +1 -1
  94. package/dist/mcp/sse-transport.d.ts +34 -0
  95. package/dist/mcp/sse-transport.d.ts.map +1 -0
  96. package/dist/mcp/sse-transport.js +182 -0
  97. package/dist/mcp/sse-transport.js.map +1 -0
  98. package/dist/mcp/streamable-http.d.ts +64 -0
  99. package/dist/mcp/streamable-http.d.ts.map +1 -0
  100. package/dist/mcp/streamable-http.js +312 -0
  101. package/dist/mcp/streamable-http.js.map +1 -0
  102. package/dist/permissions/sensitive-paths.js +2 -2
  103. package/dist/permissions/sensitive-paths.js.map +1 -1
  104. package/dist/types.d.ts +15 -0
  105. package/dist/types.d.ts.map +1 -1
  106. package/dist/types.js.map +1 -1
  107. package/package.json +8 -7
  108. package/src/adapters/1688/_site.json +9 -0
  109. package/src/adapters/36kr/latest.yaml +36 -0
  110. package/src/adapters/arxiv/trending.yaml +37 -0
  111. package/src/adapters/baidu/hot.yaml +37 -0
  112. package/src/adapters/baidu/search.yaml +41 -0
  113. package/src/adapters/barchart/_site.json +10 -0
  114. package/src/adapters/bbc/technology.yaml +26 -0
  115. package/src/adapters/bbc/top.yaml +26 -0
  116. package/src/adapters/bbc/world.yaml +26 -0
  117. package/src/adapters/bilibili/coin.yaml +33 -0
  118. package/src/adapters/bilibili/later.yaml +31 -0
  119. package/src/adapters/bilibili/live.yaml +41 -0
  120. package/src/adapters/bilibili/trending.yaml +29 -0
  121. package/src/adapters/binance/hot.yaml +39 -0
  122. package/src/adapters/binance/kline.yaml +35 -0
  123. package/src/adapters/binance/ticker.yaml +33 -0
  124. package/src/adapters/bluesky/likes.yaml +35 -0
  125. package/src/adapters/bluesky/notifications.yaml +30 -0
  126. package/src/adapters/bluesky/post.yaml +25 -0
  127. package/src/adapters/chrome/bookmarks.yaml +26 -0
  128. package/src/adapters/chrome/tabs.yaml +25 -0
  129. package/src/adapters/cnki/search.yaml +40 -0
  130. package/src/adapters/cnn/technology.yaml +26 -0
  131. package/src/adapters/cocoapods/info.yaml +33 -0
  132. package/src/adapters/coinbase/prices.yaml +27 -0
  133. package/src/adapters/coinbase/rates.yaml +24 -0
  134. package/src/adapters/coupang/hot.yaml +29 -0
  135. package/src/adapters/crates-io/info.yaml +29 -0
  136. package/src/adapters/crates-io/versions.yaml +33 -0
  137. package/src/adapters/ctrip/hot.yaml +28 -0
  138. package/src/adapters/cursor/cursor.ts +91 -1
  139. package/src/adapters/dangdang/hot.yaml +38 -0
  140. package/src/adapters/dangdang/search.yaml +43 -0
  141. package/src/adapters/deepseek/chat.yaml +33 -0
  142. package/src/adapters/deepseek/models.yaml +18 -0
  143. package/src/adapters/devto/latest.yaml +29 -0
  144. package/src/adapters/devto/search.yaml +34 -0
  145. package/src/adapters/dianping/hot.yaml +43 -0
  146. package/src/adapters/dianping/search.yaml +48 -0
  147. package/src/adapters/discord-app/discord-app.ts +99 -1
  148. package/src/adapters/docker/networks.yaml +20 -0
  149. package/src/adapters/docker/volumes.yaml +19 -0
  150. package/src/adapters/docker-hub/info.yaml +26 -0
  151. package/src/adapters/docker-hub/tags.yaml +34 -0
  152. package/src/adapters/douban/group-hot.yaml +29 -0
  153. package/src/adapters/douban/new-movies.yaml +32 -0
  154. package/src/adapters/douban/tv-hot.yaml +32 -0
  155. package/src/adapters/doubao/ask.yaml +64 -0
  156. package/src/adapters/doubao/new.yaml +18 -0
  157. package/src/adapters/doubao/status.yaml +21 -0
  158. package/src/adapters/douyu/hot.yaml +34 -0
  159. package/src/adapters/douyu/search.yaml +42 -0
  160. package/src/adapters/eastmoney/fund.yaml +36 -0
  161. package/src/adapters/eastmoney/market.yaml +26 -0
  162. package/src/adapters/ele/hot.yaml +40 -0
  163. package/src/adapters/ele/search.yaml +47 -0
  164. package/src/adapters/exchangerate/list.yaml +25 -0
  165. package/src/adapters/facebook/marketplace.yaml +43 -0
  166. package/src/adapters/facebook/post.yaml +29 -0
  167. package/src/adapters/futu/hot.yaml +49 -0
  168. package/src/adapters/futu/quote.yaml +46 -0
  169. package/src/adapters/gitee/repos.yaml +34 -0
  170. package/src/adapters/github-trending/developers.yaml +33 -0
  171. package/src/adapters/github-trending/weekly.yaml +34 -0
  172. package/src/adapters/gitlab/projects.yaml +34 -0
  173. package/src/adapters/godot/scene-export.yaml +1 -1
  174. package/src/adapters/hackernews/comments.yaml +36 -0
  175. package/src/adapters/hackernews/item.yaml +28 -0
  176. package/src/adapters/hf/datasets.yaml +34 -0
  177. package/src/adapters/hf/spaces.yaml +34 -0
  178. package/src/adapters/homebrew/search.yaml +27 -0
  179. package/src/adapters/huggingface-papers/search.yaml +33 -0
  180. package/src/adapters/imdb/box-office.yaml +28 -0
  181. package/src/adapters/infoq/latest.yaml +26 -0
  182. package/src/adapters/instagram/activity.yaml +45 -0
  183. package/src/adapters/instagram/highlights.yaml +48 -0
  184. package/src/adapters/instagram/reels-trending.yaml +51 -0
  185. package/src/adapters/instagram/reels.yaml +34 -0
  186. package/src/adapters/instagram/stories.yaml +29 -0
  187. package/src/adapters/instagram/suggested.yaml +40 -0
  188. package/src/adapters/instagram/tags.yaml +52 -0
  189. package/src/adapters/itch-io/search.yaml +35 -0
  190. package/src/adapters/itch-io/top.yaml +31 -0
  191. package/src/adapters/ithome/hot.yaml +27 -0
  192. package/src/adapters/ithome/latest.yaml +26 -0
  193. package/src/adapters/jd/_site.json +9 -0
  194. package/src/adapters/jianyu/search.yaml +42 -0
  195. package/src/adapters/ke/ershoufang.yaml +75 -0
  196. package/src/adapters/ke/xiaoqu.yaml +73 -0
  197. package/src/adapters/kuaishou/hot.yaml +39 -0
  198. package/src/adapters/kuaishou/search.yaml +44 -0
  199. package/src/adapters/linkedin/_site.json +10 -0
  200. package/src/adapters/linkedin/jobs.yaml +47 -0
  201. package/src/adapters/lobsters/search.yaml +35 -0
  202. package/src/adapters/macos/active-app.yaml +16 -0
  203. package/src/adapters/macos/apps-list.yaml +14 -0
  204. package/src/adapters/macos/apps.yaml +31 -0
  205. package/src/adapters/macos/battery.yaml +26 -0
  206. package/src/adapters/macos/bluetooth.yaml +14 -0
  207. package/src/adapters/macos/brightness.yaml +22 -0
  208. package/src/adapters/macos/caffeinate.yaml +25 -0
  209. package/src/adapters/macos/calendar-create.yaml +81 -0
  210. package/src/adapters/macos/calendar-list.yaml +53 -0
  211. package/src/adapters/macos/calendar-today.yaml +30 -0
  212. package/src/adapters/macos/clipboard.yaml +23 -0
  213. package/src/adapters/macos/contacts-search.yaml +59 -0
  214. package/src/adapters/macos/dark-mode.yaml +19 -0
  215. package/src/adapters/macos/disk-info.yaml +31 -0
  216. package/src/adapters/macos/disk-usage.yaml +14 -0
  217. package/src/adapters/macos/do-not-disturb.yaml +21 -0
  218. package/src/adapters/macos/empty-trash.yaml +16 -0
  219. package/src/adapters/macos/finder-copy.yaml +40 -0
  220. package/src/adapters/macos/finder-move.yaml +40 -0
  221. package/src/adapters/macos/finder-new-folder.yaml +36 -0
  222. package/src/adapters/macos/finder-recent.yaml +24 -0
  223. package/src/adapters/macos/finder-selection.yaml +22 -0
  224. package/src/adapters/macos/finder-tags.yaml +40 -0
  225. package/src/adapters/macos/lock-screen.yaml +16 -0
  226. package/src/adapters/macos/mail-send.yaml +54 -0
  227. package/src/adapters/macos/mail-status.yaml +38 -0
  228. package/src/adapters/macos/messages-send.yaml +42 -0
  229. package/src/adapters/macos/music-control.yaml +43 -0
  230. package/src/adapters/macos/music-now.yaml +34 -0
  231. package/src/adapters/macos/notes-list.yaml +30 -0
  232. package/src/adapters/macos/notes-search.yaml +45 -0
  233. package/src/adapters/macos/notification.yaml +27 -0
  234. package/src/adapters/macos/notify.yaml +46 -0
  235. package/src/adapters/macos/open-app.yaml +21 -0
  236. package/src/adapters/macos/open.yaml +24 -0
  237. package/src/adapters/macos/photos-search.yaml +44 -0
  238. package/src/adapters/macos/processes.yaml +14 -0
  239. package/src/adapters/macos/reminder-create.yaml +75 -0
  240. package/src/adapters/macos/reminders-complete.yaml +33 -0
  241. package/src/adapters/macos/reminders-list.yaml +28 -0
  242. package/src/adapters/macos/safari-history.yaml +23 -0
  243. package/src/adapters/macos/safari-tabs.yaml +26 -0
  244. package/src/adapters/macos/safari-url.yaml +22 -0
  245. package/src/adapters/macos/say.yaml +36 -0
  246. package/src/adapters/macos/screen-lock.yaml +16 -0
  247. package/src/adapters/macos/screen-recording.yaml +32 -0
  248. package/src/adapters/macos/screenshot.yaml +34 -0
  249. package/src/adapters/macos/shortcuts-list.yaml +14 -0
  250. package/src/adapters/macos/shortcuts-run.yaml +28 -0
  251. package/src/adapters/macos/sleep.yaml +14 -0
  252. package/src/adapters/macos/spotlight.yaml +43 -0
  253. package/src/adapters/macos/system-info.yaml +32 -0
  254. package/src/adapters/macos/trash.yaml +32 -0
  255. package/src/adapters/macos/uptime.yaml +14 -0
  256. package/src/adapters/macos/volume.yaml +19 -0
  257. package/src/adapters/macos/wallpaper.yaml +33 -0
  258. package/src/adapters/macos/wifi-info.yaml +14 -0
  259. package/src/adapters/macos/wifi.yaml +63 -0
  260. package/src/adapters/maimai/search.yaml +62 -0
  261. package/src/adapters/maoyan/hot.yaml +33 -0
  262. package/src/adapters/maoyan/search.yaml +40 -0
  263. package/src/adapters/mastodon/timeline.yaml +33 -0
  264. package/src/adapters/mastodon/user.yaml +32 -0
  265. package/src/adapters/medium/article.yaml +22 -0
  266. package/src/adapters/medium/trending.yaml +30 -0
  267. package/src/adapters/meituan/hot.yaml +26 -0
  268. package/src/adapters/mubu/list.yaml +36 -0
  269. package/src/adapters/mubu/search.yaml +54 -0
  270. package/src/adapters/netease-music/playlist.yaml +34 -0
  271. package/src/adapters/netease-music/top.yaml +33 -0
  272. package/src/adapters/notion/databases.yaml +41 -0
  273. package/src/adapters/notion/pages.yaml +44 -0
  274. package/src/adapters/notion/search.yaml +41 -0
  275. package/src/adapters/npm/downloads.yaml +28 -0
  276. package/src/adapters/npm/info.yaml +25 -0
  277. package/src/adapters/npm/search.yaml +35 -0
  278. package/src/adapters/npm/versions.yaml +33 -0
  279. package/src/adapters/npm-trends/trending.yaml +17 -0
  280. package/src/adapters/nytimes/search.yaml +35 -0
  281. package/src/adapters/obsidian/daily.yaml +23 -0
  282. package/src/adapters/obsidian/open.yaml +26 -0
  283. package/src/adapters/obsidian/search.yaml +28 -0
  284. package/src/adapters/ollama/generate.yaml +33 -0
  285. package/src/adapters/ollama/models.yaml +29 -0
  286. package/src/adapters/ollama/ps.yaml +20 -0
  287. package/src/adapters/openrouter/search.yaml +31 -0
  288. package/src/adapters/perplexity/ask.yaml +33 -0
  289. package/src/adapters/pexels/curated.yaml +31 -0
  290. package/src/adapters/pinduoduo/search.yaml +36 -0
  291. package/src/adapters/producthunt/search.yaml +41 -0
  292. package/src/adapters/pypi/search.yaml +37 -0
  293. package/src/adapters/pypi/versions.yaml +31 -0
  294. package/src/adapters/quark/ls.yaml +39 -0
  295. package/src/adapters/quark/search.yaml +39 -0
  296. package/src/adapters/qweather/forecast.yaml +37 -0
  297. package/src/adapters/reddit/new.yaml +34 -0
  298. package/src/adapters/reddit/rising.yaml +33 -0
  299. package/src/adapters/reddit/top.yaml +40 -0
  300. package/src/adapters/reddit/trending.yaml +25 -0
  301. package/src/adapters/replicate/run.yaml +39 -0
  302. package/src/adapters/reuters/_site.json +9 -0
  303. package/src/adapters/reuters/latest.yaml +26 -0
  304. package/src/adapters/sinablog/_site.json +9 -0
  305. package/src/adapters/sinafinance/market.yaml +21 -0
  306. package/src/adapters/slack/messages.yaml +41 -0
  307. package/src/adapters/slack/post.yaml +32 -0
  308. package/src/adapters/slack/search.yaml +28 -0
  309. package/src/adapters/slack/send.yaml +35 -0
  310. package/src/adapters/slack/status.yaml +19 -0
  311. package/src/adapters/slack/users.yaml +37 -0
  312. package/src/adapters/slock/servers.yaml +32 -0
  313. package/src/adapters/smzdm/_site.json +9 -0
  314. package/src/adapters/spotify/now-playing.yaml +28 -0
  315. package/src/adapters/spotify/playlists.yaml +37 -0
  316. package/src/adapters/spotify/top-tracks.yaml +42 -0
  317. package/src/adapters/stackoverflow/question.yaml +34 -0
  318. package/src/adapters/stackoverflow/tags.yaml +30 -0
  319. package/src/adapters/steam/app-details.yaml +32 -0
  320. package/src/adapters/steam/new-releases.yaml +28 -0
  321. package/src/adapters/steam/search.yaml +36 -0
  322. package/src/adapters/steam/specials.yaml +29 -0
  323. package/src/adapters/steam/wishlist.yaml +36 -0
  324. package/src/adapters/substack/trending.yaml +28 -0
  325. package/src/adapters/taobao/hot.yaml +31 -0
  326. package/src/adapters/taobao/search.yaml +44 -0
  327. package/src/adapters/techcrunch/search.yaml +33 -0
  328. package/src/adapters/theverge/search.yaml +33 -0
  329. package/src/adapters/threads/hot.yaml +44 -0
  330. package/src/adapters/threads/search.yaml +47 -0
  331. package/src/adapters/tiktok/trending.yaml +28 -0
  332. package/src/adapters/toutiao/hot.yaml +31 -0
  333. package/src/adapters/toutiao/search.yaml +47 -0
  334. package/src/adapters/twitch/games.yaml +31 -0
  335. package/src/adapters/twitch/search.yaml +39 -0
  336. package/src/adapters/twitch/streams.yaml +38 -0
  337. package/src/adapters/twitter/lists.yaml +49 -0
  338. package/src/adapters/twitter/media.yaml +48 -0
  339. package/src/adapters/twitter/mentions.yaml +38 -0
  340. package/src/adapters/twitter/mute.yaml +42 -0
  341. package/src/adapters/twitter/pin.yaml +43 -0
  342. package/src/adapters/twitter/quotes.yaml +43 -0
  343. package/src/adapters/twitter/retweets.yaml +44 -0
  344. package/src/adapters/twitter/spaces.yaml +43 -0
  345. package/src/adapters/twitter/unmute.yaml +42 -0
  346. package/src/adapters/unsplash/random.yaml +27 -0
  347. package/src/adapters/v2ex/search.yaml +36 -0
  348. package/src/adapters/vscode/extensions.yaml +23 -0
  349. package/src/adapters/vscode/install-ext.yaml +26 -0
  350. package/src/adapters/vscode/open.yaml +25 -0
  351. package/src/adapters/wechat-channels/hot.yaml +39 -0
  352. package/src/adapters/wechat-channels/search.yaml +57 -0
  353. package/src/adapters/weibo/trending.yaml +28 -0
  354. package/src/adapters/weixin/_site.json +9 -0
  355. package/src/adapters/weixin/hot.yaml +22 -0
  356. package/src/adapters/wikipedia/today.yaml +25 -0
  357. package/src/adapters/xiaohongshu/follow.yaml +35 -0
  358. package/src/adapters/xiaohongshu/hashtag.yaml +44 -0
  359. package/src/adapters/xiaohongshu/hot.yaml +34 -0
  360. package/src/adapters/xiaohongshu/like.yaml +27 -0
  361. package/src/adapters/xiaohongshu/profile.yaml +39 -0
  362. package/src/adapters/xiaohongshu/save.yaml +27 -0
  363. package/src/adapters/xiaohongshu/suggest.yaml +34 -0
  364. package/src/adapters/xiaohongshu/trending.yaml +35 -0
  365. package/src/adapters/xiaohongshu/unfollow.yaml +40 -0
  366. package/src/adapters/xueqiu/market.yaml +25 -0
  367. package/src/adapters/yahoo-finance/quote.yaml +35 -0
  368. package/src/adapters/yahoo-finance/search.yaml +42 -0
  369. package/src/adapters/yahoo-finance/trending.yaml +30 -0
  370. package/src/adapters/youtube/playlist.yaml +43 -0
  371. package/src/adapters/youtube/shorts.yaml +42 -0
  372. package/src/adapters/youtube/trending.yaml +41 -0
  373. package/src/adapters/zhihu/answer.yaml +29 -0
  374. package/src/adapters/zhihu/answers.yaml +38 -0
  375. package/src/adapters/zhihu/article.yaml +27 -0
  376. package/src/adapters/zhihu/articles.yaml +38 -0
  377. package/src/adapters/zhihu/collections.yaml +37 -0
  378. package/src/adapters/zhihu/columns.yaml +38 -0
  379. package/src/adapters/zhihu/comment.yaml +42 -0
  380. package/src/adapters/zhihu/followers.yaml +37 -0
  381. package/src/adapters/zhihu/following.yaml +37 -0
  382. package/src/adapters/zhihu/pins.yaml +37 -0
  383. package/src/adapters/zhihu/topic.yaml +35 -0
  384. package/src/adapters/zhihu/topics.yaml +37 -0
  385. package/src/adapters/zhihu/trending.yaml +36 -0
  386. package/src/adapters/zhihu/user.yaml +30 -0
  387. package/src/adapters/zoom/join.yaml +24 -0
  388. package/src/adapters/zoom/start.yaml +17 -0
  389. package/src/hub/external-clis.yaml +343 -0
  390. package/src/hub/index.ts +128 -0
  391. package/src/hub/passthrough.ts +85 -0
  392. package/src/adapters/1688/manifest.yaml +0 -7
  393. package/src/adapters/barchart/manifest.yaml +0 -8
  394. package/src/adapters/jd/manifest.yaml +0 -7
  395. package/src/adapters/linkedin/manifest.yaml +0 -8
  396. package/src/adapters/reuters/manifest.yaml +0 -7
  397. package/src/adapters/sinablog/manifest.yaml +0 -7
  398. package/src/adapters/smzdm/manifest.yaml +0 -7
  399. package/src/adapters/weixin/manifest.yaml +0 -7
package/README.md CHANGED
@@ -1,342 +1,883 @@
1
- <!-- AGENT: npm install -g @zenalexa/unicli && unicli list | 756 commands across 167 sites. JSON when piped. Self-repairing YAML adapters. unicli repair --loop for autonomous fix. unicli research for self-improvement. See AGENTS.md -->
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
- <h1 align="center">Uni-CLI</h1>
3
+ <div align="center">
4
4
 
5
- <p align="center">
6
- <strong>The universal interface between AI agents and the world's software.</strong>
7
- </p>
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
- <p align="center">
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
- <p align="center">
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
- Agents cannot draw in SolidWorks. Cannot design PCBs. Cannot run CFD simulations. Cannot send Outlook emails. Cannot access most websites.
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
- Uni-CLI fixes this. One command, structured JSON output, self-repairing YAML adapters. **~80 tokens per invocation** — two orders of magnitude cheaper than MCP.
24
+ <br><br>
24
25
 
25
- ```bash
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
- ## Compared to
30
+ </div>
35
31
 
36
- > Source-level honest comparison. Numbers are from a 2026-04-07 audit of cloned reference repos under `ref/`. Full breakdown in [docs/COMPARE.md](./docs/COMPARE.md).
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
- | Project | Shape | Best when | Where Uni-CLI fits |
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
- ## Why CLI
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
- | Criterion | MCP | CLI (Uni-CLI) |
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
- CLI is: universal, composable, self-repairable, and context-efficient. MCP is a protocol for tool registration. **They solve different problems.** Uni-CLI supports both — use `unicli mcp` for MCP-only environments.
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
- ## Architecture
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
- unicli <site> <command> [args]
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
- This is the core differentiator. When a command fails:
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
- ```yaml
200
- ${{ item.title | truncate(50) }}
201
- ${{ item.tags | join(', ') }}
202
- ${{ args.query | urlencode }}
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
- VM sandbox with null-prototype isolation, 50ms timeout, forbidden pattern blocklist.
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
- ## Authentication Strategies
696
+ ## Architecture
210
697
 
211
- | Strategy | Auth | How |
212
- | ----------- | ------------- | -------------------------------------------------------- |
213
- | `public` | None | Direct HTTP fetch |
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 &lt;site&gt; &lt;command&gt; [args]"]
218
701
 
219
- Strategy cascade: auto-probes PUBLIC COOKIE → HEADER on first run.
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
- ## Browser Daemon
706
+ YAML --> ENGINE
707
+ TS --> ENGINE
708
+ BRIDGE --> ENGINE
222
709
 
223
- Persistent background process that bridges CLI commands to Chrome tabs. Reuses existing Chrome login sessions no cookie files, no extension install required for basic operation.
710
+ subgraph ENGINE ["Pipeline Engine35 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
- unicli daemon status # Check daemon state
227
- unicli daemon stop # Graceful shutdown (auto-exits after 4h idle)
228
-
229
- unicli operate open <url> # Navigate browser
230
- unicli operate state # DOM snapshot (accessibility tree)
231
- unicli operate click <ref> # Click by ref from snapshot
232
- unicli operate type <ref> <text> # Type into element
233
- unicli operate eval <js> # Execute JavaScript
234
- unicli operate screenshot [path] # Capture page
235
- unicli operate network # View captured requests
236
-
237
- unicli record <url> # Auto-generate adapter from page traffic
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
- ## Plugin System
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 plugin install github:user/repo # From GitHub
244
- unicli plugin install /local/path # From local directory
245
- unicli plugin list # Show installed
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
- Plugins can register custom pipeline steps via `registerStep()` and lifecycle hooks:
776
+ ## Browser Daemon
777
+
778
+ Persistent background process that reuses your Chrome login sessions — no cookie export, no extension install:
250
779
 
251
- ```typescript
252
- import { onBeforeExecute, onAfterExecute } from "unicli/hooks";
253
- onBeforeExecute(async (ctx) => {
254
- /* rate limiting, logging */
255
- });
256
- onAfterExecute(async (ctx, result) => {
257
- /* analytics, caching */
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
- ## Shell Completion
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
- unicli completion bash >> ~/.bashrc
265
- unicli completion zsh >> ~/.zshrc
266
- unicli completion fish > ~/.config/fish/completions/unicli.fish
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
- ## Anti-Detection
270
-
271
- 13-layer stealth injection for browser automation:
272
-
273
- 1. `navigator.webdriver` removal
274
- 2. `window.chrome.runtime` mock
275
- 3. Plugin array normalization
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` | Development run |
315
- | `npm run build` | Production build |
316
- | `npm run typecheck` | TypeScript strict check |
317
- | `npm run lint` | Oxlint |
318
- | `npm run test` | Unit tests (753) |
319
- | `npm run test:adapter` | Adapter validation |
320
- | `npm run verify` | Full pipeline |
321
-
322
- ## Technology
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
- See [CONTRIBUTING.md](./CONTRIBUTING.md). The fastest way to contribute: write a 20-line YAML adapter for a site you use.
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
- <sub>v0.209.0 — Vostok · Popovich</sub><br>
349
- <sub>167 sites · 756 commands · 35 pipeline steps · 29 filters · 775 unit tests</sub>
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>