@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,4 +1,27 @@
1
1
  [
2
+ {
3
+ "site": "_shared",
4
+ "name": "desktop-commands",
5
+ "description": "Capture a snapshot of the current ${label} window (DOM + Accessibility tree)",
6
+ "strategy": "ui",
7
+ "browser": true,
8
+ "args": [
9
+ {
10
+ "name": "output",
11
+ "type": "str",
12
+ "default": "/tmp/${site",
13
+ "required": false,
14
+ "help": "Output file path (default: /tmp/${site}-snapshot.txt)"
15
+ }
16
+ ],
17
+ "type": "ts",
18
+ "modulePath": "_shared/desktop-commands.js",
19
+ "domain": "localhost",
20
+ "columns": [
21
+ "Status",
22
+ "File"
23
+ ]
24
+ },
2
25
  {
3
26
  "site": "antigravity",
4
27
  "name": "dump",
@@ -196,7 +219,8 @@
196
219
  "title",
197
220
  "author",
198
221
  "episodes",
199
- "genre"
222
+ "genre",
223
+ "url"
200
224
  ]
201
225
  },
202
226
  {
@@ -284,7 +308,8 @@
284
308
  "id",
285
309
  "title",
286
310
  "authors",
287
- "published"
311
+ "published",
312
+ "url"
288
313
  ]
289
314
  },
290
315
  {
@@ -1952,20 +1977,6 @@
1952
1977
  "Model"
1953
1978
  ]
1954
1979
  },
1955
- {
1956
- "site": "chatwise",
1957
- "name": "new",
1958
- "description": "Start a new conversation in ChatWise",
1959
- "strategy": "ui",
1960
- "browser": true,
1961
- "args": [],
1962
- "type": "ts",
1963
- "modulePath": "chatwise/new.js",
1964
- "domain": "localhost",
1965
- "columns": [
1966
- "Status"
1967
- ]
1968
- },
1969
1980
  {
1970
1981
  "site": "chatwise",
1971
1982
  "name": "read",
@@ -1980,29 +1991,6 @@
1980
1991
  "Content"
1981
1992
  ]
1982
1993
  },
1983
- {
1984
- "site": "chatwise",
1985
- "name": "screenshot",
1986
- "description": "Capture a snapshot of the current ChatWise window (DOM + Accessibility tree)",
1987
- "strategy": "ui",
1988
- "browser": true,
1989
- "args": [
1990
- {
1991
- "name": "output",
1992
- "type": "str",
1993
- "default": "/tmp/chatwise-snapshot)",
1994
- "required": false,
1995
- "help": "Output file path (default: /tmp/chatwise-snapshot)"
1996
- }
1997
- ],
1998
- "type": "ts",
1999
- "modulePath": "chatwise/screenshot.js",
2000
- "domain": "localhost",
2001
- "columns": [
2002
- "Status",
2003
- "File"
2004
- ]
2005
- },
2006
1994
  {
2007
1995
  "site": "chatwise",
2008
1996
  "name": "send",
@@ -2026,22 +2014,6 @@
2026
2014
  "InjectedText"
2027
2015
  ]
2028
2016
  },
2029
- {
2030
- "site": "chatwise",
2031
- "name": "status",
2032
- "description": "Check active CDP connection to ChatWise Desktop",
2033
- "strategy": "ui",
2034
- "browser": true,
2035
- "args": [],
2036
- "type": "ts",
2037
- "modulePath": "chatwise/status.js",
2038
- "domain": "localhost",
2039
- "columns": [
2040
- "Status",
2041
- "Url",
2042
- "Title"
2043
- ]
2044
- },
2045
2017
  {
2046
2018
  "site": "codex",
2047
2019
  "name": "ask",
@@ -2072,21 +2044,6 @@
2072
2044
  "Text"
2073
2045
  ]
2074
2046
  },
2075
- {
2076
- "site": "codex",
2077
- "name": "dump",
2078
- "description": "Dump the DOM and Accessibility tree of Codex for reverse-engineering",
2079
- "strategy": "ui",
2080
- "browser": true,
2081
- "args": [],
2082
- "type": "ts",
2083
- "modulePath": "codex/dump.js",
2084
- "domain": "localhost",
2085
- "columns": [
2086
- "action",
2087
- "files"
2088
- ]
2089
- },
2090
2047
  {
2091
2048
  "site": "codex",
2092
2049
  "name": "export",
@@ -2164,21 +2121,6 @@
2164
2121
  "Model"
2165
2122
  ]
2166
2123
  },
2167
- {
2168
- "site": "codex",
2169
- "name": "new",
2170
- "description": "Start a new Codex conversation thread / isolated workspace",
2171
- "strategy": "ui",
2172
- "browser": true,
2173
- "args": [],
2174
- "type": "ts",
2175
- "modulePath": "codex/new.js",
2176
- "domain": "localhost",
2177
- "columns": [
2178
- "Status",
2179
- "Action"
2180
- ]
2181
- },
2182
2124
  {
2183
2125
  "site": "codex",
2184
2126
  "name": "read",
@@ -2193,29 +2135,6 @@
2193
2135
  "Content"
2194
2136
  ]
2195
2137
  },
2196
- {
2197
- "site": "codex",
2198
- "name": "screenshot",
2199
- "description": "Capture a snapshot of the current Codex window (DOM + Accessibility tree)",
2200
- "strategy": "ui",
2201
- "browser": true,
2202
- "args": [
2203
- {
2204
- "name": "output",
2205
- "type": "str",
2206
- "default": "/tmp/codex-snapshot.txt)",
2207
- "required": false,
2208
- "help": "Output file path (default: /tmp/codex-snapshot.txt)"
2209
- }
2210
- ],
2211
- "type": "ts",
2212
- "modulePath": "codex/screenshot.js",
2213
- "domain": "localhost",
2214
- "columns": [
2215
- "Status",
2216
- "File"
2217
- ]
2218
- },
2219
2138
  {
2220
2139
  "site": "codex",
2221
2140
  "name": "send",
@@ -2239,22 +2158,6 @@
2239
2158
  "InjectedText"
2240
2159
  ]
2241
2160
  },
2242
- {
2243
- "site": "codex",
2244
- "name": "status",
2245
- "description": "Check active CDP connection to OpenAI Codex App",
2246
- "strategy": "ui",
2247
- "browser": true,
2248
- "args": [],
2249
- "type": "ts",
2250
- "modulePath": "codex/status.js",
2251
- "domain": "localhost",
2252
- "columns": [
2253
- "Status",
2254
- "Url",
2255
- "Title"
2256
- ]
2257
- },
2258
2161
  {
2259
2162
  "site": "coupang",
2260
2163
  "name": "add-to-cart",
@@ -2424,21 +2327,6 @@
2424
2327
  "InjectedText"
2425
2328
  ]
2426
2329
  },
2427
- {
2428
- "site": "cursor",
2429
- "name": "dump",
2430
- "description": "Dump the DOM and Accessibility tree of Cursor for reverse-engineering",
2431
- "strategy": "ui",
2432
- "browser": true,
2433
- "args": [],
2434
- "type": "ts",
2435
- "modulePath": "cursor/dump.js",
2436
- "domain": "localhost",
2437
- "columns": [
2438
- "action",
2439
- "files"
2440
- ]
2441
- },
2442
2330
  {
2443
2331
  "site": "cursor",
2444
2332
  "name": "export",
@@ -2515,20 +2403,6 @@
2515
2403
  "Model"
2516
2404
  ]
2517
2405
  },
2518
- {
2519
- "site": "cursor",
2520
- "name": "new",
2521
- "description": "Start a new Cursor chat or Composer session",
2522
- "strategy": "ui",
2523
- "browser": true,
2524
- "args": [],
2525
- "type": "ts",
2526
- "modulePath": "cursor/new.js",
2527
- "domain": "localhost",
2528
- "columns": [
2529
- "Status"
2530
- ]
2531
- },
2532
2406
  {
2533
2407
  "site": "cursor",
2534
2408
  "name": "read",
@@ -2544,29 +2418,6 @@
2544
2418
  "Text"
2545
2419
  ]
2546
2420
  },
