@jackwener/opencli 1.3.3 → 1.4.1

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 (680) hide show
  1. package/.github/actions/setup-chrome/action.yml +5 -4
  2. package/.github/pull_request_template.md +3 -1
  3. package/.github/workflows/build-extension.yml +7 -1
  4. package/.github/workflows/ci.yml +46 -6
  5. package/.github/workflows/docs.yml +1 -1
  6. package/.github/workflows/e2e-headed.yml +36 -3
  7. package/.github/workflows/release.yml +1 -1
  8. package/.github/workflows/security.yml +0 -3
  9. package/CHANGELOG.md +78 -0
  10. package/CONTRIBUTING.md +6 -3
  11. package/PRIVACY.md +57 -0
  12. package/README.md +31 -4
  13. package/README.zh-CN.md +31 -4
  14. package/SKILL.md +107 -2
  15. package/TESTING.md +1 -0
  16. package/chatwise-opencli.ps1 +82 -0
  17. package/dist/analysis.d.ts +38 -0
  18. package/dist/analysis.js +166 -0
  19. package/dist/browser/cdp.d.ts +0 -4
  20. package/dist/browser/cdp.js +53 -41
  21. package/dist/browser/cdp.test.d.ts +1 -0
  22. package/dist/browser/cdp.test.js +52 -0
  23. package/dist/browser/dom-snapshot.d.ts +2 -2
  24. package/dist/browser/dom-snapshot.js +54 -1
  25. package/dist/browser/dom-snapshot.test.js +36 -0
  26. package/dist/browser/index.d.ts +2 -2
  27. package/dist/browser/index.js +1 -1
  28. package/dist/browser/mcp.d.ts +0 -2
  29. package/dist/browser/mcp.js +2 -3
  30. package/dist/browser/page.d.ts +4 -3
  31. package/dist/browser/page.js +34 -37
  32. package/dist/browser/stealth.d.ts +0 -2
  33. package/dist/browser/stealth.js +24 -9
  34. package/dist/browser.test.js +2 -2
  35. package/dist/build-manifest.js +15 -9
  36. package/dist/build-manifest.test.js +12 -0
  37. package/dist/cascade.js +4 -2
  38. package/dist/cli-manifest.json +1325 -256
  39. package/dist/cli.js +57 -29
  40. package/dist/clis/_shared/desktop-commands.d.ts +22 -0
  41. package/dist/clis/_shared/desktop-commands.js +108 -0
  42. package/dist/clis/antigravity/serve.js +5 -2
  43. package/dist/clis/apple-podcasts/search.js +2 -1
  44. package/dist/clis/arxiv/search.js +3 -3
  45. package/dist/clis/bbc/news.js +0 -1
  46. package/dist/clis/bilibili/dynamic.test.d.ts +1 -0
  47. package/dist/clis/bilibili/dynamic.test.js +68 -0
  48. package/dist/clis/bilibili/favorite.js +4 -2
  49. package/dist/clis/bilibili/following.js +3 -2
  50. package/dist/clis/bilibili/subtitle.js +8 -7
  51. package/dist/clis/bilibili/utils.js +2 -2
  52. package/dist/clis/boss/batchgreet.js +1 -1
  53. package/dist/clis/boss/chatlist.js +1 -1
  54. package/dist/clis/boss/chatmsg.js +1 -1
  55. package/dist/clis/boss/detail.js +1 -1
  56. package/dist/clis/boss/exchange.js +1 -1
  57. package/dist/clis/boss/greet.js +1 -1
  58. package/dist/clis/boss/invite.js +1 -1
  59. package/dist/clis/boss/joblist.js +1 -1
  60. package/dist/clis/boss/mark.js +4 -3
  61. package/dist/clis/boss/recommend.js +1 -1
  62. package/dist/clis/boss/resume.js +1 -1
  63. package/dist/clis/boss/search.js +1 -1
  64. package/dist/clis/boss/send.js +5 -4
  65. package/dist/clis/boss/stats.js +1 -1
  66. package/dist/clis/chatgpt/ask.js +4 -0
  67. package/dist/clis/chatgpt/new.js +5 -1
  68. package/dist/clis/chatgpt/read.js +5 -1
  69. package/dist/clis/chatgpt/send.js +2 -1
  70. package/dist/clis/chatgpt/status.js +5 -1
  71. package/dist/clis/chatwise/ask.js +8 -2
  72. package/dist/clis/chatwise/export.js +2 -0
  73. package/dist/clis/chatwise/history.js +2 -0
  74. package/dist/clis/chatwise/model.js +8 -3
  75. package/dist/clis/chatwise/new.js +3 -18
  76. package/dist/clis/chatwise/read.js +2 -0
  77. package/dist/clis/chatwise/screenshot.js +3 -27
  78. package/dist/clis/chatwise/send.js +8 -2
  79. package/dist/clis/chatwise/shared.d.ts +2 -0
  80. package/dist/clis/chatwise/shared.js +6 -0
  81. package/dist/clis/chatwise/status.js +3 -22
  82. package/dist/clis/codex/ask.js +6 -2
  83. package/dist/clis/codex/dump.js +2 -25
  84. package/dist/clis/codex/new.js +2 -25
  85. package/dist/clis/codex/screenshot.js +2 -27
  86. package/dist/clis/codex/send.js +6 -4
  87. package/dist/clis/codex/status.js +2 -22
  88. package/dist/clis/ctrip/search.js +0 -1
  89. package/dist/clis/cursor/ask.js +2 -1
  90. package/dist/clis/cursor/composer.js +2 -1
  91. package/dist/clis/cursor/dump.js +2 -25
  92. package/dist/clis/cursor/new.js +2 -18
  93. package/dist/clis/cursor/read.js +2 -1
  94. package/dist/clis/cursor/screenshot.js +1 -30
  95. package/dist/clis/cursor/send.js +2 -1
  96. package/dist/clis/cursor/status.js +2 -21
  97. package/dist/clis/dictionary/examples.yaml +25 -0
  98. package/dist/clis/dictionary/search.yaml +27 -0
  99. package/dist/clis/dictionary/synonyms.yaml +25 -0
  100. package/dist/clis/douban/book-hot.js +1 -1
  101. package/dist/clis/douban/movie-hot.js +1 -1
  102. package/dist/clis/douban/search.js +1 -1
  103. package/dist/clis/douban/utils.d.ts +4 -1
  104. package/dist/clis/douban/utils.js +156 -1
  105. package/dist/clis/doubao/ask.js +1 -1
  106. package/dist/clis/doubao/new.js +1 -1
  107. package/dist/clis/doubao/read.js +1 -1
  108. package/dist/clis/doubao/send.js +1 -1
  109. package/dist/clis/doubao/status.js +1 -1
  110. package/dist/clis/doubao-app/ask.js +1 -1
  111. package/dist/clis/doubao-app/new.js +1 -1
  112. package/dist/clis/doubao-app/read.js +1 -1
  113. package/dist/clis/doubao-app/send.js +1 -1
  114. package/dist/clis/douyin/_shared/browser-fetch.d.ts +10 -0
  115. package/dist/clis/douyin/_shared/browser-fetch.js +30 -0
  116. package/dist/clis/douyin/_shared/browser-fetch.test.d.ts +1 -0
  117. package/dist/clis/douyin/_shared/browser-fetch.test.js +31 -0
  118. package/dist/clis/douyin/_shared/creation-id.d.ts +1 -0
  119. package/dist/clis/douyin/_shared/creation-id.js +5 -0
  120. package/dist/clis/douyin/_shared/creation-id.test.d.ts +1 -0
  121. package/dist/clis/douyin/_shared/creation-id.test.js +22 -0
  122. package/dist/clis/douyin/_shared/imagex-upload.d.ts +20 -0
  123. package/dist/clis/douyin/_shared/imagex-upload.js +53 -0
  124. package/dist/clis/douyin/_shared/imagex-upload.test.d.ts +1 -0
  125. package/dist/clis/douyin/_shared/imagex-upload.test.js +87 -0
  126. package/dist/clis/douyin/_shared/sts2.d.ts +8 -0
  127. package/dist/clis/douyin/_shared/sts2.js +15 -0
  128. package/dist/clis/douyin/_shared/text-extra.d.ts +18 -0
  129. package/dist/clis/douyin/_shared/text-extra.js +15 -0
  130. package/dist/clis/douyin/_shared/text-extra.test.d.ts +1 -0
  131. package/dist/clis/douyin/_shared/text-extra.test.js +37 -0
  132. package/dist/clis/douyin/_shared/timing.d.ts +2 -0
  133. package/dist/clis/douyin/_shared/timing.js +22 -0
  134. package/dist/clis/douyin/_shared/timing.test.d.ts +1 -0
  135. package/dist/clis/douyin/_shared/timing.test.js +28 -0
  136. package/dist/clis/douyin/_shared/tos-upload-short-read.test.d.ts +11 -0
  137. package/dist/clis/douyin/_shared/tos-upload-short-read.test.js +83 -0
  138. package/dist/clis/douyin/_shared/tos-upload.d.ts +53 -0
  139. package/dist/clis/douyin/_shared/tos-upload.js +295 -0
  140. package/dist/clis/douyin/_shared/tos-upload.test.d.ts +1 -0
  141. package/dist/clis/douyin/_shared/tos-upload.test.js +229 -0
  142. package/dist/clis/douyin/_shared/transcode.d.ts +27 -0
  143. package/dist/clis/douyin/_shared/transcode.js +45 -0
  144. package/dist/clis/douyin/_shared/transcode.test.d.ts +1 -0
  145. package/dist/clis/douyin/_shared/transcode.test.js +93 -0
  146. package/dist/clis/douyin/_shared/types.d.ts +26 -0
  147. package/dist/clis/douyin/_shared/types.js +1 -0
  148. package/dist/clis/douyin/activities.d.ts +1 -0
  149. package/dist/clis/douyin/activities.js +20 -0
  150. package/dist/clis/douyin/activities.test.d.ts +1 -0
  151. package/dist/clis/douyin/activities.test.js +22 -0
  152. package/dist/clis/douyin/collections.d.ts +1 -0
  153. package/dist/clis/douyin/collections.js +22 -0
  154. package/dist/clis/douyin/collections.test.d.ts +1 -0
  155. package/dist/clis/douyin/collections.test.js +23 -0
  156. package/dist/clis/douyin/delete.d.ts +1 -0
  157. package/dist/clis/douyin/delete.js +18 -0
  158. package/dist/clis/douyin/delete.test.d.ts +1 -0
  159. package/dist/clis/douyin/delete.test.js +11 -0
  160. package/dist/clis/douyin/draft.d.ts +14 -0
  161. package/dist/clis/douyin/draft.js +237 -0
  162. package/dist/clis/douyin/draft.test.d.ts +1 -0
  163. package/dist/clis/douyin/draft.test.js +11 -0
  164. package/dist/clis/douyin/drafts.d.ts +1 -0
  165. package/dist/clis/douyin/drafts.js +23 -0
  166. package/dist/clis/douyin/drafts.test.d.ts +1 -0
  167. package/dist/clis/douyin/drafts.test.js +11 -0
  168. package/dist/clis/douyin/hashtag.d.ts +1 -0
  169. package/dist/clis/douyin/hashtag.js +45 -0
  170. package/dist/clis/douyin/hashtag.test.d.ts +1 -0
  171. package/dist/clis/douyin/hashtag.test.js +25 -0
  172. package/dist/clis/douyin/location.d.ts +1 -0
  173. package/dist/clis/douyin/location.js +24 -0
  174. package/dist/clis/douyin/location.test.d.ts +1 -0
  175. package/dist/clis/douyin/location.test.js +23 -0
  176. package/dist/clis/douyin/profile.d.ts +1 -0
  177. package/dist/clis/douyin/profile.js +28 -0
  178. package/dist/clis/douyin/profile.test.d.ts +1 -0
  179. package/dist/clis/douyin/profile.test.js +11 -0
  180. package/dist/clis/douyin/publish.d.ts +14 -0
  181. package/dist/clis/douyin/publish.js +288 -0
  182. package/dist/clis/douyin/publish.test.d.ts +1 -0
  183. package/dist/clis/douyin/publish.test.js +38 -0
  184. package/dist/clis/douyin/stats.d.ts +1 -0
  185. package/dist/clis/douyin/stats.js +27 -0
  186. package/dist/clis/douyin/stats.test.d.ts +1 -0
  187. package/dist/clis/douyin/stats.test.js +22 -0
  188. package/dist/clis/douyin/update.d.ts +1 -0
  189. package/dist/clis/douyin/update.js +31 -0
  190. package/dist/clis/douyin/update.test.d.ts +1 -0
  191. package/dist/clis/douyin/update.test.js +11 -0
  192. package/dist/clis/douyin/videos.d.ts +1 -0
  193. package/dist/clis/douyin/videos.js +34 -0
  194. package/dist/clis/douyin/videos.test.d.ts +1 -0
  195. package/dist/clis/douyin/videos.test.js +11 -0
  196. package/dist/clis/grok/ask.d.ts +4 -0
  197. package/dist/clis/grok/ask.js +28 -10
  198. package/dist/clis/grok/ask.test.js +18 -0
  199. package/dist/clis/hackernews/search.yaml +1 -1
  200. package/dist/clis/instagram/search.yaml +2 -1
  201. package/dist/clis/jd/item.d.ts +1 -0
  202. package/dist/clis/jd/item.js +96 -0
  203. package/dist/clis/jd/item.test.d.ts +1 -0
  204. package/dist/clis/jd/item.test.js +28 -0
  205. package/dist/clis/jike/feed.js +1 -1
  206. package/dist/clis/jike/search.js +1 -1
  207. package/dist/clis/linkedin/search.js +5 -4
  208. package/dist/clis/linkedin/timeline.d.ts +21 -0
  209. package/dist/clis/linkedin/timeline.js +503 -0
  210. package/dist/clis/linkedin/timeline.test.d.ts +1 -0
  211. package/dist/clis/linkedin/timeline.test.js +81 -0
  212. package/dist/clis/linux-do/search.yaml +3 -1
  213. package/dist/clis/medium/feed.js +1 -1
  214. package/dist/clis/medium/search.js +2 -2
  215. package/dist/clis/medium/user.js +1 -1
  216. package/dist/clis/medium/{shared.js → utils.js} +2 -1
  217. package/dist/clis/pixiv/detail.yaml +49 -0
  218. package/dist/clis/pixiv/download.d.ts +7 -0
  219. package/dist/clis/pixiv/download.js +78 -0
  220. package/dist/clis/pixiv/download.test.d.ts +1 -0
  221. package/dist/clis/pixiv/download.test.js +87 -0
  222. package/dist/clis/pixiv/illusts.d.ts +8 -0
  223. package/dist/clis/pixiv/illusts.js +65 -0
  224. package/dist/clis/pixiv/illusts.test.d.ts +1 -0
  225. package/dist/clis/pixiv/illusts.test.js +99 -0
  226. package/dist/clis/pixiv/ranking.yaml +53 -0
  227. package/dist/clis/pixiv/search.d.ts +6 -0
  228. package/dist/clis/pixiv/search.js +43 -0
  229. package/dist/clis/pixiv/search.test.d.ts +1 -0
  230. package/dist/clis/pixiv/search.test.js +83 -0
  231. package/dist/clis/pixiv/test-utils.d.ts +12 -0
  232. package/dist/clis/pixiv/test-utils.js +23 -0
  233. package/dist/clis/pixiv/user.yaml +46 -0
  234. package/dist/clis/pixiv/utils.d.ts +27 -0
  235. package/dist/clis/pixiv/utils.js +49 -0
  236. package/dist/clis/reddit/comment.js +2 -1
  237. package/dist/clis/reddit/read.js +4 -3
  238. package/dist/clis/reddit/read.test.d.ts +1 -0
  239. package/dist/clis/reddit/read.test.js +28 -0
  240. package/dist/clis/reddit/save.js +2 -1
  241. package/dist/clis/reddit/saved.js +7 -3
  242. package/dist/clis/reddit/subscribe.js +2 -1
  243. package/dist/clis/reddit/upvote.js +2 -1
  244. package/dist/clis/reddit/upvoted.js +7 -3
  245. package/dist/clis/reuters/search.js +0 -1
  246. package/dist/clis/sinablog/article.js +1 -1
  247. package/dist/clis/sinablog/hot.js +1 -1
  248. package/dist/clis/sinablog/user.js +1 -1
  249. package/dist/clis/substack/feed.js +1 -1
  250. package/dist/clis/substack/publication.js +1 -1
  251. package/dist/clis/substack/search.js +3 -2
  252. package/dist/clis/substack/{shared.js → utils.js} +3 -2
  253. package/dist/clis/tiktok/search.yaml +2 -1
  254. package/dist/clis/twitter/accept.js +2 -1
  255. package/dist/clis/twitter/article.js +4 -1
  256. package/dist/clis/twitter/block.js +2 -1
  257. package/dist/clis/twitter/bookmark.js +2 -1
  258. package/dist/clis/twitter/bookmarks.js +3 -2
  259. package/dist/clis/twitter/delete.js +2 -1
  260. package/dist/clis/twitter/follow.js +2 -1
  261. package/dist/clis/twitter/followers.js +3 -2
  262. package/dist/clis/twitter/following.js +3 -2
  263. package/dist/clis/twitter/hide-reply.js +2 -1
  264. package/dist/clis/twitter/like.js +2 -1
  265. package/dist/clis/twitter/notifications.js +2 -1
  266. package/dist/clis/twitter/post.js +2 -1
  267. package/dist/clis/twitter/profile.js +5 -2
  268. package/dist/clis/twitter/reply-dm.js +2 -1
  269. package/dist/clis/twitter/reply.js +2 -1
  270. package/dist/clis/twitter/search.js +32 -13
  271. package/dist/clis/twitter/search.test.d.ts +1 -0
  272. package/dist/clis/twitter/search.test.js +156 -0
  273. package/dist/clis/twitter/thread.js +2 -2
  274. package/dist/clis/twitter/timeline.js +3 -2
  275. package/dist/clis/twitter/trending.js +3 -2
  276. package/dist/clis/twitter/unblock.js +2 -1
  277. package/dist/clis/twitter/unbookmark.js +2 -1
  278. package/dist/clis/twitter/unfollow.js +2 -1
  279. package/dist/clis/v2ex/daily.js +3 -2
  280. package/dist/clis/v2ex/me.js +3 -2
  281. package/dist/clis/v2ex/notifications.js +4 -4
  282. package/dist/clis/web/read.d.ts +16 -0
  283. package/dist/clis/web/read.js +202 -0
  284. package/dist/clis/weibo/comments.d.ts +1 -0
  285. package/dist/clis/weibo/comments.js +53 -0
  286. package/dist/clis/weibo/feed.d.ts +1 -0
  287. package/dist/clis/weibo/feed.js +56 -0
  288. package/dist/clis/weibo/hot.js +0 -1
  289. package/dist/clis/weibo/me.d.ts +1 -0
  290. package/dist/clis/weibo/me.js +76 -0
  291. package/dist/clis/weibo/post.d.ts +1 -0
  292. package/dist/clis/weibo/post.js +75 -0
  293. package/dist/clis/weibo/user.d.ts +1 -0
  294. package/dist/clis/weibo/user.js +63 -0
  295. package/dist/clis/weibo/utils.d.ts +6 -0
  296. package/dist/clis/weibo/utils.js +30 -0
  297. package/dist/clis/weread/search.js +3 -2
  298. package/dist/clis/xueqiu/danjuan-utils.d.ts +55 -0
  299. package/dist/clis/xueqiu/danjuan-utils.js +126 -0
  300. package/dist/clis/xueqiu/danjuan-utils.test.d.ts +1 -0
  301. package/dist/clis/xueqiu/danjuan-utils.test.js +41 -0
  302. package/dist/clis/xueqiu/fund-holdings.d.ts +1 -0
  303. package/dist/clis/xueqiu/fund-holdings.js +28 -0
  304. package/dist/clis/xueqiu/fund-snapshot.d.ts +1 -0
  305. package/dist/clis/xueqiu/fund-snapshot.js +25 -0
  306. package/dist/clis/xueqiu/search.yaml +2 -1
  307. package/dist/clis/yahoo-finance/quote.js +0 -1
  308. package/dist/clis/youtube/channel.d.ts +1 -0
  309. package/dist/clis/youtube/channel.js +150 -0
  310. package/dist/clis/youtube/comments.d.ts +1 -0
  311. package/dist/clis/youtube/comments.js +95 -0
  312. package/dist/clis/youtube/search.js +0 -1
  313. package/dist/clis/youtube/transcript.js +5 -4
  314. package/dist/clis/youtube/video.js +3 -2
  315. package/dist/clis/zhihu/search.yaml +2 -1
  316. package/dist/daemon.js +7 -3
  317. package/dist/discovery.js +11 -10
  318. package/dist/doctor.js +2 -1
  319. package/dist/download/index.d.ts +4 -12
  320. package/dist/download/index.js +33 -12
  321. package/dist/download/index.test.js +79 -2
  322. package/dist/download/media-download.js +4 -2
  323. package/dist/engine.test.js +76 -4
  324. package/dist/execution.d.ts +1 -9
  325. package/dist/execution.js +56 -46
  326. package/dist/explore.js +12 -111
  327. package/dist/external-clis.yaml +0 -25
  328. package/dist/external.js +7 -5
  329. package/dist/external.test.js +4 -0
  330. package/dist/generate.d.ts +0 -9
  331. package/dist/generate.js +4 -20
  332. package/dist/hooks.d.ts +46 -0
  333. package/dist/hooks.js +56 -0
  334. package/dist/hooks.test.d.ts +4 -0
  335. package/dist/hooks.test.js +92 -0
  336. package/dist/interceptor.js +70 -23
  337. package/dist/main.js +2 -0
  338. package/dist/output.js +12 -6
  339. package/dist/pipeline/executor.js +1 -1
  340. package/dist/pipeline/steps/browser.js +1 -3
  341. package/dist/pipeline/steps/download.js +42 -26
  342. package/dist/pipeline/steps/download.test.d.ts +1 -0
  343. package/dist/pipeline/steps/download.test.js +101 -0
  344. package/dist/pipeline/steps/fetch.js +40 -22
  345. package/dist/pipeline/steps/fetch.test.d.ts +1 -0
  346. package/dist/pipeline/steps/fetch.test.js +123 -0
  347. package/dist/pipeline/steps/transform.js +2 -6
  348. package/dist/pipeline/template.js +66 -52
  349. package/dist/pipeline/template.test.js +28 -0
  350. package/dist/pipeline/transform.test.js +18 -0
  351. package/dist/plugin.d.ts +40 -1
  352. package/dist/plugin.js +214 -17
  353. package/dist/plugin.test.d.ts +1 -1
  354. package/dist/plugin.test.js +219 -3
  355. package/dist/record.js +6 -98
  356. package/dist/registry-api.d.ts +2 -0
  357. package/dist/registry-api.js +1 -0
  358. package/dist/registry.d.ts +5 -2
  359. package/dist/registry.js +1 -2
  360. package/dist/runtime.d.ts +0 -1
  361. package/dist/runtime.js +14 -4
  362. package/dist/snapshotFormatter.d.ts +7 -14
  363. package/dist/snapshotFormatter.js +38 -78
  364. package/dist/utils.d.ts +9 -0
  365. package/dist/utils.js +29 -0
  366. package/dist/validate.js +3 -5
  367. package/dist/weread-search-regression.test.d.ts +1 -0
  368. package/dist/weread-search-regression.test.js +39 -0
  369. package/dist/yaml-schema.d.ts +26 -0
  370. package/dist/yaml-schema.js +5 -0
  371. package/docs/.vitepress/config.mts +16 -0
  372. package/docs/adapters/browser/dictionary.md +27 -0
  373. package/docs/adapters/browser/douyin.md +75 -0
  374. package/docs/adapters/browser/jd.md +27 -0
  375. package/docs/adapters/browser/linkedin.md +6 -0
  376. package/docs/adapters/browser/pixiv.md +92 -0
  377. package/docs/adapters/browser/twitter.md +6 -0
  378. package/docs/adapters/browser/web.md +30 -0
  379. package/docs/adapters/browser/xueqiu.md +27 -9
  380. package/docs/adapters/index.md +9 -2
  381. package/docs/comparison.md +125 -0
  382. package/docs/developer/contributing.md +21 -2
  383. package/docs/developer/testing.md +14 -8
  384. package/docs/developer/ts-adapter.md +18 -0
  385. package/docs/developer/yaml-adapter.md +16 -0
  386. package/docs/guide/plugins.md +10 -0
  387. package/docs/zh/guide/plugins.md +10 -0
  388. package/extension/dist/background.js +100 -35
  389. package/extension/manifest.json +6 -2
  390. package/extension/package.json +1 -1
  391. package/extension/popup.html +84 -0
  392. package/extension/popup.js +25 -0
  393. package/extension/src/background.test.ts +46 -1
  394. package/extension/src/background.ts +128 -34
  395. package/extension/src/cdp.ts +9 -9
  396. package/package.json +3 -2
  397. package/scripts/check-doc-coverage.sh +2 -0
  398. package/src/analysis.ts +170 -0
  399. package/src/browser/cdp.test.ts +66 -0
  400. package/src/browser/cdp.ts +59 -44
  401. package/src/browser/dom-snapshot.test.ts +42 -0
  402. package/src/browser/dom-snapshot.ts +56 -3
  403. package/src/browser/index.ts +2 -2
  404. package/src/browser/mcp.ts +2 -4
  405. package/src/browser/page.ts +34 -37
  406. package/src/browser/stealth.ts +24 -10
  407. package/src/browser.test.ts +2 -2
  408. package/src/build-manifest.test.ts +14 -0
  409. package/src/build-manifest.ts +13 -31
  410. package/src/cascade.ts +5 -3
  411. package/src/cli.ts +66 -34
  412. package/src/clis/_shared/desktop-commands.ts +121 -0
  413. package/src/clis/antigravity/serve.ts +6 -3
  414. package/src/clis/apple-podcasts/search.ts +2 -1
  415. package/src/clis/arxiv/search.ts +3 -3
  416. package/src/clis/bbc/news.ts +0 -1
  417. package/src/clis/bilibili/dynamic.test.ts +79 -0
  418. package/src/clis/bilibili/favorite.ts +5 -2
  419. package/src/clis/bilibili/following.ts +3 -2
  420. package/src/clis/bilibili/subtitle.ts +8 -7
  421. package/src/clis/bilibili/utils.ts +2 -2
  422. package/src/clis/boss/batchgreet.ts +1 -1
  423. package/src/clis/boss/chatlist.ts +1 -1
  424. package/src/clis/boss/chatmsg.ts +1 -1
  425. package/src/clis/boss/detail.ts +1 -1
  426. package/src/clis/boss/exchange.ts +1 -1
  427. package/src/clis/boss/greet.ts +1 -1
  428. package/src/clis/boss/invite.ts +1 -1
  429. package/src/clis/boss/joblist.ts +1 -1
  430. package/src/clis/boss/mark.ts +4 -3
  431. package/src/clis/boss/recommend.ts +1 -1
  432. package/src/clis/boss/resume.ts +1 -1
  433. package/src/clis/boss/search.ts +1 -1
  434. package/src/clis/boss/send.ts +5 -4
  435. package/src/clis/boss/stats.ts +1 -1
  436. package/src/clis/chatgpt/ask.ts +5 -0
  437. package/src/clis/chatgpt/new.ts +7 -2
  438. package/src/clis/chatgpt/read.ts +7 -2
  439. package/src/clis/chatgpt/send.ts +3 -2
  440. package/src/clis/chatgpt/status.ts +6 -1
  441. package/src/clis/chatwise/ask.ts +7 -2
  442. package/src/clis/chatwise/export.ts +2 -0
  443. package/src/clis/chatwise/history.ts +2 -0
  444. package/src/clis/chatwise/model.ts +7 -3
  445. package/src/clis/chatwise/new.ts +3 -20
  446. package/src/clis/chatwise/read.ts +2 -0
  447. package/src/clis/chatwise/screenshot.ts +3 -32
  448. package/src/clis/chatwise/send.ts +7 -2
  449. package/src/clis/chatwise/shared.ts +8 -0
  450. package/src/clis/chatwise/status.ts +3 -24
  451. package/src/clis/codex/ask.ts +5 -2
  452. package/src/clis/codex/dump.ts +2 -27
  453. package/src/clis/codex/new.ts +2 -28
  454. package/src/clis/codex/screenshot.ts +2 -32
  455. package/src/clis/codex/send.ts +5 -4
  456. package/src/clis/codex/status.ts +2 -24
  457. package/src/clis/ctrip/search.ts +0 -1
  458. package/src/clis/cursor/ask.ts +2 -1
  459. package/src/clis/cursor/composer.ts +2 -1
  460. package/src/clis/cursor/dump.ts +2 -27
  461. package/src/clis/cursor/new.ts +2 -20
  462. package/src/clis/cursor/read.ts +2 -1
  463. package/src/clis/cursor/screenshot.ts +1 -36
  464. package/src/clis/cursor/send.ts +2 -1
  465. package/src/clis/cursor/status.ts +2 -22
  466. package/src/clis/dictionary/examples.yaml +25 -0
  467. package/src/clis/dictionary/search.yaml +27 -0
  468. package/src/clis/dictionary/synonyms.yaml +25 -0
  469. package/src/clis/douban/book-hot.ts +1 -1
  470. package/src/clis/douban/movie-hot.ts +1 -1
  471. package/src/clis/douban/search.ts +1 -1
  472. package/src/clis/douban/utils.ts +165 -1
  473. package/src/clis/doubao/ask.ts +1 -1
  474. package/src/clis/doubao/new.ts +1 -1
  475. package/src/clis/doubao/read.ts +1 -1
  476. package/src/clis/doubao/send.ts +1 -1
  477. package/src/clis/doubao/status.ts +1 -1
  478. package/src/clis/doubao-app/ask.ts +1 -1
  479. package/src/clis/doubao-app/new.ts +1 -1
  480. package/src/clis/doubao-app/read.ts +1 -1
  481. package/src/clis/doubao-app/send.ts +1 -1
  482. package/src/clis/douyin/_shared/browser-fetch.test.ts +38 -0
  483. package/src/clis/douyin/_shared/browser-fetch.ts +45 -0
  484. package/src/clis/douyin/_shared/creation-id.test.ts +26 -0
  485. package/src/clis/douyin/_shared/creation-id.ts +8 -0
  486. package/src/clis/douyin/_shared/imagex-upload.test.ts +113 -0
  487. package/src/clis/douyin/_shared/imagex-upload.ts +76 -0
  488. package/src/clis/douyin/_shared/sts2.ts +20 -0
  489. package/src/clis/douyin/_shared/text-extra.test.ts +42 -0
  490. package/src/clis/douyin/_shared/text-extra.ts +33 -0
  491. package/src/clis/douyin/_shared/timing.test.ts +38 -0
  492. package/src/clis/douyin/_shared/timing.ts +22 -0
  493. package/src/clis/douyin/_shared/tos-upload-short-read.test.ts +102 -0
  494. package/src/clis/douyin/_shared/tos-upload.test.ts +281 -0
  495. package/src/clis/douyin/_shared/tos-upload.ts +444 -0
  496. package/src/clis/douyin/_shared/transcode.test.ts +117 -0
  497. package/src/clis/douyin/_shared/transcode.ts +78 -0
  498. package/src/clis/douyin/_shared/types.ts +29 -0
  499. package/src/clis/douyin/activities.test.ts +25 -0
  500. package/src/clis/douyin/activities.ts +23 -0
  501. package/src/clis/douyin/collections.test.ts +26 -0
  502. package/src/clis/douyin/collections.ts +25 -0
  503. package/src/clis/douyin/delete.test.ts +12 -0
  504. package/src/clis/douyin/delete.ts +20 -0
  505. package/src/clis/douyin/draft.test.ts +12 -0
  506. package/src/clis/douyin/draft.ts +282 -0
  507. package/src/clis/douyin/drafts.test.ts +12 -0
  508. package/src/clis/douyin/drafts.ts +27 -0
  509. package/src/clis/douyin/hashtag.test.ts +28 -0
  510. package/src/clis/douyin/hashtag.ts +56 -0
  511. package/src/clis/douyin/location.test.ts +26 -0
  512. package/src/clis/douyin/location.ts +27 -0
  513. package/src/clis/douyin/profile.test.ts +12 -0
  514. package/src/clis/douyin/profile.ts +37 -0
  515. package/src/clis/douyin/publish.test.ts +45 -0
  516. package/src/clis/douyin/publish.ts +340 -0
  517. package/src/clis/douyin/stats.test.ts +25 -0
  518. package/src/clis/douyin/stats.ts +30 -0
  519. package/src/clis/douyin/update.test.ts +12 -0
  520. package/src/clis/douyin/update.ts +43 -0
  521. package/src/clis/douyin/videos.test.ts +12 -0
  522. package/src/clis/douyin/videos.ts +49 -0
  523. package/src/clis/grok/ask.test.ts +25 -0
  524. package/src/clis/grok/ask.ts +25 -12
  525. package/src/clis/hackernews/search.yaml +1 -1
  526. package/src/clis/instagram/search.yaml +2 -1
  527. package/src/clis/jd/item.test.ts +35 -0
  528. package/src/clis/jd/item.ts +101 -0
  529. package/src/clis/jike/feed.ts +1 -1
  530. package/src/clis/jike/search.ts +1 -1
  531. package/src/clis/linkedin/search.ts +5 -4
  532. package/src/clis/linkedin/timeline.test.ts +99 -0
  533. package/src/clis/linkedin/timeline.ts +532 -0
  534. package/src/clis/linux-do/search.yaml +3 -1
  535. package/src/clis/medium/feed.ts +1 -1
  536. package/src/clis/medium/search.ts +2 -2
  537. package/src/clis/medium/user.ts +1 -1
  538. package/src/clis/medium/{shared.ts → utils.ts} +2 -1
  539. package/src/clis/pixiv/detail.yaml +49 -0
  540. package/src/clis/pixiv/download.test.ts +114 -0
  541. package/src/clis/pixiv/download.ts +91 -0
  542. package/src/clis/pixiv/illusts.test.ts +115 -0
  543. package/src/clis/pixiv/illusts.ts +78 -0
  544. package/src/clis/pixiv/ranking.yaml +53 -0
  545. package/src/clis/pixiv/search.test.ts +97 -0
  546. package/src/clis/pixiv/search.ts +53 -0
  547. package/src/clis/pixiv/test-utils.ts +29 -0
  548. package/src/clis/pixiv/user.yaml +46 -0
  549. package/src/clis/pixiv/utils.ts +62 -0
  550. package/src/clis/reddit/comment.ts +2 -1
  551. package/src/clis/reddit/read.test.ts +34 -0
  552. package/src/clis/reddit/read.ts +4 -3
  553. package/src/clis/reddit/save.ts +2 -1
  554. package/src/clis/reddit/saved.ts +6 -2
  555. package/src/clis/reddit/subscribe.ts +2 -1
  556. package/src/clis/reddit/upvote.ts +2 -1
  557. package/src/clis/reddit/upvoted.ts +6 -2
  558. package/src/clis/reuters/search.ts +0 -1
  559. package/src/clis/sinablog/article.ts +1 -1
  560. package/src/clis/sinablog/hot.ts +1 -1
  561. package/src/clis/sinablog/user.ts +1 -1
  562. package/src/clis/substack/feed.ts +1 -1
  563. package/src/clis/substack/publication.ts +1 -1
  564. package/src/clis/substack/search.ts +3 -2
  565. package/src/clis/substack/{shared.ts → utils.ts} +3 -2
  566. package/src/clis/tiktok/search.yaml +2 -1
  567. package/src/clis/twitter/accept.ts +2 -1
  568. package/src/clis/twitter/article.ts +3 -1
  569. package/src/clis/twitter/block.ts +2 -1
  570. package/src/clis/twitter/bookmark.ts +2 -1
  571. package/src/clis/twitter/bookmarks.ts +3 -2
  572. package/src/clis/twitter/delete.ts +2 -1
  573. package/src/clis/twitter/follow.ts +2 -1
  574. package/src/clis/twitter/followers.ts +3 -2
  575. package/src/clis/twitter/following.ts +3 -2
  576. package/src/clis/twitter/hide-reply.ts +2 -1
  577. package/src/clis/twitter/like.ts +2 -1
  578. package/src/clis/twitter/notifications.ts +2 -1
  579. package/src/clis/twitter/post.ts +2 -1
  580. package/src/clis/twitter/profile.ts +4 -2
  581. package/src/clis/twitter/reply-dm.ts +2 -1
  582. package/src/clis/twitter/reply.ts +2 -1
  583. package/src/clis/twitter/search.test.ts +180 -0
  584. package/src/clis/twitter/search.ts +40 -14
  585. package/src/clis/twitter/thread.ts +2 -2
  586. package/src/clis/twitter/timeline.ts +3 -2
  587. package/src/clis/twitter/trending.ts +3 -2
  588. package/src/clis/twitter/unblock.ts +2 -1
  589. package/src/clis/twitter/unbookmark.ts +2 -1
  590. package/src/clis/twitter/unfollow.ts +2 -1
  591. package/src/clis/v2ex/daily.ts +3 -2
  592. package/src/clis/v2ex/me.ts +3 -2
  593. package/src/clis/v2ex/notifications.ts +3 -4
  594. package/src/clis/web/read.ts +210 -0
  595. package/src/clis/weibo/comments.ts +54 -0
  596. package/src/clis/weibo/feed.ts +57 -0
  597. package/src/clis/weibo/hot.ts +0 -1
  598. package/src/clis/weibo/me.ts +77 -0
  599. package/src/clis/weibo/post.ts +77 -0
  600. package/src/clis/weibo/user.ts +64 -0
  601. package/src/clis/weibo/utils.ts +32 -0
  602. package/src/clis/weread/search.ts +3 -2
  603. package/src/clis/xueqiu/danjuan-utils.test.ts +49 -0
  604. package/src/clis/xueqiu/danjuan-utils.ts +176 -0
  605. package/src/clis/xueqiu/fund-holdings.ts +32 -0
  606. package/src/clis/xueqiu/fund-snapshot.ts +27 -0
  607. package/src/clis/xueqiu/search.yaml +2 -1
  608. package/src/clis/yahoo-finance/quote.ts +0 -1
  609. package/src/clis/youtube/channel.ts +155 -0
  610. package/src/clis/youtube/comments.ts +97 -0
  611. package/src/clis/youtube/search.ts +0 -1
  612. package/src/clis/youtube/transcript.ts +5 -4
  613. package/src/clis/youtube/video.ts +3 -2
  614. package/src/clis/zhihu/search.yaml +2 -1
  615. package/src/daemon.ts +5 -4
  616. package/src/discovery.ts +12 -34
  617. package/src/doctor.ts +3 -2
  618. package/src/download/index.test.ts +93 -2
  619. package/src/download/index.ts +44 -23
  620. package/src/download/media-download.ts +5 -3
  621. package/src/engine.test.ts +84 -3
  622. package/src/execution.ts +62 -46
  623. package/src/explore.ts +21 -90
  624. package/src/external-clis.yaml +0 -25
  625. package/src/external.test.ts +9 -0
  626. package/src/external.ts +12 -10
  627. package/src/generate.ts +4 -41
  628. package/src/hooks.test.ts +126 -0
  629. package/src/hooks.ts +90 -0
  630. package/src/interceptor.ts +73 -23
  631. package/src/main.ts +2 -0
  632. package/src/output.ts +14 -6
  633. package/src/pipeline/executor.ts +1 -1
  634. package/src/pipeline/steps/browser.ts +1 -3
  635. package/src/pipeline/steps/download.test.ts +136 -0
  636. package/src/pipeline/steps/download.ts +47 -34
  637. package/src/pipeline/steps/fetch.test.ts +179 -0
  638. package/src/pipeline/steps/fetch.ts +39 -23
  639. package/src/pipeline/steps/transform.ts +2 -6
  640. package/src/pipeline/template.test.ts +28 -0
  641. package/src/pipeline/template.ts +67 -79
  642. package/src/pipeline/transform.test.ts +20 -0
  643. package/src/plugin.test.ts +251 -3
  644. package/src/plugin.ts +265 -21
  645. package/src/record.ts +12 -84
  646. package/src/registry-api.ts +2 -0
  647. package/src/registry.ts +7 -4
  648. package/src/runtime.ts +14 -4
  649. package/src/snapshotFormatter.ts +43 -121
  650. package/src/utils.ts +39 -0
  651. package/src/validate.ts +3 -5
  652. package/src/weread-search-regression.test.ts +44 -0
  653. package/src/yaml-schema.ts +28 -0
  654. package/tests/e2e/browser-auth.test.ts +25 -0
  655. package/tests/e2e/browser-public-extended.test.ts +162 -0
  656. package/tests/e2e/browser-public.test.ts +7 -146
  657. package/tests/e2e/plugin-management.test.ts +137 -0
  658. package/tests/e2e/public-commands.test.ts +34 -1
  659. package/vitest.config.ts +33 -8
  660. package/.github/workflows/pkg-pr-new.yml +0 -30
  661. package/dist/clis/douban/shared.d.ts +0 -4
  662. package/dist/clis/douban/shared.js +0 -155
  663. package/src/clis/douban/shared.ts +0 -165
  664. /package/dist/clis/boss/{common.d.ts → utils.d.ts} +0 -0
  665. /package/dist/clis/boss/{common.js → utils.js} +0 -0
  666. /package/dist/clis/doubao/{common.d.ts → utils.d.ts} +0 -0
  667. /package/dist/clis/doubao/{common.js → utils.js} +0 -0
  668. /package/dist/clis/doubao-app/{common.d.ts → utils.d.ts} +0 -0
  669. /package/dist/clis/doubao-app/{common.js → utils.js} +0 -0
  670. /package/dist/clis/jike/{shared.d.ts → utils.d.ts} +0 -0
  671. /package/dist/clis/jike/{shared.js → utils.js} +0 -0
  672. /package/dist/clis/medium/{shared.d.ts → utils.d.ts} +0 -0
  673. /package/dist/clis/sinablog/{shared.d.ts → utils.d.ts} +0 -0
  674. /package/dist/clis/sinablog/{shared.js → utils.js} +0 -0
  675. /package/dist/clis/substack/{shared.d.ts → utils.d.ts} +0 -0
  676. /package/src/clis/boss/{common.ts → utils.ts} +0 -0
  677. /package/src/clis/doubao/{common.ts → utils.ts} +0 -0
  678. /package/src/clis/doubao-app/{common.ts → utils.ts} +0 -0
  679. /package/src/clis/jike/{shared.ts → utils.ts} +0 -0
  680. /package/src/clis/sinablog/{shared.ts → utils.ts} +0 -0
