@agentrhq/webcmd 0.1.2 → 0.2.0

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 (929) hide show
  1. package/README.md +183 -218
  2. package/cli-manifest.json +16247 -34913
  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/followers.js +1 -1
  94. package/clis/twitter/list-remove-core.js +2 -2
  95. package/clis/twitter/list-tweets.test.js +3 -3
  96. package/clis/twitter/lists.js +6 -6
  97. package/clis/twitter/lists.test.js +2 -2
  98. package/clis/twitter/reply-dm.js +1 -1
  99. package/clis/twitter/shared.test.js +4 -5
  100. package/clis/twitter/trending.js +1 -1
  101. package/clis/twitter/utils.js +1 -1
  102. package/clis/web/read.js +1 -1
  103. package/clis/web/read.test.js +2 -2
  104. package/clis/yahoo-finance/quote.js +1 -1
  105. package/clis/youtube/history.js +4 -4
  106. package/clis/youtube/transcript-group.js +1 -1
  107. package/clis/youtube/transcript-group.test.js +5 -5
  108. package/clis/youtube/transcript.js +5 -5
  109. package/clis/youtube/video.js +4 -4
  110. package/clis/youtube/video.test.js +6 -6
  111. package/dist/src/browser/analyze.test.js +13 -13
  112. package/dist/src/browser/bridge-readiness.d.ts +1 -1
  113. package/dist/src/browser/daemon-client.d.ts +1 -0
  114. package/dist/src/browser/daemon-client.js +102 -50
  115. package/dist/src/browser/daemon-client.test.js +104 -19
  116. package/dist/src/browser/errors.js +11 -0
  117. package/dist/src/browser/protocol.d.ts +2 -0
  118. package/dist/src/browser.test.js +2 -2
  119. package/dist/src/cli-argv-preprocess.d.ts +2 -2
  120. package/dist/src/cli-argv-preprocess.js +2 -2
  121. package/dist/src/cli-argv-preprocess.test.js +35 -35
  122. package/dist/src/cli.js +2 -2
  123. package/dist/src/cli.test.js +57 -57
  124. package/dist/src/commanderAdapter.test.js +19 -19
  125. package/dist/src/convention-audit.js +1 -1
  126. package/dist/src/daemon/server.js +28 -23
  127. package/dist/src/daemon/server.test.js +52 -0
  128. package/dist/src/daemon-utils.d.ts +1 -0
  129. package/dist/src/daemon-utils.js +9 -0
  130. package/dist/src/daemon.test.js +10 -1
  131. package/dist/src/doctor.js +7 -1
  132. package/dist/src/doctor.test.js +8 -1
  133. package/dist/src/download/article-download.d.ts +3 -3
  134. package/dist/src/download/article-download.js +7 -7
  135. package/dist/src/download/article-download.test.js +6 -6
  136. package/dist/src/download/index.js +1 -1
  137. package/dist/src/download/index.test.js +1 -2
  138. package/dist/src/download/media-download.d.ts +1 -1
  139. package/dist/src/download/media-download.js +1 -1
  140. package/dist/src/electron-apps.js +0 -8
  141. package/dist/src/electron-apps.test.js +2 -11
  142. package/dist/src/errors.test.js +9 -9
  143. package/dist/src/execution.js +2 -0
  144. package/dist/src/execution.test.js +12 -0
  145. package/dist/src/external-clis.yaml +0 -37
  146. package/dist/src/external.d.ts +1 -1
  147. package/dist/src/external.test.js +2 -17
  148. package/dist/src/generate-release-notes-cli.test.js +140 -0
  149. package/dist/src/help.d.ts +3 -3
  150. package/dist/src/help.test.js +8 -8
  151. package/dist/src/main.js +1 -1
  152. package/dist/src/manifest-types.d.ts +1 -1
  153. package/dist/src/node-network.test.js +2 -2
  154. package/dist/src/output.js +1 -1
  155. package/dist/src/pipeline/steps/download.test.js +3 -3
  156. package/dist/src/registry.test.js +2 -2
  157. package/dist/src/release-notes.d.ts +38 -0
  158. package/dist/src/release-notes.js +99 -0
  159. package/dist/src/release-notes.test.js +61 -0
  160. package/dist/src/serialization.test.js +7 -7
  161. package/dist/src/snapshotFormatter.js +3 -5
  162. package/dist/src/snapshotFormatter.test.d.ts +1 -1
  163. package/dist/src/snapshotFormatter.test.js +50 -50
  164. package/dist/src/tui.js +1 -1
  165. package/package.json +4 -1
  166. package/scripts/generate-release-notes.ts +234 -0
  167. package/scripts/postinstall.js +1 -1
  168. package/scripts/silent-column-drop-baseline.json +0 -498
  169. package/scripts/typed-error-lint-baseline.json +0 -464
  170. package/skills/webcmd-adapter-author/SKILL.md +216 -213
  171. package/skills/webcmd-adapter-author/references/adapter-template.md +206 -399
  172. package/skills/webcmd-adapter-author/references/api-discovery.md +111 -220
  173. package/skills/webcmd-adapter-author/references/coverage-matrix.md +34 -68
  174. package/skills/webcmd-adapter-author/references/field-conventions.md +84 -167
  175. package/skills/webcmd-adapter-author/references/field-decode-playbook.md +60 -146
  176. package/skills/webcmd-adapter-author/references/jsdom-fixture-pattern.md +111 -178
  177. package/skills/webcmd-adapter-author/references/output-design.md +47 -125
  178. package/skills/webcmd-adapter-author/references/site-memory.md +116 -166
  179. package/skills/webcmd-adapter-author/references/site-recon.md +74 -78
  180. package/skills/webcmd-adapter-author/references/strategy-selection.md +80 -124
  181. package/skills/webcmd-adapter-author/references/success-rate-pitfalls.md +80 -105
  182. package/skills/webcmd-adapter-author/references/typed-errors.md +87 -178
  183. package/skills/webcmd-autofix/SKILL.md +136 -143
  184. package/skills/webcmd-sitemap-author/SKILL.md +58 -67
  185. package/skills/webcmd-sitemap-author/references/sitemap-schema.md +354 -494
  186. package/skills/webcmd-usage/SKILL.md +106 -97
  187. package/clis/12306/auth.js +0 -59
  188. package/clis/12306/me.js +0 -73
  189. package/clis/12306/orders.js +0 -96
  190. package/clis/12306/passengers.js +0 -90
  191. package/clis/12306/price.js +0 -166
  192. package/clis/12306/stations.js +0 -66
  193. package/clis/12306/train.js +0 -91
  194. package/clis/12306/trains.js +0 -166
  195. package/clis/12306/utils.js +0 -272
  196. package/clis/12306/utils.test.js +0 -424
  197. package/clis/1688/assets.js +0 -205
  198. package/clis/1688/assets.test.js +0 -39
  199. package/clis/1688/auth.js +0 -46
  200. package/clis/1688/download.js +0 -77
  201. package/clis/1688/download.test.js +0 -31
  202. package/clis/1688/item.js +0 -188
  203. package/clis/1688/item.test.js +0 -67
  204. package/clis/1688/search.js +0 -310
  205. package/clis/1688/search.test.js +0 -75
  206. package/clis/1688/shared.js +0 -557
  207. package/clis/1688/shared.test.js +0 -57
  208. package/clis/1688/store.js +0 -227
  209. package/clis/1688/store.test.js +0 -62
  210. package/clis/1point3acres/auth.js +0 -52
  211. package/clis/1point3acres/digest.js +0 -35
  212. package/clis/1point3acres/forum.js +0 -51
  213. package/clis/1point3acres/forums.js +0 -44
  214. package/clis/1point3acres/hot.js +0 -35
  215. package/clis/1point3acres/latest.js +0 -35
  216. package/clis/1point3acres/notifications.js +0 -64
  217. package/clis/1point3acres/search.js +0 -71
  218. package/clis/1point3acres/thread.js +0 -117
  219. package/clis/1point3acres/user.js +0 -77
  220. package/clis/1point3acres/utils.js +0 -247
  221. package/clis/36kr/article.js +0 -66
  222. package/clis/36kr/article.test.js +0 -46
  223. package/clis/36kr/hot.js +0 -87
  224. package/clis/36kr/hot.test.js +0 -15
  225. package/clis/36kr/news.js +0 -52
  226. package/clis/36kr/news.test.js +0 -85
  227. package/clis/36kr/search.js +0 -79
  228. package/clis/51job/company.js +0 -126
  229. package/clis/51job/detail.js +0 -109
  230. package/clis/51job/hot.js +0 -56
  231. package/clis/51job/search.js +0 -80
  232. package/clis/51job/utils.js +0 -302
  233. package/clis/51job/utils.test.js +0 -69
  234. package/clis/aibase/news.js +0 -110
  235. package/clis/aibase/news.test.js +0 -59
  236. package/clis/autohome/__fixtures__/catalog.html +0 -11
  237. package/clis/autohome/__fixtures__/koubei.json +0 -116
  238. package/clis/autohome/autohome.test.js +0 -115
  239. package/clis/autohome/brand.js +0 -108
  240. package/clis/autohome/score.js +0 -103
  241. package/clis/autohome/utils.js +0 -157
  242. package/clis/baidu-scholar/search.js +0 -87
  243. package/clis/baidu-scholar/search.test.js +0 -23
  244. package/clis/bilibili/auth.js +0 -36
  245. package/clis/bilibili/comment.js +0 -107
  246. package/clis/bilibili/comment.test.js +0 -153
  247. package/clis/bilibili/comments.js +0 -136
  248. package/clis/bilibili/comments.test.js +0 -142
  249. package/clis/bilibili/download.js +0 -178
  250. package/clis/bilibili/download.test.js +0 -173
  251. package/clis/bilibili/dynamic.js +0 -34
  252. package/clis/bilibili/dynamic.test.js +0 -68
  253. package/clis/bilibili/favorite.js +0 -47
  254. package/clis/bilibili/feed.js +0 -220
  255. package/clis/bilibili/follow.js +0 -140
  256. package/clis/bilibili/follow.test.js +0 -203
  257. package/clis/bilibili/following.js +0 -44
  258. package/clis/bilibili/history.js +0 -45
  259. package/clis/bilibili/hot.js +0 -40
  260. package/clis/bilibili/hot.test.js +0 -17
  261. package/clis/bilibili/me.js +0 -13
  262. package/clis/bilibili/ranking.js +0 -25
  263. package/clis/bilibili/search.js +0 -24
  264. package/clis/bilibili/subtitle.js +0 -141
  265. package/clis/bilibili/subtitle.test.js +0 -240
  266. package/clis/bilibili/summary.js +0 -167
  267. package/clis/bilibili/summary.test.js +0 -210
  268. package/clis/bilibili/unfollow.js +0 -121
  269. package/clis/bilibili/user-videos.js +0 -39
  270. package/clis/bilibili/utils.js +0 -273
  271. package/clis/bilibili/utils.test.js +0 -97
  272. package/clis/bilibili/video.js +0 -155
  273. package/clis/bilibili/video.test.js +0 -308
  274. package/clis/boss/auth.js +0 -47
  275. package/clis/boss/batchgreet.js +0 -61
  276. package/clis/boss/chatlist.js +0 -116
  277. package/clis/boss/chatlist.test.js +0 -211
  278. package/clis/boss/chatmsg.js +0 -117
  279. package/clis/boss/chatmsg.test.js +0 -230
  280. package/clis/boss/detail.js +0 -63
  281. package/clis/boss/exchange.js +0 -46
  282. package/clis/boss/greet.js +0 -49
  283. package/clis/boss/invite.js +0 -64
  284. package/clis/boss/joblist.js +0 -31
  285. package/clis/boss/mark.js +0 -70
  286. package/clis/boss/recommend.js +0 -45
  287. package/clis/boss/resume.js +0 -150
  288. package/clis/boss/search.js +0 -197
  289. package/clis/boss/search.test.js +0 -78
  290. package/clis/boss/send.js +0 -44
  291. package/clis/boss/stats.js +0 -66
  292. package/clis/boss/utils.js +0 -468
  293. package/clis/boss/utils.test.js +0 -34
  294. package/clis/chaoxing/assignments.js +0 -76
  295. package/clis/chaoxing/auth.js +0 -54
  296. package/clis/chaoxing/exams.js +0 -75
  297. package/clis/chaoxing/utils.js +0 -223
  298. package/clis/chaoxing/utils.test.js +0 -45
  299. package/clis/cnki/search.js +0 -61
  300. package/clis/cnki/search.test.js +0 -18
  301. package/clis/ctrip/auth.js +0 -50
  302. package/clis/ctrip/ctrip.test.js +0 -719
  303. package/clis/ctrip/flight.js +0 -136
  304. package/clis/ctrip/hotel-search.js +0 -132
  305. package/clis/ctrip/hotel-suggest.js +0 -45
  306. package/clis/ctrip/search.js +0 -41
  307. package/clis/ctrip/utils.js +0 -473
  308. package/clis/deepseek/ask.js +0 -158
  309. package/clis/deepseek/ask.test.js +0 -399
  310. package/clis/deepseek/auth.js +0 -54
  311. package/clis/deepseek/detail.js +0 -46
  312. package/clis/deepseek/detail.test.js +0 -81
  313. package/clis/deepseek/history.js +0 -27
  314. package/clis/deepseek/new.js +0 -33
  315. package/clis/deepseek/read.js +0 -25
  316. package/clis/deepseek/send.js +0 -140
  317. package/clis/deepseek/send.test.js +0 -107
  318. package/clis/deepseek/status.js +0 -26
  319. package/clis/deepseek/utils.js +0 -487
  320. package/clis/deepseek/utils.test.js +0 -370
  321. package/clis/dianping/__fixtures__/search.html +0 -168
  322. package/clis/dianping/__fixtures__/shop.html +0 -6
  323. package/clis/dianping/auth.js +0 -49
  324. package/clis/dianping/cityResolver.js +0 -185
  325. package/clis/dianping/dianping.test.js +0 -578
  326. package/clis/dianping/search.js +0 -157
  327. package/clis/dianping/shop.js +0 -173
  328. package/clis/dianping/utils.js +0 -157
  329. package/clis/dongchedi/__fixtures__/search.json +0 -60
  330. package/clis/dongchedi/__fixtures__/series-detail.json +0 -911
  331. package/clis/dongchedi/__fixtures__/series-score.json +0 -1396
  332. package/clis/dongchedi/dongchedi.test.js +0 -191
  333. package/clis/dongchedi/koubei.js +0 -85
  334. package/clis/dongchedi/models.js +0 -91
  335. package/clis/dongchedi/score.js +0 -83
  336. package/clis/dongchedi/search.js +0 -83
  337. package/clis/dongchedi/series.js +0 -87
  338. package/clis/dongchedi/specs.js +0 -115
  339. package/clis/dongchedi/utils.js +0 -180
  340. package/clis/douban/auth.js +0 -50
  341. package/clis/douban/book-hot.js +0 -15
  342. package/clis/douban/download.js +0 -68
  343. package/clis/douban/download.test.js +0 -170
  344. package/clis/douban/marks.js +0 -116
  345. package/clis/douban/movie-hot.js +0 -15
  346. package/clis/douban/movie-hot.test.js +0 -14
  347. package/clis/douban/photos.js +0 -35
  348. package/clis/douban/reviews.js +0 -107
  349. package/clis/douban/search.js +0 -18
  350. package/clis/douban/search.test.js +0 -11
  351. package/clis/douban/subject.js +0 -46
  352. package/clis/douban/subject.test.js +0 -11
  353. package/clis/douban/top250.js +0 -68
  354. package/clis/douban/utils.js +0 -657
  355. package/clis/douban/utils.test.js +0 -488
  356. package/clis/doubao/ask.js +0 -40
  357. package/clis/doubao/auth.js +0 -66
  358. package/clis/doubao/detail.js +0 -35
  359. package/clis/doubao/detail.test.js +0 -42
  360. package/clis/doubao/history.js +0 -30
  361. package/clis/doubao/history.test.js +0 -37
  362. package/clis/doubao/meeting-summary.js +0 -41
  363. package/clis/doubao/meeting-transcript.js +0 -38
  364. package/clis/doubao/new.js +0 -22
  365. package/clis/doubao/read.js +0 -21
  366. package/clis/doubao/send.js +0 -24
  367. package/clis/doubao/status.js +0 -26
  368. package/clis/doubao/utils.js +0 -1156
  369. package/clis/doubao/utils.test.js +0 -396
  370. package/clis/doubao-app/ask.js +0 -54
  371. package/clis/doubao-app/dump.js +0 -25
  372. package/clis/doubao-app/new.js +0 -21
  373. package/clis/doubao-app/read.js +0 -19
  374. package/clis/doubao-app/screenshot.js +0 -19
  375. package/clis/doubao-app/send.js +0 -28
  376. package/clis/doubao-app/status.js +0 -17
  377. package/clis/doubao-app/utils.js +0 -110
  378. package/clis/douyin/_shared/browser-fetch.js +0 -66
  379. package/clis/douyin/_shared/browser-fetch.test.js +0 -64
  380. package/clis/douyin/_shared/creation-id.js +0 -5
  381. package/clis/douyin/_shared/creation-id.test.js +0 -22
  382. package/clis/douyin/_shared/evaluate-result.js +0 -16
  383. package/clis/douyin/_shared/imagex-upload.js +0 -53
  384. package/clis/douyin/_shared/imagex-upload.test.js +0 -87
  385. package/clis/douyin/_shared/public-api.js +0 -29
  386. package/clis/douyin/_shared/sts2.js +0 -21
  387. package/clis/douyin/_shared/sts2.test.js +0 -27
  388. package/clis/douyin/_shared/text-extra.js +0 -15
  389. package/clis/douyin/_shared/text-extra.test.js +0 -37
  390. package/clis/douyin/_shared/timing.js +0 -22
  391. package/clis/douyin/_shared/timing.test.js +0 -28
  392. package/clis/douyin/_shared/tos-upload-short-read.test.js +0 -83
  393. package/clis/douyin/_shared/tos-upload.js +0 -331
  394. package/clis/douyin/_shared/tos-upload.test.js +0 -229
  395. package/clis/douyin/_shared/transcode.js +0 -45
  396. package/clis/douyin/_shared/transcode.test.js +0 -91
  397. package/clis/douyin/_shared/vod-upload.js +0 -212
  398. package/clis/douyin/_shared/vod-upload.test.js +0 -38
  399. package/clis/douyin/activities.js +0 -23
  400. package/clis/douyin/activities.test.js +0 -55
  401. package/clis/douyin/auth.js +0 -39
  402. package/clis/douyin/collections.js +0 -23
  403. package/clis/douyin/collections.test.js +0 -45
  404. package/clis/douyin/delete.js +0 -152
  405. package/clis/douyin/delete.test.js +0 -100
  406. package/clis/douyin/draft.js +0 -355
  407. package/clis/douyin/draft.test.js +0 -335
  408. package/clis/douyin/drafts.js +0 -24
  409. package/clis/douyin/drafts.test.js +0 -11
  410. package/clis/douyin/hashtag.js +0 -114
  411. package/clis/douyin/hashtag.test.js +0 -171
  412. package/clis/douyin/location.js +0 -25
  413. package/clis/douyin/location.test.js +0 -23
  414. package/clis/douyin/profile.js +0 -29
  415. package/clis/douyin/profile.test.js +0 -46
  416. package/clis/douyin/publish-upload-id.test.js +0 -206
  417. package/clis/douyin/publish.js +0 -341
  418. package/clis/douyin/publish.test.js +0 -38
  419. package/clis/douyin/search.js +0 -308
  420. package/clis/douyin/search.test.js +0 -307
  421. package/clis/douyin/stats.js +0 -28
  422. package/clis/douyin/stats.test.js +0 -22
  423. package/clis/douyin/update.js +0 -32
  424. package/clis/douyin/update.test.js +0 -11
  425. package/clis/douyin/user-videos.js +0 -82
  426. package/clis/douyin/user-videos.test.js +0 -151
  427. package/clis/douyin/videos.js +0 -52
  428. package/clis/douyin/videos.test.js +0 -54
  429. package/clis/eastmoney/_secid.js +0 -78
  430. package/clis/eastmoney/announcement.js +0 -53
  431. package/clis/eastmoney/convertible.js +0 -74
  432. package/clis/eastmoney/etf.js +0 -66
  433. package/clis/eastmoney/holders.js +0 -79
  434. package/clis/eastmoney/hot-rank.js +0 -51
  435. package/clis/eastmoney/hot-rank.test.js +0 -59
  436. package/clis/eastmoney/index-board.js +0 -97
  437. package/clis/eastmoney/kline.js +0 -88
  438. package/clis/eastmoney/kuaixun.js +0 -55
  439. package/clis/eastmoney/longhu.js +0 -68
  440. package/clis/eastmoney/money-flow.js +0 -79
  441. package/clis/eastmoney/northbound.js +0 -58
  442. package/clis/eastmoney/quote.js +0 -108
  443. package/clis/eastmoney/rank.js +0 -95
  444. package/clis/eastmoney/sectors.js +0 -77
  445. package/clis/flomo/auth.js +0 -55
  446. package/clis/flomo/memos.js +0 -228
  447. package/clis/flomo/memos.test.js +0 -144
  448. package/clis/gitee/auth.js +0 -41
  449. package/clis/gitee/index.js +0 -3
  450. package/clis/gitee/search.js +0 -137
  451. package/clis/gitee/search.test.js +0 -65
  452. package/clis/gitee/trending.js +0 -568
  453. package/clis/gitee/user.js +0 -200
  454. package/clis/gitee/user.test.js +0 -63
  455. package/clis/gov-law/commands.test.js +0 -39
  456. package/clis/gov-law/recent.js +0 -22
  457. package/clis/gov-law/search.js +0 -41
  458. package/clis/gov-law/shared.js +0 -51
  459. package/clis/gov-policy/__fixtures__/recent.html +0 -16
  460. package/clis/gov-policy/__fixtures__/search.html +0 -41
  461. package/clis/gov-policy/gov-policy.test.js +0 -224
  462. package/clis/gov-policy/recent.js +0 -90
  463. package/clis/gov-policy/search.js +0 -91
  464. package/clis/gov-policy/utils.js +0 -54
  465. package/clis/guazi/__fixtures__/detail.html +0 -7
  466. package/clis/guazi/__fixtures__/list.html +0 -5
  467. package/clis/guazi/browse.js +0 -95
  468. package/clis/guazi/car.js +0 -110
  469. package/clis/guazi/guazi.test.js +0 -126
  470. package/clis/guazi/utils.js +0 -133
  471. package/clis/huodongxing/events.js +0 -322
  472. package/clis/huodongxing/events.test.js +0 -296
  473. package/clis/hupu/__fixtures__/hot-home.html +0 -64
  474. package/clis/hupu/auth.js +0 -47
  475. package/clis/hupu/detail.js +0 -72
  476. package/clis/hupu/hot.js +0 -163
  477. package/clis/hupu/hot.test.js +0 -224
  478. package/clis/hupu/like.js +0 -76
  479. package/clis/hupu/mentions.js +0 -160
  480. package/clis/hupu/reply.js +0 -72
  481. package/clis/hupu/search.js +0 -60
  482. package/clis/hupu/unlike.js +0 -76
  483. package/clis/hupu/utils.js +0 -319
  484. package/clis/jd/add-cart.js +0 -72
  485. package/clis/jd/auth.js +0 -46
  486. package/clis/jd/cart.js +0 -80
  487. package/clis/jd/commands.test.js +0 -41
  488. package/clis/jd/detail.js +0 -63
  489. package/clis/jd/item.js +0 -730
  490. package/clis/jd/item.test.js +0 -354
  491. package/clis/jd/item.test.ts +0 -517
  492. package/clis/jd/reviews.js +0 -55
  493. package/clis/jd/search.js +0 -66
  494. package/clis/jianyu/auth.js +0 -62
  495. package/clis/jianyu/detail.js +0 -21
  496. package/clis/jianyu/search.js +0 -634
  497. package/clis/jianyu/search.test.js +0 -153
  498. package/clis/jianyu/shared/china-bid-search.js +0 -165
  499. package/clis/jianyu/shared/procurement-contract.js +0 -324
  500. package/clis/jianyu/shared/procurement-contract.test.js +0 -72
  501. package/clis/jianyu/shared/procurement-detail.js +0 -107
  502. package/clis/jianyu/shared/procurement-detail.test.js +0 -84
  503. package/clis/jike/auth.js +0 -48
  504. package/clis/jike/comment.js +0 -107
  505. package/clis/jike/create.js +0 -106
  506. package/clis/jike/feed.js +0 -68
  507. package/clis/jike/like.js +0 -61
  508. package/clis/jike/notifications.js +0 -169
  509. package/clis/jike/post.js +0 -72
  510. package/clis/jike/read.test.js +0 -86
  511. package/clis/jike/repost.js +0 -103
  512. package/clis/jike/search.js +0 -68
  513. package/clis/jike/topic.js +0 -65
  514. package/clis/jike/user.js +0 -65
  515. package/clis/jike/utils.js +0 -25
  516. package/clis/jimeng/auth.js +0 -46
  517. package/clis/jimeng/generate.js +0 -84
  518. package/clis/jimeng/history.js +0 -48
  519. package/clis/jimeng/new.js +0 -44
  520. package/clis/jimeng/workspaces.js +0 -42
  521. package/clis/juejin/hot.js +0 -37
  522. package/clis/juejin/juejin.test.js +0 -241
  523. package/clis/juejin/recommend.js +0 -61
  524. package/clis/juejin/utils.js +0 -199
  525. package/clis/ke/auth.js +0 -46
  526. package/clis/ke/chengjiao.js +0 -78
  527. package/clis/ke/ershoufang.js +0 -101
  528. package/clis/ke/utils.js +0 -104
  529. package/clis/ke/xiaoqu.js +0 -78
  530. package/clis/ke/zufang.js +0 -95
  531. package/clis/kimi/_utils.js +0 -110
  532. package/clis/kimi/audit-extras.js +0 -268
  533. package/clis/kimi/auth.js +0 -57
  534. package/clis/kimi/chat.js +0 -470
  535. package/clis/kimi/kimi.test.js +0 -187
  536. package/clis/kimi/storage.js +0 -169
  537. package/clis/kimi/ui.js +0 -314
  538. package/clis/kimi/usage.js +0 -144
  539. package/clis/linux-do/auth.js +0 -55
  540. package/clis/linux-do/categories.js +0 -50
  541. package/clis/linux-do/feed.js +0 -395
  542. package/clis/linux-do/feed.test.js +0 -153
  543. package/clis/linux-do/search.js +0 -29
  544. package/clis/linux-do/tags.js +0 -28
  545. package/clis/linux-do/topic-content.js +0 -155
  546. package/clis/linux-do/topic-content.test.js +0 -59
  547. package/clis/linux-do/topic.js +0 -53
  548. package/clis/linux-do/user-posts.js +0 -57
  549. package/clis/linux-do/user-topics.js +0 -37
  550. package/clis/maimai/auth.js +0 -47
  551. package/clis/maimai/search-talents.js +0 -192
  552. package/clis/maimai/search-talents.test.js +0 -29
  553. package/clis/mubu/doc.js +0 -41
  554. package/clis/mubu/docs.js +0 -44
  555. package/clis/mubu/notes.js +0 -245
  556. package/clis/mubu/recent.js +0 -28
  557. package/clis/mubu/search.js +0 -63
  558. package/clis/mubu/utils.js +0 -304
  559. package/clis/nowcoder/auth.js +0 -65
  560. package/clis/nowcoder/companies.js +0 -24
  561. package/clis/nowcoder/creators.js +0 -28
  562. package/clis/nowcoder/detail.js +0 -62
  563. package/clis/nowcoder/experience.js +0 -37
  564. package/clis/nowcoder/hot.js +0 -25
  565. package/clis/nowcoder/jobs.js +0 -22
  566. package/clis/nowcoder/notifications.js +0 -30
  567. package/clis/nowcoder/papers.js +0 -41
  568. package/clis/nowcoder/practice.js +0 -38
  569. package/clis/nowcoder/recommend.js +0 -31
  570. package/clis/nowcoder/referral.js +0 -40
  571. package/clis/nowcoder/salary.js +0 -41
  572. package/clis/nowcoder/search.js +0 -50
  573. package/clis/nowcoder/suggest.js +0 -34
  574. package/clis/nowcoder/topics.js +0 -28
  575. package/clis/nowcoder/trending.js +0 -26
  576. package/clis/ones/common.js +0 -144
  577. package/clis/ones/enrich-tasks.js +0 -37
  578. package/clis/ones/login.js +0 -81
  579. package/clis/ones/logout.js +0 -18
  580. package/clis/ones/me.js +0 -31
  581. package/clis/ones/my-tasks.js +0 -121
  582. package/clis/ones/resolve-labels.js +0 -64
  583. package/clis/ones/task-helpers.js +0 -212
  584. package/clis/ones/task-helpers.test.js +0 -12
  585. package/clis/ones/task.js +0 -67
  586. package/clis/ones/tasks.js +0 -80
  587. package/clis/ones/token-info.js +0 -43
  588. package/clis/ones/worklog.js +0 -268
  589. package/clis/ones/worklog.test.js +0 -20
  590. package/clis/powerchina/auth.js +0 -52
  591. package/clis/powerchina/search.js +0 -251
  592. package/clis/powerchina/search.test.js +0 -93
  593. package/clis/quark/auth.js +0 -47
  594. package/clis/quark/ls.js +0 -64
  595. package/clis/quark/mkdir.js +0 -37
  596. package/clis/quark/mv.js +0 -54
  597. package/clis/quark/rename.js +0 -27
  598. package/clis/quark/rm.js +0 -25
  599. package/clis/quark/save.js +0 -81
  600. package/clis/quark/share-tree.js +0 -46
  601. package/clis/quark/utils.js +0 -146
  602. package/clis/quark/utils.test.js +0 -58
  603. package/clis/qwen/ask.js +0 -104
  604. package/clis/qwen/ask.test.js +0 -36
  605. package/clis/qwen/auth.js +0 -56
  606. package/clis/qwen/detail.js +0 -62
  607. package/clis/qwen/history.js +0 -61
  608. package/clis/qwen/image.js +0 -179
  609. package/clis/qwen/new.js +0 -23
  610. package/clis/qwen/read.js +0 -41
  611. package/clis/qwen/send.js +0 -55
  612. package/clis/qwen/status.js +0 -37
  613. package/clis/qwen/utils.js +0 -461
  614. package/clis/qwen/utils.test.js +0 -128
  615. package/clis/rednote/auth.js +0 -52
  616. package/clis/rednote/comments.js +0 -85
  617. package/clis/rednote/download.js +0 -59
  618. package/clis/rednote/feed.js +0 -27
  619. package/clis/rednote/navigation.test.js +0 -26
  620. package/clis/rednote/note.js +0 -68
  621. package/clis/rednote/notifications.js +0 -139
  622. package/clis/rednote/rednote.test.js +0 -240
  623. package/clis/rednote/search.js +0 -107
  624. package/clis/rednote/user.js +0 -55
  625. package/clis/sinablog/article.js +0 -15
  626. package/clis/sinablog/hot.js +0 -15
  627. package/clis/sinablog/search.js +0 -52
  628. package/clis/sinablog/user.js +0 -16
  629. package/clis/sinablog/utils.js +0 -186
  630. package/clis/sinafinance/news.js +0 -62
  631. package/clis/sinafinance/rolling-news.js +0 -41
  632. package/clis/sinafinance/stock-rank.js +0 -66
  633. package/clis/sinafinance/stock.js +0 -121
  634. package/clis/sinafinance/stock.test.js +0 -59
  635. package/clis/smzdm/search.js +0 -149
  636. package/clis/smzdm/search.test.js +0 -114
  637. package/clis/taobao/add-cart.js +0 -150
  638. package/clis/taobao/auth.js +0 -58
  639. package/clis/taobao/cart.js +0 -96
  640. package/clis/taobao/commands.test.js +0 -41
  641. package/clis/taobao/detail.js +0 -71
  642. package/clis/taobao/reviews.js +0 -77
  643. package/clis/taobao/search.js +0 -97
  644. package/clis/tdx/hot-rank.js +0 -48
  645. package/clis/tdx/hot-rank.test.js +0 -59
  646. package/clis/ths/hot-rank.js +0 -50
  647. package/clis/ths/hot-rank.test.js +0 -64
  648. package/clis/tieba/commands.test.js +0 -79
  649. package/clis/tieba/hot.js +0 -48
  650. package/clis/tieba/posts.js +0 -86
  651. package/clis/tieba/read.js +0 -141
  652. package/clis/tieba/search.js +0 -109
  653. package/clis/tieba/utils.js +0 -240
  654. package/clis/tieba/utils.test.js +0 -290
  655. package/clis/toutiao/articles.js +0 -55
  656. package/clis/toutiao/auth.js +0 -70
  657. package/clis/toutiao/hot.js +0 -63
  658. package/clis/toutiao/toutiao.test.js +0 -378
  659. package/clis/toutiao/utils.js +0 -161
  660. package/clis/trae-cn/activity.js +0 -22
  661. package/clis/trae-cn/approve.js +0 -52
  662. package/clis/trae-cn/ask.js +0 -99
  663. package/clis/trae-cn/dump.js +0 -5
  664. package/clis/trae-cn/export.js +0 -40
  665. package/clis/trae-cn/model.js +0 -22
  666. package/clis/trae-cn/new.js +0 -63
  667. package/clis/trae-cn/read.js +0 -23
  668. package/clis/trae-cn/screenshot.js +0 -5
  669. package/clis/trae-cn/select-model.js +0 -25
  670. package/clis/trae-cn/send.js +0 -23
  671. package/clis/trae-cn/setup.js +0 -75
  672. package/clis/trae-cn/status.js +0 -27
  673. package/clis/trae-cn/targets.js +0 -96
  674. package/clis/trae-cn/trae-cn.test.js +0 -412
  675. package/clis/trae-cn/utils.js +0 -750
  676. package/clis/trae-cn/watch.js +0 -119
  677. package/clis/uisdc/news.js +0 -105
  678. package/clis/uisdc/news.test.js +0 -66
  679. package/clis/v2ex/auth.js +0 -44
  680. package/clis/v2ex/daily.js +0 -99
  681. package/clis/v2ex/hot.js +0 -26
  682. package/clis/v2ex/latest.js +0 -26
  683. package/clis/v2ex/me.js +0 -100
  684. package/clis/v2ex/member.js +0 -28
  685. package/clis/v2ex/node.js +0 -39
  686. package/clis/v2ex/nodes.js +0 -26
  687. package/clis/v2ex/notifications.js +0 -72
  688. package/clis/v2ex/replies.js +0 -27
  689. package/clis/v2ex/topic.js +0 -31
  690. package/clis/v2ex/user.js +0 -34
  691. package/clis/wanfang/search.js +0 -66
  692. package/clis/wanfang/search.test.js +0 -23
  693. package/clis/wechat-channels/auth.js +0 -62
  694. package/clis/wechat-channels/publish.js +0 -732
  695. package/clis/wechat-channels/publish.test.js +0 -144
  696. package/clis/weibo/auth.js +0 -53
  697. package/clis/weibo/comments.js +0 -53
  698. package/clis/weibo/delete.js +0 -172
  699. package/clis/weibo/delete.test.js +0 -94
  700. package/clis/weibo/envelope.test.js +0 -85
  701. package/clis/weibo/favorites.js +0 -170
  702. package/clis/weibo/favorites.test.js +0 -114
  703. package/clis/weibo/feed.js +0 -69
  704. package/clis/weibo/hot.js +0 -39
  705. package/clis/weibo/me.js +0 -75
  706. package/clis/weibo/post.js +0 -75
  707. package/clis/weibo/publish.js +0 -306
  708. package/clis/weibo/publish.test.js +0 -192
  709. package/clis/weibo/search.js +0 -80
  710. package/clis/weibo/user-posts.js +0 -234
  711. package/clis/weibo/user-posts.test.js +0 -92
  712. package/clis/weibo/user.js +0 -63
  713. package/clis/weibo/utils.js +0 -59
  714. package/clis/weibo/utils.test.js +0 -36
  715. package/clis/weixin/create-draft.js +0 -226
  716. package/clis/weixin/download.js +0 -371
  717. package/clis/weixin/download.test.js +0 -106
  718. package/clis/weixin/drafts.js +0 -66
  719. package/clis/weixin/drafts.test.js +0 -69
  720. package/clis/weixin/search.js +0 -157
  721. package/clis/weixin/search.test.js +0 -227
  722. package/clis/weread/ai-outline.js +0 -171
  723. package/clis/weread/ai-outline.test.js +0 -83
  724. package/clis/weread/auth.js +0 -59
  725. package/clis/weread/book-search.js +0 -438
  726. package/clis/weread/book-search.test.js +0 -242
  727. package/clis/weread/book.js +0 -233
  728. package/clis/weread/commands.test.js +0 -398
  729. package/clis/weread/highlights.js +0 -24
  730. package/clis/weread/notebooks.js +0 -22
  731. package/clis/weread/notes.js +0 -30
  732. package/clis/weread/private-api-regression.test.js +0 -369
  733. package/clis/weread/ranking.js +0 -29
  734. package/clis/weread/search-regression.test.js +0 -494
  735. package/clis/weread/search.js +0 -186
  736. package/clis/weread/shelf.js +0 -66
  737. package/clis/weread/utils.js +0 -321
  738. package/clis/weread/utils.test.js +0 -128
  739. package/clis/weread-official/book.js +0 -135
  740. package/clis/weread-official/commands.test.js +0 -385
  741. package/clis/weread-official/discover.js +0 -107
  742. package/clis/weread-official/list-apis.js +0 -95
  743. package/clis/weread-official/notes.js +0 -171
  744. package/clis/weread-official/readdata.js +0 -158
  745. package/clis/weread-official/review.js +0 -93
  746. package/clis/weread-official/search.js +0 -106
  747. package/clis/weread-official/shelf.js +0 -97
  748. package/clis/weread-official/utils.js +0 -293
  749. package/clis/weread-official/utils.test.js +0 -242
  750. package/clis/xianyu/auth.js +0 -68
  751. package/clis/xianyu/chat.js +0 -74
  752. package/clis/xianyu/chat.test.js +0 -84
  753. package/clis/xianyu/im.js +0 -322
  754. package/clis/xianyu/im.test.js +0 -253
  755. package/clis/xianyu/inbox.js +0 -96
  756. package/clis/xianyu/item.js +0 -153
  757. package/clis/xianyu/item.test.js +0 -56
  758. package/clis/xianyu/messages.js +0 -91
  759. package/clis/xianyu/publish.js +0 -485
  760. package/clis/xianyu/publish.test.js +0 -220
  761. package/clis/xianyu/reply.js +0 -82
  762. package/clis/xianyu/search.js +0 -262
  763. package/clis/xianyu/search.test.js +0 -104
  764. package/clis/xianyu/utils.js +0 -8
  765. package/clis/xiaoe/auth.js +0 -55
  766. package/clis/xiaoe/catalog.js +0 -227
  767. package/clis/xiaoe/content.js +0 -175
  768. package/clis/xiaoe/courses.js +0 -127
  769. package/clis/xiaoe/detail.js +0 -36
  770. package/clis/xiaoe/play-url.js +0 -121
  771. package/clis/xiaoe/xiaoe.test.js +0 -486
  772. package/clis/xiaohongshu/ask.js +0 -426
  773. package/clis/xiaohongshu/ask.test.js +0 -271
  774. package/clis/xiaohongshu/auth.js +0 -53
  775. package/clis/xiaohongshu/collection-helpers.js +0 -283
  776. package/clis/xiaohongshu/collection-helpers.test.js +0 -125
  777. package/clis/xiaohongshu/comments.js +0 -228
  778. package/clis/xiaohongshu/comments.test.js +0 -320
  779. package/clis/xiaohongshu/creator-note-detail.js +0 -482
  780. package/clis/xiaohongshu/creator-note-detail.test.js +0 -451
  781. package/clis/xiaohongshu/creator-notes-summary.js +0 -98
  782. package/clis/xiaohongshu/creator-notes-summary.test.js +0 -94
  783. package/clis/xiaohongshu/creator-notes.js +0 -479
  784. package/clis/xiaohongshu/creator-notes.test.js +0 -281
  785. package/clis/xiaohongshu/creator-profile.js +0 -55
  786. package/clis/xiaohongshu/creator-stats.js +0 -76
  787. package/clis/xiaohongshu/creator-stats.test.js +0 -24
  788. package/clis/xiaohongshu/delete-note.js +0 -260
  789. package/clis/xiaohongshu/delete-note.test.js +0 -172
  790. package/clis/xiaohongshu/download.js +0 -249
  791. package/clis/xiaohongshu/download.test.js +0 -339
  792. package/clis/xiaohongshu/draft-clear.js +0 -91
  793. package/clis/xiaohongshu/draft-delete.js +0 -103
  794. package/clis/xiaohongshu/draft-open.js +0 -43
  795. package/clis/xiaohongshu/draft-utils.js +0 -142
  796. package/clis/xiaohongshu/drafts.js +0 -28
  797. package/clis/xiaohongshu/drafts.test.js +0 -172
  798. package/clis/xiaohongshu/feed.js +0 -163
  799. package/clis/xiaohongshu/feed.test.js +0 -126
  800. package/clis/xiaohongshu/follow.js +0 -226
  801. package/clis/xiaohongshu/follow.test.js +0 -211
  802. package/clis/xiaohongshu/liked.js +0 -29
  803. package/clis/xiaohongshu/liked.test.js +0 -82
  804. package/clis/xiaohongshu/navigation.test.js +0 -38
  805. package/clis/xiaohongshu/note-helpers.js +0 -69
  806. package/clis/xiaohongshu/note.js +0 -104
  807. package/clis/xiaohongshu/note.test.js +0 -249
  808. package/clis/xiaohongshu/notifications.js +0 -46
  809. package/clis/xiaohongshu/publish.js +0 -1423
  810. package/clis/xiaohongshu/publish.test.js +0 -1141
  811. package/clis/xiaohongshu/saved.js +0 -29
  812. package/clis/xiaohongshu/saved.test.js +0 -143
  813. package/clis/xiaohongshu/search.js +0 -330
  814. package/clis/xiaohongshu/search.test.js +0 -325
  815. package/clis/xiaohongshu/unfollow.js +0 -285
  816. package/clis/xiaohongshu/user-helpers.js +0 -78
  817. package/clis/xiaohongshu/user-helpers.test.js +0 -160
  818. package/clis/xiaohongshu/user.js +0 -140
  819. package/clis/xiaohongshu/user.test.js +0 -141
  820. package/clis/xiaoyuzhou/auth.js +0 -303
  821. package/clis/xiaoyuzhou/auth.test.js +0 -124
  822. package/clis/xiaoyuzhou/download.js +0 -54
  823. package/clis/xiaoyuzhou/download.test.js +0 -135
  824. package/clis/xiaoyuzhou/episode.js +0 -34
  825. package/clis/xiaoyuzhou/podcast-episodes.js +0 -41
  826. package/clis/xiaoyuzhou/podcast-episodes.test.js +0 -78
  827. package/clis/xiaoyuzhou/podcast.js +0 -33
  828. package/clis/xiaoyuzhou/transcript.js +0 -77
  829. package/clis/xiaoyuzhou/transcript.test.js +0 -195
  830. package/clis/xiaoyuzhou/utils.js +0 -15
  831. package/clis/xiaoyuzhou/utils.test.js +0 -39
  832. package/clis/xueqiu/auth.js +0 -63
  833. package/clis/xueqiu/comments.js +0 -355
  834. package/clis/xueqiu/comments.test.js +0 -696
  835. package/clis/xueqiu/danjuan-utils.js +0 -126
  836. package/clis/xueqiu/danjuan-utils.test.js +0 -41
  837. package/clis/xueqiu/earnings-date.js +0 -45
  838. package/clis/xueqiu/feed.js +0 -39
  839. package/clis/xueqiu/fund-holdings.js +0 -29
  840. package/clis/xueqiu/fund-snapshot.js +0 -26
  841. package/clis/xueqiu/groups.js +0 -23
  842. package/clis/xueqiu/hot-stock.js +0 -32
  843. package/clis/xueqiu/hot.js +0 -37
  844. package/clis/xueqiu/kline.js +0 -44
  845. package/clis/xueqiu/search.js +0 -37
  846. package/clis/xueqiu/stock.js +0 -65
  847. package/clis/xueqiu/utils.js +0 -48
  848. package/clis/xueqiu/utils.test.js +0 -26
  849. package/clis/xueqiu/watchlist.js +0 -37
  850. package/clis/youdao/note.js +0 -258
  851. package/clis/youdao/note.test.js +0 -99
  852. package/clis/yuanbao/ask.js +0 -362
  853. package/clis/yuanbao/ask.test.js +0 -124
  854. package/clis/yuanbao/auth.js +0 -59
  855. package/clis/yuanbao/detail.js +0 -65
  856. package/clis/yuanbao/history.js +0 -51
  857. package/clis/yuanbao/new.js +0 -72
  858. package/clis/yuanbao/new.test.js +0 -30
  859. package/clis/yuanbao/read.js +0 -38
  860. package/clis/yuanbao/send.js +0 -57
  861. package/clis/yuanbao/shared.js +0 -341
  862. package/clis/yuanbao/shared.test.js +0 -80
  863. package/clis/yuanbao/status.js +0 -44
  864. package/clis/zhihu/answer-comments.js +0 -280
  865. package/clis/zhihu/answer-comments.test.js +0 -287
  866. package/clis/zhihu/answer-detail.js +0 -216
  867. package/clis/zhihu/answer-detail.test.js +0 -338
  868. package/clis/zhihu/answer.js +0 -54
  869. package/clis/zhihu/answer.test.js +0 -54
  870. package/clis/zhihu/auth.js +0 -59
  871. package/clis/zhihu/collection.js +0 -199
  872. package/clis/zhihu/collection.test.js +0 -337
  873. package/clis/zhihu/collections.js +0 -128
  874. package/clis/zhihu/collections.test.js +0 -182
  875. package/clis/zhihu/comment.js +0 -55
  876. package/clis/zhihu/comment.test.js +0 -50
  877. package/clis/zhihu/download.js +0 -80
  878. package/clis/zhihu/download.test.js +0 -12
  879. package/clis/zhihu/favorite.js +0 -87
  880. package/clis/zhihu/favorite.test.js +0 -59
  881. package/clis/zhihu/follow.js +0 -50
  882. package/clis/zhihu/follow.test.js +0 -42
  883. package/clis/zhihu/followers.js +0 -40
  884. package/clis/zhihu/followers.test.js +0 -42
  885. package/clis/zhihu/following.js +0 -40
  886. package/clis/zhihu/following.test.js +0 -44
  887. package/clis/zhihu/hot.js +0 -44
  888. package/clis/zhihu/like.js +0 -47
  889. package/clis/zhihu/like.test.js +0 -41
  890. package/clis/zhihu/paginate.js +0 -128
  891. package/clis/zhihu/pins.js +0 -41
  892. package/clis/zhihu/pins.test.js +0 -44
  893. package/clis/zhihu/question.js +0 -113
  894. package/clis/zhihu/question.test.js +0 -251
  895. package/clis/zhihu/recommend.js +0 -103
  896. package/clis/zhihu/recommend.test.js +0 -143
  897. package/clis/zhihu/search.js +0 -206
  898. package/clis/zhihu/search.test.js +0 -198
  899. package/clis/zhihu/target.js +0 -91
  900. package/clis/zhihu/target.test.js +0 -77
  901. package/clis/zhihu/text.js +0 -29
  902. package/clis/zhihu/text.test.js +0 -24
  903. package/clis/zhihu/user-answers.js +0 -41
  904. package/clis/zhihu/user-answers.test.js +0 -69
  905. package/clis/zhihu/user-arg.js +0 -34
  906. package/clis/zhihu/user-articles.js +0 -40
  907. package/clis/zhihu/user-articles.test.js +0 -44
  908. package/clis/zhihu/user.js +0 -59
  909. package/clis/zhihu/user.test.js +0 -73
  910. package/clis/zhihu/write-shared.js +0 -228
  911. package/clis/zhihu/write-shared.test.js +0 -176
  912. package/clis/zsxq/auth.js +0 -68
  913. package/clis/zsxq/dynamics.js +0 -48
  914. package/clis/zsxq/groups.js +0 -33
  915. package/clis/zsxq/search.js +0 -44
  916. package/clis/zsxq/search.test.js +0 -24
  917. package/clis/zsxq/topic.js +0 -50
  918. package/clis/zsxq/topic.test.js +0 -30
  919. package/clis/zsxq/topics.js +0 -26
  920. package/clis/zsxq/topics.test.js +0 -24
  921. package/clis/zsxq/utils.js +0 -233
  922. package/clis/zsxq/utils.test.js +0 -31
  923. package/dist/src/weixin-download.test.js +0 -45
  924. package/skills/webcmd-adapter-author/references/site-memory/bilibili.md +0 -70
  925. package/skills/webcmd-adapter-author/references/site-memory/eastmoney.md +0 -70
  926. package/skills/webcmd-adapter-author/references/site-memory/tonghuashun.md +0 -51
  927. package/skills/webcmd-adapter-author/references/site-memory/xueqiu.md +0 -58
  928. /package/{clis/douyin/_shared/types.js → dist/src/generate-release-notes-cli.test.d.ts} +0 -0
  929. /package/dist/src/{weixin-download.test.d.ts → release-notes.test.d.ts} +0 -0