2547
- {
2548
- "site": "cursor",
2549
- "name": "screenshot",
2550
- "description": "Capture a snapshot of the current ${site} window (DOM + Accessibility tree)",
2551
- "strategy": "ui",
2552
- "browser": true,
2553
- "args": [
2554
- {
2555
- "name": "output",
2556
- "type": "str",
2557
- "default": "/tmp/${site",
2558
- "required": false,
2559
- "help": "Output file path (default: /tmp/${site}-snapshot.txt)"
2560
- }
2561
- ],
2562
- "type": "ts",
2563
- "modulePath": "cursor/screenshot.js",
2564
- "domain": "localhost",
2565
- "columns": [
2566
- "Status",
2567
- "File"
2568
- ]
2569
- },
2570
2421
  {
2571
2422
  "site": "cursor",
2572
2423
  "name": "send",
@@ -2590,22 +2441,6 @@
2590
2441
  "InjectedText"
2591
2442
  ]
2592
2443
  },
2593
- {
2594
- "site": "cursor",
2595
- "name": "status",
2596
- "description": "Check active CDP connection to Cursor AI Editor",
2597
- "strategy": "ui",
2598
- "browser": true,
2599
- "args": [],
2600
- "type": "ts",
2601
- "modulePath": "cursor/status.js",
2602
- "domain": "localhost",
2603
- "columns": [
2604
- "Status",
2605
- "Url",
2606
- "Title"
2607
- ]
2608
- },
2609
2444
  {
2610
2445
  "site": "devto",
2611
2446
  "name": "tag",
@@ -2760,65 +2595,183 @@
2760
2595
  "type": "yaml"
2761
2596
  },
2762
2597
  {
2763
- "site": "discord-app",
2764
- "name": "channels",
2765
- "description": "List channels in the current Discord server",
2766
- "strategy": "ui",
2767
- "browser": true,
2768
- "args": [],
2769
- "type": "ts",
2770
- "modulePath": "discord-app/channels.js",
2771
- "domain": "localhost",
2772
- "columns": [
2773
- "Index",
2774
- "Channel",
2775
- "Type"
2776
- ]
2777
- },
2778
- {
2779
- "site": "discord-app",
2780
- "name": "members",
2781
- "description": "List online members in the current Discord channel",
2782
- "strategy": "ui",
2783
- "browser": true,
2784
- "args": [],
2785
- "type": "ts",
2786
- "modulePath": "discord-app/members.js",
2787
- "domain": "localhost",
2788
- "columns": [
2789
- "Index",
2790
- "Name",
2791
- "Status"
2792
- ]
2793
- },
2794
- {
2795
- "site": "discord-app",
2796
- "name": "read",
2797
- "description": "Read recent messages from the active Discord channel",
2798
- "strategy": "ui",
2799
- "browser": true,
2598
+ "site": "dictionary",
2599
+ "name": "examples",
2600
+ "description": "Read real-world example sentences utilizing the word",
2601
+ "domain": "api.dictionaryapi.dev",
2602
+ "strategy": "public",
2603
+ "browser": false,
2800
2604
  "args": [
2801
2605
  {
2802
- "name": "count",
2803
- "type": "str",
2804
- "default": "20)",
2805
- "required": false,
2806
- "help": "Number of messages to read (default: 20)"
2606
+ "name": "word",
2607
+ "type": "string",
2608
+ "required": true,
2609
+ "positional": true,
2610
+ "help": "Word to get example sentences for"
2807
2611
  }
2808
2612
  ],
2809
- "type": "ts",
2810
- "modulePath": "discord-app/read.js",
2811
- "domain": "localhost",
2812
2613
  "columns": [
2813
- "Author",
2814
- "Time",
2815
- "Message"
2816
- ]
2614
+ "word",
2615
+ "example"
2616
+ ],
2617
+ "pipeline": [
2618
+ {
2619
+ "fetch": {
2620
+ "url": "https://api.dictionaryapi.dev/api/v2/entries/en/${{ args.word | urlencode }}"
2621
+ }
2622
+ },
2623
+ {
2624
+ "map": {
2625
+ "word": "${{ item.word }}",
2626
+ "example": "${{ (() => { if (item.meanings) { for (const m of item.meanings) { if (m.definitions) { for (const d of m.definitions) { if (d.example) return d.example; } } } } return 'No example found in API.'; })() }}"
2627
+ }
2628
+ },
2629
+ {
2630
+ "limit": 1
2631
+ }
2632
+ ],
2633
+ "type": "yaml"
2817
2634
  },
2818
2635
  {
2819
- "site": "discord-app",
2636
+ "site": "dictionary",
2820
2637
  "name": "search",
2821
- "description": "Search messages in the current Discord server/channel (Cmd+F)",
2638
+ "description": "Search the Free Dictionary API for definitions, parts of speech, and pronunciations.",
2639
+ "domain": "api.dictionaryapi.dev",
2640
+ "strategy": "public",
2641
+ "browser": false,
2642
+ "args": [
2643
+ {
2644
+ "name": "word",
2645
+ "type": "string",
2646
+ "required": true,
2647
+ "positional": true,
2648
+ "help": "Word to define (e.g., serendipity)"
2649
+ }
2650
+ ],
2651
+ "columns": [
2652
+ "word",
2653
+ "phonetic",
2654
+ "type",
2655
+ "definition"
2656
+ ],
2657
+ "pipeline": [
2658
+ {
2659
+ "fetch": {
2660
+ "url": "https://api.dictionaryapi.dev/api/v2/entries/en/${{ args.word | urlencode }}"
2661
+ }
2662
+ },
2663
+ {
2664
+ "map": {
2665
+ "word": "${{ item.word }}",
2666
+ "phonetic": "${{ (() => { if (item.phonetic) return item.phonetic; if (item.phonetics) { for (const p of item.phonetics) { if (p.text) return p.text; } } return ''; })() }}",
2667
+ "type": "${{ (() => { if (item.meanings && item.meanings[0] && item.meanings[0].partOfSpeech) return item.meanings[0].partOfSpeech; return 'N/A'; })() }}",
2668
+ "definition": "${{ (() => { if (item.meanings && item.meanings[0] && item.meanings[0].definitions && item.meanings[0].definitions[0] && item.meanings[0].definitions[0].definition) return item.meanings[0].definitions[0].definition; return 'No definition found in API.'; })() }}"
2669
+ }
2670
+ },
2671
+ {
2672
+ "limit": 1
2673
+ }
2674
+ ],
2675
+ "type": "yaml"
2676
+ },
2677
+ {
2678
+ "site": "dictionary",
2679
+ "name": "synonyms",
2680
+ "description": "Find synonyms for a specific word",
2681
+ "domain": "api.dictionaryapi.dev",
2682
+ "strategy": "public",
2683
+ "browser": false,
2684
+ "args": [
2685
+ {
2686
+ "name": "word",
2687
+ "type": "string",
2688
+ "required": true,
2689
+ "positional": true,
2690
+ "help": "Word to find synonyms for (e.g., serendipity)"
2691
+ }
2692
+ ],
2693
+ "columns": [
2694
+ "word",
2695
+ "synonyms"
2696
+ ],
2697
+ "pipeline": [
2698
+ {
2699
+ "fetch": {
2700
+ "url": "https://api.dictionaryapi.dev/api/v2/entries/en/${{ args.word | urlencode }}"
2701
+ }
2702
+ },
2703
+ {
2704
+ "map": {
2705
+ "word": "${{ item.word }}",
2706
+ "synonyms": "${{ (() => { const s = new Set(); if (item.meanings) { for (const m of item.meanings) { if (m.synonyms) { for (const syn of m.synonyms) s.add(syn); } if (m.definitions) { for (const d of m.definitions) { if (d.synonyms) { for (const syn of d.synonyms) s.add(syn); } } } } } const arr = Array.from(s); return arr.length > 0 ? arr.slice(0, 5).join(', ') : 'No synonyms found in API.'; })() }}"
2707
+ }
2708
+ },
2709
+ {
2710
+ "limit": 1
2711
+ }
2712
+ ],
2713
+ "type": "yaml"
2714
+ },
2715
+ {
2716
+ "site": "discord-app",
2717
+ "name": "channels",
2718
+ "description": "List channels in the current Discord server",
2719
+ "strategy": "ui",
2720
+ "browser": true,
2721
+ "args": [],
2722
+ "type": "ts",
2723
+ "modulePath": "discord-app/channels.js",
2724
+ "domain": "localhost",
2725
+ "columns": [
2726
+ "Index",
2727
+ "Channel",
2728
+ "Type"
2729
+ ]
2730
+ },
2731
+ {
2732
+ "site": "discord-app",
2733
+ "name": "members",
2734
+ "description": "List online members in the current Discord channel",
2735
+ "strategy": "ui",
2736
+ "browser": true,
2737
+ "args": [],
2738
+ "type": "ts",
2739
+ "modulePath": "discord-app/members.js",
2740
+ "domain": "localhost",
2741
+ "columns": [
2742
+ "Index",
2743
+ "Name",
2744
+ "Status"
2745
+ ]
2746
+ },
2747
+ {
2748
+ "site": "discord-app",
2749
+ "name": "read",
2750
+ "description": "Read recent messages from the active Discord channel",
2751
+ "strategy": "ui",
2752
+ "browser": true,
2753
+ "args": [
2754
+ {
2755
+ "name": "count",
2756
+ "type": "str",
2757
+ "default": "20)",
2758
+ "required": false,
2759
+ "help": "Number of messages to read (default: 20)"
2760
+ }
2761
+ ],
2762
+ "type": "ts",
2763
+ "modulePath": "discord-app/read.js",
2764
+ "domain": "localhost",
2765
+ "columns": [
2766
+ "Author",
2767
+ "Time",
2768
+ "Message"
2769
+ ]
2770
+ },
2771
+ {
2772
+ "site": "discord-app",
2773
+ "name": "search",
2774
+ "description": "Search messages in the current Discord server/channel (Cmd+F)",
2822
2775
  "strategy": "ui",
2823
2776
  "browser": true,
2824
2777
  "args": [
@@ -3394,6 +3347,472 @@
3394
3347
  "Title"
3395
3348
  ]
3396
3349
  },
