@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
@@ -14,7 +14,8 @@ The current built-in commands use native AppleScript automation — no extra lau
14
14
  - `opencli chatgpt status`: Check if the ChatGPT app is currently running.
15
15
  - `opencli chatgpt new`: Activate ChatGPT and press `Cmd+N` to start a new conversation.
16
16
  - `opencli chatgpt send "message"`: Copy your message to clipboard, activate ChatGPT, paste, and submit.
17
- - `opencli chatgpt read`: Copy the last AI response via `Cmd+Shift+C` and return it as text.
17
+ - `opencli chatgpt read`: Read the last visible message from the focused ChatGPT window via the Accessibility tree.
18
+ - `opencli chatgpt ask "message"`: Send a prompt and wait for the visible reply in one shot.
18
19
 
19
20
  ## Approach 2: CDP (Advanced, Electron Debug Mode)
20
21
 
@@ -29,15 +30,15 @@ ChatGPT Desktop is also an Electron app and can be launched with a remote debugg
29
30
  export OPENCLI_CDP_ENDPOINT="http://127.0.0.1:9224"
30
31
  ```
31
32
 
32
- > The CDP approach enables future advanced commands like DOM inspection, model switching, and code extraction.
33
+ > The CDP approach is primarily for advanced automation and future desktop-only commands. The built-in command set above still works in the default AppleScript path unless you explicitly route through `OPENCLI_CDP_ENDPOINT`.
33
34
 
34
35
  ## How It Works
35
36
 
36
- - **AppleScript mode**: Uses `osascript` and `pbcopy`/`pbpaste` for clipboard-based text transfer.
37
+ - **AppleScript mode**: Uses `osascript` to control ChatGPT, `pbcopy`/`pbpaste` to paste prompts, and the macOS Accessibility tree to read visible chat messages.
37
38
  - **CDP mode**: Connects via Chrome DevTools Protocol to the Electron renderer process.
38
39
 
39
40
  ## Limitations
40
41
 
41
42
  - macOS only (AppleScript dependency)
42
43
  - AppleScript mode requires Accessibility permissions
43
- - `read` command copies the last responseearlier messages need manual scroll
44
+ - `read` returns the last visible message in the focused ChatGPT window scroll first if the message you want is not visible
@@ -14,7 +14,7 @@ Control the **OpenAI Codex Desktop App** headless or headfully via Chrome DevToo
14
14
  ## Setup
15
15
 
16
16
  ```bash
