@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
@@ -0,0 +1,27 @@
1
+ # Dictionary
2
+
3
+ **Mode**: 🌐 Public · **Domain**: `api.dictionaryapi.dev`
4
+
5
+ Search the open dictionary to quickly fetch native definitions, part of speech contexts, and phonetic pronunciations directly in your IDE terminal.
6
+
7
+ ## Commands
8
+
9
+ | Command | Description |
10
+ |---------|-------------|
11
+ | `opencli dictionary search` | Fetch the exact definition of a word |
12
+ | `opencli dictionary synonyms` | Find related synonyms for a word |
13
+ | `opencli dictionary examples` | Read real-world sentence usage examples |
14
+
15
+ ## Usage Examples
16
+
17
+ ```bash
18
+ # Look up a complex term
19
+ opencli dictionary search serendipity
20
+
21
+ # Discover phonetics
22
+ opencli dictionary search ephemeral
23
+ ```
24
+
25
+ ## Prerequisites
26
+
27
+ - No browser required — utilizes the fast, open JSON definitions API.
@@ -0,0 +1,75 @@
1
+ # Douyin (抖音创作者中心)
2
+
3
+ **Mode**: 🔐 Browser · **Domain**: `creator.douyin.com`
4
+
5
+ ## Commands
6
+
7
+ | Command | Description |
8
+ |---------|-------------|
9
+ | `opencli douyin profile` | 获取账号信息 |
10
+ | `opencli douyin videos` | 获取作品列表 |
11
+ | `opencli douyin drafts` | 获取草稿列表 |
12
+ | `opencli douyin draft` | 上传视频并保存为草稿 |
13
+ | `opencli douyin publish` | 定时发布视频到抖音 |
14
+ | `opencli douyin update` | 更新视频信息 |
15
+ | `opencli douyin delete` | 删除作品 |
16
+ | `opencli douyin stats` | 查询作品数据分析 |
17
+ | `opencli douyin collections` | 获取合集列表 |
18
+ | `opencli douyin activities` | 获取官方活动列表 |
19
+ | `opencli douyin location` | 搜索发布可用的地理位置 |
20
+ | `opencli douyin hashtag search` | 按关键词搜索话题 |
21
+ | `opencli douyin hashtag suggest` | 基于封面 URI 推荐话题 |
22
+ | `opencli douyin hashtag hot` | 获取热点词 |
23
+
24
+ ## Usage Examples
25
+
26
+ ```bash
27
+ # 账号与作品
28
+ opencli douyin profile
29
+ opencli douyin videos --limit 10
30
+ opencli douyin videos --status scheduled
31
+ opencli douyin drafts
32
+
33
+ # 发布前辅助信息
34
+ opencli douyin collections
35
+ opencli douyin activities
36
+ opencli douyin location "东京塔"
37
+ opencli douyin hashtag search "春游"
38
+ opencli douyin hashtag hot --limit 10
39
+
40
+ # 保存草稿
41
+ opencli douyin draft ./video.mp4 \
42
+ --title "春游 vlog" \
43
+ --caption "#春游 先存草稿"
44
+
45
+ # 定时发布
46
+ opencli douyin publish ./video.mp4 \
47
+ --title "春游 vlog" \
48
+ --caption "#春游 今天去看樱花" \
49
+ --schedule "2026-04-08T12:00:00+09:00"
50
+
51
+ # 也支持 Unix 秒字符串
52
+ opencli douyin publish ./video.mp4 \
53
+ --title "春游 vlog" \
54
+ --schedule 1775617200
55
+
56
+ # 更新与删除
57
+ opencli douyin update 1234567890 --caption "更新后的文案"
58
+ opencli douyin update 1234567890 --reschedule "2026-04-09T20:00:00+09:00"
59
+ opencli douyin delete 1234567890
60
+
61
+ # JSON 输出
62
+ opencli douyin profile -f json
63
+ ```
64
+
65
+ ## Prerequisites
66
+
67
+ - Chrome running and **logged into** `creator.douyin.com`
68
+ - The logged-in account must have access to Douyin Creator Center publishing features
69
+ - [Browser Bridge extension](/guide/browser-bridge) installed
70
+
71
+ ## Notes
72
+
73
+ - `publish` requires `--schedule` to be at least 2 hours later and no more than 14 days later
74
+ - `draft` and `publish` upload the video through Douyin/ByteDance browser-authenticated APIs, so cookies in the active browser session must be valid
75
+ - `hashtag suggest` expects a valid `cover`/`cover_uri` value produced during the publish pipeline; for normal manual use, `hashtag search` and `hashtag hot` are usually more convenient
@@ -0,0 +1,27 @@
1
+ # JD.com
2
+
3
+ **Mode**: 🔐 Browser · **Domain**: `item.jd.com`
4
+
5
+ ## Commands
6
+
7
+ | Command | Description |
8
+ |---------|-------------|
9
+ | `opencli jd item <sku>` | Fetch product details (price, images, specs) |
10
+
11
+ ## Usage Examples
12
+
13
+ ```bash
14
+ # Get product details by SKU
15
+ opencli jd item 100291143898
16
+
17
+ # Limit detail images
18
+ opencli jd item 100291143898 --images 5
19
+
20
+ # JSON output
21
+ opencli jd item 100291143898 -f json
22
+ ```
23
+
24
+ ## Prerequisites
25
+
26
+ - Chrome running and **logged into** jd.com
27
+ - [Browser Bridge extension](/guide/browser-bridge) installed
@@ -7,6 +7,7 @@
7
7
  | Command | Description |