@@ -1,5 +1,5 @@
1
- name: Setup Chrome + xvfb
2
- description: Install real Chrome and xvfb virtual display for headed browser testing
1
+ name: Setup Chrome
2
+ description: Install real Chrome for browser testing (with xvfb on Linux)
3
3
 
4
4
  outputs:
5
5
  chrome-path:
@@ -19,8 +19,9 @@ runs:
19
19
  shell: bash
20
20
  run: |
21
21
  echo "Chrome path: ${{ steps.setup-chrome.outputs.chrome-path }}"
22
- ${{ steps.setup-chrome.outputs.chrome-path }} --version
22
+ "${{ steps.setup-chrome.outputs.chrome-path }}" --version
23
23
 
24
- - name: Install xvfb for headed mode
24
+ - name: Install xvfb (Linux only)
25
+ if: runner.os == 'Linux'
25
26
  shell: bash
26
27
  run: sudo apt-get install -y xvfb
@@ -24,8 +24,10 @@ Related issue:
24
24
  - [ ] Added doc page under `docs/adapters/` (if new adapter)
25
25
  - [ ] Updated `docs/adapters/index.md` table (if new adapter)
26
26
  - [ ] Updated sidebar in `docs/.vitepress/config.mts` (if new adapter)
27
+ - [ ] Updated `README.md` / `README.zh-CN.md` when command discoverability changed
28
+ - [ ] Used positional args for the command's primary subject unless a named flag is clearly better
29
+ - [ ] Normalized expected adapter failures to `CliError` subclasses instead of raw `Error`
27
30
 