17
- export OPENCLI_CODEX_CDP_ENDPOINT="http://127.0.0.1:9222"
17
+ export OPENCLI_CDP_ENDPOINT="http://127.0.0.1:9222"
18
18
  ```
19
19
 
20
20
  ## Commands
@@ -22,11 +22,15 @@ export OPENCLI_CODEX_CDP_ENDPOINT="http://127.0.0.1:9222"
22
22
  ### Diagnostics
23
23
  - `opencli codex status`: Checks connection and reads the current active window URL/title.
24
24
  - `opencli codex dump`: Dumps the full UI DOM and Accessibility tree into `/tmp`.
25
+ - `opencli codex screenshot`: Captures DOM + snapshot artifacts of the current window.
25
26
 
26
27
  ### Agent Manipulation
27
28
  - `opencli codex new`: Simulates `Cmd+N` to start a completely fresh and isolated Git Worktree thread context.
28
29
  - `opencli codex send "message"`: Robustly finds the active Thread Composer and injects your text.
29
30
  - *Pro-tip*: You can trigger internal shortcuts, e.g., `opencli codex send "/review"`.
31
+ - `opencli codex ask "message"`: Send + wait + read in one shot.
30
32
  - `opencli codex read`: Extracts the entire current thread history and AI reasoning logs.
31
33
  - `opencli codex extract-diff`: Automatically scrapes any visual Patch chunks and Code Diffs.
32
34
  - `opencli codex model`: Get the currently active AI model.
35
+ - `opencli codex history`: List recent conversation threads from the sidebar.
36
+ - `opencli codex export`: Export the current conversation as Markdown.
@@ -21,13 +21,17 @@ export OPENCLI_CDP_ENDPOINT="http://127.0.0.1:9226"
21
21
  ### Diagnostics
22
22
  - `opencli cursor status`: Check CDP connection status.
23
23
  - `opencli cursor dump`: Dump the full DOM and Accessibility snapshot to `/tmp/cursor-dom.html` and `/tmp/cursor-snapshot.json`.
24
+ - `opencli cursor screenshot`: Capture DOM + snapshot artifacts of the current window.
24
25
 
25
26
  ### Chat Manipulation
26
27
  - `opencli cursor new`: Press `Cmd+N` to start a new file/tab.
27
28
  - `opencli cursor send "message"`: Inject text into the active Composer/Chat input and submit.
29
+ - `opencli cursor ask "message"`: Send + wait + read in one shot.
28
30
  - `opencli cursor read`: Extract the full conversation history from the active chat panel.
29
31
 
30
32
  ### AI Features
31
33
  - `opencli cursor composer "prompt"`: Open the Composer panel (`Cmd+I`) and send a prompt for inline AI editing.
32
34
  - `opencli cursor model`: Get the currently active AI model (e.g., `claude-4.5-sonnet`).
33
35
  - `opencli cursor extract-code`: Extract all code blocks from the current conversation.
36
+ - `opencli cursor history`: List recent chat/composer sessions from the sidebar.
37
+ - `opencli cursor export`: Export the current conversation as Markdown.
@@ -19,10 +19,10 @@ export OPENCLI_CDP_ENDPOINT="http://127.0.0.1:9232"
19
19
 
20
20
  | Command | Description |
21
21
  |---------|-------------|
22
- | `opencli discord status` | Check CDP connection |
23
- | `opencli discord send "message"` | Send a message in the active channel |
24
- | `opencli discord read` | Read recent messages |
25
- | `opencli discord channels` | List channels in the current server |
26
- | `opencli discord servers` | List all joined servers |
27
- | `opencli discord search "query"` | Search messages (Cmd+F) |
28
- | `opencli discord members` | List online members |
22
+ | `opencli discord-app status` | Check CDP connection |
23
+ | `opencli discord-app send "message"` | Send a message in the active channel |
24
+ | `opencli discord-app read` | Read recent messages |
25
+ | `opencli discord-app channels` | List channels in the current server |
26
+ | `opencli discord-app servers` | List all joined servers |
27
+ | `opencli discord-app search "query"` | Search messages (Cmd+F) |
28
+ | `opencli discord-app members` | List online members |
@@ -14,6 +14,7 @@ Run `opencli list` for the live registry.
14
14
  | **[xueqiu](/adapters/browser/xueqiu)** | `feed` `hot-stock` `hot` `search` `stock` `watchlist` | 🔐 Browser |
15
15
  | **[youtube](/adapters/browser/youtube)** | `search` `video` `transcript` | 🔐 Browser |
16
16
  | **[v2ex](/adapters/browser/v2ex)** | `hot` `latest` `topic` `daily` `me` `notifications` | 🌐 / 🔐 |
17
+ | **[bloomberg](/adapters/browser/bloomberg)** | `main` `markets` `economics` `industries` `tech` `politics` `businessweek` `opinions` `feeds` `news` | 🌐 / 🔐 |
17
18
  | **[weibo](/adapters/browser/weibo)** | `hot` | 🔐 Browser |
18
19
  | **[linkedin](/adapters/browser/linkedin)** | `search` | 🔐 Browser |
19
20
  | **[coupang](/adapters/browser/coupang)** | `search` `add-to-cart` | 🔐 Browser |
@@ -21,17 +22,29 @@ Run `opencli list` for the live registry.
21
22
  | **[ctrip](/adapters/browser/ctrip)** | `search` | 🔐 Browser |
22
23
  | **[reuters](/adapters/browser/reuters)** | `search` | 🔐 Browser |
23
24
  | **[smzdm](/adapters/browser/smzdm)** | `search` | 🔐 Browser |
25
+ | **[jike](/adapters/browser/jike)** | `feed` `search` `post` `topic` `user` `create` `comment` `like` `repost` `notifications` | 🔐 Browser |
26
+ | **[jimeng](/adapters/browser/jimeng)** | `generate` `history` | 🔐 Browser |
27
+ | **[linux-do](/adapters/browser/linux-do)** | `hot` `latest` `categories` `category` `search` `topic` | 🔐 Browser |
28
+ | **[chaoxing](/adapters/browser/chaoxing)** | `assignments` `exams` | 🔐 Browser |
29
+ | **[grok](/adapters/browser/grok)** | `ask` | 🔐 Browser |
30
+ | **[weread](/adapters/browser/weread)** | `shelf` `search` `book` `ranking` `notebooks` `highlights` `notes` | 🔐 Browser |
24
31
 
25
32
  ## Public API Adapters
26
33
 
27
34
  | Site | Commands | Mode |
28
35
  |------|----------|------|
29
36
  | **[hackernews](/adapters/browser/hackernews)** | `top` | 🌐 Public |
30
- | **[github](/adapters/browser/github)** | `search` | 🌐 Public |
31
37
  | **[bbc](/adapters/browser/bbc)** | `news` | 🌐 Public |
38
+ | **[devto](/adapters/browser/devto)** | `top` `tag` `user` | 🌐 Public |
32
39
  | **[apple-podcasts](/adapters/browser/apple-podcasts)** | `search` `episodes` `top` | 🌐 Public |
33
40
  | **[xiaoyuzhou](/adapters/browser/xiaoyuzhou)** | `podcast` `podcast-episodes` `episode` | 🌐 Public |
34
41
  | **[yahoo-finance](/adapters/browser/yahoo-finance)** | `quote` | 🌐 Public |
42
+ | **[arxiv](/adapters/browser/arxiv)** | `search` `paper` | 🌐 Public |
43
+ | **[barchart](/adapters/browser/barchart)** | `quote` `options` `greeks` `flow` | 🌐 Public |
44
+ | **[hf](/adapters/browser/hf)** | `top` | 🌐 Public |
45
+ | **[sinafinance](/adapters/browser/sinafinance)** | `news` | 🌐 Public |
46
+ | **[stackoverflow](/adapters/browser/stackoverflow)** | `hot` `search` `bounties` `unanswered` | 🌐 Public |
47
+ | **[wikipedia](/adapters/browser/wikipedia)** | `search` `summary` | 🌐 Public |
35
48
 
36
49
  ## Desktop Adapters
37
50
 
@@ -44,6 +57,3 @@ Run `opencli list` for the live registry.
44
57
  | **[ChatWise](/adapters/desktop/chatwise)** | Multi-LLM client | `status` `new` `send` `read` `ask` `model` `history` `export` `screenshot` |
45
58
  | **[Notion](/adapters/desktop/notion)** | Search, read, write pages | `status` `search` `read` `new` `write` `sidebar` `favorites` `export` |
46
59
  | **[Discord](/adapters/desktop/discord)** | Desktop messages & channels | `status` `send` `read` `channels` `servers` `search` `members` |
47
- | **[Feishu](/adapters/desktop/feishu)** | 飞书/Lark via AppleScript | `status` `send` `read` `search` `new` |
48
- | **[WeChat](/adapters/desktop/wechat)** | 微信 via AppleScript | `status` `send` `read` `search` `chats` `contacts` |
49
- | **[NeteaseMusic](/adapters/desktop/neteasemusic)** | 网易云音乐 via CDP | `status` `playing` `play` `next` `prev` `search` `playlist` `like` `lyrics` `volume` |
@@ -26,23 +26,23 @@ brew install yt-dlp
26
26
 
27
27
  ```bash
