@jackwener/opencli 1.5.5 → 1.5.7

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 (540) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +31 -4
  3. package/README.zh-CN.md +40 -5
  4. package/SKILL.md +1 -1
  5. package/dist/browser/cdp.d.ts +1 -0
  6. package/dist/browser/cdp.js +30 -27
  7. package/dist/browser/daemon-client.d.ts +11 -1
  8. package/dist/browser/daemon-client.js +3 -0
  9. package/dist/browser/dom-helpers.js +1 -0
  10. package/dist/browser/dom-helpers.test.js +14 -1
  11. package/dist/browser/mcp.js +18 -13
  12. package/dist/browser/page.d.ts +6 -0
  13. package/dist/browser/page.js +37 -2
  14. package/dist/browser/page.test.d.ts +1 -0
  15. package/dist/browser/page.test.js +44 -0
  16. package/dist/browser/stealth.js +198 -0
  17. package/dist/browser/stealth.test.d.ts +1 -0
  18. package/dist/browser/stealth.test.js +134 -0
  19. package/dist/browser.test.js +1 -1
  20. package/dist/build-manifest.d.ts +1 -0
  21. package/dist/build-manifest.js +5 -1
  22. package/dist/build-manifest.test.js +2 -0
  23. package/dist/cli-manifest.json +1821 -252
  24. package/dist/cli.js +20 -3
  25. package/dist/clis/antigravity/serve.d.ts +1 -1
  26. package/dist/clis/antigravity/serve.js +5 -8
  27. package/dist/clis/band/bands.d.ts +1 -0
  28. package/dist/clis/band/bands.js +72 -0
  29. package/dist/clis/band/mentions.d.ts +1 -0
  30. package/dist/clis/band/mentions.js +127 -0
  31. package/dist/clis/band/post.d.ts +1 -0
  32. package/dist/clis/band/post.js +175 -0
  33. package/dist/clis/band/posts.d.ts +1 -0
  34. package/dist/clis/band/posts.js +94 -0
  35. package/dist/clis/bilibili/subtitle.js +4 -0
  36. package/dist/clis/bilibili/subtitle.test.d.ts +1 -0
  37. package/dist/clis/bilibili/subtitle.test.js +48 -0
  38. package/dist/clis/chatwise/ask.js +0 -2
  39. package/dist/clis/chatwise/export.js +0 -2
  40. package/dist/clis/chatwise/history.js +0 -2
  41. package/dist/clis/chatwise/model.js +0 -2
  42. package/dist/clis/chatwise/new.js +1 -2
  43. package/dist/clis/chatwise/read.js +0 -2
  44. package/dist/clis/chatwise/screenshot.js +1 -2
  45. package/dist/clis/chatwise/send.js +0 -2
  46. package/dist/clis/chatwise/status.js +1 -2
  47. package/dist/clis/ctrip/search.d.ts +13 -0
  48. package/dist/clis/ctrip/search.js +73 -48
  49. package/dist/clis/ctrip/search.test.d.ts +1 -0
  50. package/dist/clis/ctrip/search.test.js +64 -0
  51. package/dist/clis/doubao/detail.d.ts +1 -0
  52. package/dist/clis/doubao/detail.js +33 -0
  53. package/dist/clis/doubao/detail.test.d.ts +1 -0
  54. package/dist/clis/doubao/detail.test.js +42 -0
  55. package/dist/clis/doubao/history.d.ts +1 -0
  56. package/dist/clis/doubao/history.js +28 -0
  57. package/dist/clis/doubao/history.test.d.ts +1 -0
  58. package/dist/clis/doubao/history.test.js +37 -0
  59. package/dist/clis/doubao/meeting-summary.d.ts +1 -0
  60. package/dist/clis/doubao/meeting-summary.js +39 -0
  61. package/dist/clis/doubao/meeting-transcript.d.ts +1 -0
  62. package/dist/clis/doubao/meeting-transcript.js +36 -0
  63. package/dist/clis/doubao/utils.d.ts +27 -0
  64. package/dist/clis/doubao/utils.js +317 -0
  65. package/dist/clis/doubao/utils.test.d.ts +1 -0
  66. package/dist/clis/doubao/utils.test.js +24 -0
  67. package/dist/clis/douyin/_shared/public-api.d.ts +33 -0
  68. package/dist/clis/douyin/_shared/public-api.js +29 -0
  69. package/dist/clis/douyin/_shared/sts2.js +8 -2
  70. package/dist/clis/douyin/_shared/sts2.test.d.ts +1 -0
  71. package/dist/clis/douyin/_shared/sts2.test.js +27 -0
  72. package/dist/clis/douyin/activities.js +4 -2
  73. package/dist/clis/douyin/activities.test.js +34 -1
  74. package/dist/clis/douyin/collections.js +1 -1
  75. package/dist/clis/douyin/collections.test.js +24 -2
  76. package/dist/clis/douyin/draft.d.ts +8 -11
  77. package/dist/clis/douyin/draft.js +302 -185
  78. package/dist/clis/douyin/draft.test.d.ts +1 -1
  79. package/dist/clis/douyin/draft.test.js +357 -2
  80. package/dist/clis/douyin/hashtag.js +9 -2
  81. package/dist/clis/douyin/hashtag.test.js +35 -2
  82. package/dist/clis/douyin/profile.js +1 -1
  83. package/dist/clis/douyin/profile.test.js +36 -1
  84. package/dist/clis/douyin/user-videos.d.ts +5 -0
  85. package/dist/clis/douyin/user-videos.js +74 -0
  86. package/dist/clis/douyin/user-videos.test.d.ts +1 -0
  87. package/dist/clis/douyin/user-videos.test.js +108 -0
  88. package/dist/clis/douyin/videos.js +22 -5
  89. package/dist/clis/douyin/videos.test.js +45 -2
  90. package/dist/clis/facebook/search.test.d.ts +5 -0
  91. package/dist/clis/facebook/search.test.js +60 -0
  92. package/dist/clis/facebook/search.yaml +4 -3
  93. package/dist/clis/instagram/download.d.ts +16 -0
  94. package/dist/clis/instagram/download.js +225 -0
  95. package/dist/clis/instagram/download.test.d.ts +1 -0
  96. package/dist/clis/instagram/download.test.js +118 -0
  97. package/dist/clis/notebooklm/bind-current.d.ts +1 -0
  98. package/dist/clis/notebooklm/bind-current.js +29 -0
  99. package/dist/clis/notebooklm/bind-current.test.d.ts +1 -0
  100. package/dist/clis/notebooklm/bind-current.test.js +35 -0
  101. package/dist/clis/notebooklm/binding.test.d.ts +1 -0
  102. package/dist/clis/notebooklm/binding.test.js +44 -0
  103. package/dist/clis/notebooklm/compat.test.d.ts +3 -0
  104. package/dist/clis/notebooklm/compat.test.js +16 -0
  105. package/dist/clis/notebooklm/current.d.ts +1 -0
  106. package/dist/clis/notebooklm/current.js +28 -0
  107. package/dist/clis/notebooklm/get.d.ts +1 -0
  108. package/dist/clis/notebooklm/get.js +37 -0
  109. package/dist/clis/notebooklm/history.d.ts +1 -0
  110. package/dist/clis/notebooklm/history.js +25 -0
  111. package/dist/clis/notebooklm/history.test.d.ts +1 -0
  112. package/dist/clis/notebooklm/history.test.js +58 -0
  113. package/dist/clis/notebooklm/list.d.ts +1 -0
  114. package/dist/clis/notebooklm/list.js +35 -0
  115. package/dist/clis/notebooklm/note-list.d.ts +1 -0
  116. package/dist/clis/notebooklm/note-list.js +28 -0
  117. package/dist/clis/notebooklm/note-list.test.d.ts +1 -0
  118. package/dist/clis/notebooklm/note-list.test.js +56 -0
  119. package/dist/clis/notebooklm/notes-get.d.ts +1 -0
  120. package/dist/clis/notebooklm/notes-get.js +47 -0
  121. package/dist/clis/notebooklm/notes-get.test.d.ts +1 -0
  122. package/dist/clis/notebooklm/notes-get.test.js +72 -0
  123. package/dist/clis/notebooklm/rpc.d.ts +36 -0
  124. package/dist/clis/notebooklm/rpc.js +189 -0
  125. package/dist/clis/notebooklm/rpc.test.d.ts +1 -0
  126. package/dist/clis/notebooklm/rpc.test.js +105 -0
  127. package/dist/clis/notebooklm/shared.d.ts +87 -0
  128. package/dist/clis/notebooklm/shared.js +3 -0
  129. package/dist/clis/notebooklm/source-fulltext.d.ts +1 -0
  130. package/dist/clis/notebooklm/source-fulltext.js +44 -0
  131. package/dist/clis/notebooklm/source-fulltext.test.d.ts +1 -0
  132. package/dist/clis/notebooklm/source-fulltext.test.js +106 -0
  133. package/dist/clis/notebooklm/source-get.d.ts +1 -0
  134. package/dist/clis/notebooklm/source-get.js +40 -0
  135. package/dist/clis/notebooklm/source-get.test.d.ts +1 -0
  136. package/dist/clis/notebooklm/source-get.test.js +84 -0
  137. package/dist/clis/notebooklm/source-guide.d.ts +1 -0
  138. package/dist/clis/notebooklm/source-guide.js +44 -0
  139. package/dist/clis/notebooklm/source-guide.test.d.ts +1 -0
  140. package/dist/clis/notebooklm/source-guide.test.js +104 -0
  141. package/dist/clis/notebooklm/source-list.d.ts +1 -0
  142. package/dist/clis/notebooklm/source-list.js +30 -0
  143. package/dist/clis/notebooklm/status.d.ts +1 -0
  144. package/dist/clis/notebooklm/status.js +31 -0
  145. package/dist/clis/notebooklm/summary.d.ts +1 -0
  146. package/dist/clis/notebooklm/summary.js +30 -0
  147. package/dist/clis/notebooklm/summary.test.d.ts +1 -0
  148. package/dist/clis/notebooklm/summary.test.js +78 -0
  149. package/dist/clis/notebooklm/utils.d.ts +37 -0
  150. package/dist/clis/notebooklm/utils.js +739 -0
  151. package/dist/clis/notebooklm/utils.test.d.ts +1 -0
  152. package/dist/clis/notebooklm/utils.test.js +390 -0
  153. package/dist/clis/ones/common.d.ts +32 -0
  154. package/dist/clis/ones/common.js +144 -0
  155. package/dist/clis/ones/enrich-tasks.d.ts +5 -0
  156. package/dist/clis/ones/enrich-tasks.js +37 -0
  157. package/dist/clis/ones/login.d.ts +1 -0
  158. package/dist/clis/ones/login.js +80 -0
  159. package/dist/clis/ones/logout.d.ts +1 -0
  160. package/dist/clis/ones/logout.js +17 -0
  161. package/dist/clis/ones/me.d.ts +1 -0
  162. package/dist/clis/ones/me.js +30 -0
  163. package/dist/clis/ones/my-tasks.d.ts +1 -0
  164. package/dist/clis/ones/my-tasks.js +120 -0
  165. package/dist/clis/ones/resolve-labels.d.ts +10 -0
  166. package/dist/clis/ones/resolve-labels.js +64 -0
  167. package/dist/clis/ones/task-helpers.d.ts +29 -0
  168. package/dist/clis/ones/task-helpers.js +212 -0
  169. package/dist/clis/ones/task-helpers.test.d.ts +1 -0
  170. package/dist/clis/ones/task-helpers.test.js +12 -0
  171. package/dist/clis/ones/task.d.ts +1 -0
  172. package/dist/clis/ones/task.js +66 -0
  173. package/dist/clis/ones/tasks.d.ts +1 -0
  174. package/dist/clis/ones/tasks.js +79 -0
  175. package/dist/clis/ones/token-info.d.ts +1 -0
  176. package/dist/clis/ones/token-info.js +42 -0
  177. package/dist/clis/ones/worklog.d.ts +11 -0
  178. package/dist/clis/ones/worklog.js +267 -0
  179. package/dist/clis/ones/worklog.test.d.ts +1 -0
  180. package/dist/clis/ones/worklog.test.js +20 -0
  181. package/dist/clis/spotify/spotify.d.ts +1 -0
  182. package/dist/clis/spotify/spotify.js +316 -0
  183. package/dist/clis/spotify/utils.d.ts +21 -0
  184. package/dist/clis/spotify/utils.js +66 -0
  185. package/dist/clis/spotify/utils.test.d.ts +1 -0
  186. package/dist/clis/spotify/utils.test.js +67 -0
  187. package/dist/clis/substack/utils.d.ts +4 -0
  188. package/dist/clis/substack/utils.js +8 -2
  189. package/dist/clis/substack/utils.test.d.ts +1 -0
  190. package/dist/clis/substack/utils.test.js +46 -0
  191. package/dist/clis/tieba/commands.test.d.ts +4 -0
  192. package/dist/clis/tieba/commands.test.js +79 -0
  193. package/dist/clis/tieba/hot.d.ts +1 -0
  194. package/dist/clis/tieba/hot.js +48 -0
  195. package/dist/clis/tieba/posts.d.ts +1 -0
  196. package/dist/clis/tieba/posts.js +85 -0
  197. package/dist/clis/tieba/read.d.ts +1 -0
  198. package/dist/clis/tieba/read.js +140 -0
  199. package/dist/clis/tieba/search.d.ts +1 -0
  200. package/dist/clis/tieba/search.js +108 -0
  201. package/dist/clis/tieba/utils.d.ts +101 -0
  202. package/dist/clis/tieba/utils.js +240 -0
  203. package/dist/clis/tieba/utils.test.d.ts +1 -0
  204. package/dist/clis/tieba/utils.test.js +290 -0
  205. package/dist/clis/v2ex/hot.yaml +4 -1
  206. package/dist/clis/v2ex/latest.yaml +4 -1
  207. package/dist/clis/v2ex/topic.yaml +6 -1
  208. package/dist/clis/weixin/download.d.ts +9 -0
  209. package/dist/clis/weixin/download.js +76 -6
  210. package/dist/clis/weread/book.js +206 -13
  211. package/dist/clis/weread/commands.test.js +331 -0
  212. package/dist/clis/weread/private-api-regression.test.d.ts +1 -0
  213. package/dist/{weread-private-api-regression.test.js → clis/weread/private-api-regression.test.js} +92 -30
  214. package/dist/clis/weread/search-regression.test.d.ts +1 -0
  215. package/dist/clis/weread/search-regression.test.js +407 -0
  216. package/dist/clis/weread/search.js +143 -7
  217. package/dist/clis/weread/shelf.js +13 -95
  218. package/dist/clis/weread/utils.d.ts +56 -0
  219. package/dist/clis/weread/utils.js +234 -7
  220. package/dist/clis/weread/utils.test.js +71 -1
  221. package/dist/clis/xiaohongshu/comments.d.ts +3 -0
  222. package/dist/clis/xiaohongshu/comments.js +76 -17
  223. package/dist/clis/xiaohongshu/comments.test.js +70 -9
  224. package/dist/clis/xiaohongshu/download.d.ts +4 -1
  225. package/dist/clis/xiaohongshu/download.js +83 -22
  226. package/dist/clis/xiaohongshu/download.test.d.ts +1 -0
  227. package/dist/clis/xiaohongshu/download.test.js +75 -0
  228. package/dist/clis/xiaohongshu/note-helpers.d.ts +12 -0
  229. package/dist/clis/xiaohongshu/note-helpers.js +23 -0
  230. package/dist/clis/xiaohongshu/note.d.ts +7 -0
  231. package/dist/clis/xiaohongshu/note.js +76 -0
  232. package/dist/clis/xiaohongshu/note.test.d.ts +1 -0
  233. package/dist/clis/xiaohongshu/note.test.js +136 -0
  234. package/dist/clis/xiaohongshu/publish.d.ts +1 -1
  235. package/dist/clis/xiaohongshu/publish.js +78 -31
  236. package/dist/clis/xiaohongshu/publish.test.js +66 -1
  237. package/dist/clis/xiaohongshu/search.js +9 -0
  238. package/dist/clis/xiaohongshu/search.test.js +10 -4
  239. package/dist/clis/xiaohongshu/user-helpers.d.ts +1 -0
  240. package/dist/clis/xiaohongshu/user-helpers.js +2 -0
  241. package/dist/clis/xiaohongshu/user-helpers.test.js +18 -0
  242. package/dist/clis/xueqiu/comments.d.ts +118 -0
  243. package/dist/clis/xueqiu/comments.js +354 -0
  244. package/dist/clis/xueqiu/comments.test.d.ts +1 -0
  245. package/dist/clis/xueqiu/comments.test.js +696 -0
  246. package/dist/clis/youtube/search.js +57 -17
  247. package/dist/clis/youtube/transcript.js +2 -4
  248. package/dist/clis/youtube/utils.d.ts +9 -0
  249. package/dist/clis/youtube/utils.js +67 -3
  250. package/dist/clis/youtube/utils.test.d.ts +1 -0
  251. package/dist/clis/youtube/utils.test.js +37 -0
  252. package/dist/clis/youtube/video.js +16 -15
  253. package/dist/clis/zhihu/question.js +19 -17
  254. package/dist/clis/zhihu/question.test.d.ts +1 -0
  255. package/dist/clis/zhihu/question.test.js +54 -0
  256. package/dist/clis/zsxq/dynamics.d.ts +1 -0
  257. package/dist/clis/zsxq/dynamics.js +47 -0
  258. package/dist/clis/zsxq/groups.d.ts +1 -0
  259. package/dist/clis/zsxq/groups.js +32 -0
  260. package/dist/clis/zsxq/search.d.ts +1 -0
  261. package/dist/clis/zsxq/search.js +43 -0
  262. package/dist/clis/zsxq/search.test.d.ts +1 -0
  263. package/dist/clis/zsxq/search.test.js +24 -0
  264. package/dist/clis/zsxq/topic.d.ts +1 -0
  265. package/dist/clis/zsxq/topic.js +47 -0
  266. package/dist/clis/zsxq/topic.test.d.ts +1 -0
  267. package/dist/clis/zsxq/topic.test.js +29 -0
  268. package/dist/clis/zsxq/topics.d.ts +1 -0
  269. package/dist/clis/zsxq/topics.js +25 -0
  270. package/dist/clis/zsxq/topics.test.d.ts +1 -0
  271. package/dist/clis/zsxq/topics.test.js +24 -0
  272. package/dist/clis/zsxq/utils.d.ts +97 -0
  273. package/dist/clis/zsxq/utils.js +230 -0
  274. package/dist/commanderAdapter.js +10 -1
  275. package/dist/commanderAdapter.test.js +64 -0
  276. package/dist/commands/daemon.d.ts +9 -0
  277. package/dist/commands/daemon.js +124 -0
  278. package/dist/commands/daemon.test.d.ts +1 -0
  279. package/dist/commands/daemon.test.js +185 -0
  280. package/dist/completion.js +3 -1
  281. package/dist/constants.d.ts +2 -0
  282. package/dist/constants.js +2 -0
  283. package/dist/daemon.d.ts +1 -1
  284. package/dist/daemon.js +25 -14
  285. package/dist/daemon.test.d.ts +1 -0
  286. package/dist/daemon.test.js +65 -0
  287. package/dist/discovery.d.ts +9 -0
  288. package/dist/discovery.js +47 -2
  289. package/dist/electron-apps.d.ts +29 -0
  290. package/dist/electron-apps.js +65 -0
  291. package/dist/electron-apps.test.d.ts +1 -0
  292. package/dist/electron-apps.test.js +43 -0
  293. package/dist/engine.test.js +41 -9
  294. package/dist/execution.js +20 -16
  295. package/dist/external-clis.yaml +17 -0
  296. package/dist/idle-manager.d.ts +19 -0
  297. package/dist/idle-manager.js +54 -0
  298. package/dist/launcher.d.ts +36 -0
  299. package/dist/launcher.js +152 -0
  300. package/dist/launcher.test.d.ts +1 -0
  301. package/dist/launcher.test.js +57 -0
  302. package/dist/main.js +3 -3
  303. package/dist/registry.d.ts +1 -0
  304. package/dist/registry.js +31 -3
  305. package/dist/registry.test.js +13 -0
  306. package/dist/runtime.d.ts +5 -3
  307. package/dist/runtime.js +12 -5
  308. package/dist/serialization.d.ts +1 -0
  309. package/dist/serialization.js +3 -0
  310. package/dist/serialization.test.js +17 -1
  311. package/dist/tui.d.ts +7 -0
  312. package/dist/tui.js +52 -0
  313. package/dist/tui.test.d.ts +1 -0
  314. package/dist/tui.test.js +19 -0
  315. package/dist/types.d.ts +5 -0
  316. package/dist/weixin-download.test.js +14 -0
  317. package/docs/.vitepress/config.mts +4 -0
  318. package/docs/adapters/browser/band.md +63 -0
  319. package/docs/adapters/browser/notebooklm.md +69 -0
  320. package/docs/adapters/browser/ones.md +59 -0
  321. package/docs/adapters/browser/spotify.md +62 -0
  322. package/docs/adapters/browser/tieba.md +45 -0
  323. package/docs/adapters/browser/xiaohongshu.md +19 -10
  324. package/docs/adapters/browser/xueqiu.md +5 -0
  325. package/docs/adapters/browser/zsxq.md +49 -0
  326. package/docs/adapters/index.md +67 -63
  327. package/docs/adapters-doc/ones.md +32 -0
  328. package/docs/guide/browser-bridge.md +12 -0
  329. package/docs/guide/troubleshooting.md +9 -4
  330. package/docs/superpowers/plans/2026-03-31-daemon-lifecycle-redesign.md +857 -0
  331. package/docs/superpowers/specs/2026-03-31-daemon-lifecycle-redesign.md +208 -0
  332. package/docs/zh/guide/browser-bridge.md +12 -0
  333. package/extension/dist/background.js +794 -513
  334. package/extension/src/background.test.ts +202 -2
  335. package/extension/src/background.ts +189 -10
  336. package/extension/src/cdp.ts +54 -0
  337. package/extension/src/protocol.ts +11 -5
  338. package/package.json +1 -1
  339. package/scripts/postinstall.js +16 -0
  340. package/src/browser/cdp.ts +24 -17
  341. package/src/browser/daemon-client.ts +11 -1
  342. package/src/browser/dom-helpers.test.ts +15 -1
  343. package/src/browser/dom-helpers.ts +1 -0
  344. package/src/browser/mcp.ts +18 -13
  345. package/src/browser/page.test.ts +58 -0
  346. package/src/browser/page.ts +34 -2
  347. package/src/browser/stealth.test.ts +153 -0
  348. package/src/browser/stealth.ts +198 -0
  349. package/src/browser.test.ts +1 -1
  350. package/src/build-manifest.test.ts +2 -0
  351. package/src/build-manifest.ts +6 -1
  352. package/src/cli.ts +21 -3
  353. package/src/clis/antigravity/SKILL.md +3 -12
  354. package/src/clis/antigravity/serve.ts +5 -10
  355. package/src/clis/band/bands.ts +76 -0
  356. package/src/clis/band/mentions.ts +134 -0
  357. package/src/clis/band/post.ts +187 -0
  358. package/src/clis/band/posts.ts +106 -0
  359. package/src/clis/bilibili/subtitle.test.ts +60 -0
  360. package/src/clis/bilibili/subtitle.ts +4 -0
  361. package/src/clis/chatwise/ask.ts +0 -2
  362. package/src/clis/chatwise/export.ts +0 -2
  363. package/src/clis/chatwise/history.ts +0 -2
  364. package/src/clis/chatwise/model.ts +0 -2
  365. package/src/clis/chatwise/new.ts +1 -2
  366. package/src/clis/chatwise/read.ts +0 -2
  367. package/src/clis/chatwise/screenshot.ts +1 -2
  368. package/src/clis/chatwise/send.ts +0 -2
  369. package/src/clis/chatwise/status.ts +1 -2
  370. package/src/clis/ctrip/search.test.ts +73 -0
  371. package/src/clis/ctrip/search.ts +97 -47
  372. package/src/clis/doubao/detail.test.ts +53 -0
  373. package/src/clis/doubao/detail.ts +41 -0
  374. package/src/clis/doubao/history.test.ts +45 -0
  375. package/src/clis/doubao/history.ts +32 -0
  376. package/src/clis/doubao/meeting-summary.ts +53 -0
  377. package/src/clis/doubao/meeting-transcript.ts +48 -0
  378. package/src/clis/doubao/utils.test.ts +45 -0
  379. package/src/clis/doubao/utils.ts +371 -0
  380. package/src/clis/douyin/_shared/public-api.ts +84 -0
  381. package/src/clis/douyin/_shared/sts2.test.ts +31 -0
  382. package/src/clis/douyin/_shared/sts2.ts +11 -3
  383. package/src/clis/douyin/activities.test.ts +41 -1
  384. package/src/clis/douyin/activities.ts +12 -3
  385. package/src/clis/douyin/collections.test.ts +35 -2
  386. package/src/clis/douyin/collections.ts +1 -1
  387. package/src/clis/douyin/draft.test.ts +444 -2
  388. package/src/clis/douyin/draft.ts +382 -218
  389. package/src/clis/douyin/hashtag.test.ts +42 -2
  390. package/src/clis/douyin/hashtag.ts +11 -3
  391. package/src/clis/douyin/profile.test.ts +43 -1
  392. package/src/clis/douyin/profile.ts +9 -2
  393. package/src/clis/douyin/user-videos.test.ts +122 -0
  394. package/src/clis/douyin/user-videos.ts +101 -0
  395. package/src/clis/douyin/videos.test.ts +52 -2
  396. package/src/clis/douyin/videos.ts +49 -15
  397. package/src/clis/facebook/search.test.ts +70 -0
  398. package/src/clis/facebook/search.yaml +4 -3
  399. package/src/clis/instagram/download.test.ts +159 -0
  400. package/src/clis/instagram/download.ts +286 -0
  401. package/src/clis/notebooklm/bind-current.test.ts +43 -0
  402. package/src/clis/notebooklm/bind-current.ts +36 -0
  403. package/src/clis/notebooklm/binding.test.ts +53 -0
  404. package/src/clis/notebooklm/compat.test.ts +19 -0
  405. package/src/clis/notebooklm/current.ts +38 -0
  406. package/src/clis/notebooklm/get.ts +53 -0
  407. package/src/clis/notebooklm/history.test.ts +70 -0
  408. package/src/clis/notebooklm/history.ts +36 -0
  409. package/src/clis/notebooklm/list.ts +40 -0
  410. package/src/clis/notebooklm/note-list.test.ts +64 -0
  411. package/src/clis/notebooklm/note-list.ts +42 -0
  412. package/src/clis/notebooklm/notes-get.test.ts +88 -0
  413. package/src/clis/notebooklm/notes-get.ts +67 -0
  414. package/src/clis/notebooklm/rpc.test.ts +126 -0
  415. package/src/clis/notebooklm/rpc.ts +286 -0
  416. package/src/clis/notebooklm/shared.ts +98 -0
  417. package/src/clis/notebooklm/source-fulltext.test.ts +123 -0
  418. package/src/clis/notebooklm/source-fulltext.ts +69 -0
  419. package/src/clis/notebooklm/source-get.test.ts +100 -0
  420. package/src/clis/notebooklm/source-get.ts +60 -0
  421. package/src/clis/notebooklm/source-guide.test.ts +121 -0
  422. package/src/clis/notebooklm/source-guide.ts +69 -0
  423. package/src/clis/notebooklm/source-list.ts +45 -0
  424. package/src/clis/notebooklm/status.ts +34 -0
  425. package/src/clis/notebooklm/summary.test.ts +94 -0
  426. package/src/clis/notebooklm/summary.ts +45 -0
  427. package/src/clis/notebooklm/utils.test.ts +446 -0
  428. package/src/clis/notebooklm/utils.ts +893 -0
  429. package/src/clis/ones/common.ts +187 -0
  430. package/src/clis/ones/enrich-tasks.ts +47 -0
  431. package/src/clis/ones/login.ts +103 -0
  432. package/src/clis/ones/logout.ts +19 -0
  433. package/src/clis/ones/me.ts +34 -0
  434. package/src/clis/ones/my-tasks.ts +148 -0
  435. package/src/clis/ones/resolve-labels.ts +80 -0
  436. package/src/clis/ones/task-helpers.test.ts +14 -0
  437. package/src/clis/ones/task-helpers.ts +214 -0
  438. package/src/clis/ones/task.ts +79 -0
  439. package/src/clis/ones/tasks.ts +92 -0
  440. package/src/clis/ones/token-info.ts +46 -0
  441. package/src/clis/ones/worklog.test.ts +24 -0
  442. package/src/clis/ones/worklog.ts +306 -0
  443. package/src/clis/spotify/spotify.ts +328 -0
  444. package/src/clis/spotify/utils.test.ts +87 -0
  445. package/src/clis/spotify/utils.ts +92 -0
  446. package/src/clis/substack/utils.test.ts +54 -0
  447. package/src/clis/substack/utils.ts +10 -2
  448. package/src/clis/tieba/commands.test.ts +86 -0
  449. package/src/clis/tieba/hot.ts +52 -0
  450. package/src/clis/tieba/posts.ts +108 -0
  451. package/src/clis/tieba/read.ts +158 -0
  452. package/src/clis/tieba/search.ts +119 -0
  453. package/src/clis/tieba/utils.test.ts +322 -0
  454. package/src/clis/tieba/utils.ts +348 -0
  455. package/src/clis/v2ex/hot.yaml +4 -1
  456. package/src/clis/v2ex/latest.yaml +4 -1
  457. package/src/clis/v2ex/topic.yaml +6 -1
  458. package/src/clis/weixin/download.ts +95 -6
  459. package/src/clis/weread/book.ts +256 -13
  460. package/src/clis/weread/commands.test.ts +409 -0
  461. package/src/{weread-private-api-regression.test.ts → clis/weread/private-api-regression.test.ts} +108 -30
  462. package/src/clis/weread/search-regression.test.ts +440 -0
  463. package/src/clis/weread/search.ts +189 -9
  464. package/src/clis/weread/shelf.ts +20 -122
  465. package/src/clis/weread/utils.test.ts +81 -1
  466. package/src/clis/weread/utils.ts +293 -7
  467. package/src/clis/xiaohongshu/comments.test.ts +85 -9
  468. package/src/clis/xiaohongshu/comments.ts +76 -17
  469. package/src/clis/xiaohongshu/download.test.ts +96 -0
  470. package/src/clis/xiaohongshu/download.ts +83 -22
  471. package/src/clis/xiaohongshu/note-helpers.ts +25 -0
  472. package/src/clis/xiaohongshu/note.test.ts +164 -0
  473. package/src/clis/xiaohongshu/note.ts +86 -0
  474. package/src/clis/xiaohongshu/publish.test.ts +79 -1
  475. package/src/clis/xiaohongshu/publish.ts +84 -30
  476. package/src/clis/xiaohongshu/search.test.ts +11 -4
  477. package/src/clis/xiaohongshu/search.ts +13 -0
  478. package/src/clis/xiaohongshu/user-helpers.test.ts +23 -0
  479. package/src/clis/xiaohongshu/user-helpers.ts +4 -0
  480. package/src/clis/xueqiu/comments.test.ts +823 -0
  481. package/src/clis/xueqiu/comments.ts +461 -0
  482. package/src/clis/youtube/search.ts +57 -17
  483. package/src/clis/youtube/transcript.ts +2 -4
  484. package/src/clis/youtube/utils.test.ts +43 -0
  485. package/src/clis/youtube/utils.ts +69 -0
  486. package/src/clis/youtube/video.ts +16 -15
  487. package/src/clis/zhihu/question.test.ts +71 -0
  488. package/src/clis/zhihu/question.ts +27 -15
  489. package/src/clis/zsxq/dynamics.ts +60 -0
  490. package/src/clis/zsxq/groups.ts +41 -0
  491. package/src/clis/zsxq/search.test.ts +29 -0
  492. package/src/clis/zsxq/search.ts +54 -0
  493. package/src/clis/zsxq/topic.test.ts +34 -0
  494. package/src/clis/zsxq/topic.ts +68 -0
  495. package/src/clis/zsxq/topics.test.ts +29 -0
  496. package/src/clis/zsxq/topics.ts +36 -0
  497. package/src/clis/zsxq/utils.ts +351 -0
  498. package/src/commanderAdapter.test.ts +77 -0
  499. package/src/commanderAdapter.ts +8 -1
  500. package/src/commands/daemon.test.ts +238 -0
  501. package/src/commands/daemon.ts +135 -0
  502. package/src/completion.ts +2 -1
  503. package/src/constants.ts +3 -0
  504. package/src/daemon.test.ts +88 -0
  505. package/src/daemon.ts +26 -14
  506. package/src/discovery.ts +52 -2
  507. package/src/electron-apps.test.ts +50 -0
  508. package/src/electron-apps.ts +89 -0
  509. package/src/engine.test.ts +45 -9
  510. package/src/execution.ts +24 -19
  511. package/src/external-clis.yaml +17 -0
  512. package/src/idle-manager.ts +60 -0
  513. package/src/launcher.test.ts +67 -0
  514. package/src/launcher.ts +185 -0
  515. package/src/main.ts +3 -2
  516. package/src/registry.test.ts +15 -0
  517. package/src/registry.ts +32 -3
  518. package/src/runtime.ts +13 -7
  519. package/src/serialization.test.ts +19 -1
  520. package/src/serialization.ts +2 -0
  521. package/src/tui.test.ts +23 -0
  522. package/src/tui.ts +65 -0
  523. package/src/types.ts +5 -0
  524. package/src/weixin-download.test.ts +27 -0
  525. package/tests/e2e/band-auth.test.ts +20 -0
  526. package/tests/e2e/browser-auth-helpers.ts +18 -0
  527. package/tests/e2e/browser-auth.test.ts +35 -47
  528. package/tests/e2e/browser-public-extended.test.ts +6 -2
  529. package/tests/e2e/browser-public.test.ts +288 -0
  530. package/tests/e2e/management.test.ts +1 -1
  531. package/tests/e2e/plugin-management.test.ts +1 -1
  532. package/vitest.config.ts +1 -0
  533. package/chatwise-opencli.ps1 +0 -82
  534. package/dist/clis/chatwise/shared.d.ts +0 -2
  535. package/dist/clis/chatwise/shared.js +0 -6
  536. package/dist/weread-private-api-regression.test.d.ts +0 -1
  537. package/dist/weread-search-regression.test.d.ts +0 -1
  538. package/dist/weread-search-regression.test.js +0 -39
  539. package/src/clis/chatwise/shared.ts +0 -8
  540. package/src/weread-search-regression.test.ts +0 -44