8
8
  |---------|-------------|
9
9
  | `opencli linkedin search` | |
10
+ | `opencli linkedin timeline` | Read posts from your LinkedIn home feed |
10
11
 
11
12
  ## Usage Examples
12
13
 
@@ -14,9 +15,14 @@
14
15
  # Quick start
15
16
  opencli linkedin search --limit 5
16
17
 
18
+ # Read your home timeline
19
+ opencli linkedin timeline --limit 5
20
+
17
21
  # JSON output
18
22
  opencli linkedin search -f json
19
23
 
24
+ opencli linkedin timeline -f json
25
+
20
26
  # Verbose mode
21
27
  opencli linkedin search -v
22
28
  ```
@@ -0,0 +1,92 @@
1
+ # Pixiv
2
+
3
+ **Mode**: 🔐 Browser · **Domain**: `www.pixiv.net`
4
+
5
+ ## Commands
6
+
7
+ | Command | Description |
8
+ |---------|-------------|
9
+ | `opencli pixiv ranking` | Daily/weekly/monthly illustration rankings |
10
+ | `opencli pixiv search <query>` | Search illustrations by keyword or tag |
11
+ | `opencli pixiv user <uid>` | View artist profile info |
12
+ | `opencli pixiv illusts <user-id>` | List illustrations by artist |
13
+ | `opencli pixiv detail <id>` | View illustration details |
14
+ | `opencli pixiv download <illust-id>` | Download original-quality images |
15
+
16
+ ## Usage Examples
17
+
18
+ ### Ranking
19
+
20
+ ```bash
21
+ # Daily rankings (default)
22
+ opencli pixiv ranking --limit 10
23
+
24
+ # Weekly / monthly rankings
25
+ opencli pixiv ranking --mode weekly
26
+ opencli pixiv ranking --mode monthly
27
+
28
+ # R18 rankings
29
+ opencli pixiv ranking --mode daily_r18
30
+ opencli pixiv ranking --mode weekly_r18
31
+
32
+ # Other modes: rookie, original, male, female
33
+ opencli pixiv ranking --mode rookie
34
+ ```
35
+
36
+ ### Search
37
+
38
+ ```bash
39
+ # Search by keyword or tag
40
+ opencli pixiv search "初音ミク" --limit 20
41
+
42
+ # Filter by content rating
43
+ opencli pixiv search "風景" --mode safe # Safe-for-work only
44
+ opencli pixiv search "風景" --mode r18 # R18 only
45
+ opencli pixiv search "風景" --mode all # All (default)
46
+
47
+ # Sort by popularity
48
+ opencli pixiv search "VOCALOID" --order popular_d
49
+
50
+ # All sort options: date_d (newest), date (oldest), popular_d, popular_male_d, popular_female_d
51
+
52
+ # Pagination
53
+ opencli pixiv search "オリジナル" --page 2 --limit 30
54
+ ```
55
+
56
+ ### User & Illustrations
57
+
58
+ ```bash
59
+ # View artist profile
60
+ opencli pixiv user 11
61
+
62
+ # List artist's illustrations (newest first)
63
+ opencli pixiv illusts 11 --limit 10
64
+
65
+ # View illustration details (tags, stats, type)
66
+ opencli pixiv detail 12345678
67
+ ```
68
+
69
+ ### Download
70
+
71
+ ```bash
72
+ # Download all images from an illustration
73
+ opencli pixiv download 12345678
74
+
75
+ # Download to a custom directory
76
+ opencli pixiv download 12345678 --output ./my-images
77
+ ```
78
+
79
+ ### Output Formats
80
+
81
+ ```bash
82
+ # JSON output
83
+ opencli pixiv ranking -f json
84
+
85
+ # Verbose mode
86
+ opencli pixiv search "test" -v
87
+ ```
88
+
89
+ ## Prerequisites
90
+
91
+ - Chrome running and **logged into** pixiv.net
92
+ - [Browser Bridge extension](/guide/browser-bridge) installed
@@ -37,6 +37,12 @@
37
37
  # Quick start
38
38
  opencli twitter trending --limit 5
39
39
 
40
+ # Search top tweets (default)
41
+ opencli twitter search "react 19"
42
+
43
+ # Search latest/live tweets
44
+ opencli twitter search "react 19" --filter live
45
+
40
46
  # JSON output
41
47
  opencli twitter trending -f json
42
48
 
@@ -0,0 +1,30 @@
1
+ # Web
2
+
3
+ **Mode**: 🔐 Browser · **Domain**: any URL
4
+
5
+ ## Commands
6
+
7
+ | Command | Description |
8
+ |---------|-------------|
9
+ | `opencli web read <url>` | Fetch any web page and export as Markdown |
10
+
11
+ ## Usage Examples
12
+
13
+ ```bash
14
+ # Read a web page and save as Markdown
15
+ opencli web read https://example.com/article
16
+
17
+ # Custom output directory
18
+ opencli web read https://example.com/article --output ./my-articles
19
+
20
+ # Skip image download
21
+ opencli web read https://example.com/article --download-images false
22
+
23
+ # JSON output
24
+ opencli web read https://example.com/article -f json
25
+ ```
26
+
27
+ ## Prerequisites
28
+
29
+ - Chrome running
30
+ - [Browser Bridge extension](/guide/browser-bridge) installed
@@ -1,18 +1,20 @@
1
1
  # Xueqiu (雪球)
2
2
 
3
- **Mode**: 🔐 Browser · **Domain**: `xueqiu.com`
3
+ **Mode**: 🔐 Browser · **Domain**: `xueqiu.com` / `danjuanfunds.com`
4
4
 
5
5
  ## Commands
6
6
 
7
7
  | Command | Description |
8
8
  |---------|-------------|
9
- | `opencli xueqiu feed` | |
10
- | `opencli xueqiu earnings-date` | |
11
- | `opencli xueqiu hot-stock` | |
12
- | `opencli xueqiu hot` | |
13
- | `opencli xueqiu search` | |
14
- | `opencli xueqiu stock` | |
15
- | `opencli xueqiu watchlist` | |
9
+ | `opencli xueqiu feed` | 获取雪球首页时间线 |
10
+ | `opencli xueqiu earnings-date` | 获取股票预计财报发布日期 |
11
+ | `opencli xueqiu hot-stock` | 获取雪球热门股票榜 |
12
+ | `opencli xueqiu hot` | 获取雪球热门动态 |
13
+ | `opencli xueqiu search` | 搜索雪球股票(代码或名称) |
14
+ | `opencli xueqiu stock` | 获取雪球股票实时行情 |
15
+ | `opencli xueqiu watchlist` | 获取雪球自选股列表 |
16
+ | `opencli xueqiu fund-holdings` | 获取蛋卷基金持仓明细(可用 `--account` 按子账户过滤) |
17
+ | `opencli xueqiu fund-snapshot` | 获取蛋卷基金快照(总资产、子账户、持仓,推荐 `-f json`) |
16
18
 
17
19
  ## Usage Examples
18
20
 
@@ -29,6 +31,15 @@ opencli xueqiu stock SH600519
29
31
  # Upcoming earnings dates
30
32
  opencli xueqiu earnings-date SH600519 --next
31
33
 
34
+ # Danjuan all holdings
35
+ opencli xueqiu fund-holdings
36
+
37
+ # Filter one Danjuan sub-account
38
+ opencli xueqiu fund-holdings --account 默认账户
39
+
40
+ # Full Danjuan snapshot as JSON
41
+ opencli xueqiu fund-snapshot -f json
42
+
32
43
  # JSON output
33
44
  opencli xueqiu feed -f json
34
45
 
@@ -38,5 +49,12 @@ opencli xueqiu feed -v
38
49
 
39
50
  ## Prerequisites
40
51
 
41
- - Chrome running and **logged into** xueqiu.com
52
+ - Chrome running and **logged into** `xueqiu.com`
53
+ - For fund commands, Chrome must also be logged into `danjuanfunds.com` and able to open `https://danjuanfunds.com/my-money`
42
54
  - [Browser Bridge extension](/guide/browser-bridge) installed
