@jackwener/opencli 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (769) hide show
  1. package/.agents/skills/cross-project-adapter-migration/SKILL.md +2 -2
  2. package/.github/pull_request_template.md +7 -0
  3. package/.github/workflows/doc-check.yml +36 -0
  4. package/.github/workflows/docs.yml +7 -42
  5. package/CHANGELOG.md +23 -0
  6. package/CLI-EXPLORER.md +9 -8
  7. package/CONTRIBUTING.md +39 -1
  8. package/README.md +33 -19
  9. package/README.zh-CN.md +64 -27
  10. package/SKILL.md +102 -33
  11. package/dist/browser/cdp.d.ts +4 -4
  12. package/dist/browser/cdp.js +45 -17
  13. package/dist/browser/daemon-client.d.ts +2 -1
  14. package/dist/browser/dom-helpers.js +38 -7
  15. package/dist/browser/dom-snapshot.d.ts +86 -0
  16. package/dist/browser/dom-snapshot.js +729 -0
  17. package/dist/browser/dom-snapshot.test.d.ts +11 -0
  18. package/dist/browser/dom-snapshot.test.js +212 -0
  19. package/dist/browser/index.d.ts +2 -0
  20. package/dist/browser/index.js +1 -0
  21. package/dist/browser/page.d.ts +18 -25
  22. package/dist/browser/page.js +44 -5
  23. package/dist/build-manifest.d.ts +11 -4
  24. package/dist/build-manifest.js +79 -34
  25. package/dist/build-manifest.test.js +58 -2
  26. package/dist/cli-manifest.json +4273 -1771
  27. package/dist/cli.d.ts +6 -0
  28. package/dist/cli.js +255 -162
  29. package/dist/clis/apple-podcasts/commands.test.d.ts +2 -0
  30. package/dist/clis/apple-podcasts/commands.test.js +76 -0
  31. package/dist/clis/apple-podcasts/search.js +2 -2
  32. package/dist/clis/apple-podcasts/top.js +9 -2
  33. package/dist/clis/arxiv/search.js +1 -1
  34. package/dist/clis/barchart/greeks.js +1 -1
  35. package/dist/clis/barchart/options.js +1 -1
  36. package/dist/clis/barchart/quote.js +1 -1
  37. package/dist/clis/bilibili/download.js +1 -1
  38. package/dist/clis/bilibili/dynamic.js +1 -1
  39. package/dist/clis/bilibili/favorite.js +1 -1
  40. package/dist/clis/bilibili/feed.js +1 -1
  41. package/dist/clis/bilibili/following.js +2 -2
  42. package/dist/clis/bilibili/history.js +1 -1
  43. package/dist/clis/bilibili/me.js +1 -1
  44. package/dist/clis/bilibili/ranking.js +1 -1
  45. package/dist/clis/bilibili/search.js +3 -3
  46. package/dist/clis/bilibili/subtitle.js +2 -2
  47. package/dist/clis/bilibili/user-videos.js +2 -2
  48. package/dist/{bilibili.d.ts → clis/bilibili/utils.d.ts} +1 -1
  49. package/dist/clis/bloomberg/businessweek.js +17 -0
  50. package/dist/clis/bloomberg/economics.js +17 -0
  51. package/dist/clis/bloomberg/feeds.d.ts +1 -0
  52. package/dist/clis/bloomberg/feeds.js +15 -0
  53. package/dist/clis/bloomberg/industries.d.ts +1 -0
  54. package/dist/clis/bloomberg/industries.js +17 -0
  55. package/dist/clis/bloomberg/main.d.ts +1 -0
  56. package/dist/clis/bloomberg/main.js +17 -0
  57. package/dist/clis/bloomberg/markets.d.ts +1 -0
  58. package/dist/clis/bloomberg/markets.js +17 -0
  59. package/dist/clis/bloomberg/news.d.ts +1 -0
  60. package/dist/clis/bloomberg/news.js +105 -0
  61. package/dist/clis/bloomberg/opinions.d.ts +1 -0
  62. package/dist/clis/bloomberg/opinions.js +17 -0
  63. package/dist/clis/bloomberg/politics.d.ts +1 -0
  64. package/dist/clis/bloomberg/politics.js +17 -0
  65. package/dist/clis/bloomberg/tech.d.ts +1 -0
  66. package/dist/clis/bloomberg/tech.js +17 -0
  67. package/dist/clis/bloomberg/utils.d.ts +34 -0
  68. package/dist/clis/bloomberg/utils.js +364 -0
  69. package/dist/clis/bloomberg/utils.test.d.ts +1 -0
  70. package/dist/clis/bloomberg/utils.test.js +129 -0
  71. package/dist/clis/boss/batchgreet.js +12 -99
  72. package/dist/clis/boss/chatlist.js +9 -26
  73. package/dist/clis/boss/chatmsg.js +11 -42
  74. package/dist/clis/boss/common.d.ts +92 -0
  75. package/dist/clis/boss/common.js +223 -0
  76. package/dist/clis/boss/detail.js +8 -50
  77. package/dist/clis/boss/exchange.js +13 -79
  78. package/dist/clis/boss/greet.js +20 -147
  79. package/dist/clis/boss/invite.js +26 -121
  80. package/dist/clis/boss/joblist.js +6 -31
  81. package/dist/clis/boss/mark.js +12 -85
  82. package/dist/clis/boss/recommend.js +10 -49
  83. package/dist/clis/boss/resume.js +18 -118
  84. package/dist/clis/boss/search.js +13 -61
  85. package/dist/clis/boss/send.js +18 -152
  86. package/dist/clis/boss/stats.js +20 -71
  87. package/dist/clis/chaoxing/assignments.js +1 -1
  88. package/dist/clis/chaoxing/exams.js +1 -1
  89. package/dist/{chaoxing.d.ts → clis/chaoxing/utils.d.ts} +1 -1
  90. package/dist/{chaoxing.js → clis/chaoxing/utils.js} +0 -2
  91. package/dist/clis/chaoxing/utils.test.d.ts +1 -0
  92. package/dist/{chaoxing.test.js → clis/chaoxing/utils.test.js} +1 -1
  93. package/dist/clis/chatgpt/read.js +1 -1
  94. package/dist/clis/chatwise/export.js +1 -1
  95. package/dist/clis/chatwise/model.js +2 -2
  96. package/dist/clis/chatwise/screenshot.js +1 -1
  97. package/dist/clis/codex/export.js +1 -1
  98. package/dist/clis/codex/model.js +2 -2
  99. package/dist/clis/codex/screenshot.js +1 -1
  100. package/dist/clis/coupang/add-to-cart.js +3 -4
  101. package/dist/clis/coupang/search.js +2 -4
  102. package/dist/clis/coupang/utils.test.d.ts +1 -0
  103. package/dist/{coupang.test.js → clis/coupang/utils.test.js} +1 -1
  104. package/dist/clis/ctrip/search.js +1 -1
  105. package/dist/clis/cursor/export.js +1 -1
  106. package/dist/clis/cursor/model.js +2 -2
  107. package/dist/clis/cursor/screenshot.js +1 -1
  108. package/dist/clis/devto/tag.yaml +34 -0
  109. package/dist/clis/devto/top.yaml +29 -0
  110. package/dist/clis/devto/user.yaml +33 -0
  111. package/dist/clis/douban/book-hot.d.ts +1 -0
  112. package/dist/clis/douban/book-hot.js +14 -0
  113. package/dist/clis/douban/marks.d.ts +1 -0
  114. package/dist/clis/douban/marks.js +115 -0
  115. package/dist/clis/douban/movie-hot.d.ts +1 -0
  116. package/dist/clis/douban/movie-hot.js +14 -0
  117. package/dist/clis/douban/reviews.d.ts +1 -0
  118. package/dist/clis/douban/reviews.js +106 -0
  119. package/dist/clis/douban/search.d.ts +1 -0
  120. package/dist/clis/douban/search.js +16 -0
  121. package/dist/clis/douban/shared.d.ts +4 -0
  122. package/dist/clis/douban/shared.js +155 -0
  123. package/dist/clis/douban/subject.yaml +76 -0
  124. package/dist/clis/douban/top250.yaml +70 -0
  125. package/dist/clis/douban/utils.d.ts +35 -0
  126. package/dist/clis/douban/utils.js +48 -0
  127. package/dist/clis/facebook/add-friend.yaml +43 -0
  128. package/dist/clis/facebook/events.yaml +44 -0
  129. package/dist/clis/facebook/feed.yaml +63 -0
  130. package/dist/clis/facebook/friends.yaml +42 -0
  131. package/dist/clis/facebook/groups.yaml +50 -0
  132. package/dist/clis/facebook/join-group.yaml +44 -0
  133. package/dist/clis/facebook/memories.yaml +39 -0
  134. package/dist/clis/facebook/notifications.yaml +40 -0
  135. package/dist/clis/facebook/profile.yaml +37 -0
  136. package/dist/clis/facebook/search.yaml +46 -0
  137. package/dist/clis/google/news.d.ts +5 -0
  138. package/dist/clis/google/news.js +58 -0
  139. package/dist/clis/google/search.d.ts +10 -0
  140. package/dist/clis/google/search.js +127 -0
  141. package/dist/clis/google/suggest.d.ts +5 -0
  142. package/dist/clis/google/suggest.js +34 -0
  143. package/dist/clis/google/trends.d.ts +5 -0
  144. package/dist/clis/google/trends.js +38 -0
  145. package/dist/clis/google/utils.d.ts +9 -0
  146. package/dist/clis/google/utils.js +23 -0
  147. package/dist/clis/google/utils.test.d.ts +1 -0
  148. package/dist/clis/google/utils.test.js +75 -0
  149. package/dist/clis/grok/ask.d.ts +14 -0
  150. package/dist/clis/grok/ask.js +257 -65
  151. package/dist/clis/grok/ask.test.d.ts +1 -0
  152. package/dist/clis/grok/ask.test.js +36 -0
  153. package/dist/clis/instagram/comment.yaml +52 -0
  154. package/dist/clis/instagram/explore.yaml +43 -0
  155. package/dist/clis/instagram/follow.yaml +41 -0
  156. package/dist/clis/instagram/followers.yaml +51 -0
  157. package/dist/clis/instagram/following.yaml +51 -0
  158. package/dist/clis/instagram/like.yaml +46 -0
  159. package/dist/clis/instagram/profile.yaml +42 -0
  160. package/dist/clis/instagram/save.yaml +46 -0
  161. package/dist/clis/instagram/saved.yaml +40 -0
  162. package/dist/clis/instagram/search.yaml +43 -0
  163. package/dist/clis/instagram/unfollow.yaml +38 -0
  164. package/dist/clis/instagram/unlike.yaml +46 -0
  165. package/dist/clis/instagram/unsave.yaml +46 -0
  166. package/dist/clis/instagram/user.yaml +54 -0
  167. package/dist/clis/jike/comment.js +2 -3
  168. package/dist/clis/jike/create.js +1 -2
  169. package/dist/clis/jike/feed.js +0 -1
  170. package/dist/clis/jike/like.js +1 -2
  171. package/dist/clis/jike/notifications.js +0 -1
  172. package/dist/clis/jike/post.yaml +1 -0
  173. package/dist/clis/jike/repost.js +2 -3
  174. package/dist/clis/jike/search.js +2 -3
  175. package/dist/clis/jike/topic.yaml +1 -0
  176. package/dist/clis/jike/user.yaml +1 -0
  177. package/dist/clis/jimeng/generate.yaml +1 -0
  178. package/dist/clis/jimeng/history.yaml +0 -1
  179. package/dist/clis/linkedin/search.js +7 -7
  180. package/dist/clis/linux-do/category.yaml +2 -0
  181. package/dist/clis/linux-do/search.yaml +4 -3
  182. package/dist/clis/linux-do/topic.yaml +1 -0
  183. package/dist/clis/lobsters/active.yaml +29 -0
  184. package/dist/clis/lobsters/hot.yaml +29 -0
  185. package/dist/clis/lobsters/newest.yaml +29 -0
  186. package/dist/clis/lobsters/tag.yaml +34 -0
  187. package/dist/clis/medium/feed.d.ts +1 -0
  188. package/dist/clis/medium/feed.js +15 -0
  189. package/dist/clis/medium/search.d.ts +1 -0
  190. package/dist/clis/medium/search.js +15 -0
  191. package/dist/clis/medium/shared.d.ts +5 -0
  192. package/dist/clis/medium/shared.js +78 -0
  193. package/dist/clis/medium/user.d.ts +1 -0
  194. package/dist/clis/medium/user.js +15 -0
  195. package/dist/clis/notion/export.js +1 -1
  196. package/dist/clis/reddit/comment.js +3 -4
  197. package/dist/clis/reddit/read.js +4 -5
  198. package/dist/clis/reddit/save.js +2 -3
  199. package/dist/clis/reddit/saved.js +0 -1
  200. package/dist/clis/reddit/search.yaml +1 -0
  201. package/dist/clis/reddit/subreddit.yaml +1 -0
  202. package/dist/clis/reddit/subscribe.js +1 -2
  203. package/dist/clis/reddit/upvote.js +2 -3
  204. package/dist/clis/reddit/upvoted.js +0 -1
  205. package/dist/clis/reddit/user-comments.yaml +1 -0
  206. package/dist/clis/reddit/user-posts.yaml +1 -0
  207. package/dist/clis/reddit/user.yaml +1 -0
  208. package/dist/clis/reuters/search.js +1 -1
  209. package/dist/clis/sinablog/article.d.ts +1 -0
  210. package/dist/clis/sinablog/article.js +14 -0
  211. package/dist/clis/sinablog/hot.d.ts +1 -0
  212. package/dist/clis/sinablog/hot.js +14 -0
  213. package/dist/clis/sinablog/search.d.ts +1 -0
  214. package/dist/clis/sinablog/search.js +51 -0
  215. package/dist/clis/sinablog/shared.d.ts +7 -0
  216. package/dist/clis/sinablog/shared.js +187 -0
  217. package/dist/clis/sinablog/user.d.ts +1 -0
  218. package/dist/clis/sinablog/user.js +15 -0
  219. package/dist/clis/smzdm/search.js +2 -3
  220. package/dist/clis/stackoverflow/search.yaml +1 -0
  221. package/dist/clis/steam/top-sellers.yaml +29 -0
  222. package/dist/clis/substack/feed.d.ts +1 -0
  223. package/dist/clis/substack/feed.js +15 -0
  224. package/dist/clis/substack/publication.d.ts +1 -0
  225. package/dist/clis/substack/publication.js +15 -0
  226. package/dist/clis/substack/search.d.ts +1 -0
  227. package/dist/clis/substack/search.js +77 -0
  228. package/dist/clis/substack/shared.d.ts +4 -0
  229. package/dist/clis/substack/shared.js +129 -0
  230. package/dist/clis/tiktok/comment.yaml +66 -0
  231. package/dist/clis/tiktok/explore.yaml +39 -0
  232. package/dist/clis/tiktok/follow.yaml +39 -0
  233. package/dist/clis/tiktok/following.yaml +46 -0
  234. package/dist/clis/tiktok/friends.yaml +47 -0
  235. package/dist/clis/tiktok/like.yaml +38 -0
  236. package/dist/clis/tiktok/live.yaml +51 -0
  237. package/dist/clis/tiktok/notifications.yaml +52 -0
  238. package/dist/clis/tiktok/profile.yaml +45 -0
  239. package/dist/clis/tiktok/save.yaml +34 -0
  240. package/dist/clis/tiktok/search.yaml +46 -0
  241. package/dist/clis/tiktok/unfollow.yaml +44 -0
  242. package/dist/clis/tiktok/unlike.yaml +38 -0
  243. package/dist/clis/tiktok/unsave.yaml +36 -0
  244. package/dist/clis/tiktok/user.yaml +44 -0
  245. package/dist/clis/twitter/accept.js +2 -2
  246. package/dist/clis/twitter/article.js +2 -2
  247. package/dist/clis/twitter/block.d.ts +1 -0
  248. package/dist/clis/twitter/block.js +88 -0
  249. package/dist/clis/twitter/delete.js +1 -1
  250. package/dist/clis/twitter/download.d.ts +1 -1
  251. package/dist/clis/twitter/download.js +3 -3
  252. package/dist/clis/twitter/followers.js +1 -1
  253. package/dist/clis/twitter/following.js +1 -1
  254. package/dist/clis/twitter/hide-reply.d.ts +1 -0
  255. package/dist/clis/twitter/hide-reply.js +66 -0
  256. package/dist/clis/twitter/like.js +1 -1
  257. package/dist/clis/twitter/post.js +1 -1
  258. package/dist/clis/twitter/reply-dm.js +1 -1
  259. package/dist/clis/twitter/reply.js +2 -2
  260. package/dist/clis/twitter/search.js +1 -1
  261. package/dist/clis/twitter/thread.js +2 -2
  262. package/dist/clis/twitter/timeline.d.ts +23 -0
  263. package/dist/clis/twitter/timeline.js +42 -14
  264. package/dist/clis/twitter/timeline.test.d.ts +1 -0
  265. package/dist/clis/twitter/timeline.test.js +102 -0
  266. package/dist/clis/twitter/trending.d.ts +1 -0
  267. package/dist/clis/twitter/trending.js +91 -0
  268. package/dist/clis/twitter/unblock.d.ts +1 -0
  269. package/dist/clis/twitter/unblock.js +71 -0
  270. package/dist/clis/v2ex/topic.yaml +1 -0
  271. package/dist/clis/weibo/hot.js +0 -1
  272. package/dist/clis/weread/book.js +1 -1
  273. package/dist/clis/weread/highlights.js +1 -1
  274. package/dist/clis/weread/notes.js +1 -1
  275. package/dist/clis/weread/search.js +1 -1
  276. package/dist/clis/wikipedia/random.d.ts +1 -0
  277. package/dist/clis/wikipedia/random.js +19 -0
  278. package/dist/clis/wikipedia/search.js +4 -4
  279. package/dist/clis/wikipedia/summary.js +4 -9
  280. package/dist/clis/wikipedia/trending.d.ts +1 -0
  281. package/dist/clis/wikipedia/trending.js +35 -0
  282. package/dist/clis/wikipedia/utils.d.ts +28 -0
  283. package/dist/clis/wikipedia/utils.js +13 -0
  284. package/dist/clis/xiaohongshu/creator-note-detail.d.ts +15 -0
  285. package/dist/clis/xiaohongshu/creator-note-detail.js +69 -5
  286. package/dist/clis/xiaohongshu/creator-note-detail.test.js +82 -33
  287. package/dist/clis/xiaohongshu/creator-notes.js +35 -5
  288. package/dist/clis/xiaohongshu/creator-notes.test.js +37 -6
  289. package/dist/clis/xiaohongshu/creator-profile.js +0 -1
  290. package/dist/clis/xiaohongshu/creator-stats.js +0 -1
  291. package/dist/clis/xiaohongshu/download.js +2 -3
  292. package/dist/clis/xiaohongshu/feed.yaml +0 -1
  293. package/dist/clis/xiaohongshu/notifications.yaml +0 -1
  294. package/dist/clis/xiaohongshu/search.js +2 -2
  295. package/dist/clis/xiaohongshu/user.js +1 -2
  296. package/dist/clis/xueqiu/earnings-date.yaml +69 -0
  297. package/dist/clis/xueqiu/search.yaml +2 -1
  298. package/dist/clis/xueqiu/stock.yaml +2 -0
  299. package/dist/clis/yahoo-finance/quote.js +1 -2
  300. package/dist/clis/youtube/search.js +1 -1
  301. package/dist/clis/youtube/transcript.js +1 -1
  302. package/dist/clis/youtube/video.js +1 -1
  303. package/dist/clis/zhihu/download.js +1 -2
  304. package/dist/clis/zhihu/question.js +1 -1
  305. package/dist/clis/zhihu/search.yaml +4 -3
  306. package/dist/commanderAdapter.d.ts +21 -0
  307. package/dist/commanderAdapter.js +117 -0
  308. package/dist/{engine.d.ts → discovery.d.ts} +6 -4
  309. package/dist/{engine.js → discovery.js} +93 -104
  310. package/dist/doctor.js +3 -1
  311. package/dist/doctor.test.js +46 -2
  312. package/dist/download/index.d.ts +2 -6
  313. package/dist/download/index.js +19 -46
  314. package/dist/engine.test.d.ts +0 -3
  315. package/dist/engine.test.js +80 -11
  316. package/dist/execution.d.ts +24 -0
  317. package/dist/execution.js +153 -0
  318. package/dist/explore.d.ts +76 -3
  319. package/dist/explore.js +132 -111
  320. package/dist/external-clis.yaml +48 -0
  321. package/dist/external.d.ts +7 -2
  322. package/dist/external.js +11 -14
  323. package/dist/generate.d.ts +41 -2
  324. package/dist/generate.js +5 -4
  325. package/dist/main.js +2 -1
  326. package/dist/pipeline/executor.d.ts +2 -2
  327. package/dist/pipeline/executor.js +2 -2
  328. package/dist/pipeline/executor.test.js +33 -6
  329. package/dist/pipeline/registry.d.ts +1 -1
  330. package/dist/pipeline/steps/browser.d.ts +7 -7
  331. package/dist/pipeline/steps/browser.js +21 -7
  332. package/dist/pipeline/steps/fetch.d.ts +1 -1
  333. package/dist/pipeline/steps/fetch.js +11 -7
  334. package/dist/pipeline/steps/transform.d.ts +6 -5
  335. package/dist/pipeline/steps/transform.js +30 -9
  336. package/dist/pipeline/template.d.ts +6 -6
  337. package/dist/pipeline/template.js +43 -5
  338. package/dist/pipeline/template.test.js +18 -0
  339. package/dist/pipeline/transform.test.js +11 -0
  340. package/dist/plugin.d.ts +31 -0
  341. package/dist/plugin.js +216 -0
  342. package/dist/plugin.test.d.ts +4 -0
  343. package/dist/plugin.test.js +76 -0
  344. package/dist/registry-api.d.ts +11 -0
  345. package/dist/registry-api.js +9 -0
  346. package/dist/registry.d.ts +13 -0
  347. package/dist/registry.js +8 -1
  348. package/dist/runtime.d.ts +5 -0
  349. package/dist/runtime.js +8 -0
  350. package/dist/serialization.d.ts +34 -0
  351. package/dist/serialization.js +63 -0
  352. package/dist/synthesize.d.ts +94 -4
  353. package/dist/synthesize.js +5 -4
  354. package/dist/types.d.ts +43 -27
  355. package/dist/validate.js +8 -2
  356. package/docs/.vitepress/config.mts +20 -7
  357. package/docs/adapters/browser/arxiv.md +27 -0
  358. package/docs/adapters/browser/barchart.md +33 -0
  359. package/docs/adapters/browser/bilibili.md +9 -0
  360. package/docs/adapters/browser/bloomberg.md +70 -0
  361. package/docs/adapters/browser/chaoxing.md +39 -0
  362. package/docs/adapters/browser/devto.md +35 -0
  363. package/docs/adapters/browser/douban.md +38 -0
  364. package/docs/adapters/browser/facebook.md +36 -0
  365. package/docs/adapters/browser/google.md +62 -0
  366. package/docs/adapters/browser/grok.md +53 -0
  367. package/docs/adapters/browser/hf.md +42 -0
  368. package/docs/adapters/browser/instagram.md +46 -0
  369. package/docs/adapters/browser/jike.md +45 -0
  370. package/docs/adapters/browser/jimeng.md +39 -0
  371. package/docs/adapters/browser/linux-do.md +45 -0
  372. package/docs/adapters/browser/lobsters.md +32 -0
  373. package/docs/adapters/browser/medium.md +32 -0
  374. package/docs/adapters/browser/reddit.md +9 -0
  375. package/docs/adapters/browser/sinablog.md +36 -0
  376. package/docs/adapters/browser/sinafinance.md +35 -0
  377. package/docs/adapters/browser/stackoverflow.md +35 -0
  378. package/docs/adapters/browser/steam.md +26 -0
  379. package/docs/adapters/browser/substack.md +38 -0
  380. package/docs/adapters/browser/tiktok.md +68 -0
  381. package/docs/adapters/browser/twitter.md +3 -0
  382. package/docs/adapters/browser/weread.md +48 -0
  383. package/docs/adapters/browser/wikipedia.md +39 -0
  384. package/docs/adapters/browser/xiaohongshu.md +5 -1
  385. package/docs/adapters/browser/xueqiu.md +10 -0
  386. package/docs/adapters/browser/yahoo-finance.md +6 -5
  387. package/docs/adapters/desktop/antigravity.md +6 -0
  388. package/docs/adapters/desktop/chatgpt.md +5 -4
  389. package/docs/adapters/desktop/codex.md +5 -1
  390. package/docs/adapters/desktop/cursor.md +4 -0
  391. package/docs/adapters/desktop/discord.md +7 -7
  392. package/docs/adapters/index.md +14 -4
  393. package/docs/advanced/download.md +4 -4
  394. package/docs/developer/architecture.md +17 -4
  395. package/docs/guide/getting-started.md +1 -0
  396. package/docs/guide/plugins.md +153 -0
  397. package/docs/zh/guide/plugins.md +107 -0
  398. package/extension/src/background.ts +18 -11
  399. package/package.json +10 -5
  400. package/scripts/check-doc-coverage.sh +69 -0
  401. package/scripts/clean-dist.cjs +13 -0
  402. package/scripts/copy-yaml.cjs +7 -0
  403. package/src/browser/cdp.ts +77 -32
  404. package/src/browser/daemon-client.ts +2 -1
  405. package/src/browser/dom-helpers.ts +38 -7
  406. package/src/browser/dom-snapshot.test.ts +249 -0
  407. package/src/browser/dom-snapshot.ts +770 -0
  408. package/src/browser/index.ts +2 -0
  409. package/src/browser/page.ts +57 -20
  410. package/src/build-manifest.test.ts +70 -2
  411. package/src/build-manifest.ts +114 -40
  412. package/src/cli.ts +287 -139
  413. package/src/clis/apple-podcasts/commands.test.ts +95 -0
  414. package/src/clis/apple-podcasts/search.ts +2 -2
  415. package/src/clis/apple-podcasts/top.ts +12 -2
  416. package/src/clis/arxiv/search.ts +1 -1
  417. package/src/clis/barchart/greeks.ts +1 -1
  418. package/src/clis/barchart/options.ts +1 -1
  419. package/src/clis/barchart/quote.ts +1 -1
  420. package/src/clis/bilibili/download.ts +1 -1
  421. package/src/clis/bilibili/dynamic.ts +1 -1
  422. package/src/clis/bilibili/favorite.ts +1 -1
  423. package/src/clis/bilibili/feed.ts +1 -1
  424. package/src/clis/bilibili/following.ts +2 -2
  425. package/src/clis/bilibili/history.ts +1 -1
  426. package/src/clis/bilibili/me.ts +1 -1
  427. package/src/clis/bilibili/ranking.ts +1 -1
  428. package/src/clis/bilibili/search.ts +3 -3
  429. package/src/clis/bilibili/subtitle.ts +2 -2
  430. package/src/clis/bilibili/user-videos.ts +2 -2
  431. package/src/{bilibili.ts → clis/bilibili/utils.ts} +1 -1
  432. package/src/clis/bloomberg/businessweek.ts +18 -0
  433. package/src/clis/bloomberg/economics.ts +18 -0
  434. package/src/clis/bloomberg/feeds.ts +16 -0
  435. package/src/clis/bloomberg/industries.ts +18 -0
  436. package/src/clis/bloomberg/main.ts +18 -0
  437. package/src/clis/bloomberg/markets.ts +18 -0
  438. package/src/clis/bloomberg/news.ts +136 -0
  439. package/src/clis/bloomberg/opinions.ts +18 -0
  440. package/src/clis/bloomberg/politics.ts +18 -0
  441. package/src/clis/bloomberg/tech.ts +18 -0
  442. package/src/clis/bloomberg/utils.test.ts +135 -0
  443. package/src/clis/bloomberg/utils.ts +429 -0
  444. package/src/clis/boss/batchgreet.ts +16 -108
  445. package/src/clis/boss/chatlist.ts +13 -27
  446. package/src/clis/boss/chatmsg.ts +16 -40
  447. package/src/clis/boss/common.ts +287 -0
  448. package/src/clis/boss/detail.ts +9 -55
  449. package/src/clis/boss/exchange.ts +15 -89
  450. package/src/clis/boss/greet.ts +25 -162
  451. package/src/clis/boss/invite.ts +36 -133
  452. package/src/clis/boss/joblist.ts +7 -36
  453. package/src/clis/boss/mark.ts +13 -94
  454. package/src/clis/boss/recommend.ts +12 -57
  455. package/src/clis/boss/resume.ts +19 -124
  456. package/src/clis/boss/search.ts +14 -67
  457. package/src/clis/boss/send.ts +22 -162
  458. package/src/clis/boss/stats.ts +21 -76
  459. package/src/clis/chaoxing/assignments.ts +1 -1
  460. package/src/clis/chaoxing/exams.ts +1 -1
  461. package/src/{chaoxing.test.ts → clis/chaoxing/utils.test.ts} +1 -1
  462. package/src/{chaoxing.ts → clis/chaoxing/utils.ts} +1 -3
  463. package/src/clis/chatgpt/read.ts +1 -1
  464. package/src/clis/chatwise/export.ts +1 -1
  465. package/src/clis/chatwise/model.ts +2 -2
  466. package/src/clis/chatwise/screenshot.ts +1 -1
  467. package/src/clis/codex/export.ts +1 -1
  468. package/src/clis/codex/model.ts +2 -2
  469. package/src/clis/codex/screenshot.ts +1 -1
  470. package/src/clis/coupang/add-to-cart.ts +3 -4
  471. package/src/clis/coupang/search.ts +2 -4
  472. package/src/{coupang.test.ts → clis/coupang/utils.test.ts} +1 -1
  473. package/src/clis/ctrip/search.ts +1 -1
  474. package/src/clis/cursor/export.ts +1 -1
  475. package/src/clis/cursor/model.ts +2 -2
  476. package/src/clis/cursor/screenshot.ts +1 -1
  477. package/src/clis/devto/tag.yaml +34 -0
  478. package/src/clis/devto/top.yaml +29 -0
  479. package/src/clis/devto/user.yaml +33 -0
  480. package/src/clis/douban/book-hot.ts +15 -0
  481. package/src/clis/douban/marks.ts +135 -0
  482. package/src/clis/douban/movie-hot.ts +15 -0
  483. package/src/clis/douban/reviews.ts +127 -0
  484. package/src/clis/douban/search.ts +17 -0
  485. package/src/clis/douban/shared.ts +165 -0
  486. package/src/clis/douban/subject.yaml +76 -0
  487. package/src/clis/douban/top250.yaml +70 -0
  488. package/src/clis/douban/utils.ts +81 -0
  489. package/src/clis/facebook/add-friend.yaml +43 -0
  490. package/src/clis/facebook/events.yaml +44 -0
  491. package/src/clis/facebook/feed.yaml +63 -0
  492. package/src/clis/facebook/friends.yaml +42 -0
  493. package/src/clis/facebook/groups.yaml +50 -0
  494. package/src/clis/facebook/join-group.yaml +44 -0
  495. package/src/clis/facebook/memories.yaml +39 -0
  496. package/src/clis/facebook/notifications.yaml +40 -0
  497. package/src/clis/facebook/profile.yaml +37 -0
  498. package/src/clis/facebook/search.yaml +46 -0
  499. package/src/clis/google/news.ts +66 -0
  500. package/src/clis/google/search.ts +133 -0
  501. package/src/clis/google/suggest.ts +40 -0
  502. package/src/clis/google/trends.ts +44 -0
  503. package/src/clis/google/utils.test.ts +82 -0
  504. package/src/clis/google/utils.ts +24 -0
  505. package/src/clis/grok/ask.test.ts +53 -0
  506. package/src/clis/grok/ask.ts +300 -69
  507. package/src/clis/instagram/comment.yaml +52 -0
  508. package/src/clis/instagram/explore.yaml +43 -0
  509. package/src/clis/instagram/follow.yaml +41 -0
  510. package/src/clis/instagram/followers.yaml +51 -0
  511. package/src/clis/instagram/following.yaml +51 -0
  512. package/src/clis/instagram/like.yaml +46 -0
  513. package/src/clis/instagram/profile.yaml +42 -0
  514. package/src/clis/instagram/save.yaml +46 -0
  515. package/src/clis/instagram/saved.yaml +40 -0
  516. package/src/clis/instagram/search.yaml +43 -0
  517. package/src/clis/instagram/unfollow.yaml +38 -0
  518. package/src/clis/instagram/unlike.yaml +46 -0
  519. package/src/clis/instagram/unsave.yaml +46 -0
  520. package/src/clis/instagram/user.yaml +54 -0
  521. package/src/clis/jike/comment.ts +2 -3
  522. package/src/clis/jike/create.ts +1 -2
  523. package/src/clis/jike/feed.ts +0 -1
  524. package/src/clis/jike/like.ts +1 -2
  525. package/src/clis/jike/notifications.ts +0 -1
  526. package/src/clis/jike/post.yaml +1 -0
  527. package/src/clis/jike/repost.ts +2 -3
  528. package/src/clis/jike/search.ts +2 -3
  529. package/src/clis/jike/topic.yaml +1 -0
  530. package/src/clis/jike/user.yaml +1 -0
  531. package/src/clis/jimeng/generate.yaml +1 -0
  532. package/src/clis/jimeng/history.yaml +0 -1
  533. package/src/clis/linkedin/search.ts +7 -7
  534. package/src/clis/linux-do/category.yaml +2 -0
  535. package/src/clis/linux-do/search.yaml +4 -3
  536. package/src/clis/linux-do/topic.yaml +1 -0
  537. package/src/clis/lobsters/active.yaml +29 -0
  538. package/src/clis/lobsters/hot.yaml +29 -0
  539. package/src/clis/lobsters/newest.yaml +29 -0
  540. package/src/clis/lobsters/tag.yaml +34 -0
  541. package/src/clis/medium/feed.ts +16 -0
  542. package/src/clis/medium/search.ts +16 -0
  543. package/src/clis/medium/shared.ts +83 -0
  544. package/src/clis/medium/user.ts +16 -0
  545. package/src/clis/notion/export.ts +1 -1
  546. package/src/clis/reddit/comment.ts +3 -4
  547. package/src/clis/reddit/read.ts +4 -5
  548. package/src/clis/reddit/save.ts +2 -3
  549. package/src/clis/reddit/saved.ts +0 -1
  550. package/src/clis/reddit/search.yaml +1 -0
  551. package/src/clis/reddit/subreddit.yaml +1 -0
  552. package/src/clis/reddit/subscribe.ts +1 -2
  553. package/src/clis/reddit/upvote.ts +2 -3
  554. package/src/clis/reddit/upvoted.ts +0 -1
  555. package/src/clis/reddit/user-comments.yaml +1 -0
  556. package/src/clis/reddit/user-posts.yaml +1 -0
  557. package/src/clis/reddit/user.yaml +1 -0
  558. package/src/clis/reuters/search.ts +1 -1
  559. package/src/clis/sinablog/article.ts +15 -0
  560. package/src/clis/sinablog/hot.ts +15 -0
  561. package/src/clis/sinablog/search.ts +56 -0
  562. package/src/clis/sinablog/shared.ts +198 -0
  563. package/src/clis/sinablog/user.ts +16 -0
  564. package/src/clis/smzdm/search.ts +2 -3
  565. package/src/clis/stackoverflow/search.yaml +1 -0
  566. package/src/clis/steam/top-sellers.yaml +29 -0
  567. package/src/clis/substack/feed.ts +16 -0
  568. package/src/clis/substack/publication.ts +16 -0
  569. package/src/clis/substack/search.ts +91 -0
  570. package/src/clis/substack/shared.ts +132 -0
  571. package/src/clis/tiktok/comment.yaml +66 -0
  572. package/src/clis/tiktok/explore.yaml +39 -0
  573. package/src/clis/tiktok/follow.yaml +39 -0
  574. package/src/clis/tiktok/following.yaml +46 -0
  575. package/src/clis/tiktok/friends.yaml +47 -0
  576. package/src/clis/tiktok/like.yaml +38 -0
  577. package/src/clis/tiktok/live.yaml +51 -0
  578. package/src/clis/tiktok/notifications.yaml +52 -0
  579. package/src/clis/tiktok/profile.yaml +45 -0
  580. package/src/clis/tiktok/save.yaml +34 -0
  581. package/src/clis/tiktok/search.yaml +46 -0
  582. package/src/clis/tiktok/unfollow.yaml +44 -0
  583. package/src/clis/tiktok/unlike.yaml +38 -0
  584. package/src/clis/tiktok/unsave.yaml +36 -0
  585. package/src/clis/tiktok/user.yaml +44 -0
  586. package/src/clis/twitter/accept.ts +2 -2
  587. package/src/clis/twitter/article.ts +2 -2
  588. package/src/clis/twitter/block.ts +92 -0
  589. package/src/clis/twitter/delete.ts +1 -1
  590. package/src/clis/twitter/download.ts +3 -3
  591. package/src/clis/twitter/followers.ts +1 -1
  592. package/src/clis/twitter/following.ts +1 -1
  593. package/src/clis/twitter/hide-reply.ts +70 -0
  594. package/src/clis/twitter/like.ts +1 -1
  595. package/src/clis/twitter/post.ts +1 -1
  596. package/src/clis/twitter/reply-dm.ts +1 -1
  597. package/src/clis/twitter/reply.ts +2 -2
  598. package/src/clis/twitter/search.ts +1 -1
  599. package/src/clis/twitter/thread.ts +2 -2
  600. package/src/clis/twitter/timeline.test.ts +109 -0
  601. package/src/clis/twitter/timeline.ts +59 -19
  602. package/src/clis/twitter/trending.ts +113 -0
  603. package/src/clis/twitter/unblock.ts +75 -0
  604. package/src/clis/v2ex/topic.yaml +1 -0
  605. package/src/clis/weibo/hot.ts +0 -1
  606. package/src/clis/weread/book.ts +1 -1
  607. package/src/clis/weread/highlights.ts +1 -1
  608. package/src/clis/weread/notes.ts +1 -1
  609. package/src/clis/weread/search.ts +1 -1
  610. package/src/clis/wikipedia/random.ts +19 -0
  611. package/src/clis/wikipedia/search.ts +11 -5
  612. package/src/clis/wikipedia/summary.ts +4 -9
  613. package/src/clis/wikipedia/trending.ts +41 -0
  614. package/src/clis/wikipedia/utils.ts +31 -0
  615. package/src/clis/xiaohongshu/creator-note-detail.test.ts +84 -33
  616. package/src/clis/xiaohongshu/creator-note-detail.ts +89 -5
  617. package/src/clis/xiaohongshu/creator-notes.test.ts +41 -6
  618. package/src/clis/xiaohongshu/creator-notes.ts +44 -5
  619. package/src/clis/xiaohongshu/creator-profile.ts +0 -1
  620. package/src/clis/xiaohongshu/creator-stats.ts +0 -1
  621. package/src/clis/xiaohongshu/download.ts +2 -3
  622. package/src/clis/xiaohongshu/feed.yaml +0 -1
  623. package/src/clis/xiaohongshu/notifications.yaml +0 -1
  624. package/src/clis/xiaohongshu/search.ts +2 -2
  625. package/src/clis/xiaohongshu/user.ts +1 -2
  626. package/src/clis/xueqiu/earnings-date.yaml +69 -0
  627. package/src/clis/xueqiu/search.yaml +2 -1
  628. package/src/clis/xueqiu/stock.yaml +2 -0
  629. package/src/clis/yahoo-finance/quote.ts +1 -2
  630. package/src/clis/youtube/search.ts +1 -1
  631. package/src/clis/youtube/transcript.ts +1 -1
  632. package/src/clis/youtube/video.ts +1 -1
  633. package/src/clis/zhihu/download.ts +1 -2
  634. package/src/clis/zhihu/question.ts +1 -1
  635. package/src/clis/zhihu/search.yaml +4 -3
  636. package/src/commanderAdapter.ts +120 -0
  637. package/src/discovery.ts +277 -0
  638. package/src/doctor.test.ts +59 -2
  639. package/src/doctor.ts +4 -2
  640. package/src/download/index.ts +21 -54
  641. package/src/engine.test.ts +85 -11
  642. package/src/execution.ts +164 -0
  643. package/src/explore.ts +211 -117
  644. package/src/external-clis.yaml +9 -0
  645. package/src/external.ts +15 -12
  646. package/src/generate.ts +58 -9
  647. package/src/main.ts +2 -1
  648. package/src/pipeline/executor.test.ts +35 -6
  649. package/src/pipeline/executor.ts +11 -7
  650. package/src/pipeline/registry.ts +3 -3
  651. package/src/pipeline/steps/browser.ts +29 -15
  652. package/src/pipeline/steps/fetch.ts +18 -13
  653. package/src/pipeline/steps/transform.ts +40 -15
  654. package/src/pipeline/template.test.ts +18 -0
  655. package/src/pipeline/template.ts +86 -13
  656. package/src/pipeline/transform.test.ts +15 -2
  657. package/src/plugin.test.ts +86 -0
  658. package/src/plugin.ts +254 -0
  659. package/src/registry-api.ts +12 -0
  660. package/src/registry.ts +24 -1
  661. package/src/runtime.ts +9 -0
  662. package/src/serialization.ts +79 -0
  663. package/src/synthesize.ts +102 -21
  664. package/src/types.ts +45 -13
  665. package/src/validate.ts +19 -4
  666. package/tests/e2e/browser-public.test.ts +36 -0
  667. package/tests/e2e/public-commands.test.ts +119 -1
  668. package/dist/clis/feishu/new.d.ts +0 -1
  669. package/dist/clis/feishu/new.js +0 -27
  670. package/dist/clis/feishu/read.d.ts +0 -1
  671. package/dist/clis/feishu/read.js +0 -40
  672. package/dist/clis/feishu/search.d.ts +0 -1
  673. package/dist/clis/feishu/search.js +0 -30
  674. package/dist/clis/feishu/send.d.ts +0 -1
  675. package/dist/clis/feishu/send.js +0 -39
  676. package/dist/clis/feishu/status.d.ts +0 -1
  677. package/dist/clis/feishu/status.js +0 -28
  678. package/dist/clis/neteasemusic/like.d.ts +0 -1
  679. package/dist/clis/neteasemusic/like.js +0 -25
  680. package/dist/clis/neteasemusic/lyrics.d.ts +0 -1
  681. package/dist/clis/neteasemusic/lyrics.js +0 -47
  682. package/dist/clis/neteasemusic/next.d.ts +0 -1
  683. package/dist/clis/neteasemusic/next.js +0 -26
  684. package/dist/clis/neteasemusic/play.d.ts +0 -1
  685. package/dist/clis/neteasemusic/play.js +0 -26
  686. package/dist/clis/neteasemusic/playing.d.ts +0 -1
  687. package/dist/clis/neteasemusic/playing.js +0 -59
  688. package/dist/clis/neteasemusic/playlist.d.ts +0 -1
  689. package/dist/clis/neteasemusic/playlist.js +0 -46
  690. package/dist/clis/neteasemusic/prev.d.ts +0 -1
  691. package/dist/clis/neteasemusic/prev.js +0 -25
  692. package/dist/clis/neteasemusic/search.d.ts +0 -1
  693. package/dist/clis/neteasemusic/search.js +0 -52
  694. package/dist/clis/neteasemusic/status.d.ts +0 -1
  695. package/dist/clis/neteasemusic/status.js +0 -16
  696. package/dist/clis/neteasemusic/volume.d.ts +0 -1
  697. package/dist/clis/neteasemusic/volume.js +0 -54
  698. package/dist/clis/twitter/trending.yaml +0 -46
  699. package/dist/clis/wechat/chats.d.ts +0 -1
  700. package/dist/clis/wechat/chats.js +0 -28
  701. package/dist/clis/wechat/contacts.d.ts +0 -1
  702. package/dist/clis/wechat/contacts.js +0 -28
  703. package/dist/clis/wechat/read.d.ts +0 -1
  704. package/dist/clis/wechat/read.js +0 -58
  705. package/dist/clis/wechat/search.d.ts +0 -1
  706. package/dist/clis/wechat/search.js +0 -31
  707. package/dist/clis/wechat/send.d.ts +0 -1
  708. package/dist/clis/wechat/send.js +0 -42
  709. package/dist/clis/wechat/status.d.ts +0 -1
  710. package/dist/clis/wechat/status.js +0 -29
  711. package/dist/pipeline.d.ts +0 -7
  712. package/dist/pipeline.js +0 -7
  713. package/docs/adapters/browser/github.md +0 -26
  714. package/docs/adapters/desktop/feishu.md +0 -20
  715. package/docs/adapters/desktop/neteasemusic.md +0 -31
  716. package/docs/adapters/desktop/wechat.md +0 -28
  717. package/docs/public/CNAME +0 -1
  718. package/src/clis/antigravity/README.md +0 -5
  719. package/src/clis/antigravity/README.zh-CN.md +0 -51
  720. package/src/clis/chaoxing/README.md +0 -14
  721. package/src/clis/chaoxing/README.zh-CN.md +0 -35
  722. package/src/clis/chatgpt/README.md +0 -5
  723. package/src/clis/chatgpt/README.zh-CN.md +0 -44
  724. package/src/clis/chatwise/README.md +0 -5
  725. package/src/clis/chatwise/README.zh-CN.md +0 -38
  726. package/src/clis/codex/README.md +0 -5
  727. package/src/clis/codex/README.zh-CN.md +0 -33
  728. package/src/clis/cursor/README.md +0 -5
  729. package/src/clis/cursor/README.zh-CN.md +0 -33
  730. package/src/clis/discord-app/README.md +0 -5
  731. package/src/clis/discord-app/README.zh-CN.md +0 -28
  732. package/src/clis/feishu/README.md +0 -5
  733. package/src/clis/feishu/README.zh-CN.md +0 -20
  734. package/src/clis/feishu/new.ts +0 -32
  735. package/src/clis/feishu/read.ts +0 -48
  736. package/src/clis/feishu/search.ts +0 -35
  737. package/src/clis/feishu/send.ts +0 -46
  738. package/src/clis/feishu/status.ts +0 -34
  739. package/src/clis/neteasemusic/README.md +0 -5
  740. package/src/clis/neteasemusic/README.zh-CN.md +0 -31
  741. package/src/clis/neteasemusic/like.ts +0 -28
  742. package/src/clis/neteasemusic/lyrics.ts +0 -53
  743. package/src/clis/neteasemusic/next.ts +0 -30
  744. package/src/clis/neteasemusic/play.ts +0 -30
  745. package/src/clis/neteasemusic/playing.ts +0 -62
  746. package/src/clis/neteasemusic/playlist.ts +0 -51
  747. package/src/clis/neteasemusic/prev.ts +0 -29
  748. package/src/clis/neteasemusic/search.ts +0 -58
  749. package/src/clis/neteasemusic/status.ts +0 -18
  750. package/src/clis/neteasemusic/volume.ts +0 -61
  751. package/src/clis/notion/README.md +0 -5
  752. package/src/clis/notion/README.zh-CN.md +0 -29
  753. package/src/clis/twitter/trending.yaml +0 -46
  754. package/src/clis/wechat/README.md +0 -5
  755. package/src/clis/wechat/README.zh-CN.md +0 -28
  756. package/src/clis/wechat/chats.ts +0 -33
  757. package/src/clis/wechat/contacts.ts +0 -33
  758. package/src/clis/wechat/read.ts +0 -72
  759. package/src/clis/wechat/search.ts +0 -36
  760. package/src/clis/wechat/send.ts +0 -49
  761. package/src/clis/wechat/status.ts +0 -35
  762. package/src/engine.ts +0 -274
  763. package/src/pipeline.ts +0 -8
  764. /package/dist/{bilibili.js → clis/bilibili/utils.js} +0 -0
  765. /package/dist/{chaoxing.test.d.ts → clis/bloomberg/businessweek.d.ts} +0 -0
  766. /package/dist/{coupang.test.d.ts → clis/bloomberg/economics.d.ts} +0 -0
  767. /package/dist/{coupang.d.ts → clis/coupang/utils.d.ts} +0 -0
  768. /package/dist/{coupang.js → clis/coupang/utils.js} +0 -0
  769. /package/src/{coupang.ts → clis/coupang/utils.ts} +0 -0
