publishport-opencli 1.0.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 (1860) hide show
  1. package/LICENSE +214 -0
  2. package/README.md +299 -0
  3. package/README.zh-CN.md +341 -0
  4. package/cli-manifest.json +51513 -0
  5. package/clis/12306/auth.js +25 -0
  6. package/clis/12306/me.js +9 -0
  7. package/clis/12306/orders.js +13 -0
  8. package/clis/12306/passengers.js +14 -0
  9. package/clis/12306/price.js +1 -0
  10. package/clis/12306/stations.js +1 -0
  11. package/clis/12306/train.js +1 -0
  12. package/clis/12306/trains.js +1 -0
  13. package/clis/12306/utils.js +1 -0
  14. package/clis/1688/assets.js +127 -0
  15. package/clis/1688/auth.js +1 -0
  16. package/clis/1688/download.js +1 -0
  17. package/clis/1688/item.js +21 -0
  18. package/clis/1688/search.js +129 -0
  19. package/clis/1688/shared.js +11 -0
  20. package/clis/1688/store.js +26 -0
  21. package/clis/1point3acres/auth.js +18 -0
  22. package/clis/1point3acres/digest.js +1 -0
  23. package/clis/1point3acres/forum.js +1 -0
  24. package/clis/1point3acres/forums.js +1 -0
  25. package/clis/1point3acres/hot.js +1 -0
  26. package/clis/1point3acres/latest.js +1 -0
  27. package/clis/1point3acres/notifications.js +1 -0
  28. package/clis/1point3acres/search.js +1 -0
  29. package/clis/1point3acres/thread.js +2 -0
  30. package/clis/1point3acres/user.js +1 -0
  31. package/clis/1point3acres/utils.js +6 -0
  32. package/clis/36kr/article.js +20 -0
  33. package/clis/36kr/hot.js +16 -0
  34. package/clis/36kr/news.js +1 -0
  35. package/clis/36kr/search.js +36 -0
  36. package/clis/51job/company.js +36 -0
  37. package/clis/51job/detail.js +35 -0
  38. package/clis/51job/hot.js +1 -0
  39. package/clis/51job/search.js +1 -0
  40. package/clis/51job/utils.js +21 -0
  41. package/clis/_atlassian/shared.js +21 -0
  42. package/clis/_shared/article/auth.js +16 -0
  43. package/clis/_shared/article/douban-md2draft.js +4 -0
  44. package/clis/_shared/article/format.js +1 -0
  45. package/clis/_shared/article/images.js +95 -0
  46. package/clis/_shared/article/login.js +1 -0
  47. package/clis/_shared/article/page-runtime.js +745 -0
  48. package/clis/_shared/article/publish.js +34 -0
  49. package/clis/_shared/common.js +1 -0
  50. package/clis/_shared/content-guard.js +1 -0
  51. package/clis/_shared/desktop-commands.js +1 -0
  52. package/clis/_shared/search-adapter.js +1 -0
  53. package/clis/_shared/site-auth.js +1 -0
  54. package/clis/_shared/token-auth.js +2 -0
  55. package/clis/_shared/video-publish.js +62 -0
  56. package/clis/aibase/news.js +31 -0
  57. package/clis/amazon/auth.js +19 -0
  58. package/clis/amazon/bestsellers.js +1 -0
  59. package/clis/amazon/discussion.js +20 -0
  60. package/clis/amazon/movers-shakers.js +1 -0
  61. package/clis/amazon/new-releases.js +1 -0
  62. package/clis/amazon/offer.js +29 -0
  63. package/clis/amazon/product.js +25 -0
  64. package/clis/amazon/rankings.js +68 -0
  65. package/clis/amazon/search.js +16 -0
  66. package/clis/amazon/shared.js +11 -0
  67. package/clis/antigravity/SKILL.md +38 -0
  68. package/clis/antigravity/_actions.js +201 -0
  69. package/clis/antigravity/audit-extras.js +78 -0
  70. package/clis/antigravity/delete.js +1 -0
  71. package/clis/antigravity/dump.js +1 -0
  72. package/clis/antigravity/extract-code.js +18 -0
  73. package/clis/antigravity/history.js +1 -0
  74. package/clis/antigravity/mark-read.js +1 -0
  75. package/clis/antigravity/model.js +90 -0
  76. package/clis/antigravity/new.js +9 -0
  77. package/clis/antigravity/read.js +10 -0
  78. package/clis/antigravity/rename.js +1 -0
  79. package/clis/antigravity/send.js +11 -0
  80. package/clis/antigravity/serve.js +97 -0
  81. package/clis/antigravity/status.js +1 -0
  82. package/clis/antigravity/storage.js +12 -0
  83. package/clis/antigravity/watch.js +6 -0
  84. package/clis/apple-podcasts/episodes.js +1 -0
  85. package/clis/apple-podcasts/search.js +1 -0
  86. package/clis/apple-podcasts/top.js +1 -0
  87. package/clis/apple-podcasts/utils.js +1 -0
  88. package/clis/archive/item.js +1 -0
  89. package/clis/archive/search.js +1 -0
  90. package/clis/archive/snapshots.js +1 -0
  91. package/clis/archive/wayback.js +1 -0
  92. package/clis/arxiv/author.js +1 -0
  93. package/clis/arxiv/paper.js +1 -0
  94. package/clis/arxiv/recent.js +1 -0
  95. package/clis/arxiv/search.js +1 -0
  96. package/clis/arxiv/utils.js +1 -0
  97. package/clis/autohome/__fixtures__/catalog.html +11 -0
  98. package/clis/autohome/__fixtures__/koubei.json +116 -0
  99. package/clis/autohome/brand.js +1 -0
  100. package/clis/autohome/score.js +1 -0
  101. package/clis/autohome/utils.js +1 -0
  102. package/clis/baidu-scholar/search.js +63 -0
  103. package/clis/baijiahao/article.js +1 -0
  104. package/clis/baijiahao/lists.js +1 -0
  105. package/clis/baijiahao/login.js +1 -0
  106. package/clis/baijiahao/publish.js +57 -0
  107. package/clis/baijiahao/stats.js +1 -0
  108. package/clis/baijiahao/whoami.js +1 -0
  109. package/clis/band/auth.js +29 -0
  110. package/clis/band/bands.js +37 -0
  111. package/clis/band/mentions.js +6 -0
  112. package/clis/band/post.js +76 -0
  113. package/clis/band/posts.js +50 -0
  114. package/clis/barchart/flow.js +70 -0
  115. package/clis/barchart/greeks.js +88 -0
  116. package/clis/barchart/options.js +61 -0
  117. package/clis/barchart/quote.js +87 -0
  118. package/clis/bbc/news.js +1 -0
  119. package/clis/bbc/topic.js +1 -0
  120. package/clis/bbc/utils.js +1 -0
  121. package/clis/bilibili/article.js +1 -0
  122. package/clis/bilibili/auth.js +1 -0
  123. package/clis/bilibili/categories.js +1 -0
  124. package/clis/bilibili/coin.js +1 -0
  125. package/clis/bilibili/comment-del.js +1 -0
  126. package/clis/bilibili/comment-like.js +1 -0
  127. package/clis/bilibili/comment.js +1 -0
  128. package/clis/bilibili/comments.js +1 -0
  129. package/clis/bilibili/dm-list.js +1 -0
  130. package/clis/bilibili/dm-read.js +1 -0
  131. package/clis/bilibili/dm-send.js +1 -0
  132. package/clis/bilibili/download.js +7 -0
  133. package/clis/bilibili/drafts.js +1 -0
  134. package/clis/bilibili/dynamic-post.js +24 -0
  135. package/clis/bilibili/dynamic.js +1 -0
  136. package/clis/bilibili/favorite-add.js +1 -0
  137. package/clis/bilibili/favorite.js +1 -0
  138. package/clis/bilibili/feed.js +2 -0
  139. package/clis/bilibili/follow.js +1 -0
  140. package/clis/bilibili/following.js +1 -0
  141. package/clis/bilibili/history.js +1 -0
  142. package/clis/bilibili/hot.js +15 -0
  143. package/clis/bilibili/like.js +1 -0
  144. package/clis/bilibili/me.js +1 -0
  145. package/clis/bilibili/partitions.js +1 -0
  146. package/clis/bilibili/ranking.js +1 -0
  147. package/clis/bilibili/search.js +1 -0
  148. package/clis/bilibili/stats.js +1 -0
  149. package/clis/bilibili/subtitle.js +21 -0
  150. package/clis/bilibili/summary.js +1 -0
  151. package/clis/bilibili/topics.js +1 -0
  152. package/clis/bilibili/unfollow.js +1 -0
  153. package/clis/bilibili/upload.js +1 -0
  154. package/clis/bilibili/user-videos.js +1 -0
  155. package/clis/bilibili/utils.js +50 -0
  156. package/clis/bilibili/video-drafts.js +1 -0
  157. package/clis/bilibili/video.js +1 -0
  158. package/clis/binance/asks.js +1 -0
  159. package/clis/binance/depth.js +1 -0
  160. package/clis/binance/gainers.js +1 -0
  161. package/clis/binance/klines.js +1 -0
  162. package/clis/binance/losers.js +1 -0
  163. package/clis/binance/pairs.js +1 -0
  164. package/clis/binance/price.js +1 -0
  165. package/clis/binance/prices.js +1 -0
  166. package/clis/binance/ticker.js +1 -0
  167. package/clis/binance/top.js +1 -0
  168. package/clis/binance/trades.js +1 -0
  169. package/clis/bloomberg/businessweek.js +12 -0
  170. package/clis/bloomberg/crypto.js +1 -0
  171. package/clis/bloomberg/economics.js +1 -0
  172. package/clis/bloomberg/feeds.js +1 -0
  173. package/clis/bloomberg/green.js +1 -0
  174. package/clis/bloomberg/industries.js +1 -0
  175. package/clis/bloomberg/main.js +1 -0
  176. package/clis/bloomberg/markets.js +1 -0
  177. package/clis/bloomberg/news.js +57 -0
  178. package/clis/bloomberg/opinions.js +1 -0
  179. package/clis/bloomberg/politics.js +1 -0
  180. package/clis/bloomberg/pursuits.js +1 -0
  181. package/clis/bloomberg/tech.js +1 -0
  182. package/clis/bloomberg/utils.js +17 -0
  183. package/clis/bluesky/post.js +1 -0
  184. package/clis/bluesky/shared.js +56 -0
  185. package/clis/bluesky/whoami.js +1 -0
  186. package/clis/booking/search.js +93 -0
  187. package/clis/boss/auth.js +13 -0
  188. package/clis/boss/batchgreet.js +1 -0
  189. package/clis/boss/chatlist.js +1 -0
  190. package/clis/boss/chatmsg.js +1 -0
  191. package/clis/boss/detail.js +1 -0
  192. package/clis/boss/exchange.js +1 -0
  193. package/clis/boss/greet.js +1 -0
  194. package/clis/boss/invite.js +4 -0
  195. package/clis/boss/joblist.js +1 -0
  196. package/clis/boss/mark.js +1 -0
  197. package/clis/boss/recommend.js +1 -0
  198. package/clis/boss/resume.js +90 -0
  199. package/clis/boss/search.js +1 -0
  200. package/clis/boss/send.js +1 -0
  201. package/clis/boss/stats.js +1 -0
  202. package/clis/boss/utils.js +161 -0
  203. package/clis/brave/search.js +23 -0
  204. package/clis/chaoxing/assignments.js +1 -0
  205. package/clis/chaoxing/auth.js +21 -0
  206. package/clis/chaoxing/exams.js +1 -0
  207. package/clis/chaoxing/utils.js +58 -0
  208. package/clis/chatgpt/ask.js +1 -0
  209. package/clis/chatgpt/auth.js +17 -0
  210. package/clis/chatgpt/detail.js +1 -0
  211. package/clis/chatgpt/history.js +1 -0
  212. package/clis/chatgpt/image.js +1 -0
  213. package/clis/chatgpt/model.js +1 -0
  214. package/clis/chatgpt/new.js +1 -0
  215. package/clis/chatgpt/project-file-add.js +1 -0
  216. package/clis/chatgpt/project-list.js +1 -0
  217. package/clis/chatgpt/read.js +1 -0
  218. package/clis/chatgpt/send.js +1 -0
  219. package/clis/chatgpt/status.js +1 -0
  220. package/clis/chatgpt/utils.js +1092 -0
  221. package/clis/chatgpt-app/ask.js +1 -0
  222. package/clis/chatgpt-app/ax.js +512 -0
  223. package/clis/chatgpt-app/model.js +1 -0
  224. package/clis/chatgpt-app/new.js +1 -0
  225. package/clis/chatgpt-app/read.js +1 -0
  226. package/clis/chatgpt-app/send.js +1 -0
  227. package/clis/chatgpt-app/status.js +1 -0
  228. package/clis/chatwise/ask.js +1 -0
  229. package/clis/chatwise/export.js +21 -0
  230. package/clis/chatwise/history.js +26 -0
  231. package/clis/chatwise/model.js +48 -0
  232. package/clis/chatwise/new.js +1 -0
  233. package/clis/chatwise/read.js +25 -0
  234. package/clis/chatwise/screenshot.js +1 -0
  235. package/clis/chatwise/send.js +1 -0
  236. package/clis/chatwise/status.js +1 -0
  237. package/clis/chatwise/utils.js +75 -0
  238. package/clis/chess/analyze.js +1 -0
  239. package/clis/chess/game.js +1 -0
  240. package/clis/chess/games.js +1 -0
  241. package/clis/chess/stats.js +1 -0
  242. package/clis/chess/utils.js +1 -0
  243. package/clis/claude/ask.js +4 -0
  244. package/clis/claude/auth.js +19 -0
  245. package/clis/claude/detail.js +1 -0
  246. package/clis/claude/history.js +1 -0
  247. package/clis/claude/new.js +1 -0
  248. package/clis/claude/read.js +1 -0
  249. package/clis/claude/send.js +1 -0
  250. package/clis/claude/status.js +1 -0
  251. package/clis/claude/utils.js +179 -0
  252. package/clis/cnblogs/article.js +1 -0
  253. package/clis/cnblogs/login.js +1 -0
  254. package/clis/cnblogs/stats.js +37 -0
  255. package/clis/cnblogs/whoami.js +1 -0
  256. package/clis/cnki/search.js +38 -0
  257. package/clis/codex/_actions.js +72 -0
  258. package/clis/codex/archive.js +1 -0
  259. package/clis/codex/ask.js +23 -0
  260. package/clis/codex/dump.js +1 -0
  261. package/clis/codex/export.js +12 -0
  262. package/clis/codex/extract-diff.js +28 -0
  263. package/clis/codex/history.js +1 -0
  264. package/clis/codex/model.js +118 -0
  265. package/clis/codex/new.js +1 -0
  266. package/clis/codex/pin.js +1 -0
  267. package/clis/codex/projects.js +1 -0
  268. package/clis/codex/read.js +16 -0
  269. package/clis/codex/rename.js +34 -0
  270. package/clis/codex/screenshot.js +1 -0
  271. package/clis/codex/send.js +16 -0
  272. package/clis/codex/sidebar.js +1 -0
  273. package/clis/codex/status.js +1 -0
  274. package/clis/coingecko/categories.js +1 -0
  275. package/clis/coingecko/coin.js +1 -0
  276. package/clis/coingecko/derivatives.js +1 -0
  277. package/clis/coingecko/exchanges.js +1 -0
  278. package/clis/coingecko/global.js +1 -0
  279. package/clis/coingecko/top.js +1 -0
  280. package/clis/coingecko/trending.js +1 -0
  281. package/clis/confluence/create.js +1 -0
  282. package/clis/confluence/page.js +1 -0
  283. package/clis/confluence/search.js +1 -0
  284. package/clis/confluence/shared.js +1 -0
  285. package/clis/confluence/update.js +1 -0
  286. package/clis/coupang/add-to-cart.js +86 -0
  287. package/clis/coupang/auth.js +16 -0
  288. package/clis/coupang/product.js +161 -0
  289. package/clis/coupang/search.js +385 -0
  290. package/clis/coupang/utils.js +1 -0
  291. package/clis/crates/crate.js +1 -0
  292. package/clis/crates/search.js +1 -0
  293. package/clis/crates/utils.js +1 -0
  294. package/clis/csdn/article.js +29 -0
  295. package/clis/csdn/columns.js +1 -0
  296. package/clis/csdn/login.js +1 -0
  297. package/clis/csdn/stats.js +71 -0
  298. package/clis/csdn/whoami.js +1 -0
  299. package/clis/cto51/article.js +1 -0
  300. package/clis/cto51/whoami.js +1 -0
  301. package/clis/ctrip/auth.js +1 -0
  302. package/clis/ctrip/flight.js +17 -0
  303. package/clis/ctrip/hotel-search.js +24 -0
  304. package/clis/ctrip/hotel-suggest.js +1 -0
  305. package/clis/ctrip/search.js +1 -0
  306. package/clis/ctrip/utils.js +119 -0
  307. package/clis/cursor/ask.js +22 -0
  308. package/clis/cursor/composer.js +12 -0
  309. package/clis/cursor/dump.js +1 -0
  310. package/clis/cursor/export.js +23 -0
  311. package/clis/cursor/extract-code.js +18 -0
  312. package/clis/cursor/history.js +26 -0
  313. package/clis/cursor/model.js +18 -0
  314. package/clis/cursor/new.js +1 -0
  315. package/clis/cursor/read.js +27 -0
  316. package/clis/cursor/screenshot.js +1 -0
  317. package/clis/cursor/send.js +12 -0
  318. package/clis/cursor/status.js +1 -0
  319. package/clis/dblp/author.js +1 -0
  320. package/clis/dblp/paper.js +1 -0
  321. package/clis/dblp/search.js +1 -0
  322. package/clis/dblp/utils.js +1 -0
  323. package/clis/dblp/venue.js +1 -0
  324. package/clis/deepseek/ask.js +1 -0
  325. package/clis/deepseek/auth.js +22 -0
  326. package/clis/deepseek/detail.js +1 -0
  327. package/clis/deepseek/history.js +1 -0
  328. package/clis/deepseek/new.js +1 -0
  329. package/clis/deepseek/read.js +1 -0
  330. package/clis/deepseek/send.js +50 -0
  331. package/clis/deepseek/status.js +1 -0
  332. package/clis/deepseek/utils.js +202 -0
  333. package/clis/defillama/protocol.js +1 -0
  334. package/clis/defillama/protocols.js +1 -0
  335. package/clis/defillama/utils.js +1 -0
  336. package/clis/devto/auth.js +9 -0
  337. package/clis/devto/latest.js +1 -0
  338. package/clis/devto/publish.js +17 -0
  339. package/clis/devto/read.js +3 -0
  340. package/clis/devto/stats.js +27 -0
  341. package/clis/devto/tag.js +1 -0
  342. package/clis/devto/top.js +1 -0
  343. package/clis/devto/user.js +1 -0
  344. package/clis/dianping/__fixtures__/search.html +168 -0
  345. package/clis/dianping/__fixtures__/shop.html +6 -0
  346. package/clis/dianping/auth.js +10 -0
  347. package/clis/dianping/cityResolver.js +4 -0
  348. package/clis/dianping/search.js +1 -0
  349. package/clis/dianping/shop.js +1 -0
  350. package/clis/dianping/utils.js +1 -0
  351. package/clis/dictionary/examples.js +1 -0
  352. package/clis/dictionary/search.js +1 -0
  353. package/clis/dictionary/synonyms.js +1 -0
  354. package/clis/discord-app/channels.js +1 -0
  355. package/clis/discord-app/delete.js +66 -0
  356. package/clis/discord-app/goto.js +1 -0
  357. package/clis/discord-app/members.js +21 -0
  358. package/clis/discord-app/read.js +1 -0
  359. package/clis/discord-app/search.js +29 -0
  360. package/clis/discord-app/send.js +10 -0
  361. package/clis/discord-app/servers.js +1 -0
  362. package/clis/discord-app/status.js +1 -0
  363. package/clis/discord-app/thread-read.js +1 -0
  364. package/clis/discord-app/threads.js +1 -0
  365. package/clis/discord-app/utils.js +226 -0
  366. package/clis/discord-web/auth.js +10 -0
  367. package/clis/discord-web/send.js +13 -0
  368. package/clis/dockerhub/image.js +1 -0
  369. package/clis/dockerhub/search.js +1 -0
  370. package/clis/dockerhub/utils.js +1 -0
  371. package/clis/dongchedi/__fixtures__/search.json +60 -0
  372. package/clis/dongchedi/__fixtures__/series-detail.json +911 -0
  373. package/clis/dongchedi/__fixtures__/series-score.json +1396 -0
  374. package/clis/dongchedi/koubei.js +1 -0
  375. package/clis/dongchedi/models.js +1 -0
  376. package/clis/dongchedi/score.js +1 -0
  377. package/clis/dongchedi/search.js +1 -0
  378. package/clis/dongchedi/series.js +1 -0
  379. package/clis/dongchedi/specs.js +1 -0
  380. package/clis/dongchedi/utils.js +1 -0
  381. package/clis/douban/article.js +53 -0
  382. package/clis/douban/auth.js +21 -0
  383. package/clis/douban/book-hot.js +1 -0
  384. package/clis/douban/download.js +1 -0
  385. package/clis/douban/marks.js +59 -0
  386. package/clis/douban/movie-hot.js +1 -0
  387. package/clis/douban/photos.js +1 -0
  388. package/clis/douban/reviews.js +53 -0
  389. package/clis/douban/search.js +1 -0
  390. package/clis/douban/subject.js +1 -0
  391. package/clis/douban/top250.js +50 -0
  392. package/clis/douban/utils.js +344 -0
  393. package/clis/doubao/ask.js +1 -0
  394. package/clis/doubao/auth.js +28 -0
  395. package/clis/doubao/detail.js +1 -0
  396. package/clis/doubao/history.js +1 -0
  397. package/clis/doubao/meeting-summary.js +1 -0
  398. package/clis/doubao/meeting-transcript.js +1 -0
  399. package/clis/doubao/new.js +1 -0
  400. package/clis/doubao/read.js +1 -0
  401. package/clis/doubao/send.js +1 -0
  402. package/clis/doubao/status.js +1 -0
  403. package/clis/doubao/utils.js +704 -0
  404. package/clis/doubao-app/ask.js +1 -0
  405. package/clis/doubao-app/dump.js +1 -0
  406. package/clis/doubao-app/new.js +1 -0
  407. package/clis/doubao-app/read.js +1 -0
  408. package/clis/doubao-app/screenshot.js +1 -0
  409. package/clis/doubao-app/send.js +1 -0
  410. package/clis/doubao-app/status.js +1 -0
  411. package/clis/doubao-app/utils.js +64 -0
  412. package/clis/douyin/_shared/browser-fetch.js +28 -0
  413. package/clis/douyin/_shared/creation-id.js +1 -0
  414. package/clis/douyin/_shared/evaluate-result.js +1 -0
  415. package/clis/douyin/_shared/imagex-upload.js +1 -0
  416. package/clis/douyin/_shared/public-api.js +1 -0
  417. package/clis/douyin/_shared/sts2.js +1 -0
  418. package/clis/douyin/_shared/text-extra.js +1 -0
  419. package/clis/douyin/_shared/timing.js +1 -0
  420. package/clis/douyin/_shared/tos-upload.js +5 -0
  421. package/clis/douyin/_shared/transcode.js +1 -0
  422. package/clis/douyin/_shared/types.js +1 -0
  423. package/clis/douyin/_shared/vod-upload.js +5 -0
  424. package/clis/douyin/activities.js +1 -0
  425. package/clis/douyin/auth.js +1 -0
  426. package/clis/douyin/collections.js +1 -0
  427. package/clis/douyin/delete.js +76 -0
  428. package/clis/douyin/draft.js +166 -0
  429. package/clis/douyin/drafts.js +1 -0
  430. package/clis/douyin/hashtag.js +1 -0
  431. package/clis/douyin/location.js +1 -0
  432. package/clis/douyin/profile.js +1 -0
  433. package/clis/douyin/publish-image.js +64 -0
  434. package/clis/douyin/publish.js +14 -0
  435. package/clis/douyin/search.js +51 -0
  436. package/clis/douyin/stats.js +1 -0
  437. package/clis/douyin/update.js +1 -0
  438. package/clis/douyin/user-videos.js +1 -0
  439. package/clis/douyin/videos.js +1 -0
  440. package/clis/duckduckgo/search.js +1 -0
  441. package/clis/duckduckgo/suggest.js +1 -0
  442. package/clis/eastmoney/_secid.js +1 -0
  443. package/clis/eastmoney/announcement.js +1 -0
  444. package/clis/eastmoney/article.js +1 -0
  445. package/clis/eastmoney/convertible.js +1 -0
  446. package/clis/eastmoney/etf.js +1 -0
  447. package/clis/eastmoney/holders.js +1 -0
  448. package/clis/eastmoney/hot-rank.js +30 -0
  449. package/clis/eastmoney/index-board.js +1 -0
  450. package/clis/eastmoney/kline.js +1 -0
  451. package/clis/eastmoney/kuaixun.js +1 -0
  452. package/clis/eastmoney/longhu.js +1 -0
  453. package/clis/eastmoney/money-flow.js +1 -0
  454. package/clis/eastmoney/northbound.js +1 -0
  455. package/clis/eastmoney/quote.js +1 -0
  456. package/clis/eastmoney/rank.js +1 -0
  457. package/clis/eastmoney/sectors.js +1 -0
  458. package/clis/eastmoney/whoami.js +1 -0
  459. package/clis/endoflife/product.js +1 -0
  460. package/clis/endoflife/utils.js +1 -0
  461. package/clis/facebook/__fixtures__/notifications-page.html +13 -0
  462. package/clis/facebook/add-friend.js +24 -0
  463. package/clis/facebook/auth.js +1 -0
  464. package/clis/facebook/comment.js +18 -0
  465. package/clis/facebook/events.js +26 -0
  466. package/clis/facebook/feed.js +209 -0
  467. package/clis/facebook/friends.js +24 -0
  468. package/clis/facebook/groups.js +32 -0
  469. package/clis/facebook/join-group.js +25 -0
  470. package/clis/facebook/like.js +29 -0
  471. package/clis/facebook/marketplace-inbox.js +34 -0
  472. package/clis/facebook/marketplace-listings.js +33 -0
  473. package/clis/facebook/memories.js +21 -0
  474. package/clis/facebook/notifications.js +31 -0
  475. package/clis/facebook/post.js +88 -0
  476. package/clis/facebook/profile.js +18 -0
  477. package/clis/facebook/search.js +22 -0
  478. package/clis/flathub/app.js +1 -0
  479. package/clis/flathub/search.js +1 -0
  480. package/clis/flathub/utils.js +1 -0
  481. package/clis/flomo/auth.js +22 -0
  482. package/clis/flomo/memos.js +13 -0
  483. package/clis/gemini/ask.js +1 -0
  484. package/clis/gemini/auth.js +14 -0
  485. package/clis/gemini/deep-research-result.js +4 -0
  486. package/clis/gemini/deep-research.js +1 -0
  487. package/clis/gemini/detail.js +1 -0
  488. package/clis/gemini/history.js +1 -0
  489. package/clis/gemini/image.js +3 -0
  490. package/clis/gemini/new.js +1 -0
  491. package/clis/gemini/read.js +1 -0
  492. package/clis/gemini/status.js +1 -0
  493. package/clis/gemini/utils.js +1234 -0
  494. package/clis/geogebra/add-circle.js +1 -0
  495. package/clis/geogebra/add-line.js +1 -0
  496. package/clis/geogebra/add-point.js +1 -0
  497. package/clis/geogebra/add-polygon.js +1 -0
  498. package/clis/geogebra/eval.js +1 -0
  499. package/clis/geogebra/hexagon.js +1 -0
  500. package/clis/geogebra/info.js +13 -0
  501. package/clis/geogebra/list.js +1 -0
  502. package/clis/geogebra/triangle.js +1 -0
  503. package/clis/geogebra/utils.js +99 -0
  504. package/clis/ghost/publish.js +1 -0
  505. package/clis/ghost/shared.js +1 -0
  506. package/clis/ghost/whoami.js +1 -0
  507. package/clis/gitee/auth.js +12 -0
  508. package/clis/gitee/index.js +1 -0
  509. package/clis/gitee/search.js +1 -0
  510. package/clis/gitee/trending.js +240 -0
  511. package/clis/gitee/user.js +71 -0
  512. package/clis/github/auth.js +7 -0
  513. package/clis/github-trending/repos.js +1 -0
  514. package/clis/google/news.js +1 -0
  515. package/clis/google/search.js +90 -0
  516. package/clis/google/suggest.js +1 -0
  517. package/clis/google/trends.js +1 -0
  518. package/clis/google/utils.js +1 -0
  519. package/clis/google-scholar/cite.js +20 -0
  520. package/clis/google-scholar/profile.js +36 -0
  521. package/clis/google-scholar/search.js +35 -0
  522. package/clis/goproxy/module.js +1 -0
  523. package/clis/goproxy/utils.js +1 -0
  524. package/clis/goproxy/versions.js +1 -0
  525. package/clis/gov-law/recent.js +1 -0
  526. package/clis/gov-law/search.js +14 -0
  527. package/clis/gov-law/shared.js +29 -0
  528. package/clis/gov-policy/__fixtures__/recent.html +16 -0
  529. package/clis/gov-policy/__fixtures__/search.html +41 -0
  530. package/clis/gov-policy/recent.js +8 -0
  531. package/clis/gov-policy/search.js +8 -0
  532. package/clis/gov-policy/utils.js +1 -0
  533. package/clis/grok/ask.js +1 -0
  534. package/clis/grok/auth.js +17 -0
  535. package/clis/grok/delete.js +1 -0
  536. package/clis/grok/detail.js +1 -0
  537. package/clis/grok/export-all.js +170 -0
  538. package/clis/grok/export-utils.js +1 -0
  539. package/clis/grok/export.js +106 -0
  540. package/clis/grok/history.js +1 -0
  541. package/clis/grok/image.js +119 -0
  542. package/clis/grok/image.test.ts +127 -0
  543. package/clis/grok/new.js +1 -0
  544. package/clis/grok/pin.js +1 -0
  545. package/clis/grok/read.js +1 -0
  546. package/clis/grok/send.js +1 -0
  547. package/clis/grok/status.js +1 -0
  548. package/clis/grok/utils.js +337 -0
  549. package/clis/guazi/__fixtures__/detail.html +7 -0
  550. package/clis/guazi/__fixtures__/list.html +5 -0
  551. package/clis/guazi/browse.js +1 -0
  552. package/clis/guazi/car.js +1 -0
  553. package/clis/guazi/utils.js +1 -0
  554. package/clis/hackernews/ask.js +1 -0
  555. package/clis/hackernews/auth.js +9 -0
  556. package/clis/hackernews/best.js +1 -0
  557. package/clis/hackernews/comment.js +61 -0
  558. package/clis/hackernews/jobs.js +1 -0
  559. package/clis/hackernews/new.js +1 -0
  560. package/clis/hackernews/read.js +11 -0
  561. package/clis/hackernews/search.js +1 -0
  562. package/clis/hackernews/show.js +1 -0
  563. package/clis/hackernews/submit.js +65 -0
  564. package/clis/hackernews/top.js +1 -0
  565. package/clis/hackernews/user.js +1 -0
  566. package/clis/hashnode/auth.js +11 -0
  567. package/clis/hashnode/publish.js +92 -0
  568. package/clis/hf/auth.js +12 -0
  569. package/clis/hf/datasets.js +1 -0
  570. package/clis/hf/models.js +1 -0
  571. package/clis/hf/paper.js +1 -0
  572. package/clis/hf/spaces.js +1 -0
  573. package/clis/hf/top.js +1 -0
  574. package/clis/homebrew/cask.js +1 -0
  575. package/clis/homebrew/formula.js +1 -0
  576. package/clis/homebrew/popular.js +1 -0
  577. package/clis/homebrew/utils.js +1 -0
  578. package/clis/huodongxing/events.js +1 -0
  579. package/clis/hupu/__fixtures__/hot-home.html +64 -0
  580. package/clis/hupu/auth.js +14 -0
  581. package/clis/hupu/detail.js +7 -0
  582. package/clis/hupu/hot.js +14 -0
  583. package/clis/hupu/like.js +1 -0
  584. package/clis/hupu/mentions.js +91 -0
  585. package/clis/hupu/reply.js +1 -0
  586. package/clis/hupu/search.js +1 -0
  587. package/clis/hupu/unlike.js +1 -0
  588. package/clis/hupu/utils.js +243 -0
  589. package/clis/imdb/person.js +140 -0
  590. package/clis/imdb/reviews.js +40 -0
  591. package/clis/imdb/search.js +113 -0
  592. package/clis/imdb/title.js +1 -0
  593. package/clis/imdb/top.js +1 -0
  594. package/clis/imdb/trending.js +1 -0
  595. package/clis/imdb/utils.js +162 -0
  596. package/clis/imooc/article.js +59 -0
  597. package/clis/imooc/login.js +1 -0
  598. package/clis/imooc/whoami.js +1 -0
  599. package/clis/indeed/job.js +20 -0
  600. package/clis/indeed/search.js +37 -0
  601. package/clis/indeed/utils.js +1 -0
  602. package/clis/infoq/article.js +19 -0
  603. package/clis/infoq/login.js +1 -0
  604. package/clis/infoq/whoami.js +1 -0
  605. package/clis/instagram/_shared/private-publish.js +75 -0
  606. package/clis/instagram/_shared/protocol-capture.js +180 -0
  607. package/clis/instagram/_shared/runtime-info.js +33 -0
  608. package/clis/instagram/auth.js +22 -0
  609. package/clis/instagram/collection-create.js +38 -0
  610. package/clis/instagram/collection-delete.js +72 -0
  611. package/clis/instagram/comment.js +26 -0
  612. package/clis/instagram/detail.js +2 -0
  613. package/clis/instagram/download.js +83 -0
  614. package/clis/instagram/explore.js +27 -0
  615. package/clis/instagram/follow.js +24 -0
  616. package/clis/instagram/followers.js +30 -0
  617. package/clis/instagram/following.js +74 -0
  618. package/clis/instagram/like.js +25 -0
  619. package/clis/instagram/note.js +162 -0
  620. package/clis/instagram/post.js +718 -0
  621. package/clis/instagram/profile.js +25 -0
  622. package/clis/instagram/reel.js +452 -0
  623. package/clis/instagram/save.js +25 -0
  624. package/clis/instagram/saved.js +37 -0
  625. package/clis/instagram/search.js +23 -0
  626. package/clis/instagram/story.js +21 -0
  627. package/clis/instagram/unfollow.js +21 -0
  628. package/clis/instagram/unlike.js +25 -0
  629. package/clis/instagram/unsave.js +25 -0
  630. package/clis/instagram/user.js +1 -0
  631. package/clis/jd/add-cart.js +22 -0
  632. package/clis/jd/auth.js +12 -0
  633. package/clis/jd/cart.js +59 -0
  634. package/clis/jd/detail.js +42 -0
  635. package/clis/jd/item.js +98 -0
  636. package/clis/jd/item.test.ts +517 -0
  637. package/clis/jd/reviews.js +31 -0
  638. package/clis/jd/search.js +42 -0
  639. package/clis/jianshu/article.js +1 -0
  640. package/clis/jianshu/login.js +1 -0
  641. package/clis/jianshu/notebooks.js +1 -0
  642. package/clis/jianshu/whoami.js +1 -0
  643. package/clis/jianyu/auth.js +28 -0
  644. package/clis/jianyu/detail.js +1 -0
  645. package/clis/jianyu/search.js +73 -0
  646. package/clis/jianyu/shared/china-bid-search.js +86 -0
  647. package/clis/jianyu/shared/procurement-contract.js +1 -0
  648. package/clis/jianyu/shared/procurement-detail.js +18 -0
  649. package/clis/jike/auth.js +19 -0
  650. package/clis/jike/comment.js +82 -0
  651. package/clis/jike/create.js +83 -0
  652. package/clis/jike/feed.js +32 -0
  653. package/clis/jike/like.js +38 -0
  654. package/clis/jike/notifications.js +115 -0
  655. package/clis/jike/post.js +33 -0
  656. package/clis/jike/repost.js +67 -0
  657. package/clis/jike/search.js +29 -0
  658. package/clis/jike/topic.js +20 -0
  659. package/clis/jike/user.js +19 -0
  660. package/clis/jike/utils.js +15 -0
  661. package/clis/jimeng/auth.js +13 -0
  662. package/clis/jimeng/generate.js +60 -0
  663. package/clis/jimeng/history.js +32 -0
  664. package/clis/jimeng/new.js +26 -0
  665. package/clis/jimeng/workspaces.js +22 -0
  666. package/clis/jira/attachments.js +1 -0
  667. package/clis/jira/comments.js +1 -0
  668. package/clis/jira/issue.js +1 -0
  669. package/clis/jira/links.js +1 -0
  670. package/clis/jira/search.js +1 -0
  671. package/clis/jira/shared.js +1 -0
  672. package/clis/juejin/article.js +5 -0
  673. package/clis/juejin/categories.js +1 -0
  674. package/clis/juejin/hot.js +1 -0
  675. package/clis/juejin/login.js +1 -0
  676. package/clis/juejin/recommend.js +1 -0
  677. package/clis/juejin/stats.js +53 -0
  678. package/clis/juejin/tags.js +1 -0
  679. package/clis/juejin/utils.js +1 -0
  680. package/clis/juejin/whoami.js +1 -0
  681. package/clis/ke/auth.js +14 -0
  682. package/clis/ke/chengjiao.js +45 -0
  683. package/clis/ke/ershoufang.js +50 -0
  684. package/clis/ke/utils.js +21 -0
  685. package/clis/ke/xiaoqu.js +45 -0
  686. package/clis/ke/zufang.js +50 -0
  687. package/clis/kimi/_utils.js +38 -0
  688. package/clis/kimi/audit-extras.js +64 -0
  689. package/clis/kimi/auth.js +17 -0
  690. package/clis/kimi/chat.js +77 -0
  691. package/clis/kimi/storage.js +14 -0
  692. package/clis/kimi/ui.js +89 -0
  693. package/clis/kimi/usage.js +51 -0
  694. package/clis/kuaishou/auth.js +1 -0
  695. package/clis/kuaishou/publish.js +53 -0
  696. package/clis/lesswrong/_helpers.js +9 -0
  697. package/clis/lesswrong/comments.js +9 -0
  698. package/clis/lesswrong/curated.js +5 -0
  699. package/clis/lesswrong/frontpage.js +5 -0
  700. package/clis/lesswrong/new.js +5 -0
  701. package/clis/lesswrong/read.js +5 -0
  702. package/clis/lesswrong/sequences.js +5 -0
  703. package/clis/lesswrong/shortform.js +5 -0
  704. package/clis/lesswrong/tag.js +5 -0
  705. package/clis/lesswrong/tags.js +5 -0
  706. package/clis/lesswrong/top-month.js +5 -0
  707. package/clis/lesswrong/top-week.js +5 -0
  708. package/clis/lesswrong/top-year.js +5 -0
  709. package/clis/lesswrong/top.js +5 -0
  710. package/clis/lesswrong/user-posts.js +5 -0
  711. package/clis/lesswrong/user.js +5 -0
  712. package/clis/lichess/top.js +1 -0
  713. package/clis/lichess/user.js +1 -0
  714. package/clis/lichess/utils.js +1 -0
  715. package/clis/linkedin/auth.js +27 -0
  716. package/clis/linkedin/comment.js +1 -0
  717. package/clis/linkedin/connect.js +244 -0
  718. package/clis/linkedin/create.js +113 -0
  719. package/clis/linkedin/follow.js +1 -0
  720. package/clis/linkedin/inbox.js +1 -0
  721. package/clis/linkedin/job-detail.js +40 -0
  722. package/clis/linkedin/jobs-preferences.js +34 -0
  723. package/clis/linkedin/like.js +1 -0
  724. package/clis/linkedin/notifications.js +1 -0
  725. package/clis/linkedin/people-search.js +1 -0
  726. package/clis/linkedin/post-analytics.js +1 -0
  727. package/clis/linkedin/post-comments.js +1 -0
  728. package/clis/linkedin/post-detail.js +1 -0
  729. package/clis/linkedin/posts-core.js +138 -0
  730. package/clis/linkedin/posts.js +1 -0
  731. package/clis/linkedin/profile-analytics.js +1 -0
  732. package/clis/linkedin/profile-api.js +218 -0
  733. package/clis/linkedin/profile-experience.js +1 -0
  734. package/clis/linkedin/profile-projects.js +1 -0
  735. package/clis/linkedin/profile-read.js +3 -0
  736. package/clis/linkedin/reply.js +1 -0
  737. package/clis/linkedin/repost.js +1 -0
  738. package/clis/linkedin/safe-send.js +155 -0
  739. package/clis/linkedin/salesnav-inbox.js +21 -0
  740. package/clis/linkedin/salesnav-message.js +33 -0
  741. package/clis/linkedin/salesnav-search.js +15 -0
  742. package/clis/linkedin/salesnav-thread.js +1 -0
  743. package/clis/linkedin/search-api.js +42 -0
  744. package/clis/linkedin/search.js +50 -0
  745. package/clis/linkedin/sent-invitations.js +46 -0
  746. package/clis/linkedin/services-read.js +57 -0
  747. package/clis/linkedin/shared.js +10 -0
  748. package/clis/linkedin/social-api.js +260 -0
  749. package/clis/linkedin/thread-snapshot.js +81 -0
  750. package/clis/linkedin/timeline.js +37 -0
  751. package/clis/linkedin-learning/auth.js +27 -0
  752. package/clis/linkedin-learning/course.js +17 -0
  753. package/clis/linkedin-learning/search.js +17 -0
  754. package/clis/linkedin-learning/trending.js +17 -0
  755. package/clis/linux-do/auth.js +20 -0
  756. package/clis/linux-do/categories.js +1 -0
  757. package/clis/linux-do/feed.js +19 -0
  758. package/clis/linux-do/search.js +1 -0
  759. package/clis/linux-do/tags.js +1 -0
  760. package/clis/linux-do/topic-content.js +28 -0
  761. package/clis/linux-do/topic.js +1 -0
  762. package/clis/linux-do/user-posts.js +1 -0
  763. package/clis/linux-do/user-topics.js +1 -0
  764. package/clis/lobsters/active.js +1 -0
  765. package/clis/lobsters/domain.js +1 -0
  766. package/clis/lobsters/hot.js +1 -0
  767. package/clis/lobsters/newest.js +1 -0
  768. package/clis/lobsters/read.js +11 -0
  769. package/clis/lobsters/tag.js +1 -0
  770. package/clis/maimai/auth.js +19 -0
  771. package/clis/maimai/search-talents.js +37 -0
  772. package/clis/manus/_utils.js +28 -0
  773. package/clis/manus/auth.js +20 -0
  774. package/clis/manus/connectors.js +4 -0
  775. package/clis/manus/credits.js +4 -0
  776. package/clis/manus/list.js +7 -0
  777. package/clis/manus/read.js +7 -0
  778. package/clis/manus/skills.js +4 -0
  779. package/clis/manus/status.js +8 -0
  780. package/clis/mastodon/post.js +1 -0
  781. package/clis/mastodon/shared.js +48 -0
  782. package/clis/mastodon/whoami.js +1 -0
  783. package/clis/maven/artifact.js +1 -0
  784. package/clis/maven/search.js +1 -0
  785. package/clis/maven/utils.js +1 -0
  786. package/clis/mdn/search.js +1 -0
  787. package/clis/medium/article.js +12 -0
  788. package/clis/medium/feed.js +1 -0
  789. package/clis/medium/login.js +1 -0
  790. package/clis/medium/search.js +1 -0
  791. package/clis/medium/stats.js +56 -0
  792. package/clis/medium/tag.js +1 -0
  793. package/clis/medium/user.js +1 -0
  794. package/clis/medium/utils.js +62 -0
  795. package/clis/medium/whoami.js +1 -0
  796. package/clis/mubu/doc.js +1 -0
  797. package/clis/mubu/docs.js +1 -0
  798. package/clis/mubu/notes.js +1 -0
  799. package/clis/mubu/recent.js +1 -0
  800. package/clis/mubu/search.js +1 -0
  801. package/clis/mubu/utils.js +31 -0
  802. package/clis/note/auth.js +12 -0
  803. package/clis/note/note-utils.js +2 -0
  804. package/clis/note/publish.js +17 -0
  805. package/clis/notebooklm/add-source.js +46 -0
  806. package/clis/notebooklm/auth.js +21 -0
  807. package/clis/notebooklm/create.js +1 -0
  808. package/clis/notebooklm/current.js +1 -0
  809. package/clis/notebooklm/generate-audio.js +1 -0
  810. package/clis/notebooklm/generate-slides.js +1 -0
  811. package/clis/notebooklm/get.js +1 -0
  812. package/clis/notebooklm/history.js +1 -0
  813. package/clis/notebooklm/list.js +1 -0
  814. package/clis/notebooklm/note-list.js +1 -0
  815. package/clis/notebooklm/notes-get.js +1 -0
  816. package/clis/notebooklm/open.js +1 -0
  817. package/clis/notebooklm/rpc.js +36 -0
  818. package/clis/notebooklm/shared.js +1 -0
  819. package/clis/notebooklm/source-fulltext.js +1 -0
  820. package/clis/notebooklm/source-get.js +1 -0
  821. package/clis/notebooklm/source-guide.js +1 -0
  822. package/clis/notebooklm/source-list.js +1 -0
  823. package/clis/notebooklm/status.js +1 -0
  824. package/clis/notebooklm/summary.js +1 -0
  825. package/clis/notebooklm/utils.js +172 -0
  826. package/clis/notebooklm/write-note.js +1 -0
  827. package/clis/nowcoder/auth.js +24 -0
  828. package/clis/nowcoder/comment.js +1 -0
  829. package/clis/nowcoder/comments.js +1 -0
  830. package/clis/nowcoder/companies.js +1 -0
  831. package/clis/nowcoder/creators.js +1 -0
  832. package/clis/nowcoder/delete.js +1 -0
  833. package/clis/nowcoder/detail.js +46 -0
  834. package/clis/nowcoder/dm-list.js +1 -0
  835. package/clis/nowcoder/dm-read.js +1 -0
  836. package/clis/nowcoder/dm-send.js +1 -0
  837. package/clis/nowcoder/drafts.js +1 -0
  838. package/clis/nowcoder/experience.js +20 -0
  839. package/clis/nowcoder/hot.js +1 -0
  840. package/clis/nowcoder/inbox.js +1 -0
  841. package/clis/nowcoder/jobs.js +1 -0
  842. package/clis/nowcoder/like.js +1 -0
  843. package/clis/nowcoder/my.js +1 -0
  844. package/clis/nowcoder/notifications.js +16 -0
  845. package/clis/nowcoder/papers.js +22 -0
  846. package/clis/nowcoder/post.js +1 -0
  847. package/clis/nowcoder/practice.js +21 -0
  848. package/clis/nowcoder/recommend.js +1 -0
  849. package/clis/nowcoder/referral.js +21 -0
  850. package/clis/nowcoder/salary.js +22 -0
  851. package/clis/nowcoder/search.js +31 -0
  852. package/clis/nowcoder/suggest.js +17 -0
  853. package/clis/nowcoder/topics.js +1 -0
  854. package/clis/nowcoder/trending.js +1 -0
  855. package/clis/nowcoder/utils.js +68 -0
  856. package/clis/npm/downloads.js +1 -0
  857. package/clis/npm/package.js +1 -0
  858. package/clis/npm/search.js +1 -0
  859. package/clis/npm/utils.js +1 -0
  860. package/clis/nuget/package.js +1 -0
  861. package/clis/nuget/search.js +1 -0
  862. package/clis/nuget/utils.js +1 -0
  863. package/clis/nvd/cve.js +1 -0
  864. package/clis/oeis/search.js +1 -0
  865. package/clis/oeis/sequence.js +1 -0
  866. package/clis/oeis/utils.js +1 -0
  867. package/clis/ones/common.js +23 -0
  868. package/clis/ones/enrich-tasks.js +1 -0
  869. package/clis/ones/login.js +2 -0
  870. package/clis/ones/logout.js +1 -0
  871. package/clis/ones/me.js +1 -0
  872. package/clis/ones/my-tasks.js +1 -0
  873. package/clis/ones/resolve-labels.js +1 -0
  874. package/clis/ones/task-helpers.js +1 -0
  875. package/clis/ones/task.js +1 -0
  876. package/clis/ones/tasks.js +1 -0
  877. package/clis/ones/token-info.js +1 -0
  878. package/clis/ones/worklog.js +14 -0
  879. package/clis/openalex/search.js +1 -0
  880. package/clis/openalex/utils.js +1 -0
  881. package/clis/openalex/work.js +1 -0
  882. package/clis/openfda/drug-label.js +1 -0
  883. package/clis/openfda/food-recall.js +1 -0
  884. package/clis/openfda/utils.js +1 -0
  885. package/clis/openreview/author.js +1 -0
  886. package/clis/openreview/paper.js +1 -0
  887. package/clis/openreview/reviews.js +4 -0
  888. package/clis/openreview/search.js +1 -0
  889. package/clis/openreview/utils.js +1 -0
  890. package/clis/openreview/venue.js +1 -0
  891. package/clis/oschina/article.js +1 -0
  892. package/clis/oschina/catalogs.js +1 -0
  893. package/clis/oschina/login.js +1 -0
  894. package/clis/oschina/stats.js +54 -0
  895. package/clis/oschina/whoami.js +1 -0
  896. package/clis/osv/query.js +1 -0
  897. package/clis/osv/utils.js +1 -0
  898. package/clis/osv/vulnerability.js +1 -0
  899. package/clis/packagist/package.js +1 -0
  900. package/clis/packagist/search.js +1 -0
  901. package/clis/packagist/utils.js +1 -0
  902. package/clis/paperreview/feedback.js +1 -0
  903. package/clis/paperreview/review.js +1 -0
  904. package/clis/paperreview/submit.js +1 -0
  905. package/clis/paperreview/utils.js +1 -0
  906. package/clis/pinterest/api.js +1 -0
  907. package/clis/pinterest/auth.js +1 -0
  908. package/clis/pinterest/boards.js +1 -0
  909. package/clis/pinterest/client.js +20 -0
  910. package/clis/pinterest/publish.js +13 -0
  911. package/clis/pixiv/auth.js +17 -0
  912. package/clis/pixiv/detail.js +1 -0
  913. package/clis/pixiv/download.js +1 -0
  914. package/clis/pixiv/illusts.js +1 -0
  915. package/clis/pixiv/ranking.js +26 -0
  916. package/clis/pixiv/search.js +1 -0
  917. package/clis/pixiv/user.js +1 -0
  918. package/clis/pixiv/utils.js +18 -0
  919. package/clis/powerchina/auth.js +17 -0
  920. package/clis/powerchina/search.js +1 -0
  921. package/clis/producthunt/browse.js +54 -0
  922. package/clis/producthunt/hot.js +64 -0
  923. package/clis/producthunt/posts.js +1 -0
  924. package/clis/producthunt/today.js +1 -0
  925. package/clis/producthunt/utils.js +1 -0
  926. package/clis/pubmed/article.js +1 -0
  927. package/clis/pubmed/author.js +1 -0
  928. package/clis/pubmed/citations.js +1 -0
  929. package/clis/pubmed/clinical-trial.js +1 -0
  930. package/clis/pubmed/journal.js +1 -0
  931. package/clis/pubmed/mesh.js +1 -0
  932. package/clis/pubmed/related.js +1 -0
  933. package/clis/pubmed/review.js +1 -0
  934. package/clis/pubmed/search.js +1 -0
  935. package/clis/pubmed/utils.js +1 -0
  936. package/clis/pypi/downloads.js +1 -0
  937. package/clis/pypi/package.js +1 -0
  938. package/clis/pypi/utils.js +1 -0
  939. package/clis/qiita/auth.js +1 -0
  940. package/clis/qiita/gql.js +32 -0
  941. package/clis/qiita/publish.js +7 -0
  942. package/clis/qiita/stats.js +37 -0
  943. package/clis/qoder/_utils.js +113 -0
  944. package/clis/qoder/composer.js +1 -0
  945. package/clis/qoder/history.js +25 -0
  946. package/clis/qoder/quest.js +1 -0
  947. package/clis/qoder/read.js +1 -0
  948. package/clis/qoder/status.js +1 -0
  949. package/clis/qoder/ui.js +59 -0
  950. package/clis/quark/auth.js +16 -0
  951. package/clis/quark/ls.js +1 -0
  952. package/clis/quark/mkdir.js +1 -0
  953. package/clis/quark/mv.js +1 -0
  954. package/clis/quark/rename.js +1 -0
  955. package/clis/quark/rm.js +1 -0
  956. package/clis/quark/save.js +1 -0
  957. package/clis/quark/share-tree.js +1 -0
  958. package/clis/quark/utils.js +13 -0
  959. package/clis/quora/create-answer.js +22 -0
  960. package/clis/quora/create-question.js +24 -0
  961. package/clis/quora/shared.js +43 -0
  962. package/clis/quora/whoami.js +1 -0
  963. package/clis/qwen/ask.js +1 -0
  964. package/clis/qwen/auth.js +17 -0
  965. package/clis/qwen/detail.js +1 -0
  966. package/clis/qwen/history.js +1 -0
  967. package/clis/qwen/image.js +31 -0
  968. package/clis/qwen/new.js +1 -0
  969. package/clis/qwen/read.js +1 -0
  970. package/clis/qwen/send.js +1 -0
  971. package/clis/qwen/status.js +1 -0
  972. package/clis/qwen/utils.js +185 -0
  973. package/clis/reddit/auth.js +17 -0
  974. package/clis/reddit/comment.js +36 -0
  975. package/clis/reddit/frontpage.js +40 -0
  976. package/clis/reddit/home.js +32 -0
  977. package/clis/reddit/hot.js +46 -0
  978. package/clis/reddit/popular.js +46 -0
  979. package/clis/reddit/read.js +398 -0
  980. package/clis/reddit/reply.js +56 -0
  981. package/clis/reddit/save.js +30 -0
  982. package/clis/reddit/saved.js +24 -0
  983. package/clis/reddit/search.js +51 -0
  984. package/clis/reddit/submit.js +42 -0
  985. package/clis/reddit/subreddit-info.js +29 -0
  986. package/clis/reddit/subreddit.js +52 -0
  987. package/clis/reddit/subscribe.js +29 -0
  988. package/clis/reddit/subscribed.js +68 -0
  989. package/clis/reddit/upvote.js +43 -0
  990. package/clis/reddit/upvoted.js +24 -0
  991. package/clis/reddit/user-comments.js +20 -0
  992. package/clis/reddit/user-posts.js +17 -0
  993. package/clis/reddit/user.js +20 -0
  994. package/clis/reddit/whoami.js +19 -0
  995. package/clis/rednote/auth.js +19 -0
  996. package/clis/rednote/comments.js +1 -0
  997. package/clis/rednote/download.js +1 -0
  998. package/clis/rednote/feed.js +1 -0
  999. package/clis/rednote/note.js +1 -0
  1000. package/clis/rednote/notifications.js +67 -0
  1001. package/clis/rednote/search.js +32 -0
  1002. package/clis/rednote/user.js +1 -0
  1003. package/clis/rest-countries/country.js +1 -0
  1004. package/clis/rest-countries/region.js +1 -0
  1005. package/clis/rest-countries/utils.js +1 -0
  1006. package/clis/reuters/article-detail.js +1 -0
  1007. package/clis/reuters/auth.js +39 -0
  1008. package/clis/reuters/search.js +1 -0
  1009. package/clis/reuters/utils.js +50 -0
  1010. package/clis/rfc/rfc.js +1 -0
  1011. package/clis/rfc/utils.js +1 -0
  1012. package/clis/rubygems/gem.js +1 -0
  1013. package/clis/rubygems/search.js +1 -0
  1014. package/clis/rubygems/utils.js +1 -0
  1015. package/clis/segmentfault/_signed-request.js +43 -0
  1016. package/clis/segmentfault/article.js +3 -0
  1017. package/clis/segmentfault/channels.js +1 -0
  1018. package/clis/segmentfault/login.js +1 -0
  1019. package/clis/segmentfault/stats.js +82 -0
  1020. package/clis/segmentfault/tags.js +1 -0
  1021. package/clis/segmentfault/whoami.js +1 -0
  1022. package/clis/semanticscholar/citations.js +1 -0
  1023. package/clis/semanticscholar/paper.js +1 -0
  1024. package/clis/semanticscholar/recommendations.js +1 -0
  1025. package/clis/semanticscholar/search.js +1 -0
  1026. package/clis/semanticscholar/utils.js +1 -0
  1027. package/clis/sinablog/article.js +1 -0
  1028. package/clis/sinablog/hot.js +1 -0
  1029. package/clis/sinablog/search.js +1 -0
  1030. package/clis/sinablog/user.js +1 -0
  1031. package/clis/sinablog/utils.js +153 -0
  1032. package/clis/sinafinance/news.js +1 -0
  1033. package/clis/sinafinance/rolling-news.js +20 -0
  1034. package/clis/sinafinance/stock-rank.js +41 -0
  1035. package/clis/sinafinance/stock.js +1 -0
  1036. package/clis/slock/attachment-download.js +1 -0
  1037. package/clis/slock/attachment-upload.js +34 -0
  1038. package/clis/slock/attachment-url.js +1 -0
  1039. package/clis/slock/auth-verify.js +1 -0
  1040. package/clis/slock/bookmark-add.js +11 -0
  1041. package/clis/slock/bookmark-list.js +10 -0
  1042. package/clis/slock/bookmark-remove.js +7 -0
  1043. package/clis/slock/channel-action.js +1 -0
  1044. package/clis/slock/channel-archive.js +1 -0
  1045. package/clis/slock/channel-create.js +1 -0
  1046. package/clis/slock/channel-files.js +1 -0
  1047. package/clis/slock/channel-info.js +1 -0
  1048. package/clis/slock/channel-join.js +1 -0
  1049. package/clis/slock/channel-leave.js +1 -0
  1050. package/clis/slock/channel-list.js +1 -0
  1051. package/clis/slock/channel-mark.js +1 -0
  1052. package/clis/slock/channel-members.js +1 -0
  1053. package/clis/slock/channel-unarchive.js +1 -0
  1054. package/clis/slock/dm-list.js +1 -0
  1055. package/clis/slock/errors.js +1 -0
  1056. package/clis/slock/in-page.js +113 -0
  1057. package/clis/slock/inbox-done.js +9 -0
  1058. package/clis/slock/inbox-read-all.js +1 -0
  1059. package/clis/slock/inbox.js +1 -0
  1060. package/clis/slock/login.js +1 -0
  1061. package/clis/slock/message-read.js +61 -0
  1062. package/clis/slock/message-search.js +24 -0
  1063. package/clis/slock/message-send.js +55 -0
  1064. package/clis/slock/reaction-add.js +1 -0
  1065. package/clis/slock/reaction-remove.js +1 -0
  1066. package/clis/slock/resolve.js +1 -0
  1067. package/clis/slock/server-list.js +9 -0
  1068. package/clis/slock/server-use.js +18 -0
  1069. package/clis/slock/shared.js +1 -0
  1070. package/clis/slock/task-claim.js +14 -0
  1071. package/clis/slock/task-convert.js +35 -0
  1072. package/clis/slock/task-create.js +24 -0
  1073. package/clis/slock/task-delete.js +9 -0
  1074. package/clis/slock/task-get.js +11 -0
  1075. package/clis/slock/task-list-server.js +12 -0
  1076. package/clis/slock/task-list.js +14 -0
  1077. package/clis/slock/task-status.js +19 -0
  1078. package/clis/slock/task-unclaim.js +13 -0
  1079. package/clis/slock/thread-done.js +1 -0
  1080. package/clis/slock/thread-follow.js +1 -0
  1081. package/clis/slock/thread-list.js +1 -0
  1082. package/clis/slock/thread-state.js +1 -0
  1083. package/clis/slock/thread-undone.js +1 -0
  1084. package/clis/slock/thread-unfollow.js +1 -0
  1085. package/clis/slock/unread-summary.js +18 -0
  1086. package/clis/slock/whoami.js +1 -0
  1087. package/clis/smzdm/search.js +71 -0
  1088. package/clis/sohu/article.js +1 -0
  1089. package/clis/sohu/attributes.js +1 -0
  1090. package/clis/sohu/categories.js +1 -0
  1091. package/clis/sohu/channels.js +1 -0
  1092. package/clis/sohu/columns.js +1 -0
  1093. package/clis/sohu/login.js +1 -0
  1094. package/clis/sohu/mpbp.js +1 -0
  1095. package/clis/sohu/stats.js +95 -0
  1096. package/clis/sohu/topics.js +1 -0
  1097. package/clis/sohu/whoami.js +1 -0
  1098. package/clis/spotify/spotify.js +1 -0
  1099. package/clis/spotify/utils.js +8 -0
  1100. package/clis/stackoverflow/bounties.js +1 -0
  1101. package/clis/stackoverflow/hot.js +1 -0
  1102. package/clis/stackoverflow/read.js +13 -0
  1103. package/clis/stackoverflow/related.js +1 -0
  1104. package/clis/stackoverflow/search.js +1 -0
  1105. package/clis/stackoverflow/tag.js +1 -0
  1106. package/clis/stackoverflow/unanswered.js +1 -0
  1107. package/clis/stackoverflow/user.js +1 -0
  1108. package/clis/stackoverflow/utils.js +1 -0
  1109. package/clis/steam/app.js +1 -0
  1110. package/clis/steam/search.js +1 -0
  1111. package/clis/steam/top-sellers.js +1 -0
  1112. package/clis/steam/utils.js +1 -0
  1113. package/clis/substack/auth.js +11 -0
  1114. package/clis/substack/feed.js +1 -0
  1115. package/clis/substack/post-utils.js +2 -0
  1116. package/clis/substack/publication.js +1 -0
  1117. package/clis/substack/publish.js +10 -0
  1118. package/clis/substack/search.js +1 -0
  1119. package/clis/substack/utils.js +108 -0
  1120. package/clis/suno/auth.js +21 -0
  1121. package/clis/suno/download.js +17 -0
  1122. package/clis/suno/generate.js +4 -0
  1123. package/clis/suno/list.js +14 -0
  1124. package/clis/suno/status.js +1 -0
  1125. package/clis/suno/utils.js +102 -0
  1126. package/clis/taobao/add-cart.js +93 -0
  1127. package/clis/taobao/auth.js +8 -0
  1128. package/clis/taobao/cart.js +68 -0
  1129. package/clis/taobao/detail.js +48 -0
  1130. package/clis/taobao/reviews.js +52 -0
  1131. package/clis/taobao/search.js +64 -0
  1132. package/clis/tdx/hot-rank.js +25 -0
  1133. package/clis/telegram/send.js +18 -0
  1134. package/clis/telegram/shared.js +21 -0
  1135. package/clis/telegram/whoami.js +1 -0
  1136. package/clis/test-utils.js +1 -0
  1137. package/clis/threads/post.js +152 -0
  1138. package/clis/threads/shared.js +27 -0
  1139. package/clis/threads/whoami.js +1 -0
  1140. package/clis/ths/hot-rank.js +27 -0
  1141. package/clis/tieba/hot.js +16 -0
  1142. package/clis/tieba/posts.js +1 -0
  1143. package/clis/tieba/read.js +84 -0
  1144. package/clis/tieba/search.js +54 -0
  1145. package/clis/tieba/utils.js +1 -0
  1146. package/clis/tiktok/auth.js +30 -0
  1147. package/clis/tiktok/comment.js +69 -0
  1148. package/clis/tiktok/creator-videos.js +45 -0
  1149. package/clis/tiktok/explore.js +76 -0
  1150. package/clis/tiktok/follow.js +49 -0
  1151. package/clis/tiktok/following.js +103 -0
  1152. package/clis/tiktok/friends.js +79 -0
  1153. package/clis/tiktok/like.js +19 -0
  1154. package/clis/tiktok/live.js +79 -0
  1155. package/clis/tiktok/notifications.js +77 -0
  1156. package/clis/tiktok/profile.js +26 -0
  1157. package/clis/tiktok/publish.js +82 -0
  1158. package/clis/tiktok/save.js +15 -0
  1159. package/clis/tiktok/search.js +24 -0
  1160. package/clis/tiktok/unfollow.js +59 -0
  1161. package/clis/tiktok/unlike.js +19 -0
  1162. package/clis/tiktok/unsave.js +17 -0
  1163. package/clis/tiktok/user.js +143 -0
  1164. package/clis/tiktok/utils.js +272 -0
  1165. package/clis/toutiao/article.js +1 -0
  1166. package/clis/toutiao/articles.js +6 -0
  1167. package/clis/toutiao/auth.js +50 -0
  1168. package/clis/toutiao/hot.js +1 -0
  1169. package/clis/toutiao/utils.js +2 -0
  1170. package/clis/trae-cn/activity.js +1 -0
  1171. package/clis/trae-cn/approve.js +1 -0
  1172. package/clis/trae-cn/ask.js +1 -0
  1173. package/clis/trae-cn/dump.js +1 -0
  1174. package/clis/trae-cn/export.js +3 -0
  1175. package/clis/trae-cn/model.js +1 -0
  1176. package/clis/trae-cn/new.js +1 -0
  1177. package/clis/trae-cn/read.js +1 -0
  1178. package/clis/trae-cn/screenshot.js +1 -0
  1179. package/clis/trae-cn/select-model.js +1 -0
  1180. package/clis/trae-cn/send.js +1 -0
  1181. package/clis/trae-cn/setup.js +1 -0
  1182. package/clis/trae-cn/status.js +1 -0
  1183. package/clis/trae-cn/targets.js +1 -0
  1184. package/clis/trae-cn/utils.js +456 -0
  1185. package/clis/trae-cn/watch.js +3 -0
  1186. package/clis/trae-solo/_actions.js +41 -0
  1187. package/clis/trae-solo/_fs.js +6 -0
  1188. package/clis/trae-solo/_state.js +2 -0
  1189. package/clis/trae-solo/automation.js +43 -0
  1190. package/clis/trae-solo/history.js +15 -0
  1191. package/clis/trae-solo/mode.js +31 -0
  1192. package/clis/trae-solo/model.js +50 -0
  1193. package/clis/trae-solo/renderer-storage.js +11 -0
  1194. package/clis/trae-solo/settings.js +1 -0
  1195. package/clis/trae-solo/skill-fs.js +1 -0
  1196. package/clis/trae-solo/skill.js +81 -0
  1197. package/clis/trae-solo/state-fs.js +2 -0
  1198. package/clis/trae-solo/status.js +1 -0
  1199. package/clis/trae-solo/task-fs.js +5 -0
  1200. package/clis/trae-solo/user-rules.js +1 -0
  1201. package/clis/trae-solo/workspaces-fs.js +1 -0
  1202. package/clis/tumblr/auth.js +24 -0
  1203. package/clis/tumblr/publish.js +14 -0
  1204. package/clis/tvmaze/search.js +1 -0
  1205. package/clis/tvmaze/show.js +1 -0
  1206. package/clis/tvmaze/utils.js +1 -0
  1207. package/clis/twitter/accept.js +116 -0
  1208. package/clis/twitter/article.js +116 -0
  1209. package/clis/twitter/auth.js +4 -0
  1210. package/clis/twitter/block.js +62 -0
  1211. package/clis/twitter/bookmark-folder.js +4 -0
  1212. package/clis/twitter/bookmark-folders.js +4 -0
  1213. package/clis/twitter/bookmark.js +44 -0
  1214. package/clis/twitter/bookmarks.js +27 -0
  1215. package/clis/twitter/delete.js +36 -0
  1216. package/clis/twitter/device-follow.js +13 -0
  1217. package/clis/twitter/dm-list.js +1 -0
  1218. package/clis/twitter/dm-read.js +1 -0
  1219. package/clis/twitter/dm-send.js +13 -0
  1220. package/clis/twitter/dm-shared.js +6 -0
  1221. package/clis/twitter/download.js +38 -0
  1222. package/clis/twitter/follow-batch.js +43 -0
  1223. package/clis/twitter/follow.js +39 -0
  1224. package/clis/twitter/followers.js +59 -0
  1225. package/clis/twitter/following.js +4 -0
  1226. package/clis/twitter/hide-reply.js +57 -0
  1227. package/clis/twitter/like.js +48 -0
  1228. package/clis/twitter/likes.js +14 -0
  1229. package/clis/twitter/list-add-batch.js +1 -0
  1230. package/clis/twitter/list-add-core.js +35 -0
  1231. package/clis/twitter/list-add.js +1 -0
  1232. package/clis/twitter/list-batch-utils.js +1 -0
  1233. package/clis/twitter/list-create.js +12 -0
  1234. package/clis/twitter/list-delete.js +36 -0
  1235. package/clis/twitter/list-remove-batch.js +1 -0
  1236. package/clis/twitter/list-remove-core.js +127 -0
  1237. package/clis/twitter/list-remove.js +1 -0
  1238. package/clis/twitter/list-tweets.js +27 -0
  1239. package/clis/twitter/lists.js +27 -0
  1240. package/clis/twitter/notifications.js +4 -0
  1241. package/clis/twitter/post.js +158 -0
  1242. package/clis/twitter/profile.js +66 -0
  1243. package/clis/twitter/quote.js +123 -0
  1244. package/clis/twitter/reply-dm.js +112 -0
  1245. package/clis/twitter/reply.js +97 -0
  1246. package/clis/twitter/retweet.js +62 -0
  1247. package/clis/twitter/schedule.js +96 -0
  1248. package/clis/twitter/scheduled-delete.js +60 -0
  1249. package/clis/twitter/scheduled-list.js +15 -0
  1250. package/clis/twitter/scheduled-utils.js +18 -0
  1251. package/clis/twitter/search.js +12 -0
  1252. package/clis/twitter/shared.js +76 -0
  1253. package/clis/twitter/thread.js +4 -0
  1254. package/clis/twitter/timeline.js +4 -0
  1255. package/clis/twitter/trending.js +18 -0
  1256. package/clis/twitter/tweets.js +12 -0
  1257. package/clis/twitter/unblock.js +45 -0
  1258. package/clis/twitter/unbookmark.js +41 -0
  1259. package/clis/twitter/unfollow.js +45 -0
  1260. package/clis/twitter/unlike.js +48 -0
  1261. package/clis/twitter/unretweet.js +62 -0
  1262. package/clis/twitter/utils.js +55 -0
  1263. package/clis/uisdc/news.js +25 -0
  1264. package/clis/uiverse/_shared.js +257 -0
  1265. package/clis/uiverse/code.js +1 -0
  1266. package/clis/uiverse/preview.js +1 -0
  1267. package/clis/upwork/auth.js +19 -0
  1268. package/clis/upwork/detail.js +22 -0
  1269. package/clis/upwork/feed.js +21 -0
  1270. package/clis/upwork/search.js +21 -0
  1271. package/clis/upwork/utils.js +1 -0
  1272. package/clis/v2ex/auth.js +10 -0
  1273. package/clis/v2ex/daily.js +41 -0
  1274. package/clis/v2ex/hot.js +1 -0
  1275. package/clis/v2ex/latest.js +1 -0
  1276. package/clis/v2ex/me.js +58 -0
  1277. package/clis/v2ex/member.js +1 -0
  1278. package/clis/v2ex/node.js +1 -0
  1279. package/clis/v2ex/nodes.js +1 -0
  1280. package/clis/v2ex/notifications.js +40 -0
  1281. package/clis/v2ex/replies.js +1 -0
  1282. package/clis/v2ex/topic.js +1 -0
  1283. package/clis/v2ex/user.js +1 -0
  1284. package/clis/vk/post.js +1 -0
  1285. package/clis/vk/shared.js +8 -0
  1286. package/clis/vk/whoami.js +1 -0
  1287. package/clis/wanfang/search.js +42 -0
  1288. package/clis/web/read.js +260 -0
  1289. package/clis/wechat-channels/auth.js +31 -0
  1290. package/clis/wechat-channels/publish.js +298 -0
  1291. package/clis/weibo/article.js +1 -0
  1292. package/clis/weibo/auth.js +17 -0
  1293. package/clis/weibo/comments.js +28 -0
  1294. package/clis/weibo/delete.js +84 -0
  1295. package/clis/weibo/favorites.js +27 -0
  1296. package/clis/weibo/feed.js +33 -0
  1297. package/clis/weibo/hot.js +17 -0
  1298. package/clis/weibo/me.js +51 -0
  1299. package/clis/weibo/post.js +46 -0
  1300. package/clis/weibo/publish.js +98 -0
  1301. package/clis/weibo/search.js +47 -0
  1302. package/clis/weibo/user-posts.js +92 -0
  1303. package/clis/weibo/user.js +37 -0
  1304. package/clis/weibo/utils.js +16 -0
  1305. package/clis/weixin/article.js +1 -0
  1306. package/clis/weixin/create-draft.js +152 -0
  1307. package/clis/weixin/download.js +100 -0
  1308. package/clis/weixin/drafts.js +27 -0
  1309. package/clis/weixin/login.js +1 -0
  1310. package/clis/weixin/search.js +44 -0
  1311. package/clis/weixin/stats.js +43 -0
  1312. package/clis/weixin/whoami.js +1 -0
  1313. package/clis/weread/ai-outline.js +2 -0
  1314. package/clis/weread/auth.js +24 -0
  1315. package/clis/weread/book-search.js +2 -0
  1316. package/clis/weread/book.js +3 -0
  1317. package/clis/weread/highlights.js +1 -0
  1318. package/clis/weread/notebooks.js +1 -0
  1319. package/clis/weread/notes.js +1 -0
  1320. package/clis/weread/ranking.js +1 -0
  1321. package/clis/weread/search.js +1 -0
  1322. package/clis/weread/shelf.js +1 -0
  1323. package/clis/weread/utils.js +67 -0
  1324. package/clis/weread-official/book.js +1 -0
  1325. package/clis/weread-official/discover.js +1 -0
  1326. package/clis/weread-official/list-apis.js +1 -0
  1327. package/clis/weread-official/notes.js +1 -0
  1328. package/clis/weread-official/readdata.js +1 -0
  1329. package/clis/weread-official/review.js +1 -0
  1330. package/clis/weread-official/search.js +1 -0
  1331. package/clis/weread-official/shelf.js +1 -0
  1332. package/clis/weread-official/utils.js +1 -0
  1333. package/clis/wikidata/entity.js +1 -0
  1334. package/clis/wikidata/search.js +1 -0
  1335. package/clis/wikidata/utils.js +1 -0
  1336. package/clis/wikipedia/page.js +3 -0
  1337. package/clis/wikipedia/random.js +1 -0
  1338. package/clis/wikipedia/search.js +1 -0
  1339. package/clis/wikipedia/summary.js +1 -0
  1340. package/clis/wikipedia/trending.js +1 -0
  1341. package/clis/wikipedia/utils.js +1 -0
  1342. package/clis/wordpress/login.js +1 -0
  1343. package/clis/wordpress/publish.js +1 -0
  1344. package/clis/wordpress/shared.js +54 -0
  1345. package/clis/wordpress/whoami.js +1 -0
  1346. package/clis/woshipm/article.js +1 -0
  1347. package/clis/woshipm/login.js +1 -0
  1348. package/clis/woshipm/stats.js +52 -0
  1349. package/clis/woshipm/whoami.js +1 -0
  1350. package/clis/wttr/current.js +1 -0
  1351. package/clis/wttr/forecast.js +1 -0
  1352. package/clis/wttr/utils.js +1 -0
  1353. package/clis/xianyu/auth.js +11 -0
  1354. package/clis/xianyu/chat.js +1 -0
  1355. package/clis/xianyu/im.js +240 -0
  1356. package/clis/xianyu/inbox.js +1 -0
  1357. package/clis/xianyu/item.js +97 -0
  1358. package/clis/xianyu/messages.js +1 -0
  1359. package/clis/xianyu/publish.js +245 -0
  1360. package/clis/xianyu/reply.js +1 -0
  1361. package/clis/xianyu/search.js +141 -0
  1362. package/clis/xianyu/utils.js +1 -0
  1363. package/clis/xiaoe/auth.js +10 -0
  1364. package/clis/xiaoe/catalog.js +134 -0
  1365. package/clis/xiaoe/content.js +16 -0
  1366. package/clis/xiaoe/courses.js +43 -0
  1367. package/clis/xiaoe/detail.js +19 -0
  1368. package/clis/xiaoe/play-url.js +97 -0
  1369. package/clis/xiaohongshu/ask.js +130 -0
  1370. package/clis/xiaohongshu/auth.js +13 -0
  1371. package/clis/xiaohongshu/collection-helpers.js +64 -0
  1372. package/clis/xiaohongshu/comments.js +89 -0
  1373. package/clis/xiaohongshu/creator-note-detail.js +80 -0
  1374. package/clis/xiaohongshu/creator-notes-summary.js +1 -0
  1375. package/clis/xiaohongshu/creator-notes.js +107 -0
  1376. package/clis/xiaohongshu/creator-profile.js +13 -0
  1377. package/clis/xiaohongshu/creator-stats.js +13 -0
  1378. package/clis/xiaohongshu/delete-note.js +69 -0
  1379. package/clis/xiaohongshu/download.js +200 -0
  1380. package/clis/xiaohongshu/draft-clear.js +44 -0
  1381. package/clis/xiaohongshu/draft-delete.js +37 -0
  1382. package/clis/xiaohongshu/draft-open.js +1 -0
  1383. package/clis/xiaohongshu/draft-utils.js +36 -0
  1384. package/clis/xiaohongshu/drafts.js +1 -0
  1385. package/clis/xiaohongshu/feed.js +38 -0
  1386. package/clis/xiaohongshu/follow.js +75 -0
  1387. package/clis/xiaohongshu/liked.js +1 -0
  1388. package/clis/xiaohongshu/note-helpers.js +1 -0
  1389. package/clis/xiaohongshu/note.js +32 -0
  1390. package/clis/xiaohongshu/notifications.js +1 -0
  1391. package/clis/xiaohongshu/publish-video.js +87 -0
  1392. package/clis/xiaohongshu/publish.js +637 -0
  1393. package/clis/xiaohongshu/saved.js +1 -0
  1394. package/clis/xiaohongshu/search.js +194 -0
  1395. package/clis/xiaohongshu/unfollow.js +98 -0
  1396. package/clis/xiaohongshu/user-helpers.js +1 -0
  1397. package/clis/xiaohongshu/user.js +30 -0
  1398. package/clis/xiaoyuzhou/auth.js +3 -0
  1399. package/clis/xiaoyuzhou/download.js +1 -0
  1400. package/clis/xiaoyuzhou/episode.js +1 -0
  1401. package/clis/xiaoyuzhou/podcast-episodes.js +1 -0
  1402. package/clis/xiaoyuzhou/podcast.js +1 -0
  1403. package/clis/xiaoyuzhou/transcript.js +1 -0
  1404. package/clis/xiaoyuzhou/utils.js +1 -0
  1405. package/clis/xueqiu/article.js +4 -0
  1406. package/clis/xueqiu/auth.js +27 -0
  1407. package/clis/xueqiu/comments.js +38 -0
  1408. package/clis/xueqiu/danjuan-utils.js +84 -0
  1409. package/clis/xueqiu/earnings-date.js +1 -0
  1410. package/clis/xueqiu/events.js +17 -0
  1411. package/clis/xueqiu/feed.js +1 -0
  1412. package/clis/xueqiu/fund-holdings.js +1 -0
  1413. package/clis/xueqiu/fund-snapshot.js +1 -0
  1414. package/clis/xueqiu/groups.js +1 -0
  1415. package/clis/xueqiu/hashtags.js +26 -0
  1416. package/clis/xueqiu/hot-stock.js +1 -0
  1417. package/clis/xueqiu/hot.js +1 -0
  1418. package/clis/xueqiu/kline.js +1 -0
  1419. package/clis/xueqiu/search.js +1 -0
  1420. package/clis/xueqiu/stock.js +1 -0
  1421. package/clis/xueqiu/stocks.js +13 -0
  1422. package/clis/xueqiu/users.js +12 -0
  1423. package/clis/xueqiu/utils.js +9 -0
  1424. package/clis/xueqiu/watchlist.js +1 -0
  1425. package/clis/yahoo/search.js +21 -0
  1426. package/clis/yahoo-finance/quote.js +50 -0
  1427. package/clis/yollomi/background.js +1 -0
  1428. package/clis/yollomi/edit.js +1 -0
  1429. package/clis/yollomi/face-swap.js +1 -0
  1430. package/clis/yollomi/generate.js +1 -0
  1431. package/clis/yollomi/models.js +1 -0
  1432. package/clis/yollomi/object-remover.js +1 -0
  1433. package/clis/yollomi/remove-bg.js +1 -0
  1434. package/clis/yollomi/restore.js +1 -0
  1435. package/clis/yollomi/try-on.js +1 -0
  1436. package/clis/yollomi/upload.js +17 -0
  1437. package/clis/yollomi/upscale.js +1 -0
  1438. package/clis/yollomi/utils.js +16 -0
  1439. package/clis/yollomi/video.js +1 -0
  1440. package/clis/youdao/note.js +113 -0
  1441. package/clis/youtube/auth.js +20 -0
  1442. package/clis/youtube/channel.js +118 -0
  1443. package/clis/youtube/comments.js +64 -0
  1444. package/clis/youtube/feed.js +89 -0
  1445. package/clis/youtube/history.js +87 -0
  1446. package/clis/youtube/like.js +33 -0
  1447. package/clis/youtube/playlist.js +47 -0
  1448. package/clis/youtube/publish.js +56 -0
  1449. package/clis/youtube/search.js +39 -0
  1450. package/clis/youtube/subscribe.js +42 -0
  1451. package/clis/youtube/subscriptions.js +26 -0
  1452. package/clis/youtube/transcript-group.js +2 -0
  1453. package/clis/youtube/transcript.js +417 -0
  1454. package/clis/youtube/unlike.js +33 -0
  1455. package/clis/youtube/unsubscribe.js +42 -0
  1456. package/clis/youtube/utils.js +34 -0
  1457. package/clis/youtube/video.js +96 -0
  1458. package/clis/youtube/watch-later.js +41 -0
  1459. package/clis/yuanbao/ask.js +145 -0
  1460. package/clis/yuanbao/auth.js +23 -0
  1461. package/clis/yuanbao/detail.js +1 -0
  1462. package/clis/yuanbao/history.js +1 -0
  1463. package/clis/yuanbao/new.js +16 -0
  1464. package/clis/yuanbao/read.js +1 -0
  1465. package/clis/yuanbao/send.js +1 -0
  1466. package/clis/yuanbao/shared.js +127 -0
  1467. package/clis/yuanbao/status.js +1 -0
  1468. package/clis/yuque/article.js +1 -0
  1469. package/clis/yuque/whoami.js +1 -0
  1470. package/clis/zhihu/answer-comments.js +11 -0
  1471. package/clis/zhihu/answer-detail.js +11 -0
  1472. package/clis/zhihu/answer.js +15 -0
  1473. package/clis/zhihu/article-transform.js +1 -0
  1474. package/clis/zhihu/article.js +7 -0
  1475. package/clis/zhihu/auth.js +11 -0
  1476. package/clis/zhihu/collection.js +7 -0
  1477. package/clis/zhihu/collections.js +7 -0
  1478. package/clis/zhihu/comment.js +17 -0
  1479. package/clis/zhihu/download.js +39 -0
  1480. package/clis/zhihu/favorite.js +39 -0
  1481. package/clis/zhihu/follow.js +19 -0
  1482. package/clis/zhihu/followers.js +1 -0
  1483. package/clis/zhihu/following.js +1 -0
  1484. package/clis/zhihu/hot.js +21 -0
  1485. package/clis/zhihu/like.js +16 -0
  1486. package/clis/zhihu/paginate.js +11 -0
  1487. package/clis/zhihu/pin.js +24 -0
  1488. package/clis/zhihu/pins.js +1 -0
  1489. package/clis/zhihu/question.js +7 -0
  1490. package/clis/zhihu/recommend.js +7 -0
  1491. package/clis/zhihu/search.js +11 -0
  1492. package/clis/zhihu/stats.js +41 -0
  1493. package/clis/zhihu/target.js +1 -0
  1494. package/clis/zhihu/text.js +6 -0
  1495. package/clis/zhihu/user-answers.js +1 -0
  1496. package/clis/zhihu/user-arg.js +1 -0
  1497. package/clis/zhihu/user-articles.js +1 -0
  1498. package/clis/zhihu/user.js +11 -0
  1499. package/clis/zhihu/write-shared.js +71 -0
  1500. package/clis/zlibrary/info.js +1 -0
  1501. package/clis/zlibrary/search.js +1 -0
  1502. package/clis/zlibrary/utils.js +48 -0
  1503. package/clis/zsxq/auth.js +33 -0
  1504. package/clis/zsxq/dynamics.js +1 -0
  1505. package/clis/zsxq/groups.js +1 -0
  1506. package/clis/zsxq/search.js +1 -0
  1507. package/clis/zsxq/topic.js +1 -0
  1508. package/clis/zsxq/topics.js +1 -0
  1509. package/clis/zsxq/utils.js +72 -0
  1510. package/dist/src/adapter-shadow.d.ts +11 -0
  1511. package/dist/src/adapter-shadow.js +2 -0
  1512. package/dist/src/adapter-shadow.test.d.ts +1 -0
  1513. package/dist/src/adapter-source.d.ts +11 -0
  1514. package/dist/src/adapter-source.js +1 -0
  1515. package/dist/src/adapter-source.test.d.ts +1 -0
  1516. package/dist/src/browser/analyze.d.ts +118 -0
  1517. package/dist/src/browser/analyze.js +1 -0
  1518. package/dist/src/browser/analyze.test.d.ts +1 -0
  1519. package/dist/src/browser/article-extract.d.ts +57 -0
  1520. package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
  1521. package/dist/src/browser/article-extract.js +2 -0
  1522. package/dist/src/browser/article-extract.test.d.ts +1 -0
  1523. package/dist/src/browser/ax-snapshot.d.ts +37 -0
  1524. package/dist/src/browser/ax-snapshot.js +2 -0
  1525. package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
  1526. package/dist/src/browser/base-page.d.ts +151 -0
  1527. package/dist/src/browser/base-page.js +225 -0
  1528. package/dist/src/browser/base-page.test.d.ts +1 -0
  1529. package/dist/src/browser/bridge-readiness.d.ts +14 -0
  1530. package/dist/src/browser/bridge-readiness.js +1 -0
  1531. package/dist/src/browser/bridge-readiness.test.d.ts +1 -0
  1532. package/dist/src/browser/bridge.d.ts +26 -0
  1533. package/dist/src/browser/bridge.js +1 -0
  1534. package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
  1535. package/dist/src/browser/cdp.d.ts +51 -0
  1536. package/dist/src/browser/cdp.js +1 -0
  1537. package/dist/src/browser/cdp.test.d.ts +1 -0
  1538. package/dist/src/browser/compound.d.ts +59 -0
  1539. package/dist/src/browser/compound.js +82 -0
  1540. package/dist/src/browser/compound.test.d.ts +1 -0
  1541. package/dist/src/browser/config.d.ts +2 -0
  1542. package/dist/src/browser/config.js +1 -0
  1543. package/dist/src/browser/daemon-client.d.ts +79 -0
  1544. package/dist/src/browser/daemon-client.js +1 -0
  1545. package/dist/src/browser/daemon-client.test.d.ts +1 -0
  1546. package/dist/src/browser/daemon-lifecycle.d.ts +37 -0
  1547. package/dist/src/browser/daemon-lifecycle.js +12 -0
  1548. package/dist/src/browser/daemon-transport.d.ts +55 -0
  1549. package/dist/src/browser/daemon-transport.js +1 -0
  1550. package/dist/src/browser/daemon-version.d.ts +4 -0
  1551. package/dist/src/browser/daemon-version.js +2 -0
  1552. package/dist/src/browser/dom-helpers.d.ts +41 -0
  1553. package/dist/src/browser/dom-helpers.js +166 -0
  1554. package/dist/src/browser/dom-helpers.test.d.ts +1 -0
  1555. package/dist/src/browser/dom-snapshot.d.ts +93 -0
  1556. package/dist/src/browser/dom-snapshot.js +809 -0
  1557. package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
  1558. package/dist/src/browser/errors.d.ts +38 -0
  1559. package/dist/src/browser/errors.js +5 -0
  1560. package/dist/src/browser/errors.test.d.ts +1 -0
  1561. package/dist/src/browser/extract.d.ts +69 -0
  1562. package/dist/src/browser/extract.js +42 -0
  1563. package/dist/src/browser/extract.test.d.ts +1 -0
  1564. package/dist/src/browser/find.d.ts +84 -0
  1565. package/dist/src/browser/find.js +328 -0
  1566. package/dist/src/browser/find.test.d.ts +1 -0
  1567. package/dist/src/browser/fingerprint.d.ts +44 -0
  1568. package/dist/src/browser/fingerprint.js +82 -0
  1569. package/dist/src/browser/html-tree.d.ts +75 -0
  1570. package/dist/src/browser/html-tree.js +61 -0
  1571. package/dist/src/browser/html-tree.test.d.ts +1 -0
  1572. package/dist/src/browser/index.d.ts +14 -0
  1573. package/dist/src/browser/index.js +1 -0
  1574. package/dist/src/browser/managed-chrome.d.ts +89 -0
  1575. package/dist/src/browser/managed-chrome.js +1 -0
  1576. package/dist/src/browser/network-cache.d.ts +49 -0
  1577. package/dist/src/browser/network-cache.js +1 -0
  1578. package/dist/src/browser/network-cache.test.d.ts +1 -0
  1579. package/dist/src/browser/network-key.d.ts +22 -0
  1580. package/dist/src/browser/network-key.js +1 -0
  1581. package/dist/src/browser/network-key.test.d.ts +1 -0
  1582. package/dist/src/browser/page.d.ts +83 -0
  1583. package/dist/src/browser/page.js +15 -0
  1584. package/dist/src/browser/page.test.d.ts +1 -0
  1585. package/dist/src/browser/profile.d.ts +96 -0
  1586. package/dist/src/browser/profile.js +2 -0
  1587. package/dist/src/browser/proxy-test.d.ts +28 -0
  1588. package/dist/src/browser/proxy-test.js +12 -0
  1589. package/dist/src/browser/shape-filter.d.ts +52 -0
  1590. package/dist/src/browser/shape-filter.js +1 -0
  1591. package/dist/src/browser/shape-filter.test.d.ts +1 -0
  1592. package/dist/src/browser/shape.d.ts +23 -0
  1593. package/dist/src/browser/shape.js +1 -0
  1594. package/dist/src/browser/shape.test.d.ts +1 -0
  1595. package/dist/src/browser/stealth.d.ts +18 -0
  1596. package/dist/src/browser/stealth.js +391 -0
  1597. package/dist/src/browser/stealth.test.d.ts +1 -0
  1598. package/dist/src/browser/tabs.d.ts +13 -0
  1599. package/dist/src/browser/tabs.js +2 -0
  1600. package/dist/src/browser/target-errors.d.ts +39 -0
  1601. package/dist/src/browser/target-errors.js +1 -0
  1602. package/dist/src/browser/target-errors.test.d.ts +1 -0
  1603. package/dist/src/browser/target-resolver.d.ts +158 -0
  1604. package/dist/src/browser/target-resolver.js +423 -0
  1605. package/dist/src/browser/target-resolver.test.d.ts +1 -0
  1606. package/dist/src/browser/trace.d.ts +21 -0
  1607. package/dist/src/browser/trace.js +2 -0
  1608. package/dist/src/browser/utils.d.ts +20 -0
  1609. package/dist/src/browser/utils.js +1 -0
  1610. package/dist/src/browser/utils.test.d.ts +1 -0
  1611. package/dist/src/browser/verify-fixture.d.ts +65 -0
  1612. package/dist/src/browser/verify-fixture.js +2 -0
  1613. package/dist/src/browser/verify-fixture.test.d.ts +1 -0
  1614. package/dist/src/browser/visual-refs.d.ts +11 -0
  1615. package/dist/src/browser/visual-refs.js +94 -0
  1616. package/dist/src/browser-session-lock.d.ts +13 -0
  1617. package/dist/src/browser-session-lock.js +1 -0
  1618. package/dist/src/browser-session-lock.test.d.ts +1 -0
  1619. package/dist/src/browser.test.d.ts +1 -0
  1620. package/dist/src/build-manifest.d.ts +103 -0
  1621. package/dist/src/build-manifest.js +16 -0
  1622. package/dist/src/build-manifest.test.d.ts +1 -0
  1623. package/dist/src/capabilityRouting.d.ts +19 -0
  1624. package/dist/src/capabilityRouting.js +1 -0
  1625. package/dist/src/capabilityRouting.test.d.ts +1 -0
  1626. package/dist/src/cli-argv-preprocess.d.ts +63 -0
  1627. package/dist/src/cli-argv-preprocess.js +1 -0
  1628. package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
  1629. package/dist/src/cli.d.ts +79 -0
  1630. package/dist/src/cli.js +132 -0
  1631. package/dist/src/cli.test.d.ts +1 -0
  1632. package/dist/src/commanderAdapter.d.ts +21 -0
  1633. package/dist/src/commanderAdapter.js +3 -0
  1634. package/dist/src/commanderAdapter.test.d.ts +1 -0
  1635. package/dist/src/commands/auth.d.ts +40 -0
  1636. package/dist/src/commands/auth.js +2 -0
  1637. package/dist/src/commands/auth.test.d.ts +1 -0
  1638. package/dist/src/commands/daemon.d.ts +25 -0
  1639. package/dist/src/commands/daemon.js +1 -0
  1640. package/dist/src/commands/daemon.test.d.ts +1 -0
  1641. package/dist/src/completion-fast.d.ts +22 -0
  1642. package/dist/src/completion-fast.js +1 -0
  1643. package/dist/src/completion-shared.d.ts +13 -0
  1644. package/dist/src/completion-shared.js +30 -0
  1645. package/dist/src/completion.d.ts +21 -0
  1646. package/dist/src/completion.js +1 -0
  1647. package/dist/src/completion.test.d.ts +1 -0
  1648. package/dist/src/constants.d.ts +22 -0
  1649. package/dist/src/constants.js +1 -0
  1650. package/dist/src/convention-audit.d.ts +50 -0
  1651. package/dist/src/convention-audit.js +2 -0
  1652. package/dist/src/convention-audit.test.d.ts +1 -0
  1653. package/dist/src/daemon-utils.d.ts +18 -0
  1654. package/dist/src/daemon-utils.js +1 -0
  1655. package/dist/src/daemon.d.ts +22 -0
  1656. package/dist/src/daemon.js +1 -0
  1657. package/dist/src/daemon.test.d.ts +1 -0
  1658. package/dist/src/discovery.d.ts +43 -0
  1659. package/dist/src/discovery.js +2 -0
  1660. package/dist/src/doctor.d.ts +38 -0
  1661. package/dist/src/doctor.js +13 -0
  1662. package/dist/src/doctor.test.d.ts +1 -0
  1663. package/dist/src/download/article-download.d.ts +72 -0
  1664. package/dist/src/download/article-download.js +21 -0
  1665. package/dist/src/download/article-download.test.d.ts +1 -0
  1666. package/dist/src/download/index.d.ts +71 -0
  1667. package/dist/src/download/index.js +7 -0
  1668. package/dist/src/download/index.test.d.ts +1 -0
  1669. package/dist/src/download/media-download.d.ts +49 -0
  1670. package/dist/src/download/media-download.js +1 -0
  1671. package/dist/src/download/media-download.test.d.ts +1 -0
  1672. package/dist/src/download/progress.d.ts +36 -0
  1673. package/dist/src/download/progress.js +5 -0
  1674. package/dist/src/download/progress.test.d.ts +1 -0
  1675. package/dist/src/electron-apps.d.ts +31 -0
  1676. package/dist/src/electron-apps.js +1 -0
  1677. package/dist/src/electron-apps.test.d.ts +1 -0
  1678. package/dist/src/engine.test.d.ts +1 -0
  1679. package/dist/src/errors.d.ts +117 -0
  1680. package/dist/src/errors.js +2 -0
  1681. package/dist/src/errors.test.d.ts +1 -0
  1682. package/dist/src/execution.d.ts +24 -0
  1683. package/dist/src/execution.js +2 -0
  1684. package/dist/src/execution.test.d.ts +1 -0
  1685. package/dist/src/extension-manifest-regression.test.d.ts +1 -0
  1686. package/dist/src/external-clis.yaml +109 -0
  1687. package/dist/src/external.d.ts +49 -0
  1688. package/dist/src/external.js +1 -0
  1689. package/dist/src/external.test.d.ts +1 -0
  1690. package/dist/src/help.d.ts +88 -0
  1691. package/dist/src/help.js +8 -0
  1692. package/dist/src/help.test.d.ts +1 -0
  1693. package/dist/src/hooks.d.ts +46 -0
  1694. package/dist/src/hooks.js +1 -0
  1695. package/dist/src/hooks.test.d.ts +4 -0
  1696. package/dist/src/interceptor.d.ts +44 -0
  1697. package/dist/src/interceptor.js +123 -0
  1698. package/dist/src/interceptor.test.d.ts +4 -0
  1699. package/dist/src/launcher.d.ts +41 -0
  1700. package/dist/src/launcher.js +7 -0
  1701. package/dist/src/launcher.test.d.ts +1 -0
  1702. package/dist/src/logger.d.ts +26 -0
  1703. package/dist/src/logger.js +9 -0
  1704. package/dist/src/main.d.ts +5 -0
  1705. package/dist/src/main.js +10 -0
  1706. package/dist/src/manifest-types.d.ts +43 -0
  1707. package/dist/src/manifest-types.js +1 -0
  1708. package/dist/src/node-network.d.ts +10 -0
  1709. package/dist/src/node-network.js +1 -0
  1710. package/dist/src/node-network.test.d.ts +1 -0
  1711. package/dist/src/observation/artifact.d.ts +16 -0
  1712. package/dist/src/observation/artifact.js +8 -0
  1713. package/dist/src/observation/artifact.test.d.ts +1 -0
  1714. package/dist/src/observation/events.d.ts +89 -0
  1715. package/dist/src/observation/events.js +1 -0
  1716. package/dist/src/observation/index.d.ts +7 -0
  1717. package/dist/src/observation/index.js +1 -0
  1718. package/dist/src/observation/manager.d.ts +9 -0
  1719. package/dist/src/observation/manager.js +1 -0
  1720. package/dist/src/observation/manager.test.d.ts +1 -0
  1721. package/dist/src/observation/redaction.d.ts +11 -0
  1722. package/dist/src/observation/redaction.js +2 -0
  1723. package/dist/src/observation/redaction.test.d.ts +1 -0
  1724. package/dist/src/observation/retention.d.ts +32 -0
  1725. package/dist/src/observation/retention.js +1 -0
  1726. package/dist/src/observation/retention.test.d.ts +1 -0
  1727. package/dist/src/observation/ring-buffer.d.ts +22 -0
  1728. package/dist/src/observation/ring-buffer.js +1 -0
  1729. package/dist/src/observation/ring-buffer.test.d.ts +1 -0
  1730. package/dist/src/observation/session.d.ts +25 -0
  1731. package/dist/src/observation/session.js +1 -0
  1732. package/dist/src/output.d.ts +14 -0
  1733. package/dist/src/output.js +2 -0
  1734. package/dist/src/output.test.d.ts +1 -0
  1735. package/dist/src/package-exports.test.d.ts +1 -0
  1736. package/dist/src/package-paths.d.ts +8 -0
  1737. package/dist/src/package-paths.js +1 -0
  1738. package/dist/src/pipeline/executor.d.ts +11 -0
  1739. package/dist/src/pipeline/executor.js +1 -0
  1740. package/dist/src/pipeline/executor.test.d.ts +4 -0
  1741. package/dist/src/pipeline/index.d.ts +5 -0
  1742. package/dist/src/pipeline/index.js +1 -0
  1743. package/dist/src/pipeline/registry.d.ts +28 -0
  1744. package/dist/src/pipeline/registry.js +1 -0
  1745. package/dist/src/pipeline/steps/browser.d.ts +13 -0
  1746. package/dist/src/pipeline/steps/browser.js +1 -0
  1747. package/dist/src/pipeline/steps/download.d.ts +18 -0
  1748. package/dist/src/pipeline/steps/download.js +1 -0
  1749. package/dist/src/pipeline/steps/download.test.d.ts +1 -0
  1750. package/dist/src/pipeline/steps/fetch.d.ts +5 -0
  1751. package/dist/src/pipeline/steps/fetch.js +31 -0
  1752. package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
  1753. package/dist/src/pipeline/steps/intercept.d.ts +5 -0
  1754. package/dist/src/pipeline/steps/intercept.js +1 -0
  1755. package/dist/src/pipeline/steps/tap.d.ts +12 -0
  1756. package/dist/src/pipeline/steps/tap.js +53 -0
  1757. package/dist/src/pipeline/steps/transform.d.ts +9 -0
  1758. package/dist/src/pipeline/steps/transform.js +1 -0
  1759. package/dist/src/pipeline/template.d.ts +17 -0
  1760. package/dist/src/pipeline/template.js +1 -0
  1761. package/dist/src/pipeline/template.test.d.ts +4 -0
  1762. package/dist/src/pipeline/transform.test.d.ts +4 -0
  1763. package/dist/src/plugin-manifest.d.ts +70 -0
  1764. package/dist/src/plugin-manifest.js +1 -0
  1765. package/dist/src/plugin-manifest.test.d.ts +4 -0
  1766. package/dist/src/plugin-scaffold.d.ts +28 -0
  1767. package/dist/src/plugin-scaffold.js +75 -0
  1768. package/dist/src/plugin-scaffold.test.d.ts +4 -0
  1769. package/dist/src/plugin.d.ts +145 -0
  1770. package/dist/src/plugin.js +20 -0
  1771. package/dist/src/plugin.test.d.ts +4 -0
  1772. package/dist/src/rate-limit.d.ts +15 -0
  1773. package/dist/src/rate-limit.js +2 -0
  1774. package/dist/src/rate-limit.test.d.ts +1 -0
  1775. package/dist/src/registry-api.d.ts +13 -0
  1776. package/dist/src/registry-api.js +1 -0
  1777. package/dist/src/registry.d.ts +130 -0
  1778. package/dist/src/registry.js +1 -0
  1779. package/dist/src/registry.test.d.ts +4 -0
  1780. package/dist/src/runtime-detect.d.ts +31 -0
  1781. package/dist/src/runtime-detect.js +1 -0
  1782. package/dist/src/runtime-detect.test.d.ts +1 -0
  1783. package/dist/src/runtime.d.ts +57 -0
  1784. package/dist/src/runtime.js +1 -0
  1785. package/dist/src/scripts/framework.d.ts +7 -0
  1786. package/dist/src/scripts/framework.js +1 -0
  1787. package/dist/src/scripts/interact.d.ts +4 -0
  1788. package/dist/src/scripts/interact.js +1 -0
  1789. package/dist/src/scripts/store.d.ts +13 -0
  1790. package/dist/src/scripts/store.js +1 -0
  1791. package/dist/src/serialization.d.ts +42 -0
  1792. package/dist/src/serialization.js +4 -0
  1793. package/dist/src/serialization.test.d.ts +1 -0
  1794. package/dist/src/skills.d.ts +14 -0
  1795. package/dist/src/skills.js +6 -0
  1796. package/dist/src/skills.test.d.ts +1 -0
  1797. package/dist/src/snapshotFormatter.d.ts +11 -0
  1798. package/dist/src/snapshotFormatter.js +3 -0
  1799. package/dist/src/snapshotFormatter.test.d.ts +7 -0
  1800. package/dist/src/tui.d.ts +28 -0
  1801. package/dist/src/tui.js +16 -0
  1802. package/dist/src/tui.test.d.ts +1 -0
  1803. package/dist/src/types.d.ts +236 -0
  1804. package/dist/src/types.js +1 -0
  1805. package/dist/src/utils.d.ts +57 -0
  1806. package/dist/src/utils.js +38 -0
  1807. package/dist/src/utils.test.d.ts +1 -0
  1808. package/dist/src/validate.d.ts +21 -0
  1809. package/dist/src/validate.js +3 -0
  1810. package/dist/src/validate.test.d.ts +9 -0
  1811. package/dist/src/verify.d.ts +27 -0
  1812. package/dist/src/verify.js +2 -0
  1813. package/dist/src/verify.test.d.ts +8 -0
  1814. package/dist/src/version.d.ts +4 -0
  1815. package/dist/src/version.js +1 -0
  1816. package/dist/src/weixin-download.test.d.ts +1 -0
  1817. package/docs/guide/browser-bridge.md +94 -0
  1818. package/docs/guide/electron-app-cli.md +199 -0
  1819. package/docs/guide/exit-codes.md +24 -0
  1820. package/docs/guide/extending-opencli.md +134 -0
  1821. package/docs/guide/getting-started.md +81 -0
  1822. package/docs/guide/installation.md +52 -0
  1823. package/docs/guide/plugins.md +226 -0
  1824. package/docs/guide/remote-orchestration.md +116 -0
  1825. package/docs/guide/troubleshooting.md +69 -0
  1826. package/package.json +116 -0
  1827. package/scripts/check-doc-coverage.sh +81 -0
  1828. package/scripts/check-listing-id-pairing.mjs +193 -0
  1829. package/scripts/check-silent-column-drop.mjs +105 -0
  1830. package/scripts/check-typed-error-lint.mjs +118 -0
  1831. package/scripts/clean-dist.cjs +13 -0
  1832. package/scripts/copy-yaml.cjs +12 -0
  1833. package/scripts/fetch-adapters.js +293 -0
  1834. package/scripts/minify-release.mjs +115 -0
  1835. package/scripts/postinstall.js +174 -0
  1836. package/scripts/silent-column-drop-baseline.json +910 -0
  1837. package/scripts/typed-error-lint-baseline.json +1098 -0
  1838. package/skills/opencli-adapter-author/SKILL.md +256 -0
  1839. package/skills/opencli-adapter-author/references/adapter-template.md +471 -0
  1840. package/skills/opencli-adapter-author/references/api-discovery.md +295 -0
  1841. package/skills/opencli-adapter-author/references/coverage-matrix.md +81 -0
  1842. package/skills/opencli-adapter-author/references/field-conventions.md +172 -0
  1843. package/skills/opencli-adapter-author/references/field-decode-playbook.md +181 -0
  1844. package/skills/opencli-adapter-author/references/jsdom-fixture-pattern.md +196 -0
  1845. package/skills/opencli-adapter-author/references/output-design.md +149 -0
  1846. package/skills/opencli-adapter-author/references/site-memory/bilibili.md +70 -0
  1847. package/skills/opencli-adapter-author/references/site-memory/eastmoney.md +70 -0
  1848. package/skills/opencli-adapter-author/references/site-memory/tonghuashun.md +51 -0
  1849. package/skills/opencli-adapter-author/references/site-memory/xueqiu.md +58 -0
  1850. package/skills/opencli-adapter-author/references/site-memory.md +231 -0
  1851. package/skills/opencli-adapter-author/references/site-recon.md +134 -0
  1852. package/skills/opencli-adapter-author/references/strategy-selection.md +169 -0
  1853. package/skills/opencli-adapter-author/references/success-rate-pitfalls.md +162 -0
  1854. package/skills/opencli-adapter-author/references/typed-errors.md +234 -0
  1855. package/skills/opencli-autofix/SKILL.md +297 -0
  1856. package/skills/opencli-browser/SKILL.md +468 -0
  1857. package/skills/opencli-browser-sitemap/SKILL.md +96 -0
  1858. package/skills/opencli-sitemap-author/SKILL.md +161 -0
  1859. package/skills/opencli-sitemap-author/references/sitemap-schema.md +660 -0
  1860. package/skills/opencli-usage/SKILL.md +168 -0
