@agentrhq/webcmd 0.1.2 → 0.2.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 (956) hide show
  1. package/README.md +196 -219
  2. package/cli-manifest.json +16205 -34869
  3. package/clis/_atlassian/shared.js +1 -1
  4. package/clis/booking/search.js +4 -4
  5. package/clis/chatgpt/ask.js +2 -2
  6. package/clis/chatgpt/utils.js +41 -42
  7. package/clis/chatgpt/utils.test.js +23 -23
  8. package/clis/chatgpt-app/ax.js +5 -5
  9. package/clis/chatgpt-app/ax.test.js +8 -8
  10. package/clis/chatgpt-app/new.js +2 -2
  11. package/clis/codex/sidebar.js +1 -1
  12. package/clis/codex/sidebar.test.js +12 -12
  13. package/clis/coingecko/top.js +3 -3
  14. package/clis/dblp/dblp.test.js +1 -1
  15. package/clis/discord-app/search.js +1 -1
  16. package/clis/discord-app/utils.js +6 -6
  17. package/clis/facebook/__fixtures__/notifications-page.html +6 -6
  18. package/clis/facebook/add-friend.js +2 -2
  19. package/clis/facebook/feed.js +18 -18
  20. package/clis/facebook/friends.js +4 -4
  21. package/clis/facebook/groups.js +3 -3
  22. package/clis/facebook/join-group.js +2 -2
  23. package/clis/facebook/marketplace-inbox.js +3 -3
  24. package/clis/facebook/marketplace-listings.js +1 -1
  25. package/clis/facebook/notifications.js +14 -15
  26. package/clis/facebook/notifications.test.js +28 -29
  27. package/clis/gemini/ask.test.js +12 -12
  28. package/clis/gemini/deep-research-result.js +2 -2
  29. package/clis/gemini/deep-research-result.test.js +2 -2
  30. package/clis/gemini/deep-research.js +2 -2
  31. package/clis/gemini/deep-research.test.js +1 -1
  32. package/clis/gemini/models.js +11 -11
  33. package/clis/gemini/models.test.js +1 -1
  34. package/clis/gemini/reply-state.test.js +89 -89
  35. package/clis/gemini/utils.js +41 -41
  36. package/clis/gemini/utils.test.js +30 -30
  37. package/clis/geogebra/utils.js +1 -1
  38. package/clis/google-scholar/search.js +3 -3
  39. package/clis/grok/delete.js +1 -1
  40. package/clis/grok/export-all.js +2 -2
  41. package/clis/grok/export.js +2 -2
  42. package/clis/grok/pin.js +3 -3
  43. package/clis/grok/utils.js +12 -12
  44. package/clis/grok/utils.test.js +2 -2
  45. package/clis/indeed/indeed.test.js +3 -3
  46. package/clis/indeed/utils.js +1 -1
  47. package/clis/instagram/post.js +19 -19
  48. package/clis/instagram/post.test.js +2 -2
  49. package/clis/instagram/reel.js +6 -6
  50. package/clis/linkedin/connect.js +3 -3
  51. package/clis/linkedin/people-search.js +4 -4
  52. package/clis/linkedin/profile-experience.js +6 -6
  53. package/clis/linkedin/profile-experience.test.js +10 -10
  54. package/clis/linkedin/profile-read.js +1 -1
  55. package/clis/linkedin/safe-send.js +1 -1
  56. package/clis/linkedin/search.js +1 -1
  57. package/clis/linkedin/shared.js +2 -2
  58. package/clis/linkedin/timeline.js +5 -5
  59. package/clis/manus/manus.test.js +2 -2
  60. package/clis/medium/feed.js +3 -3
  61. package/clis/medium/search.js +3 -3
  62. package/clis/medium/user.js +3 -3
  63. package/clis/notebooklm/auth.js +2 -2
  64. package/clis/notebooklm/note-list.test.js +4 -4
  65. package/clis/notebooklm/notes-get.test.js +8 -8
  66. package/clis/notebooklm/source-fulltext.test.js +11 -11
  67. package/clis/notebooklm/utils.js +28 -28
  68. package/clis/notebooklm/utils.test.js +10 -10
  69. package/clis/pixiv/search.test.js +3 -3
  70. package/clis/qoder/quest.js +2 -2
  71. package/clis/reddit/home.js +2 -2
  72. package/clis/reddit/hot.js +1 -1
  73. package/clis/reddit/read.js +2 -2
  74. package/clis/reddit/read.test.js +1 -1
  75. package/clis/reddit/reply.js +2 -2
  76. package/clis/reddit/whoami.js +2 -2
  77. package/clis/reuters/article-detail.js +1 -1
  78. package/clis/reuters/search.js +1 -1
  79. package/clis/slock/attachment-upload.test.js +1 -1
  80. package/clis/slock/task-convert.js +1 -1
  81. package/clis/substack/feed.js +3 -3
  82. package/clis/substack/publication.js +3 -3
  83. package/clis/substack/search.js +4 -4
  84. package/clis/tiktok/comment.js +2 -2
  85. package/clis/tiktok/follow.js +4 -4
  86. package/clis/tiktok/like.js +1 -1
  87. package/clis/tiktok/save.js +1 -1
  88. package/clis/tiktok/unfollow.js +4 -4
  89. package/clis/tiktok/unlike.js +1 -1
  90. package/clis/tiktok/unsave.js +2 -2
  91. package/clis/tiktok/write-refactor.test.js +5 -5
  92. package/clis/twitter/accept.js +3 -3
  93. package/clis/twitter/delete.js +14 -6
  94. package/clis/twitter/delete.test.js +74 -1
  95. package/clis/twitter/followers.js +1 -1
  96. package/clis/twitter/list-remove-core.js +2 -2
  97. package/clis/twitter/list-tweets.test.js +3 -3
  98. package/clis/twitter/lists.js +6 -6
  99. package/clis/twitter/lists.test.js +2 -2
  100. package/clis/twitter/reply-dm.js +1 -1
  101. package/clis/twitter/shared.test.js +4 -5
  102. package/clis/twitter/timeline.js +3 -1
  103. package/clis/twitter/timeline.test.js +4 -0
  104. package/clis/twitter/trending.js +1 -1
  105. package/clis/twitter/utils.js +1 -1
  106. package/clis/web/read.js +1 -1
  107. package/clis/web/read.test.js +2 -2
  108. package/clis/yahoo-finance/quote.js +1 -1
  109. package/clis/youtube/history.js +4 -4
  110. package/clis/youtube/transcript-group.js +1 -1
  111. package/clis/youtube/transcript-group.test.js +5 -5
  112. package/clis/youtube/transcript.js +5 -5
  113. package/clis/youtube/video.js +4 -4
  114. package/clis/youtube/video.test.js +6 -6
  115. package/dist/src/browser/analyze.test.js +13 -13
  116. package/dist/src/browser/bridge-readiness.d.ts +1 -1
  117. package/dist/src/browser/bridge-readiness.test.js +1 -1
  118. package/dist/src/browser/bridge.d.ts +1 -0
  119. package/dist/src/browser/bridge.js +6 -4
  120. package/dist/src/browser/cdp.d.ts +1 -0
  121. package/dist/src/browser/daemon-client.d.ts +2 -0
  122. package/dist/src/browser/daemon-client.js +108 -51
  123. package/dist/src/browser/daemon-client.test.js +135 -47
  124. package/dist/src/browser/daemon-transport.js +3 -19
  125. package/dist/src/browser/errors.js +11 -0
  126. package/dist/src/browser/page.d.ts +2 -1
  127. package/dist/src/browser/page.js +5 -1
  128. package/dist/src/browser/profile.d.ts +9 -0
  129. package/dist/src/browser/profile.js +18 -7
  130. package/dist/src/browser/profile.test.js +44 -0
  131. package/dist/src/browser/protocol.d.ts +3 -0
  132. package/dist/src/browser/runtime/local-cloak/actions.js +24 -10
  133. package/dist/src/browser/runtime/local-cloak/session-manager.d.ts +1 -0
  134. package/dist/src/browser/runtime/local-cloak/session-manager.js +3 -0
  135. package/dist/src/browser/runtime/local-cloak/session-manager.test.js +87 -0
  136. package/dist/src/browser.test.js +2 -2
  137. package/dist/src/cli-argv-preprocess.d.ts +2 -2
  138. package/dist/src/cli-argv-preprocess.js +2 -2
  139. package/dist/src/cli-argv-preprocess.test.js +35 -35
  140. package/dist/src/cli.js +24 -19
  141. package/dist/src/cli.test.js +59 -59
  142. package/dist/src/commanderAdapter.test.js +19 -19
  143. package/dist/src/commands/daemon.test.js +13 -13
  144. package/dist/src/constants.d.ts +2 -3
  145. package/dist/src/constants.js +3 -10
  146. package/dist/src/convention-audit.js +1 -1
  147. package/dist/src/daemon/server.js +28 -23
  148. package/dist/src/daemon/server.test.js +52 -0
  149. package/dist/src/daemon-utils.d.ts +1 -0
  150. package/dist/src/daemon-utils.js +9 -0
  151. package/dist/src/daemon.js +1 -5
  152. package/dist/src/daemon.test.js +10 -1
  153. package/dist/src/doctor.js +19 -1
  154. package/dist/src/doctor.test.js +38 -4
  155. package/dist/src/download/article-download.d.ts +3 -3
  156. package/dist/src/download/article-download.js +7 -7
  157. package/dist/src/download/article-download.test.js +6 -6
  158. package/dist/src/download/index.js +1 -1
  159. package/dist/src/download/index.test.js +1 -2
  160. package/dist/src/download/media-download.d.ts +1 -1
  161. package/dist/src/download/media-download.js +1 -1
  162. package/dist/src/electron-apps.js +0 -8
  163. package/dist/src/electron-apps.test.js +2 -11
  164. package/dist/src/errors.test.js +9 -9
  165. package/dist/src/execution.js +7 -3
  166. package/dist/src/execution.test.js +12 -0
  167. package/dist/src/external-clis.yaml +0 -37
  168. package/dist/src/external.d.ts +1 -1
  169. package/dist/src/external.js +19 -1
  170. package/dist/src/external.test.js +39 -18
  171. package/dist/src/generate-release-notes-cli.test.js +140 -0
  172. package/dist/src/help.d.ts +3 -3
  173. package/dist/src/help.test.js +8 -8
  174. package/dist/src/main.js +1 -6
  175. package/dist/src/manifest-types.d.ts +1 -1
  176. package/dist/src/node-network.test.js +5 -5
  177. package/dist/src/output.js +1 -1
  178. package/dist/src/pipeline/steps/download.test.js +3 -3
  179. package/dist/src/registry.test.js +2 -2
  180. package/dist/src/release-notes.d.ts +38 -0
  181. package/dist/src/release-notes.js +99 -0
  182. package/dist/src/release-notes.test.d.ts +1 -0
  183. package/dist/src/release-notes.test.js +61 -0
  184. package/dist/src/runtime-identity.test.js +0 -8
  185. package/dist/src/runtime.d.ts +2 -0
  186. package/dist/src/runtime.js +1 -0
  187. package/dist/src/serialization.test.js +7 -7
  188. package/dist/src/snapshotFormatter.js +3 -5
  189. package/dist/src/snapshotFormatter.test.d.ts +1 -1
  190. package/dist/src/snapshotFormatter.test.js +50 -50
  191. package/dist/src/tui.js +1 -1
  192. package/package.json +5 -2
  193. package/scripts/generate-release-notes.ts +234 -0
  194. package/scripts/postinstall.js +1 -1
  195. package/scripts/silent-column-drop-baseline.json +0 -498
  196. package/scripts/typed-error-lint-baseline.json +0 -464
  197. package/skills/webcmd-adapter-author/SKILL.md +216 -213
  198. package/skills/webcmd-adapter-author/references/adapter-template.md +206 -399
  199. package/skills/webcmd-adapter-author/references/api-discovery.md +111 -220
  200. package/skills/webcmd-adapter-author/references/coverage-matrix.md +34 -68
  201. package/skills/webcmd-adapter-author/references/field-conventions.md +84 -167
  202. package/skills/webcmd-adapter-author/references/field-decode-playbook.md +60 -146
  203. package/skills/webcmd-adapter-author/references/jsdom-fixture-pattern.md +111 -178
  204. package/skills/webcmd-adapter-author/references/output-design.md +47 -125
  205. package/skills/webcmd-adapter-author/references/site-memory.md +116 -166
  206. package/skills/webcmd-adapter-author/references/site-recon.md +74 -78
  207. package/skills/webcmd-adapter-author/references/strategy-selection.md +80 -124
  208. package/skills/webcmd-adapter-author/references/success-rate-pitfalls.md +80 -105
  209. package/skills/webcmd-adapter-author/references/typed-errors.md +87 -178
  210. package/skills/webcmd-autofix/SKILL.md +136 -143
  211. package/skills/webcmd-sitemap-author/SKILL.md +58 -67
  212. package/skills/webcmd-sitemap-author/references/sitemap-schema.md +354 -494
  213. package/skills/webcmd-usage/SKILL.md +106 -97
  214. package/clis/12306/auth.js +0 -59
  215. package/clis/12306/me.js +0 -73
  216. package/clis/12306/orders.js +0 -96
  217. package/clis/12306/passengers.js +0 -90
  218. package/clis/12306/price.js +0 -166
  219. package/clis/12306/stations.js +0 -66
  220. package/clis/12306/train.js +0 -91
  221. package/clis/12306/trains.js +0 -166
  222. package/clis/12306/utils.js +0 -272
  223. package/clis/12306/utils.test.js +0 -424
  224. package/clis/1688/assets.js +0 -205
  225. package/clis/1688/assets.test.js +0 -39
  226. package/clis/1688/auth.js +0 -46
  227. package/clis/1688/download.js +0 -77
  228. package/clis/1688/download.test.js +0 -31
  229. package/clis/1688/item.js +0 -188
  230. package/clis/1688/item.test.js +0 -67
  231. package/clis/1688/search.js +0 -310
  232. package/clis/1688/search.test.js +0 -75
  233. package/clis/1688/shared.js +0 -557
  234. package/clis/1688/shared.test.js +0 -57
  235. package/clis/1688/store.js +0 -227
  236. package/clis/1688/store.test.js +0 -62
  237. package/clis/1point3acres/auth.js +0 -52
  238. package/clis/1point3acres/digest.js +0 -35
  239. package/clis/1point3acres/forum.js +0 -51
  240. package/clis/1point3acres/forums.js +0 -44
  241. package/clis/1point3acres/hot.js +0 -35
  242. package/clis/1point3acres/latest.js +0 -35
  243. package/clis/1point3acres/notifications.js +0 -64
  244. package/clis/1point3acres/search.js +0 -71
  245. package/clis/1point3acres/thread.js +0 -117
  246. package/clis/1point3acres/user.js +0 -77
  247. package/clis/1point3acres/utils.js +0 -247
  248. package/clis/36kr/article.js +0 -66
  249. package/clis/36kr/article.test.js +0 -46
  250. package/clis/36kr/hot.js +0 -87
  251. package/clis/36kr/hot.test.js +0 -15
  252. package/clis/36kr/news.js +0 -52
  253. package/clis/36kr/news.test.js +0 -85
  254. package/clis/36kr/search.js +0 -79
  255. package/clis/51job/company.js +0 -126
  256. package/clis/51job/detail.js +0 -109
  257. package/clis/51job/hot.js +0 -56
  258. package/clis/51job/search.js +0 -80
  259. package/clis/51job/utils.js +0 -302
  260. package/clis/51job/utils.test.js +0 -69
  261. package/clis/aibase/news.js +0 -110
  262. package/clis/aibase/news.test.js +0 -59
  263. package/clis/autohome/__fixtures__/catalog.html +0 -11
  264. package/clis/autohome/__fixtures__/koubei.json +0 -116
  265. package/clis/autohome/autohome.test.js +0 -115
  266. package/clis/autohome/brand.js +0 -108
  267. package/clis/autohome/score.js +0 -103
  268. package/clis/autohome/utils.js +0 -157
  269. package/clis/baidu-scholar/search.js +0 -87
  270. package/clis/baidu-scholar/search.test.js +0 -23
  271. package/clis/bilibili/auth.js +0 -36
  272. package/clis/bilibili/comment.js +0 -107
  273. package/clis/bilibili/comment.test.js +0 -153
  274. package/clis/bilibili/comments.js +0 -136
  275. package/clis/bilibili/comments.test.js +0 -142
  276. package/clis/bilibili/download.js +0 -178
  277. package/clis/bilibili/download.test.js +0 -173
  278. package/clis/bilibili/dynamic.js +0 -34
  279. package/clis/bilibili/dynamic.test.js +0 -68
  280. package/clis/bilibili/favorite.js +0 -47
  281. package/clis/bilibili/feed.js +0 -220
  282. package/clis/bilibili/follow.js +0 -140
  283. package/clis/bilibili/follow.test.js +0 -203
  284. package/clis/bilibili/following.js +0 -44
  285. package/clis/bilibili/history.js +0 -45
  286. package/clis/bilibili/hot.js +0 -40
  287. package/clis/bilibili/hot.test.js +0 -17
  288. package/clis/bilibili/me.js +0 -13
  289. package/clis/bilibili/ranking.js +0 -25
  290. package/clis/bilibili/search.js +0 -24
  291. package/clis/bilibili/subtitle.js +0 -141
  292. package/clis/bilibili/subtitle.test.js +0 -240
  293. package/clis/bilibili/summary.js +0 -167
  294. package/clis/bilibili/summary.test.js +0 -210
  295. package/clis/bilibili/unfollow.js +0 -121
  296. package/clis/bilibili/user-videos.js +0 -39
  297. package/clis/bilibili/utils.js +0 -273
  298. package/clis/bilibili/utils.test.js +0 -97
  299. package/clis/bilibili/video.js +0 -155
  300. package/clis/bilibili/video.test.js +0 -308
  301. package/clis/boss/auth.js +0 -47
  302. package/clis/boss/batchgreet.js +0 -61
  303. package/clis/boss/chatlist.js +0 -116
  304. package/clis/boss/chatlist.test.js +0 -211
  305. package/clis/boss/chatmsg.js +0 -117
  306. package/clis/boss/chatmsg.test.js +0 -230
  307. package/clis/boss/detail.js +0 -63
  308. package/clis/boss/exchange.js +0 -46
  309. package/clis/boss/greet.js +0 -49
  310. package/clis/boss/invite.js +0 -64
  311. package/clis/boss/joblist.js +0 -31
  312. package/clis/boss/mark.js +0 -70
  313. package/clis/boss/recommend.js +0 -45
  314. package/clis/boss/resume.js +0 -150
  315. package/clis/boss/search.js +0 -197
  316. package/clis/boss/search.test.js +0 -78
  317. package/clis/boss/send.js +0 -44
  318. package/clis/boss/stats.js +0 -66
  319. package/clis/boss/utils.js +0 -468
  320. package/clis/boss/utils.test.js +0 -34
  321. package/clis/chaoxing/assignments.js +0 -76
  322. package/clis/chaoxing/auth.js +0 -54
  323. package/clis/chaoxing/exams.js +0 -75
  324. package/clis/chaoxing/utils.js +0 -223
  325. package/clis/chaoxing/utils.test.js +0 -45
  326. package/clis/cnki/search.js +0 -61
  327. package/clis/cnki/search.test.js +0 -18
  328. package/clis/ctrip/auth.js +0 -50
  329. package/clis/ctrip/ctrip.test.js +0 -719
  330. package/clis/ctrip/flight.js +0 -136
  331. package/clis/ctrip/hotel-search.js +0 -132
  332. package/clis/ctrip/hotel-suggest.js +0 -45
  333. package/clis/ctrip/search.js +0 -41
  334. package/clis/ctrip/utils.js +0 -473
  335. package/clis/deepseek/ask.js +0 -158
  336. package/clis/deepseek/ask.test.js +0 -399
  337. package/clis/deepseek/auth.js +0 -54
  338. package/clis/deepseek/detail.js +0 -46
  339. package/clis/deepseek/detail.test.js +0 -81
  340. package/clis/deepseek/history.js +0 -27
  341. package/clis/deepseek/new.js +0 -33
  342. package/clis/deepseek/read.js +0 -25
  343. package/clis/deepseek/send.js +0 -140
  344. package/clis/deepseek/send.test.js +0 -107
  345. package/clis/deepseek/status.js +0 -26
  346. package/clis/deepseek/utils.js +0 -487
  347. package/clis/deepseek/utils.test.js +0 -370
  348. package/clis/dianping/__fixtures__/search.html +0 -168
  349. package/clis/dianping/__fixtures__/shop.html +0 -6
  350. package/clis/dianping/auth.js +0 -49
  351. package/clis/dianping/cityResolver.js +0 -185
  352. package/clis/dianping/dianping.test.js +0 -578
  353. package/clis/dianping/search.js +0 -157
  354. package/clis/dianping/shop.js +0 -173
  355. package/clis/dianping/utils.js +0 -157
  356. package/clis/dongchedi/__fixtures__/search.json +0 -60
  357. package/clis/dongchedi/__fixtures__/series-detail.json +0 -911
  358. package/clis/dongchedi/__fixtures__/series-score.json +0 -1396
  359. package/clis/dongchedi/dongchedi.test.js +0 -191
  360. package/clis/dongchedi/koubei.js +0 -85
  361. package/clis/dongchedi/models.js +0 -91
  362. package/clis/dongchedi/score.js +0 -83
  363. package/clis/dongchedi/search.js +0 -83
  364. package/clis/dongchedi/series.js +0 -87
  365. package/clis/dongchedi/specs.js +0 -115
  366. package/clis/dongchedi/utils.js +0 -180
  367. package/clis/douban/auth.js +0 -50
  368. package/clis/douban/book-hot.js +0 -15
  369. package/clis/douban/download.js +0 -68
  370. package/clis/douban/download.test.js +0 -170
  371. package/clis/douban/marks.js +0 -116
  372. package/clis/douban/movie-hot.js +0 -15
  373. package/clis/douban/movie-hot.test.js +0 -14
  374. package/clis/douban/photos.js +0 -35
  375. package/clis/douban/reviews.js +0 -107
  376. package/clis/douban/search.js +0 -18
  377. package/clis/douban/search.test.js +0 -11
  378. package/clis/douban/subject.js +0 -46
  379. package/clis/douban/subject.test.js +0 -11
  380. package/clis/douban/top250.js +0 -68
  381. package/clis/douban/utils.js +0 -657
  382. package/clis/douban/utils.test.js +0 -488
  383. package/clis/doubao/ask.js +0 -40
  384. package/clis/doubao/auth.js +0 -66
  385. package/clis/doubao/detail.js +0 -35
  386. package/clis/doubao/detail.test.js +0 -42
  387. package/clis/doubao/history.js +0 -30
  388. package/clis/doubao/history.test.js +0 -37
  389. package/clis/doubao/meeting-summary.js +0 -41
  390. package/clis/doubao/meeting-transcript.js +0 -38
  391. package/clis/doubao/new.js +0 -22
  392. package/clis/doubao/read.js +0 -21
  393. package/clis/doubao/send.js +0 -24
  394. package/clis/doubao/status.js +0 -26
  395. package/clis/doubao/utils.js +0 -1156
  396. package/clis/doubao/utils.test.js +0 -396
  397. package/clis/doubao-app/ask.js +0 -54
  398. package/clis/doubao-app/dump.js +0 -25
  399. package/clis/doubao-app/new.js +0 -21
  400. package/clis/doubao-app/read.js +0 -19
  401. package/clis/doubao-app/screenshot.js +0 -19
  402. package/clis/doubao-app/send.js +0 -28
  403. package/clis/doubao-app/status.js +0 -17
  404. package/clis/doubao-app/utils.js +0 -110
  405. package/clis/douyin/_shared/browser-fetch.js +0 -66
  406. package/clis/douyin/_shared/browser-fetch.test.js +0 -64
  407. package/clis/douyin/_shared/creation-id.js +0 -5
  408. package/clis/douyin/_shared/creation-id.test.js +0 -22
  409. package/clis/douyin/_shared/evaluate-result.js +0 -16
  410. package/clis/douyin/_shared/imagex-upload.js +0 -53
  411. package/clis/douyin/_shared/imagex-upload.test.js +0 -87
  412. package/clis/douyin/_shared/public-api.js +0 -29
  413. package/clis/douyin/_shared/sts2.js +0 -21
  414. package/clis/douyin/_shared/sts2.test.js +0 -27
  415. package/clis/douyin/_shared/text-extra.js +0 -15
  416. package/clis/douyin/_shared/text-extra.test.js +0 -37
  417. package/clis/douyin/_shared/timing.js +0 -22
  418. package/clis/douyin/_shared/timing.test.js +0 -28
  419. package/clis/douyin/_shared/tos-upload-short-read.test.js +0 -83
  420. package/clis/douyin/_shared/tos-upload.js +0 -331
  421. package/clis/douyin/_shared/tos-upload.test.js +0 -229
  422. package/clis/douyin/_shared/transcode.js +0 -45
  423. package/clis/douyin/_shared/transcode.test.js +0 -91
  424. package/clis/douyin/_shared/vod-upload.js +0 -212
  425. package/clis/douyin/_shared/vod-upload.test.js +0 -38
  426. package/clis/douyin/activities.js +0 -23
  427. package/clis/douyin/activities.test.js +0 -55
  428. package/clis/douyin/auth.js +0 -39
  429. package/clis/douyin/collections.js +0 -23
  430. package/clis/douyin/collections.test.js +0 -45
  431. package/clis/douyin/delete.js +0 -152
  432. package/clis/douyin/delete.test.js +0 -100
  433. package/clis/douyin/draft.js +0 -355
  434. package/clis/douyin/draft.test.js +0 -335
  435. package/clis/douyin/drafts.js +0 -24
  436. package/clis/douyin/drafts.test.js +0 -11
  437. package/clis/douyin/hashtag.js +0 -114
  438. package/clis/douyin/hashtag.test.js +0 -171
  439. package/clis/douyin/location.js +0 -25
  440. package/clis/douyin/location.test.js +0 -23
  441. package/clis/douyin/profile.js +0 -29
  442. package/clis/douyin/profile.test.js +0 -46
  443. package/clis/douyin/publish-upload-id.test.js +0 -206
  444. package/clis/douyin/publish.js +0 -341
  445. package/clis/douyin/publish.test.js +0 -38
  446. package/clis/douyin/search.js +0 -308
  447. package/clis/douyin/search.test.js +0 -307
  448. package/clis/douyin/stats.js +0 -28
  449. package/clis/douyin/stats.test.js +0 -22
  450. package/clis/douyin/update.js +0 -32
  451. package/clis/douyin/update.test.js +0 -11
  452. package/clis/douyin/user-videos.js +0 -82
  453. package/clis/douyin/user-videos.test.js +0 -151
  454. package/clis/douyin/videos.js +0 -52
  455. package/clis/douyin/videos.test.js +0 -54
  456. package/clis/eastmoney/_secid.js +0 -78
  457. package/clis/eastmoney/announcement.js +0 -53
  458. package/clis/eastmoney/convertible.js +0 -74
  459. package/clis/eastmoney/etf.js +0 -66
  460. package/clis/eastmoney/holders.js +0 -79
  461. package/clis/eastmoney/hot-rank.js +0 -51
  462. package/clis/eastmoney/hot-rank.test.js +0 -59
  463. package/clis/eastmoney/index-board.js +0 -97
  464. package/clis/eastmoney/kline.js +0 -88
  465. package/clis/eastmoney/kuaixun.js +0 -55
  466. package/clis/eastmoney/longhu.js +0 -68
  467. package/clis/eastmoney/money-flow.js +0 -79
  468. package/clis/eastmoney/northbound.js +0 -58
  469. package/clis/eastmoney/quote.js +0 -108
  470. package/clis/eastmoney/rank.js +0 -95
  471. package/clis/eastmoney/sectors.js +0 -77
  472. package/clis/flomo/auth.js +0 -55
  473. package/clis/flomo/memos.js +0 -228
  474. package/clis/flomo/memos.test.js +0 -144
  475. package/clis/gitee/auth.js +0 -41
  476. package/clis/gitee/index.js +0 -3
  477. package/clis/gitee/search.js +0 -137
  478. package/clis/gitee/search.test.js +0 -65
  479. package/clis/gitee/trending.js +0 -568
  480. package/clis/gitee/user.js +0 -200
  481. package/clis/gitee/user.test.js +0 -63
  482. package/clis/gov-law/commands.test.js +0 -39
  483. package/clis/gov-law/recent.js +0 -22
  484. package/clis/gov-law/search.js +0 -41
  485. package/clis/gov-law/shared.js +0 -51
  486. package/clis/gov-policy/__fixtures__/recent.html +0 -16
  487. package/clis/gov-policy/__fixtures__/search.html +0 -41
  488. package/clis/gov-policy/gov-policy.test.js +0 -224
  489. package/clis/gov-policy/recent.js +0 -90
  490. package/clis/gov-policy/search.js +0 -91
  491. package/clis/gov-policy/utils.js +0 -54
  492. package/clis/guazi/__fixtures__/detail.html +0 -7
  493. package/clis/guazi/__fixtures__/list.html +0 -5
  494. package/clis/guazi/browse.js +0 -95
  495. package/clis/guazi/car.js +0 -110
  496. package/clis/guazi/guazi.test.js +0 -126
  497. package/clis/guazi/utils.js +0 -133
  498. package/clis/huodongxing/events.js +0 -322
  499. package/clis/huodongxing/events.test.js +0 -296
  500. package/clis/hupu/__fixtures__/hot-home.html +0 -64
  501. package/clis/hupu/auth.js +0 -47
  502. package/clis/hupu/detail.js +0 -72
  503. package/clis/hupu/hot.js +0 -163
  504. package/clis/hupu/hot.test.js +0 -224
  505. package/clis/hupu/like.js +0 -76
  506. package/clis/hupu/mentions.js +0 -160
  507. package/clis/hupu/reply.js +0 -72
  508. package/clis/hupu/search.js +0 -60
  509. package/clis/hupu/unlike.js +0 -76
  510. package/clis/hupu/utils.js +0 -319
  511. package/clis/jd/add-cart.js +0 -72
  512. package/clis/jd/auth.js +0 -46
  513. package/clis/jd/cart.js +0 -80
  514. package/clis/jd/commands.test.js +0 -41
  515. package/clis/jd/detail.js +0 -63
  516. package/clis/jd/item.js +0 -730
  517. package/clis/jd/item.test.js +0 -354
  518. package/clis/jd/item.test.ts +0 -517
  519. package/clis/jd/reviews.js +0 -55
  520. package/clis/jd/search.js +0 -66
  521. package/clis/jianyu/auth.js +0 -62
  522. package/clis/jianyu/detail.js +0 -21
  523. package/clis/jianyu/search.js +0 -634
  524. package/clis/jianyu/search.test.js +0 -153
  525. package/clis/jianyu/shared/china-bid-search.js +0 -165
  526. package/clis/jianyu/shared/procurement-contract.js +0 -324
  527. package/clis/jianyu/shared/procurement-contract.test.js +0 -72
  528. package/clis/jianyu/shared/procurement-detail.js +0 -107
  529. package/clis/jianyu/shared/procurement-detail.test.js +0 -84
  530. package/clis/jike/auth.js +0 -48
  531. package/clis/jike/comment.js +0 -107
  532. package/clis/jike/create.js +0 -106
  533. package/clis/jike/feed.js +0 -68
  534. package/clis/jike/like.js +0 -61
  535. package/clis/jike/notifications.js +0 -169
  536. package/clis/jike/post.js +0 -72
  537. package/clis/jike/read.test.js +0 -86
  538. package/clis/jike/repost.js +0 -103
  539. package/clis/jike/search.js +0 -68
  540. package/clis/jike/topic.js +0 -65
  541. package/clis/jike/user.js +0 -65
  542. package/clis/jike/utils.js +0 -25
  543. package/clis/jimeng/auth.js +0 -46
  544. package/clis/jimeng/generate.js +0 -84
  545. package/clis/jimeng/history.js +0 -48
  546. package/clis/jimeng/new.js +0 -44
  547. package/clis/jimeng/workspaces.js +0 -42
  548. package/clis/juejin/hot.js +0 -37
  549. package/clis/juejin/juejin.test.js +0 -241
  550. package/clis/juejin/recommend.js +0 -61
  551. package/clis/juejin/utils.js +0 -199
  552. package/clis/ke/auth.js +0 -46
  553. package/clis/ke/chengjiao.js +0 -78
  554. package/clis/ke/ershoufang.js +0 -101
  555. package/clis/ke/utils.js +0 -104
  556. package/clis/ke/xiaoqu.js +0 -78
  557. package/clis/ke/zufang.js +0 -95
  558. package/clis/kimi/_utils.js +0 -110
  559. package/clis/kimi/audit-extras.js +0 -268
  560. package/clis/kimi/auth.js +0 -57
  561. package/clis/kimi/chat.js +0 -470
  562. package/clis/kimi/kimi.test.js +0 -187
  563. package/clis/kimi/storage.js +0 -169
  564. package/clis/kimi/ui.js +0 -314
  565. package/clis/kimi/usage.js +0 -144
  566. package/clis/linux-do/auth.js +0 -55
  567. package/clis/linux-do/categories.js +0 -50
  568. package/clis/linux-do/feed.js +0 -395
  569. package/clis/linux-do/feed.test.js +0 -153
  570. package/clis/linux-do/search.js +0 -29
  571. package/clis/linux-do/tags.js +0 -28
  572. package/clis/linux-do/topic-content.js +0 -155
  573. package/clis/linux-do/topic-content.test.js +0 -59
  574. package/clis/linux-do/topic.js +0 -53
  575. package/clis/linux-do/user-posts.js +0 -57
  576. package/clis/linux-do/user-topics.js +0 -37
  577. package/clis/maimai/auth.js +0 -47
  578. package/clis/maimai/search-talents.js +0 -192
  579. package/clis/maimai/search-talents.test.js +0 -29
  580. package/clis/mubu/doc.js +0 -41
  581. package/clis/mubu/docs.js +0 -44
  582. package/clis/mubu/notes.js +0 -245
  583. package/clis/mubu/recent.js +0 -28
  584. package/clis/mubu/search.js +0 -63
  585. package/clis/mubu/utils.js +0 -304
  586. package/clis/nowcoder/auth.js +0 -65
  587. package/clis/nowcoder/companies.js +0 -24
  588. package/clis/nowcoder/creators.js +0 -28
  589. package/clis/nowcoder/detail.js +0 -62
  590. package/clis/nowcoder/experience.js +0 -37
  591. package/clis/nowcoder/hot.js +0 -25
  592. package/clis/nowcoder/jobs.js +0 -22
  593. package/clis/nowcoder/notifications.js +0 -30
  594. package/clis/nowcoder/papers.js +0 -41
  595. package/clis/nowcoder/practice.js +0 -38
  596. package/clis/nowcoder/recommend.js +0 -31
  597. package/clis/nowcoder/referral.js +0 -40
  598. package/clis/nowcoder/salary.js +0 -41
  599. package/clis/nowcoder/search.js +0 -50
  600. package/clis/nowcoder/suggest.js +0 -34
  601. package/clis/nowcoder/topics.js +0 -28
  602. package/clis/nowcoder/trending.js +0 -26
  603. package/clis/ones/common.js +0 -144
  604. package/clis/ones/enrich-tasks.js +0 -37
  605. package/clis/ones/login.js +0 -81
  606. package/clis/ones/logout.js +0 -18
  607. package/clis/ones/me.js +0 -31
  608. package/clis/ones/my-tasks.js +0 -121
  609. package/clis/ones/resolve-labels.js +0 -64
  610. package/clis/ones/task-helpers.js +0 -212
  611. package/clis/ones/task-helpers.test.js +0 -12
  612. package/clis/ones/task.js +0 -67
  613. package/clis/ones/tasks.js +0 -80
  614. package/clis/ones/token-info.js +0 -43
  615. package/clis/ones/worklog.js +0 -268
  616. package/clis/ones/worklog.test.js +0 -20
  617. package/clis/powerchina/auth.js +0 -52
  618. package/clis/powerchina/search.js +0 -251
  619. package/clis/powerchina/search.test.js +0 -93
  620. package/clis/quark/auth.js +0 -47
  621. package/clis/quark/ls.js +0 -64
  622. package/clis/quark/mkdir.js +0 -37
  623. package/clis/quark/mv.js +0 -54
  624. package/clis/quark/rename.js +0 -27
  625. package/clis/quark/rm.js +0 -25
  626. package/clis/quark/save.js +0 -81
  627. package/clis/quark/share-tree.js +0 -46
  628. package/clis/quark/utils.js +0 -146
  629. package/clis/quark/utils.test.js +0 -58
  630. package/clis/qwen/ask.js +0 -104
  631. package/clis/qwen/ask.test.js +0 -36
  632. package/clis/qwen/auth.js +0 -56
  633. package/clis/qwen/detail.js +0 -62
  634. package/clis/qwen/history.js +0 -61
  635. package/clis/qwen/image.js +0 -179
  636. package/clis/qwen/new.js +0 -23
  637. package/clis/qwen/read.js +0 -41
  638. package/clis/qwen/send.js +0 -55
  639. package/clis/qwen/status.js +0 -37
  640. package/clis/qwen/utils.js +0 -461
  641. package/clis/qwen/utils.test.js +0 -128
  642. package/clis/rednote/auth.js +0 -52
  643. package/clis/rednote/comments.js +0 -85
  644. package/clis/rednote/download.js +0 -59
  645. package/clis/rednote/feed.js +0 -27
  646. package/clis/rednote/navigation.test.js +0 -26
  647. package/clis/rednote/note.js +0 -68
  648. package/clis/rednote/notifications.js +0 -139
  649. package/clis/rednote/rednote.test.js +0 -240
  650. package/clis/rednote/search.js +0 -107
  651. package/clis/rednote/user.js +0 -55
  652. package/clis/sinablog/article.js +0 -15
  653. package/clis/sinablog/hot.js +0 -15
  654. package/clis/sinablog/search.js +0 -52
  655. package/clis/sinablog/user.js +0 -16
  656. package/clis/sinablog/utils.js +0 -186
  657. package/clis/sinafinance/news.js +0 -62
  658. package/clis/sinafinance/rolling-news.js +0 -41
  659. package/clis/sinafinance/stock-rank.js +0 -66
  660. package/clis/sinafinance/stock.js +0 -121
  661. package/clis/sinafinance/stock.test.js +0 -59
  662. package/clis/smzdm/search.js +0 -149
  663. package/clis/smzdm/search.test.js +0 -114
  664. package/clis/taobao/add-cart.js +0 -150
  665. package/clis/taobao/auth.js +0 -58
  666. package/clis/taobao/cart.js +0 -96
  667. package/clis/taobao/commands.test.js +0 -41
  668. package/clis/taobao/detail.js +0 -71
  669. package/clis/taobao/reviews.js +0 -77
  670. package/clis/taobao/search.js +0 -97
  671. package/clis/tdx/hot-rank.js +0 -48
  672. package/clis/tdx/hot-rank.test.js +0 -59
  673. package/clis/ths/hot-rank.js +0 -50
  674. package/clis/ths/hot-rank.test.js +0 -64
  675. package/clis/tieba/commands.test.js +0 -79
  676. package/clis/tieba/hot.js +0 -48
  677. package/clis/tieba/posts.js +0 -86
  678. package/clis/tieba/read.js +0 -141
  679. package/clis/tieba/search.js +0 -109
  680. package/clis/tieba/utils.js +0 -240
  681. package/clis/tieba/utils.test.js +0 -290
  682. package/clis/toutiao/articles.js +0 -55
  683. package/clis/toutiao/auth.js +0 -70
  684. package/clis/toutiao/hot.js +0 -63
  685. package/clis/toutiao/toutiao.test.js +0 -378
  686. package/clis/toutiao/utils.js +0 -161
  687. package/clis/trae-cn/activity.js +0 -22
  688. package/clis/trae-cn/approve.js +0 -52
  689. package/clis/trae-cn/ask.js +0 -99
  690. package/clis/trae-cn/dump.js +0 -5
  691. package/clis/trae-cn/export.js +0 -40
  692. package/clis/trae-cn/model.js +0 -22
  693. package/clis/trae-cn/new.js +0 -63
  694. package/clis/trae-cn/read.js +0 -23
  695. package/clis/trae-cn/screenshot.js +0 -5
  696. package/clis/trae-cn/select-model.js +0 -25
  697. package/clis/trae-cn/send.js +0 -23
  698. package/clis/trae-cn/setup.js +0 -75
  699. package/clis/trae-cn/status.js +0 -27
  700. package/clis/trae-cn/targets.js +0 -96
  701. package/clis/trae-cn/trae-cn.test.js +0 -412
  702. package/clis/trae-cn/utils.js +0 -750
  703. package/clis/trae-cn/watch.js +0 -119
  704. package/clis/uisdc/news.js +0 -105
  705. package/clis/uisdc/news.test.js +0 -66
  706. package/clis/v2ex/auth.js +0 -44
  707. package/clis/v2ex/daily.js +0 -99
  708. package/clis/v2ex/hot.js +0 -26
  709. package/clis/v2ex/latest.js +0 -26
  710. package/clis/v2ex/me.js +0 -100
  711. package/clis/v2ex/member.js +0 -28
  712. package/clis/v2ex/node.js +0 -39
  713. package/clis/v2ex/nodes.js +0 -26
  714. package/clis/v2ex/notifications.js +0 -72
  715. package/clis/v2ex/replies.js +0 -27
  716. package/clis/v2ex/topic.js +0 -31
  717. package/clis/v2ex/user.js +0 -34
  718. package/clis/wanfang/search.js +0 -66
  719. package/clis/wanfang/search.test.js +0 -23
  720. package/clis/wechat-channels/auth.js +0 -62
  721. package/clis/wechat-channels/publish.js +0 -732
  722. package/clis/wechat-channels/publish.test.js +0 -144
  723. package/clis/weibo/auth.js +0 -53
  724. package/clis/weibo/comments.js +0 -53
  725. package/clis/weibo/delete.js +0 -172
  726. package/clis/weibo/delete.test.js +0 -94
  727. package/clis/weibo/envelope.test.js +0 -85
  728. package/clis/weibo/favorites.js +0 -170
  729. package/clis/weibo/favorites.test.js +0 -114
  730. package/clis/weibo/feed.js +0 -69
  731. package/clis/weibo/hot.js +0 -39
  732. package/clis/weibo/me.js +0 -75
  733. package/clis/weibo/post.js +0 -75
  734. package/clis/weibo/publish.js +0 -306
  735. package/clis/weibo/publish.test.js +0 -192
  736. package/clis/weibo/search.js +0 -80
  737. package/clis/weibo/user-posts.js +0 -234
  738. package/clis/weibo/user-posts.test.js +0 -92
  739. package/clis/weibo/user.js +0 -63
  740. package/clis/weibo/utils.js +0 -59
  741. package/clis/weibo/utils.test.js +0 -36
  742. package/clis/weixin/create-draft.js +0 -226
  743. package/clis/weixin/download.js +0 -371
  744. package/clis/weixin/download.test.js +0 -106
  745. package/clis/weixin/drafts.js +0 -66
  746. package/clis/weixin/drafts.test.js +0 -69
  747. package/clis/weixin/search.js +0 -157
  748. package/clis/weixin/search.test.js +0 -227
  749. package/clis/weread/ai-outline.js +0 -171
  750. package/clis/weread/ai-outline.test.js +0 -83
  751. package/clis/weread/auth.js +0 -59
  752. package/clis/weread/book-search.js +0 -438
  753. package/clis/weread/book-search.test.js +0 -242
  754. package/clis/weread/book.js +0 -233
  755. package/clis/weread/commands.test.js +0 -398
  756. package/clis/weread/highlights.js +0 -24
  757. package/clis/weread/notebooks.js +0 -22
  758. package/clis/weread/notes.js +0 -30
  759. package/clis/weread/private-api-regression.test.js +0 -369
  760. package/clis/weread/ranking.js +0 -29
  761. package/clis/weread/search-regression.test.js +0 -494
  762. package/clis/weread/search.js +0 -186
  763. package/clis/weread/shelf.js +0 -66
  764. package/clis/weread/utils.js +0 -321
  765. package/clis/weread/utils.test.js +0 -128
  766. package/clis/weread-official/book.js +0 -135
  767. package/clis/weread-official/commands.test.js +0 -385
  768. package/clis/weread-official/discover.js +0 -107
  769. package/clis/weread-official/list-apis.js +0 -95
  770. package/clis/weread-official/notes.js +0 -171
  771. package/clis/weread-official/readdata.js +0 -158
  772. package/clis/weread-official/review.js +0 -93
  773. package/clis/weread-official/search.js +0 -106
  774. package/clis/weread-official/shelf.js +0 -97
  775. package/clis/weread-official/utils.js +0 -293
  776. package/clis/weread-official/utils.test.js +0 -242
  777. package/clis/xianyu/auth.js +0 -68
  778. package/clis/xianyu/chat.js +0 -74
  779. package/clis/xianyu/chat.test.js +0 -84
  780. package/clis/xianyu/im.js +0 -322
  781. package/clis/xianyu/im.test.js +0 -253
  782. package/clis/xianyu/inbox.js +0 -96
  783. package/clis/xianyu/item.js +0 -153
  784. package/clis/xianyu/item.test.js +0 -56
  785. package/clis/xianyu/messages.js +0 -91
  786. package/clis/xianyu/publish.js +0 -485
  787. package/clis/xianyu/publish.test.js +0 -220
  788. package/clis/xianyu/reply.js +0 -82
  789. package/clis/xianyu/search.js +0 -262
  790. package/clis/xianyu/search.test.js +0 -104
  791. package/clis/xianyu/utils.js +0 -8
  792. package/clis/xiaoe/auth.js +0 -55
  793. package/clis/xiaoe/catalog.js +0 -227
  794. package/clis/xiaoe/content.js +0 -175
  795. package/clis/xiaoe/courses.js +0 -127
  796. package/clis/xiaoe/detail.js +0 -36
  797. package/clis/xiaoe/play-url.js +0 -121
  798. package/clis/xiaoe/xiaoe.test.js +0 -486
  799. package/clis/xiaohongshu/ask.js +0 -426
  800. package/clis/xiaohongshu/ask.test.js +0 -271
  801. package/clis/xiaohongshu/auth.js +0 -53
  802. package/clis/xiaohongshu/collection-helpers.js +0 -283
  803. package/clis/xiaohongshu/collection-helpers.test.js +0 -125
  804. package/clis/xiaohongshu/comments.js +0 -228
  805. package/clis/xiaohongshu/comments.test.js +0 -320
  806. package/clis/xiaohongshu/creator-note-detail.js +0 -482
  807. package/clis/xiaohongshu/creator-note-detail.test.js +0 -451
  808. package/clis/xiaohongshu/creator-notes-summary.js +0 -98
  809. package/clis/xiaohongshu/creator-notes-summary.test.js +0 -94
  810. package/clis/xiaohongshu/creator-notes.js +0 -479
  811. package/clis/xiaohongshu/creator-notes.test.js +0 -281
  812. package/clis/xiaohongshu/creator-profile.js +0 -55
  813. package/clis/xiaohongshu/creator-stats.js +0 -76
  814. package/clis/xiaohongshu/creator-stats.test.js +0 -24
  815. package/clis/xiaohongshu/delete-note.js +0 -260
  816. package/clis/xiaohongshu/delete-note.test.js +0 -172
  817. package/clis/xiaohongshu/download.js +0 -249
  818. package/clis/xiaohongshu/download.test.js +0 -339
  819. package/clis/xiaohongshu/draft-clear.js +0 -91
  820. package/clis/xiaohongshu/draft-delete.js +0 -103
  821. package/clis/xiaohongshu/draft-open.js +0 -43
  822. package/clis/xiaohongshu/draft-utils.js +0 -142
  823. package/clis/xiaohongshu/drafts.js +0 -28
  824. package/clis/xiaohongshu/drafts.test.js +0 -172
  825. package/clis/xiaohongshu/feed.js +0 -163
  826. package/clis/xiaohongshu/feed.test.js +0 -126
  827. package/clis/xiaohongshu/follow.js +0 -226
  828. package/clis/xiaohongshu/follow.test.js +0 -211
  829. package/clis/xiaohongshu/liked.js +0 -29
  830. package/clis/xiaohongshu/liked.test.js +0 -82
  831. package/clis/xiaohongshu/navigation.test.js +0 -38
  832. package/clis/xiaohongshu/note-helpers.js +0 -69
  833. package/clis/xiaohongshu/note.js +0 -104
  834. package/clis/xiaohongshu/note.test.js +0 -249
  835. package/clis/xiaohongshu/notifications.js +0 -46
  836. package/clis/xiaohongshu/publish.js +0 -1423
  837. package/clis/xiaohongshu/publish.test.js +0 -1141
  838. package/clis/xiaohongshu/saved.js +0 -29
  839. package/clis/xiaohongshu/saved.test.js +0 -143
  840. package/clis/xiaohongshu/search.js +0 -330
  841. package/clis/xiaohongshu/search.test.js +0 -325
  842. package/clis/xiaohongshu/unfollow.js +0 -285
  843. package/clis/xiaohongshu/user-helpers.js +0 -78
  844. package/clis/xiaohongshu/user-helpers.test.js +0 -160
  845. package/clis/xiaohongshu/user.js +0 -140
  846. package/clis/xiaohongshu/user.test.js +0 -141
  847. package/clis/xiaoyuzhou/auth.js +0 -303
  848. package/clis/xiaoyuzhou/auth.test.js +0 -124
  849. package/clis/xiaoyuzhou/download.js +0 -54
  850. package/clis/xiaoyuzhou/download.test.js +0 -135
  851. package/clis/xiaoyuzhou/episode.js +0 -34
  852. package/clis/xiaoyuzhou/podcast-episodes.js +0 -41
  853. package/clis/xiaoyuzhou/podcast-episodes.test.js +0 -78
  854. package/clis/xiaoyuzhou/podcast.js +0 -33
  855. package/clis/xiaoyuzhou/transcript.js +0 -77
  856. package/clis/xiaoyuzhou/transcript.test.js +0 -195
  857. package/clis/xiaoyuzhou/utils.js +0 -15
  858. package/clis/xiaoyuzhou/utils.test.js +0 -39
  859. package/clis/xueqiu/auth.js +0 -63
  860. package/clis/xueqiu/comments.js +0 -355
  861. package/clis/xueqiu/comments.test.js +0 -696
  862. package/clis/xueqiu/danjuan-utils.js +0 -126
  863. package/clis/xueqiu/danjuan-utils.test.js +0 -41
  864. package/clis/xueqiu/earnings-date.js +0 -45
  865. package/clis/xueqiu/feed.js +0 -39
  866. package/clis/xueqiu/fund-holdings.js +0 -29
  867. package/clis/xueqiu/fund-snapshot.js +0 -26
  868. package/clis/xueqiu/groups.js +0 -23
  869. package/clis/xueqiu/hot-stock.js +0 -32
  870. package/clis/xueqiu/hot.js +0 -37
  871. package/clis/xueqiu/kline.js +0 -44
  872. package/clis/xueqiu/search.js +0 -37
  873. package/clis/xueqiu/stock.js +0 -65
  874. package/clis/xueqiu/utils.js +0 -48
  875. package/clis/xueqiu/utils.test.js +0 -26
  876. package/clis/xueqiu/watchlist.js +0 -37
  877. package/clis/youdao/note.js +0 -258
  878. package/clis/youdao/note.test.js +0 -99
  879. package/clis/yuanbao/ask.js +0 -362
  880. package/clis/yuanbao/ask.test.js +0 -124
  881. package/clis/yuanbao/auth.js +0 -59
  882. package/clis/yuanbao/detail.js +0 -65
  883. package/clis/yuanbao/history.js +0 -51
  884. package/clis/yuanbao/new.js +0 -72
  885. package/clis/yuanbao/new.test.js +0 -30
  886. package/clis/yuanbao/read.js +0 -38
  887. package/clis/yuanbao/send.js +0 -57
  888. package/clis/yuanbao/shared.js +0 -341
  889. package/clis/yuanbao/shared.test.js +0 -80
  890. package/clis/yuanbao/status.js +0 -44
  891. package/clis/zhihu/answer-comments.js +0 -280
  892. package/clis/zhihu/answer-comments.test.js +0 -287
  893. package/clis/zhihu/answer-detail.js +0 -216
  894. package/clis/zhihu/answer-detail.test.js +0 -338
  895. package/clis/zhihu/answer.js +0 -54
  896. package/clis/zhihu/answer.test.js +0 -54
  897. package/clis/zhihu/auth.js +0 -59
  898. package/clis/zhihu/collection.js +0 -199
  899. package/clis/zhihu/collection.test.js +0 -337
  900. package/clis/zhihu/collections.js +0 -128
  901. package/clis/zhihu/collections.test.js +0 -182
  902. package/clis/zhihu/comment.js +0 -55
  903. package/clis/zhihu/comment.test.js +0 -50
  904. package/clis/zhihu/download.js +0 -80
  905. package/clis/zhihu/download.test.js +0 -12
  906. package/clis/zhihu/favorite.js +0 -87
  907. package/clis/zhihu/favorite.test.js +0 -59
  908. package/clis/zhihu/follow.js +0 -50
  909. package/clis/zhihu/follow.test.js +0 -42
  910. package/clis/zhihu/followers.js +0 -40
  911. package/clis/zhihu/followers.test.js +0 -42
  912. package/clis/zhihu/following.js +0 -40
  913. package/clis/zhihu/following.test.js +0 -44
  914. package/clis/zhihu/hot.js +0 -44
  915. package/clis/zhihu/like.js +0 -47
  916. package/clis/zhihu/like.test.js +0 -41
  917. package/clis/zhihu/paginate.js +0 -128
  918. package/clis/zhihu/pins.js +0 -41
  919. package/clis/zhihu/pins.test.js +0 -44
  920. package/clis/zhihu/question.js +0 -113
  921. package/clis/zhihu/question.test.js +0 -251
  922. package/clis/zhihu/recommend.js +0 -103
  923. package/clis/zhihu/recommend.test.js +0 -143
  924. package/clis/zhihu/search.js +0 -206
  925. package/clis/zhihu/search.test.js +0 -198
  926. package/clis/zhihu/target.js +0 -91
  927. package/clis/zhihu/target.test.js +0 -77
  928. package/clis/zhihu/text.js +0 -29
  929. package/clis/zhihu/text.test.js +0 -24
  930. package/clis/zhihu/user-answers.js +0 -41
  931. package/clis/zhihu/user-answers.test.js +0 -69
  932. package/clis/zhihu/user-arg.js +0 -34
  933. package/clis/zhihu/user-articles.js +0 -40
  934. package/clis/zhihu/user-articles.test.js +0 -44
  935. package/clis/zhihu/user.js +0 -59
  936. package/clis/zhihu/user.test.js +0 -73
  937. package/clis/zhihu/write-shared.js +0 -228
  938. package/clis/zhihu/write-shared.test.js +0 -176
  939. package/clis/zsxq/auth.js +0 -68
  940. package/clis/zsxq/dynamics.js +0 -48
  941. package/clis/zsxq/groups.js +0 -33
  942. package/clis/zsxq/search.js +0 -44
  943. package/clis/zsxq/search.test.js +0 -24
  944. package/clis/zsxq/topic.js +0 -50
  945. package/clis/zsxq/topic.test.js +0 -30
  946. package/clis/zsxq/topics.js +0 -26
  947. package/clis/zsxq/topics.test.js +0 -24
  948. package/clis/zsxq/utils.js +0 -233
  949. package/clis/zsxq/utils.test.js +0 -31
  950. package/dist/src/weixin-download.test.js +0 -45
  951. package/skills/webcmd-adapter-author/references/site-memory/bilibili.md +0 -70
  952. package/skills/webcmd-adapter-author/references/site-memory/eastmoney.md +0 -70
  953. package/skills/webcmd-adapter-author/references/site-memory/tonghuashun.md +0 -51
  954. package/skills/webcmd-adapter-author/references/site-memory/xueqiu.md +0 -58
  955. /package/{clis/douyin/_shared/types.js → dist/src/browser/profile.test.d.ts} +0 -0
  956. /package/dist/src/{weixin-download.test.d.ts → generate-release-notes-cli.test.d.ts} +0 -0
