@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,169 +1,125 @@
1
1
  # Strategy Selection
2
2
 
3
- SKILL.md 顶层已给出 strategy gate enum、表格和必填字段。本文件展开**为什么**这套 ladder 是按"契约"而不是"接口高度"组织的,以及具体怎么用 `webcmd browser analyze` `api_candidates` 证据填 strategy note。
3
+ Choose the strategy before writing adapter code. The right strategy is the lowest-maintenance source that has enough evidence.
4
4
 
5
- 进入条件:你已经按 `site-recon.md` 跑过 `webcmd browser analyze`、按 `api-discovery.md` 抓过候选 endpoint。本文件是写 note 之前的最后一站。
5
+ ## Contract Ladder
6
6
 
7
- ---
7
+ | Rank | Strategy | Contract | Maintenance risk |
8
+ | --- | --- | --- | --- |
9
+ | 1 | `PUBLIC_API` | stable external contract | lowest |
10
+ | 2 | `COOKIE_API` | stable endpoint plus page-sourced auth | low |
11
+ | 3 | `UI_SELECTOR` | visible UI contract | low to medium |
12
+ | 4 | `DOM_STATE` | visible page state / SSR contract | medium |
13
+ | 5 | `PAGE_FETCH` | internal page-runtime endpoint | high |
14
+ | 6 | `INTERCEPT` | internal request naturally issued by page | high |
8
15
 
9
- ## 1. 核心模型:契约 vs 无契约
16
+ Use the first strategy in the ladder that can satisfy the command honestly.
10
17
 
11
- 普遍假设 "API > DOM" — **数据不支持**。
18
+ ## Strategy Definitions
12
19
 
13
- 837 个内置 adapter 在 30 天观察窗(2026-04-20 → 2026-05-20)按 6 档 strategy 分类后的实测 fix 频率:
20
+ ### `PUBLIC_API`
14
21
 
15
- | Strategy | 契约级别 | fixes/adapter-year | 解读 |
16
- |---|---|---|---|
17
- | `PUBLIC_API` | stable | **1.18** | 一方文档化 API,最稳 |
18
- | `COOKIE_API` | stable | 2.01 | 官方 web 接口 + 用户 cookie |
19
- | `UI_SELECTOR` | visible-ui | 1.92 | DOM 的 a11y / semantic 约定也是契约 |
20
- | `DOM_STATE` | visible-ui | 0.91 (N=11, 小样本) | hydration JSON 半契约 |
21
- | `PAGE_FETCH` | **internal-unstable** | **8.41** | 站内未文档化 endpoint,最易漂 |
22
- | `INTERCEPT` | **internal-unstable** | **8.69** | 拦截内部 XHR,签名/字段 silent drift |
22
+ Use when Node-side `fetch` can retrieve the target data without login or page state.
23
23
 
24
- 含义:
24
+ Required evidence:
25
25
 
26
- - `PAGE_FETCH` / `INTERCEPT` 的 adapter 平均维护成本是 `PUBLIC_API` 的 **~7-8 倍**
27
- - `UI_SELECTOR` 在 1.92/year,跟 `COOKIE_API` 同档 — 不是"漂得最快"
28
- - `DOM_STATE` 0.91/year N=11 小样本,按 `UI_SELECTOR` 的近邻处理
26
+ - URL, method, params.
27
+ - 200 response.
28
+ - JSON or HTML contains target data.
29
+ - Response is not analytics, ads, recommendations, or layout-only data.
29
30
 
30
- **Selection bias caveat**:`PAGE_FETCH` / `INTERCEPT` 高 fix 率部分来自 selection bias — 用这俩的本身就是难站(Twitter GraphQL、xhs signed URL)。但这不改变 practical implication:能用契约层就用契约层,别把稳定的 UI/DOM 实现盲目迁到无契约 endpoint。
31
+ ### `COOKIE_API`
31
32
 
32
- 数据观察窗局限:30 天窗口是近似不是长尾;`PAGE_FETCH`/`INTERCEPT`/`DOM_STATE` 样本量小(N=32/9/11),二期数据足时会单独评估 `DOM_STATE`。
33
+ Use when Node-side `fetch` works after sourcing cookies or headers from the page.
33
34
 