55
+
56
+ ## Notes
57
+
58
+ - `fund-holdings` exposes both market value and share fields (`volume`, `usableRemainShare`)
59
+ - `fund-snapshot -f json` is the easiest way to persist a full account snapshot for later analysis or diffing
60
+ - If the commands return empty data, first confirm the logged-in browser can directly see the Danjuan asset page
@@ -11,12 +11,12 @@ Run `opencli list` for the live registry.
11
11
  | **[bilibili](/adapters/browser/bilibili)** | `hot` `search` `me` `favorite` `history` `feed` `subtitle` `dynamic` `ranking` `following` `user-videos` `download` | 🔐 Browser |
12
12
  | **[zhihu](/adapters/browser/zhihu)** | `hot` `search` `question` `download` | 🔐 Browser |
13
13
  | **[xiaohongshu](/adapters/browser/xiaohongshu)** | `search` `notifications` `feed` `user` `download` `publish` `creator-notes` `creator-note-detail` `creator-notes-summary` `creator-profile` `creator-stats` | 🔐 Browser |
14
- | **[xueqiu](/adapters/browser/xueqiu)** | `feed` `hot-stock` `hot` `search` `stock` `watchlist` `earnings-date` | 🔐 Browser |
14
+ | **[xueqiu](/adapters/browser/xueqiu)** | `feed` `hot-stock` `hot` `search` `stock` `watchlist` `earnings-date` `fund-holdings` `fund-snapshot` | 🔐 Browser |
15
15
  | **[youtube](/adapters/browser/youtube)** | `search` `video` `transcript` | 🔐 Browser |