28
28
  # Download images/videos from Xiaohongshu note
29
- opencli xiaohongshu download --note_id abc123 --output ./xhs
29
+ opencli xiaohongshu download --note-id abc123 --output ./xhs
30
30
 
31
31
  # Download Bilibili video (requires yt-dlp)
32
32
  opencli bilibili download --bvid BV1xxx --output ./bilibili
33
33
  opencli bilibili download --bvid BV1xxx --quality 1080p
34
34
 
35
35
  # Download Twitter media from user
36
- opencli twitter download --username elonmusk --limit 20 --output ./twitter
36
+ opencli twitter download elonmusk --limit 20 --output ./twitter
37
37
 
38
38
  # Download single tweet media
39
39
  opencli twitter download --tweet-url "https://x.com/user/status/123" --output ./twitter
40
40
 
41
41
  # Export Zhihu article to Markdown
42
- opencli zhihu download --url "https://zhuanlan.zhihu.com/p/xxx" --output ./zhihu
42
+ opencli zhihu download "https://zhuanlan.zhihu.com/p/xxx" --output ./zhihu
43
43
 
44
44
  # Export with local images
45
- opencli zhihu download --url "https://zhuanlan.zhihu.com/p/xxx" --download-images
45
+ opencli zhihu download "https://zhuanlan.zhihu.com/p/xxx" --download-images
46
46
  ```
47
47
 
48
48
  ## Pipeline Step (YAML Adapters)
@@ -34,8 +34,14 @@ OpenCLI is built on a **Dual-Engine Architecture** that supports both declarativ
34
34
  ### Registry (`src/registry.ts`)
35
35
  Central command registry. All adapters register their commands via the `cli()` function with metadata: site, name, description, domain, strategy, args, columns.
36
36
 
37
- ### Engine (`src/engine.ts`)
38
- Command discovery and execution engine. Discovers commands from the registry, parses arguments, executes the appropriate adapter, and routes output through the formatter.
37
+ ### Discovery (`src/discovery.ts`)
38
+ CLI discovery and manifest loading. Discovers commands from YAML and TypeScript adapter files, parses YAML pipelines, and registers them into the central registry.
39
+
40
+ ### Execution (`src/execution.ts`)
41
+ Command execution: argument validation, lazy loading of adapter modules, and executing the appropriate handler function.
42
+
43
+ ### Commander Adapter (`src/commanderAdapter.ts`)
44
+ Bridges the Registry commands to Commander.js subcommands. Handles positional args, named options, browser session wiring, and output formatting. Isolates all Commander-specific logic so the core is framework-agnostic.
39
45
 
40
46
  ### Browser (`src/browser.ts`)
41
47
  Manages connections to Chrome via the Browser Bridge WebSocket daemon. Handles JSON-RPC messaging, tab management, and extension/standalone mode switching.
@@ -60,15 +66,22 @@ OpenCLI uses a 3-tier authentication strategy:
60
66
  | `public` | Direct HTTP fetch, no auth | Public APIs (HackerNews, BBC) |
61
67
  | `cookie` | Reuse Chrome cookies via Browser Bridge | Logged-in sites (Bilibili, Zhihu) |
62
68
  | `header` | Custom auth headers | API-key based services |
69
+ | `intercept` | Network request interception | GraphQL/XHR capture (Twitter) |
70
+ | `ui` | DOM interaction via accessibility snapshot | Desktop apps, write operations |
63
71
 
64
72
  ## Directory Structure
65
73
 
66
74
  ```