@@ -1,71 +0,0 @@
1
- /**
2
- * 一亩三分地 站内搜索 — /bbs/search.php?mod=forum
3
- *
4
- * Guests get a "请登录" alert page, so this command needs the live browser
5
- * session's cookie. Discuz routes search through a 302 redirect to
6
- * search.php?searchid=<ID>. Node fetch follows redirects automatically as
7
- * long as we pass the session cookie along.
8
- */
9
- import { cli, Strategy } from '@agentrhq/webcmd/registry';
10
- import { ArgumentError, EmptyResultError } from '@agentrhq/webcmd/errors';
11
- import { fetchHtml, parseSearchList, assertNotGuestAlert, getCookie, decodeEntities, normalizeLimit, BASE } from './utils.js';
12
-
13
- cli({
14
- site: '1point3acres',
15
- name: 'search',
16
- access: 'read',
17
- description: '一亩三分地 站内关键字搜索(需要登录)',
18
- domain: 'www.1point3acres.com',
19
- strategy: Strategy.COOKIE,
20
- browser: true,
21
- navigateBefore: false,
22
- args: [
23
- { name: 'query', required: true, positional: true, help: '搜索关键字' },
24
- { name: 'limit', type: 'int', default: 20, help: '返回条数(默认 20,最多 50)' },
25
- { name: 'fid', type: 'string', default: '', help: '限定版块 ID(可选)' },
26
- ],
27
- columns: ['rank', 'tid', 'title', 'forum', 'author', 'replies', 'views', 'postTime', 'url'],
28
- func: async (page, args) => {
29
- const query = String(args.query || '').trim();
30
- if (!query) throw new ArgumentError('query 不能为空');
31
- const limit = normalizeLimit(args.limit, 20, 50);
32
- const fid = String(args.fid || '').trim();
33
-
34
- const cookie = await getCookie(page);
35
- const qs = new URLSearchParams({
36
- mod: 'forum',
37
- srchtxt: query,
38
- searchsubmit: 'yes',
39
- ...(fid ? { srchfid: fid } : {}),
40
- });
41
- const url = `${BASE}/search.php?${qs.toString()}`;
42
-
43
- // Node fetch with the session cookie — Discuz's 302 to search.php?searchid=…
44
- // is followed by default.
45
- const html = await fetchHtml(url, {
46
- cookie,
47
- headers: { Referer: `${BASE}/` },
48
- });
49
- assertNotGuestAlert(html);
50
-
51
- const items = parseSearchList(html);
52
- if (items.length === 0) {
53
- const hint = html.match(/<p>([^<]*?抱歉[^<]*?)<\/p>/);
54
- if (hint) {
55
- throw new EmptyResultError('1point3acres search', decodeEntities(hint[1].trim()));
56
- }
57
- throw new EmptyResultError('1point3acres search', `No results for "${query}"`);
58
- }
59
- return items.slice(0, limit).map((t, i) => ({
60
- rank: i + 1,
61
- tid: t.tid,
62
- title: t.title,
63
- forum: t.forum,
64
- author: t.author,
65
- replies: t.replies,
66
- views: t.views,
67
- postTime: t.postTime,
68
- url: t.url,
69
- }));
70
- },
71
- });
@@ -1,117 +0,0 @@
1
- /**
2
- * 一亩三分地 帖子详情 — /bbs/thread-<tid>-<page>-1.html
3
- *
4
- * Returns one row per post on the requested page. First row (floor=1) is the
5
- * main post; the rest are replies. Columns are shaped so `--limit 1` gives
6
- * just the main post, and larger limits walk down the thread.
7
- */
8
- import { cli, Strategy } from '@agentrhq/webcmd/registry';
9
- import { ArgumentError, EmptyResultError } from '@agentrhq/webcmd/errors';
10
- import { fetchHtml, decodeEntities, stripHtml, truncate, normalizePositiveInteger, BASE } from './utils.js';
11
-
12
- function extract(html, regex, group = 1) {
13
- const m = html.match(regex);
14
- return m ? m[group] : '';
15
- }
16
-
17
- cli({
18
- site: '1point3acres',
19
- name: 'thread',
20
- access: 'read',
21
- description: '一亩三分地 帖子详情 + 楼层(主楼 + 回复)',
22
- domain: 'www.1point3acres.com',
23
- strategy: Strategy.PUBLIC,
24
- browser: false,
25
- args: [
26
- { name: 'tid', required: true, positional: true, help: '帖子 ID(数字,见 `hot`/`latest` 返回的 tid)' },
27
- { name: 'page', type: 'int', default: 1, help: '楼层分页页码(默认 1)' },
28
- { name: 'limit', type: 'int', default: 10, help: '返回楼层条数(默认 10,含主楼)' },
29
- { name: 'contentLimit', type: 'int', default: 400, help: '每楼正文截断长度(默认 400 字符,最少 50)' },
30
- ],
31
- columns: ['floor', 'pid', 'author', 'postTime', 'content', 'url'],
32
- func: async (args) => {
33
- const tid = String(args.tid || '').trim();
34
- if (!/^\d+$/.test(tid)) {
35
- throw new ArgumentError('tid must be a numeric thread id');
36
- }
37
- const page = normalizePositiveInteger(args.page, 1, 'page');
38
- const limit = normalizePositiveInteger(args.limit, 10, 'limit');
39
- const contentLimit = normalizePositiveInteger(args.contentLimit, 400, 'contentLimit', { min: 50 });
40
-
41
- const url = `${BASE}/thread-${tid}-${page}-1.html`;
42
- const html = await fetchHtml(url);
43
-
44
- // Sanity: real thread page will contain postlist + at least one post div.
45
- if (!/id="postlist"/.test(html) && !/id="post_\d+"/.test(html)) {
46
- throw new EmptyResultError('1point3acres thread', `帖子 ${tid} 不存在或被删除`);
47
- }
48
-
49
- // Split posts: each post block is bounded by <div id="post_<PID>">…</div> next post or postlist end.
50
- // NOTE: intermediate objects intentionally use postId/body/offset (not pid/html/start) to
51
- // avoid being mistaken for row-shaped objects by the silent-column-drop audit.
52
- const postBlocks = [];
53
- const re = /<div id="post_(\d+)"[^>]*>/g;
54
- const offsets = [];
55
- let m;
56
- while ((m = re.exec(html))) offsets.push({ postId: m[1], offset: m.index });
57
- for (let i = 0; i < offsets.length; i++) {
58
- const segStart = offsets[i].offset;
59
- const segEnd = i + 1 < offsets.length ? offsets[i + 1].offset : html.length;
60
- postBlocks.push({ postId: offsets[i].postId, body: html.slice(segStart, segEnd) });
61
- }
62
-
63
- const rows = [];
64
- for (let i = 0; i < postBlocks.length && rows.length < limit; i++) {
65
- const { postId: pid, body: block } = postBlocks[i];
66
- // Discuz authi block holds the author link + post time metadata.
67
- const authiMatch = block.match(/<div class="authi"[\s\S]*?<\/div>/);
68
- const authiBlock = authiMatch ? authiMatch[0] : '';
69
- const authorCandidates = [
70
- /<a [^>]*class="[^"]*\bxi2\b[^"]*"[^>]*>\s*([^<]+?)\s*<\/a>/,
71
- /<a [^>]*href="space-uid-\d+\.html"[^>]*>\s*([^<]+?)\s*<\/a>/,
72
- /<a [^>]*class="[^"]*\bxw1\b[^"]*"[^>]*>\s*([^<]+?)\s*<\/a>/,
73
- ];
74
- let author = '';
75
- for (const re of authorCandidates) {
76
- const v = decodeEntities(extract(authiBlock || block, re));
77
- if (v && !/匿名卡|变色卡|关贴卡/.test(v)) { author = v; break; }
78
- }
79
- // Time: prefer <span title="YYYY-MM-DD HH:MM:SS"> (per-post, precise).
80
- // <meta itemprop="datePublished"> is the *thread* publish time on this site — avoid.
81
- const postTime = extract(authiBlock, /<span title="([^"]+)">/) ||
82
- extract(block, /id="authorposton\d+"[^>]*>\s*<span title="([^"]+)">/) ||
83
- extract(block, /id="authorposton\d+"[^>]*>\s*([^<]+?)\s*</) ||
84
- extract(block, /<meta itemprop="datePublished" content="([^"]+)"/);
85
- // Floor: first post on page 1 is the 楼主, subsequent posts carry <em>N#</em>.
86
- const floorEm = extract(block, /<em>(\d+)<\/em>\s*#?\s*<\/a>/) ||
87
- extract(block, /id="postnum\d+"[^>]*>\s*<em>(\d+)<\/em>/);
88
- const isMainPost = page === 1 && i === 0;
89
- const floor = floorEm ? Number(floorEm) : (isMainPost ? 1 : (page - 1) * 10 + i + 1);
90
- const contentMatch = block.match(/id="postmessage_\d+"[^>]*>([\s\S]*?)<\/td>/);
91
- const content = truncate(stripHtml(contentMatch ? contentMatch[1] : ''), contentLimit);
92
- rows.push({
93
- floor,
94
- pid,
95
- author,
96
- postTime: postTime.trim(),
97
- content,
98
- url: `${BASE}/forum.php?mod=redirect&goto=findpost&ptid=${tid}&pid=${pid}`,
99
- });
100
- }
101
-
102
- // Attach the thread title + forum name as a leading synthetic row only when rows exist
103
- // and only for page 1, so agents get the title without needing a separate call.
104
- if (page === 1 && rows.length > 0) {
105
- const title = decodeEntities(
106
- extract(html, /<span id="thread_subject">([^<]+)<\/span>/).trim() ||
107
- extract(html, /<title>([^<]+?)\s*[-|]/).trim()
108
- );
109
- rows[0].content = title ? `【${title}】\n${rows[0].content}` : rows[0].content;
110
- }
111
-
112
- if (!rows.length) {
113
- throw new EmptyResultError('1point3acres thread', `帖子 ${tid} 第 ${page} 页没有可读取楼层`);
114
- }
115
- return rows;
116
- },
117
- });
@@ -1,77 +0,0 @@
1
- /**
2
- * 一亩三分地 用户资料 — /bbs/space-uid-<uid>.html or /bbs/space-username-<name>.html
3
- *
4
- * Guest-visible fields: username, uid, user group, register/last-access times,
5
- * post/thread/digest counts, credits, rice (大米 — site currency), profile URL.
6
- * Users can be queried by numeric uid or by username (both routes are public).
7
- */
8
- import { cli, Strategy } from '@agentrhq/webcmd/registry';
9
- import { ArgumentError, EmptyResultError } from '@agentrhq/webcmd/errors';
10
- import { fetchHtml, decodeEntities, BASE } from './utils.js';
11
-
12
- cli({
13
- site: '1point3acres',
14
- name: 'user',
15
- access: 'read',
16
- description: '一亩三分地 用户空间(用户组 / 积分 / 大米 / 帖子数 等)',
17
- domain: 'www.1point3acres.com',
18
- strategy: Strategy.PUBLIC,
19
- browser: false,
20
- args: [
21
- { name: 'who', required: true, positional: true, help: '用户名或 uid(纯数字按 uid 查,否则按用户名)' },
22
- ],
23
- columns: [
24
- 'uid', 'username', 'group', 'credits', 'rice',
25
- 'posts', 'threads', 'digests', 'registerTime', 'lastAccess', 'profileUrl',
26
- ],
27
- func: async (args) => {
28
- const who = String(args.who || '').trim();
29
- if (!who) throw new ArgumentError('who 不能为空', '传用户名或数字 uid');
30
- const url = /^\d+$/.test(who)
31
- ? `${BASE}/space-uid-${who}.html`
32
- : `${BASE}/space-username-${encodeURIComponent(who)}.html`;
33
-
34
- const html = await fetchHtml(url);
35
- if (/<title>提示信息/.test(html) && /(没有找到|不存在)/.test(html)) {
36
- throw new EmptyResultError('1point3acres user', `用户 "${who}" 不存在`);
37
- }
38
-
39
- const pick = (re) => {
40
- const m = html.match(re);
41
- return m ? decodeEntities(m[1].trim()) : '';
42
- };
43
- // <li>KEY: VAL</li> — tolerant of optional <span>, colons fullwidth/半角, 颗/根/粒 suffixes.
44
- const pickLi = (label) => {
45
- const re = new RegExp(`<li>\\s*${label}[::\\s]*(?:<[^>]+>)?\\s*([^<]+?)\\s*(?:<|$)`);
46
- const m = html.match(re);
47
- return m ? decodeEntities(m[1].trim()) : '';
48
- };
49
-
50
- const username =
51
- pick(/<p class="mtm[^"]*"[^>]*>\s*<a [^>]*>([^<]+?)<\/a>/) ||
52
- pick(/<title>([^<]+?)的个人资料/);
53
- const uid = pick(/uid=(\d+)/) || pick(/space-uid-(\d+)\.html/);
54
- const group = pickLi('用户组');
55
- const credits = pickLi('积分');
56
- const rice = pickLi('大米');
57
- const posts = pickLi('帖子数');
58
- const threads = pickLi('主题数');
59
- const digests = pickLi('精华数');
60
- const registerTime = pickLi('注册时间');
61
- const lastAccess = pickLi('最后访问');
62
-
63
- return [{
64
- uid,
65
- username,
66
- group,
67
- credits,
68
- rice,
69
- posts,
70
- threads,
71
- digests,
72
- registerTime,
73
- lastAccess,
74
- profileUrl: uid ? `${BASE}/space-uid-${uid}.html` : url,
75
- }];
76
- },
77
- });
@@ -1,247 +0,0 @@
1
- /**
2
- * Shared helpers for 一亩三分地 (1point3acres.com) adapters.
3
- *
4
- * Site is a Discuz!X PHP BBS that serves GBK-encoded HTML.
5
- * - Thread listings: /bbs/forum.php?mod=guide&view={hot|new|digest|newthread}
6
- * - Forum: /bbs/forum-<fid>-<page>.html
7
- * - Thread detail: /bbs/thread-<tid>-<page>-1.html
8
- * - User profile: /bbs/space-uid-<uid>.html or /bbs/space-username-<name>.html
9
- * - Search: /bbs/search.php?mod=forum (COOKIE — guests get an alert page)
10
- */
11
- import { AuthRequiredError, ArgumentError, CommandExecutionError } from '@agentrhq/webcmd/errors';
12
-
13
- export const BASE = 'https://www.1point3acres.com/bbs';
14
-
15
- /**
16
- * Validate `limit` per typed-fail-fast convention (no silent clamp).
17
- * Throws ArgumentError on non-positive / non-integer / out-of-range input.
18
- */
19
- export function normalizeLimit(value, defaultValue, maxValue, label = 'limit') {
20
- const limit = normalizePositiveInteger(value, defaultValue, label);
21
- if (limit > maxValue) {
22
- throw new ArgumentError(`${label} must be <= ${maxValue}`);
23
- }
24
- return limit;
25
- }
26
-
27
- /** Validate a positive integer argument without silently flooring/clamping. */
28
- export function normalizePositiveInteger(value, defaultValue, label = 'value', { min = 1 } = {}) {
29
- const raw = value ?? defaultValue;
30
- const limit = Number(raw);
31
- if (!Number.isInteger(limit) || limit <= 0) {
32
- throw new ArgumentError(`${label} must be a positive integer`);
33
- }
34
- if (limit < min) {
35
- throw new ArgumentError(`${label} must be >= ${min}`);
36
- }
37
- return limit;
38
- }
39
-
40
- const UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0 Safari/537.36';
41
-
42
- /** Fetch a GBK-encoded Discuz page and return decoded UTF-8 HTML. */
43
- export async function fetchHtml(url, { headers = {}, cookie = '' } = {}) {
44
- let res;
45
- try {
46
- res = await fetch(url, {
47
- headers: {
48
- 'User-Agent': UA,
49
- 'Accept': 'text/html,application/xhtml+xml',
50
- 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
51
- ...(cookie ? { Cookie: cookie } : {}),
52
- ...headers,
53
- },
54
- redirect: 'follow',
55
- });
56
- } catch (error) {
57
- throw new CommandExecutionError(`1point3acres request failed: ${error?.message || error}`);
58
- }
59
- if (!res.ok) {
60
- throw new CommandExecutionError(`1point3acres request failed: HTTP ${res.status} ${res.statusText} from ${url}`);
61
- }
62
- const buf = await res.arrayBuffer();
63
- return new TextDecoder('gbk').decode(buf);
64
- }
65
-
66
- /** Pull cookie string from the live browser session for this domain.
67
- * Discuz auth cookies (4Oaf_61d6_*, session) are HttpOnly and set on the
68
- * root domain `.1point3acres.com`, so we need `getCookies` (not document.cookie)
69
- * AND we need to query both host + root domain and merge.
70
- */
71
- export async function getCookie(page) {
72
- if (!page) return '';
73
- const seen = new Map();
74
- if (typeof page.getCookies === 'function') {
75
- for (const opts of [{ domain: 'www.1point3acres.com' }, { domain: '.1point3acres.com' }]) {
76
- try {
77
- const cookies = await page.getCookies(opts);
78
- for (const c of cookies || []) {
79
- if (!seen.has(c.name)) seen.set(c.name, c.value);
80
- }
81
- } catch { /* try next */ }
82
- }
83
- }
84
- if (seen.size > 0) {
85
- return [...seen].map(([k, v]) => `${k}=${v}`).join('; ');
86
- }
87
- try {
88
- const result = await page.evaluate('document.cookie');
89
- return typeof result === 'string' ? result : '';
90
- } catch {
91
- return '';
92
- }
93
- }
94
-
95
- /** Detect the "you are a guest" alert page that Discuz returns for protected actions. */
96
- export function assertNotGuestAlert(html, domain = 'www.1point3acres.com') {
97
- if (/<title>提示信息 \| 一亩三分地<\/title>/.test(html) && /无法进行此操作/.test(html)) {
98
- throw new AuthRequiredError(domain, '需要登录一亩三分地后再使用该命令');
99
- }
100
- }
101
-
102
- const ENTITY_MAP = {
103
- '&nbsp;': ' ', '&amp;': '&', '&lt;': '<', '&gt;': '>',
104
- '&quot;': '"', '&#39;': "'", '&apos;': "'",
105
- };
106
-
107
- /** Decode HTML entities (numeric + common named). */
108
- export function decodeEntities(s) {
109
- if (!s) return '';
110
- return s
111
- .replace(/&#(\d+);/g, (_, n) => String.fromCodePoint(Number(n)))
112
- .replace(/&#[xX]([0-9a-fA-F]+);/g, (_, n) => String.fromCodePoint(parseInt(n, 16)))
113
- .replace(/&(nbsp|amp|lt|gt|quot|#39|apos);/g, m => ENTITY_MAP[m] || m);
114
- }
115
-
116
- /** Strip HTML tags and collapse whitespace, returning plain text. */
117
- export function stripHtml(html) {
118
- if (!html) return '';
119
- return decodeEntities(
120
- String(html)
121
- .replace(/<br\s*\/?>/gi, '\n')
122
- .replace(/<\/(p|div|li|tr)>/gi, '\n')
123
- .replace(/<[^>]+>/g, '')
124
- ).replace(/[ \t]+\n/g, '\n').replace(/\n{3,}/g, '\n\n').trim();
125
- }
126
-
127
- /** Truncate text to n characters with ellipsis. */
128
- export function truncate(s, n = 300) {
129
- if (!s) return '';
130
- return s.length > n ? s.slice(0, n) + '…' : s;
131
- }
132
-
133
- /** Extract all <tbody id="normalthread_*"> blocks from a forum/guide page. */
134
- export function parseThreadRows(html) {
135
- const rows = [];
136
- const re = /<tbody id="(normalthread|stickthread)_(\d+)"[^>]*>([\s\S]*?)<\/tbody>/g;
137
- let m;
138
- while ((m = re.exec(html))) {
139
- const [, kind, tid, inner] = m;
140
- rows.push({ kind, tid, inner });
141
- }
142
- return rows;
143
- }
144
-
145
- /** Parse a single Discuz thread row (inner HTML of the tbody). */
146
- export function parseThreadRow({ kind, tid, inner }) {
147
- const titleMatches = [...inner.matchAll(/<a [^>]*class="[^"]*\bxst\b[^"]*"[^>]*>([^<]+)<\/a>/g)];
148
- const title = titleMatches.length
149
- ? decodeEntities(titleMatches[titleMatches.length - 1][1].trim())
150
- : '';
151
-
152
- const forumMatch = inner.match(/<a href="forum-(\d+)-1\.html"[^>]*target="_blank"[^>]*>([^<]+)<\/a>/);
153
- const fid = forumMatch ? forumMatch[1] : '';
154
- const forumName = forumMatch ? decodeEntities(forumMatch[2].trim()) : '';
155
-
156
- // <td class="by"> blocks; first with <cite> = author, last with <cite> = last reply
157
- const byBlocks = [...inner.matchAll(/<td class="by"[^>]*>([\s\S]*?)<\/td>/g)].map(m => m[1]);
158
- const readCite = (block) => {
159
- const m = block.match(/<cite[^>]*>([\s\S]*?)<\/cite>/);
160
- if (!m) return '';
161
- return decodeEntities(m[1].replace(/<[^>]+>/g, '').trim());
162
- };
163
- const readTime = (block) => {
164
- const titleM = block.match(/<span [^>]*title="([^"]+)"[^>]*>/);
165
- if (titleM) return titleM[1].trim();
166
- const plainA = block.match(/<em>[\s\S]*?<a [^>]*>\s*([^<]+?)\s*<\/a>/);
167
- if (plainA) return decodeEntities(plainA[1].trim());
168
- const plainSpan = block.match(/<em>[\s\S]*?<span[^>]*>\s*([^<]+?)\s*<\/span>/);
169
- if (plainSpan) return decodeEntities(plainSpan[1].trim());
170
- const bare = block.match(/<em>\s*([^<]+?)\s*<\/em>/);
171
- return bare ? decodeEntities(bare[1].trim()) : '';
172
- };
173
- let authorBlock = '';
174
- let lastBlock = '';
175
- for (const b of byBlocks) {
176
- if (/<cite/.test(b)) {
177
- if (!authorBlock) authorBlock = b;
178
- lastBlock = b;
179
- }
180
- }
181
- const author = authorBlock ? readCite(authorBlock) : '';
182
- const postTime = authorBlock ? readTime(authorBlock) : '';
183
- const lastReplyUser = lastBlock && lastBlock !== authorBlock ? readCite(lastBlock) : '';
184
- const lastReplyTime = lastBlock && lastBlock !== authorBlock ? readTime(lastBlock) : '';
185
-
186
- const numMatch = inner.match(/<td class="num"[^>]*>\s*<a[^>]*class="xi2"[^>]*>(\d+)<\/a>(?:\s*<em>(\d+)<\/em>)?/);
187
- const replies = numMatch ? Number(numMatch[1]) : 0;
188
- const views = numMatch && numMatch[2] ? Number(numMatch[2]) : 0;
189
- return {
190
- tid,
191
- kind,
192
- title,
193
- author,
194
- forum: forumName,
195
- fid,
196
- replies,
197
- views,
198
- postTime,
199
- lastReplyUser,
200
- lastReplyTime,
201
- url: `${BASE}/thread-${tid}-1-1.html`,
202
- };
203
- }
204
-
205
- /** Quick one-shot listing parser used by hot/latest/digest/forum. */
206
- export function parseThreadList(html) {
207
- return parseThreadRows(html).map(parseThreadRow).filter(t => t.title);
208
- }
209
-
210
- /**
211
- * Parse Discuz search results page (different HTML shape than forum listings).
212
- * Each hit is <li class="pbw" id="TID"> containing h3 > a[href*="tid=TID"],
213
- * <p class="xg1">N 个回复 - M 次查看</p>, and a time/author/forum <p>.
214
- */
215
- export function parseSearchList(html) {
216
- const items = [];
217
- const re = /<li class="pbw" id="(\d+)">([\s\S]*?)<\/li>/g;
218
- let m;
219
- while ((m = re.exec(html))) {
220
- const [, tid, inner] = m;
221
- const titleMatch = inner.match(/<h3[^>]*>\s*<a [^>]*>([\s\S]*?)<\/a>/);
222
- const titleRaw = titleMatch ? titleMatch[1] : '';
223
- const title = decodeEntities(titleRaw.replace(/<[^>]+>/g, '')).trim();
224
- if (!title) continue;
225
-
226
- const statsMatch = inner.match(/<p class="xg1">\s*([\d,]+)\s*个回复\s*-\s*([\d,]+)\s*次查看\s*<\/p>/);
227
- const replies = statsMatch ? Number(statsMatch[1].replace(/,/g, '')) : 0;
228
- const views = statsMatch ? Number(statsMatch[2].replace(/,/g, '')) : 0;
229
-
230
- const metaMatch = inner.match(/<p>\s*<span>([^<]+)<\/span>[\s\S]*?<a [^>]*space-uid-\d+[^>]*>([^<]+?)<\/a>[\s\S]*?<a [^>]*href="forum-(\d+)-[^"]*"[^>]*>([^<]+?)<\/a>/);
231
- const postTime = metaMatch ? decodeEntities(metaMatch[1].trim()) : '';
232
- const author = metaMatch ? decodeEntities(metaMatch[2].trim()) : '';
233
- const fid = metaMatch ? metaMatch[3] : '';
234
- const forumName = metaMatch ? decodeEntities(metaMatch[4].trim()) : '';
235
-
236
- items.push({
237
- tid, title, author, forum: forumName, fid,
238
- replies, views, postTime,
239
- // Search pages don't show lastReplyTime separately — surface postTime instead.
240
- lastReplyUser: '', lastReplyTime: postTime,
241
- url: `${BASE}/thread-${tid}-1-1.html`,
242
- });
243
- }
244
- return items;
245
- }
246
-
247
- export { UA };
@@ -1,66 +0,0 @@
1
- /**
2
- * 36kr article detail — INTERCEPT strategy.
3
- *
4
- * Fetches the full content of a 36kr article given its ID or URL.
5
- */
6
- import { cli, Strategy } from '@agentrhq/webcmd/registry';
7
- import { CliError } from '@agentrhq/webcmd/errors';
8
- /** Extract article ID from a full URL or a bare numeric ID string */
9
- function parseArticleId(input) {
10
- const m = input.match(/\/p\/(\d+)/);
11
- return m ? m[1] : input.replace(/\D/g, '');
12
- }
13
- cli({
14
- site: '36kr',
15
- name: 'article',
16
- access: 'read',
17
- description: '获取36氪文章正文内容',
18
- domain: 'www.36kr.com',
19
- strategy: Strategy.INTERCEPT,
20
- args: [
21
- { name: 'id', positional: true, required: true, help: 'Article ID or full 36kr article URL' },
22
- ],
23
- columns: ['field', 'value'],
24
- func: async (page, args) => {
25
- const articleId = parseArticleId(String(args.id ?? ''));
26
- if (!articleId) {
27
- throw new CliError('INVALID_ARGUMENT', 'Invalid article ID or URL');
28
- }
29
- await page.installInterceptor('36kr.com/api');
30
- await page.goto(`https://www.36kr.com/p/${articleId}`);
31
- await page.wait(5);
32
- const data = await page.evaluate(`
33
- (() => {
34
- // Title: 36kr uses class "article-title" on h1
35
- const title = document.querySelector('.article-title, h1')?.textContent?.trim() || '';
36
- // Author: second .author-name (first is empty nav link, second has real name)
37
- const authorEls = document.querySelectorAll('.author-name');
38
- const author = Array.from(authorEls).map(el => el.textContent?.trim()).filter(Boolean)[0] || '';
39
- // Date: 36kr uses class "title-icon-item item-time" for the publish date
40
- const dateRaw = document.querySelector('.item-time')?.textContent?.trim() || '';
41
- const date = dateRaw.replace(/^[·\s]+/, '').trim();
42
- // Article body paragraphs
43
- const bodyEls = document.querySelectorAll('[class*="article-content"] p, [class*="rich-text"] p, .article p');
44
- const body = Array.from(bodyEls)
45
- .map(el => el.textContent?.trim())
46
- .filter(t => t && t.length > 10)
47
- .join(' ')
48
- .slice(0, 800);
49
- return { title, author, date, body };
50
- })()
51
- `);
52
- if (!data?.title) {
53
- throw new CliError('NOT_FOUND', 'Article not found or failed to load', 'Check the article ID');
54
- }
55
- if (!data.body) {
56
- throw new CliError('PARSE_ERROR', 'Article body not found', '36kr page loaded but no article body paragraphs were extracted');
57
- }
58
- return [
59
- { field: 'title', value: data.title },
60
- { field: 'author', value: data.author || '' },
61
- { field: 'date', value: data.date || '' },
62
- { field: 'url', value: `https://36kr.com/p/${articleId}` },
63
- { field: 'body', value: data.body || '' },
64
- ];
65
- },
66
- });
@@ -1,46 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { getRegistry } from '@agentrhq/webcmd/registry';
3
- import { CliError } from '@agentrhq/webcmd/errors';
4
- import './article.js';
5
-
6
- function makePage(evaluateResult) {
7
- return {
8
- installInterceptor: vi.fn().mockResolvedValue(undefined),
9
- goto: vi.fn().mockResolvedValue(undefined),
10
- wait: vi.fn().mockResolvedValue(undefined),
11
- evaluate: vi.fn().mockResolvedValue(evaluateResult),
12
- };
13
- }
14
-
15
- describe('36kr article', () => {
16
- it('emits empty-string for missing optional author / date instead of a sentinel', async () => {
17
- const command = getRegistry().get('36kr/article');
18
- expect(command?.func).toBeDefined();
19
- const page = makePage({ title: 'Real Title', author: '', date: '', body: 'Real article body' });
20
- const rows = await command.func(page, { id: '1234567' });
21
- const byField = Object.fromEntries(rows.map((r) => [r.field, r.value]));
22
- expect(byField.title).toBe('Real Title');
23
- expect(byField.author).toBe('');
24
- expect(byField.date).toBe('');
25
- expect(byField.body).toBe('Real article body');
26
- expect(byField.url).toBe('https://36kr.com/p/1234567');
27
- });
28
-
29
- it('throws CliError NOT_FOUND when the page exposes no title', async () => {
30
- const command = getRegistry().get('36kr/article');
31
- const page = makePage({ title: '', author: 'x', date: 'y', body: 'z' });
32
- await expect(command.func(page, { id: '1234567' })).rejects.toBeInstanceOf(CliError);
33
- });
34
-
35
- it('throws CliError PARSE_ERROR when the page exposes title but no body', async () => {
36
- const command = getRegistry().get('36kr/article');
37
- const page = makePage({ title: 'Real Title', author: 'x', date: 'y', body: '' });
38
- await expect(command.func(page, { id: '1234567' })).rejects.toMatchObject({ code: 'PARSE_ERROR' });
39
- });
40
-
41
- it('throws CliError INVALID_ARGUMENT when no numeric id can be parsed', async () => {
42
- const command = getRegistry().get('36kr/article');
43
- const page = makePage({});
44
- await expect(command.func(page, { id: 'not-a-url' })).rejects.toBeInstanceOf(CliError);
45
- });
46
- });