@@ -1,732 +0,0 @@
1
- /**
2
- * WeChat Channels (视频号) publish — UI automation for WeChat Video Channels creator center.
3
- *
4
- * Flow:
5
- * 1. Navigate to https://channels.weixin.qq.com/platform/post/create
6
- * 2. Upload video via CDP setFileInput (with shadow-DOM DataTransfer fallback)
7
- * 3. Wait for upload + transcode completion
8
- * 4. Fill title (主要内容) and description
9
- * 5. Add hashtag tags (appended to description)
10
- * 6. Set scheduled publish time (optional)
11
- * 7. Click publish or save draft
12
- *
13
- * Note: The creator center renders inside a wujie micro-frontend shadow DOM.
14
- * All form elements are inside wujie-app::shadow-root. The adapter handles
15
- * shadow DOM traversal transparently for all interactions.
16
- *
17
- * Requires: logged into channels.weixin.qq.com in Chrome.
18
- */
19
- import * as fs from 'node:fs';
20
- import * as path from 'node:path';
21
- import { cli, Strategy } from '@agentrhq/webcmd/registry';
22
- import { ArgumentError, AuthRequiredError, CommandExecutionError } from '@agentrhq/webcmd/errors';
23
-
24
- // ── Constants ──────────────────────────────────────────────────────────────
25
- const PUBLISH_URL = 'https://channels.weixin.qq.com/platform/post/create';
26
- const LOGIN_PATH_FRAGMENT = 'login';
27
-
28
- // Title: "短标题" field visible in the form (from screenshot)
29
- const TITLE_SELECTORS = [
30
- 'input[placeholder*="短标题"]',
31
- 'input[placeholder*="填写短标题"]',
32
- 'input.weui-desktop-form__input[placeholder*="短标题"]',
33
- 'input.weui-desktop-form__input',
34
- ];
35
-
36
- // Description: "添加描述" contenteditable area (from screenshot)
37
- const DESC_SELECTORS = [
38
- 'div[contenteditable][data-placeholder="添加描述"]',
39
- 'div.input-editor[contenteditable=""][data-placeholder="添加描述"]',
40
- 'div[data-placeholder*="描述"][contenteditable]',
41
- 'div.input-editor[contenteditable]',
42
- ];
43
-
44
- // Upload trigger buttons (click to activate the hidden file input)
45
- const UPLOAD_TRIGGER_SELECTORS = [
46
- 'span.add-icon.weui-icon-outlined-add',
47
- 'div.upload-content',
48
- '.finder-video-upload-btn',
49
- ];
50
-
51
- const VIDEO_EXTENSIONS = new Set(['.mp4', '.mov', '.avi', '.webm']);
52
-
53
- function unwrapEvaluateResult(result) {
54
- if (result && typeof result === 'object' && 'data' in result && 'session' in result) {
55
- return result.data;
56
- }
57
- return result;
58
- }
59
-
60
- async function evalPage(page, script) {
61
- return unwrapEvaluateResult(await page.evaluate(script));
62
- }
63
-
64
- function requireFilePath(filePath, label, allowedExts) {
65
- const resolved = path.resolve(String(filePath));
66
- let stat;
67
- try {
68
- stat = fs.statSync(resolved);
69
- } catch {
70
- throw new ArgumentError(`${label}文件不存在: ${resolved}`);
71
- }
72
- if (!stat.isFile()) {
73
- throw new ArgumentError(`${label}路径不是文件: ${resolved}`);
74
- }
75
- const ext = path.extname(resolved).toLowerCase();
76
- if (!allowedExts.has(ext)) {
77
- throw new ArgumentError(`不支持的${label}格式: ${ext}(支持 ${Array.from(allowedExts).join('/')})`);
78
- }
79
- return resolved;
80
- }
81
-
82
- function parseTimeoutSeconds(raw) {
83
- const timeout = raw == null || raw === '' ? 600 : Number(raw);
84
- if (!Number.isInteger(timeout) || timeout < 30) {
85
- throw new ArgumentError('--timeout must be an integer >= 30 seconds');
86
- }
87
- return timeout;
88
- }
89
-
90
- function parseScheduleDate(raw) {
91
- if (!raw) return null;
92
- const dt = typeof raw === 'number'
93
- ? new Date(raw < 1e12 ? raw * 1000 : raw)
94
- : new Date(String(raw));
95
- if (Number.isNaN(dt.getTime())) {
96
- throw new ArgumentError(`无法解析定时时间: ${raw}`);
97
- }
98
- if (dt.getTime() <= Date.now()) {
99
- throw new ArgumentError('定时时间必须晚于当前时间');
100
- }
101
- return dt;
102
- }
103
-
104
- function parseBooleanFlag(raw) {
105
- return raw === true || raw === 'true' || raw === '1' || raw === 1;
106
- }
107
-
108
- function remainingMs(deadline, label) {
109
- const left = deadline - Date.now();
110
- if (left <= 0) {
111
- throw new CommandExecutionError(`${label}超时,请增加 --timeout 后重试`);
112
- }
113
- return left;
114
- }
115
-
116
- function submitSucceeded({ isDraft, finalUrl, successMsg }) {
117
- const msg = String(successMsg || '');
118
- if (isDraft) {
119
- return /草稿已保存|暂存成功|保存成功/.test(msg);
120
- }
121
- if (/已发表|发布成功|发表成功|审核中/.test(msg)) {
122
- return true;
123
- }
124
- const url = String(finalUrl || '');
125
- return /\/platform\/post\/list\b/.test(url);
126
- }
127
-
128
- export const __test__ = {
129
- parseTimeoutSeconds,
130
- parseScheduleDate,
131
- parseBooleanFlag,
132
- requireFilePath,
133
- submitSucceeded,
134
- };
135
-
136
- // ── Shadow DOM utility (inlined into evaluate calls) ───────────────────────
137
- // wujie creates exactly ONE shadow root on <wujie-app>; all creator-center UI
138
- // lives inside it. We go directly there instead of recursing all elements,
139
- // which avoids expensive querySelectorAll('*') traversals on a large page.
140
- const DEEP_QUERY_FN = `
141
- function wujieRoot() {
142
- var w = document.querySelector('wujie-app');
143
- return (w && w.shadowRoot) || null;
144
- }
145
- function deepQuery(selector) {
146
- var el = document.querySelector(selector);
147
- if (el) return el;
148
- var sr = wujieRoot();
149
- return sr ? sr.querySelector(selector) : null;
150
- }
151
- function deepQueryAll(selector) {
152
- var results = [];
153
- var main = document.querySelectorAll(selector);
154
- for (var i = 0; i < main.length; i++) results.push(main[i]);
155
- var sr = wujieRoot();
156
- if (sr) {
157
- var shadow = sr.querySelectorAll(selector);
158
- for (var i = 0; i < shadow.length; i++) results.push(shadow[i]);
159
- }
160
- return results;
161
- }
162
- function isVisible(el) {
163
- if (!el) return false;
164
- var rect = el.getBoundingClientRect();
165
- return rect.width > 0 && rect.height > 0;
166
- }
167
- `;
168
-
169
- // ── Helper: click upload trigger ────────────────────────────────────────────
170
- async function clickUploadTrigger(page) {
171
- const clicked = await evalPage(page, `
172
- (() => {
173
- ${DEEP_QUERY_FN}
174
- var sels = ${JSON.stringify(UPLOAD_TRIGGER_SELECTORS)};
175
- for (var i = 0; i < sels.length; i++) {
176
- var el = deepQuery(sels[i]);
177
- if (el && isVisible(el)) {
178
- el.click();
179
- return { ok: true, sel: sels[i] };
180
- }
181
- }
182
- return { ok: false };
183
- })()
184
- `);
185
- return clicked;
186
- }
187
-
188
- // ── Helper: upload video file ────────────────────────────────────────────────
189
- async function uploadFile(page, absPath) {
190
- // Strategy 1: page.setFileInput — works if input is in main document
191
- if (page.setFileInput) {
192
- await clickUploadTrigger(page);
193
- await page.wait({ time: 1 });
194
- for (const sel of ['input[type="file"][accept*="video"]', 'input[type="file"]']) {
195
- try {
196
- await page.setFileInput([absPath], sel);
197
- return;
198
- } catch (_) {}
199
- }
200
- }
201
-
202
- // Strategy 2: DataTransfer injection via chunked base64.
203
- // Splits the file into ~50KB chunks so no single evaluate call exceeds the
204
- // bridge message limit. Works for shadow DOM file inputs where setFileInput fails.
205
-
206
- const fileData = fs.readFileSync(absPath);
207
- const base64Full = fileData.toString('base64');
208
- const fileName = path.basename(absPath);
209
- const ext = path.extname(absPath).toLowerCase();
210
- const mimeMap = { '.mp4': 'video/mp4', '.mov': 'video/quicktime', '.avi': 'video/avi', '.webm': 'video/webm' };
211
- const mimeType = mimeMap[ext] || 'video/mp4';
212
-
213
- // Initialize accumulator in page context
214
- await evalPage(page, '() => { window.__oc_chunks = []; }');
215
-
216
- // Send in 50KB chunks to stay well under bridge message limits
217
- const CHUNK = 50_000;
218
- for (let i = 0; i < base64Full.length; i += CHUNK) {
219
- const chunk = base64Full.slice(i, i + CHUNK);
220
- await evalPage(page, `((c) => { window.__oc_chunks.push(c); })(${JSON.stringify(chunk)})`);
221
- }
222
-
223
- // Trigger click + assemble + set on shadow DOM input
224
- await clickUploadTrigger(page);
225
- await page.wait({ time: 0.5 });
226
-
227
- const result = await evalPage(page, `
228
- (function(params) {
229
- ${DEEP_QUERY_FN}
230
- var inputSels = ['input[type="file"][accept*="video"]', 'input[type="file"]'];
231
- var input = null;
232
- for (var i = 0; i < inputSels.length; i++) {
233
- input = deepQuery(inputSels[i]);
234
- if (input) break;
235
- }
236
- if (!input) { window.__oc_chunks = []; return { ok: false, error: 'No file input found' }; }
237
-
238
- try {
239
- var b64 = window.__oc_chunks.join('');
240
- window.__oc_chunks = [];
241
- var binary = atob(b64);
242
- var bytes = new Uint8Array(binary.length);
243
- for (var i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
244
- var dt = new DataTransfer();
245
- dt.items.add(new File([bytes], params.fileName, { type: params.mimeType }));
246
- Object.defineProperty(input, 'files', { value: dt.files, configurable: true });
247
- input.dispatchEvent(new Event('change', { bubbles: true }));
248
- input.dispatchEvent(new Event('input', { bubbles: true }));
249
- return { ok: true };
250
- } catch(e) {
251
- window.__oc_chunks = [];
252
- return { ok: false, error: e.message };
253
- }
254
- })(${JSON.stringify({ fileName, mimeType })})
255
- `);
256
-
257
- if (!result?.ok) {
258
- await page.screenshot({ path: '/tmp/wechat-channels_publish_upload_debug.png' });
259
- throw new CommandExecutionError(`视频文件注入失败: ${result?.error ?? 'unknown'}\n截图已保存到 /tmp/wechat-channels_publish_upload_debug.png`);
260
- }
261
- }
262
-
263
- // ── Helper: wait for upload + transcode completion ───────────────────────────
264
- async function waitForUploadDone(page, fileName, maxMs = 180_000) {
265
- const pollMs = 3_000;
266
- const maxAttempts = Math.ceil(maxMs / pollMs);
267
-
268
- for (let i = 0; i < maxAttempts; i++) {
269
- let done;
270
- try {
271
- done = await evalPage(page, `
272
- ((fileName) => {
273
- ${DEEP_QUERY_FN}
274
- var root = wujieRoot() || document;
275
- var bodyText = (root.innerText || root.textContent || '').trim();
276
- var uploading = deepQuery('[class*="upload"][class*="progress"]') ||
277
- deepQuery('[class*="uploading"]') ||
278
- deepQuery('[class*="transcoding"]') ||
279
- deepQuery('.weui-desktop-upload__status');
280
-
281
- var preview = deepQuery('video') ||
282
- deepQuery('[class*="preview-video"]') ||
283
- deepQuery('[class*="video-thumb"]') ||
284
- deepQuery('[class*="video"][class*="preview"]');
285
-
286
- var uploadFailed = deepQuery('[class*="upload-fail"]') || deepQuery('[class*="upload-error"]');
287
- if (uploadFailed || /上传失败|转码失败|处理失败/.test(bodyText)) return { done: false, failed: true };
288
-
289
- var hasFileEvidence = fileName && bodyText.indexOf(fileName) >= 0;
290
- var hasSuccessText = /上传成功|转码完成|处理完成/.test(bodyText);
291
- return { done: !uploading && (!!preview || hasFileEvidence || hasSuccessText), failed: false };
292
- })(${JSON.stringify(fileName)})
293
- `);
294
- } catch (err) {
295
- // Bridge may temporarily disconnect when the page re-renders after file is set.
296
- // Wait and retry rather than aborting.
297
- const msg = err instanceof Error ? err.message : String(err);
298
- if (msg.includes('ECONNRESET') || msg.includes('fetch failed')) {
299
- process.stderr.write(` [retry] bridge reconnecting after page re-render (${i + 1}/${maxAttempts})...\n`);
300
- await page.wait({ time: pollMs / 1000 });
301
- continue;
302
- }
303
- throw err;
304
- }
305
-
306
- if (done?.failed) {
307
- throw new CommandExecutionError('视频上传失败,请检查文件格式和网络连接');
308
- }
309
- if (done?.done) return;
310
-
311
- await page.wait({ time: pollMs / 1000 });
312
- }
313
-
314
- throw new CommandExecutionError(`视频上传/转码超时(${Math.ceil(maxMs / 1000)}秒),请检查网络或稍后重试`);
315
- }
316
-
317
- // ── Helper: fill text field (with shadow DOM traversal) ─────────────────────
318
- async function fillField(page, selectors, text, fieldName) {
319
- const result = await evalPage(page, `
320
- (function(selectors, text) {
321
- ${DEEP_QUERY_FN}
322
-
323
- var el = null;
324
- var foundSel = null;
325
- for (var i = 0; i < selectors.length; i++) {
326
- var candidate = deepQuery(selectors[i]);
327
- if (candidate && isVisible(candidate)) {
328
- el = candidate;
329
- foundSel = selectors[i];
330
- break;
331
- }
332
- }
333
- if (!el) return { ok: false };
334
-
335
- el.focus();
336
-
337
- if (el.isContentEditable) {
338
- // Clear existing content
339
- el.textContent = '';
340
- // Place cursor and insert text
341
- var sel = window.getSelection();
342
- var range = document.createRange();
343
- range.selectNodeContents(el);
344
- range.collapse(false);
345
- if (sel) { sel.removeAllRanges(); sel.addRange(range); }
346
- var inserted = document.execCommand('insertText', false, text);
347
- if (!inserted) el.textContent = text;
348
- el.dispatchEvent(new InputEvent('input', { bubbles: true, data: text, inputType: 'insertText' }));
349
- el.dispatchEvent(new Event('change', { bubbles: true }));
350
- } else {
351
- var proto = el.tagName === 'TEXTAREA' ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;
352
- var nativeSetter = Object.getOwnPropertyDescriptor(proto, 'value') && Object.getOwnPropertyDescriptor(proto, 'value').set;
353
- if (nativeSetter) {
354
- nativeSetter.call(el, text);
355
- } else {
356
- el.value = text;
357
- }
358
- el.dispatchEvent(new InputEvent('input', { bubbles: true, data: text, inputType: 'insertText' }));
359
- el.dispatchEvent(new Event('change', { bubbles: true }));
360
- }
361
-
362
- var actual = el.isContentEditable ? (el.innerText || el.textContent || '') : (el.value || '');
363
- el.blur();
364
- return { ok: actual.indexOf(text) >= 0, sel: foundSel, actual: actual };
365
- })(${JSON.stringify(selectors)}, ${JSON.stringify(text)})
366
- `);
367
-
368
- if (!result?.ok) {
369
- await page.screenshot({ path: `/tmp/wechat-channels_publish_${fieldName}_debug.png` });
370
- throw new CommandExecutionError(
371
- `找不到 ${fieldName} 输入框,截图已保存到 /tmp/wechat-channels_publish_${fieldName}_debug.png`
372
- );
373
- }
374
- }
375
-
376
- // ── Helper: set schedule time ────────────────────────────────────────────────
377
- async function setScheduleTime(page, dt) {
378
- // Parse target date
379
- const targetYear = dt.getFullYear();
380
- const targetMonth = dt.getMonth() + 1;
381
- const targetDay = dt.getDate();
382
- const targetHour = dt.getHours();
383
- const targetMin = dt.getMinutes();
384
- const pad = n => String(n).padStart(2, '0');
385
-
386
- // WeChat Channels uses the WeUI desktop date-time picker (class
387
- // `weui-desktop-picker__date-time`). Its real structure (verified against the
388
- // live DOM) is NOT a generic calendar:
389
- // • Day cells are <a href="javascript:;"> inside <td>, NOT the <td> itself.
390
- // The disabled state lives on the <a> (`weui-desktop-picker__disabled`),
391
- // and out-of-month days carry `weui-desktop-picker__faded`.
392
- // • Month nav arrows are `.weui-desktop-btn__icon__left/right`, scoped
393
- // inside the date <dl>. The left arrow is hidden when you can't go back.
394
- // • There is NO <input type="time">. Time is picked by clicking <li> items
395
- // in `ol.weui-desktop-picker__time__hour` and `__minute`.
396
- // • No 确定 button is needed — picking day + hour + minute updates the
397
- // readonly display input live.
398
- // All steps run in ONE async evaluate: separate calls let the session lease
399
- // idle out and reset the tab to about:blank between commands.
400
- const result = await evalPage(page, `
401
- (async function(TY, TM, TD, TH, TMin) {
402
- ${DEEP_QUERY_FN}
403
- function sleep(ms) { return new Promise(function(r) { setTimeout(r, ms); }); }
404
- function click(el) {
405
- el.dispatchEvent(new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window }));
406
- el.dispatchEvent(new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window }));
407
- el.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }));
408
- }
409
- var pad = function(n) { return String(n).padStart(2, '0'); };
410
-
411
- // 1. Select the "定时" radio (exact match — "不定时" also contains "定时").
412
- var labels = deepQueryAll('label');
413
- var radioOk = false;
414
- for (var i = 0; i < labels.length; i++) {
415
- if ((labels[i].innerText || labels[i].textContent || '').trim() === '定时') {
416
- click(labels[i]);
417
- labels[i].click();
418
- radioOk = true;
419
- break;
420
- }
421
- }
422
- if (!radioOk) return { ok: false, reason: 'no-radio' };
423
- await sleep(600);
424
-
425
- // 2. Locate the date <dl> and open its panel.
426
- var dateDl = deepQuery('dl.weui-desktop-picker__date');
427
- if (!dateDl) return { ok: false, reason: 'no-date-dl' };
428
- var dateDt = dateDl.querySelector('dt.weui-desktop-picker__dt');
429
- if (!dateDt) return { ok: false, reason: 'no-date-dt' };
430
- click(dateDt);
431
- await sleep(500);
432
-
433
- // 3. Navigate months until the panel labels read TY年 TM月.
434
- var reached = false;
435
- for (var nav = 0; nav < 24; nav++) {
436
- var lbls = Array.prototype.map.call(
437
- dateDl.querySelectorAll('.weui-desktop-picker__panel__label'),
438
- function(l) { return (l.innerText || '').trim(); }
439
- );
440
- var ma = lbls.join('').match(/(\\d{4})年\\s*(\\d{1,2})月/);
441
- if (!ma) return { ok: false, reason: 'label-parse', labels: lbls.join('|') };
442
- var cy = parseInt(ma[1], 10), cm = parseInt(ma[2], 10);
443
- if (cy === TY && cm === TM) { reached = true; break; }
444
- var goNext = (cy < TY) || (cy === TY && cm < TM);
445
- var arrow = goNext
446
- ? dateDl.querySelector('.weui-desktop-btn__icon__right')
447
- : dateDl.querySelector('.weui-desktop-btn__icon__left');
448
- if (!arrow) return { ok: false, reason: 'no-arrow', cy: cy, cm: cm };
449
- click(arrow);
450
- await sleep(350);
451
- }
452
- if (!reached) return { ok: false, reason: 'month-not-reached' };
453
-
454
- // 4. Click the target day — an <a> in the body that is neither faded
455
- // (other month) nor disabled (past).
456
- var bd = dateDl.querySelector('.weui-desktop-picker__panel__bd');
457
- var anchors = bd ? Array.prototype.slice.call(bd.querySelectorAll('a')) : [];
458
- var dayEl = null;
459
- for (var k = 0; k < anchors.length; k++) {
460
- var t = (anchors[k].innerText || anchors[k].textContent || '').trim();
461
- var cls = anchors[k].className || '';
462
- if (t === String(TD) && cls.indexOf('faded') < 0 && cls.indexOf('disabled') < 0) {
463
- dayEl = anchors[k];
464
- break;
465
- }
466
- }
467
- if (!dayEl) return { ok: false, reason: 'day-disabled-or-missing', day: TD };
468
- click(dayEl);
469
- await sleep(500);
470
-
471
- // 5. Open the time <dl> and pick hour + minute from the <li> columns.
472
- var timeDl = deepQuery('dl.weui-desktop-picker__time');
473
- if (!timeDl) return { ok: false, reason: 'no-time-dl' };
474
- var timeDt = timeDl.querySelector('dt.weui-desktop-picker__dt');
475
- if (timeDt) click(timeDt);
476
- await sleep(500);
477
-
478
- function pickFromColumn(ol, value) {
479
- if (!ol) return false;
480
- var lis = ol.querySelectorAll('li');
481
- for (var i = 0; i < lis.length; i++) {
482
- if ((lis[i].innerText || '').trim() === value &&
483
- (lis[i].className || '').indexOf('disabled') < 0) {
484
- click(lis[i]);
485
- return true;
486
- }
487
- }
488
- return false;
489
- }
490
- var hourOk = pickFromColumn(timeDl.querySelector('ol.weui-desktop-picker__time__hour'), pad(TH));
491
- if (!hourOk) return { ok: false, reason: 'hour-disabled', hour: TH };
492
- await sleep(300);
493
- var minOk = pickFromColumn(timeDl.querySelector('ol.weui-desktop-picker__time__minute'), pad(TMin));
494
- if (!minOk) return { ok: false, reason: 'minute-disabled', minute: TMin };
495
- await sleep(300);
496
-
497
- // 6. Read back the display input to confirm the value landed.
498
- var inp = deepQuery('input[placeholder*="发表时间"]');
499
- return { ok: true, value: inp ? inp.value : null };
500
- })(${targetYear}, ${targetMonth}, ${targetDay}, ${targetHour}, ${targetMin})
501
- `);
502
-
503
- if (!result?.ok) {
504
- await page.screenshot({ path: '/tmp/wechat-channels_schedule_debug.png' });
505
- const reason = result?.reason ? String(result.reason) : 'empty picker result';
506
- throw new CommandExecutionError(
507
- `定时设置失败 (${reason}),截图: /tmp/wechat-channels_schedule_debug.png`,
508
- );
509
- }
510
-
511
- const expected = `${targetYear}-${pad(targetMonth)}-${pad(targetDay)} ${pad(targetHour)}:${pad(targetMin)}`;
512
- if (!String(result.value || '').includes(expected)) {
513
- throw new CommandExecutionError(`定时设置未验证成功: expected=${expected} actual=${result.value || ''}`);
514
- }
515
- process.stderr.write(` 定时设置完成: ${result.value || expected}\n`);
516
- }
517
-
518
- // ── Helper: click publish or draft button ────────────────────────────────────
519
- async function clickPublish(page, isDraft) {
520
- const labels = isDraft
521
- ? ['存草稿', '保存草稿', '草稿']
522
- : ['发表', '发布'];
523
-
524
- const clicked = await evalPage(page, `
525
- (function(labels) {
526
- ${DEEP_QUERY_FN}
527
- var btns = deepQueryAll('button');
528
- for (var i = 0; i < btns.length; i++) {
529
- var btn = btns[i];
530
- var text = (btn.innerText || btn.textContent || '').trim();
531
- var isDisabled = btn.disabled || btn.getAttribute('disabled') !== null ||
532
- btn.classList.contains('weui-desktop-btn_disabled');
533
- if (!isDisabled && isVisible(btn)) {
534
- for (var j = 0; j < labels.length; j++) {
535
- if (text === labels[j] || text.includes(labels[j])) {
536
- btn.click();
537
- return { ok: true, text: text };
538
- }
539
- }
540
- }
541
- }
542
- return { ok: false };
543
- })(${JSON.stringify(labels)})
544
- `);
545
-
546
- if (!clicked?.ok) {
547
- await page.screenshot({ path: '/tmp/wechat-channels_publish_submit_debug.png' });
548
- throw new CommandExecutionError(
549
- `找不到"${labels[0]}"按钮(按钮可能被禁用或表单未完成),` +
550
- '截图已保存到 /tmp/wechat-channels_publish_submit_debug.png'
551
- );
552
- }
553
- return clicked;
554
- }
555
-
556
- // ── Main cli registration ──────────────────────────────────────────────────
557
- cli({
558
- site: 'wechat-channels',
559
- name: 'publish',
560
- access: 'write',
561
- description: '发布视频到视频号',
562
- domain: 'channels.weixin.qq.com',
563
- strategy: Strategy.COOKIE,
564
- browser: true,
565
- navigateBefore: false,
566
- args: [
567
- { name: 'video', required: true, positional: true, help: '视频文件路径 (.mp4/.mov/.avi/.webm)' },
568
- { name: 'title', required: false, help: '短标题(建议 6-16 字)' },
569
- { name: 'caption', required: false, help: '描述内容,支持直接写 #话题(如:日常生活 #搞笑 #生活)' },
570
- { name: 'schedule', required: false, help: '定时发布时间(ISO8601 或 Unix 秒,如 "2026-05-20 10:00")' },
571
- { name: 'draft', type: 'bool', default: false, help: '保存为草稿' },
572
- { name: 'manual', type: 'bool', default: false, help: '填完所有字段后不自动发布,由用户手动点击发表(务必同时传 --site-session persistent,否则表单页约 30 秒后会被重置为空白页)' },
573
- { name: 'timeout', type: 'int', required: false, default: 600, help: '命令整体超时秒数(含登录等待 + 上传转码,默认 600)' },
574
- ],
575
- columns: ['status', 'title', 'detail'],
576
- func: async (page, kwargs) => {
577
- if (!page) throw new CommandExecutionError('需要浏览器页面');
578
-
579
- // ── 1. Validate inputs ───────────────────────────────────────────────
580
- const timeoutSeconds = parseTimeoutSeconds(kwargs.timeout);
581
- const deadline = Date.now() + timeoutSeconds * 1000;
582
- const videoPath = requireFilePath(kwargs.video, '视频', VIDEO_EXTENSIONS);
583
-
584
- const title = String(kwargs.title ?? '').trim();
585
- const caption = String(kwargs.caption ?? '').trim();
586
- const scheduleTime = parseScheduleDate(kwargs.schedule || null);
587
- const isDraft = parseBooleanFlag(kwargs.draft);
588
- const isManual = parseBooleanFlag(kwargs.manual);
589
-
590
- // ── 2. Navigate to creator center ────────────────────────────────────
591
- await page.goto(PUBLISH_URL);
592
- await page.wait({ time: 4 }); // wujie needs extra time to bootstrap
593
-
594
- // ── 3. Login check — fallback: navigate to login page and wait ───────
595
- {
596
- const urlAfterNav = await evalPage(page, '() => location.href');
597
- if (urlAfterNav.includes(LOGIN_PATH_FRAGMENT)) {
598
- process.stderr.write(
599
- '\n⚠️ 未登录视频号。已跳转到登录页,请在 Chrome 中扫码登录...\n' +
600
- ' 登录完成后将自动继续发布。\n\n'
601
- );
602
-
603
- const loginDeadline = Math.min(deadline, Date.now() + 120_000);
604
- let loggedIn = false;
605
- while (Date.now() < loginDeadline) {
606
- await page.wait({ time: 3 });
607
- const url = await evalPage(page, '() => location.href');
608
- if (!url.includes(LOGIN_PATH_FRAGMENT)) {
609
- loggedIn = true;
610
- break;
611
- }
612
- process.stderr.write(' 等待扫码中...\n');
613
- }
614
-
615
- if (!loggedIn) {
616
- throw new AuthRequiredError('channels.weixin.qq.com', '登录超时(2分钟),请手动登录后重试');
617
- }
618
-
619
- process.stderr.write('✅ 登录成功,继续发布...\n\n');
620
- await page.wait({ time: 3 }); // let bridge stabilize after login redirect
621
- await page.goto(PUBLISH_URL);
622
- await page.wait({ time: 5 });
623
- }
624
- }
625
-
626
- // ── 4. Upload video ──────────────────────────────────────────────────
627
- await uploadFile(page, videoPath);
628
- await page.wait({ time: 2 });
629
-
630
- // ── 5. Wait for upload + transcode done ──────────────────────────────
631
- await waitForUploadDone(page, path.basename(videoPath), Math.min(180_000, remainingMs(deadline, '视频上传/转码')));
632
- await page.wait({ time: 1 });
633
-
634
- // ── 6. Fill title (主要内容) ─────────────────────────────────────────
635
- if (title) {
636
- await fillField(page, TITLE_SELECTORS, title, 'title');
637
- await page.wait({ time: 0.5 });
638
- }
639
-
640
- // ── 7. Fill caption (描述 + 话题) ────────────────────────────────────
641
- if (caption) {
642
- await fillField(page, DESC_SELECTORS, caption, 'caption');
643
- await page.wait({ time: 0.5 });
644
- }
645
-
646
- // ── 8. Set schedule time (optional) ──────────────────────────────────
647
- if (scheduleTime) {
648
- await setScheduleTime(page, scheduleTime);
649
- await page.wait({ time: 0.5 });
650
- }
651
-
652
- // ── 9. Publish or save draft ──────────────────────────────────────────
653
- if (isManual) {
654
- // The owned automation tab is reset to about:blank when its lease is
655
- // released — immediately if --keep-tab is not set, or after the ~30s
656
- // idle timeout otherwise. Only --site-session persistent disables that
657
- // reset entirely (it maps to IDLE_TIMEOUT_NONE in the extension). Manual
658
- // review always exceeds 30s, so warn unless the form will actually
659
- // survive. We can't read the resolved siteSession from here, so the
660
- // guidance is unconditional.
661
- process.stderr.write(
662
- '\n ℹ️ 手动模式:表单已填好,请在浏览器中检查并点击「发表」。\n' +
663
- ' 若未加 --site-session persistent,此标签页约 30 秒后会被重置为空白页。\n\n'
664
- );
665
- return [{
666
- status: '⏸️ 已填写完毕,请在浏览器中手动点击发表',
667
- title: title || '',
668
- detail: [
669
- scheduleTime ? `定时: ${scheduleTime}` : null,
670
- ].filter(Boolean).join(' · ') || '表单已就绪',
671
- }];
672
- }
673
-
674
- await clickPublish(page, isDraft);
675
-
676
- // ── 10. Verify result ─────────────────────────────────────────────────
677
- await page.wait({ time: 4 });
678
- const finalUrl = await evalPage(page, '() => location.href');
679
-
680
- const successMarkers = isDraft
681
- ? ['草稿已保存', '暂存成功', '保存成功']
682
- : ['已发表', '发布成功', '发表成功', '审核中'];
683
-
684
- const successMsg = await evalPage(page, `
685
- (function(markers) {
686
- ${DEEP_QUERY_FN}
687
- var all = deepQueryAll('*');
688
- for (var i = 0; i < all.length; i++) {
689
- var el = all[i];
690
- var text = (el.innerText || '').trim();
691
- if (el.children.length === 0 && text) {
692
- for (var j = 0; j < markers.length; j++) {
693
- if (text.includes(markers[j])) return text;
694
- }
695
- }
696
- }
697
- return '';
698
- })(${JSON.stringify(successMarkers)})
699
- `);
700
-
701
- const isSuccess = submitSucceeded({ isDraft, finalUrl, successMsg });
702
- if (!isSuccess) {
703
- await page.screenshot({ path: '/tmp/wechat-channels_publish_result_debug.png' });
704
- throw new CommandExecutionError(
705
- `未能验证${isDraft ? '草稿保存' : '发布'}成功,截图已保存到 /tmp/wechat-channels_publish_result_debug.png`,
706
- `url=${finalUrl || ''} message=${successMsg || ''}`,
707
- );
708
- }
709
-
710
- const verb = isDraft ? '草稿已保存' : '发布成功';
711
- const detailParts = [
712
- scheduleTime ? `定时: ${scheduleTime.toISOString()}` : null,
713
- successMsg || finalUrl,
714
- ].filter(Boolean);
715
-
716
- const result = [{
717
- status: `✅ ${verb}`,
718
- title: title || '',
719
- detail: detailParts.join(' · ') || finalUrl,
720
- }];
721
-
722
- // Leave the tab on the post list rather than the (now-submitted) create
723
- // form. NOTE: under the default ephemeral lifecycle the extension releases
724
- // the owned tab right after this command returns and resets it to
725
- // about:blank, so this navigation is only visible with
726
- // --site-session persistent (or --keep-tab, until the ~30s idle timeout).
727
- // It is harmless either way.
728
- await page.goto('https://channels.weixin.qq.com/platform/post/list', { waitUntil: 'none' }).catch(() => {});
729
-
730
- return result;
731
- },
732
- });