3350
+ {
3351
+ "site": "douyin",
3352
+ "name": "activities",
3353
+ "description": "官方活动列表",
3354
+ "strategy": "cookie",
3355
+ "browser": true,
3356
+ "args": [],
3357
+ "type": "ts",
3358
+ "modulePath": "douyin/activities.js",
3359
+ "domain": "creator.douyin.com",
3360
+ "columns": [
3361
+ "activity_id",
3362
+ "title",
3363
+ "end_time"
3364
+ ]
3365
+ },
3366
+ {
3367
+ "site": "douyin",
3368
+ "name": "collections",
3369
+ "description": "合集列表",
3370
+ "strategy": "cookie",
3371
+ "browser": true,
3372
+ "args": [
3373
+ {
3374
+ "name": "limit",
3375
+ "type": "int",
3376
+ "default": 20,
3377
+ "required": false,
3378
+ "help": ""
3379
+ }
3380
+ ],
3381
+ "type": "ts",
3382
+ "modulePath": "douyin/collections.js",
3383
+ "domain": "creator.douyin.com",
3384
+ "columns": [
3385
+ "mix_id",
3386
+ "name",
3387
+ "item_count"
3388
+ ]
3389
+ },
3390
+ {
3391
+ "site": "douyin",
3392
+ "name": "delete",
3393
+ "description": "删除作品",
3394
+ "strategy": "cookie",
3395
+ "browser": true,
3396
+ "args": [
3397
+ {
3398
+ "name": "aweme_id",
3399
+ "type": "str",
3400
+ "required": true,
3401
+ "positional": true,
3402
+ "help": "作品 ID"
3403
+ }
3404
+ ],
3405
+ "type": "ts",
3406
+ "modulePath": "douyin/delete.js",
3407
+ "domain": "creator.douyin.com",
3408
+ "columns": [
3409
+ "status"
3410
+ ]
3411
+ },
3412
+ {
3413
+ "site": "douyin",
3414
+ "name": "draft",
3415
+ "description": "上传视频并保存为草稿",
3416
+ "strategy": "cookie",
3417
+ "browser": true,
3418
+ "args": [
3419
+ {
3420
+ "name": "video",
3421
+ "type": "str",
3422
+ "required": true,
3423
+ "positional": true,
3424
+ "help": "视频文件路径"
3425
+ },
3426
+ {
3427
+ "name": "title",
3428
+ "type": "str",
3429
+ "required": true,
3430
+ "help": "视频标题(≤30字)"
3431
+ },
3432
+ {
3433
+ "name": "caption",
3434
+ "type": "str",
3435
+ "default": "",
3436
+ "required": false,
3437
+ "help": "正文内容(≤1000字,支持 #话题)"
3438
+ },
3439
+ {
3440
+ "name": "cover",
3441
+ "type": "str",
3442
+ "default": "",
3443
+ "required": false,
3444
+ "help": "封面图片路径"
3445
+ },
3446
+ {
3447
+ "name": "visibility",
3448
+ "type": "str",
3449
+ "default": "public",
3450
+ "required": false,
3451
+ "help": "",
3452
+ "choices": [
3453
+ "public",
3454
+ "friends",
3455
+ "private"
3456
+ ]
3457
+ }
3458
+ ],
3459
+ "type": "ts",
3460
+ "modulePath": "douyin/draft.js",
3461
+ "domain": "creator.douyin.com",
3462
+ "columns": [
3463
+ "status",
3464
+ "aweme_id"
3465
+ ]
3466
+ },
3467
+ {
3468
+ "site": "douyin",
3469
+ "name": "drafts",
3470
+ "description": "获取草稿列表",
3471
+ "strategy": "cookie",
3472
+ "browser": true,
3473
+ "args": [
3474
+ {
3475
+ "name": "limit",
3476
+ "type": "int",
3477
+ "default": 20,
3478
+ "required": false,
3479
+ "help": ""
3480
+ }
3481
+ ],
3482
+ "type": "ts",
3483
+ "modulePath": "douyin/drafts.js",
3484
+ "domain": "creator.douyin.com",
3485
+ "columns": [
3486
+ "aweme_id",
3487
+ "title",
3488
+ "create_time"
3489
+ ]
3490
+ },
3491
+ {
3492
+ "site": "douyin",
3493
+ "name": "hashtag",
3494
+ "description": "话题搜索 / AI推荐 / 热点词",
3495
+ "strategy": "cookie",
3496
+ "browser": true,
3497
+ "args": [
3498
+ {
3499
+ "name": "action",
3500
+ "type": "str",
3501
+ "required": true,
3502
+ "positional": true,
3503
+ "help": "search=关键词搜索 suggest=AI推荐 hot=热点词",
3504
+ "choices": [
3505
+ "search",
3506
+ "suggest",
3507
+ "hot"
3508
+ ]
3509
+ },
3510
+ {
3511
+ "name": "keyword",
3512
+ "type": "str",
3513
+ "default": "",
3514
+ "required": false,
3515
+ "help": "搜索关键词(search/hot 使用)"
3516
+ },
3517
+ {
3518
+ "name": "cover",
3519
+ "type": "str",
3520
+ "default": "",
3521
+ "required": false,
3522
+ "help": "封面 URI(suggest 使用)"
3523
+ },
3524
+ {
3525
+ "name": "limit",
3526
+ "type": "int",
3527
+ "default": 10,
3528
+ "required": false,
3529
+ "help": ""
3530
+ }
3531
+ ],
3532
+ "type": "ts",
3533
+ "modulePath": "douyin/hashtag.js",
3534
+ "domain": "creator.douyin.com",
3535
+ "columns": [
3536
+ "name",
3537
+ "id",
3538
+ "view_count"
3539
+ ]
3540
+ },
3541
+ {
3542
+ "site": "douyin",
3543
+ "name": "location",
3544
+ "description": "地理位置 POI 搜索",
3545
+ "strategy": "cookie",
3546
+ "browser": true,
3547
+ "args": [
3548
+ {
3549
+ "name": "query",
3550
+ "type": "str",
3551
+ "required": true,
3552
+ "positional": true,
3553
+ "help": "地名关键词"
3554
+ },
3555
+ {
3556
+ "name": "limit",
3557
+ "type": "int",
3558
+ "default": 20,
3559
+ "required": false,
3560
+ "help": ""
3561
+ }
3562
+ ],
3563
+ "type": "ts",
3564
+ "modulePath": "douyin/location.js",
3565
+ "domain": "creator.douyin.com",
3566
+ "columns": [
3567
+ "poi_id",
3568
+ "name",
3569
+ "address",
3570
+ "city"
3571
+ ]
3572
+ },
3573
+ {
3574
+ "site": "douyin",
3575
+ "name": "profile",
3576
+ "description": "获取账号信息",
3577
+ "strategy": "cookie",
3578
+ "browser": true,
3579
+ "args": [],
3580
+ "type": "ts",
3581
+ "modulePath": "douyin/profile.js",
3582
+ "domain": "creator.douyin.com",
3583
+ "columns": [
3584
+ "uid",
3585
+ "nickname",
3586
+ "follower_count",
3587
+ "following_count",
3588
+ "aweme_count"
3589
+ ]
3590
+ },
3591
+ {
3592
+ "site": "douyin",
3593
+ "name": "publish",
3594
+ "description": "定时发布视频到抖音(必须设置 2h ~ 14天后的发布时间)",
3595
+ "strategy": "cookie",
3596
+ "browser": true,
3597
+ "args": [
3598
+ {
3599
+ "name": "video",
3600
+ "type": "str",
3601
+ "required": true,
3602
+ "positional": true,
3603
+ "help": "视频文件路径"
3604
+ },
3605
+ {
3606
+ "name": "title",
3607
+ "type": "str",
3608
+ "required": true,
3609
+ "help": "视频标题(≤30字)"
3610
+ },
3611
+ {
3612
+ "name": "schedule",
3613
+ "type": "str",
3614
+ "required": true,
3615
+ "help": "定时发布时间(ISO8601 或 Unix 秒,2h ~ 14天后)"
3616
+ },
3617
+ {
3618
+ "name": "caption",
3619
+ "type": "str",
3620
+ "default": "",
3621
+ "required": false,
3622
+ "help": "正文内容(≤1000字,支持 #话题)"
3623
+ },
3624
+ {
3625
+ "name": "cover",
3626
+ "type": "str",
3627
+ "default": "",
3628
+ "required": false,
3629
+ "help": "封面图片路径(不提供时使用视频截帧)"
3630
+ },
3631
+ {
3632
+ "name": "visibility",
3633
+ "type": "str",
3634
+ "default": "public",
3635
+ "required": false,
3636
+ "help": "",
3637
+ "choices": [
3638
+ "public",
3639
+ "friends",
3640
+ "private"
3641
+ ]
3642
+ },
3643
+ {
3644
+ "name": "allow_download",
3645
+ "type": "bool",
3646
+ "default": false,
3647
+ "required": false,
3648
+ "help": "允许下载"
3649
+ },
3650
+ {
3651
+ "name": "collection",
3652
+ "type": "str",
3653
+ "default": "",
3654
+ "required": false,
3655
+ "help": "合集 ID"
3656
+ },
3657
+ {
3658
+ "name": "activity",
3659
+ "type": "str",
3660
+ "default": "",
3661
+ "required": false,
3662
+ "help": "活动 ID"
3663
+ },
3664
+ {
3665
+ "name": "poi_id",
3666
+ "type": "str",
3667
+ "default": "",
3668
+ "required": false,
3669
+ "help": "地理位置 ID"
3670
+ },
3671
+ {
3672
+ "name": "poi_name",
3673
+ "type": "str",
3674
+ "default": "",
3675
+ "required": false,
3676
+ "help": "地理位置名称"
3677
+ },
3678
+ {
3679
+ "name": "hotspot",
3680
+ "type": "str",
3681
+ "default": "",
3682
+ "required": false,
3683
+ "help": "关联热点词"
3684
+ },
3685
+ {
3686
+ "name": "no_safety_check",
3687
+ "type": "bool",
3688
+ "default": false,
3689
+ "required": false,
3690
+ "help": "跳过内容安全检测"
3691
+ },
3692
+ {
3693
+ "name": "sync_toutiao",
3694
+ "type": "bool",
3695
+ "default": false,
3696
+ "required": false,
3697
+ "help": "同步发布到头条"
3698
+ }
3699
+ ],
3700
+ "type": "ts",
3701
+ "modulePath": "douyin/publish.js",
3702
+ "domain": "creator.douyin.com",
3703
+ "columns": [
3704
+ "status",
3705
+ "aweme_id",
3706
+ "url",
3707
+ "publish_time"
3708
+ ]
3709
+ },
3710
+ {
3711
+ "site": "douyin",
3712
+ "name": "stats",
3713
+ "description": "作品数据分析",
3714
+ "strategy": "cookie",
3715
+ "browser": true,
3716
+ "args": [
3717
+ {
3718
+ "name": "aweme_id",
3719
+ "type": "str",
3720
+ "required": true,
3721
+ "positional": true,
3722
+ "help": ""
3723
+ }
3724
+ ],
3725
+ "type": "ts",
3726
+ "modulePath": "douyin/stats.js",
3727
+ "domain": "creator.douyin.com",
3728
+ "columns": [
3729
+ "metric",
3730
+ "value"
3731
+ ]
3732
+ },
3733
+ {
3734
+ "site": "douyin",
3735
+ "name": "update",
3736
+ "description": "更新视频信息",
3737
+ "strategy": "cookie",
3738
+ "browser": true,
3739
+ "args": [
3740
+ {
3741
+ "name": "aweme_id",
3742
+ "type": "str",
3743
+ "required": true,
3744
+ "positional": true,
3745
+ "help": ""
3746
+ },
3747
+ {
3748
+ "name": "reschedule",
3749
+ "type": "str",
3750
+ "default": "",
3751
+ "required": false,
3752
+ "help": "新的发布时间(ISO8601 或 Unix 秒)"
3753
+ },
3754
+ {
3755
+ "name": "caption",
3756
+ "type": "str",
3757
+ "default": "",
3758
+ "required": false,
3759
+ "help": "新的正文内容"
3760
+ }
3761
+ ],
3762
+ "type": "ts",
3763
+ "modulePath": "douyin/update.js",
3764
+ "domain": "creator.douyin.com",
3765
+ "columns": [
3766
+ "status"
3767
+ ]
3768
+ },
3769
+ {
3770
+ "site": "douyin",
3771
+ "name": "videos",
3772
+ "description": "获取作品列表",
3773
+ "strategy": "cookie",
3774
+ "browser": true,
3775
+ "args": [
3776
+ {
3777
+ "name": "limit",
3778
+ "type": "int",
3779
+ "default": 20,
3780
+ "required": false,
3781
+ "help": "每页数量"
3782
+ },
3783
+ {
3784
+ "name": "page",
3785
+ "type": "int",
3786
+ "default": 1,
3787
+ "required": false,
3788
+ "help": "页码"
3789
+ },
3790
+ {
3791
+ "name": "status",
3792
+ "type": "str",
3793
+ "default": "all",
3794
+ "required": false,
3795
+ "help": "",
3796
+ "choices": [
3797
+ "all",
3798
+ "published",
3799
+ "reviewing",
3800
+ "scheduled"
3801
+ ]
3802
+ }
3803
+ ],
3804
+ "type": "ts",
3805
+ "modulePath": "douyin/videos.js",
3806
+ "domain": "creator.douyin.com",
3807
+ "columns": [
3808
+ "aweme_id",
3809
+ "title",
3810
+ "status",
3811
+ "play_count",
3812
+ "digg_count",
3813
+ "create_time"
3814
+ ]
3815
+ },
3397
3816
  {
3398
3817
  "site": "facebook",
3399
3818
  "name": "add-friend",
@@ -4208,7 +4627,8 @@
4208
4627
  "title",
4209
4628
  "score",
4210
4629
  "author",
4211
- "comments"
4630
+ "comments",
4631
+ "url"
4212
4632
  ],