@@ -0,0 +1,34 @@
1
+ import{CommandExecutionError as O}from"@jackwener/opencli/errors";import{normalizeContent as H}from"./format.js";import{assertLiteralContent as C}from"../content-guard.js";import{inlineLocalImages as U,isLocalImagePath as I,localImageToDataUri as E}from"./images.js";import{PAGE_RUNTIME as S}from"./page-runtime.js";export function selectContent(K,Q,X="auto"){const Z=H(K,{format:X});return Q.outputFormat==="markdown"?Z.markdown:Z.html}export function originReFromHome(K){let Q="";try{Q=new URL(K).host}catch(Z){Q=""}return"^https?://([^/]*\\.)?"+Q.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+"(/|$)"}export async function gotoWritePage(K,Q,X){const Z=X||originReFromHome(Q);for(let G=0;G<8;G++){await K.goto(Q);await K.wait({time:1});const D=await K.evaluate(`(() => {
2
+ var href = ''; try { href = location.href; } catch (e) {}
3
+ var onSite = new RegExp(${JSON.stringify(Z)}).test(href);
4
+ var cookieOk = true; try { void document.cookie; } catch (e) { cookieOk = false; }
5
+ return { href: href, onSite: onSite, cookieOk: cookieOk };
6
+ })()`);if(D&&D.onSite&&D.cookieOk)return;await K.wait({time:1})}throw new O(`无法在浏览器中打开已登录的写作页(页面停留在空白页,未落到 ${Q})。`+"请确认登录该平台的 Chrome 已连接 opencli 浏览器桥。")}export function buildPublishJs(K,Q,X){return`(async () => {
7
+ `+S+`
8
+ const I = `+JSON.stringify(K)+`;
9
+ const __publish = (`+Q+`);
10
+ `+(X?"const __upload = ("+X+`);
11
+ `:"")+`const __content0 = I.content;
12
+ let content = I.content;
13
+ if (I.outputFormat === "html" && I.preprocessConfig) content = PP.preprocess(content, I.preprocessConfig);
14
+ `+(X?`const __t = await PP.processImagesWith(content, (src) => __upload(src, PP), { skip: I.imageSkip, allowRelative: I.imageAllowRelative });
15
+ `:`const __t = await PP.transferImages(content, I.imageSpec, I.imageSkip);
16
+ `)+`content = __t.content;
17
+ if (I.publishParams && typeof I.publishParams.cover === "string" && I.publishParams.cover) {
18
+ var __cvWrap = '<img src="' + I.publishParams.cover + '">';
19
+ `+(X?` var __cv = await PP.processImagesWith(__cvWrap, (src) => __upload(src, PP), { skip: I.imageSkip, allowRelative: I.imageAllowRelative });
20
+ `:` var __cv = await PP.transferImages(__cvWrap, I.imageSpec, I.imageSkip);
21
+ `)+` if (__cv.failed.length) {
22
+ `+` return { ok: false, stage: "cover", message: "封面图转存失败:" + __cv.failed[0].error, uploaded: __t.uploaded, failed: __t.failed.concat(__cv.failed) };
23
+ `+` }
24
+ if (__cv.uploaded.length) I.publishParams.cover = __cv.uploaded[0].url;
25
+ __t.uploaded = __t.uploaded.concat(__cv.uploaded);
26
+ }
27
+ const __pub = await __publish({ title: I.title, content: content, markdown: I.markdown != null ? I.markdown : (I.outputFormat === "markdown" ? __content0 : null), html: I.html != null ? I.html : (I.outputFormat === "html" ? __content0 : null), draftOnly: I.draftOnly, params: I.publishParams }, PP);
28
+ var __upN = (__t.uploaded || []).concat((__pub && __pub.uploaded) || []);
29
+ var __failN = (__t.failed || []).concat((__pub && __pub.failed) || []);
30
+ if (!__pub || __pub.ok === false) {
31
+ return { ok: false, stage: (__pub && __pub.stage) || "publish", status: __pub && __pub.status, message: (__pub && __pub.message) || "publish failed", detail: __pub && __pub.detail, uploaded: __upN, failed: __failN };
32
+ }
33
+ return { ok: true, id: String(__pub.id == null ? "" : __pub.id), url: __pub.url || "", draft: !!__pub.draft, uploaded: __upN, failed: __failN };
34
+ })()`}export async function publishArticle(K,Q){const{title:X,body:Z,format:G="auto",draftOnly:D=!1,profile:q,publishParams:k=null}=Q;if(!q)throw Error("publishArticle: profile is required");if(!q.home)throw Error("publishArticle: profile.home is required");if(typeof q.publish!=="function")throw Error("publishArticle: profile.publish must be a function");C(Z,{fileFlag:"--file"});const W=H(Z,{format:G}),w=q.outputFormat==="markdown"||q.needsMarkdown===!0,L=q.outputFormat==="html"||q.needsHtml===!0,_=w?await U(W.markdown):{content:null,missing:[]},z=L?await U(W.html):{content:null,missing:[]},A=_.content,J=z.content,y=q.outputFormat==="markdown"?A:J,N=[],T=new Set;for(const V of[..._.missing,...z.missing]){if(T.has(V.src))continue;T.add(V.src);N.push(V)}let Y=k;if(Y&&typeof Y.cover==="string"&&Y.cover){const V=Y.cover.trim();if(/["<>\s]/.test(V))throw new O("封面图路径/URL 含非法字符(引号/尖括号/空白):"+V.slice(0,120));if(I(V))try{const{dataUri:$}=await E(V);Y={...Y,cover:$}}catch($){throw new O("封面图读取失败:"+V+"("+String($&&$.message||$)+")")}else Y={...Y,cover:V}}await gotoWritePage(K,q.home,q.originRe);const R={title:X,content:y,markdown:q.needsMarkdown===!0&&q.outputFormat!=="markdown"?A:null,html:q.needsHtml===!0&&q.outputFormat!=="html"?J:null,draftOnly:!!D,outputFormat:q.outputFormat,preprocessConfig:q.preprocessConfig||null,imageSpec:q.image?.spec||null,imageSkip:q.image?.skip||[],imageAllowRelative:q.image?.allowRelative===!0,publishParams:Y},j=typeof q.image?.uploadFn==="function"?q.image.uploadFn.toString():null,x=buildPublishJs(R,q.publish.toString(),j),B=await K.evaluate(x);if(!B||B.ok===!1){const V=B?.stage||"publish",$=B?.status!=null?` (HTTP ${B.status})`:"",M=B?.detail!=null?`;接口原始响应:${typeof B.detail==="string"?B.detail:JSON.stringify(B.detail)}`:"";throw new O(`[${V}] ${B?.message||"发布失败"}${$}${M}`)}return{id:B.id,url:B.url,draft:B.draft,images:{uploaded:B.uploaded||[],failed:(B.failed||[]).concat(N)}}}export const __test__={selectContent,originReFromHome,buildPublishJs,publishArticle};
@@ -0,0 +1 @@
1
+ import{ArgumentError as G}from"@jackwener/opencli/errors";export function clamp(B,q,y){return Math.max(q,Math.min(B,y))}export function clampInt(B,q,y,D){const F=Number(B);if(!Number.isFinite(F))return q;return clamp(Math.floor(F),y,D)}export function normalizeNumericId(B,q,y){const D=String(B??"").trim();if(!/^\d+$/.test(D))throw new G(`${q} must be a numeric ID`,`Pass a numeric ${q}, for example: ${y}`);return D}export function requireNonEmptyQuery(B,q="query"){const y=String(B??"").trim();if(!y)throw new G(`${q} cannot be empty`);return y}
@@ -0,0 +1 @@
1
+ import*as J from"node:fs";import*as K from"node:os";import{ArgumentError as G}from"@jackwener/opencli/errors";const M=/^@(?:\/|~\/|\.{1,2}\/)\S+$/,N=/^(?:\/|~\/)\S+$/;function O(y){return y.startsWith("~/")?`${K.homedir()}/${y.slice(2)}`:y}export function assertLiteralContent(y,{fileFlag:C=null,label:q="正文"}={}){const h=String(y??"").trim();if(!h)return h;const D=C?(z)=>`请改用 ${C} ${z},或把文件内容读出来作为${q}传入`:()=>`本命令没有文件参数,请把文件内容读出来作为${q}传入`;if(M.test(h))throw new G(`${q} "${h}" 看起来是文件引用——命令不会展开 @路径,照发会把这串字面量当${q}。${D(h.slice(1))}`);if(N.test(h)){let z=!1;try{z=J.statSync(O(h)).isFile()}catch{}if(z)throw new G(`${q} "${h}" 是一个本机已存在的文件路径——照发会把这串路径当${q}发出去。${D(h)}`)}return h}
@@ -0,0 +1 @@
1
+ import*as G from"node:fs";import{cli as H,Strategy as I}from"@jackwener/opencli/registry";export function makeScreenshotCommand(b,q,A={}){return H({...A,site:b,name:"screenshot",access:"read",description:`Capture a snapshot of the current ${q??b} window (DOM + Accessibility tree)`,domain:"localhost",strategy:I.UI,browser:!0,args:[{name:"output",required:!1,help:`Output file path (default: /tmp/${b}-snapshot.txt)`}],columns:["Status","File"],func:async(z,B)=>{const E=B.output||`/tmp/${b}-snapshot.txt`,J=await z.snapshot({compact:!0}),Q=await z.evaluate("document.documentElement.outerHTML"),K=E.replace(/\.\w+$/,"")+"-dom.html",L=E.replace(/\.\w+$/,"")+"-a11y.txt";G.writeFileSync(K,Q);G.writeFileSync(L,typeof J==="string"?J:JSON.stringify(J,null,2));return[{Status:"Success",File:K},{Status:"Success",File:L}]}})}export function makeStatusCommand(b,q,A={}){return H({...A,site:b,name:"status",access:"read",description:`Check active CDP connection to ${q??b}`,domain:"localhost",strategy:I.UI,browser:!0,columns:["Status","Url","Title"],func:async(z)=>{const B=await z.evaluate("window.location.href"),E=await z.evaluate("document.title");return[{Status:"Connected",Url:B,Title:E}]}})}export function makeNewCommand(b,q,A={}){return H({...A,site:b,name:"new",access:"write",description:`Start a new ${q??b} session`,domain:"localhost",strategy:I.UI,browser:!0,columns:["Status"],func:async(z)=>{const B=process.platform==="darwin";await z.pressKey(B?"Meta+N":"Control+N");await z.wait(1);return[{Status:"Success"}]}})}export function makeDumpCommand(b){return H({site:b,name:"dump",access:"read",description:`Dump the DOM and Accessibility tree of ${b} for reverse-engineering`,domain:"localhost",strategy:I.UI,browser:!0,columns:["action","files"],func:async(q)=>{const A=await q.evaluate("document.body.innerHTML");G.writeFileSync(`/tmp/${b}-dom.html`,A);const C=await q.snapshot({interactive:!1});G.writeFileSync(`/tmp/${b}-snapshot.json`,JSON.stringify(C,null,2));return[{action:"Dom extraction finished",files:`/tmp/${b}-dom.html, /tmp/${b}-snapshot.json`}]}})}
@@ -0,0 +1 @@
1
+ import{ArgumentError as u,CommandExecutionError as c,EmptyResultError as a}from"@jackwener/opencli/errors";export function requireSearchQuery(r,t="keyword"){const e=String(r??"").trim();if(!e)throw new u(`${t} cannot be empty`);return e}export function requireBoundedInteger(r,t,e,n,o){const s=r??t,i=typeof s==="number"?s:Number(s);if(!Number.isInteger(i))throw new u(`${o} must be an integer between ${e} and ${n}, got ${JSON.stringify(r)}`);if(i<e||i>n)throw new u(`${o} must be between ${e} and ${n}, got ${i}`);return i}export function requireNonNegativeInteger(r,t,e){const n=r??t,o=typeof n==="number"?n:Number(n);if(!Number.isInteger(o)||o<0)throw new u(`${e} must be a non-negative integer, got ${JSON.stringify(r)}`);return o}export function unwrapBrowserResult(r){if(r&&typeof r==="object"&&!Array.isArray(r)&&"session"in r&&"data"in r)return r.data;return r}export function requireRows(r,t){const e=unwrapBrowserResult(r);if(!Array.isArray(e))throw new c(`${t} returned an unexpected payload shape; expected an array of result rows.`);return e}export function toHttpsUrl(r,t){const e=String(r??"").trim();if(!e)return"";try{const n=new URL(e,t);if(n.protocol!=="http:"&&n.protocol!=="https:")return"";return n.href}catch{return""}}export function emptySearchResults(r,t){return new a(`${r} search`,`No ${r} results matched "${t}".`)}export async function runBrowserStep(r,t){try{return await t()}catch(e){if(e?.code||e?.name==="ArgumentError")throw e;throw new c(`${r} failed: ${e?.message??e}`)}}
@@ -0,0 +1 @@
1
+ import{AuthRequiredError as q,TimeoutError as z,getErrorMessage as N}from"@jackwener/opencli/errors";import{cli as $,Strategy as Q}from"@jackwener/opencli/registry";const V=300,b=2000;function D(v,x){const G=x&&typeof x==="object"&&!Array.isArray(x)?x:{};return{logged_in:!0,site:v,...G}}function j(v){return v instanceof q}async function Y(v,x,G){const K=G==="poll"&&v.poll?v.poll:v.verify;return D(v.site,await K(x,{phase:G}))}async function J(v){if(typeof v?.closeWindow==="function")try{await v.closeWindow()}catch{}}function F(v){return`Run \`opencli ${v.site} login\` to open the login page, then retry.`}function H(v){return["logged_in","site",...v.columns??["id","username","name"]]}function I(v){if(typeof v==="boolean")return{logged_in:v};if(v&&typeof v==="object"&&!Array.isArray(v))return{logged_in:!!v.logged_in,...v};return{logged_in:!1}}function P(v){if(v&&typeof v==="object"&&!Array.isArray(v))return v;return{touched:!0}}export function registerSiteAuthCommands(v){if(!v?.site||!v?.domain||!v?.loginUrl||typeof v.verify!=="function")throw Error("registerSiteAuthCommands requires site, domain, loginUrl, and verify(page)");$({site:v.site,name:"whoami",access:"read",description:v.whoamiDescription??`Show the current logged-in ${v.site} account`,domain:v.domain,strategy:Q.COOKIE,browser:!0,navigateBefore:!1,siteSession:"persistent",args:[],columns:H(v),authStatus:{...typeof v.quickCheck==="function"?{quickCheck:async(x)=>I(await v.quickCheck(x))}:{},...v.quickCheckRequiresNavigation===!0?{quickCheckRequiresNavigation:!0}:{},...typeof v.refresh==="function"?{refresh:async(x,G)=>P(await v.refresh(x,G))}:{}},func:async(x)=>Y(v,x,"identity")});$({site:v.site,name:"login",access:"write",description:v.loginDescription??`Open ${v.site} login and wait until the browser session is authenticated`,domain:v.domain,strategy:Q.COOKIE,browser:!0,navigateBefore:!1,defaultWindowMode:"foreground",siteSession:"persistent",args:[{name:"timeout",type:"int",default:V,help:"Maximum seconds to wait for the user to finish login"}],columns:["status",...H(v)],func:async(x,G)=>{try{const B={status:"already_logged_in",...await Y(v,x,"identity")};await J(x);return B}catch(B){if(!j(B)){await J(x);throw B}}await x.goto(v.loginUrl);const K=Number(G.timeout??V),Z=Date.now()+K*1000;let X="";while(Date.now()<Z){await x.wait(Math.min(b/1000,Math.max(0.2,(Z-Date.now())/1000)));try{const B=await Y(v,x,"poll");await J(x);return{status:"login_complete",...B}}catch(B){if(!j(B)){await J(x);throw B}X=N(B)}}await J(x);throw new z(`${v.site} login`,K,X?`${F(v)} Last auth check: ${X}`:F(v))}})}
@@ -0,0 +1,2 @@
1
+ import*as D from"node:fs";import*as O from"node:os";import*as K from"node:path";import{cli as L,Strategy as M}from"@jackwener/opencli/registry";import{ArgumentError as Q,AuthRequiredError as T}from"@jackwener/opencli/errors";function I(b){return K.join(O.homedir(),".opencli","sites",b,"credentials.json")}export function loadCredentials(b){try{return JSON.parse(D.readFileSync(I(b),"utf8"))}catch(x){if(x&&x.code==="ENOENT")return null;throw x}}export function saveCredentials(b,x){const z=I(b);D.mkdirSync(K.dirname(z),{recursive:!0});D.writeFileSync(z,`${JSON.stringify(x,null,2)}
2
+ `,{mode:384});try{D.chmodSync(z,384)}catch{}}export function clearCredentials(b){try{D.rmSync(I(b));return!0}catch(x){if(x&&x.code==="ENOENT")return!1;throw x}}export function requireCredentials(b){const x=loadCredentials(b);if(!x)throw new T(b,`${b} not configured. Run \`opencli ${b} login\` with your credentials first.`);return x}export function registerTokenAuth(b){if(!b?.site||!b?.domain||!Array.isArray(b.fields)||typeof b.validate!=="function")throw Error("registerTokenAuth requires site, domain, fields[], and validate(creds)");const x=b.identityColumns??["id","username","name"];L({site:b.site,name:"whoami",access:"read",description:b.whoamiDescription??`Show the configured ${b.site} account`,domain:b.domain,strategy:M.LOCAL,browser:!1,args:[],columns:["logged_in","site",...x],func:async()=>{const z=requireCredentials(b.site),F=await b.validate(z);return{logged_in:!0,site:b.site,...F}}});L({site:b.site,name:"login",access:"write",description:b.loginDescription??`Configure ${b.site} credentials (token/key based, no browser). Pass each field as a flag.`,domain:b.domain,strategy:M.LOCAL,browser:!1,args:b.fields.map((z)=>({name:z.name,type:"string",required:!1,help:z.help??`${b.site} ${z.name}`,...z.default!==void 0?{default:z.default}:{}})),columns:["status","logged_in","site",...x],func:async(z)=>{const F=loadCredentials(b.site)??{},G={};for(const B of b.fields){const H=z[B.name]??F[B.name]??B.default;if(H!==void 0&&H!==null&&H!=="")G[B.name]=H}const J=b.fields.filter((B)=>B.required!==!1&&G[B.name]===void 0);if(J.length)throw new Q(`Missing required credential(s): ${J.map((B)=>`--${B.name}`).join(", ")}`,`Run \`opencli ${b.site} login -h\` to see all fields.`);const N=await b.validate(G);saveCredentials(b.site,G);return{status:Object.keys(F).length?"updated":"login_complete",logged_in:!0,site:b.site,...N}}})}
@@ -0,0 +1,62 @@
1
+ import*as Z from"node:fs";import*as L from"node:path";import{ArgumentError as J,CommandExecutionError as Y}from"@jackwener/opencli/errors";export const SUPPORTED_VIDEO_EXTENSIONS=new Set([".mp4",".mov",".avi",".mkv",".m4v",".webm",".flv",".wmv"]),SUPPORTED_IMAGE_EXTENSIONS=new Set([".jpg",".jpeg",".png",".webp",".bmp"]);export function parseScheduleDate(q){if(q==null||q==="")return null;const y=String(q),z=/^\d+$/.test(y)?new Date(Number(y)<1000000000000?Number(y)*1000:Number(y)):new Date(y);if(Number.isNaN(z.getTime()))throw new J(`无法解析定时时间: ${q}`);if(z.getTime()<=Date.now())throw new J("定时发布时间必须晚于当前时间");return z}export function unwrap(q){if(q&&typeof q==="object"&&"data"in q&&"session"in q)return q.data;return q}export async function evalPage(q,y){return unwrap(await q.evaluate(y))}export function sleep(q){return new Promise((y)=>setTimeout(y,q*1000))}export function resolveVideoFile(q){const y=L.resolve(String(q));let z;try{z=Z.statSync(y)}catch{throw new J(`视频文件不存在: ${y}`)}if(!z.isFile())throw new J(`视频路径不是文件: ${y}`);const B=L.extname(y).toLowerCase();if(!SUPPORTED_VIDEO_EXTENSIONS.has(B))throw new J(`不支持的视频格式: ${B}(支持 ${[...SUPPORTED_VIDEO_EXTENSIONS].join("/")})`);return y}export function resolveImageFile(q){const y=L.resolve(String(q));let z;try{z=Z.statSync(y)}catch{throw new J(`图片文件不存在: ${y}`)}if(!z.isFile())throw new J(`图片路径不是文件: ${y}`);const B=L.extname(y).toLowerCase();if(!SUPPORTED_IMAGE_EXTENSIONS.has(B))throw new J(`不支持的图片格式: ${B}(支持 ${[...SUPPORTED_IMAGE_EXTENSIONS].join("/")})`);return y}export function throwIfFileAccessDenied(q){if(!(q instanceof Error?q.message:String(q)).includes("Not allowed"))return;throw new Y("Chrome 拦截了扩展读取本地文件(DOM.setFileInputFiles → Not allowed):商店安装的扩展默认没有本地文件访问权限","请让用户在 Chrome 打开 chrome://extensions,找到「OpenCLI Browser Bridge」→「详情」→ 打开「允许访问文件网址」(Allow access to file URLs),开关即时生效,然后重试本命令")}export async function setVideoInput(q,y,z){if(!q.setFileInput)throw new Y("浏览器扩展不支持 CDP 文件上传(set-file-input),无法上传视频;请升级 PublishPort 客户端/扩展");let B;for(const H of y)try{await q.setFileInput(z,H);return H}catch(K){throwIfFileAccessDenied(K);B=K}throw new Y(`未找到可用的文件上传输入框(尝试过: ${y.join(" , ")}):${B instanceof Error?B.message:String(B)}`)}export async function currentUrl(q){try{if(q.getCurrentUrl){const y=await q.getCurrentUrl();if(y)return String(y)}}catch{}try{return String(await evalPage(q,"() => location.href")||"")}catch{return""}}export async function waitForUrlIncludes(q,y,z=60000,B=500){const H=Array.isArray(y)?y:[y],K=Date.now()+z;while(Date.now()<K){const Q=await currentUrl(q);if(Q&&H.some(($)=>Q.includes($)))return!0;await q.wait({time:B/1000})}return!1}export async function countByText(q,y){return Number(unwrap(await q.evaluate(`
2
+ ((want) => {
3
+ let n = 0;
4
+ const nodes = document.querySelectorAll('body *');
5
+ for (const el of nodes) {
6
+ if (el.children.length) continue;
7
+ const t = (el.innerText || el.textContent || '').trim();
8
+ if (t && t.includes(want)) {
9
+ const r = el.getBoundingClientRect();
10
+ if (r.width > 0 && r.height > 0) n += 1;
11
+ }
12
+ }
13
+ return n;
14
+ })(${JSON.stringify(y)})
15
+ `)))||0}export async function clickByText(q,y,{exact:z=!1,timeoutMs:B=0,pollMs:H=500}={}){const K=Date.now()+Math.max(0,B);for(;;){if(Boolean(unwrap(await q.evaluate(`
16
+ ((want, exact) => {
17
+ const norm = (v) => (v || '').replace(/\\s+/g, ' ').trim();
18
+ const isVisible = (el) => {
19
+ if (!el || el.offsetParent === null) return false;
20
+ const r = el.getBoundingClientRect();
21
+ return r.width > 0 && r.height > 0;
22
+ };
23
+ const nodes = Array.from(document.querySelectorAll('button, [role="button"], a, label, li, span, div, p'));
24
+ const matches = nodes.filter((n) => {
25
+ if (!isVisible(n)) return false;
26
+ const t = norm(n.innerText || n.textContent);
27
+ return exact ? t === want : (t && t.includes(want));
28
+ });
29
+ // Prefer the innermost match (deepest node) so the real handler fires.
30
+ const innermost = matches.filter((n) => !matches.some((o) => o !== n && n.contains(o)));
31
+ const ordered = innermost.length ? innermost : matches;
32
+ for (const node of ordered) {
33
+ const clickable = node.closest('button, [role="button"], a, label') || node;
34
+ if (clickable.disabled) continue;
35
+ clickable.click();
36
+ return true;
37
+ }
38
+ return false;
39
+ })(${JSON.stringify(y)}, ${z?"true":"false"})
40
+ `))))return!0;if(Date.now()>=K)return!1;await q.wait({time:H/1000})}}export async function existsByText(q,y,{exact:z=!1}={}){return Boolean(unwrap(await q.evaluate(`
41
+ ((want, exact) => {
42
+ const norm = (v) => (v || '').replace(/\\s+/g, ' ').trim();
43
+ const isVisible = (el) => {
44
+ if (!el || el.offsetParent === null) return false;
45
+ const r = el.getBoundingClientRect();
46
+ return r.width > 0 && r.height > 0;
47
+ };
48
+ for (const n of document.querySelectorAll('body *')) {
49
+ if (!isVisible(n)) continue;
50
+ const t = norm(n.innerText || n.textContent);
51
+ if (exact ? t === want : (t && t.includes(want))) return true;
52
+ }
53
+ return false;
54
+ })(${JSON.stringify(y)}, ${z?"true":"false"})
55
+ `)))}export async function waitForSelector(q,y,z=30000,B=500){const H=Date.now()+z;while(Date.now()<H){if(Boolean(unwrap(await q.evaluate(`
56
+ ((sel) => {
57
+ const el = document.querySelector(sel);
58
+ if (!el) return false;
59
+ const r = el.getBoundingClientRect();
60
+ return r.width > 0 && r.height > 0;
61
+ })(${JSON.stringify(y)})
62
+ `))))return!0;await q.wait({time:B/1000})}return!1}
@@ -0,0 +1,31 @@
1
+ import{cli as h,Strategy as f}from"@jackwener/opencli/registry";import{ArgumentError as c,CommandExecutionError as s,EmptyResultError as d,getErrorMessage as b}from"@jackwener/opencli/errors";const g="https://www.aibase.com/zh/daily",a=20,o=50;function l(e){const r=Number(e??a);if(!Number.isInteger(r)||r<=0)throw new c("limit must be a positive integer",`Example: opencli aibase news --limit ${a}`);if(r>o)throw new c(`limit must be <= ${o}`,`Example: opencli aibase news --limit ${o}`);return r}function u(e){return String(e??"").replace(/\s+/g," ").trim()}function m(){return`
2
+ (() => {
3
+ const anchors = Array.from(document.querySelectorAll('.bg-white .grid a[href], a[href*="/zh/daily/"]'))
4
+ .filter((anchor) => {
5
+ const href = anchor.getAttribute('href') || '';
6
+ const text = (anchor.innerText || anchor.textContent || '').trim();
7
+ return text && href && !href.endsWith('/zh/daily') && !href.endsWith('/zh/daily/');
8
+ });
9
+ if (anchors.length === 0) {
10
+ return {
11
+ ok: false,
12
+ reason: 'selector-missing',
13
+ title: document.title || '',
14
+ bodyText: (document.body?.innerText || document.body?.textContent || '').slice(0, 500),
15
+ };
16
+ }
17
+ const seen = new Set();
18
+ const rows = [];
19
+ for (const anchor of anchors) {
20
+ const url = new URL(anchor.getAttribute('href'), location.href).href;
21
+ if (seen.has(url)) continue;
22
+ seen.add(url);
23
+ rows.push({
24
+ rank: rows.length + 1,
25
+ title: anchor.innerText || anchor.textContent || '',
26
+ url,
27
+ });
28
+ }
29
+ return { ok: true, rows };
30
+ })()
31
+ `}function w(e,i){if(!e||typeof e!=="object")throw new s("AIbase daily page returned an unreadable payload");if(!e.ok){const t=typeof e.reason==="string"&&e.reason.trim()?e.reason.trim():"selector-drift";throw new s(`AIbase daily selector drift: ${t}`,e.title?`Page title: ${e.title}`:void 0)}const r=(Array.isArray(e.rows)?e.rows:[]).map((t,n)=>({rank:n+1,title:u(t.title),url:u(t.url)})).filter((t)=>t.title&&t.url);if(r.length===0)throw new d("aibase news","AIbase daily page loaded, but no article rows with title and URL were extracted.");return r.slice(0,i).map((t,n)=>({...t,rank:n+1}))}async function A(e,i){const r=l(i.limit);await e.goto(g,{waitUntil:"load",settleMs:3000});const t=await e.evaluate(m()).catch((n)=>{throw new s(`Failed to extract AIbase daily news: ${b(n)}`)});return w(t,r)}export const aibaseNewsCommand=h({site:"aibase",name:"news",access:"read",description:"AIbase 日报 - 每天三分钟关注AI行业趋势",domain:"www.aibase.com",strategy:f.PUBLIC,browser:!0,args:[{name:"limit",type:"int",default:a,help:`Number of news items to return (max ${o})`}],columns:["rank","title","url"],func:A}),__test__={buildExtractAibaseNewsJs:m,normalizeLimit:l,toRows:w};
@@ -0,0 +1,19 @@
1
+ import{AuthRequiredError as i,CommandExecutionError as r}from"@jackwener/opencli/errors";import{registerSiteAuthCommands as s}from"../_shared/site-auth.js";async function a(n){const e=await n.getCookies({url:"https://www.amazon.com"}),o=new Set(e.filter((t)=>t.value).map((t)=>t.name));return o.has("at-main")||o.has("x-main")}async function m(n){if(!await a(n))throw new i("amazon.com","Amazon auth cookies (at-main / x-main) are missing");await n.goto("https://www.amazon.com/",{waitUntil:"load"});await n.wait(3);const e=await n.evaluate(`
2
+ (() => {
3
+ const navLink = document.querySelector('#nav-link-accountList');
4
+ if (!navLink) {
5
+ return { kind: 'auth', detail: 'Amazon header missing nav-link-accountList — layout changed or robot challenge' };
6
+ }
7
+ const greeting = (navLink.querySelector('.nav-line-1, #nav-link-accountList-nav-line-1') || {}).textContent || '';
8
+ const trimmed = greeting.trim();
9
+ if (/sign\\s*in/i.test(trimmed)) {
10
+ return { kind: 'auth', detail: 'Amazon header shows "Hello, sign in" — anonymous' };
11
+ }
12
+ const m = trimmed.match(/^Hello,?\\s+(.+)$/i);
13
+ const name = m ? m[1].trim() : '';
14
+ if (!name) {
15
+ return { kind: 'auth', detail: 'Amazon greeting unparseable: ' + trimmed };
16
+ }
17
+ return { ok: true, user_name: name };
18
+ })()
19
+ `);if(e?.kind==="auth")throw new i("amazon.com",e.detail);if(!e?.ok)throw new r(`Unexpected Amazon probe: ${JSON.stringify(e)}`);return{user_name:e.user_name}}s({site:"amazon",domain:"amazon.com",loginUrl:"https://www.amazon.com/ap/signin?openid.return_to=https%3A%2F%2Fwww.amazon.com%2F&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.assoc_handle=usflex&openid.mode=checkid_setup&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0",columns:["user_name"],quickCheck:a,verify:m,poll:async(n)=>{if(!await a(n))throw new i("amazon.com","Waiting for Amazon at-main / x-main cookie");return m(n)}});
@@ -0,0 +1 @@
1
+ import{cli as e}from"@jackwener/opencli/registry";import{createRankingCliOptions as s}from"./rankings.js";e(s({commandName:"bestsellers",access:"read",listType:"bestsellers",description:"Amazon Best Sellers pages for category candidate discovery"}));
@@ -0,0 +1,20 @@
1
+ import{AuthRequiredError as x,CommandExecutionError as m}from"@jackwener/opencli/errors";import{cli as p,Strategy as y}from"@jackwener/opencli/registry";import{buildProductUrl as S,buildDiscussionUrl as v,buildProvenance as q,cleanText as r,extractAsin as C,normalizeProductUrl as b,parseRatingValue as _,parseReviewCount as k,trimRatingPrefix as z,uniqueNonEmpty as A,assertUsableState as w,gotoAndReadState as h}from"./shared.js";function g(e){const t=r(e.href)||v(e.href??""),a=C(e.href??"")??null,s=r(e.average_rating_text)||null,i=r(e.total_review_count_text)||null,n=q(t);return{asin:a,product_url:a?b(a):null,discussion_url:t,...n,average_rating_text:s,average_rating_value:_(s),total_review_count_text:i,total_review_count:k(i),qa_urls:A(e.qa_links??[]),review_samples:(e.review_samples??[]).map((o)=>({title:z(o.title)||null,rating_text:r(o.rating_text)||null,rating_value:_(o.rating_text),author:r(o.author)||null,date_text:r(o.date_text)||null,body:r(o.body)||null,verified_purchase:o.verified===!0}))}}function c(e){return Boolean(r(e.average_rating_text)||r(e.total_review_count_text))}function u(e){const t=r(e.href).toLowerCase(),a=r(e.title).toLowerCase();return t.includes("/ap/signin")||a.includes("amazon sign-in")}async function f(e,t){return await e.evaluate(`
2
+ (() => ({
3
+ href: window.location.href,
4
+ title: document.title || '',
5
+ average_rating_text: document.querySelector('[data-hook="rating-out-of-text"]')?.textContent || '',
6
+ total_review_count_text: document.querySelector('[data-hook="total-review-count"]')?.textContent || '',
7
+ qa_links: Array.from(document.querySelectorAll('a[href*="ask/questions"]')).map((anchor) => anchor.href || ''),
8
+ review_samples: Array.from(document.querySelectorAll('[data-hook="review"]')).slice(0, ${t}).map((card) => ({
9
+ title: card.querySelector('[data-hook="review-title"]')?.textContent || '',
10
+ rating_text:
11
+ card.querySelector('[data-hook="review-star-rating"]')?.textContent
12
+ || card.querySelector('[data-hook="cmps-review-star-rating"]')?.textContent
13
+ || '',
14
+ author: card.querySelector('.a-profile-name')?.textContent || '',
15
+ date_text: card.querySelector('[data-hook="review-date"]')?.textContent || '',
16
+ body: card.querySelector('[data-hook="review-body"]')?.textContent || '',
17
+ verified: !!card.querySelector('[data-hook="avp-badge"]'),
18
+ })),
19
+ }))()
20
+ `)}async function P(e,t,a){const s=v(t),i=await h(e,s,2500,"discussion");w(i,"discussion");const n=await f(e,a);if(c(n))return n;const o=S(t),l=await h(e,o,2500,"discussion");w(l,"discussion");if(u(i)&&u(l))throw new x("amazon.com","Amazon review discussion requires an active signed-in Amazon session in the shared Chrome profile.");const d=await f(e,a);if(c(d))return d;if(u(i))throw new m("amazon review page redirected to sign-in and product page fallback did not expose review summary","Open the product page in Chrome, verify reviews are visible, and retry.");return n}p({site:"amazon",name:"discussion",access:"read",description:"Amazon review summary and sample customer discussion from product review pages",domain:"amazon.com",strategy:y.COOKIE,navigateBefore:!1,args:[{name:"input",required:!0,positional:!0,help:"ASIN or product URL, for example B0FJS72893"},{name:"limit",type:"int",default:10,help:"Maximum number of review samples to return (default 10)"}],columns:["asin","average_rating_value","total_review_count"],func:async(e,t)=>{const a=String(t.input??""),s=Math.max(1,Number(t.limit)||10),i=await P(e,a,s),n=g(i);if(!n.average_rating_text&&!n.total_review_count_text)throw new m("amazon discussion page did not expose review summary","The review page may have changed or hit a robot check. Open the review page in Chrome and retry.");return[n]}});export const __test__={normalizeDiscussionPayload:g,hasDiscussionSummary:c,isSignInState:u};
@@ -0,0 +1 @@
1
+ import{cli as r}from"@jackwener/opencli/registry";import{createRankingCliOptions as s}from"./rankings.js";r(s({commandName:"movers-shakers",access:"read",listType:"movers_shakers",description:"Amazon Movers & Shakers pages for short-term growth signals"}));
@@ -0,0 +1 @@
1
+ import{cli as e}from"@jackwener/opencli/registry";import{createRankingCliOptions as s}from"./rankings.js";e(s({commandName:"new-releases",access:"read",listType:"new_releases",description:"Amazon New Releases pages for early momentum discovery"}));
@@ -0,0 +1,29 @@
1
+ import{CommandExecutionError as $}from"@jackwener/opencli/errors";import{cli as L,Strategy as _}from"@jackwener/opencli/registry";import{buildProductUrl as Y,buildProvenance as j,cleanText as K,extractAsin as U,isAmazonEntity as M,normalizeProductUrl as C,PRIMARY_PRICE_SELECTORS as I,parsePriceText as k,assertUsableState as B,gotoAndReadState as O}from"./shared.js";const R=["#sellerProfileTriggerId","#shipsFromSoldByInsideBuyBox_feature_div","#fulfillerInfoFeature_feature_div","#merchantInfoFeature_feature_div","#tabular-buybox-container","#merchant-info"].join(", ");function W(q){const H=K(q).split(" ").filter(Boolean),G=[];for(const J of H){if(G[G.length-1]===J)continue;G.push(J)}return G.join(" ")}function Q(q){const G=K(q).match(/Ships from\s+(.+?)(?=Sold by|and Fulfilled by|$)/i);return G?W(G[1].replace(/Ships from/ig,"")):null}function V(q){const G=K(q).match(/Sold by\s+(.+?)(?=and Fulfilled by|Ships from|$)/i);return G?W(G[1]):null}function D(q){const H=K(q).toLowerCase();return H.includes("cannot be shipped to your selected delivery location")||H.includes("similar items shipping to")||H.includes("deliver to hong kong")}function v(q){const H=U(q.href??"")??null,G=K(q.href)||Y(q.href??""),J=k(q.price_text),N=K(q.merchant_info)||null,X=K(q.sold_by)||V(q.ships_from_text??"")||V(N??"")||null,Z=Q(q.ships_from_text??"")||Q(N??"")||K(q.ships_from_text)||null,w=j(G);return{asin:H,product_url:C(q.href),...w,price_text:J.price_text,price_value:J.price_value,currency:J.currency,merchant_info_text:N,sold_by:X,ships_from:Z,offer_listing_url:K(q.offer_link)||null,review_url:K(q.review_url)||null,qa_url:K(q.qa_url)||null,is_amazon_sold:M(X),is_amazon_fulfilled:M(Z)||/fulfilled by amazon/i.test(N??"")}}async function b(q,H){const G=Y(H),J=await O(q,G,2500,"offer");B(J,"offer");await q.wait({selector:R,timeout:6}).catch(()=>{});return await q.evaluate(`
2
+ (() => ({
3
+ href: window.location.href,
4
+ title: document.title || '',
5
+ price_text: (() => {
6
+ const selectors = ${JSON.stringify(I)};
7
+ for (const selector of selectors) {
8
+ const text = document.querySelector(selector)?.textContent || '';
9
+ if (text.trim()) return text;
10
+ }
11
+ return '';
12
+ })(),
13
+ merchant_info: document.querySelector('#merchant-info')?.textContent || '',
14
+ sold_by: document.querySelector('#sellerProfileTriggerId')?.textContent || '',
15
+ ships_from_text:
16
+ document.querySelector('#shipsFromSoldByInsideBuyBox_feature_div')?.textContent
17
+ || document.querySelector('#fulfillerInfoFeature_feature_div')?.textContent
18
+ || document.querySelector('#merchantInfoFeature_feature_div')?.textContent
19
+ || document.querySelector('#tabular-buybox-container')?.textContent
20
+ || '',
21
+ offer_link: document.querySelector('a[href*="/gp/offer-listing/"]')?.href || '',
22
+ review_url: document.querySelector('a[href*="#customerReviews"]')?.href || '',
23
+ qa_url: document.querySelector('a[href*="ask/questions"]')?.href || '',
24
+ buybox_text:
25
+ document.querySelector('#desktop_qualifiedBuyBox')?.textContent
26
+ || document.querySelector('#buybox')?.textContent
27
+ || '',
28
+ }))()
29
+ `)}L({site:"amazon",name:"offer",access:"read",description:"Amazon seller, buy box, and fulfillment facts from the product page",domain:"amazon.com",strategy:_.COOKIE,navigateBefore:!1,args:[{name:"input",required:!0,positional:!0,help:"ASIN or product URL, for example B0FJS72893"}],columns:["asin","price_text","sold_by","ships_from","is_amazon_sold","is_amazon_fulfilled"],func:async(q,H)=>{const G=String(H.input??""),J=await b(q,G),N=v(J);if(!N.sold_by&&!N.ships_from&&!N.merchant_info_text){if(D(J.buybox_text))throw new $("amazon offer buy box is blocked by the current delivery location","The shared Chrome profile is not set to the target US delivery address. Switch Amazon delivery location to the requested US destination, reopen the product page, and retry.");throw new $("amazon offer surface did not expose seller or fulfillment facts","The product page may have changed. Open the product page in Chrome, make sure the buy box is visible, and retry.")}return[N]}});export const __test__={extractShipsFrom:Q,extractSoldBy:V,isDeliveryLocationBlocked:D,normalizeOfferPayload:v};
@@ -0,0 +1,25 @@
1
+ import{CommandExecutionError as M}from"@jackwener/opencli/errors";import{cli as V,Strategy as q}from"@jackwener/opencli/registry";import{buildProductUrl as W,buildProvenance as Y,cleanText as F,extractAsin as h,PRIMARY_PRICE_SELECTORS as j,parsePriceText as z,parseRatingValue as A,parseReviewCount as D,normalizeProductUrl as N,uniqueNonEmpty as X,assertUsableState as b,gotoAndReadState as k}from"./shared.js";const Z='#productTitle, #title span, [data-feature-name="title"] h1 span',v='#bylineInfo, [data-feature-name="bylineInfo"] #bylineInfo';function $(f){const H=F(f.href)||W(F(f.product_title)||F(f.href)),J=h(f.href??"")??null,G=z(f.price_text),K=F(f.rating_text)||null,Q=F(f.review_count_text)||null,B=Y(H);return{asin:J,title:F(f.product_title)||F(f.title)||null,product_url:N(f.href),...B,brand_text:F(f.byline)||null,price_text:G.price_text,price_value:G.price_value,currency:G.currency,rating_text:K,rating_value:A(K),review_count_text:Q,review_count:D(Q),review_url:F(f.review_url)||null,qa_url:F(f.qa_url)||null,breadcrumbs:X(f.breadcrumbs??[]),bullet_points:X(f.bullets??[])}}async function I(f,H){const J=W(H),G=await k(f,J,2500,"product");b(G,"product");await f.wait({selector:Z,timeout:6}).catch(()=>{});return await f.evaluate(`
2
+ (() => ({
3
+ href: window.location.href,
4
+ title: document.title || '',
5
+ product_title: document.querySelector(${JSON.stringify(Z)})?.textContent || '',
6
+ byline: document.querySelector(${JSON.stringify(v)})?.textContent || '',
7
+ price_text: (() => {
8
+ const selectors = ${JSON.stringify(j)};
9
+ for (const selector of selectors) {
10
+ const text = document.querySelector(selector)?.textContent || '';
11
+ if (text.trim()) return text;
12
+ }
13
+ return '';
14
+ })(),
15
+ rating_text:
16
+ document.querySelector('#acrPopover')?.getAttribute('title')
17
+ || document.querySelector('#acrPopover')?.textContent
18
+ || '',
19
+ review_count_text: document.querySelector('#acrCustomerReviewText')?.textContent || '',
20
+ review_url: document.querySelector('a[href*="#customerReviews"]')?.href || '',
21
+ qa_url: document.querySelector('a[href*="ask/questions"]')?.href || '',
22
+ bullets: Array.from(document.querySelectorAll('#feature-bullets li .a-list-item')).map((node) => node.textContent || ''),
23
+ breadcrumbs: Array.from(document.querySelectorAll('#wayfinding-breadcrumbs_feature_div a')).map((node) => node.textContent || ''),
24
+ }))()
25
+ `)}V({site:"amazon",name:"product",access:"read",description:"Amazon product page facts for candidate validation",domain:"amazon.com",strategy:q.COOKIE,navigateBefore:!1,args:[{name:"input",required:!0,positional:!0,help:"ASIN or product URL, for example B0FJS72893"}],columns:["asin","title","price_text","rating_value","review_count"],func:async(f,H)=>{const J=String(H.input??""),G=await I(f,J);if(!F(G.product_title))throw new M("amazon product page did not expose product content","The product page may have changed or hit a robot check. Open the product page in Chrome and retry.");return[$(G)]}});export const __test__={normalizeProductPayload:$};
@@ -0,0 +1,68 @@
1
+ import{CommandExecutionError as A}from"@jackwener/opencli/errors";import{Strategy as R}from"@jackwener/opencli/registry";import{assertUsableState as T,buildProvenance as U,cleanText as n,extractAsin as h,extractCategoryNodeId as b,extractReviewCountFromCardText as N,firstMeaningfulLine as P,gotoAndReadState as E,isRankingPaginationUrl as L,normalizeProductUrl as B,parsePriceText as O,parseRatingValue as F,parseReviewCount as I,resolveRankingUrl as K,toAbsoluteAmazonUrl as x,uniqueNonEmpty as v}from"./shared.js";function w(e,t){const a=n(e).match(/(\d{1,4})/);if(!a)return t;const r=Number.parseInt(a[1],10);return Number.isFinite(r)&&r>0?r:t}function C(e){const t=(e??[]).map((r)=>({title:n(r?.title),url:x(r?.url)??"",node_id:n(r?.node_id)||b(r?.url)||null})).filter((r)=>Boolean(r.title)&&Boolean(r.url)),o=new Set,a=[];for(const r of t){if(o.has(r.url))continue;o.add(r.url);a.push(r)}return a}export function normalizeRankingCandidate(e,t){const o=B(e.href),a=h(e.asin??"")??h(o??"")??null,r=n(e.title)||P(e.card_text),l=O(n(e.price_text)||e.card_text),u=n(e.rating_text)||null,m=n(e.review_count_text)||N(e.card_text)||null,c=U(t.sourceUrl),d=t.categoryUrl||t.sourceUrl;return{list_type:t.listType,rank:w(e.rank_text,t.rankFallback),asin:a,title:r||null,product_url:o,price_text:l.price_text,price_value:l.price_value,currency:l.currency,rating_text:u,rating_value:F(u),review_count_text:m,review_count:I(m),list_title:t.listTitle,category_title:t.categoryTitle,category_url:d,category_node_id:b(d),category_path:t.categoryPath,visible_category_links:t.visibleCategoryLinks,...c}}async function M(e,t,o){const a=await E(e,o,2500,t);T(a,t);return await e.evaluate(`
2
+ (() => ({
3
+ href: window.location.href,
4
+ title: document.title || '',
5
+ list_title:
6
+ document.querySelector('#zg_banner_text')?.textContent
7
+ || document.querySelector('h1')?.textContent
8
+ || '',
9
+ category_title:
10
+ document.querySelector('#zg_browseRoot .zg_selected')?.textContent
11
+ || document.querySelector('#wayfinding-breadcrumbs_feature_div ul li:last-child')?.textContent
12
+ || document.querySelector('#wayfinding-breadcrumbs_container ul li:last-child')?.textContent
13
+ || '',
14
+ category_path: Array.from(document.querySelectorAll(
15
+ '#zg_browseRoot ul li a, #zg_browseRoot ul li span, ' +
16
+ '#wayfinding-breadcrumbs_feature_div ul li a, #wayfinding-breadcrumbs_feature_div ul li span.a-list-item, ' +
17
+ '#wayfinding-breadcrumbs_container ul li a, #wayfinding-breadcrumbs_container ul li span.a-list-item'
18
+ ))
19
+ .map((entry) => (entry.textContent || '').trim())
20
+ .filter(Boolean),
21
+ cards: Array.from(document.querySelectorAll(
22
+ '.p13n-sc-uncoverable-faceout, .zg-grid-general-faceout, [data-asin][class*="p13n"]'
23
+ )).map((card) => ({
24
+ rank_text:
25
+ card.querySelector('.zg-bdg-text')?.textContent
26
+ || card.querySelector('[class*="rank"]')?.textContent
27
+ || '',
28
+ asin:
29
+ card.getAttribute('data-asin')
30
+ || card.getAttribute('id')
31
+ || '',
32
+ title:
33
+ card.querySelector('[class*="line-clamp"]')?.textContent
34
+ || card.querySelector('img')?.getAttribute('alt')
35
+ || card.querySelector('a[href*="/dp/"]')?.textContent
36
+ || '',
37
+ href:
38
+ card.querySelector('a[href*="/dp/"], a[href*="/gp/product/"]')?.href
39
+ || '',
40
+ price_text:
41
+ card.querySelector('.a-price .a-offscreen')?.textContent
42
+ || card.querySelector('.a-color-price')?.textContent
43
+ || '',
44
+ rating_text:
45
+ card.querySelector('[aria-label*="out of 5 stars"]')?.getAttribute('aria-label')
46
+ || '',
47
+ review_count_text:
48
+ card.querySelector('a[href*="#customerReviews"]')?.textContent
49
+ || card.querySelector('.a-size-small')?.textContent
50
+ || '',
51
+ card_text: card.innerText || '',
52
+ })),
53
+ page_links: Array.from(document.querySelectorAll('.a-pagination a[href], li.a-normal a[href], li.a-selected a[href]'))
54
+ .map((anchor) => anchor.href || '')
55
+ .filter(Boolean),
56
+ visible_category_links: Array.from(document.querySelectorAll(
57
+ '#zg_browseRoot a[href], #zg-left-col a[href], [class*="zg-browse"] a[href]'
58
+ )).map((anchor) => ({
59
+ title: (anchor.textContent || '').trim(),
60
+ url: anchor.href || '',
61
+ node_id:
62
+ anchor.getAttribute('data-node-id')
63
+ || anchor.dataset?.nodeid
64
+ || '',
65
+ }))
66
+ .filter((entry) => entry.title && entry.url),
67
+ }))()
68
+ `)}function V(e){return[`Open the same Amazon ${e} page in shared Chrome and verify ranked items are visible.`,"If the page shows a robot check, clear it manually and retry."].join(" ")}export function createRankingCliOptions(e){return{site:"amazon",name:e.commandName,access:e.access??"read",description:e.description,domain:"amazon.com",strategy:R.COOKIE,navigateBefore:!1,args:[{name:"input",positional:!0,help:"Ranking URL or supported Amazon path. Omit to use the list root."},{name:"limit",type:"int",default:100,help:"Maximum number of ranked items to return (default 100)"}],columns:["list_type","rank","asin","title","price_text","rating_value","review_count"],func:async(t,o)=>{const a=Math.max(1,Number(o.limit)||100),l=[K(e.listType,typeof o.input==="string"?o.input:void 0)],u=new Set,m=new Set,c=[];let d=null;while(l.length>0&&c.length<a){const g=l.shift();if(u.has(g))continue;u.add(g);const s=await M(t,e.listType,g),f=n(s.href)||g;d=n(s.list_title)||n(s.title)||d;const p=v(s.category_path??[]),S=n(s.category_title)||(p.length>0?p[p.length-1]:""),k=C(s.visible_category_links),z=s.cards??[];for(const _ of z){const i=normalizeRankingCandidate(_,{listType:e.listType,rankFallback:c.length+1,listTitle:d,sourceUrl:f,categoryTitle:S||null,categoryUrl:f,categoryPath:p,visibleCategoryLinks:k}),y=n(String(i.asin??""))||n(String(i.product_url??""));if(y&&m.has(y))continue;if(y)m.add(y);c.push(i);if(c.length>=a)break}const q=v(s.page_links??[]);for(const _ of q){const i=x(_);if(!i||!L(e.listType,i))continue;if(!u.has(i)&&!l.includes(i))l.push(i)}}if(c.length===0)throw new A(`amazon ${e.commandName} did not expose any ranked items`,V(e.commandName));return c.slice(0,a)}}}export const __test__={parseRank:w,normalizeVisibleCategoryLinks:C,normalizeRankingCandidate};
@@ -0,0 +1,16 @@
1
+ import{CommandExecutionError as h}from"@jackwener/opencli/errors";import{cli as f,Strategy as x}from"@jackwener/opencli/registry";import{buildProvenance as y,buildSearchUrl as u,cleanText as r,extractAsin as m,normalizeProductUrl as _,parsePriceText as g,parseRatingValue as v,parseReviewCount as b,assertUsableState as S,gotoAndReadState as w}from"./shared.js";function p(e,a,n){const o=_(e.href),s=m(e.asin??"")??m(o??"")??null,c=g(e.price_text),i=r(e.rating_text)||null,t=r(e.review_count_text)||null,l=y(n);return{rank:a,asin:s,title:r(e.title)||null,product_url:o,...l,price_text:c.price_text,price_value:c.price_value,currency:c.currency,rating_text:i,rating_value:v(i),review_count_text:t,review_count:b(t),is_sponsored:e.sponsored===!0,badges:(e.badge_texts??[]).map((d)=>r(d)).filter(Boolean)}}async function q(e,a){const n=u(a),o=await w(e,n,2500,"search");S(o,"search");return await e.evaluate(`
2
+ (() => ({
3
+ href: window.location.href,
4
+ cards: Array.from(document.querySelectorAll('[data-component-type="s-search-result"]'))
5
+ .map((card) => ({
6
+ asin: card.getAttribute('data-asin') || '',
7
+ title: card.querySelector('h2')?.textContent || '',
8
+ href: card.querySelector('a.a-link-normal[href*="/dp/"]')?.href || '',
9
+ price_text: card.querySelector('.a-price .a-offscreen')?.textContent || '',
10
+ rating_text: card.querySelector('[aria-label*="out of 5 stars"]')?.getAttribute('aria-label') || '',
11
+ review_count_text: card.querySelector('a[href*="#customerReviews"]')?.textContent || '',
12
+ sponsored: /sponsored/i.test(card.innerText || ''),
13
+ badge_texts: Array.from(card.querySelectorAll('.a-badge-text')).map((node) => node.textContent || ''),
14
+ })),
15
+ }))()
16
+ `)}f({site:"amazon",name:"search",access:"read",description:"Amazon search results for product discovery and coarse filtering",domain:"amazon.com",strategy:x.COOKIE,navigateBefore:!1,args:[{name:"query",required:!0,positional:!0,help:'Search query, for example "desk shelf organizer"'},{name:"limit",type:"int",default:20,help:"Maximum number of results to return (default 20)"}],columns:["rank","asin","title","price_text","rating_value","review_count"],func:async(e,a)=>{const n=String(a.query??""),o=Math.max(1,Number(a.limit)||20),s=await q(e,n),c=r(s.href)||u(n),i=(s.cards??[]).filter((t)=>r(t.asin)&&r(t.title)).slice(0,o);if(i.length===0)throw new h("amazon search did not expose any product cards","The search page may have changed or hit a robot check. Open the same query in Chrome, verify the page is visible, and retry.");return i.map((t,l)=>p(t,l+1,c))}});export const __test__={normalizeSearchCandidate:p};
@@ -0,0 +1,11 @@
1
+ import{ArgumentError as q,CommandExecutionError as K}from"@jackwener/opencli/errors";export const SITE="amazon",DOMAIN="amazon.com",HOME_URL="https://www.amazon.com/",BESTSELLERS_URL="https://www.amazon.com/Best-Sellers/zgbs",NEW_RELEASES_URL="https://www.amazon.com/gp/new-releases",MOVERS_SHAKERS_URL="https://www.amazon.com/gp/movers-and-shakers",SEARCH_URL_PREFIX="https://www.amazon.com/s?k=",PRODUCT_URL_PREFIX="https://www.amazon.com/dp/",DISCUSSION_URL_PREFIX="https://www.amazon.com/product-reviews/",STRATEGY="cookie",PRIMARY_PRICE_SELECTORS=["#corePrice_feature_div .a-offscreen","#corePriceDisplay_desktop_feature_div .a-offscreen","#corePrice_desktop .a-offscreen","#apex_desktop .a-offscreen","#newAccordionRow_0 .a-offscreen","#price_inside_buybox","#priceblock_ourprice","#priceblock_dealprice","#tp_price_block_total_price_ww"];const V=["Sorry, we just need to make sure you're not a robot","Enter the characters you see below","Type the characters you see in this image","To discuss automated access to Amazon data please contact"],f={bestsellers:{commandName:"bestsellers",rootUrl:BESTSELLERS_URL,pathPattern:/(?:^|\/)zgbs(?:\/|$)/i,invalidInputMessage:"amazon bestsellers expects a best sellers URL or /zgbs path",invalidInputHint:"Example: opencli amazon bestsellers https://www.amazon.com/Best-Sellers/zgbs"},new_releases:{commandName:"new-releases",rootUrl:NEW_RELEASES_URL,pathPattern:/\/gp\/new-releases(?:\/|$)/i,invalidInputMessage:"amazon new-releases expects a new releases URL or /gp/new-releases path",invalidInputHint:"Example: opencli amazon new-releases https://www.amazon.com/gp/new-releases"},movers_shakers:{commandName:"movers-shakers",rootUrl:MOVERS_SHAKERS_URL,pathPattern:/\/gp\/movers-and-shakers(?:\/|$)/i,invalidInputMessage:"amazon movers-shakers expects a movers-and-shakers URL or /gp/movers-and-shakers path",invalidInputHint:"Example: opencli amazon movers-shakers https://www.amazon.com/gp/movers-and-shakers"}};export function cleanText(Q){return typeof Q==="string"?Q.replace(/\u00a0/g," ").replace(/\s+/g," ").trim():""}export function cleanMultilineText(Q){return typeof Q==="string"?Q.replace(/\u00a0/g," ").split(`
2
+ `).map((J)=>J.replace(/\s+/g," ").trim()).filter(Boolean).join(`
3
+ `):""}export function uniqueNonEmpty(Q){return[...new Set(Q.map((J)=>cleanText(J)).filter(Boolean))]}export function buildProvenance(Q){return{source_url:Q,fetched_at:new Date().toISOString(),strategy:STRATEGY}}export function buildSearchUrl(Q){const J=cleanText(Q);if(!J)throw new q("amazon search query cannot be empty");return`${SEARCH_URL_PREFIX}${encodeURIComponent(J)}`}export function extractAsin(Q){const J=cleanText(Q);if(!J)return null;if(/^[A-Z0-9]{10}$/i.test(J))return J.toUpperCase();const $=J.match(/\/(?:dp|gp\/product|product-reviews)\/([A-Z0-9]{10})/i);return $?$[1].toUpperCase():null}export function buildProductUrl(Q){const J=extractAsin(Q);if(!J)throw new q("amazon product expects an ASIN or product URL","Example: opencli amazon product B0FJS72893");return`${PRODUCT_URL_PREFIX}${J}`}export function buildDiscussionUrl(Q){const J=extractAsin(Q);if(!J)throw new q("amazon discussion expects an ASIN or product URL","Example: opencli amazon discussion B0FJS72893");return`${DISCUSSION_URL_PREFIX}${J}`}function Y(Q){return f[Q]}export function isSupportedRankingPath(Q,J){try{const $=new URL(J);return Y(Q).pathPattern.test($.pathname)}catch{return!1}}export function resolveRankingUrl(Q,J){const $=Y(Q),j=cleanText(J);if(!j||j==="root")return $.rootUrl;let W;if(j.startsWith("/"))W=new URL(j,HOME_URL).toString();else if(/^https?:\/\//i.test(j))W=canonicalizeAmazonUrl(j);else if(j.includes("amazon.")&&j.includes("/"))W=canonicalizeAmazonUrl(`https://${j.replace(/^\/+/,"")}`);else throw new q($.invalidInputMessage,$.invalidInputHint);if(!isSupportedRankingPath(Q,W))throw new q($.invalidInputMessage,$.invalidInputHint);return w(W)}function w(Q){try{const J=new URL(Q),$=J.pathname.split("/").filter(Boolean).filter((j)=>!/^ref=/i.test(j));J.pathname=`/${$.join("/")}`;J.hash="";J.searchParams.delete("ref");return J.toString()}catch{return Q}}export function isRankingPaginationUrl(Q,J){const $=toAbsoluteAmazonUrl(J);if(!$||!isSupportedRankingPath(Q,$))return!1;try{const j=new URL($),W=cleanText(j.searchParams.get("ref")).toLowerCase();return j.searchParams.has("pg")||/(?:^|_)pg(?:_|$)/.test(W)||/zg_bs(?:nr|ms)?_pg_/.test(W)}catch{return!1}}export function extractCategoryNodeId(Q){const J=toAbsoluteAmazonUrl(Q);if(!J)return null;try{const $=new URL(J);for(const B of["node","nodeid","nodeId","browseNode"]){const G=cleanText($.searchParams.get(B));if(/^\d{4,}$/.test(G))return G}const j=cleanText($.searchParams.get("rh")),W=decodeURIComponent(j).match(/(?:^|,)\s*n:(\d{4,})(?:,|$)/i);if(W)return W[1];const Z=[...$.pathname.matchAll(/\/(\d{4,})(?=\/|$)/g)];if(Z.length>0)return Z[Z.length-1][1]}catch{return null}return null}export function resolveBestsellersUrl(Q){return resolveRankingUrl("bestsellers",Q)}export function canonicalizeAmazonUrl(Q){try{const J=new URL(Q);if(!J.hostname.endsWith(DOMAIN))throw Error("not-amazon");return J.toString()}catch{throw new q("Invalid Amazon URL")}}export function toAbsoluteAmazonUrl(Q){const J=cleanText(Q);if(!J)return null;try{return new URL(J,HOME_URL).toString()}catch{return null}}export function normalizeProductUrl(Q){const J=cleanText(Q),$=extractAsin(J);if($)return buildProductUrl($);return toAbsoluteAmazonUrl(J)}export function parsePriceText(Q){const J=cleanText(Q),$=J.match(/([$€£])\s*(\d+(?:,\d{3})*(?:\.\d+)?)/);if(!$)return{price_text:J||null,price_value:null,currency:null};const j={$:"USD","€":"EUR","£":"GBP"};return{price_text:`${$[1]}${$[2]}`,price_value:Number.parseFloat($[2].replace(/,/g,"")),currency:j[$[1]]??null}}export function parseRatingValue(Q){const $=cleanText(Q).match(/(\d+(?:\.\d+)?)\s*out of 5/i);return $?Number.parseFloat($[1]):null}export function parseReviewCount(Q){const J=cleanText(Q),$=J.match(/(\d+(?:\.\d+)?)\s*([kKmM])/);if($){const W=Number.parseFloat($[1]),Z=/m/i.test($[2])?1e6:1000;return Number.isFinite(W)?Math.round(W*Z):null}const j=J.match(/([\d,]+)/);return j?Number.parseInt(j[1].replace(/,/g,""),10):null}export function extractReviewCountFromCardText(Q){const J=cleanMultilineText(Q),$=J.match(/out of 5 stars(?:, rating details)?\s*([\d,]+)/i);if($)return $[1];return J.split(`
4
+ `).map((W)=>cleanText(W)).find((W)=>/^[\d,]+$/.test(W))??null}export function isAmazonEntity(Q){return cleanText(Q).toLowerCase().includes("amazon")}export function firstMeaningfulLine(Q){return cleanMultilineText(Q).split(`
5
+ `).map((J)=>cleanText(J)).find(Boolean)??""}export function trimRatingPrefix(Q){const J=cleanText(Q);if(!J)return null;return J.replace(/^\d+(?:\.\d+)?\s*out of 5 stars\s*/i,"").trim()||J}export function isRobotState(Q){const J=cleanText(Q.title),$=cleanMultilineText(Q.body_text);return V.some((j)=>J.includes(j)||$.includes(j))}export function buildChallengeHint(Q){return[`Open a clean Amazon ${Q} page in the shared Chrome profile and clear any robot check first.`,"If you are using CDP, set OPENCLI_CDP_TARGET=amazon.com and avoid parallel Amazon commands against the same browser target."].join(" ")}export async function readPageState(Q){const J=await Q.evaluate(`
6
+ (() => ({
7
+ href: window.location.href,
8
+ title: document.title || '',
9
+ body_text: document.body ? document.body.innerText || '' : '',
10
+ }))()
11
+ `);return{href:cleanText(J.href),title:cleanText(J.title),body_text:cleanMultilineText(J.body_text)}}export async function gotoAndReadState(Q,J,$=2500,j="page"){try{await Q.goto(J,{settleMs:$});await Q.wait(1.5);return await readPageState(Q)}catch(W){const Z=W instanceof Error?W.message:String(W);if(Z.includes("Inspected target navigated or closed")||Z.includes("Cannot find context with specified id")||Z.includes("Target closed"))throw new K(`amazon ${j} navigation lost the current browser target`,`${buildChallengeHint(j)} If CDP is attached to a stale tab, open a fresh Amazon tab and retry.`);throw W}}export function assertUsableState(Q,J){if(!isRobotState(Q))return;throw new K(`amazon ${J} hit a robot check`,buildChallengeHint(J))}export const __test__={buildSearchUrl,extractAsin,buildProductUrl,buildDiscussionUrl,resolveBestsellersUrl,resolveRankingUrl,isSupportedRankingPath,isRankingPaginationUrl,extractCategoryNodeId,parsePriceText,parseRatingValue,parseReviewCount,extractReviewCountFromCardText,isAmazonEntity,trimRatingPrefix,isRobotState,PRIMARY_PRICE_SELECTORS};
@@ -0,0 +1,38 @@
1
+ ---
2
+ description: How to automate Antigravity using OpenCLI
3
+ ---
4
+
5
+ # Antigravity Automation Skill
6
+
7
+ This skill allows AI agents to control the [Antigravity](https://github.com/chengazhen/Antigravity) desktop app (and any Electron app with CDP enabled) programmatically via OpenCLI.
8
+
9
+ ## Requirements
10
+ opencli automatically detects, launches (with `--remote-debugging-port=9234`), and connects to Antigravity.
11
+ If Antigravity is already running without CDP, opencli will prompt to restart it.
12
+
13
+ If the endpoint exposes multiple inspectable targets, set:
14
+ \`\`\`bash
15
+ export OPENCLI_CDP_TARGET="antigravity"
16
+ \`\`\`
17
+
18
+ ## High-Level Capabilities
19
+ 1. **Send Messages (`opencli antigravity send <message>`)**: Type and send a message directly into the chat UI.
20
+ 2. **Read History (`opencli antigravity read`)**: Scrape the raw chat transcript from the main UI container.
21
+ 3. **Extract Code (`opencli antigravity extract-code`)**: Automatically isolate and extract source code text blocks from the AI's recent answers.
22
+ 4. **Switch Models (`opencli antigravity model <name>`)**: Instantly toggle the active LLM (e.g., \`gemini\`, \`claude\`).
23
+ 5. **Clear Context (`opencli antigravity new`)**: Start a fresh conversation.
24
+
25
+ ## Examples for Automated Workflows
26
+
27
+ ### Generating and Saving Code
28
+ \`\`\`bash
29
+ opencli antigravity send "Write a python script to fetch HN top stories"
30
+ # wait ~10-15 seconds for output to render
31
+ opencli antigravity extract-code > hn_fetcher.py
32
+ \`\`\`
33
+
34
+ ### Reading Real-time Logs
35
+ Agents can run long-running streaming watch instances:
36
+ \`\`\`bash
37
+ opencli antigravity watch
38
+ \`\`\`