@zenalexa/unicli 0.215.1 → 0.216.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 (407) hide show
  1. package/AGENTS.md +15 -15
  2. package/README.md +233 -389
  3. package/README.zh-CN.md +235 -362
  4. package/dist/adapters/1688/assets.d.ts +2 -0
  5. package/dist/adapters/1688/assets.d.ts.map +1 -0
  6. package/dist/adapters/1688/assets.js +102 -0
  7. package/dist/adapters/1688/assets.js.map +1 -0
  8. package/dist/adapters/51job/jobs.d.ts +2 -0
  9. package/dist/adapters/51job/jobs.d.ts.map +1 -0
  10. package/dist/adapters/51job/jobs.js +292 -0
  11. package/dist/adapters/51job/jobs.js.map +1 -0
  12. package/dist/adapters/_shared/browser-tools.d.ts +10 -0
  13. package/dist/adapters/_shared/browser-tools.d.ts.map +1 -0
  14. package/dist/adapters/_shared/browser-tools.js +42 -0
  15. package/dist/adapters/_shared/browser-tools.js.map +1 -0
  16. package/dist/adapters/antigravity/extra.d.ts +2 -0
  17. package/dist/adapters/antigravity/extra.d.ts.map +1 -0
  18. package/dist/adapters/antigravity/extra.js +52 -0
  19. package/dist/adapters/antigravity/extra.js.map +1 -0
  20. package/dist/adapters/baidu-scholar/search.d.ts +2 -0
  21. package/dist/adapters/baidu-scholar/search.d.ts.map +1 -0
  22. package/dist/adapters/baidu-scholar/search.js +34 -0
  23. package/dist/adapters/baidu-scholar/search.js.map +1 -0
  24. package/dist/adapters/bilibili/compat.d.ts +2 -0
  25. package/dist/adapters/bilibili/compat.d.ts.map +1 -0
  26. package/dist/adapters/bilibili/compat.js +114 -0
  27. package/dist/adapters/bilibili/compat.js.map +1 -0
  28. package/dist/adapters/chatgpt/image.d.ts +2 -0
  29. package/dist/adapters/chatgpt/image.d.ts.map +1 -0
  30. package/dist/adapters/chatgpt/image.js +81 -0
  31. package/dist/adapters/chatgpt/image.js.map +1 -0
  32. package/dist/adapters/chatgpt-app/chatgpt-app.d.ts +2 -0
  33. package/dist/adapters/chatgpt-app/chatgpt-app.d.ts.map +1 -0
  34. package/dist/adapters/chatgpt-app/chatgpt-app.js +9 -0
  35. package/dist/adapters/chatgpt-app/chatgpt-app.js.map +1 -0
  36. package/dist/adapters/chatwise/extra.d.ts +2 -0
  37. package/dist/adapters/chatwise/extra.d.ts.map +1 -0
  38. package/dist/adapters/chatwise/extra.js +35 -0
  39. package/dist/adapters/chatwise/extra.js.map +1 -0
  40. package/dist/adapters/codex/extra.d.ts +2 -0
  41. package/dist/adapters/codex/extra.d.ts.map +1 -0
  42. package/dist/adapters/codex/extra.js +35 -0
  43. package/dist/adapters/codex/extra.js.map +1 -0
  44. package/dist/adapters/deepseek/web.d.ts +2 -0
  45. package/dist/adapters/deepseek/web.d.ts.map +1 -0
  46. package/dist/adapters/deepseek/web.js +187 -0
  47. package/dist/adapters/deepseek/web.js.map +1 -0
  48. package/dist/adapters/doubao/web.d.ts +2 -0
  49. package/dist/adapters/doubao/web.d.ts.map +1 -0
  50. package/dist/adapters/doubao/web.js +138 -0
  51. package/dist/adapters/doubao/web.js.map +1 -0
  52. package/dist/adapters/eastmoney/market-data.d.ts +2 -0
  53. package/dist/adapters/eastmoney/market-data.d.ts.map +1 -0
  54. package/dist/adapters/eastmoney/market-data.js +753 -0
  55. package/dist/adapters/eastmoney/market-data.js.map +1 -0
  56. package/dist/adapters/gitee/user.d.ts +2 -0
  57. package/dist/adapters/gitee/user.d.ts.map +1 -0
  58. package/dist/adapters/gitee/user.js +54 -0
  59. package/dist/adapters/gitee/user.js.map +1 -0
  60. package/dist/adapters/google-scholar/cite.d.ts +2 -0
  61. package/dist/adapters/google-scholar/cite.d.ts.map +1 -0
  62. package/dist/adapters/google-scholar/cite.js +82 -0
  63. package/dist/adapters/google-scholar/cite.js.map +1 -0
  64. package/dist/adapters/google-scholar/profile.d.ts +2 -0
  65. package/dist/adapters/google-scholar/profile.d.ts.map +1 -0
  66. package/dist/adapters/google-scholar/profile.js +80 -0
  67. package/dist/adapters/google-scholar/profile.js.map +1 -0
  68. package/dist/adapters/google-scholar/search.d.ts +2 -0
  69. package/dist/adapters/google-scholar/search.d.ts.map +1 -0
  70. package/dist/adapters/google-scholar/search.js +54 -0
  71. package/dist/adapters/google-scholar/search.js.map +1 -0
  72. package/dist/adapters/gov-law/laws.d.ts +2 -0
  73. package/dist/adapters/gov-law/laws.d.ts.map +1 -0
  74. package/dist/adapters/gov-law/laws.js +58 -0
  75. package/dist/adapters/gov-law/laws.js.map +1 -0
  76. package/dist/adapters/gov-policy/policy.d.ts +2 -0
  77. package/dist/adapters/gov-policy/policy.d.ts.map +1 -0
  78. package/dist/adapters/gov-policy/policy.js +58 -0
  79. package/dist/adapters/gov-policy/policy.js.map +1 -0
  80. package/dist/adapters/jd/commerce.d.ts +2 -0
  81. package/dist/adapters/jd/commerce.d.ts.map +1 -0
  82. package/dist/adapters/jd/commerce.js +133 -0
  83. package/dist/adapters/jd/commerce.js.map +1 -0
  84. package/dist/adapters/jianyu/detail.d.ts +2 -0
  85. package/dist/adapters/jianyu/detail.d.ts.map +1 -0
  86. package/dist/adapters/jianyu/detail.js +27 -0
  87. package/dist/adapters/jianyu/detail.js.map +1 -0
  88. package/dist/adapters/jimeng/workspace.d.ts +2 -0
  89. package/dist/adapters/jimeng/workspace.d.ts.map +1 -0
  90. package/dist/adapters/jimeng/workspace.js +49 -0
  91. package/dist/adapters/jimeng/workspace.js.map +1 -0
  92. package/dist/adapters/ke/rent-transaction.d.ts +2 -0
  93. package/dist/adapters/ke/rent-transaction.d.ts.map +1 -0
  94. package/dist/adapters/ke/rent-transaction.js +63 -0
  95. package/dist/adapters/ke/rent-transaction.js.map +1 -0
  96. package/dist/adapters/linux-do/search.d.ts +2 -0
  97. package/dist/adapters/linux-do/search.d.ts.map +1 -0
  98. package/dist/adapters/linux-do/search.js +75 -0
  99. package/dist/adapters/linux-do/search.js.map +1 -0
  100. package/dist/adapters/linux-do/topic-content.d.ts +2 -0
  101. package/dist/adapters/linux-do/topic-content.d.ts.map +1 -0
  102. package/dist/adapters/linux-do/topic-content.js +32 -0
  103. package/dist/adapters/linux-do/topic-content.js.map +1 -0
  104. package/dist/adapters/maimai/talents.d.ts +2 -0
  105. package/dist/adapters/maimai/talents.d.ts.map +1 -0
  106. package/dist/adapters/maimai/talents.js +64 -0
  107. package/dist/adapters/maimai/talents.js.map +1 -0
  108. package/dist/adapters/mubu/docs.d.ts +2 -0
  109. package/dist/adapters/mubu/docs.d.ts.map +1 -0
  110. package/dist/adapters/mubu/docs.js +96 -0
  111. package/dist/adapters/mubu/docs.js.map +1 -0
  112. package/dist/adapters/nowcoder/nowcoder.d.ts +2 -0
  113. package/dist/adapters/nowcoder/nowcoder.d.ts.map +1 -0
  114. package/dist/adapters/nowcoder/nowcoder.js +480 -0
  115. package/dist/adapters/nowcoder/nowcoder.js.map +1 -0
  116. package/dist/adapters/powerchina/search.d.ts +2 -0
  117. package/dist/adapters/powerchina/search.d.ts.map +1 -0
  118. package/dist/adapters/powerchina/search.js +41 -0
  119. package/dist/adapters/powerchina/search.js.map +1 -0
  120. package/dist/adapters/quark/actions.d.ts +2 -0
  121. package/dist/adapters/quark/actions.d.ts.map +1 -0
  122. package/dist/adapters/quark/actions.js +151 -0
  123. package/dist/adapters/quark/actions.js.map +1 -0
  124. package/dist/adapters/reddit/browser-utils.d.ts +7 -0
  125. package/dist/adapters/reddit/browser-utils.d.ts.map +1 -0
  126. package/dist/adapters/reddit/browser-utils.js +68 -0
  127. package/dist/adapters/reddit/browser-utils.js.map +1 -0
  128. package/dist/adapters/reddit/listings.d.ts +2 -0
  129. package/dist/adapters/reddit/listings.d.ts.map +1 -0
  130. package/dist/adapters/reddit/listings.js +193 -0
  131. package/dist/adapters/reddit/listings.js.map +1 -0
  132. package/dist/adapters/reddit/search.d.ts +2 -0
  133. package/dist/adapters/reddit/search.d.ts.map +1 -0
  134. package/dist/adapters/reddit/search.js +66 -0
  135. package/dist/adapters/reddit/search.js.map +1 -0
  136. package/dist/adapters/spotify/api.d.ts +2 -0
  137. package/dist/adapters/spotify/api.d.ts.map +1 -0
  138. package/dist/adapters/spotify/api.js +252 -0
  139. package/dist/adapters/spotify/api.js.map +1 -0
  140. package/dist/adapters/taobao/commerce.d.ts +2 -0
  141. package/dist/adapters/taobao/commerce.d.ts.map +1 -0
  142. package/dist/adapters/taobao/commerce.js +130 -0
  143. package/dist/adapters/taobao/commerce.js.map +1 -0
  144. package/dist/adapters/tdx/hot-rank.d.ts +2 -0
  145. package/dist/adapters/tdx/hot-rank.d.ts.map +1 -0
  146. package/dist/adapters/tdx/hot-rank.js +34 -0
  147. package/dist/adapters/tdx/hot-rank.js.map +1 -0
  148. package/dist/adapters/ths/hot-rank.d.ts +2 -0
  149. package/dist/adapters/ths/hot-rank.d.ts.map +1 -0
  150. package/dist/adapters/ths/hot-rank.js +34 -0
  151. package/dist/adapters/ths/hot-rank.js.map +1 -0
  152. package/dist/adapters/toutiao/articles.d.ts +2 -0
  153. package/dist/adapters/toutiao/articles.d.ts.map +1 -0
  154. package/dist/adapters/toutiao/articles.js +41 -0
  155. package/dist/adapters/toutiao/articles.js.map +1 -0
  156. package/dist/adapters/twitter/lists-extra.d.ts +2 -0
  157. package/dist/adapters/twitter/lists-extra.d.ts.map +1 -0
  158. package/dist/adapters/twitter/lists-extra.js +125 -0
  159. package/dist/adapters/twitter/lists-extra.js.map +1 -0
  160. package/dist/adapters/uiverse/components.d.ts +2 -0
  161. package/dist/adapters/uiverse/components.d.ts.map +1 -0
  162. package/dist/adapters/uiverse/components.js +138 -0
  163. package/dist/adapters/uiverse/components.js.map +1 -0
  164. package/dist/adapters/wanfang/search.d.ts +2 -0
  165. package/dist/adapters/wanfang/search.d.ts.map +1 -0
  166. package/dist/adapters/wanfang/search.js +34 -0
  167. package/dist/adapters/wanfang/search.js.map +1 -0
  168. package/dist/adapters/weixin/drafts.d.ts +2 -0
  169. package/dist/adapters/weixin/drafts.d.ts.map +1 -0
  170. package/dist/adapters/weixin/drafts.js +69 -0
  171. package/dist/adapters/weixin/drafts.js.map +1 -0
  172. package/dist/adapters/weread/ai-outline.d.ts +2 -0
  173. package/dist/adapters/weread/ai-outline.d.ts.map +1 -0
  174. package/dist/adapters/weread/ai-outline.js +28 -0
  175. package/dist/adapters/weread/ai-outline.js.map +1 -0
  176. package/dist/adapters/xiaoyuzhou/media.d.ts +2 -0
  177. package/dist/adapters/xiaoyuzhou/media.d.ts.map +1 -0
  178. package/dist/adapters/xiaoyuzhou/media.js +105 -0
  179. package/dist/adapters/xiaoyuzhou/media.js.map +1 -0
  180. package/dist/adapters/xueqiu/extra.d.ts +2 -0
  181. package/dist/adapters/xueqiu/extra.d.ts.map +1 -0
  182. package/dist/adapters/xueqiu/extra.js +74 -0
  183. package/dist/adapters/xueqiu/extra.js.map +1 -0
  184. package/dist/adapters/youtube/personal.d.ts +2 -0
  185. package/dist/adapters/youtube/personal.d.ts.map +1 -0
  186. package/dist/adapters/youtube/personal.js +183 -0
  187. package/dist/adapters/youtube/personal.js.map +1 -0
  188. package/dist/adapters/zhihu/actions.d.ts +2 -0
  189. package/dist/adapters/zhihu/actions.d.ts.map +1 -0
  190. package/dist/adapters/zhihu/actions.js +110 -0
  191. package/dist/adapters/zhihu/actions.js.map +1 -0
  192. package/dist/browser/adapter-authoring.d.ts.map +1 -1
  193. package/dist/browser/adapter-authoring.js +3 -3
  194. package/dist/browser/adapter-authoring.js.map +1 -1
  195. package/dist/browser/bridge.d.ts.map +1 -1
  196. package/dist/browser/bridge.js +2 -3
  197. package/dist/browser/bridge.js.map +1 -1
  198. package/dist/browser/daemon-client.d.ts.map +1 -1
  199. package/dist/browser/daemon-client.js +17 -5
  200. package/dist/browser/daemon-client.js.map +1 -1
  201. package/dist/browser/network-cache.js +2 -2
  202. package/dist/browser/network-cache.js.map +1 -1
  203. package/dist/browser/site-memory.d.ts.map +1 -1
  204. package/dist/browser/site-memory.js +11 -8
  205. package/dist/browser/site-memory.js.map +1 -1
  206. package/dist/browser/target-errors.d.ts +2 -2
  207. package/dist/browser/target-errors.js +2 -2
  208. package/dist/browser/verify-fixture.d.ts.map +1 -1
  209. package/dist/browser/verify-fixture.js +2 -2
  210. package/dist/browser/verify-fixture.js.map +1 -1
  211. package/dist/cli.d.ts.map +1 -1
  212. package/dist/cli.js +9 -4
  213. package/dist/cli.js.map +1 -1
  214. package/dist/commands/agents.d.ts.map +1 -1
  215. package/dist/commands/agents.js +5 -2
  216. package/dist/commands/agents.js.map +1 -1
  217. package/dist/commands/auth.d.ts.map +1 -1
  218. package/dist/commands/auth.js +8 -2
  219. package/dist/commands/auth.js.map +1 -1
  220. package/dist/commands/browser-operator-runtime.d.ts.map +1 -1
  221. package/dist/commands/browser-operator-runtime.js +2 -2
  222. package/dist/commands/browser-operator-runtime.js.map +1 -1
  223. package/dist/commands/browser-operator.d.ts.map +1 -1
  224. package/dist/commands/browser-operator.js +2 -2
  225. package/dist/commands/browser-operator.js.map +1 -1
  226. package/dist/commands/describe.d.ts +2 -2
  227. package/dist/commands/describe.d.ts.map +1 -1
  228. package/dist/commands/describe.js +14 -3
  229. package/dist/commands/describe.js.map +1 -1
  230. package/dist/commands/dispatch.d.ts.map +1 -1
  231. package/dist/commands/dispatch.js +7 -6
  232. package/dist/commands/dispatch.js.map +1 -1
  233. package/dist/commands/explore.js +2 -2
  234. package/dist/commands/explore.js.map +1 -1
  235. package/dist/commands/generate.js +3 -3
  236. package/dist/commands/generate.js.map +1 -1
  237. package/dist/commands/health.d.ts.map +1 -1
  238. package/dist/commands/health.js +4 -10
  239. package/dist/commands/health.js.map +1 -1
  240. package/dist/commands/migrate.d.ts +9 -9
  241. package/dist/commands/migrate.d.ts.map +1 -1
  242. package/dist/commands/migrate.js +22 -22
  243. package/dist/commands/migrate.js.map +1 -1
  244. package/dist/commands/repair.d.ts.map +1 -1
  245. package/dist/commands/repair.js +9 -4
  246. package/dist/commands/repair.js.map +1 -1
  247. package/dist/commands/search.d.ts +3 -3
  248. package/dist/commands/search.js +4 -4
  249. package/dist/commands/skills.d.ts +3 -0
  250. package/dist/commands/skills.d.ts.map +1 -1
  251. package/dist/commands/skills.js +8 -4
  252. package/dist/commands/skills.js.map +1 -1
  253. package/dist/commands/synthesize.js +2 -2
  254. package/dist/commands/synthesize.js.map +1 -1
  255. package/dist/discovery/aliases.d.ts.map +1 -1
  256. package/dist/discovery/aliases.js +69 -0
  257. package/dist/discovery/aliases.js.map +1 -1
  258. package/dist/discovery/loader.d.ts.map +1 -1
  259. package/dist/discovery/loader.js +130 -0
  260. package/dist/discovery/loader.js.map +1 -1
  261. package/dist/engine/kernel/execute.d.ts.map +1 -1
  262. package/dist/engine/kernel/execute.js +27 -4
  263. package/dist/engine/kernel/execute.js.map +1 -1
  264. package/dist/engine/user-home.d.ts +9 -0
  265. package/dist/engine/user-home.d.ts.map +1 -0
  266. package/dist/engine/user-home.js +12 -0
  267. package/dist/engine/user-home.js.map +1 -0
  268. package/dist/fast-path.d.ts +14 -0
  269. package/dist/fast-path.d.ts.map +1 -0
  270. package/dist/fast-path.js +565 -0
  271. package/dist/fast-path.js.map +1 -0
  272. package/dist/hub/index.d.ts +1 -1
  273. package/dist/hub/index.d.ts.map +1 -1
  274. package/dist/hub/index.js +28 -17
  275. package/dist/hub/index.js.map +1 -1
  276. package/dist/main.js +6 -3
  277. package/dist/main.js.map +1 -1
  278. package/dist/manifest-compact.txt +11 -11
  279. package/dist/manifest-search.json +1 -1
  280. package/dist/manifest.json +27600 -1016
  281. package/dist/mcp/tools.js +1 -1
  282. package/dist/mcp/tools.js.map +1 -1
  283. package/dist/output/error-map.d.ts.map +1 -1
  284. package/dist/output/error-map.js +16 -5
  285. package/dist/output/error-map.js.map +1 -1
  286. package/dist/protocol/acp.js +1 -1
  287. package/dist/protocol/acp.js.map +1 -1
  288. package/dist/registry.d.ts +3 -0
  289. package/dist/registry.d.ts.map +1 -1
  290. package/dist/registry.js +34 -1
  291. package/dist/registry.js.map +1 -1
  292. package/dist/runtime/usage-ledger.d.ts +6 -7
  293. package/dist/runtime/usage-ledger.d.ts.map +1 -1
  294. package/dist/runtime/usage-ledger.js +6 -7
  295. package/dist/runtime/usage-ledger.js.map +1 -1
  296. package/dist/types.d.ts +2 -0
  297. package/dist/types.d.ts.map +1 -1
  298. package/dist/types.js.map +1 -1
  299. package/package.json +12 -6
  300. package/src/adapters/1688/assets.ts +114 -0
  301. package/src/adapters/51job/jobs.ts +327 -0
  302. package/src/adapters/_shared/browser-tools.ts +59 -0
  303. package/src/adapters/antigravity/extra.ts +53 -0
  304. package/src/adapters/baidu-scholar/search.ts +38 -0
  305. package/src/adapters/bilibili/compat.ts +132 -0
  306. package/src/adapters/binance/asks.yaml +41 -0
  307. package/src/adapters/binance/depth.yaml +41 -0
  308. package/src/adapters/binance/gainers.yaml +42 -0
  309. package/src/adapters/binance/hot.yaml +1 -1
  310. package/src/adapters/binance/kline.yaml +1 -1
  311. package/src/adapters/binance/klines.yaml +46 -0
  312. package/src/adapters/binance/losers.yaml +42 -0
  313. package/src/adapters/binance/pairs.yaml +38 -0
  314. package/src/adapters/binance/price.yaml +32 -0
  315. package/src/adapters/binance/prices.yaml +30 -0
  316. package/src/adapters/binance/ticker.yaml +2 -2
  317. package/src/adapters/binance/top.yaml +46 -0
  318. package/src/adapters/binance/trades.yaml +42 -0
  319. package/src/adapters/chatgpt/image.ts +84 -0
  320. package/src/adapters/chatgpt-app/chatgpt-app.ts +11 -0
  321. package/src/adapters/chatwise/extra.ts +36 -0
  322. package/src/adapters/codex/extra.ts +36 -0
  323. package/src/adapters/deepseek/web.ts +203 -0
  324. package/src/adapters/doubao/web.ts +154 -0
  325. package/src/adapters/eastmoney/market-data.ts +829 -0
  326. package/src/adapters/excel/insert-image.yaml +80 -0
  327. package/src/adapters/excel/insert-link.yaml +90 -0
  328. package/src/adapters/excel/list.yaml +63 -0
  329. package/src/adapters/excel/read.yaml +74 -0
  330. package/src/adapters/excel/set-cell.yaml +77 -0
  331. package/src/adapters/excel/set-font.yaml +87 -0
  332. package/src/adapters/excel/status.yaml +29 -0
  333. package/src/adapters/gh/search-repos.yaml +62 -0
  334. package/src/adapters/gitee/user.ts +59 -0
  335. package/src/adapters/google-scholar/cite.ts +95 -0
  336. package/src/adapters/google-scholar/profile.ts +91 -0
  337. package/src/adapters/google-scholar/search.ts +58 -0
  338. package/src/adapters/gov-law/laws.ts +61 -0
  339. package/src/adapters/gov-policy/policy.ts +61 -0
  340. package/src/adapters/imessage/contact.yaml +7 -2
  341. package/src/adapters/imessage/recent.yaml +7 -2
  342. package/src/adapters/imessage/search.yaml +7 -2
  343. package/src/adapters/jd/commerce.ts +142 -0
  344. package/src/adapters/jianyu/detail.ts +28 -0
  345. package/src/adapters/jimeng/workspace.ts +53 -0
  346. package/src/adapters/ke/rent-transaction.ts +70 -0
  347. package/src/adapters/linux-do/search.ts +92 -0
  348. package/src/adapters/linux-do/topic-content.ts +45 -0
  349. package/src/adapters/maimai/talents.ts +65 -0
  350. package/src/adapters/mubu/docs.ts +107 -0
  351. package/src/adapters/nowcoder/nowcoder.ts +570 -0
  352. package/src/adapters/powerchina/search.ts +45 -0
  353. package/src/adapters/powerpoint/add-slide.yaml +93 -0
  354. package/src/adapters/powerpoint/insert-image.yaml +71 -0
  355. package/src/adapters/powerpoint/insert-link.yaml +94 -0
  356. package/src/adapters/powerpoint/list.yaml +58 -0
  357. package/src/adapters/powerpoint/set-font.yaml +101 -0
  358. package/src/adapters/powerpoint/slides.yaml +73 -0
  359. package/src/adapters/powerpoint/status.yaml +29 -0
  360. package/src/adapters/quark/actions.ts +169 -0
  361. package/src/adapters/reddit/browser-utils.ts +93 -0
  362. package/src/adapters/reddit/listings.ts +223 -0
  363. package/src/adapters/reddit/search.ts +74 -0
  364. package/src/adapters/spotify/api.ts +292 -0
  365. package/src/adapters/taobao/commerce.ts +134 -0
  366. package/src/adapters/tdx/hot-rank.ts +35 -0
  367. package/src/adapters/ths/hot-rank.ts +35 -0
  368. package/src/adapters/toutiao/articles.ts +45 -0
  369. package/src/adapters/twitter/lists-extra.ts +139 -0
  370. package/src/adapters/uiverse/components.ts +154 -0
  371. package/src/adapters/vercel/list.yaml +2 -1
  372. package/src/adapters/wanfang/search.ts +38 -0
  373. package/src/adapters/weixin/drafts.ts +74 -0
  374. package/src/adapters/weread/ai-outline.ts +32 -0
  375. package/src/adapters/word/insert-image.yaml +73 -0
  376. package/src/adapters/word/insert-link.yaml +82 -0
  377. package/src/adapters/word/insert-text.yaml +72 -0
  378. package/src/adapters/word/list.yaml +63 -0
  379. package/src/adapters/word/read.yaml +63 -0
  380. package/src/adapters/word/set-font.yaml +97 -0
  381. package/src/adapters/word/status.yaml +29 -0
  382. package/src/adapters/xiaoyuzhou/media.ts +139 -0
  383. package/src/adapters/xueqiu/extra.ts +78 -0
  384. package/src/adapters/youtube/personal.ts +215 -0
  385. package/src/adapters/zhihu/actions.ts +111 -0
  386. package/src/hub/external-clis-harness.yaml +211 -0
  387. package/src/hub/index.ts +29 -25
  388. package/src/adapters/linux-do/search.yaml +0 -44
  389. package/src/adapters/meituan/hot.yaml +0 -34
  390. package/src/adapters/reddit/frontpage.test.ts +0 -15
  391. package/src/adapters/reddit/frontpage.yaml +0 -41
  392. package/src/adapters/reddit/hot.test.ts +0 -15
  393. package/src/adapters/reddit/hot.yaml +0 -41
  394. package/src/adapters/reddit/new.test.ts +0 -15
  395. package/src/adapters/reddit/new.yaml +0 -42
  396. package/src/adapters/reddit/popular.test.ts +0 -15
  397. package/src/adapters/reddit/popular.yaml +0 -41
  398. package/src/adapters/reddit/rising.test.ts +0 -15
  399. package/src/adapters/reddit/rising.yaml +0 -41
  400. package/src/adapters/reddit/search.test.ts +0 -15
  401. package/src/adapters/reddit/search.yaml +0 -52
  402. package/src/adapters/reddit/subreddit.test.ts +0 -15
  403. package/src/adapters/reddit/subreddit.yaml +0 -50
  404. package/src/adapters/reddit/top.test.ts +0 -15
  405. package/src/adapters/reddit/top.yaml +0 -48
  406. package/src/adapters/reddit/trending.test.ts +0 -15
  407. package/src/adapters/reddit/trending.yaml +0 -33