4213
4633
  "pipeline": [
4214
4634
  {
@@ -4807,14 +5227,15 @@
4807
5227
  "username",
4808
5228
  "name",
4809
5229
  "verified",
4810
- "private"
5230
+ "private",
5231
+ "url"
4811
5232
  ],
4812
5233
  "pipeline": [
4813
5234
  {
4814
5235
  "navigate": "https://www.instagram.com"
4815
5236
  },
4816
5237
  {
4817
- "evaluate": "(async () => {\n const query = ${{ args.query | json }};\n const limit = ${{ args.limit }};\n const res = await fetch(\n 'https://www.instagram.com/web/search/topsearch/?query=' + encodeURIComponent(query) + '&context=user',\n {\n credentials: 'include',\n headers: { 'X-IG-App-ID': '936619743392459' }\n }\n );\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - make sure you are logged in to Instagram');\n const data = await res.json();\n const users = (data?.users || []).slice(0, limit);\n return users.map((item, i) => ({\n rank: i + 1,\n username: item.user?.username || '',\n name: item.user?.full_name || '',\n verified: item.user?.is_verified ? 'Yes' : 'No',\n private: item.user?.is_private ? 'Yes' : 'No',\n }));\n})()\n"
5238
+ "evaluate": "(async () => {\n const query = ${{ args.query | json }};\n const limit = ${{ args.limit }};\n const res = await fetch(\n 'https://www.instagram.com/web/search/topsearch/?query=' + encodeURIComponent(query) + '&context=user',\n {\n credentials: 'include',\n headers: { 'X-IG-App-ID': '936619743392459' }\n }\n );\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - make sure you are logged in to Instagram');\n const data = await res.json();\n const users = (data?.users || []).slice(0, limit);\n return users.map((item, i) => ({\n rank: i + 1,\n username: item.user?.username || '',\n name: item.user?.full_name || '',\n verified: item.user?.is_verified ? 'Yes' : 'No',\n private: item.user?.is_private ? 'Yes' : 'No',\n url: 'https://www.instagram.com/' + (item.user?.username || ''),\n }));\n})()\n"
4818
5239
  }
4819
5240
  ],
4820
5241
  "type": "yaml"
@@ -4966,6 +5387,40 @@
4966
5387
  ],
