@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
@@ -23,7 +23,7 @@ const GEMINI_RESPONSE_NOISE_PATTERNS = [
23
23
  /Google Privacy Policy/gi,
24
24
  /Opens in a new window/gi,
25
25
  ];
26
- const GEMINI_TRANSCRIPT_CHROME_MARKERS = ['gemini', '我的内容', '对话', 'google terms', 'google privacy policy'];
26
+ const GEMINI_TRANSCRIPT_CHROME_MARKERS = ['gemini', 'My content', 'conversation', 'google terms', 'google privacy policy'];
27
27
  const GEMINI_COMPOSER_SELECTORS = [
28
28
  '.ql-editor[contenteditable="true"]',
29
29
  '.ql-editor[role="textbox"]',
@@ -265,7 +265,7 @@ function extractGeminiTranscriptLineCandidate(transcriptLine, promptText) {
265
265
  // Some transcript snapshots flatten "prompt + answer" into a single line.
266
266
  // Recover the answer only when the line starts with the current prompt.
267
267
  if (candidate.startsWith(prompt)) {
268
- const tail = candidate.slice(prompt.length).replace(/^[\s::,,-]+/, '').trim();
268
+ const tail = candidate.slice(prompt.length).replace(/^[\s::,,-]+/, '').trim();
269
269
  return tail ? sanitizeGeminiResponseText(tail, '') : '';
270
270
  }
271
271
  return sanitized;
@@ -281,8 +281,8 @@ function getStateScript() {
281
281
  const href = node.getAttribute('href') || '';
282
282
  return text === 'sign in'
283
283
  || aria === 'sign in'
284
- || text === '登录'
285
- || aria === '登录'
284
+ || text === 'Log in'
285
+ || aria === 'Log in'
286
286
  || href.includes('accounts.google.com/ServiceLogin');
287
287
  });
288
288
 
@@ -309,8 +309,8 @@ function readGeminiSnapshotScript() {
309
309
  const aria = (node.getAttribute('aria-label') || '').trim().toLowerCase();
310
310
  return text === 'stop response'
311
311
  || aria === 'stop response'
312
- || text === '停止回答'
313
- || aria === '停止回答';
312
+ || text === 'Stop response'
313
+ || aria === 'Stop response';
314
314
  });
315
315
  const turns = ${getTurnsScript().trim()};
316
316
  const transcriptLines = ${getTranscriptLinesScript().trim()};
@@ -593,8 +593,8 @@ function submitComposerScript() {
593
593
  });
594
594
  }
595
595
 
596
- const excludedPattern = /main menu|主菜单|microphone|麦克风|upload|上传|mode|模式|tools|工具|settings|临时对话|new chat|新对话/i;
597
- const submitPattern = /send|发送|傳送|submit|提交/i;
596
+ const excludedPattern = /main menu|localized text|microphone|localized text|upload|localized text|mode|mode|tools|tools|settings|Temporary chat|new chat|New chat/i;
597
+ const submitPattern = /send|Send|Send|submit|Submit/i;
598
598
  let bestButton = null;
599
599
  let bestScore = -1;
600
600
 
@@ -665,10 +665,10 @@ function clickNewChatScript() {
665
665
  return isVisible(node) && (
666
666
  text === 'new chat'
667
667
  || aria === 'new chat'
668
- || text === '发起新对话'
669
- || aria === '发起新对话'
670
- || text === '新对话'
671
- || aria === '新对话'
668
+ || text === 'Start new chat'
669
+ || aria === 'Start new chat'
670
+ || text === 'New chat'
671
+ || aria === 'New chat'
672
672
  );
673
673
  });
674
674
 