34
- ---
35
+ Required evidence:
35
36
 
36
- ## 2. Ladder 心智模型
37
+ - Cookie/header/CSRF source is documented.
38
+ - Replay returns non-empty target data.
39
+ - Auth values are obtained from the user's existing browser session.
37
40
 
38
- ```
39
- 契约层(首选,互相平级,按 surface 适配):
40
- PUBLIC_API ─┬─ COOKIE_API ─┬─ UI_SELECTOR ≈ DOM_STATE
41
- (read) (write/click/upload)
42
-
43
- 无契约层(被迫才用,必须正向论证 8x 维护成本):
44
- PAGE_FETCH ──── INTERCEPT
45
- ```
46
-
47
- 注意:**ladder 不是从上往下降级**。`UI_SELECTOR` 不是 `PUBLIC_API` 失败后的"惩罚选项"。如果数据/操作本来就是 UI 表面的事(publish、click、upload、表单),`UI_SELECTOR` 是首选,不需要为"为什么不是 API"过度辩护。
41
+ ### `UI_SELECTOR`
48
42
 
49
- ---
43
+ Use when the user-visible UI is the stable contract: click, publish, upload, form, navigation, or page semantics.
50
44
 
51
- ## 3. 怎么把 `api_candidates` 转化为 strategy note 证据
45
+ Required evidence:
52
46
 
53
- `webcmd browser analyze <url>` 的输出里 `api_candidates[]` 字段,每条带:
47
+ - Stable semantic selector or accessibility anchor.
48
+ - Typed error path for missing UI, auth, timeout, and empty result.
49
+ - Visible-page assertion after the action when possible.
54
50
 
55
- ```json
56
- {
57
- "url": "https://example.com/api/list",
58
- "status": 200,
59
- "contentType": "application/json",
60
- "real_data_score": 0.82,
61
- "verdict": "likely_data",
62
- "reasons": ["json content-type", "non-empty top-level array", "3 business-like keys"],
63
- "sample_paths": ["$.data.items:array(20)", "$.data.items[0].title:string"]
64
- }
65
- ```
51
+ ### `DOM_STATE`
66
52
 
67
- `verdict` 决策:
53
+ Use when target data is in SSR HTML, hydration state, or bootstrap JSON.
68
54
 
69
- | Verdict | 含义 | strategy 信号 |
70
- |---|---|---|
71
- | `likely_data` (score ≥ 0.65) | 看起来是业务数据 | 优先 replay 这条做 `PUBLIC_API` / `COOKIE_API` 候选 |
72
- | `maybe_data` (score 0.35-0.65) | 可能业务数据但有 telemetry / 空字段嫌疑 | replay 必须人工核对字段是不是目标数据 |
73
- | `noise` | analytics / beacon / personalization | 不是 API 候选;Pattern A 不能基于这类条目成立 |
74
- | `blocked` (401/403) | auth-gated | 先排 cookie / token / CSRF,**不要**直接退到 `UI_SELECTOR` |
55
+ Required evidence:
75
56
 
76
- **关键**:`real_data_score` 是证据,不是 strategy。你最终在 strategy note 里仍要写 replay 出来的 status / content-type / sample shape,不是把 score 直接当结论。
57
+ - State key, script JSON, or HTML structure is clear.
58
+ - At least one extracted value matches the visible page.
59
+ - Parser failure produces a typed error, not an empty success.
77
60
 
78
- ### 反例:booking #1680
61
+ ### `PAGE_FETCH`
79
62
 
80
- ```
81
- Site: booking.com (酒店搜索)
82
- analyze 输出:17 个 JSON XHR,原 Pattern A
83
- 但 api_candidates 全部 verdict=noise(analytics + personalization + experiment)
84
- ```
63
+ Use when only page-context `fetch` can reuse same-origin/session/runtime state.
85
64
 