4967
5388
  "type": "yaml"
4968
5389
  },
5390
+ {
5391
+ "site": "jd",
5392
+ "name": "item",
5393
+ "description": "京东商品详情(价格、主图、详情图、规格参数)",
5394
+ "strategy": "cookie",
5395
+ "browser": true,
5396
+ "args": [
5397
+ {
5398
+ "name": "sku",
5399
+ "type": "str",
5400
+ "required": true,
5401
+ "positional": true,
5402
+ "help": "商品 SKU ID(如 100291143898)"
5403
+ },
5404
+ {
5405
+ "name": "images",
5406
+ "type": "int",
5407
+ "default": 10,
5408
+ "required": false,
5409
+ "help": "详情图数量(默认10)"
5410
+ }
5411
+ ],
5412
+ "type": "ts",
5413
+ "modulePath": "jd/item.js",
5414
+ "domain": "item.jd.com",
5415
+ "columns": [
5416
+ "title",
5417
+ "price",
5418
+ "shop",
5419
+ "specs",
5420
+ "mainImages",
5421
+ "detailImages"
5422
+ ]
5423
+ },
4969
5424
  {
4970
5425
  "site": "jike",
4971
5426
  "name": "comment",
@@ -5495,6 +5950,36 @@
5495
5950
  "url"
5496
5951
  ]
5497
5952
  },
5953
+ {
5954
+ "site": "linkedin",
5955
+ "name": "timeline",
5956
+ "description": "Read LinkedIn home timeline posts",
5957
+ "strategy": "cookie",
5958
+ "browser": true,
5959
+ "args": [
5960
+ {
5961
+ "name": "limit",
5962
+ "type": "int",
5963
+ "default": 20,
5964
+ "required": false,
5965
+ "help": "Number of posts to return (max 100)"
5966
+ }
5967
+ ],
5968
+ "type": "ts",
5969
+ "modulePath": "linkedin/timeline.js",
5970
+ "domain": "www.linkedin.com",
5971
+ "columns": [
5972
+ "rank",
5973
+ "author",
5974
+ "author_url",
5975
+ "headline",
5976
+ "text",
5977
+ "posted_at",
5978
+ "reactions",
5979
+ "comments",
5980
+ "url"
5981
+ ]
5982
+ },
5498
5983
  {
5499
5984
  "site": "linux-do",
5500
5985
  "name": "categories",
@@ -5733,14 +6218,15 @@
5733
6218
  "title",
5734
6219
  "views",
5735
6220
  "likes",
5736
- "replies"
6221
+ "replies",
6222
+ "url"
5737
6223
  ],
5738
6224
  "pipeline": [
5739
6225
  {
5740
6226
  "navigate": "https://linux.do"
5741
6227
  },
5742
6228
  {
5743
- "evaluate": "(async () => {\n const keyword = ${{ args.query | json }};\n const res = await fetch('/search.json?q=' + encodeURIComponent(keyword), { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topics || [];\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.title,\n views: t.views,\n likes: t.like_count,\n replies: (t.posts_count || 1) - 1,\n }));\n})()\n"
6229
+ "evaluate": "(async () => {\n const keyword = ${{ args.query | json }};\n const res = await fetch('/search.json?q=' + encodeURIComponent(keyword), { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topics || [];\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.title,\n views: t.views,\n likes: t.like_count,\n replies: (t.posts_count || 1) - 1,\n url: 'https://linux.do/t/topic/' + t.id,\n }));\n})()\n"
5744
6230
  },
5745
6231
  {
5746
6232
  "map": {
@@ -5748,7 +6234,8 @@
5748
6234
  "title": "${{ item.title }}",
5749
6235
  "views": "${{ item.views }}",
5750
6236
  "likes": "${{ item.likes }}",
5751
- "replies": "${{ item.replies }}"
6237
+ "replies": "${{ item.replies }}",
6238
+ "url": "${{ item.url }}"
5752
6239
  }
5753
6240
  },
5754
6241
  {
@@ -6057,7 +6544,8 @@
6057
6544
  "author",
6058
6545
  "date",
6059
6546
  "readTime",
6060
- "claps"
6547
+ "claps",
6548
+ "url"
6061
6549
  ]
6062
6550
  },
6063
6551
  {
@@ -6246,6 +6734,275 @@
6246
6734
  "Status"
6247
6735
  ]
6248
6736
  },