28
31
  ## Screenshots / Output
29
32
 
30
33
  <!-- If applicable, paste CLI output or screenshots here. -->
31
-
@@ -4,8 +4,14 @@ on:
4
4
  push:
5
5
  branches: [ "main" ]
6
6
  tags: [ "v*.*.*" ]
7
+ paths:
8
+ - 'extension/**'
9
+ - '.github/workflows/build-extension.yml'
7
10
  pull_request:
8
11
  branches: [ "main" ]
12
+ paths:
13
+ - 'extension/**'
14
+ - '.github/workflows/build-extension.yml'
9
15
 
10
16
  permissions:
11
17
  contents: write
@@ -46,7 +52,7 @@ jobs:
46
52
  zip -r ../opencli-extension.zip .
47
53
 
48
54
  - name: Upload Artifacts (Action Run)
49
- uses: actions/upload-artifact@v4
55
+ uses: actions/upload-artifact@v7
50
56
  with:
51
57
  name: opencli-extension-build
52
58
  path: |
@@ -16,7 +16,11 @@ concurrency:
16
16
  jobs:
17
17
  # ── Fast gate: typecheck + build ──
18
18
  build:
19
- runs-on: ubuntu-latest
19
+ runs-on: ${{ matrix.os }}
20
+ strategy:
21
+ fail-fast: false
22
+ matrix:
23
+ os: [ubuntu-latest, macos-latest, windows-latest]
20
24
  steps:
21
25
  - uses: actions/checkout@v6
22
26
 
@@ -36,10 +40,11 @@ jobs:
36
40
 
37
41
  # ── Unit tests (vitest shard) ──
38
42
  unit-test:
39
- runs-on: ubuntu-latest
43
+ runs-on: ${{ matrix.os }}
40
44
  strategy:
41
45
  fail-fast: false
42
46
  matrix:
47
+ os: [ubuntu-latest, macos-latest, windows-latest]
43
48
  node-version: ['20', '22']
44
49
  shard: [1, 2]
45
50
  steps:
@@ -54,13 +59,40 @@ jobs:
54
59
  run: npm ci
55
60
 
56
61
  - name: Run unit tests (Node ${{ matrix.node-version }}, shard ${{ matrix.shard }}/2)
57
- run: npx vitest run src/ --reporter=verbose --shard=${{ matrix.shard }}/2
62
+ run: npm test -- --reporter=verbose --shard=${{ matrix.shard }}/2
63
+
64
+ adapter-test:
65
+ runs-on: ${{ matrix.os }}
66
+ strategy:
67
+ fail-fast: false
68
+ matrix:
69
+ os: [ubuntu-latest, macos-latest, windows-latest]
70
+ needs: build
71
+ steps:
72
+ - uses: actions/checkout@v6
73
+
74
+ - uses: actions/setup-node@v6
75
+ with:
76
+ node-version: '22'
77
+ cache: 'npm'
78
+
79
+ - name: Install dependencies
80
+ run: npm ci
81
+
82
+ - name: Run focused adapter tests
83
+ run: npm run test:adapter -- --reporter=verbose
58
84
 