86
- 1.0.17 前的旧判定,agent 会按 Pattern A 写 `PAGE_FETCH` adapter,replay 拿到 noise data → adapter silent-fail。**新判定**:`real_data_candidates = 0` → Pattern 落到 C → 提示 SSR HTML scrape → 正确的 strategy 是 `DOM_STATE` / `UI_SELECTOR`。
65
+ Required evidence:
87
66
 
88
- `browser analyze` `recommended_next_step` 也已更新为 "Inspect api_candidates, then replay the best endpoint" — 不再按 XHR count 推 API。
67
+ - `webcmd browser eval fetch(...)` returns non-empty target data.
68
+ - Simpler strategies are ruled out in the strategy note.
69
+ - Internal endpoint drift risk is accepted and documented.
89
70
 
90
- ---
71
+ ### `INTERCEPT`
91
72
 
92
- ## 4. Strategy note 的关键字段填法
73
+ Use when request signing or runtime state is too complex, but the page can naturally issue the target request.
93
74
 
94
- ### `Contract` 字段
75
+ Required evidence:
95
76
 
96
- 不是直接从 strategy enum 抄,而是反映"这个 source 有多稳":
77
+ - Stable user action triggers the request.
78
+ - Captured response contains target data.
79
+ - UI/DOM cannot provide the target data or operation.
97
80
 
98
- - `stable`:一方文档化 API、官方 web 接口(PUBLIC_API、COOKIE_API)
99
- - `visible-ui`:用户可见的 DOM、a11y / semantic 标记(UI_SELECTOR、DOM_STATE)
100
- - `internal-unstable`:站内未文档化 endpoint、签名 / queryId 漂移、字段 silent rename(PAGE_FETCH、INTERCEPT)
81
+ ## `api_candidates` Evidence
101
82
 
102
- ### `Evidence` 三行
83
+ `webcmd browser analyze` may output `api_candidates[]`.
103
84
 
104
- 每行都是事实,不是猜测:
85
+ Treat a candidate as usable only when:
105
86
 
106
- ```md
107
- - observed request/state: GET /api/v2/list (sample_paths: $.data.items:array(20), $.data.items[0].title:string)
108
- - auth source: browser cookie (sessionid),无 CSRF
109
- - replay result: 200 / application/json / 20 items / 非空
110
- ```
87
+ - `verdict` is `likely_data`.
88
+ - Response sample includes target fields.
89
+ - URL and params are related to the user-visible result.
90
+ - Replay succeeds or the failure clearly points to auth/token handling.
111
91
 
112
- `observed request/state` 在 `DOM_STATE` 时写 state global key(`window.__INITIAL_STATE__.feed.items`);在 `UI_SELECTOR` 时写 selector path 或 a11y locator(`role=list[name="Trending"] > listitem`)。
92
+ Ignore candidates when:
113
93
 
114
- ### `If PAGE_FETCH or INTERCEPT` 三行论证
94
+ - `verdict` is `noise`.
95
+ - The response is analytics, beacon, ads, personalization, or experiment config.
96
+ - It contains only layout metadata.
97
+ - It cannot be tied to visible page data.
115
98
 
116
- ```md
117
- Why PUBLIC_API / COOKIE_API are unavailable: <因为 a_bogus signature 必须 page runtime 生成 / 公开 API 缺少 since 字段 / 接口仅在登录态曝露但 cookie 透传会触发 anti-bot>
118
- Why UI_SELECTOR / DOM_STATE are not safer: <因为数据是无限滚动 + 增量加载,DOM 一次只能拿 1 屏 / 因为目标是 write action,UI 无对应操作>
119
- Why the maintenance cost is acceptable: <因为业务需求要 raw timeline cursor / 因为已经接受漂时 autofix 流程兜底>
120
- ```
99
+ ## Counterexample: API-Looking Noise
121
100
 
122
- **反模式**:
101
+ A booking-site case had many JSON XHR requests. They looked like Pattern A, but the useful visible data was not in those requests; the requests were analytics side-channels. The correct outcome was `DOM_STATE` / `UI_SELECTOR`, not `PAGE_FETCH`.
123
102
 