6737
+ {
6738
+ "site": "pixiv",
6739
+ "name": "detail",
6740
+ "description": "View illustration details (tags, stats, URLs)",
6741
+ "domain": "www.pixiv.net",
6742
+ "strategy": "cookie",
6743
+ "browser": true,
6744
+ "args": [
6745
+ {
6746
+ "name": "id",
6747
+ "type": "str",
6748
+ "required": true,
6749
+ "positional": true,
6750
+ "help": "Illustration ID"
6751
+ }
6752
+ ],
6753
+ "columns": [
6754
+ "illust_id",
6755
+ "title",
6756
+ "author",
6757
+ "type",
6758
+ "pages",
6759
+ "bookmarks",
6760
+ "likes",
6761
+ "views",
6762
+ "tags",
6763
+ "created",
6764
+ "url"
6765
+ ],
6766
+ "pipeline": [
6767
+ {
6768
+ "navigate": "https://www.pixiv.net"
6769
+ },
6770
+ {
6771
+ "evaluate": "(async () => {\n const id = ${{ args.id | json }};\n const res = await fetch(\n 'https://www.pixiv.net/ajax/illust/' + id,\n { credentials: 'include' }\n );\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) throw new Error('Authentication required — please log in to Pixiv in Chrome');\n if (res.status === 404) throw new Error('Illustration not found: ' + id);\n throw new Error('Pixiv request failed (HTTP ' + res.status + ')');\n }\n const data = await res.json();\n const b = data?.body;\n if (!b) throw new Error('Illustration not found');\n return [{\n illust_id: b.illustId,\n title: b.illustTitle,\n author: b.userName,\n user_id: b.userId,\n type: b.illustType === 0 ? 'illust' : b.illustType === 1 ? 'manga' : b.illustType === 2 ? 'ugoira' : String(b.illustType),\n pages: b.pageCount,\n bookmarks: b.bookmarkCount,\n likes: b.likeCount,\n views: b.viewCount,\n tags: (b.tags?.tags || []).map(t => t.tag).join(', '),\n created: b.createDate?.split('T')[0] || '',\n url: 'https://www.pixiv.net/artworks/' + b.illustId\n }];\n})()\n"
6772
+ }
6773
+ ],
6774
+ "type": "yaml"
6775
+ },
6776
+ {
6777
+ "site": "pixiv",
6778
+ "name": "download",
6779
+ "description": "Download illustration images from Pixiv",
6780
+ "strategy": "cookie",
6781
+ "browser": true,
6782
+ "args": [
6783
+ {
6784
+ "name": "illust-id",
6785
+ "type": "str",
6786
+ "required": true,
6787
+ "positional": true,
6788
+ "help": "Illustration ID"
6789
+ },
6790
+ {
6791
+ "name": "output",
6792
+ "type": "str",
6793
+ "default": "./pixiv-downloads",
6794
+ "required": false,
6795
+ "help": "Output directory"
6796
+ }
6797
+ ],
6798
+ "type": "ts",
6799
+ "modulePath": "pixiv/download.js",
6800
+ "domain": "www.pixiv.net",
6801
+ "columns": [
6802
+ "index",
6803
+ "type",
6804
+ "status",
6805
+ "size"
6806
+ ]
6807
+ },
6808
+ {
6809
+ "site": "pixiv",
6810
+ "name": "illusts",
6811
+ "description": "List a Pixiv artist",
6812
+ "strategy": "cookie",
6813
+ "browser": true,
6814
+ "args": [
6815
+ {
6816
+ "name": "user-id",
6817
+ "type": "str",
6818
+ "required": true,
6819
+ "positional": true,
6820
+ "help": "Pixiv user ID"
6821
+ },
6822
+ {
6823
+ "name": "limit",
6824
+ "type": "int",
6825
+ "default": 20,
6826
+ "required": false,
6827
+ "help": "Number of results"
6828
+ }
6829
+ ],
6830
+ "type": "ts",
6831
+ "modulePath": "pixiv/illusts.js",
6832
+ "domain": "www.pixiv.net",
6833
+ "columns": [
6834
+ "rank",
6835
+ "title",
6836
+ "illust_id",
6837
+ "pages",
6838
+ "bookmarks",
6839
+ "tags",
6840
+ "created"
6841
+ ]
6842
+ },
6843
+ {
6844
+ "site": "pixiv",
6845
+ "name": "ranking",
6846
+ "description": "Pixiv illustration rankings (daily/weekly/monthly)",
6847
+ "domain": "www.pixiv.net",
6848
+ "strategy": "cookie",
6849
+ "browser": true,
6850
+ "args": [
6851
+ {
6852
+ "name": "mode",
6853
+ "type": "str",
6854
+ "default": "daily",
6855
+ "required": false,
6856
+ "help": "Ranking mode",
6857
+ "choices": [
6858
+ "daily",
6859
+ "weekly",
6860
+ "monthly",
6861
+ "rookie",
6862
+ "original",
6863
+ "male",
6864
+ "female",
6865
+ "daily_r18",
6866
+ "weekly_r18"
6867
+ ]
6868
+ },
6869
+ {
6870
+ "name": "page",
6871
+ "type": "int",
6872
+ "default": 1,
6873
+ "required": false,
6874
+ "help": "Page number"
6875
+ },
6876
+ {
6877
+ "name": "limit",
6878
+ "type": "int",
6879
+ "default": 20,
6880
+ "required": false,
6881
+ "help": "Number of results"
6882
+ }
6883
+ ],
6884
+ "columns": [
6885
+ "rank",
6886
+ "title",
6887
+ "author",
6888
+ "illust_id",
6889
+ "pages",
6890
+ "bookmarks"
6891
+ ],
6892
+ "pipeline": [
6893
+ {
6894
+ "navigate": "https://www.pixiv.net"
6895
+ },
6896
+ {
6897
+ "evaluate": "(async () => {\n const mode = ${{ args.mode | json }};\n const page = ${{ args.page | json }};\n const limit = ${{ args.limit | json }};\n const res = await fetch(\n 'https://www.pixiv.net/ranking.php?mode=' + mode + '&p=' + page + '&format=json',\n { credentials: 'include' }\n );\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) throw new Error('Authentication required — please log in to Pixiv in Chrome');\n throw new Error('Pixiv request failed (HTTP ' + res.status + ')');\n }\n const data = await res.json();\n const items = (data?.contents || []).slice(0, limit);\n return items.map((item, i) => ({\n rank: item.rank,\n title: item.title,\n author: item.user_name,\n user_id: item.user_id,\n illust_id: item.illust_id,\n pages: item.illust_page_count,\n bookmarks: item.illust_bookmark_count,\n url: 'https://www.pixiv.net/artworks/' + item.illust_id\n }));\n})()\n"
6898
+ }
6899
+ ],
6900
+ "type": "yaml"
6901
+ },
6902
+ {
6903
+ "site": "pixiv",
6904
+ "name": "search",
6905
+ "description": "Search Pixiv illustrations by keyword",
6906
+ "strategy": "cookie",
6907
+ "browser": true,
6908
+ "args": [
6909
+ {
6910
+ "name": "query",
6911
+ "type": "str",
6912
+ "required": true,
6913
+ "positional": true,
6914
+ "help": "Search keyword or tag"
6915
+ },
6916
+ {
6917
+ "name": "limit",
6918
+ "type": "int",
6919
+ "default": 20,
6920
+ "required": false,
6921
+ "help": "Number of results"
6922
+ },
6923
+ {
6924
+ "name": "order",
6925
+ "type": "str",
6926
+ "default": "date_d",
6927
+ "required": false,
6928
+ "help": "Sort order",
6929
+ "choices": [
6930
+ "date_d",
6931
+ "date",
6932
+ "popular_d",
6933
+ "popular_male_d",
6934
+ "popular_female_d"
6935
+ ]
6936
+ },
6937
+ {
6938
+ "name": "mode",
6939
+ "type": "str",
6940
+ "default": "all",
6941
+ "required": false,
6942
+ "help": "Search mode",
6943
+ "choices": [
6944
+ "all",
6945
+ "safe",
6946
+ "r18"
6947
+ ]
6948
+ },
6949
+ {
6950
+ "name": "page",
6951
+ "type": "int",
6952
+ "default": 1,
6953
+ "required": false,
6954
+ "help": "Page number"
6955
+ }
6956
+ ],
6957
+ "type": "ts",
6958
+ "modulePath": "pixiv/search.js",
6959
+ "domain": "www.pixiv.net",
6960
+ "columns": [
6961
+ "rank",
6962
+ "title",
6963
+ "author",
6964
+ "illust_id",
6965
+ "pages",
6966
+ "bookmarks",
6967
+ "tags"
6968
+ ]
6969
+ },
6970
+ {
6971
+ "site": "pixiv",
6972
+ "name": "user",
6973
+ "description": "View Pixiv artist profile",
6974
+ "domain": "www.pixiv.net",
6975
+ "strategy": "cookie",
6976
+ "browser": true,
6977
+ "args": [
6978
+ {
6979
+ "name": "uid",
6980
+ "type": "str",
6981
+ "required": true,
6982
+ "positional": true,
6983
+ "help": "Pixiv user ID"
6984
+ }
6985
+ ],
6986
+ "columns": [
6987
+ "user_id",
6988
+ "name",
6989
+ "premium",
6990
+ "following",
6991
+ "illusts",
6992
+ "manga",
6993
+ "novels",
6994
+ "comment"
6995
+ ],
6996
+ "pipeline": [
6997
+ {
6998
+ "navigate": "https://www.pixiv.net"
6999
+ },
7000
+ {
7001
+ "evaluate": "(async () => {\n const uid = ${{ args.uid | json }};\n const res = await fetch(\n 'https://www.pixiv.net/ajax/user/' + uid + '?full=1',\n { credentials: 'include' }\n );\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) throw new Error('Authentication required — please log in to Pixiv in Chrome');\n if (res.status === 404) throw new Error('User not found: ' + uid);\n throw new Error('Pixiv request failed (HTTP ' + res.status + ')');\n }\n const data = await res.json();\n const b = data?.body;\n if (!b) throw new Error('User not found');\n return [{\n user_id: uid,\n name: b.name,\n premium: b.premium ? 'Yes' : 'No',\n following: b.following,\n illusts: typeof b.illusts === 'object' ? Object.keys(b.illusts).length : (b.illusts || 0),\n manga: typeof b.manga === 'object' ? Object.keys(b.manga).length : (b.manga || 0),\n novels: typeof b.novels === 'object' ? Object.keys(b.novels).length : (b.novels || 0),\n comment: (b.comment || '').slice(0, 80),\n url: 'https://www.pixiv.net/users/' + uid\n }];\n})()\n"
7002
+ }
7003
+ ],
7004
+ "type": "yaml"
7005
+ },
6249
7006
  {
6250
7007
  "site": "reddit",
6251
7008
  "name": "comment",
@@ -7864,6 +8621,7 @@
7864
8621
  "rank",
7865
8622
  "desc",
7866
8623
  "author",
8624
+ "url",
7867
8625
  "plays",
7868
8626
  "likes",
7869
8627
  "comments",
@@ -7877,7 +8635,7 @@
7877
8635
  }