package/SKILL.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: opencli
3
- description: "OpenCLI — Make any website or Electron App your CLI. Zero risk, AI-powered, reuse Chrome login. 80+ commands across 19 sites."
3
+ description: "OpenCLI — Make any website or Electron App your CLI. Zero risk, AI-powered, reuse Chrome login. 150+ commands across 30+ sites."
4
4
  version: 1.1.0
5
5
  author: jackwener
6
6
  tags: [cli, browser, web, chrome-extension, cdp, bilibili, zhihu, twitter, github, v2ex, hackernews, reddit, xiaohongshu, xueqiu, youtube, boss, coupang, AI, agent]
@@ -39,7 +39,7 @@ Browser commands require:
39
39
 
40
40
  > **Note**: You must be logged into the target website in Chrome before running commands. Tabs opened during command execution are auto-closed afterwards.
41
41
 
42
- Public API commands (`hackernews`, `github search`, `v2ex`) need no browser.
42
+ Public API commands (`hackernews`, `v2ex`) need no browser.
43
43
 
44
44
  ## Commands Reference
45
45
 
@@ -48,7 +48,7 @@ Public API commands (`hackernews`, `github search`, `v2ex`) need no browser.
48
48
  ```bash
49
49
  # Bilibili (browser)
50
50
  opencli bilibili hot --limit 10 # B站热门视频
51
- opencli bilibili search --keyword "rust" # 搜索视频
51
+ opencli bilibili search "rust" # 搜索视频 (query positional)
52
52
  opencli bilibili me # 我的信息
53
53
  opencli bilibili favorite # 我的收藏
54
54
  opencli bilibili history --limit 20 # 观看历史
@@ -61,15 +61,19 @@ opencli bilibili following --limit 20 # 我的关注列表 (支持 --uid 查
61
61
 
62
62
  # 知乎 (browser)
63
63
  opencli zhihu hot --limit 10 # 知乎热榜
64
- opencli zhihu search --keyword "AI" # 搜索
65
- opencli zhihu question --id 34816524 # 问题详情和回答
64
+ opencli zhihu search "AI" # 搜索 (query positional)
65
+ opencli zhihu question 34816524 # 问题详情和回答 (id positional)
66
66
 
67
67
  # 小红书 (browser)
68
- opencli xiaohongshu search --keyword "美食" # 搜索笔记
68
+ opencli xiaohongshu search "美食" # 搜索笔记 (query positional)
69
69
  opencli xiaohongshu notifications # 通知(mentions/likes/connections)
70
70
  opencli xiaohongshu feed --limit 10 # 推荐 Feed
71
- opencli xiaohongshu me # 我的信息
72
- opencli xiaohongshu user --uid xxx # 用户主页
71
+ opencli xiaohongshu user xxx # 用户主页 (id positional)
72
+ opencli xiaohongshu creator-notes --limit 10 # 创作者笔记列表
73
+ opencli xiaohongshu creator-note-detail --note-id xxx # 笔记详情
74
+ opencli xiaohongshu creator-notes-summary # 笔记数据概览
75
+ opencli xiaohongshu creator-profile # 创作者资料
76
+ opencli xiaohongshu creator-stats # 创作者数据统计
73
77
 
74
78
  # 雪球 Xueqiu (browser)
75
79
  opencli xueqiu hot-stock --limit 10 # 雪球热门股票榜
@@ -77,15 +81,17 @@ opencli xueqiu stock --symbol SH600519 # 查看股票实时行情
77
81
  opencli xueqiu watchlist # 获取自选股/持仓列表
78
82
  opencli xueqiu feed # 我的关注 timeline
79
83
  opencli xueqiu hot --limit 10 # 雪球热榜
80
- opencli xueqiu search --keyword "特斯拉" # 搜索
84
+ opencli xueqiu search "特斯拉" # 搜索 (query positional)
81
85
 
82
- # GitHub (public)
83
- opencli github search --keyword "cli" # 搜索仓库
86
+ # GitHub (via gh External CLI)
87
+ opencli gh repo list # 列出仓库 (passthrough to gh)
88
+ opencli gh pr list --limit 5 # PR 列表
89
+ opencli gh issue list # Issue 列表
84
90
 
85
91
  # Twitter/X (browser)
86
92
  opencli twitter trending --limit 10 # 热门话题
87
93
  opencli twitter bookmarks --limit 20 # 获取收藏的书签推文
88
- opencli twitter search --keyword "AI" # 搜索推文
94
+ opencli twitter search "AI" # 搜索推文 (query positional)
89
95
  opencli twitter profile elonmusk # 用户资料
90
96
  opencli twitter timeline --limit 20 # 时间线
91
97
  opencli twitter thread 1234567890 # 推文 thread(原文 + 回复)
@@ -100,15 +106,15 @@ opencli reddit hot --limit 10 # 热门帖子
100
106
  opencli reddit hot --subreddit programming # 指定子版块
101
107
  opencli reddit frontpage --limit 10 # 首页 /r/all
102
108
  opencli reddit popular --limit 10 # /r/popular 热门
103
- opencli reddit search --query "AI" --sort top --time week # 搜索(支持排序+时间过滤)
104
- opencli reddit subreddit --name rust --sort top --time month # 子版块浏览(支持时间过滤)
105
- opencli reddit read --post_id 1abc123 # 阅读帖子 + 评论
106
- opencli reddit user --username spez # 用户资料(karma、注册时间)
107
- opencli reddit user-posts --username spez # 用户发帖历史
108
- opencli reddit user-comments --username spez # 用户评论历史
109
- opencli reddit upvote --post_id xxx --direction up # 投票(up/down/none)
110
- opencli reddit save --post_id xxx # 收藏帖子
111
- opencli reddit comment --post_id xxx --text "Great!" # 发表评论
109
+ opencli reddit search "AI" --sort top --time week # 搜索(支持排序+时间过滤)
110
+ opencli reddit subreddit rust --sort top --time month # 子版块浏览(支持时间过滤)
111
+ opencli reddit read --post-id 1abc123 # 阅读帖子 + 评论
112
+ opencli reddit user spez # 用户资料(karma、注册时间)
113
+ opencli reddit user-posts spez # 用户发帖历史
114
+ opencli reddit user-comments spez # 用户评论历史
115
+ opencli reddit upvote --post-id xxx --direction up # 投票(up/down/none)
116
+ opencli reddit save --post-id xxx # 收藏帖子
117
+ opencli reddit comment --post-id xxx "Great!" # 发表评论 (text positional)
112
118
  opencli reddit subscribe --subreddit python # 订阅子版块
113
119
  opencli reddit saved --limit 10 # 我的收藏
114
120
  opencli reddit upvoted --limit 10 # 我的赞
@@ -116,7 +122,7 @@ opencli reddit upvoted --limit 10 # 我的赞
116
122
  # V2EX (public + browser)
117
123
  opencli v2ex hot --limit 10 # 热门话题
118
124
  opencli v2ex latest --limit 10 # 最新话题
119
- opencli v2ex topic --id 1024 # 主题详情
125
+ opencli v2ex topic 1024 # 主题详情 (id positional)
120
126
  opencli v2ex daily # 每日签到 (browser)
121
127
  opencli v2ex me # 我的信息 (browser)
122
128
  opencli v2ex notifications --limit 10 # 通知 (browser)
@@ -131,14 +137,26 @@ opencli bbc news --limit 10 # BBC News RSS headlines
131
137
  opencli weibo hot --limit 10 # 微博热搜
132
138
 
133
139
  # BOSS直聘 (browser)
134
- opencli boss search --query "AI agent" # 搜索职位
135
- opencli boss detail --securityId xxx # 职位详情
140
+ opencli boss search "AI agent" # 搜索职位 (query positional)
141
+ opencli boss detail --security-id xxx # 职位详情
142
+ opencli boss recommend --limit 10 # 推荐职位
143
+ opencli boss joblist --limit 10 # 职位列表
144
+ opencli boss greet --security-id xxx # 打招呼
145
+ opencli boss batchgreet --job-id xxx # 批量打招呼
146
+ opencli boss send --uid xxx "消息内容" # 发消息 (text positional)
147
+ opencli boss chatlist --limit 10 # 聊天列表
148
+ opencli boss chatmsg --security-id xxx # 聊天记录
149
+ opencli boss invite --security-id xxx # 邀请沟通
150
+ opencli boss mark --security-id xxx # 标记管理
151
+ opencli boss exchange --security-id xxx # 交换联系方式
152
+ opencli boss resume # 简历管理
153
+ opencli boss stats # 数据统计
136
154
 
137
155
  # YouTube (browser)
138
- opencli youtube search --query "rust" # 搜索视频
139
- opencli youtube video --url "https://www.youtube.com/watch?v=xxx" # 视频元数据(标题、播放量、描述等)
140
- opencli youtube transcript --url "https://www.youtube.com/watch?v=xxx" # 获取视频字幕/转录
141
- opencli youtube transcript --url "xxx" --lang zh-Hans --mode raw # 指定语言 + 原始时间戳模式
156
+ opencli youtube search "rust" # 搜索视频 (query positional)
157
+ opencli youtube video "https://www.youtube.com/watch?v=xxx" # 视频元数据
158
+ opencli youtube transcript "https://www.youtube.com/watch?v=xxx" # 获取视频字幕/转录
159
+ opencli youtube transcript "xxx" --lang zh-Hans --mode raw # 指定语言 + 原始时间戳模式
142
160
 
143
161
  # Yahoo Finance (browser)
144
162
  opencli yahoo-finance quote --symbol AAPL # 股票行情
@@ -147,22 +165,73 @@ opencli yahoo-finance quote --symbol AAPL # 股票行情
147
165
  opencli sinafinance news --limit 10 --type 1 # 7x24实时快讯 (0=全部 1=A股 2=宏观 3=公司 4=数据 5=市场 6=国际 7=观点 8=央行 9=其它)
148
166
 
149
167
  # Reuters (browser)
150
- opencli reuters search --query "AI" # 路透社搜索
168
+ opencli reuters search "AI" # 路透社搜索 (query positional)
151
169
 
152
170
  # 什么值得买 (browser)
153
- opencli smzdm search --keyword "耳机" # 搜索好价
171
+ opencli smzdm search "耳机" # 搜索好价 (query positional)
154
172
 
155
173
  # 携程 (browser)
156
- opencli ctrip search --query "三亚" # 搜索目的地
174
+ opencli ctrip search "三亚" # 搜索目的地 (query positional)
157
175
 
158
176
  # Antigravity (Electron/CDP)
159
177
  opencli antigravity status # 检查 CDP 连接
160
178
  opencli antigravity send "hello" # 发送文本到当前 agent 聊天框
161
179
  opencli antigravity read # 读取整个聊天记录面板
162
180
  opencli antigravity new # 清空聊天、开启新对话
181
+ opencli antigravity dump # 导出 DOM 和快照调试信息
163
182
  opencli antigravity extract-code # 自动抽取 AI 回复中的代码块
164
183
  opencli antigravity model claude # 切换底层模型
165
184
  opencli antigravity watch # 流式监听增量消息
185
+ opencli antigravity serve --port 8082 # 启动 Anthropic 兼容代理
186
+
187
+ # Barchart (browser)
188
+ opencli barchart quote --symbol AAPL # 股票行情
189
+ opencli barchart options --symbol AAPL # 期权链
190
+ opencli barchart greeks --symbol AAPL # 期权 Greeks
191
+ opencli barchart flow --limit 20 # 异常期权活动
192
+
193
+ # Jike 即刻 (browser)
194
+ opencli jike feed --limit 10 # 动态流
195
+ opencli jike search "AI" # 搜索 (query positional)
196
+ opencli jike create "内容" # 发布动态 (text positional)
197
+ opencli jike like xxx # 点赞 (id positional)
198
+ opencli jike comment xxx "评论" # 评论 (id + text positional)
199
+ opencli jike repost xxx # 转发 (id positional)
200
+ opencli jike notifications # 通知
201
+
202
+ # Linux.do (public)
203
+ opencli linux-do hot --limit 10 # 热门话题
204
+ opencli linux-do latest --limit 10 # 最新话题
205
+ opencli linux-do search "rust" # 搜索 (query positional)
206
+ opencli linux-do topic 1024 # 主题详情 (id positional)
207
+
208
+ # StackOverflow (public)
209
+ opencli stackoverflow hot --limit 10 # 热门问题
210
+ opencli stackoverflow search "typescript" # 搜索 (query positional)
211
+ opencli stackoverflow bounties --limit 10 # 悬赏问题
212
+
213
+ # WeRead 微信读书 (browser)
214
+ opencli weread shelf --limit 10 # 书架
215
+ opencli weread search "AI" # 搜索图书 (query positional)
216
+ opencli weread book xxx # 图书详情 (book-id positional)
217
+ opencli weread highlights xxx # 划线笔记 (book-id positional)
218
+ opencli weread notes xxx # 想法笔记 (book-id positional)
219
+ opencli weread ranking --limit 10 # 排行榜
220
+
221
+ # Jimeng 即梦 AI (browser)
222
+ opencli jimeng generate --prompt "描述" # AI 生图
223
+ opencli jimeng history --limit 10 # 生成历史
224
+
225
+ # Grok (default + explicit web)
226
+ opencli grok ask --prompt "问题" # 提问 Grok(兼容默认路径)
227
+ opencli grok ask --prompt "问题" --web # 显式 grok.com consumer web UI 路径
228
+
229
+ # HuggingFace (public)
230
+ opencli hf top --limit 10 # 热门模型
231
+
232
+ # 超星学习通 (browser)
233
+ opencli chaoxing assignments # 作业列表
234
+ opencli chaoxing exams # 考试列表
166
235
  ```