124
- - "因为 API DOM 高级" 不是论证,是假设
125
- - ❌ "因为 selector 不可靠" — 数据不支持(UI_SELECTOR 跟 COOKIE_API 同档)
126
- - ❌ "因为我看到 17 XHR" — 不是论证,是 booking #1680 反例
103
+ Lesson: "has JSON XHR" is not the same as "has a usable API." Verify target data and external contract before choosing strategy.
127
104
 
128
- 正确论证须基于:endpoint 的**真实**不可达 / 操作语义本质 / 维护成本承担方有明确接收方。
105
+ ## Required Strategy Note
129
106
 
130
- ### `If UI_SELECTOR / DOM_STATE`
107
+ Write this before adapter code:
131
108
 
132
109
  ```md
133
- - semantic anchor: <a11y role / data-testid / framework-stable class>
134
- - typed error path: <selector 失配时抛 EmptyResultError / CommandExecutionError>
110
+ Strategy: PUBLIC_API | COOKIE_API | UI_SELECTOR | DOM_STATE | PAGE_FETCH | INTERCEPT
111
+ Contract: stable | visible-ui | internal-unstable
112
+ Evidence:
113
+ - observed request/state:
114
+ - auth source:
115
+ - replay result:
116
+ Why not simpler:
117
+ - PUBLIC_API:
118
+ - COOKIE_API:
119
+ - UI_SELECTOR/DOM_STATE:
120
+ Risk:
121
+ - drift risk:
122
+ - verification fixture:
135
123
  ```
136
124
 
137
- 不需要"why not API"过度辩护。如果你能简短说一句"目标是 publish,没有公开 write API"或"数据在 SSR HTML 直接 inline 了"就够了。
138
-
139
- ---
140
-
141
- ## 5. 与其他 reference 的关系
142
-
143
- | 文件 | 关系 |
144
- |---|---|
145
- | [`api-discovery.md`](./api-discovery.md) | §1-5 是 endpoint 发现的具体方法。本文件指它,但本文件管"用 endpoint 证据填 strategy note",那边管"怎么先找到 endpoint" |
146
- | [`site-recon.md`](./site-recon.md) | Pattern A-E 是 site classification。Pattern A 命中 ≠ `PAGE_FETCH` 必然合适 — 还要看 `api_candidates` 是不是 `likely_data` |
147
- | [`coverage-matrix.md`](./coverage-matrix.md) | 鉴权列已对齐 6 档 strategy enum |
148
- | [`adapter-template.md`](./adapter-template.md) | 写代码模板。strategy note 应该在打开 template 之前已经定好 |
149
- | [`success-rate-pitfalls.md`](./success-rate-pitfalls.md) | 11 种 silent failure 模式 — 多数发生在 strategy 选错时(比如把 noise endpoint 当业务数据) |
150
-
151
- ---
152
-
153
- ## 6. 反例案例库
154
-
155
- ### booking #1680 — Pattern A 误判
156
-
157
- 旧判定按 XHR count 推 Pattern A,实际 17 XHR 全是 analytics / personalization side channel。新 `verdict` 系统能识别为 `noise`,落到 Pattern C → SSR HTML scrape。
158
-
159
- ### Twitter GraphQL — PAGE_FETCH 高维护成本的典型
160
-
161
- `queryId` 每隔 1-2 月漂一次,字段名 silent rename(`legacy.user_screen_name` → `core.user.screen_name`)。30 天 9 个 fix PR。`Why the maintenance cost is acceptable` 的合理论证:业务需要 raw timeline cursor、autofix 流程已接住、fixed 时间窗口可控。
162
-
163
- ### xiaohongshu signed URL — INTERCEPT 必要场景
164
-
165
- `a_bogus` signature 由 page runtime 即时生成,无法在 Node 端复现也不能拷贝 cookie 跨 origin replay。合理 strategy 是 `INTERCEPT`:触发 UI 让页面自己发请求,从 response 取数据。
166
-
167
- ### weread-official — PUBLIC_API 首选
168
-
169
- WeRead 官方 Agent Gateway 有 Bearer auth + 文档化 schema。一方契约 + 不依赖 cookie / 不依赖浏览器 — 最理想的 strategy。维护成本最低。
125
+ If the selected strategy is `PAGE_FETCH` or `INTERCEPT`, the "Why not simpler" section is mandatory. If the selected strategy is `UI_SELECTOR` or `DOM_STATE`, do not over-defend why it is not an API; focus on semantic anchors and typed errors.
@@ -1,162 +1,137 @@
1
1
  # Success-Rate Pitfalls