16
16
  | **[v2ex](/adapters/browser/v2ex)** | `hot` `latest` `topic` `node` `user` `member` `replies` `nodes` `daily` `me` `notifications` | 🌐 / 🔐 |
17
17
  | **[bloomberg](/adapters/browser/bloomberg)** | `main` `markets` `economics` `industries` `tech` `politics` `businessweek` `opinions` `feeds` `news` | 🌐 / 🔐 |
18
18
  | **[weibo](/adapters/browser/weibo)** | `hot` `search` | 🔐 Browser |
19
- | **[linkedin](/adapters/browser/linkedin)** | `search` | 🔐 Browser |
19
+ | **[linkedin](/adapters/browser/linkedin)** | `search` `timeline` | 🔐 Browser |
20
20
  | **[coupang](/adapters/browser/coupang)** | `search` `add-to-cart` | 🔐 Browser |
21
21
  | **[boss](/adapters/browser/boss)** | `search` `detail` `recommend` `joblist` `greet` `batchgreet` `send` `chatlist` `chatmsg` `invite` `mark` `exchange` `resume` `stats` | 🔐 Browser |
22
22
  | **[ctrip](/adapters/browser/ctrip)** | `search` | 🔐 Browser |
@@ -36,7 +36,12 @@ Run `opencli list` for the live registry.
36
36
  | **[medium](/adapters/browser/medium)** | `feed` `search` `user` | 🔐 Browser |
37
37
  | **[sinablog](/adapters/browser/sinablog)** | `hot` `search` `article` `user` | 🔐 Browser |
38
38
  | **[substack](/adapters/browser/substack)** | `feed` `search` `publication` | 🔐 Browser |
39
+ | **[pixiv](/adapters/browser/pixiv)** | `ranking` `search` `user` `illusts` `detail` `download` | 🔐 Browser |
39
40
  | **[tiktok](/adapters/browser/tiktok)** | `explore` `search` `profile` `user` `following` `follow` `unfollow` `like` `unlike` `comment` `save` `unsave` `live` `notifications` `friends` | 🔐 Browser |
41
+ | **[google](/adapters/browser/google)** | `news` `search` `suggest` `trends` | 🌐 / 🔐 |
42
+ | **[jd](/adapters/browser/jd)** | `item` | 🔐 Browser |
43
+ | **[web](/adapters/browser/web)** | `read` | 🔐 Browser |
44
+ | **[weixin](/adapters/browser/weixin)** | `download` | 🔐 Browser |
40
45
 
41
46
  ## Public API Adapters
42
47
 
@@ -45,6 +50,7 @@ Run `opencli list` for the live registry.
45
50
  | **[hackernews](/adapters/browser/hackernews)** | `top` `new` `best` `ask` `show` `jobs` `search` `user` | 🌐 Public |
46
51
  | **[bbc](/adapters/browser/bbc)** | `news` | 🌐 Public |
47
52
  | **[devto](/adapters/browser/devto)** | `top` `tag` `user` | 🌐 Public |