67
75
  src/
68
76
  ├── main.ts # Entry point
69
- ├── engine.ts # Command execution engine
77
+ ├── cli.ts # Commander.js CLI setup + built-in commands
78
+ ├── commanderAdapter.ts # Registry → Commander bridge
79
+ ├── discovery.ts # CLI discovery, manifest loading, YAML parsing
80
+ ├── execution.ts # Arg validation, command execution
70
81
  ├── registry.ts # Command registry
71
- ├── browser.ts # Browser Bridge connection
82
+ ├── serialization.ts # Command serialization helpers
83
+ ├── runtime.ts # Browser session & timeout management
84
+ ├── browser/ # Browser Bridge connection
72
85
  ├── output.ts # Output formatting
73
86
  ├── doctor.ts # Diagnostic tool
74
87
  ├── pipeline/ # YAML pipeline engine
@@ -52,5 +52,6 @@ opencli bilibili hot -v # Verbose: show pipeline debug
52
52
 
53
53
  - [Installation details](/guide/installation)
54
54
  - [Browser Bridge setup](/guide/browser-bridge)
55
+ - [Plugins — extend with community adapters](/guide/plugins)
55
56
  - [All available adapters](/adapters/)
56
57
  - [For developers / AI agents](/developer/contributing)
@@ -0,0 +1,153 @@
1
+ # Plugins
2
+
3
+ OpenCLI supports community-contributed plugins. Install third-party adapters from GitHub, and they're automatically discovered alongside built-in commands.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # Install a plugin
9
+ opencli plugin install github:ByteYue/opencli-plugin-github-trending
10
+
11
+ # List installed plugins
12
+ opencli plugin list
13
+
14
+ # Use the plugin (it's just a regular command)
15
+ opencli github-trending repos --limit 10
16
+
17
+ # Remove a plugin
18
+ opencli plugin uninstall github-trending
19
+ ```
20
+
21
+ ## How Plugins Work
22
+
23
+ Plugins live in `~/.opencli/plugins/<name>/`. Each subdirectory is scanned at startup for `.yaml`, `.ts`, or `.js` command files — the same formats used by built-in adapters.
24
+
25
+ ### Supported Source Formats
26
+
27
+ ```bash
28
+ opencli plugin install github:user/repo
29
+ opencli plugin install https://github.com/user/repo
30
+ ```
31
+
32
+ The repo name prefix `opencli-plugin-` is automatically stripped for the local directory name. For example, `opencli-plugin-hot-digest` becomes `hot-digest`.
33
+
34
+ ## Creating a Plugin
35
+
36
+ ### Option 1: YAML Plugin (Simplest)
37
+
38
+ Zero dependencies, no build step. Just create a `.yaml` file:
39
+
40
+ ```
41
+ my-plugin/
42
+ ├── my-command.yaml
43
+ └── README.md
44
+ ```
45
+
46
+ Example `my-command.yaml`:
47
+
48
+ ```yaml
49
+ site: my-plugin
50
+ name: my-command
51
+ description: My custom command
52
+ strategy: public
53
+ browser: false
54
+
55
+ args:
56
+ limit:
57
+ type: int
58
+ default: 10
59
+
60
+ pipeline:
61
+ - fetch:
62
+ url: https://api.example.com/data
63
+ - map:
64
+ title: ${{ item.title }}
65
+ score: ${{ item.score }}
66
+ - limit: ${{ args.limit }}
67
+
68
+ columns: [title, score]
69
+ ```
70
+
71
+ ### Option 2: TypeScript Plugin
72
+
73
+ For richer logic (multi-source aggregation, custom transformations, etc.):
74
+
75
+ ```
76
+ my-plugin/
77
+ ├── package.json
78
+ ├── my-command.ts
79
+ └── README.md
80
+ ```
81
+
82
+ `package.json`:
83
+
84
+ ```json
85
+ {
86
+ "name": "opencli-plugin-my-plugin",
87
+ "version": "0.1.0",
88
+ "type": "module",
89
+ "peerDependencies": {
90
+ "@jackwener/opencli": ">=1.0.0"
91
+ }
92
+ }
93
+ ```
94
+
95
+ `my-command.ts`:
96
+
97
+ ```typescript
98
+ import { cli, Strategy } from '@jackwener/opencli/registry';
99
+
100
+ cli({
101
+ site: 'my-plugin',
102
+ name: 'my-command',
103
+ description: 'My custom command',
104
+ strategy: Strategy.PUBLIC,
105
+ browser: false,
106
+ args: [
107
+ { name: 'limit', type: 'int', default: 10, help: 'Number of items' },
108
+ ],
109
+ columns: ['title', 'score'],
110
+ func: async (_page, kwargs) => {
111
+ const res = await fetch('https://api.example.com/data');
112
+ const data = await res.json();
113
+ return data.items.slice(0, kwargs.limit).map((item: any, i: number) => ({
114
+ title: item.title,
115
+ score: item.score,
116
+ }));
117
+ },
118
+ });
119
+ ```
120
+
121
+ ### TS Plugin Install Lifecycle
122
+
123
+ When you run `opencli plugin install`, TS plugins are automatically set up:
124
+
125
+ 1. **Clone** — `git clone --depth 1` from GitHub
126
+ 2. **npm install** — Resolves regular dependencies
127
+ 3. **Host symlink** — Links the running `@jackwener/opencli` into the plugin's `node_modules/` so `import from '@jackwener/opencli/registry'` always resolves against the host
128
+ 4. **Transpile** — Compiles `.ts` → `.js` via `esbuild` (production `node` cannot load `.ts` directly)
129
+
130
+ On startup, if both `my-command.ts` and `my-command.js` exist, the `.js` version is loaded to avoid duplicate registration.
131
+
132
+ ## Example Plugins
133
+
134
+ | Repo | Type | Description |
135
+ |------|------|-------------|
136
+ | [opencli-plugin-github-trending](https://github.com/ByteYue/opencli-plugin-github-trending) | YAML | GitHub Trending repositories |
137
+ | [opencli-plugin-hot-digest](https://github.com/ByteYue/opencli-plugin-hot-digest) | TS | Multi-platform trending aggregator (zhihu, weibo, bilibili, v2ex, stackoverflow, reddit, linux-do) |
138
+ | [opencli-plugin-juejin](https://github.com/Astro-Han/opencli-plugin-juejin) | YAML | 稀土掘金 (Juejin) hot articles, categories, and article feed |
139
+
140
+ ## Troubleshooting
141
+
142
+ ### Command not found after install
143
+
144
+ Restart opencli (or open a new terminal) — plugins are discovered at startup.
145
+
146
+ ### TS plugin import errors
147
+
148
+ If you see `Cannot find module '@jackwener/opencli/registry'`, the host symlink may be broken. Reinstall the plugin:
149
+
150
+ ```bash
151
+ opencli plugin uninstall my-plugin
152
+ opencli plugin install github:user/opencli-plugin-my-plugin
153
+ ```
@@ -0,0 +1,107 @@
1
+ # 插件
2
+
3
+ OpenCLI 支持社区贡献的 plugins。你可以从 GitHub 安装第三方 adapters,它们会和内置 commands 一起在启动时自动发现。
4
+
5
+ ## 安装插件
6
+
7
+ ```bash
8
+ # 安装插件
9
+ opencli plugin install github:ByteYue/opencli-plugin-github-trending
10
+
11
+ # 列出已安装插件
12
+ opencli plugin list
13
+
14
+ # 使用插件(本质上就是普通 command)
15
+ opencli github-trending today
16
+
17
+ # 卸载插件
18
+ opencli plugin uninstall github-trending
19
+ ```
20
+
21
+ ## 插件目录结构
22
+
23
+ Plugins 存放在 `~/.opencli/plugins/<name>/`。每个子目录都会在启动时扫描 `.yaml`、`.ts`、`.js` 命令文件,格式与内置 adapters 相同。
24
+
25
+ ## 安装来源
26
+
27
+ ```bash
28
+ opencli plugin install github:user/repo
29
+ opencli plugin install https://github.com/user/repo
30
+ ```
31
+
32
+ 如果仓库名带 `opencli-plugin-` 前缀,本地目录会自动去掉这个前缀。例如 `opencli-plugin-hot-digest` 会变成 `hot-digest`。
33
+
34
+ ## YAML plugin 示例
35
+
36
+ ```text
37
+ my-plugin/
38
+ hot.yaml
39
+ ```
40
+
41
+ ```yaml
42
+ site: my-plugin
43
+ name: hot
44
+ description: Example plugin command
45
+ strategy: public
46
+ browser: false
47
+
48
+ pipeline:
49
+ - evaluate: |
50
+ () => [{ title: 'hello', url: 'https://example.com' }]
51
+
52
+ columns: [title, url]
53
+ ```
54
+
55
+ ## TypeScript plugin 示例
56
+
57
+ ```text
58
+ my-plugin/
59
+ index.ts
60
+ package.json
61
+ ```
62
+
63
+ ```json
64
+ {
65
+ "name": "opencli-plugin-my-plugin",
66
+ "type": "module"
67
+ }
68
+ ```
69
+
70
+ ```ts
71
+ import { cli, Strategy } from '@jackwener/opencli/registry';
72
+
73
+ cli({
74
+ site: 'my-plugin',
75
+ name: 'hot',
76
+ description: 'Example TS plugin command',
77
+ strategy: Strategy.PUBLIC,
78
+ browser: false,
79
+ columns: ['title', 'url'],
80
+ func: async () => [{ title: 'hello', url: 'https://example.com' }],
81
+ });
82
+ ```
83
+
84
+ 运行 `opencli plugin install` 时,TS plugins 会自动完成基础设置:
85
+
86
+ 1. 安装 plugin 自身依赖
87
+ 2. 补齐 TypeScript 运行环境
88
+ 3. 将宿主 `@jackwener/opencli` 链接到 plugin 的 `node_modules/`,保证 `@jackwener/opencli/registry` 指向当前宿主版本
89
+
90
+ ## 示例 plugins
91
+
92
+ - `opencli-plugin-github-trending`:GitHub Trending 仓库
93
+ - `opencli-plugin-hot-digest`:多平台热点聚合(zhihu、weibo、bilibili、v2ex、stackoverflow、reddit、linux-do)
94
+ - `opencli-plugin-juejin`:稀土掘金热榜、分类和文章流
95
+
96
+ ## 排查问题
97
+
98
+ ### TS plugin import 报错
99
+
100
+ 如果看到 `Cannot find module '@jackwener/opencli/registry'`,通常是宿主 symlink 失效。重新安装 plugin 即可:
101
+
102
+ ```bash
103
+ opencli plugin uninstall my-plugin
104
+ opencli plugin install github:user/opencli-plugin-my-plugin
105
+ ```
106
+
107
+ 安装或卸载 plugin 后,建议重新打开一个终端,确保启动时重新发现命令。
@@ -226,8 +226,8 @@ async function handleCommand(cmd: Command): Promise<Result> {
226
226
 
227
227
  // ─── Action handlers ─────────────────────────────────────────────────
228
228
 
229
- /** Check if a URL is a debuggable web page (not chrome:// or extension page) */
230
- function isWebUrl(url?: string): boolean {
229
+ /** Check if a URL can be attached via CDP (not chrome:// or chrome-extension://) */
230
+ function isDebuggableUrl(url?: string): boolean {
231
231
  if (!url) return false;
232
232
  return !url.startsWith('chrome://') && !url.startsWith('chrome-extension://');
233
233
  }
@@ -243,15 +243,22 @@ async function resolveTabId(tabId: number | undefined, workspace: string): Promi
243
243
  // Get (or create) the automation window
244
244
  const windowId = await getAutomationWindow(workspace);
245
245
 
246
- // Find the active tab in our automation window
246
+ // Prefer an existing debuggable tab (about:blank, http://, https://, etc.)
247
247
  const tabs = await chrome.tabs.query({ windowId });
248
- const webTab = tabs.find(t => t.id && isWebUrl(t.url));
249
- if (webTab?.id) return webTab.id;
250
-
251
- // Use the first tab if it's a blank/new tab page
252
- if (tabs.length > 0 && tabs[0]?.id) return tabs[0].id;
248
+ const debuggableTab = tabs.find(t => t.id && isDebuggableUrl(t.url));
249
+ if (debuggableTab?.id) return debuggableTab.id;
250
+
251
+ // No debuggable tab found this typically happens when a "New Tab Override"
252
+ // extension replaces about:blank with a chrome-extension:// page.
253
+ // Reuse the first existing tab by navigating it to about:blank (avoids
254
+ // accumulating orphan tabs if chrome.tabs.create is also intercepted).
255
+ const reuseTab = tabs.find(t => t.id);
256
+ if (reuseTab?.id) {
257
+ await chrome.tabs.update(reuseTab.id, { url: 'about:blank' });
258
+ return reuseTab.id;
259
+ }
253
260
 
254
- // No suitable tab — create one
261
+ // Window has no tabs at all — create one
255
262
  const newTab = await chrome.tabs.create({ windowId, url: 'about:blank', active: true });
256
263
  if (!newTab.id) throw new Error('Failed to create tab in automation window');
257
264
  return newTab.id;
@@ -270,7 +277,7 @@ async function listAutomationTabs(workspace: string): Promise<chrome.tabs.Tab[]>
270
277
 
271
278
  async function listAutomationWebTabs(workspace: string): Promise<chrome.tabs.Tab[]> {
272
279
  const tabs = await listAutomationTabs(workspace);
273
- return tabs.filter((tab) => isWebUrl(tab.url));
280
+ return tabs.filter((tab) => isDebuggableUrl(tab.url));
274
281
  }
275
282
 
276
283
  async function handleExec(cmd: Command, workspace: string): Promise<Result> {
@@ -415,7 +422,7 @@ async function handleSessions(cmd: Command): Promise<Result> {
415
422
  const data = await Promise.all([...automationSessions.entries()].map(async ([workspace, session]) => ({
416
423
  workspace,
417
424
  windowId: session.windowId,
418
- tabCount: (await chrome.tabs.query({ windowId: session.windowId })).filter((tab) => isWebUrl(tab.url)).length,
425
+ tabCount: (await chrome.tabs.query({ windowId: session.windowId })).filter((tab) => isDebuggableUrl(tab.url)).length,
419
426
  idleMsRemaining: Math.max(0, session.idleDeadlineAt - now),
420
427
  })));
421
428
  return { id: cmd.id, ok: true, data };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jackwener/opencli",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -13,10 +13,15 @@
13
13
  "bin": {
14
14
  "opencli": "dist/main.js"
15
15
  },
16
+ "exports": {
17
+ ".": "./dist/main.js",
18
+ "./registry": "./dist/registry-api.js"
19
+ },
16
20
  "scripts": {
17
21
  "dev": "tsx src/main.ts",
18
- "build": "tsc && npm run clean-yaml && npm run copy-yaml && npm run build-manifest",
22
+ "build": "npm run clean-dist && tsc && npm run clean-yaml && npm run copy-yaml && npm run build-manifest",
19
23
  "build-manifest": "node dist/build-manifest.js",
24
+ "clean-dist": "node scripts/clean-dist.cjs",
20
25
  "clean-yaml": "node scripts/clean-yaml.cjs",
21
26
  "copy-yaml": "node scripts/copy-yaml.cjs",
22
27
  "start": "node dist/main.js",
@@ -24,9 +29,9 @@
24
29
  "typecheck": "tsc --noEmit",
25
30
  "lint": "tsc --noEmit",
26
31
  "prepublishOnly": "npm run build",
27
- "test": "vitest run",
28
- "test:site": "node scripts/test-site.mjs",
29
- "test:watch": "vitest",
32
+ "test": "vitest run --project unit",
33
+ "test:all": "vitest run",
34
+ "test:e2e": "vitest run --project e2e",
30
35
  "docs:dev": "vitepress dev docs",
31
36
  "docs:build": "vitepress build docs",
32
37
  "docs:preview": "vitepress preview docs"
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env bash
2
+ # check-doc-coverage.sh — Verify every adapter in src/clis/ has a doc page.
3
+ #
4
+ # Exit codes:
5
+ # 0 — all adapters have docs
6
+ # 1 — at least one adapter is missing documentation
7
+ #
8
+ # Usage:
9
+ # bash scripts/check-doc-coverage.sh # report only
10
+ # bash scripts/check-doc-coverage.sh --strict # exit 1 on missing docs
11
+
12
+ set -euo pipefail
13
+
14
+ STRICT=false
15
+ if [[ "${1:-}" == "--strict" ]]; then
16
+ STRICT=true
17
+ fi
18
+
19
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
20
+ ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
21
+
22
+ SRC_DIR="$ROOT_DIR/src/clis"
23
+ DOCS_DIR="$ROOT_DIR/docs/adapters"
24
+
25
+ missing=()
26
+ covered=0
27
+ total=0
28
+
29
+ for adapter_dir in "$SRC_DIR"/*/; do
30
+ adapter_name="$(basename "$adapter_dir")"
31
+ total=$((total + 1))
32
+
33
+ # Check if doc exists in browser/ or desktop/ subdirectories
34
+ if [[ -f "$DOCS_DIR/browser/$adapter_name.md" ]] || \
35
+ [[ -f "$DOCS_DIR/desktop/$adapter_name.md" ]]; then
36
+ covered=$((covered + 1))
37
+ else
38
+ # Handle directory name mismatches (e.g., discord-app -> discord)
39
+ alt_name="${adapter_name%-app}"
40
+ if [[ "$alt_name" != "$adapter_name" ]] && \
41
+ { [[ -f "$DOCS_DIR/browser/$alt_name.md" ]] || \
42
+ [[ -f "$DOCS_DIR/desktop/$alt_name.md" ]]; }; then
43
+ covered=$((covered + 1))
44
+ else
45
+ missing+=("$adapter_name")
46
+ fi
47
+ fi
48
+ done
49
+
50
+ echo "📊 Doc Coverage: $covered/$total adapters documented"
51
+ echo ""
52
+
53
+ if [[ ${#missing[@]} -gt 0 ]]; then
54
+ echo "⚠️ Missing docs for ${#missing[@]} adapter(s):"
55
+ for name in "${missing[@]}"; do
56
+ echo " - $name → create docs/adapters/browser/$name.md or docs/adapters/desktop/$name.md"
57
+ done
58
+ echo ""
59
+ if $STRICT; then
60
+ echo "❌ Doc check failed (--strict mode)."
61
+ exit 1
62
+ else
63
+ echo "💡 Run with --strict to fail CI on missing docs."
64
+ exit 0
65
+ fi
66
+ else
67
+ echo "✅ All adapters have documentation."
68
+ exit 0
69
+ fi
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Remove dist/ before a fresh build so deleted adapters do not leave stale
3
+ * compiled files behind in dist/clis/.
4
+ */
5
+ const { existsSync, rmSync } = require('fs');
6
+
7
+ if (existsSync('dist')) {
8
+ rmSync('dist', { recursive: true, force: true });
9
+ }
10
+
11
+ if (existsSync('tsconfig.tsbuildinfo')) {
12
+ rmSync('tsconfig.tsbuildinfo', { force: true });
13
+ }