2
2
 
3
- 11 个**静默失败**(adapter 看起来能跑、verify 能过,但数据是错的)的坑。每条给:现象 根因 防御手段。
3
+ These are silent failures where `webcmd browser verify` can pass while the data is wrong. Check this file during field decoding and visible-page comparison.
4
4
 
5
- 不是风格建议。每条都对应过一次真实翻车。
5
+ ## 1. Wrong Unit Scale
6
6
 
7
- ---
7
+ Symptoms:
8
8
 
9
- ## 1. fixture pattern 被放松以过 verify
9
+ - Value is 100x, 1,000x, or 10,000x off.
10
+ - Percentage appears as `0.025` in source but output claims `0.025%` instead of `2.5%`.
10
11
 
11
- **现象**:`verify` 报 `pattern "url" does not match /^https?:\/\/.*\.com\/bbs\/thread-/`。agent 的"修法"是把 fixture 里的 pattern 改宽(`^https?://`),verify 一下就通过了。
12
+ Fix:
12
13
 
13
- **根因**:adapter 丢了 URL 前缀 / 拼错了路径 / 吃到了相对路径。pattern 失败不是 fixture 太严,是 adapter 输出真的破了。
14
+ - Decide the output scale.
15
+ - Document it.
16
+ - Compare with a visible page value.
14
17
 
15
- **防御**:
16
- - `autofix` skill 现有纪律:**verify pattern 失败 = 收紧 adapter,不是收紧 fixture**(`webcmd-autofix` SKILL.md §Rules for Patching 第 6 条)
17
- - 要改 fixture 的唯一合法理由:**站点本身换了格式**(例如 URL 规范迁移)。这种情况下在 `~/.webcmd/sites/<site>/notes.md` 顶部写一段说明
18
+ ## 2. Seconds Versus Milliseconds
18
19
 
19
- ---
20
+ Symptoms:
20
21
 
21
- ## 2. 字段内容污染但 `notEmpty` / `columns` 都过
22
+ - Dates land in 1970 or far future.
23
+ - Time sorting looks wrong.
22
24
 
23
- **现象**:`description` 字段不为空,`verify` 通过。肉眼看输出发现描述里混了 `"address: 上海 category: IT"` 之类明显不属于描述的片段——兄弟 DOM 节点或父节点文字被一起 `textContent` 了。
25
+ Fix:
24
26
 
25
- **根因**:`.container` `textContent` 包括所有后代文字。调 `innerText` 仅好一点;用 `querySelector('.desc').textContent` 时,如果 `.desc` 里嵌套了 `.tag.address`,一样吃进去。
27
+ - Inspect timestamp length.
28
+ - Convert seconds with `* 1000`; leave milliseconds as-is.
29
+ - Keep timezone clear.
26
30
 
27
- **防御**:
28
- - fixture 用 `mustNotContain`:`{ "description": ["address:", "category:", "工作年限:"] }` 把已踩过的污染词列出来
29
- - adapter 侧:定位更精确的 selector,或抓到后 `.replace(/address:[^\n]*/g, '').trim()`
30
- - 别信 `textContent.trim()` 就完事
31
+ ## 3. Page-Level Selector In Repeated Cards
31
32
 
32
- ---
33
+ Symptoms:
33
34
 
34
- ## 3. 字段语义分歧(两个字段看起来都对)
35
+ - Every row has the same author, count, button state, or URL.
35
36
 
36
- **现象**:51job 列表有 `updatedate` 和 `publishDate`,eastmoney 债券有 `f10`(发行日)和 `f26`(上市日)。adapter 随便选一个,verify 通过,用户一对照发现时间错位 1 个月。
37
+ Fix:
37
38
 
38
- **根因**:两个字段都是合法日期,format 也对,只是含义不同。`notEmpty` / `types` 都挡不住。
39
+ - Scope selectors to the row/card root.
40
+ - Add a JSDOM fixture for repeated-card parsing.
39
41
 