53
+ | **[dictionary](/adapters/browser/dictionary)** | `search` `synonyms` `examples` | 🌐 Public |
48
54
  | **[apple-podcasts](/adapters/browser/apple-podcasts)** | `search` `episodes` `top` | 🌐 Public |
49
55
  | **[xiaoyuzhou](/adapters/browser/xiaoyuzhou)** | `podcast` `podcast-episodes` `episode` | 🌐 Public |
50
56
  | **[yahoo-finance](/adapters/browser/yahoo-finance)** | `quote` | 🌐 Public |
@@ -55,6 +61,7 @@ Run `opencli list` for the live registry.
55
61
  | **[stackoverflow](/adapters/browser/stackoverflow)** | `hot` `search` `bounties` `unanswered` | 🌐 Public |
56
62
  | **[wikipedia](/adapters/browser/wikipedia)** | `search` `summary` `random` `trending` | 🌐 Public |
57
63
  | **[lobsters](/adapters/browser/lobsters)** | `hot` `newest` `active` `tag` | 🌐 Public |
64
+ | **[steam](/adapters/browser/steam)** | `top-sellers` | 🌐 Public |
58
65
 
59
66
  ## Desktop Adapters
60
67
 
@@ -0,0 +1,125 @@
1
+ # Comparison Guide
2
+
3
+ OpenCLI occupies a specific niche in the browser automation ecosystem. This guide honestly evaluates where opencli excels, where it's a viable option, and where other tools are a better fit.
4
+
5
+ ## At a Glance
6
+
7
+ | Tool | Approach | Best for |
8
+ |------|----------|----------|
9
+ | **opencli** | Pre-built adapters (YAML/TS) | Deterministic site commands, broad platform coverage, desktop apps |
10
+ | **Browser-Use** | LLM-driven browser control | General-purpose AI browser automation |
11
+ | **Crawl4AI** | Async web crawler | Large-scale data crawling |
12
+ | **Firecrawl** | Scraping API / self-hosted | Clean markdown extraction, managed or self-hosted infrastructure |
13
+ | **agent-browser** | Browser primitive CLI | Token-efficient AI agent browsing |
14
+ | **Stagehand** | AI browser framework | Developer-friendly browser automation |
15
+ | **Skyvern** | Visual AI automation | Cross-site generalized workflows |
16
+
17
+ ## Scenario Comparison
18
+
19
+ ### 1. Scheduled Batch Data Extraction
20
+
21
+ > "I want to pull trending posts from Bilibili/Reddit/HackerNews every hour into my pipeline."
22
+
23
+ | Tool | Fit | Notes |
24
+ |------|-----|-------|
25
+ | **opencli** | Best | One command, structured JSON output, zero runtime cost. Runs in cron/CI without tokens or API keys. |
26
+ | Crawl4AI | Good | Strong for large-scale crawling, but requires writing extraction logic per site. |
27
+ | Firecrawl | Viable | Managed service with clean output, but costs scale with volume. |
28
+ | Browser-Use / Stagehand | Poor | LLM inference on every run is slow, expensive, and non-deterministic for repeated tasks. |
29
+
30
+ **Why opencli wins here:** A command like `opencli bilibili hot -f json` returns the same structured schema every time, costs nothing to run, and finishes in seconds. For recurring data extraction from known sites, pre-built adapters beat LLM-driven approaches on cost, speed, and reliability.
31
+
32
+ ### 2. AI Agent Site Operations
33
+
34
+ > "My AI agent needs to search Twitter, read Reddit threads, or post to Xiaohongshu."
35
+
36
+ | Tool | Fit | Notes |
37
+ |------|-----|-------|
38
+ | **opencli** | Best | Structured JSON output, fast deterministic execution, hundreds of commands ready to use. |
39
+ | agent-browser | Good | Token-efficient browser primitives, but requires LLM reasoning for every step. |
40
+ | Browser-Use | Viable | General-purpose, but each operation costs tokens and takes 10-60s. |
41
+ | Stagehand | Viable | Good DX, but same LLM-per-action cost model. |
42
+
43
+ **Why opencli wins here:** When your agent needs `twitter search "AI news" -f json`, a deterministic command that returns in seconds is strictly better than an LLM clicking through a webpage. The agent saves tokens for reasoning, not navigation.
44
+
45
+ ### 3. Authenticated Operations (Login-Required Sites)
46
+
47
+ > "I need to access my bookmarks, post content, or interact with sites that require login."
48
+
49
+ | Tool | Fit | Notes |
50
+ |------|-----|-------|
51
+ | **opencli** | Best | Reuses your Chrome login session via Browser Bridge. No credentials stored or transmitted. |
52
+ | Browser-Use | Viable | Can use browser profiles, but credential management is manual. |
53
+ | Firecrawl | Poor | Cloud service cannot access your authenticated sessions. |
54
+ | Crawl4AI | Poor | Requires manual cookie/session injection. |
55
+
56
+ **Why opencli wins here:** The Browser Bridge extension reuses your existing Chrome login state in real-time. You log in once in Chrome, and opencli commands work immediately. No OAuth setup, no API keys, no credential files.
57
+
58
+ ### 4. General Web Browsing & Exploration
59
+
60
+ > "I need to explore an unknown website, fill forms, or navigate complex multi-step flows."
61
+
62
+ | Tool | Fit | Notes |
63
+ |------|-----|-------|
64
+ | Browser-Use | Best | LLM-driven, handles arbitrary websites and flows. |
65
+ | Stagehand | Best | Clean API for `act()`, `extract()`, `observe()` on any page. |
66
+ | agent-browser | Good | Token-efficient primitives for AI agents. |
67
+ | Skyvern | Good | Visual AI that generalizes across sites. |
68
+ | **opencli** | Poor | Only works with sites that have pre-built adapters. Cannot handle arbitrary websites. |
69
+
70
+ **opencli is not the right tool here.** If you need to explore unknown websites or handle one-off tasks on sites without adapters, use an LLM-driven browser tool. opencli trades generality for determinism and cost.
71
+
72
+ ### 5. Desktop App Control
73
+
74
+ > "I want to script Cursor, ChatGPT, Notion, or other Electron apps from the terminal."
75
+
76
+ | Tool | Fit | Notes |
77
+ |------|-----|-------|
78
+ | **opencli** | Best | 8 desktop adapters via CDP + AppleScript. The only CLI tool with this capability. |
79
+ | All others | N/A | Browser automation tools cannot control desktop applications. |
80
+
81
+ **This is unique to opencli.** No other tool in this comparison can send a prompt to ChatGPT desktop, extract code from Cursor, or write to Notion pages via CLI.
82
+
83
+ ## Key Trade-offs
84
+
85
+ ### opencli's Strengths
86
+
87
+ - **Zero LLM cost** — No tokens consumed at runtime. Run 10,000 times for free.
88
+ - **Deterministic output** — Same command always returns the same schema. Pipeable, scriptable, CI-friendly.
89
+ - **Speed** — Adapter commands return in seconds, not minutes.
90
+ - **Broad platform coverage** — 50+ sites spanning global platforms (Reddit, HackerNews, Twitter, YouTube) and Chinese platforms (Bilibili, Zhihu, Xiaohongshu, Douban, Weibo) with adapters that understand local anti-bot patterns.
91
+ - **Desktop app control** — CDP adapters for Cursor, Codex, Notion, ChatGPT, Discord, and more.
92
+ - **Easy to extend** — Drop a `.yaml` or `.ts` adapter into the `clis/` folder for auto-registration. Contributing a new site adapter is straightforward.
93
+
94
+ ### opencli's Limitations
95
+
96
+ - **Coverage requires adapters** — opencli only works with sites that have pre-built adapters. Adding a new site means writing a YAML or TypeScript adapter.
97
+ - **Adapter maintenance** — When a website updates its DOM or API, the corresponding adapter may need updating. The community maintains these, but breakage is possible.
98
+ - **Not general-purpose** — Cannot handle arbitrary websites. For unknown sites, pair opencli with a general browser tool as a fallback.
99
+
100
+ ## Complementary Usage
101
+
102
+ opencli works best alongside general-purpose browser tools, not as a replacement:
103
+
104
+ ```
105
+ Has adapter? ──yes──▶ opencli (fast, free, deterministic)
106
+
107
+ no
108
+
109
+
110
+ One-off task? ──yes──▶ Browser-Use / Stagehand (LLM-driven)
111
+
112
+ no
113
+
114
+
115
+ Recurring? ──yes──▶ Write an opencli adapter, then use opencli
116
+ ```
117
+
118
+ ## Further Reading
119
+
120
+ - [Architecture Overview](./developer/architecture.md)
121
+ - [Writing a YAML Adapter](./developer/yaml-adapter.md)
122
+ - [Writing a TypeScript Adapter](./developer/ts-adapter.md)
123
+ - [Testing Guide](./developer/testing.md)
124
+ - [AI Workflow](./developer/ai-workflow.md)
125
+ - [Contributing Guide](./developer/contributing.md)
@@ -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
@@ -27,6 +28,12 @@ npm link
27
28
 