59
85
  # ── Smoke tests (scheduled / manual only) ──
60
86
  smoke-test:
61
87
  if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
62
88
  needs: build
63
- runs-on: ubuntu-latest
89
+ runs-on: ${{ matrix.os }}
90
+ strategy:
91
+ fail-fast: false
92
+ matrix:
93
+ # NOTE: Windows excluded — browser-actions/setup-chrome hangs during
94
+ # Chrome MSI installation on Windows runners (known issue).
95
+ os: [ubuntu-latest, macos-latest]
64
96
  steps:
65
97
  - uses: actions/checkout@v6
66
98
 
@@ -72,17 +104,25 @@ jobs:
72
104
  - name: Install dependencies
73
105
  run: npm ci
74
106
 
75
- - name: Setup Chrome + xvfb
107
+ - name: Setup Chrome
76
108
  uses: ./.github/actions/setup-chrome
77
109
  id: setup-chrome
78
110
 
79
111
  - name: Build
80
112
  run: npm run build
81
113
 
82
- - name: Run smoke tests
114
+ - name: Run smoke tests (Linux, via xvfb)
115
+ if: runner.os == 'Linux'
83
116
  run: |
84
117
  xvfb-run --auto-servernum --server-args="-screen 0 1280x720x24" \
85
118
  npx vitest run tests/smoke/ --reporter=verbose
86
119
  env:
87
120
  OPENCLI_BROWSER_EXECUTABLE_PATH: ${{ steps.setup-chrome.outputs.chrome-path }}
121
+
122
+ - name: Run smoke tests (macOS / Windows)
123
+ if: runner.os != 'Linux'
124
+ run: npx vitest run tests/smoke/ --reporter=verbose
125
+ env:
126
+ OPENCLI_BROWSER_EXECUTABLE_PATH: ${{ steps.setup-chrome.outputs.chrome-path }}
88
127
  timeout-minutes: 15
128
+
@@ -10,7 +10,7 @@ jobs:
10
10
  runs-on: ubuntu-latest
11
11
  steps:
12
12
  - name: Trigger opencli-website rebuild
13
- uses: peter-evans/repository-dispatch@v3
13
+ uses: peter-evans/repository-dispatch@v4
14
14
  with:
15
15
  token: ${{ secrets.WEBSITE_DEPLOY_TOKEN }}
16
16
  repository: jackwener/opencli-website
@@ -3,8 +3,28 @@ name: E2E Headed Chrome
3
3
  on:
4
4
  push:
5
5
  branches: [main, dev]