package/src/hub/index.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * External CLI Hub — registry and auto-discovery for third-party CLIs.
3
3
  *
4
- * Reads `external-clis.yaml` at startup, checks which binaries are
4
+ * Reads the external CLI registries at startup, checks which binaries are
5
5
  * installed on $PATH, and exposes lookup helpers for the rest of the
6
6
  * system (Commander registration, `unicli ext` subcommands, AGENTS.md).
7
7
  */
8
8
 
9
- import { readFileSync } from "node:fs";
9
+ import { existsSync, readFileSync } from "node:fs";
10
10
  import { join, dirname } from "node:path";
11
11
  import { fileURLToPath } from "node:url";
12
12
  import { execFileSync } from "node:child_process";
@@ -30,6 +30,7 @@ export interface ExternalCli {
30
30
 
31
31
  let _cache: ExternalCli[] | null = null;
32
32
  const _installedCache = new Map<string, boolean>();
33
+ const REGISTRY_FILES = ["external-clis.yaml", "external-clis-harness.yaml"];
33
34
 
34
35
  // ── Loader ──────────────────────────────────────────────────────────────
35
36
 
@@ -40,26 +41,35 @@ const _installedCache = new Map<string, boolean>();
40
41
  * At runtime we may be executing from `dist/hub/`, so we try the source
41
42
  * sibling first (`../../src/hub/`) then fall back to the co-located path.
42
43
  */
43
- function resolveYamlPath(): string {
44
+ function resolveYamlPath(fileName: string): string | null {
44
45
  // Running from dist/hub/index.js → ../../src/hub/external-clis.yaml
45
- const fromDist = join(
46
- __dirname,
47
- "..",
48
- "..",
49
- "src",
50
- "hub",
51
- "external-clis.yaml",
52
- );
46
+ const fromDist = join(__dirname, "..", "..", "src", "hub", fileName);
53
47
  // Running from src/hub/index.ts (dev via tsx)
54
- const fromSrc = join(__dirname, "external-clis.yaml");
48
+ const fromSrc = join(__dirname, fileName);
55
49
 
56
50
  // Prefer the source copy (always present in both dev & installed package)
57
- try {
58
- readFileSync(fromSrc, "utf-8");
59
- return fromSrc;
60
- } catch {
61
- return fromDist;
62
- }
51
+ if (existsSync(fromSrc)) return fromSrc;
52
+ if (existsSync(fromDist)) return fromDist;
53
+ return null;
54
+ }
55
+
56
+ function readRegistryFile(fileName: string): ExternalCli[] {
57
+ const path = resolveYamlPath(fileName);
58
+ if (!path) return [];
59
+
60
+ const raw = readFileSync(path, "utf-8");
61
+ const parsed = yaml.load(raw);
62
+ return Array.isArray(parsed) ? (parsed as ExternalCli[]) : [];
63
+ }
64
+
65
+ function dedupeRegistry(entries: ExternalCli[]): ExternalCli[] {
66
+ const seen = new Set<string>();
67
+ return entries.filter((entry) => {
68
+ const key = `${entry.name}\0${entry.binary}`;
69
+ if (seen.has(key)) return false;
70
+ seen.add(key);
71
+ return true;
72
+ });
63
73
  }
64
74
 
65
75
  /**
@@ -70,13 +80,7 @@ export function loadExternalClis(): ExternalCli[] {
70
80
  if (_cache) return _cache;
71
81
 
72
82
  try {
73
- const raw = readFileSync(resolveYamlPath(), "utf-8");
74
- const parsed = yaml.load(raw);
75
- if (!Array.isArray(parsed)) {
76
- _cache = [];
77
- return _cache;
78
- }
79
- _cache = parsed as ExternalCli[];
83
+ _cache = dedupeRegistry(REGISTRY_FILES.flatMap(readRegistryFile));
80
84
  return _cache;
81
85
  } catch {
82
86
  _cache = [];
@@ -1,44 +0,0 @@
1
- site: linux-do
2
- name: search
3
- description: Search Linux.do forum topics
4
- domain: linux.do
5
- type: web-api
6
- strategy: public
7
-
8
- args:
9
- query:
10
- required: true
11
- positional: true
12
- description: Search query
13
- limit:
14
- type: int
15
- default: 20
16
- description: Number of results
17
-
18
- pipeline:
19
- - fetch:
20
- url: https://linux.do/search.json
21
- params:
22
- q: "${{ args.query }}"
23
-
24
- - select: topics
25
-
26
- - map:
27
- rank: ${{ index + 1 }}
28
- title: ${{ item.title }}
29
- views: ${{ item.views }}
30
- likes: ${{ item.like_count }}
31
- replies: ${{ (item.posts_count || 1) - 1 }}
32
- url: ${{ 'https://linux.do/t/topic/' + item.id }}
33
-
34
- - limit: ${{ args.limit }}
35
-
36
- columns: [rank, title, views, likes, replies, url]
37
-
38
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
39
- capabilities: ["http.fetch"]
40
- minimum_capability: http.fetch
41
- trust: public
42
- confidentiality: public
43
- quarantine: false
44
- schema_version: v2
@@ -1,34 +0,0 @@
1
- site: meituan
2
- name: hot
3
- description: Meituan hot search keywords
4
- domain: apimobile.meituan.com
5
- type: web-api
6
- strategy: public
7
-
8
- args:
9
- limit:
10
- type: int
11
- default: 20
12
-
13
- pipeline:
14
- - fetch:
15
- url: https://apimobile.meituan.com/group/v1/recommend/hotword/1
16
-
17
- - select: data.hotSearchWords
18
-
19
- - map:
20
- rank: ${{ index + 1 }}
21
- keyword: "${{ item.word || item }}"
22
- count: "${{ item.count || '' }}"
23
-
24
- - limit: ${{ args.limit }}
25
-
26
- columns: [rank, keyword, count]
27
-
28
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
29
- capabilities: ["http.fetch"]
30
- minimum_capability: http.fetch
31
- trust: public
32
- confidentiality: public
33
- quarantine: false
34
- schema_version: v2
@@ -1,15 +0,0 @@
1
- import { describe, it } from "vitest";
2
- import {
3
- runAdapterWithFixture,
4
- expectAdapterShape,
5
- } from "../../../tests/adapter-runner.js";
6
-
7
- describe("reddit frontpage", () => {
8
- it("returns rows with declared columns against fixture", async () => {
9
- const { output } = await runAdapterWithFixture("reddit", "frontpage");
10
- expectAdapterShape(output, {
11
- columns: ["rank", "title", "subreddit", "score", "comments", "author"],
12
- minItems: 1,
13
- });
14
- });
15
- });
@@ -1,41 +0,0 @@
1
- site: reddit
2
- name: frontpage
3
- description: Reddit front page / r/all
4
- domain: www.reddit.com
5
- type: web-api
6
- strategy: public
7
-
8
- args:
9
- limit:
10
- type: int
11
- default: 20
12
- description: Number of posts
13
-
14
- pipeline:
15
- - fetch:
16
- url: https://www.reddit.com/r/all.json
17
- params:
18
- limit: ${{ args.limit }}
19
- raw_json: "1"
20
- - select: data.children
21
-
22
- - map:
23
- rank: ${{ index + 1 }}
24
- title: ${{ item.data.title }}
25
- subreddit: ${{ item.data.subreddit_name_prefixed }}
26
- score: ${{ item.data.score }}
27
- comments: ${{ item.data.num_comments }}
28
- author: ${{ item.data.author }}
29
- url: ${{ item.data.url }}
30
-
31
- - limit: ${{ args.limit }}
32
-
33
- columns: [rank, title, subreddit, score, comments, author]
34
-
35
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
36
- capabilities: ["http.fetch"]
37
- minimum_capability: http.fetch
38
- trust: public
39
- confidentiality: public
40
- quarantine: false
41
- schema_version: v2
@@ -1,15 +0,0 @@
1
- import { describe, it } from "vitest";
2
- import {
3
- runAdapterWithFixture,
4
- expectAdapterShape,
5
- } from "../../../tests/adapter-runner.js";
6
-
7
- describe("reddit hot", () => {
8
- it("returns rows with declared columns against fixture", async () => {
9
- const { output } = await runAdapterWithFixture("reddit", "hot");
10
- expectAdapterShape(output, {
11
- columns: ["rank", "title", "subreddit", "score", "comments", "author"],
12
- minItems: 1,
13
- });
14
- });
15
- });
@@ -1,41 +0,0 @@
1
- site: reddit
2
- name: hot
3
- description: Reddit front page hot posts
4
- domain: www.reddit.com
5
- type: web-api
6
- strategy: public
7
- browser: false
8
-
9
- args:
10
- limit:
11
- type: int
12
- default: 20
13
- description: Number of posts
14
-
15
- pipeline:
16
- - fetch:
17
- url: https://www.reddit.com/r/all/hot.json
18
- params:
19
- limit: ${{ args.limit }}
20
- - select: data.children
21
-
22
- - map:
23
- rank: ${{ index + 1 }}
24
- title: ${{ item.data.title }}
25
- subreddit: ${{ item.data.subreddit_name_prefixed }}
26
- score: ${{ item.data.score }}
27
- comments: ${{ item.data.num_comments }}
28
- author: ${{ item.data.author }}
29
- url: ${{ item.data.url }}
30
-
31
- - limit: ${{ args.limit }}
32
-
33
- columns: [rank, title, subreddit, score, comments, author]
34
-
35
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
36
- capabilities: ["http.fetch"]
37
- minimum_capability: http.fetch
38
- trust: public
39
- confidentiality: public
40
- quarantine: false
41
- schema_version: v2
@@ -1,15 +0,0 @@
1
- import { describe, it } from "vitest";
2
- import {
3
- runAdapterWithFixture,
4
- expectAdapterShape,
5
- } from "../../../tests/adapter-runner.js";
6
-
7
- describe("reddit new", () => {
8
- it("returns rows with declared columns against fixture", async () => {
9
- const { output } = await runAdapterWithFixture("reddit", "new");
10
- expectAdapterShape(output, {
11
- columns: ["title", "author", "subreddit", "score", "comments"],
12
- minItems: 1,
13
- });
14
- });
15
- });
@@ -1,42 +0,0 @@
1
- site: reddit
2
- name: new
3
- description: Reddit newest posts from all subreddits
4
- domain: www.reddit.com
5
- type: web-api
6
- strategy: public
7
-
8
- args:
9
- subreddit:
10
- type: str
11
- description: Subreddit name (without r/)
12
- limit:
13
- type: int
14
- default: 20
15
-
16
- pipeline:
17
- - fetch:
18
- url: "https://www.reddit.com/${{ args.subreddit ? 'r/' + args.subreddit + '/' : '' }}new.json"
19
- params:
20
- limit: "${{ args.limit }}"
21
-
22
- - select: data.children
23
-
24
- - map:
25
- title: "${{ item.data.title }}"
26
- author: "${{ item.data.author }}"
27
- subreddit: "${{ item.data.subreddit }}"
28
- score: "${{ item.data.score }}"
29
- comments: "${{ item.data.num_comments }}"
30
- url: "${{ 'https://www.reddit.com' + item.data.permalink }}"
31
-
32
- - limit: ${{ args.limit }}
33
-
34
- columns: [title, author, subreddit, score, comments]
35
-
36
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
37
- capabilities: ["http.fetch"]
38
- minimum_capability: http.fetch
39
- trust: public
40
- confidentiality: public
41
- quarantine: false
42
- schema_version: v2
@@ -1,15 +0,0 @@
1
- import { describe, it } from "vitest";
2
- import {
3
- runAdapterWithFixture,
4
- expectAdapterShape,
5
- } from "../../../tests/adapter-runner.js";
6
-
7
- describe("reddit popular", () => {
8
- it("returns rows with declared columns against fixture", async () => {
9
- const { output } = await runAdapterWithFixture("reddit", "popular");
10
- expectAdapterShape(output, {
11
- columns: ["rank", "title", "subreddit", "score", "comments", "author"],
12
- minItems: 1,
13
- });
14
- });
15
- });
@@ -1,41 +0,0 @@
1
- site: reddit
2
- name: popular
3
- description: Reddit popular posts (/r/popular)
4
- domain: www.reddit.com
5
- type: web-api
6
- strategy: public
7
-
8
- args:
9
- limit:
10
- type: int
11
- default: 20
12
- description: Number of posts
13
-
14
- pipeline:
15
- - fetch:
16
- url: https://www.reddit.com/r/popular.json
17
- params:
18
- limit: ${{ args.limit }}
19
- raw_json: "1"
20
- - select: data.children
21
-
22
- - map:
23
- rank: ${{ index + 1 }}
24
- title: ${{ item.data.title }}
25
- subreddit: ${{ item.data.subreddit_name_prefixed }}
26
- score: ${{ item.data.score }}
27
- comments: ${{ item.data.num_comments }}
28
- author: ${{ item.data.author }}
29
- url: ${{ item.data.url }}
30
-
31
- - limit: ${{ args.limit }}
32
-
33
- columns: [rank, title, subreddit, score, comments, author]
34
-
35
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
36
- capabilities: ["http.fetch"]
37
- minimum_capability: http.fetch
38
- trust: public
39
- confidentiality: public
40
- quarantine: false
41
- schema_version: v2
@@ -1,15 +0,0 @@
1
- import { describe, it } from "vitest";
2
- import {
3
- runAdapterWithFixture,
4
- expectAdapterShape,
5
- } from "../../../tests/adapter-runner.js";
6
-
7
- describe("reddit rising", () => {
8
- it("returns rows with declared columns against fixture", async () => {
9
- const { output } = await runAdapterWithFixture("reddit", "rising");
10
- expectAdapterShape(output, {
11
- columns: ["title", "author", "subreddit", "score", "comments"],
12
- minItems: 1,
13
- });
14
- });
15
- });
@@ -1,41 +0,0 @@
1
- site: reddit
2
- name: rising
3
- description: Reddit rising posts
4
- domain: www.reddit.com
5
- type: web-api
6
- strategy: public
7
-
8
- args:
9
- subreddit:
10
- type: str
11
- description: Subreddit name (without r/)
12
- limit:
13
- type: int
14
- default: 20
15
-
16
- pipeline:
17
- - fetch:
18
- url: "https://www.reddit.com/${{ args.subreddit ? 'r/' + args.subreddit + '/' : '' }}rising.json"
19
- params:
20
- limit: "${{ args.limit }}"
21
-
22
- - select: data.children
23
-
24
- - map:
25
- title: "${{ item.data.title }}"
26
- author: "${{ item.data.author }}"
27
- subreddit: "${{ item.data.subreddit }}"
28
- score: "${{ item.data.score }}"
29
- comments: "${{ item.data.num_comments }}"
30
-
31
- - limit: ${{ args.limit }}
32
-
33
- columns: [title, author, subreddit, score, comments]
34
-
35
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
36
- capabilities: ["http.fetch"]
37
- minimum_capability: http.fetch
38
- trust: public
39
- confidentiality: public
40
- quarantine: false
41
- schema_version: v2
@@ -1,15 +0,0 @@
1
- import { describe, it } from "vitest";
2
- import {
3
- runAdapterWithFixture,
4
- expectAdapterShape,
5
- } from "../../../tests/adapter-runner.js";
6
-
7
- describe("reddit search", () => {
8
- it("returns rows with declared columns against fixture", async () => {
9
- const { output } = await runAdapterWithFixture("reddit", "search");
10
- expectAdapterShape(output, {
11
- columns: ["rank", "title", "subreddit", "score", "comments", "author"],
12
- minItems: 1,
13
- });
14
- });
15
- });
@@ -1,52 +0,0 @@
1
- site: reddit
2
- name: search
3
- description: Search Reddit posts
4
- domain: www.reddit.com
5
- type: web-api
6
- strategy: public
7
- browser: false
8
-
9
- args:
10
- query:
11
- type: str
12
- required: true
13
- positional: true
14
- description: Search query
15
- limit:
16
- type: int
17
- default: 20
18
- description: Number of results
19
- sort:
20
- type: str
21
- default: relevance
22
- choices: [relevance, hot, top, new, comments]
23
- description: Sort order
24
-
25
- pipeline:
26
- - fetch:
27
- url: https://www.reddit.com/search.json
28
- params:
29
- q: ${{ args.query }}
30
- sort: ${{ args.sort || 'relevance' }}
31
- limit: ${{ args.limit }}
32
- - select: data.children
33
-
34
- - map:
35
- rank: ${{ index + 1 }}
36
- title: ${{ item.data.title }}
37
- subreddit: ${{ item.data.subreddit_name_prefixed }}
38
- score: ${{ item.data.score }}
39
- comments: ${{ item.data.num_comments }}
40
- author: ${{ item.data.author }}
41
-
42
- - limit: ${{ args.limit }}
43
-
44
- columns: [rank, title, subreddit, score, comments, author]
45
-
46
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
47
- capabilities: ["http.fetch"]
48
- minimum_capability: http.fetch
49
- trust: public
50
- confidentiality: public
51
- quarantine: false
52
- schema_version: v2
@@ -1,15 +0,0 @@
1
- import { describe, it } from "vitest";
2
- import {
3
- runAdapterWithFixture,
4
- expectAdapterShape,
5
- } from "../../../tests/adapter-runner.js";
6
-
7
- describe("reddit subreddit", () => {
8
- it("returns rows with declared columns against fixture", async () => {
9
- const { output } = await runAdapterWithFixture("reddit", "subreddit");
10
- expectAdapterShape(output, {
11
- columns: ["rank", "title", "score", "comments", "author"],
12
- minItems: 1,
13
- });
14
- });
15
- });
@@ -1,50 +0,0 @@
1
- site: reddit
2
- name: subreddit
3
- description: Get posts from a specific subreddit
4
- domain: www.reddit.com
5
- type: web-api
6
- strategy: public
7
-
8
- args:
9
- name:
10
- type: str
11
- required: true
12
- positional: true
13
- description: "Subreddit name (e.g. programming, rust, webdev)"
14
- sort:
15
- type: str
16
- default: hot
17
- choices: [hot, new, top, rising]
18
- description: Sort order
19
- limit:
20
- type: int
21
- default: 20
22
- description: Number of posts
23
-
24
- pipeline:
25
- - fetch:
26
- url: "https://www.reddit.com/r/${{ args.name }}/${{ args.sort }}.json"
27
- params:
28
- limit: ${{ args.limit }}
29
- raw_json: "1"
30
- - select: data.children
31
-
32
- - map:
33
- rank: ${{ index + 1 }}
34
- title: ${{ item.data.title }}
35
- score: ${{ item.data.score }}
36
- comments: ${{ item.data.num_comments }}
37
- author: ${{ item.data.author }}
38
- url: ${{ 'https://www.reddit.com' + item.data.permalink }}
39
-
40
- - limit: ${{ args.limit }}
41
-
42
- columns: [rank, title, score, comments, author]
43
-
44
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
45
- capabilities: ["http.fetch"]
46
- minimum_capability: http.fetch
47
- trust: public
48
- confidentiality: public
49
- quarantine: false
50
- schema_version: v2
@@ -1,15 +0,0 @@
1
- import { describe, it } from "vitest";
2
- import {
3
- runAdapterWithFixture,
4
- expectAdapterShape,
5
- } from "../../../tests/adapter-runner.js";
6
-
7
- describe("reddit top", () => {
8
- it("returns rows with declared columns against fixture", async () => {
9
- const { output } = await runAdapterWithFixture("reddit", "top");
10
- expectAdapterShape(output, {
11
- columns: ["rank", "title", "subreddit", "score", "comments"],
12
- minItems: 1,
13
- });
14
- });
15
- });
@@ -1,48 +0,0 @@
1
- site: reddit
2
- name: top
3
- description: Reddit top posts
4
- domain: www.reddit.com
5
- type: web-api
6
- strategy: public
7
-
8
- args:
9
- subreddit:
10
- type: str
11
- description: Subreddit name (without r/)
12
- time:
13
- type: str
14
- default: day
15
- choices: [hour, day, week, month, year, all]
16
- limit:
17
- type: int
18
- default: 20
19
-
20
- pipeline:
21
- - fetch:
22
- url: "https://www.reddit.com/${{ args.subreddit ? 'r/' + args.subreddit + '/' : '' }}top.json"
23
- params:
24
- t: "${{ args.time }}"
25
- limit: "${{ args.limit }}"
26
-
27
- - select: data.children
28
-
29
- - map:
30
- rank: ${{ index + 1 }}
31
- title: "${{ item.data.title }}"
32
- author: "${{ item.data.author }}"
33
- subreddit: "${{ item.data.subreddit }}"
34
- score: "${{ item.data.score }}"
35
- comments: "${{ item.data.num_comments }}"
36
- url: "${{ 'https://www.reddit.com' + item.data.permalink }}"
37
-
38
- - limit: ${{ args.limit }}
39
-
40
- columns: [rank, title, subreddit, score, comments]
41
-
42
- # schema-v2 metadata — injected by `unicli migrate schema-v2`
43
- capabilities: ["http.fetch"]
44
- minimum_capability: http.fetch
45
- trust: public
46
- confidentiality: public
47
- quarantine: false
48
- schema_version: v2
@@ -1,15 +0,0 @@
1
- import { describe, it } from "vitest";
2
- import {
3
- runAdapterWithFixture,
4
- expectAdapterShape,
5
- } from "../../../tests/adapter-runner.js";
6
-
7
- describe("reddit trending", () => {
8
- it("returns rows with declared columns against fixture", async () => {
9
- const { output } = await runAdapterWithFixture("reddit", "trending");
10
- expectAdapterShape(output, {
11
- columns: ["name", "subscribers", "title", "description"],
12
- minItems: 1,
13
- });
14
- });
15
- });