28
29
  This is the most common type of contribution. Start with YAML when possible, and use TypeScript only when you need browser-side logic or multi-step flows.
29
30
 
31
+ Before you start:
32
+
33
+ - Prefer positional args for the command's primary subject (`search <query>`, `topic <id>`, `download <url>`). Reserve named flags for optional modifiers such as `--limit`, `--sort`, `--lang`, and `--output`.
34
+ - Normalize expected adapter failures to `CliError` subclasses instead of raw `Error` whenever possible. Prefer `AuthRequiredError`, `EmptyResultError`, `CommandExecutionError`, `TimeoutError`, and `ArgumentError` so the top-level CLI can render better messages and hints.
35
+ - If you add a new adapter or make a command newly discoverable, update the matching doc page and the user-facing indexes that expose it.
36
+
30
37
  ### YAML Adapter (Recommended for data-fetching commands)
31
38
 
32
39
  Create a file like `src/clis/<site>/<command>.yaml`:
@@ -70,6 +77,7 @@ Create a file like `src/clis/<site>/<command>.ts`:
70
77
 
71
78
  ```typescript
72
79
  import { cli, Strategy } from '../../registry.js';
80
+ import { CommandExecutionError, EmptyResultError } from '../../errors.js';
73
81
 
74
82
  cli({
75
83
  site: 'mysite',
@@ -86,6 +94,8 @@ cli({
86
94
  func: async (page, kwargs) => {
87
95
  const { query, limit = 10 } = kwargs;
88
96
  // ... browser automation logic
97
+ if (!Array.isArray(data)) throw new CommandExecutionError('MySite returned an unexpected response');
98
+ if (!data.length) throw new EmptyResultError('mysite search', 'Try a different keyword');
89
99
  return data.slice(0, Number(limit)).map((item: any) => ({
90
100
  title: item.title,
91
101
  url: item.url,
@@ -109,6 +119,7 @@ opencli <site> <command> -v # Verbose mode for debugging
109
119
  - **ES Modules** — use `.js` extensions in imports (TypeScript output).
110
120
  - **Naming**: `kebab-case` for files, `camelCase` for variables/functions, `PascalCase` for types/classes.
111
121
  - **No default exports** — use named exports.
122
+ - **Errors** — throw `CliError` subclasses for expected adapter failures; avoid raw `Error` for normal adapter control flow.
112
123
 
113
124
  ## Commit Convention
114
125
 
@@ -129,8 +140,16 @@ chore: bump vitest to v4
129
140
  3. Run the checks:
130
141
  ```bash