6
+ paths:
7
+ - 'extension/**'
8
+ - 'src/browser/**'
9
+ - 'src/daemon.ts'
10
+ - 'src/execution.ts'
11
+ - 'src/interceptor.ts'
12
+ - 'tests/e2e/**'
13
+ - 'tests/smoke/**'
14
+ - '.github/actions/setup-chrome/**'
15
+ - '.github/workflows/e2e-headed.yml'
6
16
  pull_request:
7
17
  branches: [main, dev]
18
+ paths:
19
+ - 'extension/**'
20
+ - 'src/browser/**'
21
+ - 'src/daemon.ts'
22
+ - 'src/execution.ts'
23
+ - 'src/interceptor.ts'
24
+ - 'tests/e2e/**'
25
+ - 'tests/smoke/**'
26
+ - '.github/actions/setup-chrome/**'
27
+ - '.github/workflows/e2e-headed.yml'
8
28
  workflow_dispatch:
9
29
 
10
30
  concurrency:
@@ -13,7 +33,13 @@ concurrency:
13
33
 
14
34
  jobs:
15
35
  e2e-headed:
16
- runs-on: ubuntu-latest
36
+ runs-on: ${{ matrix.os }}
37
+ strategy:
38
+ fail-fast: false
39
+ matrix:
40
+ # NOTE: Windows excluded — browser-actions/setup-chrome hangs during
41
+ # Chrome MSI installation on Windows runners (known issue).
42
+ os: [ubuntu-latest, macos-latest]
17
43
  timeout-minutes: 20
18
44
  steps:
19
45
  - uses: actions/checkout@v6
@@ -26,16 +52,23 @@ jobs:
26
52
  - name: Install dependencies
27
53
  run: npm ci
28
54
 
29
- - name: Setup Chrome + xvfb
55
+ - name: Setup Chrome
30
56
  uses: ./.github/actions/setup-chrome
31
57
  id: setup-chrome
32
58
 
33
59
  - name: Build
34
60
  run: npm run build
35
61
 
36
- - name: Run E2E tests (headed Chrome + xvfb)
62
+ - name: Run E2E tests (Linux, via xvfb)
63
+ if: runner.os == 'Linux'
37
64
  run: |
38
65
  xvfb-run --auto-servernum --server-args="-screen 0 1280x720x24" \
39
66
  npx vitest run tests/e2e/ --reporter=verbose
40
67
  env:
41
68
  OPENCLI_BROWSER_EXECUTABLE_PATH: ${{ steps.setup-chrome.outputs.chrome-path }}
69
+
70
+ - name: Run E2E tests (macOS / Windows)
71
+ if: runner.os != 'Linux'
72
+ run: npx vitest run tests/e2e/ --reporter=verbose
73
+ env:
74
+ OPENCLI_BROWSER_EXECUTABLE_PATH: ${{ steps.setup-chrome.outputs.chrome-path }}
@@ -37,7 +37,7 @@ jobs:
37
37
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
38
38
 
39
39
  - name: Trigger website rebuild
40
- uses: peter-evans/repository-dispatch@v3
40
+ uses: peter-evans/repository-dispatch@v4
41
41
  with:
42
42
  token: ${{ secrets.WEBSITE_DEPLOY_TOKEN }}
43
43
  repository: jackwener/opencli-website
@@ -31,6 +31,3 @@ jobs:
31
31
 
32
32
  - name: npm audit (production)
33
33
  run: npm audit --omit=dev --audit-level=high