40
- **防御**:
41
- - Step 7 字段解码**必须和网页肉眼对至少一条已知记录**("这条债券首页写的上市日是 2025-02-14",看 adapter 输出对不对得上)
42
- - 字段写进 `field-map.json` 时 `meaning` 要精确到"上市日"而不是"日期"
42
+ ## 4. Hidden Template Content
43
43
 
44
- ---
44
+ Symptoms:
45
45
 
46
- ## 4. 字段单位混淆(数值量级错)
46
+ - Output includes rows not visible on the page.
47
+ - Text contains modal, template, or navigation labels.
47
48
 
48
- **现象**:eastmoney 返回 `totalMarketCap: 128`(单位:亿元),adapter 直接写进 `marketCap`,用户对照 K 线页看是 128 元。常见错位:
49
+ Fix:
49
50
 
50
- | 接口返回 | 网页显示 | 实际单位 | 错误写法 |
51
- |---------|---------|----------|---------|
52
- | `0.025` | `2.5%` | 小数 | adapter 再 × 100 → 显示 250% |
53
- | `12800` | `1.28 万` | 元 | adapter 不除 10000 → 显示 12800 万 |
54
- | `f152 = 2` | `9.27` | 价格 = 原值 ÷ 10^f152 | adapter 忽略 f152 → 显示 927 |
51
+ - Filter hidden elements.
52
+ - Prefer semantic row roots over broad text extraction.
55
53
 
56
- **防御**:
57
- - fixture 加 `mustBeTruthy` 挡 `|| 0` / `|| false` silent fallback(数值列应该有值,不是 0)
58
- - `field-map.json` 的 `meaning` 写单位:`"premium pct (0-1 fraction, NOT already × 100)"`
59
- - Step 11 肉眼比对不能只比"有没有数字",要比数量级
54
+ ## 5. Locale-Dependent Labels
60
55
 
61
- ---
56
+ Symptoms:
62
57
 
63
- ## 5. JSON-in-attribute vs 渲染后 innerText
58
+ - Parser works in one locale and fails in another.
59
+ - `aria-label` or button text changes.
64
60
 
65
- **现象**:51job 把完整 JSON 塞在 `<div data-sensorsdata='{"job_title":"..."}'>` 里,用 innerText 取的是渲染后的截断显示文字("Lead... ↩ 上海..."),字段边界丢了。
61
+ Fix:
66
62
 
67
- **根因**:现代站点常把结构化数据放在 `data-*` 属性里,渲染层只挑部分显示。取 innerText 相当于丢掉了结构。
63
+ - Prefer stable attributes or structure.
64
+ - If text is unavoidable, support known variants and fixture them.
68
65
 
69
- **防御**:
70
- - 看到 `data-sensorsdata` / `data-ng-state` / `data-page-props` / `data-track` 类属性先读属性,不读 innerText
71
- - 先在 `browser eval` 里检查:`document.querySelector('.item').dataset` 看有没有 JSON 串
72
- - 搜 bundle 时也搜 `JSON.parse(el.dataset.*)` 模式看 vendor 把数据塞哪了
66
+ ## 6. Analytics Or Recommendation APIs
73
67
 
74
- ---
68
+ Symptoms:
75
69
 
76
- ## 6. cookie / origin 不一致的隐式假设
70
+ - JSON endpoint exists but rows do not match visible results.
71
+ - API returns personalized or experiment data.
77
72
 
78
- **现象**:在 `jobs.51job.com` 页面调 `cupid.51job.com` 的接口,headless 里带了 cookie 也跨不过去——`credentials:'include'` 只管带 cookie,不管 CORS。
73
+ Fix:
79
74
 
80
- **根因**:浏览器 CORS 预检默认关闭跨 subdomain 请求。`credentials:'include'` 不是万能药。
75
+ - Verify target data against the visible page.
76
+ - Reject `api_candidates` marked `noise`.
81
77
 