131
142
  npx tsc --noEmit # Type check
132
- npx vitest run src/ # Unit tests
143
+ npm test # Core unit tests
144
+ npm run test:adapter # Focused adapter tests (if adapter logic changed)
133
145
  opencli validate # YAML validation (if applicable)
134
146
  ```
135
147
  4. Commit using conventional commit format
136
148
  5. Push and open a PR
149
+
150
+ If your PR adds a new adapter or changes user-facing commands, also verify:
151
+
152
+ - Adapter docs exist under `docs/adapters/`
153
+ - `docs/adapters/index.md` is updated for new adapters
154
+ - VitePress sidebar includes the new doc page
155
+ - `README.md` / `README.zh-CN.md` stay aligned when command discoverability changes
@@ -30,12 +30,14 @@ tests/
30
30
  ├── smoke/
31
31
  │ └── api-health.test.ts # 外部 API、adapter 定义、命令注册健康检查
32
32
  src/
33
- └── **/*.test.ts # 单元测试(当前 31 个文件)
33
+ ├── **/*.test.ts # 核心单元测试(默认 `unit` project)
34
+ └── clis/{zhihu,twitter,reddit,bilibili}/**/*.test.ts # 聚焦 adapter tests
34
35
  ```
35
36
 
36
37
  | 层 | 位置 | 当前文件数 | 运行方式 | 用途 |
37
38
  |---|---|---:|---|---|
38
- | 单元测试 | `src/**/*.test.ts` | 31 | `npx vitest run src/` | 内部模块、pipeline、adapter 工具函数 |
39
+ | 单元测试 | `src/**/*.test.ts`(排除 `src/clis/**`) | - | `npm test` | 内部模块、pipeline、runtime |
40
+ | Adapter 测试 | `src/clis/{zhihu,twitter,reddit,bilibili}/**/*.test.ts` | - | `npm run test:adapter` | 保留 4 个重点站点的 adapter 覆盖 |
39
41
  | E2E 测试 | `tests/e2e/*.test.ts` | 5 | `npx vitest run tests/e2e/` | 真实 CLI 命令执行 |