34
-
35
- - name: Check for known vulnerabilities
36
- run: npx --yes audit-ci@^7 --high --skip-dev
package/CHANGELOG.md CHANGED
@@ -1,5 +1,83 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.4.1](https://github.com/jackwener/opencli/compare/v1.4.0...v1.4.1) (2026-03-25)
4
+
5
+
6
+ ### Features
7
+
8
+ * **douyin:** add Douyin creator center adapter — 14 commands, 8-phase publish pipeline ([#416](https://github.com/jackwener/opencli/issues/416))
9
+ * **weibo,youtube:** add Weibo commands and YouTube channel/comments ([#418](https://github.com/jackwener/opencli/issues/418))
10
+ * **twitter:** add filter option for search ([#410](https://github.com/jackwener/opencli/issues/410))
11
+ * **extension:** add popup UI, privacy policy, and CSP for Chrome Web Store ([#415](https://github.com/jackwener/opencli/issues/415))
12
+ * add url field to 9 search adapters (67% -> 97% coverage) ([#414](https://github.com/jackwener/opencli/issues/414))
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * **extension:** improve UX when daemon is not running — show hint in popup, reduce reconnect noise ([#424](https://github.com/jackwener/opencli/issues/424))
18
+ * remove incorrect gws and readwise external CLI entries ([#419](https://github.com/jackwener/opencli/issues/419), [#420](https://github.com/jackwener/opencli/issues/420))
19
+
20
+
21
+ ### CI
22
+
23
+ * limit default e2e to bilibili/zhihu/v2ex, gate extended browser tests ([#421](https://github.com/jackwener/opencli/issues/421), [#423](https://github.com/jackwener/opencli/issues/423))
24
+
25
+
26
+ ## [1.4.0](https://github.com/jackwener/opencli/compare/v1.3.3...v1.4.0) (2026-03-25)
27
+
28
+
29
+ ### Features
30
+
31
+ * **pixiv:** add Pixiv adapter — ranking, search, user illusts, detail, download ([#403](https://github.com/jackwener/opencli/issues/403))
32
+ * **plugin:** add lifecycle hooks API — onStartup, onBeforeExecute, onAfterExecute ([#376](https://github.com/jackwener/opencli/issues/376))
33
+ * **plugin:** validate plugin structure on install and update ([#364](https://github.com/jackwener/opencli/issues/364))
34
+ * **xueqiu:** add Danjuan fund account commands — fund-holdings, fund-snapshot ([#391](https://github.com/jackwener/opencli/issues/391))
35
+ * **tiktok:** add video URL to search results ([#404](https://github.com/jackwener/opencli/issues/404))
36
+ * **linkedin:** add timeline feed command ([#342](https://github.com/jackwener/opencli/issues/342))
37
+ * **jd:** add JD.com product details adapter ([#344](https://github.com/jackwener/opencli/issues/344))
38
+ * **web:** add generic `web read` command for any URL → Markdown ([#343](https://github.com/jackwener/opencli/issues/343))
39
+ * **dictionary:** add dictionary search, synonyms, and examples adapters ([#241](https://github.com/jackwener/opencli/issues/241))
40
+
41
+
42
+ ### Bug Fixes
43
+
44
+ * **analysis:** fix hasLimit using wrong Set (SEARCH_PARAMS → LIMIT_PARAMS) ([#412](https://github.com/jackwener/opencli/issues/412))
45
+ * **pipeline:** remove phantom scroll step — declared but never registered ([#412](https://github.com/jackwener/opencli/issues/412))
46
+ * **validate:** add missing download step to KNOWN_STEP_NAMES ([#412](https://github.com/jackwener/opencli/issues/412))
47
+ * **extension:** security hardening — tab isolation, URL validation, cookie scope ([#409](https://github.com/jackwener/opencli/issues/409))
48
+ * **sort:** use localeCompare with natural numeric sort by default ([#306](https://github.com/jackwener/opencli/issues/306))
49
+ * **pipeline:** evaluate chained || in template engine ([#305](https://github.com/jackwener/opencli/issues/305))
50
+ * **pipeline:** check HTTP status in fetch step ([#384](https://github.com/jackwener/opencli/issues/384))
51
+ * **plugin:** resolve Windows path and symlink issues ([#400](https://github.com/jackwener/opencli/issues/400))
52
+ * **download:** scope cookies to target domain ([#385](https://github.com/jackwener/opencli/issues/385))
53
+ * **extension:** fix same-url navigation timeout ([#380](https://github.com/jackwener/opencli/issues/380))
54
+ * fix ChatWise Windows connect ([#405](https://github.com/jackwener/opencli/issues/405))
55
+ * resolve 6 critical + 11 important bugs from deep code review ([#337](https://github.com/jackwener/opencli/issues/337), [#340](https://github.com/jackwener/opencli/issues/340))
56
+ * harden security-sensitive execution paths ([#335](https://github.com/jackwener/opencli/issues/335))
57
+ * **stealth:** harden anti-detection against advanced fingerprinting ([#357](https://github.com/jackwener/opencli/issues/357))
58
+
59
+
60
+ ### Code Quality
61
+
62
+ * replace all `catch (err: any)` with typed `getErrorMessage()` across 13 files ([#412](https://github.com/jackwener/opencli/issues/412))
63
+ * adopt CliError subclasses in social and desktop adapters ([#367](https://github.com/jackwener/opencli/issues/367), [#372](https://github.com/jackwener/opencli/issues/372), [#375](https://github.com/jackwener/opencli/issues/375))
64
+ * simplify codebase with type dedup, shared analysis module, and consistent naming ([#373](https://github.com/jackwener/opencli/issues/373))
65
+ * **ci:** add cross-platform CI matrix (Linux/macOS/Windows) ([#402](https://github.com/jackwener/opencli/issues/402))
66
+
67
+
68
+ ## [1.3.3](https://github.com/jackwener/opencli/compare/v1.3.2...v1.3.3) (2026-03-25)
69
+
70
+
71
+ ### Features
72
+
73
+ * **browser:** add stealth anti-detection for CDP and daemon modes ([#319](https://github.com/jackwener/opencli/issues/319))
74
+
75
+
76
+ ### Bug Fixes
77
+
78
+ * **stealth:** review fixes — guard plugins, rewrite stack trace cleanup ([#320](https://github.com/jackwener/opencli/issues/320))
79
+
80
+
3
81
  ## [1.3.2](https://github.com/jackwener/opencli/compare/v1.3.1...v1.3.2) (2026-03-24)
4
82
 
5
83
 
package/CONTRIBUTING.md CHANGED
@@ -17,7 +17,8 @@ npm run build
17
17
 
18
18
  # 4. Run a few checks
19
19
  npx tsc --noEmit
20
- npx vitest run src/
20
+ npm test
21
+ npm run test:adapter
21
22
 
22
23
  # 5. Link globally (optional, for testing `opencli` command)
23
24
  npm link
@@ -161,7 +162,8 @@ args: [
161
162
  See [TESTING.md](./TESTING.md) for the full guide and exact test locations.
162
163
 
163
164
  ```bash
164
- npx vitest run src/ # Unit tests
165
+ npm test # Core unit tests (non-adapter)
166
+ npm run test:adapter # Focused adapter tests: zhihu/twitter/reddit/bilibili
165
167
  npx vitest run tests/e2e/ # E2E tests
166
168
  npx vitest run # All tests
167
169
  ```
@@ -194,7 +196,8 @@ Common scopes: site name (`twitter`, `reddit`) or module name (`browser`, `pipel
194
196
  3. Run the checks that apply:
195
197
  ```bash
196
198
  npx tsc --noEmit # Type check
197
- npx vitest run src/ # Unit tests
199
+ npm test # Core unit tests
200
+ npm run test:adapter # Focused adapter tests (if you touched adapter logic)
198
201
  opencli validate # YAML validation (if applicable)
199
202
  ```
200
203
  4. Commit using conventional commit format
package/PRIVACY.md ADDED
@@ -0,0 +1,57 @@
1
+ # Privacy Policy — OpenCLI Browser Extension
2
+
3
+ **Last updated**: 2026-03-25
4
+
5
+ ## What the extension does
6
+
7
+ The OpenCLI Browser Extension is a bridge between the [OpenCLI](https://github.com/jackwener/opencli) command-line tool and your Chrome browser. It receives commands from a **locally running daemon** process via WebSocket (`localhost` only) and executes them in **isolated Chrome windows** that are separate from your normal browsing session.
8
+
9
+ ## Data collection
10
+
11
+ The extension does **NOT** collect, store, transmit, or sell any personal data. Specifically:
12
+
13
+ - **No analytics or telemetry** — no data is sent to any remote server.
14
+ - **No user tracking** — no cookies, identifiers, or fingerprints are created.
15
+ - **No external network requests** — all communication is strictly `localhost` (WebSocket to `ws://localhost:19825`).
16
+
17
+ ## Permissions explained
18
+
19
+ | Permission | Why it's needed |
20
+ |------------|----------------|
21
+ | `debugger` | Required to use Chrome DevTools Protocol (CDP) for browser automation — executing JavaScript, capturing page content, and taking screenshots in isolated windows. |
22
+ | `tabs` | Required to create and manage isolated automation windows and tabs, separate from the user's browsing session. |
23
+ | `cookies` | Required to read site-specific cookies (scoped by domain) so CLI commands can authenticate with websites the user is already logged into. Cookies are **never written, modified, or transmitted externally**. |
24
+ | `activeTab` | Required to identify the currently active tab for context-aware commands. |
25
+ | `alarms` | Required to maintain the WebSocket connection to the local daemon via periodic keepalive checks. |
26
+
27
+ ## Data flow
28
+
29
+ ```
30
+ User's terminal (opencli CLI)
31
+ ↓ (spawns)
32
+ Local daemon process (localhost:19825)
33
+ ↓ (WebSocket, localhost only)
34
+ Chrome Extension (this extension)
35
+ ↓ (Chrome APIs)
36
+ Isolated Chrome automation window
37
+ ```
38
+
39
+ All data stays on the user's machine. No data leaves `localhost`.
40
+
41
+ ## Cookie access
42
+
43
+ The extension reads cookies **only** when explicitly requested by a CLI command, and **only** for the specific domain the command targets. It cannot and does not dump all cookies. Cookie data is returned to the local daemon process and is never sent to any external server.
44
+
45
+ ## Third-party services
46
+
47
+ This extension does not integrate with, send data to, or receive data from any third-party service.
48
+
49
+ ## Open source
50
+
51
+ This extension is fully open source. You can audit the complete source code at:
52
+ https://github.com/jackwener/opencli/tree/main/extension
53
+
54
+ ## Contact
55
+
56
+ For privacy questions or concerns, please open an issue at:
57
+ https://github.com/jackwener/opencli/issues
package/README.md CHANGED
@@ -23,11 +23,31 @@ Turn ANY Electron application into a CLI tool! Recombine, script, and extend app
23
23
  - **CLI All Electron** — CLI-ify apps like Antigravity Ultra! Now AI can control itself natively using cc/openclaw!
24
24
  - **Account-safe** — Reuses Chrome's logged-in state; your credentials never leave the browser.
25
25
  - **AI Agent ready** — `explore` discovers APIs, `synthesize` generates adapters, `cascade` finds auth strategies.
26
- - **External CLI Hub** — Discover, auto-install, and passthrough commands to any external CLI (gh, obsidian, docker, kubectl, etc). Zero setup.
26
+ - **External CLI Hub** — Discover, auto-install, and passthrough commands to any external CLI (gh, obsidian, docker, etc). Zero setup.
27
27
  - **Self-healing setup** — `opencli doctor` diagnoses and auto-starts the daemon, extension, and live browser connectivity.
28
28
  - **Dynamic Loader** — Simply drop `.ts` or `.yaml` adapters into the `clis/` folder for auto-registration.
29
29
  - **Dual-Engine Architecture** — Supports both YAML declarative data pipelines and robust browser runtime TypeScript injections.
30
30
 
31
+ ## Why opencli?
32
+
33
+ There are many great browser automation tools. Here's when opencli is the right choice:
34
+
35
+ | Your need | Best tool | Why |
36
+ |-----------|-----------|-----|
37
+ | Scheduled data extraction from specific sites | **opencli** | Pre-built adapters, deterministic JSON, zero LLM cost |
38
+ | AI agent needs reliable site operations | **opencli** | Hundreds of commands, structured output, fast deterministic response |
39
+ | Explore an unknown website ad-hoc | Browser-Use, Stagehand | LLM-driven general browsing for one-off tasks |
40
+ | Large-scale web crawling | Crawl4AI, Scrapy | Purpose-built for throughput and scale |
41
+ | Control desktop Electron apps from terminal | **opencli** | CDP + AppleScript — the only CLI tool that does this |
42
+
43
+ **What makes opencli different:**
44
+
45
+ - **Zero LLM cost** — No tokens consumed at runtime. Run 10,000 times and pay nothing.
46
+ - **Deterministic** — Same command, same output schema, every time. Pipeable, scriptable, CI-friendly.
47
+ - **Broad coverage** — 50+ sites across global and Chinese platforms (Bilibili, Zhihu, Xiaohongshu, Reddit, HackerNews, and more), plus desktop Electron apps via CDP.
48
+
49
+ > For a detailed comparison with Browser-Use, Crawl4AI, Firecrawl, and others, see the [Comparison Guide](./docs/comparison.md).
50
+
31
51
  ## Prerequisites
32
52
 
33
53
  - **Node.js**: >= 20.0.0
@@ -110,7 +130,7 @@ Run `opencli list` for the live registry.
110
130
  | **notion** | `status` `search` `read` `new` `write` `sidebar` `favorites` `export` | Desktop |
111
131
  | **discord-app** | `status` `send` `read` `channels` `servers` `search` `members` | Desktop |
112
132
  | **v2ex** | `hot` `latest` `topic` `node` `user` `member` `replies` `nodes` `daily` `me` `notifications` | Public / Browser |
113
- | **xueqiu** | `feed` `hot-stock` `hot` `search` `stock` `watchlist` `earnings-date` | Browser |
133
+ | **xueqiu** | `feed` `hot-stock` `hot` `search` `stock` `watchlist` `earnings-date` `fund-holdings` `fund-snapshot` | Browser |
114
134
  | **antigravity** | `status` `send` `read` `new` `dump` `extract-code` `model` `watch` | Desktop |
115
135
  | **chatgpt** | `status` `new` `send` `read` `ask` | Desktop |
116
136
  | **xiaohongshu** | `search` `notifications` `feed` `user` `download` `publish` `creator-notes` `creator-note-detail` `creator-notes-summary` `creator-profile` `creator-stats` | Browser |
@@ -125,12 +145,15 @@ Run `opencli list` for the live registry.
125
145
  | **bloomberg** | `main` `markets` `economics` `industries` `tech` `politics` `businessweek` `opinions` `feeds` `news` | Public / Browser |
126
146
  | **ctrip** | `search` | Browser |
127
147
  | **devto** | `top` `tag` `user` | Public |
148
+ | **dictionary** | `search` `synonyms` `examples` | Public |
128
149
  | **arxiv** | `search` `paper` | Public |
129
150
  | **wikipedia** | `search` `summary` `random` `trending` | Public |
130
151
  | **hackernews** | `top` `new` `best` `ask` `show` `jobs` `search` `user` | Public |
131
- | **linkedin** | `search` | Browser |
152
+ | **jd** | `item` | Browser |
153
+ | **linkedin** | `search` `timeline` | Browser |
132
154
  | **reuters** | `search` | Browser |
133
155
  | **smzdm** | `search` | Browser |
156
+ | **web** | `read` | Browser |
134
157
  | **weibo** | `hot` `search` | Browser |
135
158
  | **yahoo-finance** | `quote` | Browser |
136
159
  | **sinafinance** | `news` | 🌐 Public |
@@ -153,6 +176,7 @@ Run `opencli list` for the live registry.
153
176
  | **medium** | `feed` `search` `user` | Browser |
154
177
  | **sinablog** | `hot` `search` `article` `user` | Browser |
155
178
  | **substack** | `feed` `search` `publication` | Browser |
179
+ | **pixiv** | `ranking` `search` `user` `illusts` `detail` `download` | Browser |
156
180
  | **tiktok** | `explore` `search` `profile` `user` `following` `follow` `unfollow` `like` `unlike` `comment` `save` `unsave` `live` `notifications` `friends` | Browser |
157
181
 
158
182
 
@@ -165,7 +189,6 @@ OpenCLI acts as a universal hub for your existing command-line tools. It provide
165
189
  | **gh** | GitHub CLI | `opencli gh pr list --limit 5` |
166
190
  | **obsidian** | Obsidian vault management | `opencli obsidian search query="AI"` |
167
191
  | **docker** | Docker command-line interface | `opencli docker ps` |
168
- | **kubectl** | Kubernetes command-line tool | `opencli kubectl get pods` |
169
192
  | **readwise** | Readwise & Reader CLI | `opencli readwise login` |
170
193
  | **gws** | Google Workspace CLI — Docs, Sheets, Drive, Gmail, Calendar | `opencli gws docs list` |
171
194
 
@@ -205,6 +228,7 @@ OpenCLI supports downloading images, videos, and articles from supported platfor
205
228
  | **xiaohongshu** | Images, Videos | Downloads all media from a note |
206
229
  | **bilibili** | Videos | Requires `yt-dlp` installed |
207
230
  | **twitter** | Images, Videos | Downloads from user media tab or single tweet |
231
+ | **pixiv** | Images | Downloads original-quality illustrations, supports multi-page works |
208
232
  | **zhihu** | Articles (Markdown) | Exports articles with optional image download |
209
233
  | **weixin** | Articles (Markdown) | Exports WeChat Official Account articles |
210
234
 
@@ -270,9 +294,12 @@ Extend OpenCLI with community-contributed adapters. Plugins use the same YAML/TS
270
294
  opencli plugin install github:user/opencli-plugin-my-tool # Install
271
295
  opencli plugin list # List installed
272
296
  opencli plugin update my-tool # Update to latest
297
+ opencli plugin update --all # Update all installed plugins
273
298
  opencli plugin uninstall my-tool # Remove
274
299
  ```
275
300
 
301
+ `opencli plugin list` also shows the tracked short commit hash when a plugin version is recorded in `~/.opencli/plugins.lock.json`.
302
+
276
303
  | Plugin | Type | Description |
277
304
  |--------|------|-------------|
278
305
  | [opencli-plugin-github-trending](https://github.com/ByteYue/opencli-plugin-github-trending) | YAML | GitHub Trending repositories |
package/README.zh-CN.md CHANGED
@@ -25,11 +25,31 @@ CLI all electron!现在支持把所有 electron 应用 CLI 化,从而组合
25
25
  - **CLI All Electron** — 支持把所有 electron 应用(如 Antigravity Ultra)CLI 化,让 AI 控制自己!
26
26
  - **多站点覆盖** — 覆盖 B站、知乎、小红书、Twitter、Reddit,以及多种桌面应用
27
27
  - **零风控** — 复用 Chrome 登录态,无需存储任何凭证
28
- - **外部 CLI 枢纽** — 统一发现、自动安装、透传执行 `gh`、`docker`、`kubectl` 等本地 CLI
28
+ - **外部 CLI 枢纽** — 统一发现、自动安装、透传执行 `gh`、`docker` 等本地 CLI
29
29
  - **自修复配置** — `opencli doctor` 自动启动 daemon,诊断扩展和浏览器连接状态
30
30
  - **AI 原生** — `explore` 自动发现 API,`synthesize` 生成适配器,`cascade` 探测认证策略
31
31
  - **动态加载引擎** — 声明式的 `.yaml` 或者底层定制的 `.ts` 适配器,放入 `clis/` 文件夹即可自动注册生效
32
32
 
33
+ ## 为什么选 opencli?
34
+
35
+ 浏览器自动化工具很多,opencli 适合什么场景?
36
+
37
+ | 你的需求 | 最佳工具 | 原因 |
38
+ |----------|----------|------|
39
+ | 定时从特定站点提取结构化数据 | **opencli** | 预定义适配器,确定性 JSON 输出,零 LLM 成本 |
40
+ | AI Agent 需要可靠的站点操作 | **opencli** | 数百条命令,结构化输出,快速确定性响应 |
41
+ | 临时探索未知网站 | Browser-Use、Stagehand | LLM 驱动的通用浏览,适合一次性任务 |
42
+ | 大规模网页爬取 | Crawl4AI、Scrapy | 专为吞吐量和规模设计 |
43
+ | 从终端控制桌面 Electron 应用 | **opencli** | CDP + AppleScript,目前唯一能做到这一点的 CLI 工具 |
44
+
45
+ **opencli 的核心差异:**
46
+
47
+ - **零 LLM 成本** — 运行时不消耗任何 token,跑一万次不花一分钱
48
+ - **确定性** — 同一命令永远返回同一结构,可管道化、可脚本化、CI 友好
49
+ - **覆盖广泛** — 50+ 站点,横跨全球与中国平台(B站、知乎、小红书、Reddit、HackerNews 等),并支持通过 CDP 控制桌面 Electron 应用
50
+
51
+ > 与 Browser-Use、Crawl4AI、Firecrawl 等工具的详细对比,请查看 [Comparison Guide](./docs/comparison.md)。
52
+
33
53
  ## 前置要求
34
54
 
35
55
  - **Node.js**: >= 20.0.0
@@ -112,7 +132,7 @@ npm install -g @jackwener/opencli@latest
112
132
  | **notion** | `status` `search` `read` `new` `write` `sidebar` `favorites` `export` | 桌面端 |
113
133
  | **discord-app** | `status` `send` `read` `channels` `servers` `search` `members` | 桌面端 |
114
134
  | **v2ex** | `hot` `latest` `topic` `node` `user` `member` `replies` `nodes` `daily` `me` `notifications` | 公开 / 浏览器 |
115
- | **xueqiu** | `feed` `hot-stock` `hot` `search` `stock` `watchlist` `earnings-date` | 浏览器 |
135
+ | **xueqiu** | `feed` `hot-stock` `hot` `search` `stock` `watchlist` `earnings-date` `fund-holdings` `fund-snapshot` | 浏览器 |
116
136
  | **antigravity** | `status` `send` `read` `new` `dump` `extract-code` `model` `watch` | 桌面端 |
117
137
  | **chatgpt** | `status` `new` `send` `read` `ask` | 桌面端 |
118
138
  | **xiaohongshu** | `search` `notifications` `feed` `user` `download` `publish` `creator-notes` `creator-note-detail` `creator-notes-summary` `creator-profile` `creator-stats` | 浏览器 |
@@ -127,12 +147,15 @@ npm install -g @jackwener/opencli@latest
127
147
  | **bloomberg** | `main` `markets` `economics` `industries` `tech` `politics` `businessweek` `opinions` `feeds` `news` | 公共 API / 浏览器 |
128
148
  | **ctrip** | `search` | 浏览器 |
129
149
  | **devto** | `top` `tag` `user` | 公开 |
150
+ | **dictionary** | `search` `synonyms` `examples` | 公开 |
130
151
  | **arxiv** | `search` `paper` | 公开 |
131
152
  | **wikipedia** | `search` `summary` `random` `trending` | 公开 |
132
153
  | **hackernews** | `top` `new` `best` `ask` `show` `jobs` `search` `user` | 公共 API |
133
- | **linkedin** | `search` | 浏览器 |
154
+ | **jd** | `item` | 浏览器 |
155
+ | **linkedin** | `search` `timeline` | 浏览器 |
134
156
  | **reuters** | `search` | 浏览器 |
135
157
  | **smzdm** | `search` | 浏览器 |
158
+ | **web** | `read` | 浏览器 |
136
159
  | **weibo** | `hot` `search` | 浏览器 |
137
160
  | **yahoo-finance** | `quote` | 浏览器 |
138
161
  | **sinafinance** | `news` | 🌐 公开 |
@@ -155,6 +178,7 @@ npm install -g @jackwener/opencli@latest
155
178
  | **medium** | `feed` `search` `user` | 浏览器 |
156
179
  | **sinablog** | `hot` `search` `article` `user` | 浏览器 |
157
180
  | **substack** | `feed` `search` `publication` | 浏览器 |
181
+ | **pixiv** | `ranking` `search` `user` `illusts` `detail` `download` | 浏览器 |
158
182
  | **tiktok** | `explore` `search` `profile` `user` `following` `follow` `unfollow` `like` `unlike` `comment` `save` `unsave` `live` `notifications` `friends` | 浏览器 |
159
183
 
160
184
 
@@ -167,7 +191,6 @@ OpenCLI 也可以作为你现有命令行工具的统一入口,负责发现、
167
191
  | **gh** | GitHub CLI | `opencli gh pr list --limit 5` |
168
192
  | **obsidian** | Obsidian 仓库管理 | `opencli obsidian search query="AI"` |
169
193
  | **docker** | Docker 命令行工具 | `opencli docker ps` |
170
- | **kubectl** | Kubernetes CLI | `opencli kubectl get pods` |
171
194
  | **readwise** | Readwise / Reader CLI | `opencli readwise login` |
172
195
  | **gws** | Google Workspace CLI — Docs, Sheets, Drive, Gmail, Calendar | `opencli gws docs list` |
173
196
 
@@ -207,6 +230,7 @@ OpenCLI 支持从各平台下载图片、视频和文章。
207
230
  | **小红书** | 图片、视频 | 下载笔记中的所有媒体文件 |
208
231
  | **B站** | 视频 | 需要安装 `yt-dlp` |
209
232
  | **Twitter/X** | 图片、视频 | 从用户媒体页或单条推文下载 |
233
+ | **Pixiv** | 图片 | 下载原始画质插画,支持多页作品 |
210
234
  | **知乎** | 文章(Markdown) | 导出文章,可选下载图片到本地 |
211
235
  | **微信公众号** | 文章(Markdown) | 导出微信公众号文章为 Markdown |
212
236
 
@@ -272,9 +296,12 @@ opencli bilibili hot -v # 详细模式:展示管线执行步骤调试
272
296
  opencli plugin install github:user/opencli-plugin-my-tool # 安装
273
297
  opencli plugin list # 查看已安装
274
298
  opencli plugin update my-tool # 更新到最新
299
+ opencli plugin update --all # 更新全部已安装插件
275
300
  opencli plugin uninstall my-tool # 卸载
276
301
  ```
277
302
 
303
+ 当 plugin 的版本被记录到 `~/.opencli/plugins.lock.json` 后,`opencli plugin list` 也会显示对应的短 commit hash。
304
+
278
305
  | 插件 | 类型 | 描述 |
279
306
  |------|------|------|
280
307
  | [opencli-plugin-github-trending](https://github.com/ByteYue/opencli-plugin-github-trending) | YAML | GitHub Trending 仓库 |