82
- **防御**:参见 `api-discovery.md §0.2`。判断:`fetch(target).catch(e=>'cors:'+e.message)` 看是不是 TypeError。降级路径:改用 same-origin endpoint / 改在目标 subdomain 上打开页面 / 走 `§5 intercept`。
78
+ ## 7. Empty Success
83
79
 
84
- ---
80
+ Symptoms:
85
81
 
86
- ## 7. 等不够就抓导致空 DOM / network
82
+ - Adapter returns `[]` when selectors changed, auth expired, or endpoint returned HTML.
87
83
 
88
- **现象**:`open url && wait time 2 && network` 看到 0 条业务 API。agent 以为是 Pattern C(静态),去 bundle 里找 baseURL,找不到就卡住。真相:SPA 3.5 秒才发出第一个 API。
84
+ Fix:
89
85
 
90
- **根因**:`wait time N` 是盲等。不同站点 JS 执行速度差很多。
86
+ - Throw `EmptyResultError` only when the site truly reports no results.
87
+ - Throw typed errors for auth, timeout, parse, or shape failures.
91
88
 
92
- **防御**:
93
- - 数据是异步加载时**不用 `wait time`**,用 `webcmd browser wait xhr '/api/path-fragment'`,等具体 XHR 到场再 `network`
94
- - 不确定 endpoint 路径时:先 `wait time 2 && network`,看到候选路径再转 `wait xhr` 确认
95
- - 首诊断用 `webcmd browser analyze <url>` 一步拿 `json_responses` 数量——=0 时才真的是 Pattern C
89
+ ## 8. Silent Clamp
96
90
 
97
- ---
91
+ Symptoms:
98
92
 
99
- ## 8. adapter 里的 falsy `|| 0` 兜底静默
93
+ - Invalid `limit`, page number, or date silently changes to a default.
100
94
 
101
- **现象**:`likes: data.likes || 0`。接口偶尔返回 `likes: null`(可能因字段名改了、权限问题等),adapter 写成 0,verify `types: {likes: 'number'}` 通过,用户看到的是"所有帖子 0 赞"。
95
+ Fix:
102
96
 
103
- **根因**:`||` 兜底把"没抓到"变成"是 0"。`notEmpty` 挡不住 0,`types` 也不挡。
97
+ - Throw `ArgumentError` for invalid external args.
98
+ - Clamp only when the command explicitly documents clamping.
104
99
 
105
- **防御**:
106
- - fixture 用 `mustBeTruthy: ["likes", "count", ...]`——业务数值列必须 truthy
107
- - adapter 侧 prefer `?.` 而不是 `||`;真的想兜底就兜 `undefined`,让 verify 能看见
108
- - 全部 `|| 0` 要过一遍眼:这个 0 是合法值还是漏抓 fallback
100
+ ## 9. Column Drift
109
101
 
110
- ---
102
+ Symptoms:
111
103
 
112
- ## 9. session cookie 污染 / 登录态漂移
104
+ - `columns` contains a field that rows do not return.
105
+ - Row contains extra fields not documented in `columns`.
113
106
 
114
- **现象**:本地开发时用自己的登录态验 endpoint 能通,PR 一合 verify fixture 跑在 CI 环境里立刻 401——顺手把样本数据也固化进了 fixture,看起来"一切正常"。
107
+ Fix:
115
108
 
116
- **根因**:fixture 样本是带登录态跑出来的。存 `~/.webcmd/sites/<site>/fixtures/*.json` 没脱敏,把 cookie / token / 自己的 uid / 昵称存了进去。
109
+ - Keep `columns` and row keys exactly aligned.
110
+ - Add fixture checks for columns and types.
117
111
 
118
- **防御**:
119
- - `site-memory.md` 的脱敏规则:存 fixtures 前去掉 cookie / token / 用户私有字段(手机号 / 邮箱 / 昵称 / uid)
120
- - 需要登录态的接口:adapter 用 `Strategy.COOKIE`,adapter 代码里**不写任何具体 cookie 值**,只声明"我需要 domain X 的 cookie"
121
- - verify 样本里看到 `Bearer ...` 或 32 位 hex token → 先删再存
112
+ ## 10. Auth State Misread
122
113
 
123
- ---
114
+ Symptoms:
124
115
 