7878
8636
  },
7879
8637
  {
7880
- "evaluate": "(async () => {\n const query = ${{ args.query | json }};\n const limit = ${{ args.limit }};\n const res = await fetch('/api/search/general/full/?keyword=' + encodeURIComponent(query) + '&offset=0&count=' + limit + '&aid=1988', { credentials: 'include' });\n if (!res.ok) throw new Error('Search failed: HTTP ' + res.status);\n const data = await res.json();\n const items = (data.data || []).filter(function(i) { return i.type === 1 && i.item; });\n return items.slice(0, limit).map(function(i, idx) {\n var v = i.item;\n var a = v.author || {};\n var s = v.stats || {};\n return {\n rank: idx + 1,\n desc: (v.desc || '').replace(/\\n/g, ' ').substring(0, 100),\n author: a.uniqueId || '',\n plays: s.playCount || 0,\n likes: s.diggCount || 0,\n comments: s.commentCount || 0,\n shares: s.shareCount || 0,\n };\n });\n})()\n"
8638
+ "evaluate": "(async () => {\n const query = ${{ args.query | json }};\n const limit = ${{ args.limit }};\n const res = await fetch('/api/search/general/full/?keyword=' + encodeURIComponent(query) + '&offset=0&count=' + limit + '&aid=1988', { credentials: 'include' });\n if (!res.ok) throw new Error('Search failed: HTTP ' + res.status);\n const data = await res.json();\n const items = (data.data || []).filter(function(i) { return i.type === 1 && i.item; });\n return items.slice(0, limit).map(function(i, idx) {\n var v = i.item;\n var a = v.author || {};\n var s = v.stats || {};\n return {\n rank: idx + 1,\n desc: (v.desc || '').replace(/\\n/g, ' ').substring(0, 100),\n author: a.uniqueId || '',\n url: (a.uniqueId && v.id) ? 'https://www.tiktok.com/@' + a.uniqueId + '/video/' + v.id : '',\n plays: s.playCount || 0,\n likes: s.diggCount || 0,\n comments: s.commentCount || 0,\n shares: s.shareCount || 0,\n };\n });\n})()\n"
7881
8639
  }
7882
8640
  ],
7883
8641
  "type": "yaml"
@@ -8518,6 +9276,17 @@
8518
9276
  "positional": true,
8519
9277
  "help": ""
8520
9278
  },
9279
+ {
9280
+ "name": "filter",
9281
+ "type": "string",
9282
+ "default": "top",
9283
+ "required": false,
9284
+ "help": "",
9285
+ "choices": [
9286
+ "top",
9287
+ "live"
9288
+ ]
9289
+ },
8521
9290
  {
8522
9291
  "name": "limit",
8523
9292
  "type": "int",
@@ -9140,6 +9909,114 @@
9140
9909
  ],
9141
9910
  "type": "yaml"
9142
9911
  },
9912
+ {
9913
+ "site": "web",
9914
+ "name": "read",
9915
+ "description": "Fetch any web page and export as Markdown",
9916
+ "strategy": "cookie",
9917
+ "browser": true,
9918
+ "args": [
9919
+ {
9920
+ "name": "url",
9921
+ "type": "str",
9922
+ "required": true,
9923
+ "help": "Any web page URL"
9924
+ },
9925
+ {
9926
+ "name": "output",
9927
+ "type": "str",
9928
+ "default": "./web-articles",
9929
+ "required": false,
9930
+ "help": "Output directory"
9931
+ },
9932
+ {
9933
+ "name": "download-images",
9934
+ "type": "boolean",
9935
+ "default": true,
9936
+ "required": false,
9937
+ "help": "Download images locally"
9938
+ },
9939
+ {
9940
+ "name": "wait",
9941
+ "type": "int",
9942
+ "default": 3,
9943
+ "required": false,
9944
+ "help": "Seconds to wait after page load"
9945
+ }
9946
+ ],
9947
+ "type": "ts",
9948
+ "modulePath": "web/read.js",
9949
+ "columns": [
9950
+ "title",
9951
+ "author",
9952
+ "publish_time",
9953
+ "status",
9954
+ "size"
9955
+ ],
9956
+ "navigateBefore": false
9957
+ },
9958
+ {
9959
+ "site": "weibo",
9960
+ "name": "comments",
9961
+ "description": "Get comments on a Weibo post",
9962
+ "strategy": "cookie",
9963
+ "browser": true,
9964
+ "args": [
9965
+ {
9966
+ "name": "id",
9967
+ "type": "str",
9968
+ "required": true,
9969
+ "positional": true,
9970
+ "help": "Post ID (numeric idstr)"
9971
+ },
9972
+ {
9973
+ "name": "limit",
9974
+ "type": "int",
9975
+ "default": 20,
9976
+ "required": false,
9977
+ "help": "Number of comments (max 50)"
9978
+ }
9979
+ ],
9980
+ "type": "ts",
9981
+ "modulePath": "weibo/comments.js",
9982
+ "domain": "weibo.com",
9983
+ "columns": [
9984
+ "rank",
9985
+ "author",
9986
+ "text",
9987
+ "likes",
9988
+ "replies",
9989
+ "time"
9990
+ ]
9991
+ },
9992
+ {
9993
+ "site": "weibo",
9994
+ "name": "feed",
9995
+ "description": "Weibo home timeline (posts from followed users)",
9996
+ "strategy": "cookie",
9997
+ "browser": true,
9998
+ "args": [
9999
+ {
10000
+ "name": "limit",
10001
+ "type": "int",
10002
+ "default": 15,
10003
+ "required": false,
10004
+ "help": "Number of posts (max 50)"
10005
+ }
10006
+ ],
10007
+ "type": "ts",
10008
+ "modulePath": "weibo/feed.js",
10009
+ "domain": "weibo.com",
10010
+ "columns": [
10011
+ "author",
10012
+ "text",
10013
+ "reposts",
10014
+ "comments",
10015
+ "likes",
10016
+ "time",
10017
+ "url"
10018
+ ]
10019
+ },
9143
10020
  {
9144
10021
  "site": "weibo",
9145
10022
  "name": "hot",
@@ -9167,6 +10044,49 @@
9167
10044
  "url"
9168
10045
  ]
9169
10046
  },