167
236
 
168
237
  ### Management Commands
@@ -300,7 +369,7 @@ cli({
300
369
  site: 'mysite',
301
370
  name: 'search',
302
371
  strategy: Strategy.INTERCEPT, // Or COOKIE
303
- args: [{ name: 'keyword', required: true }],
372
+ args: [{ name: 'query', required: true, positional: true }],
304
373
  columns: ['rank', 'title', 'url'],
305
374
  func: async (page, kwargs) => {
306
375
  await page.goto('https://www.mysite.com/search');
@@ -351,7 +420,7 @@ cli({
351
420
 
352
421
  ```yaml
353
422
  # Arguments with defaults
354
- ${{ args.keyword }}
423
+ ${{ args.query }}
355
424
  ${{ args.limit | default(20) }}
356
425
 
357
426
  # Current item (in map/filter)
@@ -25,13 +25,13 @@ export declare class CDPBridge {
25
25
  }): Promise<IPage>;
26
26
  close(): Promise<void>;
27
27
  /** Send a CDP command with timeout guard (P0 fix #4) */
28
- send(method: string, params?: any, timeoutMs?: number): Promise<any>;
28
+ send(method: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<unknown>;
29
29
  /** Listen for a CDP event */
30
- on(event: string, handler: (params: any) => void): void;
30
+ on(event: string, handler: (params: unknown) => void): void;
31
31
  /** Remove a CDP event listener */
32
- off(event: string, handler: (params: any) => void): void;
32
+ off(event: string, handler: (params: unknown) => void): void;
33
33
  /** Wait for a CDP event to fire (one-shot) */
34
- waitForEvent(event: string, timeoutMs?: number): Promise<any>;
34
+ waitForEvent(event: string, timeoutMs?: number): Promise<unknown>;
35
35
  }
36
36
  declare function selectCDPTarget(targets: CDPTarget[]): CDPTarget | undefined;
37
37
  declare function scoreCDPTarget(target: CDPTarget, preferredPattern?: RegExp): number;
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { WebSocket } from 'ws';
11
11
  import { wrapForEval } from './utils.js';
12
+ import { generateSnapshotJs, scrollToRefJs, getFormStateJs } from './dom-snapshot.js';
12
13
  import { clickJs, typeTextJs, pressKeyJs, waitForTextJs, scrollJs, autoScrollJs, networkRequestsJs, } from './dom-helpers.js';
13
14
  const CDP_SEND_TIMEOUT = 30_000; // 30s per command
14
15
  export class CDPBridge {
@@ -35,7 +36,8 @@ export class CDPBridge {
35
36
  }
36
37
  return new Promise((resolve, reject) => {
37
38
  const ws = new WebSocket(wsUrl);
38
- const timeout = setTimeout(() => reject(new Error('CDP connect timeout')), opts?.timeout ?? 10000);
39
+ const timeoutMs = (opts?.timeout ?? 10) * 1000; // opts.timeout is in seconds
40
+ const timeout = setTimeout(() => reject(new Error('CDP connect timeout')), timeoutMs);
39
41
  ws.on('open', () => {
40
42
  clearTimeout(timeout);
41
43
  this._ws = ws;
@@ -137,12 +139,17 @@ class CDPPage {
137
139
  this.bridge = bridge;
138
140
  }
139
141
  /** Navigate with proper load event waiting (P1 fix #3) */
140
- async goto(url) {
142
+ async goto(url, options) {
141
143
  await this.bridge.send('Page.enable');
142
144
  const loadPromise = this.bridge.waitForEvent('Page.loadEventFired', 30_000)
143
145
  .catch(() => { }); // Don't fail if event times out
144
146
  await this.bridge.send('Page.navigate', { url });
145
147
  await loadPromise;
148
+ // Post-load settle: SPA frameworks need extra time to render after load event
149
+ if (options?.waitUntil !== 'none') {
150
+ const settleMs = options?.settleMs ?? 1000;
151
+ await new Promise(resolve => setTimeout(resolve, settleMs));
152
+ }
146
153
  }
147
154
  async evaluate(js) {
148
155
  const expression = wrapForEval(js);
@@ -158,14 +165,22 @@ class CDPPage {
158
165
  }
159
166
  async getCookies(opts = {}) {
160
167
  const result = await this.bridge.send('Network.getCookies', opts.url ? { urls: [opts.url] } : {});
161
- const cookies = Array.isArray(result?.cookies) ? result.cookies : [];
162
- return opts.domain
163
- ? cookies.filter((cookie) => typeof cookie.domain === 'string' && cookie.domain.includes(opts.domain))
168
+ const cookies = isRecord(result) && Array.isArray(result.cookies) ? result.cookies : [];
169
+ const domain = opts.domain;
170
+ return domain
171
+ ? cookies.filter((cookie) => isCookie(cookie) && cookie.domain.includes(domain))
164
172
  : cookies;
165
173
  }
166
- async snapshot(_opts) {
167
- // CDP doesn't have a built-in accessibility tree equivalent without additional setup
168
- return '(snapshot not available in CDP mode)';
174
+ async snapshot(opts = {}) {
175
+ const snapshotJs = generateSnapshotJs({
176
+ viewportExpand: opts.viewportExpand ?? 800,
177
+ maxDepth: Math.max(1, Math.min(Number(opts.maxDepth) || 50, 200)),
178
+ interactiveOnly: opts.interactive ?? false,
179
+ maxTextLength: opts.maxTextLength ?? 120,
180
+ includeScrollInfo: true,
181
+ bboxDedup: true,
182
+ });
183
+ return this.evaluate(snapshotJs);
169
184
  }
170
185
  // ── Shared DOM operations (P1 fix #5 — using dom-helpers.ts) ──
171
186
  async click(ref) {
@@ -177,13 +192,20 @@ class CDPPage {
177
192
  async pressKey(key) {
178
193
  await this.evaluate(pressKeyJs(key));
179
194
  }
195
+ async scrollTo(ref) {
196
+ return this.evaluate(scrollToRefJs(ref));
197
+ }
198
+ async getFormState() {
199
+ return (await this.evaluate(getFormStateJs()));
200
+ }
180
201
  async wait(options) {
181
202
  if (typeof options === 'number') {
182
203
  await new Promise(resolve => setTimeout(resolve, options * 1000));
183
204
  return;
184
205
  }
185
- if (options.time) {
186
- await new Promise(resolve => setTimeout(resolve, options.time * 1000));
206
+ if (typeof options.time === 'number') {
207
+ const waitTime = options.time;
208
+ await new Promise(resolve => setTimeout(resolve, waitTime * 1000));
187
209
  return;
188
210
  }
189
211
  if (options.text) {
@@ -206,7 +228,7 @@ class CDPPage {
206
228
  quality: options.format === 'jpeg' ? (options.quality ?? 80) : undefined,
207
229
  captureBeyondViewport: options.fullPage ?? false,
208
230
  });
209
- const base64 = result.data;
231
+ const base64 = isRecord(result) && typeof result.data === 'string' ? result.data : '';
210
232
  if (options.path) {
211
233
  const fs = await import('node:fs');
212
234
  const path = await import('node:path');
@@ -217,7 +239,8 @@ class CDPPage {
217
239
  return base64;
218
240
  }
219
241
  async networkRequests(includeStatic = false) {
220
- return this.evaluate(networkRequestsJs(includeStatic));
242
+ const result = await this.evaluate(networkRequestsJs(includeStatic));
243
+ return Array.isArray(result) ? result : [];
221
244
  }
222
245
  async tabs() {
223
246
  return [];
@@ -244,9 +267,18 @@ class CDPPage {
244
267
  async getInterceptedRequests() {
245
268
  const { generateReadInterceptedJs } = await import('../interceptor.js');
246
269
  const result = await this.evaluate(generateReadInterceptedJs('__opencli_xhr'));
247
- return result || [];
270
+ return Array.isArray(result) ? result : [];
248
271
  }
249
272
  }
273
+ function isRecord(value) {
274
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
275
+ }
276
+ function isCookie(value) {
277
+ return isRecord(value)
278
+ && typeof value.name === 'string'
279
+ && typeof value.value === 'string'
280
+ && typeof value.domain === 'string';
281
+ }
250
282
  // ── CDP target selection (unchanged) ──
251
283
  function selectCDPTarget(targets) {
252
284
  const preferredPattern = compilePreferredPattern(process.env.OPENCLI_CDP_TARGET);
@@ -306,8 +338,6 @@ function scoreCDPTarget(target, preferredPattern) {
306
338
  score += 120;
307
339
  if (title.includes('discord'))
308
340
  score += 120;
309
- if (title.includes('netease'))
310
- score += 120;
311
341
  if (url.includes('antigravity'))
312
342
  score += 100;
313
343
  if (url.includes('codex'))
@@ -320,8 +350,6 @@ function scoreCDPTarget(target, preferredPattern) {
320
350
  score += 100;
321
351
  if (url.includes('discord'))
322
352
  score += 100;
323
- if (url.includes('netease'))
324
- score += 100;
325
353
  return score;
326
354
  }
327
355
  function compilePreferredPattern(raw) {
@@ -36,4 +36,5 @@ export declare function isExtensionConnected(): Promise<boolean>;
36
36
  * Retries up to 3 times with 500ms delay for transient failures.
37
37
  */
38
38
  export declare function sendCommand(action: DaemonCommand['action'], params?: Omit<DaemonCommand, 'id' | 'action'>): Promise<unknown>;
39
- export declare function listSessions(): Promise<any[]>;
39
+ export declare function listSessions(): Promise<BrowserSessionInfo[]>;
40
+ import type { BrowserSessionInfo } from '../types.js';
@@ -10,8 +10,21 @@ export function clickJs(ref) {
10
10
  return `
11
11
  (() => {
12
12
  const ref = ${safeRef};
13
- const el = document.querySelector('[data-ref="' + ref + '"]')
14
- || document.querySelectorAll('a, button, input, [role="button"], [tabindex]')[parseInt(ref, 10) || 0];
13
+ // 1. data-opencli-ref (set by snapshot engine)
14
+ let el = document.querySelector('[data-opencli-ref="' + ref + '"]');
15
+ // 2. data-ref (legacy)
16
+ if (!el) el = document.querySelector('[data-ref="' + ref + '"]');
17
+ // 3. CSS selector
18
+ if (!el && ref.match(/^[a-zA-Z#.\\[]/)) {
19
+ try { el = document.querySelector(ref); } catch {}
20
+ }
21
+ // 4. Numeric index into interactive elements
22
+ if (!el) {
23
+ const idx = parseInt(ref, 10);
24
+ if (!isNaN(idx)) {
25
+ el = document.querySelectorAll('a, button, input, select, textarea, [role="button"], [tabindex]:not([tabindex="-1"])')[idx];
26
+ }
27
+ }
15
28
  if (!el) throw new Error('Element not found: ' + ref);
16
29
  el.scrollIntoView({ behavior: 'instant', block: 'center' });
17
30
  el.click();
@@ -26,13 +39,31 @@ export function typeTextJs(ref, text) {
26
39
  return `
27
40
  (() => {
28
41
  const ref = ${safeRef};
29
- const el = document.querySelector('[data-ref="' + ref + '"]')
30
- || document.querySelectorAll('input, textarea, [contenteditable]')[parseInt(ref, 10) || 0];
42
+ // 1. data-opencli-ref (set by snapshot engine)
43
+ let el = document.querySelector('[data-opencli-ref="' + ref + '"]');
44
+ // 2. data-ref (legacy)
45
+ if (!el) el = document.querySelector('[data-ref="' + ref + '"]');
46
+ // 3. CSS selector
47
+ if (!el && ref.match(/^[a-zA-Z#.\\[]/)) {
48
+ try { el = document.querySelector(ref); } catch {}
49
+ }
50
+ // 4. Numeric index into typeable elements
51
+ if (!el) {
52
+ const idx = parseInt(ref, 10);
53
+ if (!isNaN(idx)) {
54
+ el = document.querySelectorAll('input, textarea, [contenteditable="true"]')[idx];
55
+ }
56
+ }
31
57
  if (!el) throw new Error('Element not found: ' + ref);
32
58
  el.focus();
33
- el.value = ${safeText};
34
- el.dispatchEvent(new Event('input', { bubbles: true }));
35
- el.dispatchEvent(new Event('change', { bubbles: true }));
59
+ if (el.isContentEditable) {
60
+ el.textContent = ${safeText};
61
+ el.dispatchEvent(new Event('input', { bubbles: true }));
62
+ } else {
63
+ el.value = ${safeText};
64
+ el.dispatchEvent(new Event('input', { bubbles: true }));
65
+ el.dispatchEvent(new Event('change', { bubbles: true }));
66
+ }
36
67
  return 'typed';
37
68
  })()
38
69
  `;
@@ -0,0 +1,86 @@
1
+ /**
2
+ * DOM Snapshot Engine — Advanced DOM pruning for LLM consumption.
3
+ *
4
+ * Inspired by browser-use's multi-layer pruning pipeline, adapted for opencli's
5
+ * Chrome Extension + CDP architecture. Runs entirely in-page via Runtime.evaluate.
6
+ *
7
+ * Pipeline:
8
+ * 1. Walk DOM tree, collect visibility + layout + interactivity signals
9
+ * 2. Prune invisible, zero-area, non-content elements
10
+ * 3. SVG & decoration collapse
11
+ * 4. Shadow DOM traversal
12
+ * 5. Same-origin iframe content extraction
13
+ * 6. Bounding-box parent-child dedup (link/button wrapping children)
14
+ * 7. Paint-order occlusion detection (overlay/modal coverage)
15
+ * 8. Attribute whitelist filtering
16
+ * 9. Table-aware serialization (markdown tables)
17
+ * 10. Token-efficient serialization with interactive indices
18
+ * 11. data-ref annotation for click/type targeting
19
+ * 12. Hidden interactive element hints (scroll-to-reveal)
20
+ * 13. Incremental diff (mark new elements with *)
21
+ *
22
+ * Additional tools:
23
+ * - scrollToRefJs(ref) — scroll to a data-opencli-ref element
24
+ * - getFormStateJs() — extract all form fields as structured JSON
25
+ */
26
+ export interface SnapshotOptions {
27
+ /** Extra pixels beyond viewport to include (default 800) */
28
+ viewportExpand?: number;
29
+ /** Maximum DOM depth to traverse (default 50) */
30
+ maxDepth?: number;
31
+ /** Only emit interactive elements and their landmark ancestors */
32
+ interactiveOnly?: boolean;
33
+ /** Maximum text content length per node (default 120) */
34
+ maxTextLength?: number;
35
+ /** Include scroll position info on scrollable containers (default true) */
36
+ includeScrollInfo?: boolean;
37
+ /** Enable bounding-box parent-child dedup (default true) */
38
+ bboxDedup?: boolean;
39
+ /** Traverse Shadow DOM roots (default true) */
40
+ includeShadowDom?: boolean;
41
+ /** Extract same-origin iframe content (default true) */
42
+ includeIframes?: boolean;
43
+ /** Maximum number of iframes to process (default 5) */
44
+ maxIframes?: number;
45
+ /** Enable paint-order occlusion detection (default true) */
46
+ paintOrderCheck?: boolean;
47
+ /** Annotate interactive elements with data-opencli-ref (default true) */
48
+ annotateRefs?: boolean;
49
+ /** Report hidden interactive elements outside viewport (default true) */
50
+ reportHidden?: boolean;
51
+ /** Filter ad/noise elements (default true) */
52
+ filterAds?: boolean;
53
+ /** Serialize tables as markdown (default true) */
54
+ markdownTables?: boolean;
55
+ /** Previous snapshot hash set (JSON array of hashes) for diff marking (default null) */
56
+ previousHashes?: string | null;
57
+ }
58
+ /**
59
+ * Generate JS to scroll to an element identified by data-opencli-ref.
60
+ * Completes the snapshot→action loop: snapshot identifies `[3]<button>`,
61
+ * caller can then `scrollToRef('3')` to bring it into view.
62
+ */
63
+ export declare function scrollToRefJs(ref: string): string;
64
+ /**
65
+ * Generate JS to extract all form field values from the page.
66
+ * Returns structured JSON: { forms: [{ id, action, fields: [{ tag, type, name, value, ... }] }] }
67
+ */
68
+ export declare function getFormStateJs(): string;
69
+ /**
70
+ * Generate JavaScript code that, when evaluated in a page context via CDP
71
+ * Runtime.evaluate, returns a pruned DOM snapshot string optimised for LLMs.
72
+ *
73
+ * The snapshot output format:
74
+ * [42]<button type=submit>Search</button>
75
+ * |scroll|<div> (0.5↑ 3.2↓)
76
+ * *[58]<a href=/r/1>Result 1</a>
77
+ * [59]<a href=/r/2>Result 2</a>
78
+ *
79
+ * - `[id]` — interactive element with backend index for targeting
80
+ * - `*` prefix — newly appeared element (incremental diff)
81
+ * - `|scroll|` — scrollable container with page counts
82
+ * - `|shadow|` — Shadow DOM boundary
83
+ * - `|iframe|` — iframe content
84
+ * - `|table|` — markdown table rendering
85
+ */
86
+ export declare function generateSnapshotJs(opts?: SnapshotOptions): string;