125
- ## 10. adapter 默认 timeout 不统一
116
+ - Logged-out page returns marketing content but parser treats it as data.
117
+ - Endpoint returns login HTML with status 200.
126
118
 
127
- **现象**:同一个站两个 adapter,一个默认 15s timeout,另一个默认 60s。慢接口在一个命令里 ok,在另一个一样的慢接口却 timeout 了。
119
+ Fix:
128
120
 
129
- **根因**:模板没统一 timeout;agent 依赖"最像的邻居"复制,复制到的邻居选了短 timeout。
121
+ - Detect login walls.
122
+ - Throw `AuthRequiredError`.
123
+ - Check response content type and expected shape.
130
124
 
131
- **防御**:
132
- - 邻居 adapter 的 `requestTimeoutMs` / `browser.wait` 配置**不能盲抄**。每个 adapter 应该结合自己的接口特性设一个
133
- - 真实接口延迟:Step 5 endpoint 验证时用 `time curl`(或 `performance.now()` 包 fetch)量一下 p50 / p95,timeout 设 p95 × 2 比较安全
134
- - 出现偶发 timeout 别 retry 掩盖;记到 `notes.md`,下次就知道这接口 p95 偏高
125
+ ## 11. Fixture Too Loose
135
126
 
136
- ---
127
+ Symptoms:
137
128
 
138
- ## 11. `aria-label` / `placeholder` / `title` locale-dependent 文本
129
+ - Verify passes even after a parser regression.
130
+ - Patterns only check that some string exists.
139
131
 
140
- **现象**:你本地英文 Chrome 测 `button[aria-label="Submit"]` 一切正常,verify fixture 也是英文环境抓的。用户把 `chrome://settings/languages` 切中文,同一个按钮变 `aria-label="提交"`,adapter silent 0 匹配——退化成 `notEmpty` / `types` 都没法 fire 的"adapter 跑完返 0 行"。
132
+ Fix:
141
133
 
142
- **根因**:`aria-label` / `title` / `placeholder` / `alt` / `textContent` 都是页面的**用户可见文本**,被站点 i18n 框架翻译。用它们当 selector anchor 等于 "select by visible text",locale 一动整个选择器就废。
143
-
144
- **防御**:
145
- - 优先用 locale-stable 标识:`data-testid` / `data-*` / 稳定 `id` / `class`。先确认不是 hash / A-B test 产物
146
- - `role` 不按 locale 翻译,但通常不唯一;只能当 semantic / scope filter,不能用裸 `[role="button"]` 当 primary
147
- - 站点只暴露 `aria-label`(典型如 ChatGPT web 某些 control)时,写 fallback list,至少 en + zh-CN:`'[aria-label="Send"], [aria-label="发送"]'`
148
- - commit 前 grep `aria-label=` / `placeholder=` / `title=` 的硬编码字符串,确认每条都有兜底 locale
149
- - 找不到 control 要 typed fail-fast(例如 `CommandExecutionError` / send-failed),不要把 selector miss 变成空 rows 或假成功
150
- - 详细 framework + 活例见 `adapter-template.md §Selector 稳定性`
151
-
152
- 不要去给 framework 加 `--i18n` flag 自动展开——多一层 indirection 还要维护翻译字典,纯 over-engineering。
153
-
154
- ---
155
-
156
- ## 总结:静默失败的共同特征
157
-
158
- 1. **verify 绿 ≠ 数据对**。verify 只能证"结构没坏",证不出"值对不对"。Step 11 肉眼比对是必须的。
159
- 2. **"字段有值"是个比"字段为空"更危险的失败态**。空你会去查,有值你会 fallthrough。
160
- 3. **fixture 四件套一起上**:`patterns` + `notEmpty` + `mustNotContain` + `mustBeTruthy`——每件挡一类问题,缺一个就漏。
161
-
162
- 回写 `notes.md` 时把你踩的新坑写进去。下次就有第 12 条了。
134
+ - Add `notEmpty` for core fields.
135
+ - Add URL/date/ID patterns.
136
+ - Tighten `rowCount`.
137
+ - Reverse-validate important parser tests.