10047
+ {
10048
+ "site": "weibo",
10049
+ "name": "me",
10050
+ "description": "My Weibo profile info",
10051
+ "strategy": "cookie",
10052
+ "browser": true,
10053
+ "args": [],
10054
+ "type": "ts",
10055
+ "modulePath": "weibo/me.js",
10056
+ "domain": "weibo.com",
10057
+ "columns": [
10058
+ "screen_name",
10059
+ "uid",
10060
+ "followers",
10061
+ "following",
10062
+ "statuses",
10063
+ "verified",
10064
+ "location"
10065
+ ]
10066
+ },
10067
+ {
10068
+ "site": "weibo",
10069
+ "name": "post",
10070
+ "description": "Get a single Weibo post",
10071
+ "strategy": "cookie",
10072
+ "browser": true,
10073
+ "args": [
10074
+ {
10075
+ "name": "id",
10076
+ "type": "str",
10077
+ "required": true,
10078
+ "positional": true,
10079
+ "help": "Post ID (numeric idstr or mblogid from URL)"
10080
+ }
10081
+ ],
10082
+ "type": "ts",
10083
+ "modulePath": "weibo/post.js",
10084
+ "domain": "weibo.com",
10085
+ "columns": [
10086
+ "field",
10087
+ "value"
10088
+ ]
10089
+ },
9170
10090
  {
9171
10091
  "site": "weibo",
9172
10092
  "name": "search",
@@ -9200,6 +10120,36 @@
9200
10120
  "url"
9201
10121
  ]
9202
10122
  },
10123
+ {
10124
+ "site": "weibo",
10125
+ "name": "user",
10126
+ "description": "Get Weibo user profile",
10127
+ "strategy": "cookie",
10128
+ "browser": true,
10129
+ "args": [
10130
+ {
10131
+ "name": "id",
10132
+ "type": "str",
10133
+ "required": true,
10134
+ "positional": true,
10135
+ "help": "User ID (numeric uid) or screen name"
10136
+ }
10137
+ ],
10138
+ "type": "ts",
10139
+ "modulePath": "weibo/user.js",
10140
+ "domain": "weibo.com",
10141
+ "columns": [
10142
+ "screen_name",
10143
+ "uid",
10144
+ "followers",
10145
+ "following",
10146
+ "statuses",
10147
+ "verified",
10148
+ "description",
10149
+ "location",
10150
+ "url"
10151
+ ]
10152
+ },
9203
10153
  {
9204
10154
  "site": "weixin",
9205
10155
  "name": "download",
@@ -9410,7 +10360,8 @@
9410
10360
  "rank",
9411
10361
  "title",
9412
10362
  "author",
9413
- "bookId"
10363
+ "bookId",
10364
+ "url"
9414
10365
  ]
9415
10366
  },
9416
10367
  {
@@ -10149,6 +11100,56 @@
10149
11100
  ],
10150
11101
  "type": "yaml"
10151
11102
  },
11103
+ {
11104
+ "site": "xueqiu",
11105
+ "name": "fund-holdings",
11106
+ "description": "获取蛋卷基金持仓明细(可用 --account 按子账户过滤)",
11107
+ "strategy": "cookie",
11108
+ "browser": true,
11109
+ "args": [
11110
+ {
11111
+ "name": "account",
11112
+ "type": "str",
11113
+ "default": "",
11114
+ "required": false,
11115
+ "help": "按子账户名称或 ID 过滤"
11116
+ }
11117
+ ],
11118
+ "type": "ts",
11119
+ "modulePath": "xueqiu/fund-holdings.js",
11120
+ "domain": "danjuanfunds.com",
11121
+ "columns": [
11122
+ "accountName",
11123
+ "fdCode",
11124
+ "fdName",
11125
+ "marketValue",
11126
+ "volume",
11127
+ "dailyGain",
11128
+ "holdGain",
11129
+ "holdGainRate",
11130
+ "marketPercent"
11131
+ ],
11132
+ "navigateBefore": "https://danjuanfunds.com/my-money"
11133
+ },
11134
+ {
11135
+ "site": "xueqiu",
11136
+ "name": "fund-snapshot",
11137
+ "description": "获取蛋卷基金快照(总资产、子账户、持仓,推荐 -f json 输出)",
11138
+ "strategy": "cookie",
11139
+ "browser": true,
11140
+ "args": [],
11141
+ "type": "ts",
11142
+ "modulePath": "xueqiu/fund-snapshot.js",
11143
+ "domain": "danjuanfunds.com",
11144
+ "columns": [
11145
+ "asOf",
11146
+ "totalAssetAmount",
11147
+ "totalFundMarketValue",
11148
+ "accountCount",
11149
+ "holdingCount"
11150
+ ],
11151
+ "navigateBefore": "https://danjuanfunds.com/my-money"
11152
+ },
10152
11153
  {
10153
11154
  "site": "xueqiu",
10154
11155
  "name": "hot-stock",
@@ -10276,7 +11277,8 @@
10276
11277
  "name",
10277
11278
  "exchange",
10278
11279
  "price",
10279
- "changePercent"
11280
+ "changePercent",
11281
+ "url"
10280
11282
  ],
10281
11283
  "pipeline": [
10282
11284
  {
@@ -10291,7 +11293,8 @@
10291
11293
  "name": "${{ item.name }}",
10292
11294
  "exchange": "${{ item.exchange }}",
10293
11295
  "price": "${{ item.price }}",
10294
- "changePercent": "${{ item.changePercent }}"
11296
+ "changePercent": "${{ item.changePercent }}",
11297
+ "url": "${{ item.url }}"
10295
11298
  }
10296
11299
  },
10297
11300
  {
@@ -10980,6 +11983,70 @@
10980
11983
  "url"
10981
11984
  ]
10982
11985
  },
11986
+ {
11987
+ "site": "youtube",
11988
+ "name": "channel",
11989
+ "description": "Get YouTube channel info and recent videos",
11990
+ "strategy": "cookie",
11991
+ "browser": true,
11992
+ "args": [
11993
+ {
11994
+ "name": "id",
11995
+ "type": "str",
11996
+ "required": true,
11997
+ "positional": true,
11998
+ "help": "Channel ID (UCxxxx) or handle (@name)"
11999
+ },
12000
+ {
12001
+ "name": "limit",
12002
+ "type": "int",
12003
+ "default": 10,
12004
+ "required": false,
12005
+ "help": "Max recent videos (max 30)"
12006
+ }
12007
+ ],
12008
+ "type": "ts",
12009
+ "modulePath": "youtube/channel.js",
12010
+ "domain": "www.youtube.com",
12011
+ "columns": [
12012
+ "field",
12013
+ "value"
12014
+ ]
12015
+ },
12016
+ {
12017
+ "site": "youtube",
12018
+ "name": "comments",
12019
+ "description": "Get YouTube video comments",
12020
+ "strategy": "cookie",
12021
+ "browser": true,
12022
+ "args": [
12023
+ {
12024
+ "name": "url",
12025
+ "type": "str",
12026
+ "required": true,
12027
+ "positional": true,
12028
+ "help": "YouTube video URL or video ID"
12029
+ },
12030
+ {
12031
+ "name": "limit",
12032
+ "type": "int",
12033
+ "default": 20,
12034
+ "required": false,
12035
+ "help": "Max comments (max 100)"
12036
+ }
12037
+ ],
12038
+ "type": "ts",
12039
+ "modulePath": "youtube/comments.js",
12040
+ "domain": "www.youtube.com",
12041
+ "columns": [
12042
+ "rank",
12043
+ "author",
12044
+ "text",
12045
+ "likes",
12046
+ "replies",
12047
+ "time"
12048
+ ]
12049
+ },
10983
12050
  {
10984
12051
  "site": "youtube",
10985
12052
  "name": "search",
@@ -11212,7 +12279,8 @@
11212
12279
  "title",
11213
12280
  "type",
11214
12281
  "author",
11215
- "votes"
12282
+ "votes",
12283
+ "url"
11216
12284
  ],
11217
12285
  "pipeline": [
11218
12286
  {
@@ -11227,7 +12295,8 @@
11227
12295
  "title": "${{ item.title }}",
11228
12296
  "type": "${{ item.type }}",
11229
12297
  "author": "${{ item.author }}",
11230
- "votes": "${{ item.votes }}"
12298
+ "votes": "${{ item.votes }}",
12299
+ "url": "${{ item.url }}"
11231
12300
  }
11232
12301
  },
11233
12302
  {