40
42
  | 烟雾测试 | `tests/smoke/*.test.ts` | 1 | `npx vitest run tests/smoke/` | 外部 API 与注册完整性 |
41
43
 
@@ -43,13 +45,13 @@ src/
43
45
 
44
46
  ## 当前覆盖范围
45
47
 
46
- ### 单元测试(31 个文件)
48
+ ### 单元测试与 Adapter 测试
47
49
 
48
50
  | 领域 | 文件 |
49
51
  |---|---|
50
52
  | 核心运行时与输出 | `src/browser.test.ts`, `src/browser/dom-snapshot.test.ts`, `src/build-manifest.test.ts`, `src/capabilityRouting.test.ts`, `src/doctor.test.ts`, `src/engine.test.ts`, `src/interceptor.test.ts`, `src/output.test.ts`, `src/plugin.test.ts`, `src/registry.test.ts`, `src/snapshotFormatter.test.ts` |
51
53
  | pipeline 与下载 | `src/download/index.test.ts`, `src/pipeline/executor.test.ts`, `src/pipeline/template.test.ts`, `src/pipeline/transform.test.ts` |
52
- | 站点 / adapter 逻辑 | `src/clis/apple-podcasts/commands.test.ts`, `src/clis/apple-podcasts/utils.test.ts`, `src/clis/bloomberg/utils.test.ts`, `src/clis/chaoxing/utils.test.ts`, `src/clis/coupang/utils.test.ts`, `src/clis/google/utils.test.ts`, `src/clis/grok/ask.test.ts`, `src/clis/twitter/timeline.test.ts`, `src/clis/weread/utils.test.ts`, `src/clis/xiaohongshu/creator-note-detail.test.ts`, `src/clis/xiaohongshu/creator-notes-summary.test.ts`, `src/clis/xiaohongshu/creator-notes.test.ts`, `src/clis/xiaohongshu/user-helpers.test.ts`, `src/clis/xiaoyuzhou/utils.test.ts`, `src/clis/youtube/transcript-group.test.ts`, `src/clis/zhihu/download.test.ts` |
54
+ | 聚焦 adapter 逻辑 | `src/clis/zhihu/download.test.ts`, `src/clis/twitter/timeline.test.ts`, `src/clis/reddit/read.test.ts`, `src/clis/bilibili/dynamic.test.ts` |
53
55
 
54
56
  这些测试覆盖的重点包括:
55
57
 
@@ -99,8 +101,11 @@ npm run build # 编译(E2E / smoke 测试需要 dist/main.js)
99
101
  ### 运行命令
100
102
 
101
103
  ```bash
102
- # 全部单元测试
103
- npx vitest run src/
104
+ # 默认核心单元测试(不含大多数 adapter tests)
105
+ npm test
106
+
107
+ # 聚焦 adapter tests(只保留 4 个重点站点)
108
+ npm run test:adapter
104
109
 
105
110
  # 全部 E2E 测试(会真实调用外部 API / 浏览器)
106
111
  npx vitest run tests/e2e/
@@ -192,7 +197,8 @@ it('producthunt me fails gracefully without login', async () => {
192
197
  | Job | 触发条件 | 内容 |
193
198
  |---|---|---|
194
199
  | `build` | push/PR 到 `main`,`dev` | `tsc --noEmit` + `npm run build` |
195
- | `unit-test` | push/PR 到 `main`,`dev` | Node `20` 与 `22` 双版本运行 `src/` 单元测试,按 `2` shard 并行 |
200
+ | `unit-test` | push/PR 到 `main`,`dev` | Node `20` 与 `22` 双版本运行核心 `unit` tests,按 `2` shard 并行 |
201
+ | `adapter-test` | push/PR 到 `main`,`dev` | Node `22` 运行聚焦的 `zhihu/twitter/reddit/bilibili` adapter tests |
196
202
  | `smoke-test` | `schedule` 或 `workflow_dispatch` | 安装真实 Chrome,`xvfb-run` 执行 `tests/smoke/` |
197
203
 
198
204
  ### `e2e-headed.yml`
@@ -214,7 +220,7 @@ strategy:
214
220
  node-version: ['20', '22']
215
221
  shard: [1, 2]
216
222
  steps:
217
- - run: npx vitest run src/ --reporter=verbose --shard=${{ matrix.shard }}/2
223
+ - run: npm test -- --reporter=verbose --shard=${{ matrix.shard }}/2
218
224
  ```
219
225
  :::
220
226