@jackwener/opencli 1.1.0 → 1.1.1

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 (354) 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/README.md +25 -10
  8. package/README.zh-CN.md +26 -11
  9. package/SKILL.md +95 -31
  10. package/dist/browser/cdp.js +6 -1
  11. package/dist/browser/page.d.ts +4 -1
  12. package/dist/browser/page.js +7 -1
  13. package/dist/build-manifest.js +23 -16
  14. package/dist/cli-manifest.json +431 -276
  15. package/dist/cli.d.ts +6 -0
  16. package/dist/cli.js +189 -162
  17. package/dist/clis/apple-podcasts/commands.test.d.ts +2 -0
  18. package/dist/clis/apple-podcasts/commands.test.js +76 -0
  19. package/dist/clis/apple-podcasts/search.js +2 -2
  20. package/dist/clis/apple-podcasts/top.js +9 -2
  21. package/dist/clis/arxiv/search.js +1 -1
  22. package/dist/clis/bilibili/dynamic.js +1 -1
  23. package/dist/clis/bilibili/favorite.js +1 -1
  24. package/dist/clis/bilibili/feed.js +1 -1
  25. package/dist/clis/bilibili/following.js +1 -1
  26. package/dist/clis/bilibili/history.js +1 -1
  27. package/dist/clis/bilibili/me.js +1 -1
  28. package/dist/clis/bilibili/ranking.js +1 -1
  29. package/dist/clis/bilibili/search.js +3 -3
  30. package/dist/clis/bilibili/subtitle.js +1 -1
  31. package/dist/clis/bilibili/user-videos.js +1 -1
  32. package/dist/{bilibili.d.ts → clis/bilibili/utils.d.ts} +1 -1
  33. package/dist/clis/bloomberg/businessweek.js +17 -0
  34. package/dist/clis/bloomberg/economics.js +17 -0
  35. package/dist/clis/bloomberg/feeds.d.ts +1 -0
  36. package/dist/clis/bloomberg/feeds.js +15 -0
  37. package/dist/clis/bloomberg/industries.d.ts +1 -0
  38. package/dist/clis/bloomberg/industries.js +17 -0
  39. package/dist/clis/bloomberg/main.d.ts +1 -0
  40. package/dist/clis/bloomberg/main.js +17 -0
  41. package/dist/clis/bloomberg/markets.d.ts +1 -0
  42. package/dist/clis/bloomberg/markets.js +17 -0
  43. package/dist/clis/bloomberg/news.d.ts +1 -0
  44. package/dist/clis/bloomberg/news.js +105 -0
  45. package/dist/clis/bloomberg/opinions.d.ts +1 -0
  46. package/dist/clis/bloomberg/opinions.js +17 -0
  47. package/dist/clis/bloomberg/politics.d.ts +1 -0
  48. package/dist/clis/bloomberg/politics.js +17 -0
  49. package/dist/clis/bloomberg/tech.d.ts +1 -0
  50. package/dist/clis/bloomberg/tech.js +17 -0
  51. package/dist/clis/bloomberg/utils.d.ts +34 -0
  52. package/dist/clis/bloomberg/utils.js +364 -0
  53. package/dist/clis/bloomberg/utils.test.d.ts +1 -0
  54. package/dist/clis/bloomberg/utils.test.js +129 -0
  55. package/dist/clis/boss/batchgreet.js +2 -2
  56. package/dist/clis/boss/chatlist.js +2 -2
  57. package/dist/clis/boss/detail.js +2 -2
  58. package/dist/clis/boss/greet.js +4 -4
  59. package/dist/clis/boss/search.js +1 -1
  60. package/dist/clis/boss/send.js +1 -1
  61. package/dist/clis/boss/stats.js +2 -2
  62. package/dist/clis/chaoxing/assignments.js +1 -1
  63. package/dist/clis/chaoxing/exams.js +1 -1
  64. package/dist/{chaoxing.d.ts → clis/chaoxing/utils.d.ts} +1 -1
  65. package/dist/{chaoxing.js → clis/chaoxing/utils.js} +0 -2
  66. package/dist/clis/chaoxing/utils.test.d.ts +1 -0
  67. package/dist/{chaoxing.test.js → clis/chaoxing/utils.test.js} +1 -1
  68. package/dist/clis/chatgpt/read.js +1 -1
  69. package/dist/clis/chatwise/export.js +1 -1
  70. package/dist/clis/chatwise/model.js +2 -2
  71. package/dist/clis/chatwise/screenshot.js +1 -1
  72. package/dist/clis/codex/export.js +1 -1
  73. package/dist/clis/codex/model.js +2 -2
  74. package/dist/clis/codex/screenshot.js +1 -1
  75. package/dist/clis/coupang/add-to-cart.js +3 -4
  76. package/dist/clis/coupang/search.js +2 -4
  77. package/dist/clis/coupang/utils.test.d.ts +1 -0
  78. package/dist/{coupang.test.js → clis/coupang/utils.test.js} +1 -1
  79. package/dist/clis/ctrip/search.js +1 -1
  80. package/dist/clis/cursor/export.js +1 -1
  81. package/dist/clis/cursor/model.js +2 -2
  82. package/dist/clis/cursor/screenshot.js +1 -1
  83. package/dist/clis/jike/comment.js +2 -3
  84. package/dist/clis/jike/create.js +1 -2
  85. package/dist/clis/jike/feed.js +0 -1
  86. package/dist/clis/jike/like.js +1 -2
  87. package/dist/clis/jike/notifications.js +0 -1
  88. package/dist/clis/jike/post.yaml +1 -0
  89. package/dist/clis/jike/repost.js +1 -2
  90. package/dist/clis/jike/search.js +2 -3
  91. package/dist/clis/jike/topic.yaml +1 -0
  92. package/dist/clis/jike/user.yaml +1 -0
  93. package/dist/clis/jimeng/history.yaml +0 -1
  94. package/dist/clis/linkedin/search.js +7 -7
  95. package/dist/clis/linux-do/category.yaml +1 -0
  96. package/dist/clis/linux-do/search.yaml +4 -3
  97. package/dist/clis/linux-do/topic.yaml +1 -0
  98. package/dist/clis/notion/export.js +1 -1
  99. package/dist/clis/reddit/comment.js +3 -4
  100. package/dist/clis/reddit/read.js +4 -5
  101. package/dist/clis/reddit/save.js +2 -3
  102. package/dist/clis/reddit/saved.js +0 -1
  103. package/dist/clis/reddit/search.yaml +1 -0
  104. package/dist/clis/reddit/subscribe.js +0 -1
  105. package/dist/clis/reddit/upvote.js +2 -3
  106. package/dist/clis/reddit/upvoted.js +0 -1
  107. package/dist/clis/reddit/user-comments.yaml +1 -0
  108. package/dist/clis/reddit/user-posts.yaml +1 -0
  109. package/dist/clis/reddit/user.yaml +1 -0
  110. package/dist/clis/reuters/search.js +1 -1
  111. package/dist/clis/smzdm/search.js +2 -3
  112. package/dist/clis/stackoverflow/search.yaml +1 -0
  113. package/dist/clis/steam/top-sellers.yaml +29 -0
  114. package/dist/clis/twitter/accept.js +2 -2
  115. package/dist/clis/twitter/article.js +2 -2
  116. package/dist/clis/twitter/block.d.ts +1 -0
  117. package/dist/clis/twitter/block.js +88 -0
  118. package/dist/clis/twitter/delete.js +1 -1
  119. package/dist/clis/twitter/hide-reply.d.ts +1 -0
  120. package/dist/clis/twitter/hide-reply.js +66 -0
  121. package/dist/clis/twitter/like.js +1 -1
  122. package/dist/clis/twitter/post.js +1 -1
  123. package/dist/clis/twitter/reply-dm.js +1 -1
  124. package/dist/clis/twitter/reply.js +2 -2
  125. package/dist/clis/twitter/search.js +1 -1
  126. package/dist/clis/twitter/thread.js +2 -2
  127. package/dist/clis/twitter/trending.d.ts +1 -0
  128. package/dist/clis/twitter/trending.js +91 -0
  129. package/dist/clis/twitter/unblock.d.ts +1 -0
  130. package/dist/clis/twitter/unblock.js +71 -0
  131. package/dist/clis/v2ex/topic.yaml +1 -0
  132. package/dist/clis/weibo/hot.js +0 -1
  133. package/dist/clis/weread/book.js +1 -1
  134. package/dist/clis/weread/highlights.js +1 -1
  135. package/dist/clis/weread/notes.js +1 -1
  136. package/dist/clis/weread/search.js +1 -1
  137. package/dist/clis/wikipedia/search.js +1 -1
  138. package/dist/clis/xiaohongshu/creator-note-detail.d.ts +15 -0
  139. package/dist/clis/xiaohongshu/creator-note-detail.js +69 -5
  140. package/dist/clis/xiaohongshu/creator-note-detail.test.js +80 -33
  141. package/dist/clis/xiaohongshu/creator-notes.js +35 -5
  142. package/dist/clis/xiaohongshu/creator-notes.test.js +35 -6
  143. package/dist/clis/xiaohongshu/creator-profile.js +0 -1
  144. package/dist/clis/xiaohongshu/creator-stats.js +0 -1
  145. package/dist/clis/xiaohongshu/download.js +2 -3
  146. package/dist/clis/xiaohongshu/feed.yaml +0 -1
  147. package/dist/clis/xiaohongshu/notifications.yaml +0 -1
  148. package/dist/clis/xiaohongshu/search.js +2 -2
  149. package/dist/clis/xiaohongshu/user.js +1 -2
  150. package/dist/clis/yahoo-finance/quote.js +0 -1
  151. package/dist/clis/youtube/search.js +1 -1
  152. package/dist/clis/youtube/transcript.js +1 -1
  153. package/dist/clis/youtube/video.js +1 -1
  154. package/dist/clis/zhihu/download.js +1 -2
  155. package/dist/clis/zhihu/question.js +1 -1
  156. package/dist/clis/zhihu/search.yaml +4 -3
  157. package/dist/commanderAdapter.d.ts +21 -0
  158. package/dist/commanderAdapter.js +111 -0
  159. package/dist/{engine.d.ts → discovery.d.ts} +0 -6
  160. package/dist/{engine.js → discovery.js} +1 -98
  161. package/dist/download/index.d.ts +2 -6
  162. package/dist/download/index.js +19 -46
  163. package/dist/engine.test.d.ts +1 -1
  164. package/dist/engine.test.js +8 -7
  165. package/dist/execution.d.ts +22 -0
  166. package/dist/execution.js +129 -0
  167. package/dist/explore.js +121 -107
  168. package/dist/external-clis.yaml +48 -0
  169. package/dist/external.d.ts +7 -2
  170. package/dist/external.js +11 -14
  171. package/dist/main.js +1 -1
  172. package/dist/pipeline/steps/browser.js +8 -2
  173. package/dist/registry.d.ts +2 -0
  174. package/dist/registry.js +2 -0
  175. package/dist/runtime.d.ts +5 -0
  176. package/dist/runtime.js +8 -0
  177. package/dist/serialization.d.ts +34 -0
  178. package/dist/serialization.js +63 -0
  179. package/dist/types.d.ts +4 -1
  180. package/docs/.vitepress/config.mts +14 -3
  181. package/docs/adapters/browser/arxiv.md +27 -0
  182. package/docs/adapters/browser/barchart.md +32 -0
  183. package/docs/adapters/browser/bloomberg.md +70 -0
  184. package/docs/adapters/browser/chaoxing.md +39 -0
  185. package/docs/adapters/browser/grok.md +35 -0
  186. package/docs/adapters/browser/hf.md +42 -0
  187. package/docs/adapters/browser/jike.md +45 -0
  188. package/docs/adapters/browser/jimeng.md +39 -0
  189. package/docs/adapters/browser/linux-do.md +45 -0
  190. package/docs/adapters/browser/sinafinance.md +35 -0
  191. package/docs/adapters/browser/stackoverflow.md +35 -0
  192. package/docs/adapters/browser/steam.md +26 -0
  193. package/docs/adapters/browser/twitter.md +3 -0
  194. package/docs/adapters/browser/weread.md +48 -0
  195. package/docs/adapters/browser/wikipedia.md +30 -0
  196. package/docs/adapters/browser/xiaohongshu.md +5 -1
  197. package/docs/adapters/desktop/chatgpt.md +3 -3
  198. package/docs/adapters/index.md +13 -0
  199. package/docs/advanced/download.md +4 -4
  200. package/docs/developer/architecture.md +17 -4
  201. package/package.json +1 -1
  202. package/scripts/check-doc-coverage.sh +69 -0
  203. package/scripts/copy-yaml.cjs +7 -0
  204. package/src/browser/cdp.ts +6 -1
  205. package/src/browser/page.ts +7 -1
  206. package/src/build-manifest.ts +25 -19
  207. package/src/cli.ts +218 -139
  208. package/src/clis/apple-podcasts/commands.test.ts +95 -0
  209. package/src/clis/apple-podcasts/search.ts +2 -2
  210. package/src/clis/apple-podcasts/top.ts +12 -2
  211. package/src/clis/arxiv/search.ts +1 -1
  212. package/src/clis/bilibili/dynamic.ts +1 -1
  213. package/src/clis/bilibili/favorite.ts +1 -1
  214. package/src/clis/bilibili/feed.ts +1 -1
  215. package/src/clis/bilibili/following.ts +1 -1
  216. package/src/clis/bilibili/history.ts +1 -1
  217. package/src/clis/bilibili/me.ts +1 -1
  218. package/src/clis/bilibili/ranking.ts +1 -1
  219. package/src/clis/bilibili/search.ts +3 -3
  220. package/src/clis/bilibili/subtitle.ts +1 -1
  221. package/src/clis/bilibili/user-videos.ts +1 -1
  222. package/src/{bilibili.ts → clis/bilibili/utils.ts} +1 -1
  223. package/src/clis/bloomberg/businessweek.ts +18 -0
  224. package/src/clis/bloomberg/economics.ts +18 -0
  225. package/src/clis/bloomberg/feeds.ts +16 -0
  226. package/src/clis/bloomberg/industries.ts +18 -0
  227. package/src/clis/bloomberg/main.ts +18 -0
  228. package/src/clis/bloomberg/markets.ts +18 -0
  229. package/src/clis/bloomberg/news.ts +136 -0
  230. package/src/clis/bloomberg/opinions.ts +18 -0
  231. package/src/clis/bloomberg/politics.ts +18 -0
  232. package/src/clis/bloomberg/tech.ts +18 -0
  233. package/src/clis/bloomberg/utils.test.ts +135 -0
  234. package/src/clis/bloomberg/utils.ts +429 -0
  235. package/src/clis/boss/batchgreet.ts +2 -2
  236. package/src/clis/boss/chatlist.ts +2 -2
  237. package/src/clis/boss/detail.ts +2 -2
  238. package/src/clis/boss/greet.ts +4 -4
  239. package/src/clis/boss/search.ts +1 -1
  240. package/src/clis/boss/send.ts +1 -1
  241. package/src/clis/boss/stats.ts +2 -2
  242. package/src/clis/chaoxing/assignments.ts +1 -1
  243. package/src/clis/chaoxing/exams.ts +1 -1
  244. package/src/{chaoxing.test.ts → clis/chaoxing/utils.test.ts} +1 -1
  245. package/src/{chaoxing.ts → clis/chaoxing/utils.ts} +1 -3
  246. package/src/clis/chatgpt/README.zh-CN.md +3 -3
  247. package/src/clis/chatgpt/read.ts +1 -1
  248. package/src/clis/chatwise/export.ts +1 -1
  249. package/src/clis/chatwise/model.ts +2 -2
  250. package/src/clis/chatwise/screenshot.ts +1 -1
  251. package/src/clis/codex/export.ts +1 -1
  252. package/src/clis/codex/model.ts +2 -2
  253. package/src/clis/codex/screenshot.ts +1 -1
  254. package/src/clis/coupang/add-to-cart.ts +3 -4
  255. package/src/clis/coupang/search.ts +2 -4
  256. package/src/{coupang.test.ts → clis/coupang/utils.test.ts} +1 -1
  257. package/src/clis/ctrip/search.ts +1 -1
  258. package/src/clis/cursor/export.ts +1 -1
  259. package/src/clis/cursor/model.ts +2 -2
  260. package/src/clis/cursor/screenshot.ts +1 -1
  261. package/src/clis/jike/comment.ts +2 -3
  262. package/src/clis/jike/create.ts +1 -2
  263. package/src/clis/jike/feed.ts +0 -1
  264. package/src/clis/jike/like.ts +1 -2
  265. package/src/clis/jike/notifications.ts +0 -1
  266. package/src/clis/jike/post.yaml +1 -0
  267. package/src/clis/jike/repost.ts +1 -2
  268. package/src/clis/jike/search.ts +2 -3
  269. package/src/clis/jike/topic.yaml +1 -0
  270. package/src/clis/jike/user.yaml +1 -0
  271. package/src/clis/jimeng/history.yaml +0 -1
  272. package/src/clis/linkedin/search.ts +7 -7
  273. package/src/clis/linux-do/category.yaml +1 -0
  274. package/src/clis/linux-do/search.yaml +4 -3
  275. package/src/clis/linux-do/topic.yaml +1 -0
  276. package/src/clis/notion/export.ts +1 -1
  277. package/src/clis/reddit/comment.ts +3 -4
  278. package/src/clis/reddit/read.ts +4 -5
  279. package/src/clis/reddit/save.ts +2 -3
  280. package/src/clis/reddit/saved.ts +0 -1
  281. package/src/clis/reddit/search.yaml +1 -0
  282. package/src/clis/reddit/subscribe.ts +0 -1
  283. package/src/clis/reddit/upvote.ts +2 -3
  284. package/src/clis/reddit/upvoted.ts +0 -1
  285. package/src/clis/reddit/user-comments.yaml +1 -0
  286. package/src/clis/reddit/user-posts.yaml +1 -0
  287. package/src/clis/reddit/user.yaml +1 -0
  288. package/src/clis/reuters/search.ts +1 -1
  289. package/src/clis/smzdm/search.ts +2 -3
  290. package/src/clis/stackoverflow/search.yaml +1 -0
  291. package/src/clis/steam/top-sellers.yaml +29 -0
  292. package/src/clis/twitter/accept.ts +2 -2
  293. package/src/clis/twitter/article.ts +2 -2
  294. package/src/clis/twitter/block.ts +92 -0
  295. package/src/clis/twitter/delete.ts +1 -1
  296. package/src/clis/twitter/hide-reply.ts +70 -0
  297. package/src/clis/twitter/like.ts +1 -1
  298. package/src/clis/twitter/post.ts +1 -1
  299. package/src/clis/twitter/reply-dm.ts +1 -1
  300. package/src/clis/twitter/reply.ts +2 -2
  301. package/src/clis/twitter/search.ts +1 -1
  302. package/src/clis/twitter/thread.ts +2 -2
  303. package/src/clis/twitter/trending.ts +113 -0
  304. package/src/clis/twitter/unblock.ts +75 -0
  305. package/src/clis/v2ex/topic.yaml +1 -0
  306. package/src/clis/weibo/hot.ts +0 -1
  307. package/src/clis/weread/book.ts +1 -1
  308. package/src/clis/weread/highlights.ts +1 -1
  309. package/src/clis/weread/notes.ts +1 -1
  310. package/src/clis/weread/search.ts +1 -1
  311. package/src/clis/wikipedia/search.ts +1 -1
  312. package/src/clis/xiaohongshu/creator-note-detail.test.ts +82 -33
  313. package/src/clis/xiaohongshu/creator-note-detail.ts +89 -5
  314. package/src/clis/xiaohongshu/creator-notes.test.ts +39 -6
  315. package/src/clis/xiaohongshu/creator-notes.ts +44 -5
  316. package/src/clis/xiaohongshu/creator-profile.ts +0 -1
  317. package/src/clis/xiaohongshu/creator-stats.ts +0 -1
  318. package/src/clis/xiaohongshu/download.ts +2 -3
  319. package/src/clis/xiaohongshu/feed.yaml +0 -1
  320. package/src/clis/xiaohongshu/notifications.yaml +0 -1
  321. package/src/clis/xiaohongshu/search.ts +2 -2
  322. package/src/clis/xiaohongshu/user.ts +1 -2
  323. package/src/clis/yahoo-finance/quote.ts +0 -1
  324. package/src/clis/youtube/search.ts +1 -1
  325. package/src/clis/youtube/transcript.ts +1 -1
  326. package/src/clis/youtube/video.ts +1 -1
  327. package/src/clis/zhihu/download.ts +1 -2
  328. package/src/clis/zhihu/question.ts +1 -1
  329. package/src/clis/zhihu/search.yaml +4 -3
  330. package/src/commanderAdapter.ts +113 -0
  331. package/src/{engine.ts → discovery.ts} +1 -108
  332. package/src/download/index.ts +21 -54
  333. package/src/engine.test.ts +8 -7
  334. package/src/execution.ts +138 -0
  335. package/src/explore.ts +135 -109
  336. package/src/external-clis.yaml +9 -0
  337. package/src/external.ts +15 -12
  338. package/src/main.ts +1 -1
  339. package/src/pipeline/steps/browser.ts +7 -2
  340. package/src/registry.ts +5 -0
  341. package/src/runtime.ts +9 -0
  342. package/src/serialization.ts +79 -0
  343. package/src/types.ts +1 -1
  344. package/tests/e2e/browser-public.test.ts +25 -0
  345. package/tests/e2e/public-commands.test.ts +55 -1
  346. package/dist/clis/twitter/trending.yaml +0 -46
  347. package/docs/public/CNAME +0 -1
  348. package/src/clis/twitter/trending.yaml +0 -46
  349. /package/dist/{bilibili.js → clis/bilibili/utils.js} +0 -0
  350. /package/dist/{chaoxing.test.d.ts → clis/bloomberg/businessweek.d.ts} +0 -0
  351. /package/dist/{coupang.test.d.ts → clis/bloomberg/economics.d.ts} +0 -0
  352. /package/dist/{coupang.d.ts → clis/coupang/utils.d.ts} +0 -0
  353. /package/dist/{coupang.js → clis/coupang/utils.js} +0 -0
  354. /package/src/{coupang.ts → clis/coupang/utils.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { cli, Strategy } from '../../registry.js';
2
- import { apiGet, getSelfUid } from '../../bilibili.js';
2
+ import { apiGet, getSelfUid } from './utils.js';
3
3
  cli({
4
4
  site: 'bilibili', name: 'me', description: 'My Bilibili profile info', domain: 'www.bilibili.com', strategy: Strategy.COOKIE,
5
5
  args: [],
@@ -1,5 +1,5 @@
1
1
  import { cli, Strategy } from '../../registry.js';
2
- import { apiGet } from '../../bilibili.js';
2
+ import { apiGet } from './utils.js';
3
3
  cli({
4
4
  site: 'bilibili',
5
5
  name: 'ranking',
@@ -1,16 +1,16 @@
1
1
  import { cli, Strategy } from '../../registry.js';
2
- import { apiGet, stripHtml } from '../../bilibili.js';
2
+ import { apiGet, stripHtml } from './utils.js';
3
3
  cli({
4
4
  site: 'bilibili', name: 'search', description: 'Search Bilibili videos or users', domain: 'www.bilibili.com', strategy: Strategy.COOKIE,
5
5
  args: [
6
- { name: 'keyword', required: true, help: 'Search keyword' },
6
+ { name: 'query', required: true, positional: true, help: 'Search keyword' },
7
7
  { name: 'type', default: 'video', help: 'video or user' },
8
8
  { name: 'page', type: 'int', default: 1, help: 'Result page' },
9
9
  { name: 'limit', type: 'int', default: 20, help: 'Number of results' },
10
10
  ],
11
11
  columns: ['rank', 'title', 'author', 'score', 'url'],
12
12
  func: async (page, kwargs) => {
13
- const { keyword, type = 'video', page: pageNum = 1, limit = 20 } = kwargs;
13
+ const { query: keyword, type = 'video', page: pageNum = 1, limit = 20 } = kwargs;
14
14
  const searchType = type === 'user' ? 'bili_user' : 'video';
15
15
  const payload = await apiGet(page, '/x/web-interface/wbi/search/type', { params: { search_type: searchType, keyword, page: pageNum }, signed: true });
16
16
  const results = payload?.data?.result ?? [];
@@ -1,5 +1,5 @@
1
1
  import { cli, Strategy } from '../../registry.js';
2
- import { apiGet } from '../../bilibili.js';
2
+ import { apiGet } from './utils.js';
3
3
  cli({
4
4
  site: 'bilibili',
5
5
  name: 'subtitle',
@@ -1,5 +1,5 @@
1
1
  import { cli, Strategy } from '../../registry.js';
2
- import { apiGet, payloadData, resolveUid } from '../../bilibili.js';
2
+ import { apiGet, payloadData, resolveUid } from './utils.js';
3
3
  cli({
4
4
  site: 'bilibili',
5
5
  name: 'user-videos',
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Bilibili shared helpers: WBI signing, authenticated fetch, nav data, UID resolution.
3
3
  */
4
- import type { IPage } from './types.js';
4
+ import type { IPage } from '../../types.js';
5
5
  export declare function stripHtml(s: string): string;
6
6
  export declare function payloadData(payload: any): any;
7
7
  export declare function wbiSign(page: IPage, params: Record<string, any>): Promise<Record<string, string>>;
@@ -0,0 +1,17 @@
1
+ import { cli, Strategy } from '../../registry.js';
2
+ import { fetchBloombergFeed } from './utils.js';
3
+ cli({
4
+ site: 'bloomberg',
5
+ name: 'businessweek',
6
+ description: 'Bloomberg Businessweek top stories (RSS)',
7
+ domain: 'feeds.bloomberg.com',
8
+ strategy: Strategy.PUBLIC,
9
+ browser: false,
10
+ args: [
11
+ { name: 'limit', type: 'int', default: 1, help: 'Number of feed items to return (max 20)' },
12
+ ],
13
+ columns: ['title', 'summary', 'link', 'mediaLinks'],
14
+ func: async (_page, kwargs) => {
15
+ return fetchBloombergFeed('businessweek', kwargs.limit ?? 1);
16
+ },
17
+ });
@@ -0,0 +1,17 @@
1
+ import { cli, Strategy } from '../../registry.js';
2
+ import { fetchBloombergFeed } from './utils.js';
3
+ cli({
4
+ site: 'bloomberg',
5
+ name: 'economics',
6
+ description: 'Bloomberg Economics top stories (RSS)',
7
+ domain: 'feeds.bloomberg.com',
8
+ strategy: Strategy.PUBLIC,
9
+ browser: false,
10
+ args: [
11
+ { name: 'limit', type: 'int', default: 1, help: 'Number of feed items to return (max 20)' },
12
+ ],
13
+ columns: ['title', 'summary', 'link', 'mediaLinks'],
14
+ func: async (_page, kwargs) => {
15
+ return fetchBloombergFeed('economics', kwargs.limit ?? 1);
16
+ },
17
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ import { cli, Strategy } from '../../registry.js';
2
+ import { BLOOMBERG_FEEDS } from './utils.js';
3
+ cli({
4
+ site: 'bloomberg',
5
+ name: 'feeds',
6
+ description: 'List the Bloomberg RSS feed aliases used by the adapter',
7
+ domain: 'feeds.bloomberg.com',
8
+ strategy: Strategy.PUBLIC,
9
+ browser: false,
10
+ args: [],
11
+ columns: ['name', 'url'],
12
+ func: async () => {
13
+ return Object.entries(BLOOMBERG_FEEDS).map(([name, url]) => ({ name, url }));
14
+ },
15
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { cli, Strategy } from '../../registry.js';
2
+ import { fetchBloombergFeed } from './utils.js';
3
+ cli({
4
+ site: 'bloomberg',
5
+ name: 'industries',
6
+ description: 'Bloomberg Industries top stories (RSS)',
7
+ domain: 'feeds.bloomberg.com',
8
+ strategy: Strategy.PUBLIC,
9
+ browser: false,
10
+ args: [
11
+ { name: 'limit', type: 'int', default: 1, help: 'Number of feed items to return (max 20)' },
12
+ ],
13
+ columns: ['title', 'summary', 'link', 'mediaLinks'],
14
+ func: async (_page, kwargs) => {
15
+ return fetchBloombergFeed('industries', kwargs.limit ?? 1);
16
+ },
17
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { cli, Strategy } from '../../registry.js';
2
+ import { fetchBloombergFeed } from './utils.js';
3
+ cli({
4
+ site: 'bloomberg',
5
+ name: 'main',
6
+ description: 'Bloomberg homepage top stories (RSS)',
7
+ domain: 'feeds.bloomberg.com',
8
+ strategy: Strategy.PUBLIC,
9
+ browser: false,
10
+ args: [
11
+ { name: 'limit', type: 'int', default: 1, help: 'Number of feed items to return (max 20)' },
12
+ ],
13
+ columns: ['title', 'summary', 'link', 'mediaLinks'],
14
+ func: async (_page, kwargs) => {
15
+ return fetchBloombergFeed('main', kwargs.limit ?? 1);
16
+ },
17
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { cli, Strategy } from '../../registry.js';
2
+ import { fetchBloombergFeed } from './utils.js';
3
+ cli({
4
+ site: 'bloomberg',
5
+ name: 'markets',
6
+ description: 'Bloomberg Markets top stories (RSS)',
7
+ domain: 'feeds.bloomberg.com',
8
+ strategy: Strategy.PUBLIC,
9
+ browser: false,
10
+ args: [
11
+ { name: 'limit', type: 'int', default: 1, help: 'Number of feed items to return (max 20)' },
12
+ ],
13
+ columns: ['title', 'summary', 'link', 'mediaLinks'],
14
+ func: async (_page, kwargs) => {
15
+ return fetchBloombergFeed('markets', kwargs.limit ?? 1);
16
+ },
17
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,105 @@
1
+ import { cli, Strategy } from '../../registry.js';
2
+ import { CliError } from '../../errors.js';
3
+ import { extractStoryMediaLinks, renderStoryBody, validateBloombergLink, } from './utils.js';
4
+ cli({
5
+ site: 'bloomberg',
6
+ name: 'news',
7
+ description: 'Read a Bloomberg story/article page and return title, full content, and media links',
8
+ domain: 'www.bloomberg.com',
9
+ strategy: Strategy.COOKIE,
10
+ browser: true,
11
+ args: [
12
+ { name: 'link', positional: true, required: true, help: 'Bloomberg story/article URL or relative Bloomberg path' },
13
+ ],
14
+ columns: ['title', 'summary', 'link', 'mediaLinks', 'content'],
15
+ func: async (page, kwargs) => {
16
+ const url = validateBloombergLink(kwargs.link);
17
+ // Navigate and wait for the page to hydrate before extracting story data.
18
+ await page.goto(url);
19
+ await page.wait(5);
20
+ const loadStory = async () => page.evaluate(`(() => {
21
+ const isRobot = /Are you a robot/i.test(document.title)
22
+ || /unusual activity/i.test(document.body.innerText)
23
+ || /click the box below to let us know you're not a robot/i.test(document.body.innerText);
24
+
25
+ if (isRobot) {
26
+ return {
27
+ errorCode: 'ROBOT_PAGE',
28
+ title: document.title,
29
+ preview: document.body.innerText.slice(0, 400),
30
+ };
31
+ }
32
+
33
+ const raw = document.querySelector('#__NEXT_DATA__')?.textContent;
34
+ if (!raw) {
35
+ return {
36
+ errorCode: 'NO_NEXT_DATA',
37
+ title: document.title,
38
+ preview: document.body.innerText.slice(0, 400),
39
+ };
40
+ }
41
+
42
+ let parsed;
43
+ try {
44
+ parsed = JSON.parse(raw);
45
+ } catch (err) {
46
+ return {
47
+ errorCode: 'BAD_NEXT_DATA',
48
+ title: document.title,
49
+ preview: document.body.innerText.slice(0, 400),
50
+ message: String(err),
51
+ };
52
+ }
53
+
54
+ const story = parsed?.props?.pageProps?.story;
55
+ if (!story) {
56
+ return {
57
+ errorCode: 'NO_STORY',
58
+ title: document.title,
59
+ preview: document.body.innerText.slice(0, 400),
60
+ };
61
+ }
62
+
63
+ return {
64
+ story: {
65
+ headline: story.headline || story.seoHeadline || story.seoTitle || document.querySelector('h1')?.textContent?.trim() || document.title,
66
+ summary: story.summary || story.socialDescription || story.seoDescription || document.querySelector('meta[name="description"]')?.getAttribute('content') || '',
67
+ url: story.url || story.readingUrl || location.href,
68
+ body: story.body || null,
69
+ lede: story.lede || null,
70
+ ledeImageUrl: story.ledeImageUrl || null,
71
+ socialImageUrl: story.socialImageUrl || null,
72
+ imageAttachments: story.imageAttachments || {},
73
+ videoAttachments: story.videoAttachments || {},
74
+ }
75
+ };
76
+ })()`);
77
+ let result = await loadStory();
78
+ // Retry once — Bloomberg pages sometimes hydrate slowly.
79
+ if (result?.errorCode === 'NO_NEXT_DATA' || result?.errorCode === 'NO_STORY') {
80
+ await page.wait(4);
81
+ result = await loadStory();
82
+ }
83
+ if (result?.errorCode === 'ROBOT_PAGE') {
84
+ throw new CliError('FETCH_ERROR', 'Bloomberg served the bot-protection page instead of article content', 'Try again later or open the article in a regular Chrome session first, then rerun the command. This command uses your current Bloomberg access and does not bypass paywall or entitlement checks.');
85
+ }
86
+ if (result?.errorCode) {
87
+ throw new CliError('PARSE_ERROR', `Bloomberg page did not expose article story data (${result.errorCode})`, 'This command currently works on standard Bloomberg story/article pages that expose __NEXT_DATA__. Audio, video, newsletter, or other non-standard/blocked pages may not work. Access still depends on your current Bloomberg session.');
88
+ }
89
+ const story = result?.story;
90
+ if (!story) {
91
+ throw new CliError('PARSE_ERROR', 'Failed to extract Bloomberg story data', 'Bloomberg may have changed the page structure.');
92
+ }
93
+ const content = renderStoryBody(story.body);
94
+ if (!content) {
95
+ throw new CliError('PARSE_ERROR', 'Bloomberg article body was empty after parsing', 'Bloomberg may have changed the story-body format, the URL may not point to a standard article page, or the page may not be accessible in your current Bloomberg session.');
96
+ }
97
+ return [{
98
+ title: story.headline || '',
99
+ summary: story.summary || '',
100
+ link: story.url || url,
101
+ mediaLinks: extractStoryMediaLinks(story),
102
+ content,
103
+ }];
104
+ },
105
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { cli, Strategy } from '../../registry.js';
2
+ import { fetchBloombergFeed } from './utils.js';
3
+ cli({
4
+ site: 'bloomberg',
5
+ name: 'opinions',
6
+ description: 'Bloomberg Opinion top stories (RSS)',
7
+ domain: 'feeds.bloomberg.com',
8
+ strategy: Strategy.PUBLIC,
9
+ browser: false,
10
+ args: [
11
+ { name: 'limit', type: 'int', default: 1, help: 'Number of feed items to return (max 20)' },
12
+ ],
13
+ columns: ['title', 'summary', 'link', 'mediaLinks'],
14
+ func: async (_page, kwargs) => {
15
+ return fetchBloombergFeed('opinions', kwargs.limit ?? 1);
16
+ },
17
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { cli, Strategy } from '../../registry.js';
2
+ import { fetchBloombergFeed } from './utils.js';
3
+ cli({
4
+ site: 'bloomberg',
5
+ name: 'politics',
6
+ description: 'Bloomberg Politics top stories (RSS)',
7
+ domain: 'feeds.bloomberg.com',
8
+ strategy: Strategy.PUBLIC,
9
+ browser: false,
10
+ args: [
11
+ { name: 'limit', type: 'int', default: 1, help: 'Number of feed items to return (max 20)' },
12
+ ],
13
+ columns: ['title', 'summary', 'link', 'mediaLinks'],
14
+ func: async (_page, kwargs) => {
15
+ return fetchBloombergFeed('politics', kwargs.limit ?? 1);
16
+ },
17
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ import { cli, Strategy } from '../../registry.js';
2
+ import { fetchBloombergFeed } from './utils.js';
3
+ cli({
4
+ site: 'bloomberg',
5
+ name: 'tech',
6
+ description: 'Bloomberg Tech top stories (RSS)',
7
+ domain: 'feeds.bloomberg.com',
8
+ strategy: Strategy.PUBLIC,
9
+ browser: false,
10
+ args: [
11
+ { name: 'limit', type: 'int', default: 1, help: 'Number of feed items to return (max 20)' },
12
+ ],
13
+ columns: ['title', 'summary', 'link', 'mediaLinks'],
14
+ func: async (_page, kwargs) => {
15
+ return fetchBloombergFeed('tech', kwargs.limit ?? 1);
16
+ },
17
+ });
@@ -0,0 +1,34 @@
1
+ export declare const BLOOMBERG_FEEDS: {
2
+ readonly main: "https://feeds.bloomberg.com/news.rss";
3
+ readonly markets: "https://feeds.bloomberg.com/markets/news.rss";
4
+ readonly economics: "https://feeds.bloomberg.com/economics/news.rss";
5
+ readonly industries: "https://feeds.bloomberg.com/industries/news.rss";
6
+ readonly tech: "https://feeds.bloomberg.com/technology/news.rss";
7
+ readonly politics: "https://feeds.bloomberg.com/politics/news.rss";
8
+ readonly businessweek: "https://feeds.bloomberg.com/businessweek/news.rss";
9
+ readonly opinions: "https://feeds.bloomberg.com/bview/news.rss";
10
+ };
11
+ export type BloombergFeedName = keyof typeof BLOOMBERG_FEEDS;
12
+ export interface BloombergFeedItem {
13
+ title: string;
14
+ summary: string;
15
+ link: string;
16
+ mediaLinks: string[];
17
+ }
18
+ export interface BloombergStory {
19
+ headline?: string;
20
+ summary?: string;
21
+ url?: string;
22
+ body?: any;
23
+ lede?: any;
24
+ ledeImageUrl?: string;
25
+ socialImageUrl?: string;
26
+ imageAttachments?: Record<string, any>;
27
+ videoAttachments?: Record<string, any>;
28
+ }
29
+ export declare function fetchBloombergFeed(name: BloombergFeedName, limit?: number): Promise<BloombergFeedItem[]>;
30
+ export declare function parseBloombergRss(xml: string): BloombergFeedItem[];
31
+ export declare function normalizeBloombergLink(input: string): string;
32
+ export declare function validateBloombergLink(input: string): string;
33
+ export declare function renderStoryBody(body: any): string;
34
+ export declare function extractStoryMediaLinks(story: BloombergStory): string[];