@@ -684,7 +684,7 @@ function clickNewChatScript() {
684
684
  function openGeminiToolsMenuScript() {
685
685
  return `
686
686
  (() => {
687
- const labels = ['tools', 'tool', 'mode', '研究', 'deep research', 'deep-research', '工具'];
687
+ const labels = ['tools', 'tool', 'mode', 'research', 'deep research', 'deep-research', 'tools'];
688
688
  const normalize = (value) => (value || '').replace(/\\s+/g, ' ').trim().toLowerCase();
689
689
  const matchesLabel = (value) => {
690
690
  const text = normalize(value);
@@ -973,7 +973,7 @@ function getGeminiConversationListScript() {
973
973
  `;
974
974
  }
975
975
 
976
- // Gemini collapses the sidebar's "最近" / "Recents" section by default, so the
976
+ // Gemini collapses the sidebar's "Recent" / "Recents" section by default, so the
977
977
  // /app/<id> conversation anchors are not present in the DOM (or are hidden)
978
978
  // until that section is expanded. The script below opens the sidebar if it is
979
979
  // collapsed and expands the Recents toggle, returning true if it likely
@@ -999,16 +999,16 @@ function expandGeminiRecentScript() {
999
999
  // 1. Open the sidebar if it is collapsed (button only renders when closed).
1000
1000
  const openSidebar = buttons.find((b) => {
1001
1001
  const label = normalize(b.getAttribute('aria-label') || '');
1002
- return /打开边栏|open sidebar|open navigation|展开边栏/i.test(label);
1002
+ return /Open sidebar|open sidebar|open navigation|Expand sidebar/i.test(label);
1003
1003
  });
1004
1004
  if (openSidebar) { openSidebar.click(); changed = true; }
1005
1005
 
1006
- // 2. Expand the "最近" / "Recents" toggle if it is currently collapsed.
1006
+ // 2. Expand the "Recent" / "Recents" toggle if it is currently collapsed.
1007
1007
  const recentToggle = buttons.find((b) => {
1008
1008
  const label = normalize(b.getAttribute('aria-label') || '');
1009
1009
  const expanded = (b.getAttribute('aria-expanded') || '').toLowerCase();
1010
- return /最近|recent/i.test(label) && (
1011
- /展开|收起|expand|collapse|toggle|show|hide/i.test(label)
1010
+ return /Recent|recent/i.test(label) && (
1011
+ /Expand|Collapse|expand|collapse|toggle|show|hide/i.test(label)
1012
1012
  || expanded === 'false'
1013
1013
  || expanded === 'true'
1014
1014
  );
@@ -1016,7 +1016,7 @@ function expandGeminiRecentScript() {
1016
1016
  if (recentToggle) {
1017
1017
  const label = normalize(recentToggle.getAttribute('aria-label') || '');
1018
1018
  const expanded = (recentToggle.getAttribute('aria-expanded') || '').toLowerCase();
1019
- const explicitExpandLabel = /展开|显示|expand|show/i.test(label) && !/收起|collapse|hide/i.test(label);
1019
+ const explicitExpandLabel = /Expand|Show|expand|show/i.test(label) && !/Collapse|collapse|hide/i.test(label);
1020
1020
  if (expanded === 'false' || (expanded !== 'true' && explicitExpandLabel)) {
1021
1021
  recentToggle.click();
1022
1022
  changed = true;
@@ -1138,7 +1138,7 @@ export async function startNewGeminiChat(page) {
1138
1138
  export async function getGeminiConversationList(page) {
1139
1139
  await ensureGeminiPage(page);
1140
1140
  let rows = [];
1141
- // Gemini collapses the sidebar "最近"/Recents section by default, hiding
1141
+ // Gemini collapses the sidebar "Recent"/Recents section by default, hiding
1142
1142
  // the conversation anchors. Retry extraction after expanding it.
1143
1143
  for (let attempt = 0; attempt < 3; attempt += 1) {
1144
1144
  const raw = requireGeminiArrayResult(await page.evaluate(getGeminiConversationListScript()), 'Gemini conversation list');
@@ -1440,11 +1440,11 @@ function exportGeminiDeepResearchReportScript(maxWaitMs) {
1440
1440
  (async () => {
1441
1441
  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
1442
1442
  const labels = {
1443
- actionMenu: ['open menu for conversation actions', 'conversation actions', '会话操作'],
1444
- share: ['share & export', 'share and export', 'share/export', '分享与导出', '分享和导出', '分享并导出', '共享和导出'],
1445
- shareConversation: ['share conversation', '分享会话', '分享对话'],
1446
- export: ['export', '导出'],
1447
- exportDocs: ['export to docs', 'export to google docs', 'export to doc', '导出到 docs', '导出到文档', '导出到 google docs'],
1443
+ actionMenu: ['open menu for conversation actions', 'conversation actions', 'localized text'],
1444
+ share: ['share & export', 'share and export', 'share/export', 'Share and export', 'Share and export', 'Share and export', 'Share and export'],
1445
+ shareConversation: ['share conversation', 'Share conversation', 'Share conversation'],
1446
+ export: ['export', 'Export'],
1447
+ exportDocs: ['export to docs', 'export to google docs', 'export to doc', 'Export to docs', 'Export to Docs', 'Export to google docs'],
1448
1448
  };
1449
1449
 
1450
1450
  const recorderKey = '__webcmdGeminiExportUrls';
@@ -1547,15 +1547,15 @@ function exportGeminiDeepResearchReportScript(maxWaitMs) {
1547
1547
  };
1548
1548
  const isKindMatch = (kind, combined, targetLabels) => {
1549
1549
  if (includesAny(combined, targetLabels)) return true;
1550
- if (kind === 'share') return hasTokens(combined, ['share', 'export']) || hasTokens(combined, ['分享', '导出']);
1551
- if (kind === 'export') return hasTokens(combined, ['export']) || hasTokens(combined, ['导出']);
1550
+ if (kind === 'share') return hasTokens(combined, ['share', 'export']) || hasTokens(combined, ['Share', 'Export']);
1551
+ if (kind === 'export') return hasTokens(combined, ['export']) || hasTokens(combined, ['Export']);
1552
1552
  if (kind === 'export-docs') {
1553
1553
  return hasTokens(combined, ['export', 'docs'])
1554
- || hasTokens(combined, ['导出', '文档'])
1555
- || hasTokens(combined, ['导出', 'docs']);
1554
+ || hasTokens(combined, ['Export', 'Docs'])
1555
+ || hasTokens(combined, ['Export', 'docs']);
1556
1556
  }
1557
1557
  if (kind === 'action-menu') {
1558
- return hasTokens(combined, ['conversation', 'action']) || hasTokens(combined, ['会话', '操作']);
1558
+ return hasTokens(combined, ['conversation', 'action']) || hasTokens(combined, ['localized text', 'localized text']);
1559
1559
  }
1560
1560
  return false;
1561
1561
  };
@@ -1868,11 +1868,11 @@ function openModelPickerForThinkingScript() {
1868
1868
  const VERSION_LABEL_RE = /\\d+\\.\\d+/;
1869
1869
 
1870
1870
  const MODE_SELECTOR_PATTERNS = [
1871
- /模式选择器/i,
1871
+ /Mode selector/i,
1872
1872
  /mode[\\s-]*selector/i,
1873
1873
  /model[\\s-]*selector/i,
1874
1874
  /model[\\s-]*picker/i,
1875
- /选择模型/i,
1875
+ /Select model/i,
1876
1876
  /select[\\s-]+model/i,
1877
1877
  /choose[\\s-]+model/i,
1878
1878
  /switch[\\s-]+model/i,
@@ -1921,7 +1921,7 @@ function openModelPickerForThinkingScript() {
1921
1921
 
1922
1922
  // Method 4: Fallback — look for any element with model-related attributes.
1923
1923
  const attrEls = Array.from(
1924
- document.querySelectorAll('[data-model-selector], [aria-label*="model" i], [aria-label*="模式" i]')
1924
+ document.querySelectorAll('[data-model-selector], [aria-label*="model" i], [aria-label*="mode" i]')
1925
1925
  ).filter(isVisible);
1926
1926
  if (attrEls.length > 0) return attrEls[0];
1927
1927
 
@@ -1942,7 +1942,7 @@ function openModelPickerForThinkingScript() {
1942
1942
  }
1943
1943
 
1944
1944
  /**
1945
- * Browser evaluate script that clicks the "思考等级" / "Thinking level"
1945
+ * Browser evaluate script that clicks the "Thinking level" / "Thinking level"
1946
1946
  * toggle inside an already-open model-picker menu to expand thinking options.
1947
1947
  * Returns true if the toggle was found and clicked.
1948
1948
  */
@@ -1995,7 +1995,7 @@ function clickThinkingToggleInMenuScript() {
1995
1995
 
1996
1996
  const thinkingToggle = menuItems.find((item) => {
1997
1997
  const text = (item.textContent || '').replace(/\\s+/g, ' ').trim();
1998
- return /思考等级|thinking level|thinking mode/i.test(text);
1998
+ return /Thinking level|thinking level|thinking mode/i.test(text);
1999
1999
  });
2000
2000
 
2001
2001
  if (thinkingToggle) {
@@ -2020,8 +2020,8 @@ function selectThinkingInMenuScript(thinkingValue) {
2020
2020
  const normalizedValue = String(thinkingValue || '').trim().toLowerCase();
2021
2021
  if (!normalizedValue) return '(() => "")';
2022
2022
  const labelMap = JSON.stringify({
2023
- standard: ['standard', '标准', '標準'],
2024
- extended: ['extended', '扩展', '擴展', '拡張'],
2023
+ standard: ['standard', 'standard', 'standard'],
2024
+ extended: ['extended', 'extended', 'extended', 'extended'],
2025
2025
  });
2026
2026
  return `
2027
2027
  (() => {
@@ -2125,7 +2125,7 @@ function selectThinkingInMenuScript(thinkingValue) {
2125
2125
  * Multi-step approach matching modelsCommand.func:
2126
2126
  * 1. Open the model-picker menu.
2127
2127
  * 2. Wait for React to render the menu.
2128
- * 3. Click the "思考等级"/"Thinking level" toggle to expand thinking options.
2128
+ * 3. Click the "Thinking level"/"Thinking level" toggle to expand thinking options.
2129
2129
  * 4. Wait for the expanded items to render.
2130
2130
  * 5. Select the requested thinking level.
2131
2131
  * 6. Close the menu.
@@ -2198,11 +2198,11 @@ function getCurrentGeminiModelScript() {
2198
2198
  const VERSION_LABEL_RE = /\\d+\\.\\d+/;
2199
2199
 
2200
2200
  const MODE_SELECTOR_PATTERNS = [
2201
- /模式选择器/i,
2201
+ /Mode selector/i,
2202
2202
  /mode[\\s-]*selector/i,
2203
2203
  /model[\\s-]*selector/i,
2204
2204
  /model[\\s-]*picker/i,
2205
- /选择模型/i,
2205
+ /Select model/i,
2206
2206
  /select[\\s-]+model/i,
2207
2207
  /choose[\\s-]+model/i,
2208
2208
  /switch[\\s-]+model/i,
@@ -2251,7 +2251,7 @@ function getCurrentGeminiModelScript() {
2251
2251
 
2252
2252
  // Method 4: Fallback — look for any element with model-related attributes.
2253
2253
  const attrEls = Array.from(
2254
- document.querySelectorAll('[data-model-selector], [aria-label*="model" i], [aria-label*="模式" i]')
2254
+ document.querySelectorAll('[data-model-selector], [aria-label*="model" i], [aria-label*="mode" i]')
2255
2255
  ).filter(isVisible);
2256
2256
  if (attrEls.length > 0) return attrEls[0];
2257
2257
 
@@ -57,10 +57,10 @@ describe('collectGeminiTranscriptAdditions', () => {
57
57
  expect(collectGeminiTranscriptAdditions(before, current, prompt)).toBe('Soft spring rain arrives');
58
58
  });
59
59
  it('keeps a reply line that quotes the prompt inside the answer body', () => {
60
- const prompt = '请只回复:OK';
60
+ const prompt = 'Please reply only:OK';
61
61
  const before = ['baseline'];
62
- const current = ['baseline', '关于“请只回复:OK”,这里是解释。'];
63
- expect(collectGeminiTranscriptAdditions(before, current, prompt)).toBe('关于“请只回复:OK”,这里是解释。');
62
+ const current = ['baseline', 'About"Please reply only:OK",here is an explanation.'];
63
+ expect(collectGeminiTranscriptAdditions(before, current, prompt)).toBe('About"Please reply only:OK",here is an explanation.');
64
64
  });
65
65
  });
66
66
  describe('gemini send strategy', () => {
@@ -78,8 +78,8 @@ describe('gemini send strategy', () => {
78
78
  .mockResolvedValueOnce({ ok: true })
79
79
  .mockResolvedValueOnce({ hasText: true })
80
80
  .mockResolvedValueOnce('button');
81
- const result = await sendGeminiMessage(page, '你好');
82
- expect(nativeType).toHaveBeenCalledWith('你好');
81
+ const result = await sendGeminiMessage(page, 'hello');
82
+ expect(nativeType).toHaveBeenCalledWith('hello');
83
83
  expect(nativeKeyPress).not.toHaveBeenCalled();
84
84
  expect(result).toBe('button');
85
85
  });
@@ -94,8 +94,8 @@ describe('gemini send strategy', () => {
94
94
  .mockResolvedValueOnce({ hasText: false })
95
95
  .mockResolvedValueOnce({ hasText: true })
96
96
  .mockResolvedValueOnce('enter');
97
- const result = await sendGeminiMessage(page, '你好');
98
- expect(nativeType).toHaveBeenCalledWith('你好');
97
+ const result = await sendGeminiMessage(page, 'hello');
98
+ expect(nativeType).toHaveBeenCalledWith('hello');
99
99
  expect(nativeKeyPress).toHaveBeenCalledWith('Enter');
100
100
  expect(evaluate).toHaveBeenCalledTimes(5);
101
101
  expect(result).toBe('enter');
@@ -110,8 +110,8 @@ describe('gemini send strategy', () => {
110
110
  .mockResolvedValueOnce({ ok: true })
111
111
  .mockResolvedValueOnce({ hasText: true })
112
112
  .mockResolvedValueOnce('button');
113
- const result = await sendGeminiMessage(page, '你好');
114
- expect(nativeType).toHaveBeenCalledWith('你好');
113
+ const result = await sendGeminiMessage(page, 'hello');
114
+ expect(nativeType).toHaveBeenCalledWith('hello');
115
115
  expect(result).toBe('button');
116
116
  });
117
117
  it('retries composer preparation until a slow-loading composer appears', async () => {
@@ -125,7 +125,7 @@ describe('gemini send strategy', () => {
125
125
  .mockResolvedValueOnce({ ok: true })
126
126
  .mockResolvedValueOnce({ hasText: true })
127
127
  .mockResolvedValueOnce('button');
128
- const result = await sendGeminiMessage(page, '你好');
128
+ const result = await sendGeminiMessage(page, 'hello');
129
129
  expect(result).toBe('button');
130
130
  expect(wait.mock.calls.filter(([value]) => value === 1)).toHaveLength(3);
131
131
  });
@@ -141,42 +141,42 @@ describe('gemini send strategy', () => {
141
141
  .mockResolvedValueOnce({ ok: true })
142
142
  .mockResolvedValueOnce({ hasText: true })
143
143
  .mockResolvedValueOnce('button');
144
- const result = await sendGeminiMessage(page, '你好');
144
+ const result = await sendGeminiMessage(page, 'hello');
145
145
  expect(result).toBe('button');
146
146
  expect(wait.mock.calls.filter(([value]) => value === 1)).toHaveLength(4);
147
147
  });
148
148
  it('avoids innerHTML in the fallback insertion path for trusted types pages', () => {
149
- expect(__test__.insertComposerTextFallbackScript('你好')).not.toContain('innerHTML');
150
- expect(__test__.insertComposerTextFallbackScript('你好')).toContain('replaceChildren');
149
+ expect(__test__.insertComposerTextFallbackScript('hello')).not.toContain('innerHTML');
150
+ expect(__test__.insertComposerTextFallbackScript('hello')).toContain('replaceChildren');
151
151
  });
152
152
  it('keeps a button submit path in the generated submit script', () => {
153
153
  expect(__test__.submitComposerScript()).toContain('.click()');
154
154
  });
155
155
  it('matches the Traditional Chinese send label in the generated submit script', () => {
156
- expect(__test__.submitComposerScript()).toContain('傳送');
156
+ expect(__test__.submitComposerScript()).toContain('Send');
157
157
  });
158
158
  it('supports localized new chat labels in the generated new-chat script', () => {
159
- expect(__test__.clickNewChatScript()).toContain('发起新对话');
159
+ expect(__test__.clickNewChatScript()).toContain('Start new chat');
160
160
  });
161
161
  });
162
162
  describe('gemini turn normalization', () => {
163
163
  it('collapses only adjacent duplicate turns so identical replies across rounds remain visible', () => {
164
164
  const turns = [
165
- { Role: 'User', Text: '你说\n\n请只回复:OK' },
166
- { Role: 'User', Text: '请只回复:OK' },
165
+ { Role: 'User', Text: 'You said\n\nPlease reply only:OK' },
166
+ { Role: 'User', Text: 'Please reply only:OK' },
167
167
  { Role: 'Assistant', Text: 'OK' },
168
168
  { Role: 'Assistant', Text: 'OK' },
169
- { Role: 'User', Text: '你说\n\n请只回复:OK' },
170
- { Role: 'User', Text: '请只回复:OK' },
169
+ { Role: 'User', Text: 'You said\n\nPlease reply only:OK' },
170
+ { Role: 'User', Text: 'Please reply only:OK' },
171
171
  { Role: 'Assistant', Text: 'OK' },
172
172
  { Role: 'Assistant', Text: 'OK' },
173
173
  ];
174
174
  expect(__test__.collapseAdjacentGeminiTurns(turns)).toEqual([
175
- { Role: 'User', Text: '你说\n\n请只回复:OK' },
176
- { Role: 'User', Text: '请只回复:OK' },
175
+ { Role: 'User', Text: 'You said\n\nPlease reply only:OK' },
176
+ { Role: 'User', Text: 'Please reply only:OK' },
177
177
  { Role: 'Assistant', Text: 'OK' },
178
- { Role: 'User', Text: '你说\n\n请只回复:OK' },
179
- { Role: 'User', Text: '请只回复:OK' },
178
+ { Role: 'User', Text: 'You said\n\nPlease reply only:OK' },
179
+ { Role: 'User', Text: 'Please reply only:OK' },
180
180
  { Role: 'Assistant', Text: 'OK' },
181
181
  ]);
182
182
  });
@@ -204,7 +204,7 @@ describe('gemini evaluate result boundaries', () => {
204
204
  changed: false,
205
205
  clicks: 0,
206
206
  });
207
- expect(runExpandRecentScript('<button aria-label="收起最近">最近</button>')).toEqual({
207
+ expect(runExpandRecentScript('<button aria-label="Collapse recent">Recent</button>')).toEqual({
208
208
  changed: false,
209
209
  clicks: 0,
210
210
  });
@@ -426,9 +426,9 @@ describe('openModelPickerForThinkingScript — picker detection', () => {
426
426
  expect(result).toEqual({ ok: true });
427
427
  });
428
428
 
429
- it('Method 1: detects picker by aria-label "模式选择器"', () => {
429
+ it('Method 1: detects picker by aria-label "Mode selector"', () => {
430
430
  const { window } = createPickerDom(`
431
- <button aria-label="模式选择器">选择</button>
431
+ <button aria-label="Mode selector">localized text</button>
432
432
  `);
433
433
  const result = evalScript(window, __test__.openModelPickerForThinkingScript);
434
434
  expect(result).toEqual({ ok: true });
@@ -442,9 +442,9 @@ describe('openModelPickerForThinkingScript — picker detection', () => {
442
442
  expect(result).toEqual({ ok: true });
443
443
  });
444
444
 
445
- it('Method 1: detects picker by aria-label "选择模型"', () => {
445
+ it('Method 1: detects picker by aria-label "Select model"', () => {
446
446
  const { window } = createPickerDom(`
447
- <button aria-label="选择模型">选择</button>
447
+ <button aria-label="Select model">localized text</button>
448
448
  `);
449
449
  const result = evalScript(window, __test__.openModelPickerForThinkingScript);
450
450
  expect(result).toEqual({ ok: true });
@@ -550,9 +550,9 @@ describe('selectGeminiModelScript — picker detection parity', () => {
550
550
  });
551
551
 
552
552
  describe('getCurrentGeminiModelScript — picker detection parity', () => {
553
- it('Method 1: detects picker by aria-label "模式选择器"', () => {
553
+ it('Method 1: detects picker by aria-label "Mode selector"', () => {
554
554
  const { window } = createPickerDom(`
555
- <button aria-label="模式选择器">2.5 Flash</button>
555
+ <button aria-label="Mode selector">2.5 Flash</button>
556
556
  `);
557
557
  const result = window.eval(__test__.getCurrentGeminiModelScript());
558
558
  expect(result).toBe('2.5-flash');
@@ -140,7 +140,7 @@ export async function ggbEval(page, cmd) {
140
140
  const afterCount = collectNames().length;
141
141
  const dialogText = [...document.querySelectorAll('[role="dialog"], .gwt-DialogBox')]
142
142
  .map(node => node.textContent?.trim() || '')
143
- .find(text => /error|unknown command|错误|未知的指令/i.test(text)) || '';
143
+ .find(text => /error|unknown command|error|unknown command/i.test(text)) || '';
144
144
  return {
145
145
  ok: label !== '' || afterCount > beforeCount,
146
146
  label,
@@ -6,13 +6,13 @@ cli({
6
6
  site: 'google-scholar',
7
7
  name: 'search',
8
8
  access: 'read',
9
- description: 'Google Scholar 学术搜索',
9
+ description: 'Google Scholar scholar search',
10
10
  domain: 'scholar.google.com',
11
11
  strategy: Strategy.PUBLIC,
12
12
  browser: true,
13
13
  args: [
14
- { name: 'query', positional: true, required: true, help: '搜索关键词' },
15
- { name: 'limit', type: 'int', default: 10, help: '返回结果数量 (max 20)' },
14
+ { name: 'query', positional: true, required: true, help: 'Search keyword' },
15
+ { name: 'limit', type: 'int', default: 10, help: 'Number of results to return (max 20)' },
16
16
  ],
17
17
  columns: ['rank', 'title', 'authors', 'source', 'year', 'cited', 'url'],
18
18
  func: async (page, kwargs) => {
@@ -38,7 +38,7 @@ cli({
38
38
  return [{ status: 'dry-run (pass --yes to actually delete)', id }];
39
39
  }
40
40
 
41
- const result = await clickConversationMenuItem(page, id, ['删除', 'delete']);
41
+ const result = await clickConversationMenuItem(page, id, ['localized text', 'delete']);
42
42
  if (!result || !result.ok) {
43
43
  const detail = result?.detail ? ` ${result.detail}` : '';
44
44
  throw new CommandExecutionError(`${result?.reason || 'Failed to click delete menu item.'}${detail}`, SESSION_HINT);
@@ -66,7 +66,7 @@ async function collectHistory(page, { offset, limit, maxScrolls }) {
66
66
  };
67
67
  const hasHistoryEntry = Boolean(document.querySelector('a[href^="/c/"]'));
68
68
  const hasHistoryLauncher = Array.from(document.querySelectorAll('button, [role="button"]'))
69
- .some((node) => isVisible(node) && /^(查看全部|show all|view all)$/i.test((node.textContent || '').trim()));
69
+ .some((node) => isVisible(node) && /^(localized text|show all|view all)$/i.test((node.textContent || '').trim()));
70
70
  const signInCta = Array.from(document.querySelectorAll('button, a'))
71
71
  .some((node) => isVisible(node) && /^(sign in|log in)$/i.test((node.textContent || '').trim()));
72
72
  if (signInCta && !hasHistoryEntry && !hasHistoryLauncher) {
@@ -76,7 +76,7 @@ async function collectHistory(page, { offset, limit, maxScrolls }) {
76
76
  const clickAllHistory = () => {
77
77
  const buttons = Array.from(document.querySelectorAll('button, [role="button"]'))
78
78
  .filter((node) => node instanceof HTMLElement && isVisible(node));
79
- const target = buttons.find((node) => /^(查看全部|show all|view all)$/i.test((node.textContent || '').trim()));
79
+ const target = buttons.find((node) => /^(localized text|show all|view all)$/i.test((node.textContent || '').trim()));
80
80
  if (!target) return false;
81
81
  target.click();
82
82
  return true;
@@ -62,7 +62,7 @@ export const grokExportCommand = cli({
62
62
  };
63
63
  const hasHistoryEntry = Boolean(document.querySelector('a[href^="/c/"]'));
64
64
  const hasHistoryLauncher = Array.from(document.querySelectorAll('button, [role="button"]'))
65
- .some((node) => isVisible(node) && /^(查看全部|show all|view all)$/i.test((node.textContent || '').trim()));
65
+ .some((node) => isVisible(node) && /^(localized text|show all|view all)$/i.test((node.textContent || '').trim()));
66
66
  const signInCta = Array.from(document.querySelectorAll('button, a'))
67
67
  .some((node) => isVisible(node) && /^(sign in|log in)$/i.test((node.textContent || '').trim()));
68
68
  if (signInCta && !hasHistoryEntry && !hasHistoryLauncher) {
@@ -72,7 +72,7 @@ export const grokExportCommand = cli({
72
72
  const clickAllHistory = () => {
73
73
  const buttons = Array.from(document.querySelectorAll('button, [role="button"]'))
74
74
  .filter((node) => node instanceof HTMLElement && isVisible(node));
75
- const target = buttons.find((node) => /^(查看全部|show all|view all)$/i.test((node.textContent || '').trim()));
75
+ const target = buttons.find((node) => /^(localized text|show all|view all)$/i.test((node.textContent || '').trim()));
76
76
  if (!target) return false;
77
77
  target.click();
78
78
  return true;
package/clis/grok/pin.js CHANGED
@@ -61,8 +61,8 @@ function defineToggle(name, accessLabels) {
61
61
  });
62
62
  }
63
63
 
64
- // Grok's context menu shows EITHER "置顶" OR "取消置顶" depending on the
64
+ // Grok's context menu shows EITHER "localized text" OR "localized text" depending on the
65
65
  // current pin state, never both. We register two commands that bind to
66
66
  // the matching label so callers can use whichever they want.
67
- defineToggle('pin', ['置顶', 'pin']);
68
- defineToggle('unpin', ['取消置顶', 'unpin']);
67
+ defineToggle('pin', ['localized text', 'pin']);
68
+ defineToggle('unpin', ['localized text', 'unpin']);
@@ -108,12 +108,12 @@ export async function getCurrentSessionId(page) {
108
108
 
109
109
  // Model picker trigger has stable id="model-select-trigger". Use that as the
110
110
  // primary selector — aria-label localizes (e.g. "Model select" in English,
111
- // "模型选择" in Chinese, etc.) and is unreliable across browser locales.
111
+ // "Model selection" in Chinese, etc.) and is unreliable across browser locales.
112
112
  const MODEL_TRIGGER_SELECTORS = [
113
113
  '#model-select-trigger',
114
114
  'button[aria-label="Model select"]',
115
- 'button[aria-label="模型选择"]',
116
- 'button[aria-label="モデル選択"]',
115
+ 'button[aria-label="Model selection"]',
116
+ 'button[aria-label="モデルlocalized text"]',
117
117
  ];
118
118
 
119
119
  export async function getModelLabel(page) {
@@ -245,10 +245,10 @@ export async function startNewChat(page) {
245
245
  // matches one of the localized labels. Returns whether the click happened.
246
246
  //
247
247
  // Menu items observed on grok.com (2026-05-31):
248
- // "打开新标签页" / "Open in new tab"
249
- // "重命名" / "Rename"
250
- // "置顶" or "取消置顶" / "Pin" or "Unpin"
251
- // "删除" / "Delete"
248
+ // "Open in new tab"
249
+ // "Rename"
250
+ // "Pin" or "Unpin"
251
+ // "Delete"
252
252
  //
253
253
  // Grok's delete action takes effect IMMEDIATELY — no confirmation dialog —
254
254
  // so callers must enforce their own --yes / dry-run gating.
@@ -319,10 +319,10 @@ export function getPinStateFromMenuLabels(labels) {
319
319
  const normalized = (Array.isArray(labels) ? labels : [])
320
320
  .map((label) => String(label || '').trim().toLowerCase())
321
321
  .filter(Boolean);
322
- if (normalized.some((label) => label === '取消置顶' || label === 'unpin')) {
322
+ if (normalized.some((label) => label === 'unpin')) {
323
323
  return 'pinned';
324
324
  }
325
- if (normalized.some((label) => label === '置顶' || label === 'pin')) {
325
+ if (normalized.some((label) => label === 'pin')) {
326
326
  return 'unpinned';
327
327
  }
328
328
  return '';
@@ -535,12 +535,12 @@ export async function sendMessage(page, prompt) {
535
535
  // Prefer data-testid (locale-independent); fall back to aria-label per
536
536
  // language. As of 2026-05-31 Grok renders button[data-testid="chat-submit"]
537
537
  // once the composer has content. The aria-label varies: "Submit" (en),
538
- // "提交" (zh-CN), and presumably other locales.
538
+ // "Submit" (zh-CN), and presumably other locales.
539
539
  const submitSelectors = [
540
540
  'button[data-testid="chat-submit"]',
541
541
  'button[aria-label="Submit"]',
542
- 'button[aria-label="提交"]',
543
- 'button[aria-label="送信"]',
542
+ 'button[aria-label="Submit"]',
543
+ 'button[aria-label="Send"]',
544
544
  ];
545
545
  let submit = null;
546
546
  for (let attempt = 0; attempt < 12; attempt += 1) {
@@ -105,12 +105,12 @@ describe('grok normalizeBooleanFlag', () => {
105
105
  describe('grok getPinStateFromMenuLabels', () => {
106
106
  it('detects pinned state from unpin labels without substring collisions', () => {
107
107
  expect(__test__.getPinStateFromMenuLabels(['Open in new tab', 'Unpin', 'Delete'])).toBe('pinned');
108
- expect(__test__.getPinStateFromMenuLabels(['打开新标签页', '取消置顶', '删除'])).toBe('pinned');
108
+ expect(__test__.getPinStateFromMenuLabels(['Rename', 'Unpin', 'Delete'])).toBe('pinned');
109
109
  });
110
110
 
111
111
  it('detects unpinned state from pin labels', () => {
112
112
  expect(__test__.getPinStateFromMenuLabels(['Open in new tab', 'Pin', 'Delete'])).toBe('unpinned');
113
- expect(__test__.getPinStateFromMenuLabels(['打开新标签页', '置顶', '删除'])).toBe('unpinned');
113
+ expect(__test__.getPinStateFromMenuLabels(['Rename', 'Pin', 'Delete'])).toBe('unpinned');
114
114
  });
115
115
 
116
116
  it('returns empty string when neither state label is visible', () => {
@@ -155,7 +155,7 @@ describe('indeed adapter — URL builders', () => {
155
155
  describe('indeed adapter — DOM normalizers', () => {
156
156
  it('dedupeTags drops the salary duplicate and trims', () => {
157
157
  const tags = ['$50 - $100 an hour', 'Contract', 'Hourly pay', 'Flexible schedule', 'Contract'];
158
- expect(dedupeTags(tags, '$50 - $100 an hour')).toBe('Contract · Hourly pay · Flexible schedule');
158
+ expect(dedupeTags(tags, '$50 - $100 an hour')).toBe('Contract \u00b7 Hourly pay \u00b7 Flexible schedule');
159
159
  });
160
160
 
161
161
  it('dedupeTags handles empty / no-salary input', () => {
@@ -184,7 +184,7 @@ describe('indeed adapter — DOM normalizers', () => {
184
184
  company: 'Somos, Inc.',
185
185
  location: 'Remote',
186
186
  salary: '$150,000 - $179,000 a year',
187
- tags: 'Full-time · 401(k)',
187
+ tags: 'Full-time \u00b7 401(k)',
188
188
  url: `${INDEED_ORIGIN}/viewjob?jk=a0021a1886f32d09`,
189
189
  });
190
190
  });
@@ -270,7 +270,7 @@ describe('indeed adapter — search runtime', () => {
270
270
  company: 'Acme',
271
271
  location: 'Remote',
272
272
  salary: '$180,000 a year',
273
- tags: 'Full-time · 401(k)',
273
+ tags: 'Full-time \u00b7 401(k)',
274
274
  url: `${INDEED_ORIGIN}/viewjob?jk=dccc07ac5a6a3683`,
275
275
  }]);
276
276
  });
@@ -118,7 +118,7 @@ export function dedupeTags(tags, salary) {
118
118
  if (out.includes(trimmed)) continue;
119
119
  out.push(trimmed);
120
120
  }
121
- return out.join(' · ');
121
+ return out.join(' \u00b7 ');
122
122
  }
123
123
 
124
124
  /**