@@ -23,6 +23,7 @@ export function serializeCommand(cmd) {
23
23
  command: fullName(cmd),
24
24
  site: cmd.site,
25
25
  name: cmd.name,
26
+ aliases: cmd.aliases ?? [],
26
27
  description: cmd.description,
27
28
  strategy: strategyLabel(cmd),
28
29
  browser: !!cmd.browser,
@@ -67,6 +68,8 @@ export function formatRegistryHelpText(cmd) {
67
68
  meta.push(`Deprecated: ${typeof cmd.deprecated === 'string' ? cmd.deprecated : 'yes'}`);
68
69
  if (cmd.replacedBy)
69
70
  meta.push(`Use instead: ${cmd.replacedBy}`);
71
+ if (cmd.aliases?.length)
72
+ meta.push(`Aliases: ${cmd.aliases.join(', ')}`);
70
73
  lines.push(meta.join(' | '));
71
74
  if (cmd.columns?.length)
72
75
  lines.push(`Output columns: ${cmd.columns.join(', ')}`);
@@ -1,6 +1,6 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import { Strategy } from './registry.js';
3
- import { formatRegistryHelpText } from './serialization.js';
3
+ import { formatRegistryHelpText, serializeCommand } from './serialization.js';
4
4
  describe('formatRegistryHelpText', () => {
5
5
  it('summarizes long choices lists so help text stays readable', () => {
6
6
  const cmd = {
@@ -20,4 +20,20 @@ describe('formatRegistryHelpText', () => {
20
20
  };
21
21
  expect(formatRegistryHelpText(cmd)).toContain('--field: all-fields, topic, title, author, ... (+3 more)');
22
22
  });
23
+ it('includes aliases in structured serialization and help text', () => {
24
+ const cmd = {
25
+ site: 'demo',
26
+ name: 'get',
27
+ aliases: ['metadata'],
28
+ description: 'Demo command',
29
+ strategy: Strategy.COOKIE,
30
+ browser: true,
31
+ args: [],
32
+ };
33
+ expect(serializeCommand(cmd)).toMatchObject({
34
+ command: 'demo/get',
35
+ aliases: ['metadata'],
36
+ });
37
+ expect(formatRegistryHelpText(cmd)).toContain('Aliases: metadata');
38
+ });
23
39
  });
package/dist/tui.d.ts CHANGED
@@ -20,3 +20,10 @@ export declare function checkboxPrompt(items: CheckboxItem[], opts?: {
20
20
  title?: string;
21
21
  hint?: string;
22
22
  }): Promise<string[]>;
23
+ /**
24
+ * Simple yes/no confirmation prompt.
25
+ *
26
+ * In non-TTY environments, returns `defaultYes` (defaults to true) without blocking.
27
+ * In TTY, waits for a single keypress: y/Enter → true, n/Esc/q → false.
28
+ */
29
+ export declare function confirmPrompt(message: string, defaultYes?: boolean): Promise<boolean>;
package/dist/tui.js CHANGED
@@ -138,3 +138,55 @@ export async function checkboxPrompt(items, opts = {}) {
138
138
  draw();
139
139
  });
140
140
  }
141
+ /**
142
+ * Simple yes/no confirmation prompt.
143
+ *
144
+ * In non-TTY environments, returns `defaultYes` (defaults to true) without blocking.
145
+ * In TTY, waits for a single keypress: y/Enter → true, n/Esc/q → false.
146
+ */
147
+ export async function confirmPrompt(message, defaultYes = true) {
148
+ const { stdin, stdout } = process;
149
+ if (!stdin.isTTY)
150
+ return defaultYes;
151
+ const hint = defaultYes ? '[Y/n]' : '[y/N]';
152
+ stdout.write(` ${message} ${chalk.dim(hint)} `);
153
+ return new Promise((resolve) => {
154
+ const wasRaw = stdin.isRaw;
155
+ stdin.setRawMode(true);
156
+ stdin.resume();
157
+ function cleanup() {
158
+ stdin.setRawMode(wasRaw ?? false);
159
+ stdin.pause();
160
+ stdin.removeListener('data', onData);
161
+ stdout.write('\n');
162
+ }
163
+ function onData(data) {
164
+ const key = data.toString();
165
+ // Ctrl+C
166
+ if (key === '\x03') {
167
+ cleanup();
168
+ process.exit(EXIT_CODES.INTERRUPTED);
169
+ }
170
+ // Enter — use default
171
+ if (key === '\r' || key === '\n') {
172
+ cleanup();
173
+ resolve(defaultYes);
174
+ return;
175
+ }
176
+ // y/Y — yes
177
+ if (key === 'y' || key === 'Y') {
178
+ cleanup();
179
+ resolve(true);
180
+ return;
181
+ }
182
+ // n/N/q/Esc — no
183
+ if (key === 'n' || key === 'N' || key === 'q' || key === '\x1b') {
184
+ cleanup();
185
+ resolve(false);
186
+ return;
187
+ }
188
+ // Ignore other keys
189
+ }
190
+ stdin.on('data', onData);
191
+ });
192
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { confirmPrompt } from './tui.js';
3
+ describe('confirmPrompt', () => {
4
+ beforeEach(() => {
5
+ vi.restoreAllMocks();
6
+ });
7
+ it('returns defaultYes when stdin is not TTY', async () => {
8
+ const result = await confirmPrompt('Restart?', true);
9
+ expect(result).toBe(true);
10
+ });
11
+ it('returns false when defaultYes is false and non-TTY', async () => {
12
+ const result = await confirmPrompt('Restart?', false);
13
+ expect(result).toBe(false);
14
+ });
15
+ it('defaults to true when defaultYes is omitted and non-TTY', async () => {
16
+ const result = await confirmPrompt('Restart?');
17
+ expect(result).toBe(true);
18
+ });
19
+ });
package/dist/types.d.ts CHANGED
@@ -70,6 +70,11 @@ export interface IPage {
70
70
  getInterceptedRequests(): Promise<any[]>;
71
71
  waitForCapture(timeout?: number): Promise<void>;
72
72
  screenshot(options?: ScreenshotOptions): Promise<string>;
73
+ /**
74
+ * Set local file paths on a file input element via CDP DOM.setFileInputFiles.
75
+ * Chrome reads the files directly — no base64 encoding or payload size limits.
76
+ */
77
+ setFileInput?(files: string[], selector?: string): Promise<void>;
73
78
  closeWindow?(): Promise<void>;
74
79
  /** Returns the current page URL, or null if unavailable. */
75
80
  getCurrentUrl?(): Promise<string | null>;
@@ -27,4 +27,18 @@ describe('weixin publish time extraction', () => {
27
27
  const extractInPage = eval(mod.buildExtractWechatPublishTimeJs());
28
28
  expect(extractInPage('2026年3月24日 22:38', 'var create_time = "1711291080";')).toBe('2026年3月24日 22:38');
29
29
  });
30
+ it('detects WeChat verification gate pages', async () => {
31
+ const mod = await loadModule();
32
+ expect(mod.detectWechatAccessIssue('环境异常 当前环境异常,完成验证后即可继续访问。 去验证', '<html><body><a id="js_verify">去验证</a></body></html>')).toBe('environment verification required');
33
+ });
34
+ it('browser access detector matches the server-side verifier', async () => {
35
+ const mod = await loadModule();
36
+ const detectInPage = eval(mod.buildDetectWechatAccessIssueJs());
37
+ expect(detectInPage('环境异常 当前环境异常,完成验证后即可继续访问。 去验证', '<html>secitptpage/verify.html<a id="js_verify">去验证</a></html>')).toBe('environment verification required');
38
+ });
39
+ it('picks the first non-empty WeChat metadata field', async () => {
40
+ const mod = await loadModule();
41
+ expect(mod.pickFirstWechatMetaText('', 'Name cleared', '数字生命卡兹克')).toBe('数字生命卡兹克');
42
+ expect(mod.pickFirstWechatMetaText('', ' 聊聊刚刚上线的PixVerse V6视频模型。 ')).toBe('聊聊刚刚上线的PixVerse V6视频模型。');
43
+ });
30
44
  });
@@ -50,6 +50,7 @@ export default defineConfig({
50
50
  items: [
51
51
  { text: 'Twitter / X', link: '/adapters/browser/twitter' },
52
52
  { text: 'Reddit', link: '/adapters/browser/reddit' },
53
+ { text: 'Tieba', link: '/adapters/browser/tieba' },
53
54
  { text: 'Bilibili', link: '/adapters/browser/bilibili' },
54
55
  { text: 'Zhihu', link: '/adapters/browser/zhihu' },
55
56
  { text: 'Xiaohongshu', link: '/adapters/browser/xiaohongshu' },
@@ -68,8 +69,10 @@ export default defineConfig({
68
69
  { text: 'Jimeng', link: '/adapters/browser/jimeng' },
69
70
  { text: 'Yollomi', link: '/adapters/browser/yollomi' },
70
71
  { text: 'LINUX DO', link: '/adapters/browser/linux-do' },
72
+ { text: 'Band', link: '/adapters/browser/band' },
71
73
  { text: 'Chaoxing', link: '/adapters/browser/chaoxing' },
72
74
  { text: 'Grok', link: '/adapters/browser/grok' },
75
+ { text: 'NotebookLM', link: '/adapters/browser/notebooklm' },
73
76
  { text: 'WeRead', link: '/adapters/browser/weread' },
74
77
  { text: 'Douban', link: '/adapters/browser/douban' },
75
78
  { text: 'Sina Blog', link: '/adapters/browser/sinablog' },
@@ -104,6 +107,7 @@ export default defineConfig({
104
107
  { text: 'Barchart', link: '/adapters/browser/barchart' },
105
108
  { text: 'Hugging Face', link: '/adapters/browser/hf' },
106
109
  { text: 'Sina Finance', link: '/adapters/browser/sinafinance' },
110
+ { text: 'Spotify', link: '/adapters/browser/spotify' },
107
111
  { text: 'Stack Overflow', link: '/adapters/browser/stackoverflow' },
108
112
  { text: 'Wikipedia', link: '/adapters/browser/wikipedia' },
109
113
  { text: 'Lobsters', link: '/adapters/browser/lobsters' },
@@ -0,0 +1,63 @@
1
+ # Band
2
+
3
+ **Mode**: 🔐 Browser · **Domain**: `www.band.us`
4
+
5
+ Read posts, comments, and notifications from [Band](https://www.band.us), a private community platform. Authentication uses your logged-in Chrome session (cookie-based).
6
+
7
+ ## Commands
8
+
9
+ | Command | Description |
10
+ |---------|-------------|
11
+ | `opencli band bands` | List all Bands you belong to |
12
+ | `opencli band posts <band_no>` | List posts from a Band |
13
+ | `opencli band post <band_no> <post_no>` | Export full post content including nested comments |
14
+ | `opencli band mentions` | Show notifications where you were @mentioned |
15
+
16
+ ## Usage Examples
17
+
18
+ ```bash
19
+ # List all your bands (get band_no from here)
20
+ opencli band bands
21
+
22
+ # List recent posts in a band
23
+ opencli band posts 12345678 --limit 10
24
+
25
+ # Export a post with comments
26
+ opencli band post 12345678 987654321
27
+
28
+ # Export post body only (skip comments)
29
+ opencli band post 12345678 987654321 --comments false
30
+
31
+ # Export post and download attached photos
32
+ opencli band post 12345678 987654321 --output ./band-photos
33
+
34
+ # Show recent @mention notifications
35
+ opencli band mentions --limit 20
36
+
37
+ # Show only unread mentions
38
+ opencli band mentions --unread true
39
+
40
+ # Show all notification types
41
+ opencli band mentions --filter all
42
+ ```
43
+
44
+ ### `band mentions` filter options
45
+
46
+ | Filter | Description |
47
+ |--------|-------------|
48
+ | `mentioned` | Only notifications where you were @mentioned (default) |
49
+ | `all` | All notifications |
50
+ | `post` | Post-related notifications |
51
+ | `comment` | Comment-related notifications |
52
+
53
+ ## Prerequisites
54
+
55
+ - Chrome running and **logged into** [band.us](https://www.band.us)
56
+ - [Browser Bridge extension](/guide/browser-bridge) installed
57
+
58
+ ## Notes
59
+
60
+ - `band_no` is the numeric ID in the Band URL: `band.us/band/{band_no}/post`
61
+ - `band bands` lists all your bands with their `band_no` values
62
+ - `band post` output rows: `type=post` (the post itself), `type=comment` (top-level comment), `type=reply` (nested reply)
63
+ - Photo downloads use the full-resolution URL (thumbnail query params are stripped automatically)
@@ -0,0 +1,69 @@
1
+ # NotebookLM
2
+
3
+ **Mode**: 🔐 Browser Bridge · **Domain**: `notebooklm.google.com`
4
+
5
+ ## Commands
6
+
7
+ | Command | Description |
8
+ |---------|-------------|
9
+ | `opencli notebooklm status` | Check whether NotebookLM is reachable in the current Chrome session |
10
+ | `opencli notebooklm list` | List notebooks visible from the NotebookLM home page |
11
+ | `opencli notebooklm current` | Show metadata for the currently opened notebook tab |
12
+ | `opencli notebooklm get` | Get richer metadata for the current notebook |
13
+ | `opencli notebooklm source-list` | List sources in the current notebook |
14
+ | `opencli notebooklm source-get <source>` | Resolve one source in the current notebook by id or title |
15
+ | `opencli notebooklm source-fulltext <source>` | Fetch extracted source fulltext through NotebookLM RPC |
16
+ | `opencli notebooklm source-guide <source>` | Fetch guide summary and keywords for one source |
17
+ | `opencli notebooklm history` | List conversation history threads for the current notebook |
18
+ | `opencli notebooklm note-list` | List Studio notes visible in the current notebook |
19
+ | `opencli notebooklm notes-get <note>` | Read the currently visible Studio note by title |
20
+ | `opencli notebooklm bind-current` | Bind the current active NotebookLM tab into the `site:notebooklm` workspace |
21
+ | `opencli notebooklm summary` | Read the current notebook summary |
22
+
23
+ ## Compatibility Aliases
24
+
25
+ | Alias | Canonical command |
26
+ |-------|-------------------|
27
+ | `opencli notebooklm metadata` | `opencli notebooklm get` |
28
+ | `opencli notebooklm use` | `opencli notebooklm bind-current` |
29
+ | `opencli notebooklm notes-list` | `opencli notebooklm note-list` |
30
+
31
+ ## Positioning
32
+
33
+ This adapter reuses the existing OpenCLI Browser Bridge runtime:
34
+
35
+ - no custom NotebookLM extension
36
+ - no exported cookie replay
37
+ - requests and page state stay in the real Chrome session
38
+
39
+ The current milestone focuses on a stable NotebookLM read surface in desktop Chrome with an already logged-in Google account.
40
+
41
+ ## Usage Examples
42
+
43
+ ```bash
44
+ opencli notebooklm status
45
+ opencli notebooklm list -f json
46
+ opencli notebooklm current -f json
47
+ opencli notebooklm metadata -f json
48
+ opencli notebooklm source-list -f json
49
+ opencli notebooklm source-get "Quarterly report" -f json
50
+ opencli notebooklm source-guide "Quarterly report" -f json
51
+ opencli notebooklm source-fulltext "Quarterly report" -f json
52
+ opencli notebooklm history -f json
53
+ opencli notebooklm notes-list -f json
54
+ opencli notebooklm notes-get "Draft note" -f json
55
+ opencli notebooklm summary -f json
56
+ opencli notebooklm use -f json
57
+ ```
58
+
59
+ ## Prerequisites
60
+
61
+ - Chrome running and logged into Google / NotebookLM
62
+ - [Browser Bridge extension](/guide/browser-bridge) installed
63
+ - NotebookLM accessible in the current browser session
64
+
65
+ ## Notes
66
+
67
+ - Notebook-oriented commands assume you already have the target notebook open in Chrome, or that `opencli notebooklm use` can bind an existing notebook tab into `site:notebooklm`.
68
+ - `list`, `get`, `source-list`, `history`, `source-fulltext`, and `source-guide` prefer NotebookLM RPC paths and fall back only when the richer path is unavailable.
69
+ - `notes-get` currently reads note content only from the visible Studio note editor; if the note is listed but not open, open it in NotebookLM first and then retry.
@@ -0,0 +1,59 @@
1
+ # ONES
2
+
3
+ **Mode**: 🔐 Browser Bridge · **Domain**: `ones.cn` (self-hosted via `ONES_BASE_URL`)
4
+
5
+ ## Commands
6
+
7
+ | Command | Description |
8
+ |---------|-------------|
9
+ | `opencli ones login` | Login via Project API (`auth/login`) |
10
+ | `opencli ones me` | Current user profile (`users/me`) |
11
+ | `opencli ones token-info` | Token/user/team summary (`auth/token_info`) |
12
+ | `opencli ones tasks` | Team task list with status/project labels and hours |
13
+ | `opencli ones my-tasks` | My tasks (`assign`/`field004`/`owner`/`both`) |
14
+ | `opencli ones task` | Task detail by UUID (`team/:team/task/:id/info`) |
15
+ | `opencli ones worklog` | Log/backfill hours (GraphQL `addManhour` first, then REST fallbacks) |
16
+ | `opencli ones logout` | Logout (`auth/logout`) |
17
+
18
+ ## Usage Examples
19
+
20
+ ```bash
21
+ # Required: your ONES base URL
22
+ export ONES_BASE_URL=https://your-instance.example.com
23
+
24
+ # Optional if your deployment requires auth headers
25
+ # export ONES_USER_ID=...
26
+ # export ONES_AUTH_TOKEN=...
27
+
28
+ # Login/profile
29
+ opencli ones login --email you@company.com --password 'your-password'
30
+ opencli ones me
31
+ opencli ones token-info
32
+
33
+ # Task lists
34
+ opencli ones tasks <teamUUID> --limit 20
35
+ opencli ones tasks <teamUUID> --project <projectUUID> --assign <userUUID>
36
+ opencli ones my-tasks <teamUUID> --limit 100
37
+ opencli ones my-tasks <teamUUID> --mode both
38
+
39
+ # Task detail
40
+ opencli ones task <taskUUID> --team <teamUUID>
41
+
42
+ # Worklog: today / backfill
43
+ opencli ones worklog <taskUUID> 2 --team <teamUUID>
44
+ opencli ones worklog <taskUUID> 1.5 --team <teamUUID> --date 2026-03-23 --note "integration"
45
+
46
+ opencli ones logout
47
+ ```
48
+
49
+ ## Prerequisites
50
+
51
+ - Chrome running and logged into your ONES instance
52
+ - [Browser Bridge extension](/guide/browser-bridge) installed
53
+ - `ONES_BASE_URL` set to the same origin opened in Chrome
54
+
55
+ ## Notes
56
+
57
+ - This adapter targets legacy ONES Project API deployments.
58
+ - `ONES_TEAM_UUID` can be set to omit `--team` in `tasks` / `my-tasks` / `task`.
59
+ - Hours display and input use `ONES_MANHOUR_SCALE` (default `100000`).
@@ -0,0 +1,62 @@
1
+ # Spotify
2
+
3
+ **Mode**: 🔑 OAuth API · **Domains**: `accounts.spotify.com`, `api.spotify.com`
4
+
5
+ ## Commands
6
+
7
+ | Command | Description |
8
+ |---------|-------------|
9
+ | `opencli spotify auth` | Authenticate with Spotify and store tokens locally |
10
+ | `opencli spotify status` | Show current playback status |
11
+ | `opencli spotify play [query]` | Resume playback or search-and-play a track |
12
+ | `opencli spotify pause` | Pause playback |
13
+ | `opencli spotify next` | Skip to the next track |
14
+ | `opencli spotify prev` | Skip to the previous track |
15
+ | `opencli spotify volume <0-100>` | Set playback volume |
16
+ | `opencli spotify search <query>` | Search Spotify tracks |
17
+ | `opencli spotify queue <query>` | Add a track to the playback queue |
18
+ | `opencli spotify shuffle <on|off>` | Toggle shuffle |
19
+ | `opencli spotify repeat <off|track|context>` | Set repeat mode |
20
+
21
+ ## Usage Examples
22
+
23
+ ```bash
24
+ # First-time setup
25
+ opencli spotify auth
26
+
27
+ # What is playing right now?
28
+ opencli spotify status
29
+
30
+ # Resume playback
31
+ opencli spotify play
32
+
33
+ # Search and immediately play a track
34
+ opencli spotify play "Numb Linkin Park"
35
+
36
+ # Search without playing
37
+ opencli spotify search "Daft Punk" --limit 5 -f json
38
+
39
+ # Queue a track
40
+ opencli spotify queue "Get Lucky"
41
+
42
+ # Playback controls
43
+ opencli spotify pause
44
+ opencli spotify next
45
+ opencli spotify prev
46
+ opencli spotify volume 35
47
+ opencli spotify shuffle on
48
+ opencli spotify repeat track
49
+ ```
50
+
51
+ ## Setup
52
+
53
+ 1. Create a Spotify app at <https://developer.spotify.com/dashboard>
54
+ 2. Add `http://127.0.0.1:8888/callback` to the app's Redirect URIs
55
+ 3. Fill in `SPOTIFY_CLIENT_ID` and `SPOTIFY_CLIENT_SECRET` in `~/.opencli/spotify.env`
56
+ 4. Run `opencli spotify auth`
57
+
58
+ ## Notes
59
+
60
+ - Browser Bridge is not required.
61
+ - Tokens are stored locally at `~/.opencli/spotify-tokens.json`.
62
+ - Playback commands work best when you already have an active Spotify device/session.
@@ -0,0 +1,45 @@
1
+ # Tieba
2
+
3
+ **Mode**: 🔐 Browser · **Domain**: `tieba.baidu.com`
4
+
5
+ ## Commands
6
+
7
+ | Command | Description |
8
+ |---------|-------------|
9
+ | `opencli tieba hot` | Read Tieba trending topics |
10
+ | `opencli tieba posts <forum>` | List threads in one forum |
11
+ | `opencli tieba search <keyword>` | Search threads across Tieba |
12
+ | `opencli tieba read <thread-id>` | Read one thread page |
13
+
14
+ ## Usage Examples
15
+
16
+ ```bash
17
+ # Trending topics
18
+ opencli tieba hot --limit 5
19
+
20
+ # List forum threads
21
+ opencli tieba posts 李毅 --limit 10
22
+
23
+ # Search Tieba
24
+ opencli tieba search 编程 --limit 10
25
+
26
+ # Read one thread
27
+ opencli tieba read 10163164720 --limit 10
28
+
29
+ # Read page 2 of a thread
30
+ opencli tieba read 10163164720 --page 2 --limit 10
31
+
32
+ # JSON output
33
+ opencli tieba hot -f json
34
+ ```
35
+
36
+ ## Notes
37
+
38
+ - `tieba search` currently supports only `--page 1`
39
+ - `tieba read --limit` counts reply rows; page 1 may also include the main post
40
+
41
+ ## Prerequisites
42
+
43
+ - Chrome running and able to open `tieba.baidu.com`
44
+ - [Browser Bridge extension](/guide/browser-bridge) installed
45
+ - For `posts`, `search`, and `read`, a valid Tieba login session in Chrome is recommended
@@ -7,15 +7,18 @@
7
7
  | Command | Description |
8
8
  |---------|-------------|
9
9
  | `opencli xiaohongshu search` | Search notes by keyword (returns title, author, likes, URL) |
10
- | `opencli xiaohongshu notifications` | |
11
- | `opencli xiaohongshu feed` | |
12
- | `opencli xiaohongshu user` | |
13
- | `opencli xiaohongshu download` | |
14
- | `opencli xiaohongshu creator-notes` | |
15
- | `opencli xiaohongshu creator-note-detail` | |
16
- | `opencli xiaohongshu creator-notes-summary` | |
17
- | `opencli xiaohongshu creator-profile` | |
18
- | `opencli xiaohongshu creator-stats` | |
10
+ | `opencli xiaohongshu note` | Read full note content (title, author, description, likes, collects, comments, tags) |
11
+ | `opencli xiaohongshu comments` | Read comments from a note (`--with-replies` for nested 楼中楼 replies) |
12
+ | `opencli xiaohongshu feed` | Home feed recommendations (via Pinia store interception) |
13
+ | `opencli xiaohongshu notifications` | User notifications (mentions, likes, connections) |
14
+ | `opencli xiaohongshu user` | Get public notes from a user profile |
15
+ | `opencli xiaohongshu download` | Download images and videos from a note |
16
+ | `opencli xiaohongshu publish` | Publish image-text notes (creator center UI automation) |
17
+ | `opencli xiaohongshu creator-notes` | Creator's note list with per-note metrics |
18
+ | `opencli xiaohongshu creator-note-detail` | Detailed analytics for a single creator note |
19
+ | `opencli xiaohongshu creator-notes-summary` | Combined note list + detail analytics summary |
20
+ | `opencli xiaohongshu creator-profile` | Creator account info (followers, growth level) |
21
+ | `opencli xiaohongshu creator-stats` | Creator data overview (views, likes, collects, trends) |
19
22
 
20
23
  ## Usage Examples
21
24
 
@@ -23,13 +26,19 @@
23
26
  # Search for notes
24
27
  opencli xiaohongshu search 美食 --limit 10
25
28
 
29
+ # Read a note's full content (pass URL from search results to preserve xsec_token)
30
+ opencli xiaohongshu note "https://www.xiaohongshu.com/search_result/<id>?xsec_token=..."
31
+
32
+ # Read comments with nested replies (楼中楼)
33
+ opencli xiaohongshu comments "https://www.xiaohongshu.com/search_result/<id>?xsec_token=..." --with-replies --limit 20
34
+
26
35
  # JSON output
27
36
  opencli xiaohongshu search 旅行 -f json
28
37
 
29
38
  # Other commands
30
39
  opencli xiaohongshu feed
31
40
  opencli xiaohongshu notifications
32
- opencli xiaohongshu download <url>
41
+ opencli xiaohongshu download <note-id or url>
33
42
  ```
34
43
 
35
44
  ## Prerequisites
@@ -12,6 +12,7 @@
12
12
  | `opencli xueqiu hot` | 获取雪球热门动态 |
13
13
  | `opencli xueqiu search` | 搜索雪球股票(代码或名称) |
14
14
  | `opencli xueqiu stock` | 获取雪球股票实时行情 |
15
+ | `opencli xueqiu comments` | 获取单只股票的讨论动态(按时间排序) |
15
16
  | `opencli xueqiu watchlist` | 获取雪球自选股列表 |
16
17
  | `opencli xueqiu fund-holdings` | 获取蛋卷基金持仓明细(可用 `--account` 按子账户过滤) |
17
18
  | `opencli xueqiu fund-snapshot` | 获取蛋卷基金快照(总资产、子账户、持仓,推荐 `-f json`) |
@@ -28,6 +29,9 @@ opencli xueqiu search 茅台
28
29
  # View one stock
29
30
  opencli xueqiu stock SH600519
30
31
 
32
+ # View recent discussions for one stock
33
+ opencli xueqiu comments SH600519 --limit 5
34
+
31
35
  # Upcoming earnings dates
32
36
  opencli xueqiu earnings-date SH600519 --next
33
37
 
@@ -57,4 +61,5 @@ opencli xueqiu feed -v
57
61
 
58
62
  - `fund-holdings` exposes both market value and share fields (`volume`, `usableRemainShare`)
59
63
  - `fund-snapshot -f json` is the easiest way to persist a full account snapshot for later analysis or diffing
64
+ - `comments` returns stock-scoped discussion posts from the symbol page, not reply threads under one parent post
60
65
  - If the commands return empty data, first confirm the logged-in browser can directly see the Danjuan asset page
@@ -0,0 +1,49 @@
1
+ # 知识星球 (ZSXQ)
2
+
3
+ **Mode**: 🔐 Browser · **Domain**: `wx.zsxq.com`
4
+
5
+ Read groups, topics, search results, dynamics, and single-topic details from [知识星球](https://wx.zsxq.com) using your logged-in Chrome session.
6
+
7
+ ## Commands
8
+
9
+ | Command | Description |
10
+ |---------|-------------|
11
+ | `opencli zsxq groups` | List the groups your account has joined |
12
+ | `opencli zsxq topics` | List topics in the active group |
13
+ | `opencli zsxq topic <id>` | Fetch a single topic with comments |
14
+ | `opencli zsxq search <keyword>` | Search topics inside a group |
15
+ | `opencli zsxq dynamics` | List recent dynamics across groups |
16
+
17
+ ## Usage Examples
18
+
19
+ ```bash
20
+ # List your groups
21
+ opencli zsxq groups
22
+
23
+ # List topics from the active group in Chrome
24
+ opencli zsxq topics --limit 20
25
+
26
+ # Search inside the active group
27
+ opencli zsxq search "opencli"
28
+
29
+ # Search inside a specific group explicitly
30
+ opencli zsxq search "opencli" --group_id 123456789
31
+
32
+ # Export a single topic with comments
33
+ opencli zsxq topic 987654321 --comment_limit 20
34
+
35
+ # Read recent dynamics across all joined groups
36
+ opencli zsxq dynamics --limit 20
37
+ ```
38
+
39
+ ## Prerequisites
40
+
41
+ - Chrome running and **logged into** [wx.zsxq.com](https://wx.zsxq.com)
42
+ - [Browser Bridge extension](/guide/browser-bridge) installed
43
+
44
+ ## Notes
45
+
46
+ - `zsxq topics` and `zsxq search` use the current active group context from Chrome by default
47
+ - If there is no active group context, pass `--group_id <id>` or open the target group in Chrome first
48
+ - `zsxq groups` returns `group_id`, which you can reuse with `--group_id`
49
+ - `zsxq topic` surfaces a missing topic as `NOT_FOUND` instead of a generic fetch error