@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.
- package/CHANGELOG.md +26 -0
- package/README.md +31 -4
- package/README.zh-CN.md +40 -5
- package/SKILL.md +1 -1
- package/dist/browser/cdp.d.ts +1 -0
- package/dist/browser/cdp.js +30 -27
- package/dist/browser/daemon-client.d.ts +11 -1
- package/dist/browser/daemon-client.js +3 -0
- package/dist/browser/dom-helpers.js +1 -0
- package/dist/browser/dom-helpers.test.js +14 -1
- package/dist/browser/mcp.js +18 -13
- package/dist/browser/page.d.ts +6 -0
- package/dist/browser/page.js +37 -2
- package/dist/browser/page.test.d.ts +1 -0
- package/dist/browser/page.test.js +44 -0
- package/dist/browser/stealth.js +198 -0
- package/dist/browser/stealth.test.d.ts +1 -0
- package/dist/browser/stealth.test.js +134 -0
- package/dist/browser.test.js +1 -1
- package/dist/build-manifest.d.ts +1 -0
- package/dist/build-manifest.js +5 -1
- package/dist/build-manifest.test.js +2 -0
- package/dist/cli-manifest.json +1821 -252
- package/dist/cli.js +20 -3
- package/dist/clis/antigravity/serve.d.ts +1 -1
- package/dist/clis/antigravity/serve.js +5 -8
- package/dist/clis/band/bands.d.ts +1 -0
- package/dist/clis/band/bands.js +72 -0
- package/dist/clis/band/mentions.d.ts +1 -0
- package/dist/clis/band/mentions.js +127 -0
- package/dist/clis/band/post.d.ts +1 -0
- package/dist/clis/band/post.js +175 -0
- package/dist/clis/band/posts.d.ts +1 -0
- package/dist/clis/band/posts.js +94 -0
- package/dist/clis/bilibili/subtitle.js +4 -0
- package/dist/clis/bilibili/subtitle.test.d.ts +1 -0
- package/dist/clis/bilibili/subtitle.test.js +48 -0
- package/dist/clis/chatwise/ask.js +0 -2
- package/dist/clis/chatwise/export.js +0 -2
- package/dist/clis/chatwise/history.js +0 -2
- package/dist/clis/chatwise/model.js +0 -2
- package/dist/clis/chatwise/new.js +1 -2
- package/dist/clis/chatwise/read.js +0 -2
- package/dist/clis/chatwise/screenshot.js +1 -2
- package/dist/clis/chatwise/send.js +0 -2
- package/dist/clis/chatwise/status.js +1 -2
- package/dist/clis/ctrip/search.d.ts +13 -0
- package/dist/clis/ctrip/search.js +73 -48
- package/dist/clis/ctrip/search.test.d.ts +1 -0
- package/dist/clis/ctrip/search.test.js +64 -0
- package/dist/clis/doubao/detail.d.ts +1 -0
- package/dist/clis/doubao/detail.js +33 -0
- package/dist/clis/doubao/detail.test.d.ts +1 -0
- package/dist/clis/doubao/detail.test.js +42 -0
- package/dist/clis/doubao/history.d.ts +1 -0
- package/dist/clis/doubao/history.js +28 -0
- package/dist/clis/doubao/history.test.d.ts +1 -0
- package/dist/clis/doubao/history.test.js +37 -0
- package/dist/clis/doubao/meeting-summary.d.ts +1 -0
- package/dist/clis/doubao/meeting-summary.js +39 -0
- package/dist/clis/doubao/meeting-transcript.d.ts +1 -0
- package/dist/clis/doubao/meeting-transcript.js +36 -0
- package/dist/clis/doubao/utils.d.ts +27 -0
- package/dist/clis/doubao/utils.js +317 -0
- package/dist/clis/doubao/utils.test.d.ts +1 -0
- package/dist/clis/doubao/utils.test.js +24 -0
- package/dist/clis/douyin/_shared/public-api.d.ts +33 -0
- package/dist/clis/douyin/_shared/public-api.js +29 -0
- package/dist/clis/douyin/_shared/sts2.js +8 -2
- package/dist/clis/douyin/_shared/sts2.test.d.ts +1 -0
- package/dist/clis/douyin/_shared/sts2.test.js +27 -0
- package/dist/clis/douyin/activities.js +4 -2
- package/dist/clis/douyin/activities.test.js +34 -1
- package/dist/clis/douyin/collections.js +1 -1
- package/dist/clis/douyin/collections.test.js +24 -2
- package/dist/clis/douyin/draft.d.ts +8 -11
- package/dist/clis/douyin/draft.js +302 -185
- package/dist/clis/douyin/draft.test.d.ts +1 -1
- package/dist/clis/douyin/draft.test.js +357 -2
- package/dist/clis/douyin/hashtag.js +9 -2
- package/dist/clis/douyin/hashtag.test.js +35 -2
- package/dist/clis/douyin/profile.js +1 -1
- package/dist/clis/douyin/profile.test.js +36 -1
- package/dist/clis/douyin/user-videos.d.ts +5 -0
- package/dist/clis/douyin/user-videos.js +74 -0
- package/dist/clis/douyin/user-videos.test.d.ts +1 -0
- package/dist/clis/douyin/user-videos.test.js +108 -0
- package/dist/clis/douyin/videos.js +22 -5
- package/dist/clis/douyin/videos.test.js +45 -2
- package/dist/clis/facebook/search.test.d.ts +5 -0
- package/dist/clis/facebook/search.test.js +60 -0
- package/dist/clis/facebook/search.yaml +4 -3
- package/dist/clis/instagram/download.d.ts +16 -0
- package/dist/clis/instagram/download.js +225 -0
- package/dist/clis/instagram/download.test.d.ts +1 -0
- package/dist/clis/instagram/download.test.js +118 -0
- package/dist/clis/notebooklm/bind-current.d.ts +1 -0
- package/dist/clis/notebooklm/bind-current.js +29 -0
- package/dist/clis/notebooklm/bind-current.test.d.ts +1 -0
- package/dist/clis/notebooklm/bind-current.test.js +35 -0
- package/dist/clis/notebooklm/binding.test.d.ts +1 -0
- package/dist/clis/notebooklm/binding.test.js +44 -0
- package/dist/clis/notebooklm/compat.test.d.ts +3 -0
- package/dist/clis/notebooklm/compat.test.js +16 -0
- package/dist/clis/notebooklm/current.d.ts +1 -0
- package/dist/clis/notebooklm/current.js +28 -0
- package/dist/clis/notebooklm/get.d.ts +1 -0
- package/dist/clis/notebooklm/get.js +37 -0
- package/dist/clis/notebooklm/history.d.ts +1 -0
- package/dist/clis/notebooklm/history.js +25 -0
- package/dist/clis/notebooklm/history.test.d.ts +1 -0
- package/dist/clis/notebooklm/history.test.js +58 -0
- package/dist/clis/notebooklm/list.d.ts +1 -0
- package/dist/clis/notebooklm/list.js +35 -0
- package/dist/clis/notebooklm/note-list.d.ts +1 -0
- package/dist/clis/notebooklm/note-list.js +28 -0
- package/dist/clis/notebooklm/note-list.test.d.ts +1 -0
- package/dist/clis/notebooklm/note-list.test.js +56 -0
- package/dist/clis/notebooklm/notes-get.d.ts +1 -0
- package/dist/clis/notebooklm/notes-get.js +47 -0
- package/dist/clis/notebooklm/notes-get.test.d.ts +1 -0
- package/dist/clis/notebooklm/notes-get.test.js +72 -0
- package/dist/clis/notebooklm/rpc.d.ts +36 -0
- package/dist/clis/notebooklm/rpc.js +189 -0
- package/dist/clis/notebooklm/rpc.test.d.ts +1 -0
- package/dist/clis/notebooklm/rpc.test.js +105 -0
- package/dist/clis/notebooklm/shared.d.ts +87 -0
- package/dist/clis/notebooklm/shared.js +3 -0
- package/dist/clis/notebooklm/source-fulltext.d.ts +1 -0
- package/dist/clis/notebooklm/source-fulltext.js +44 -0
- package/dist/clis/notebooklm/source-fulltext.test.d.ts +1 -0
- package/dist/clis/notebooklm/source-fulltext.test.js +106 -0
- package/dist/clis/notebooklm/source-get.d.ts +1 -0
- package/dist/clis/notebooklm/source-get.js +40 -0
- package/dist/clis/notebooklm/source-get.test.d.ts +1 -0
- package/dist/clis/notebooklm/source-get.test.js +84 -0
- package/dist/clis/notebooklm/source-guide.d.ts +1 -0
- package/dist/clis/notebooklm/source-guide.js +44 -0
- package/dist/clis/notebooklm/source-guide.test.d.ts +1 -0
- package/dist/clis/notebooklm/source-guide.test.js +104 -0
- package/dist/clis/notebooklm/source-list.d.ts +1 -0
- package/dist/clis/notebooklm/source-list.js +30 -0
- package/dist/clis/notebooklm/status.d.ts +1 -0
- package/dist/clis/notebooklm/status.js +31 -0
- package/dist/clis/notebooklm/summary.d.ts +1 -0
- package/dist/clis/notebooklm/summary.js +30 -0
- package/dist/clis/notebooklm/summary.test.d.ts +1 -0
- package/dist/clis/notebooklm/summary.test.js +78 -0
- package/dist/clis/notebooklm/utils.d.ts +37 -0
- package/dist/clis/notebooklm/utils.js +739 -0
- package/dist/clis/notebooklm/utils.test.d.ts +1 -0
- package/dist/clis/notebooklm/utils.test.js +390 -0
- package/dist/clis/ones/common.d.ts +32 -0
- package/dist/clis/ones/common.js +144 -0
- package/dist/clis/ones/enrich-tasks.d.ts +5 -0
- package/dist/clis/ones/enrich-tasks.js +37 -0
- package/dist/clis/ones/login.d.ts +1 -0
- package/dist/clis/ones/login.js +80 -0
- package/dist/clis/ones/logout.d.ts +1 -0
- package/dist/clis/ones/logout.js +17 -0
- package/dist/clis/ones/me.d.ts +1 -0
- package/dist/clis/ones/me.js +30 -0
- package/dist/clis/ones/my-tasks.d.ts +1 -0
- package/dist/clis/ones/my-tasks.js +120 -0
- package/dist/clis/ones/resolve-labels.d.ts +10 -0
- package/dist/clis/ones/resolve-labels.js +64 -0
- package/dist/clis/ones/task-helpers.d.ts +29 -0
- package/dist/clis/ones/task-helpers.js +212 -0
- package/dist/clis/ones/task-helpers.test.d.ts +1 -0
- package/dist/clis/ones/task-helpers.test.js +12 -0
- package/dist/clis/ones/task.d.ts +1 -0
- package/dist/clis/ones/task.js +66 -0
- package/dist/clis/ones/tasks.d.ts +1 -0
- package/dist/clis/ones/tasks.js +79 -0
- package/dist/clis/ones/token-info.d.ts +1 -0
- package/dist/clis/ones/token-info.js +42 -0
- package/dist/clis/ones/worklog.d.ts +11 -0
- package/dist/clis/ones/worklog.js +267 -0
- package/dist/clis/ones/worklog.test.d.ts +1 -0
- package/dist/clis/ones/worklog.test.js +20 -0
- package/dist/clis/spotify/spotify.d.ts +1 -0
- package/dist/clis/spotify/spotify.js +316 -0
- package/dist/clis/spotify/utils.d.ts +21 -0
- package/dist/clis/spotify/utils.js +66 -0
- package/dist/clis/spotify/utils.test.d.ts +1 -0
- package/dist/clis/spotify/utils.test.js +67 -0
- package/dist/clis/substack/utils.d.ts +4 -0
- package/dist/clis/substack/utils.js +8 -2
- package/dist/clis/substack/utils.test.d.ts +1 -0
- package/dist/clis/substack/utils.test.js +46 -0
- package/dist/clis/tieba/commands.test.d.ts +4 -0
- package/dist/clis/tieba/commands.test.js +79 -0
- package/dist/clis/tieba/hot.d.ts +1 -0
- package/dist/clis/tieba/hot.js +48 -0
- package/dist/clis/tieba/posts.d.ts +1 -0
- package/dist/clis/tieba/posts.js +85 -0
- package/dist/clis/tieba/read.d.ts +1 -0
- package/dist/clis/tieba/read.js +140 -0
- package/dist/clis/tieba/search.d.ts +1 -0
- package/dist/clis/tieba/search.js +108 -0
- package/dist/clis/tieba/utils.d.ts +101 -0
- package/dist/clis/tieba/utils.js +240 -0
- package/dist/clis/tieba/utils.test.d.ts +1 -0
- package/dist/clis/tieba/utils.test.js +290 -0
- package/dist/clis/v2ex/hot.yaml +4 -1
- package/dist/clis/v2ex/latest.yaml +4 -1
- package/dist/clis/v2ex/topic.yaml +6 -1
- package/dist/clis/weixin/download.d.ts +9 -0
- package/dist/clis/weixin/download.js +76 -6
- package/dist/clis/weread/book.js +206 -13
- package/dist/clis/weread/commands.test.js +331 -0
- package/dist/clis/weread/private-api-regression.test.d.ts +1 -0
- package/dist/{weread-private-api-regression.test.js → clis/weread/private-api-regression.test.js} +92 -30
- package/dist/clis/weread/search-regression.test.d.ts +1 -0
- package/dist/clis/weread/search-regression.test.js +407 -0
- package/dist/clis/weread/search.js +143 -7
- package/dist/clis/weread/shelf.js +13 -95
- package/dist/clis/weread/utils.d.ts +56 -0
- package/dist/clis/weread/utils.js +234 -7
- package/dist/clis/weread/utils.test.js +71 -1
- package/dist/clis/xiaohongshu/comments.d.ts +3 -0
- package/dist/clis/xiaohongshu/comments.js +76 -17
- package/dist/clis/xiaohongshu/comments.test.js +70 -9
- package/dist/clis/xiaohongshu/download.d.ts +4 -1
- package/dist/clis/xiaohongshu/download.js +83 -22
- package/dist/clis/xiaohongshu/download.test.d.ts +1 -0
- package/dist/clis/xiaohongshu/download.test.js +75 -0
- package/dist/clis/xiaohongshu/note-helpers.d.ts +12 -0
- package/dist/clis/xiaohongshu/note-helpers.js +23 -0
- package/dist/clis/xiaohongshu/note.d.ts +7 -0
- package/dist/clis/xiaohongshu/note.js +76 -0
- package/dist/clis/xiaohongshu/note.test.d.ts +1 -0
- package/dist/clis/xiaohongshu/note.test.js +136 -0
- package/dist/clis/xiaohongshu/publish.d.ts +1 -1
- package/dist/clis/xiaohongshu/publish.js +78 -31
- package/dist/clis/xiaohongshu/publish.test.js +66 -1
- package/dist/clis/xiaohongshu/search.js +9 -0
- package/dist/clis/xiaohongshu/search.test.js +10 -4
- package/dist/clis/xiaohongshu/user-helpers.d.ts +1 -0
- package/dist/clis/xiaohongshu/user-helpers.js +2 -0
- package/dist/clis/xiaohongshu/user-helpers.test.js +18 -0
- package/dist/clis/xueqiu/comments.d.ts +118 -0
- package/dist/clis/xueqiu/comments.js +354 -0
- package/dist/clis/xueqiu/comments.test.d.ts +1 -0
- package/dist/clis/xueqiu/comments.test.js +696 -0
- package/dist/clis/youtube/search.js +57 -17
- package/dist/clis/youtube/transcript.js +2 -4
- package/dist/clis/youtube/utils.d.ts +9 -0
- package/dist/clis/youtube/utils.js +67 -3
- package/dist/clis/youtube/utils.test.d.ts +1 -0
- package/dist/clis/youtube/utils.test.js +37 -0
- package/dist/clis/youtube/video.js +16 -15
- package/dist/clis/zhihu/question.js +19 -17
- package/dist/clis/zhihu/question.test.d.ts +1 -0
- package/dist/clis/zhihu/question.test.js +54 -0
- package/dist/clis/zsxq/dynamics.d.ts +1 -0
- package/dist/clis/zsxq/dynamics.js +47 -0
- package/dist/clis/zsxq/groups.d.ts +1 -0
- package/dist/clis/zsxq/groups.js +32 -0
- package/dist/clis/zsxq/search.d.ts +1 -0
- package/dist/clis/zsxq/search.js +43 -0
- package/dist/clis/zsxq/search.test.d.ts +1 -0
- package/dist/clis/zsxq/search.test.js +24 -0
- package/dist/clis/zsxq/topic.d.ts +1 -0
- package/dist/clis/zsxq/topic.js +47 -0
- package/dist/clis/zsxq/topic.test.d.ts +1 -0
- package/dist/clis/zsxq/topic.test.js +29 -0
- package/dist/clis/zsxq/topics.d.ts +1 -0
- package/dist/clis/zsxq/topics.js +25 -0
- package/dist/clis/zsxq/topics.test.d.ts +1 -0
- package/dist/clis/zsxq/topics.test.js +24 -0
- package/dist/clis/zsxq/utils.d.ts +97 -0
- package/dist/clis/zsxq/utils.js +230 -0
- package/dist/commanderAdapter.js +10 -1
- package/dist/commanderAdapter.test.js +64 -0
- package/dist/commands/daemon.d.ts +9 -0
- package/dist/commands/daemon.js +124 -0
- package/dist/commands/daemon.test.d.ts +1 -0
- package/dist/commands/daemon.test.js +185 -0
- package/dist/completion.js +3 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +2 -0
- package/dist/daemon.d.ts +1 -1
- package/dist/daemon.js +25 -14
- package/dist/daemon.test.d.ts +1 -0
- package/dist/daemon.test.js +65 -0
- package/dist/discovery.d.ts +9 -0
- package/dist/discovery.js +47 -2
- package/dist/electron-apps.d.ts +29 -0
- package/dist/electron-apps.js +65 -0
- package/dist/electron-apps.test.d.ts +1 -0
- package/dist/electron-apps.test.js +43 -0
- package/dist/engine.test.js +41 -9
- package/dist/execution.js +20 -16
- package/dist/external-clis.yaml +17 -0
- package/dist/idle-manager.d.ts +19 -0
- package/dist/idle-manager.js +54 -0
- package/dist/launcher.d.ts +36 -0
- package/dist/launcher.js +152 -0
- package/dist/launcher.test.d.ts +1 -0
- package/dist/launcher.test.js +57 -0
- package/dist/main.js +3 -3
- package/dist/registry.d.ts +1 -0
- package/dist/registry.js +31 -3
- package/dist/registry.test.js +13 -0
- package/dist/runtime.d.ts +5 -3
- package/dist/runtime.js +12 -5
- package/dist/serialization.d.ts +1 -0
- package/dist/serialization.js +3 -0
- package/dist/serialization.test.js +17 -1
- package/dist/tui.d.ts +7 -0
- package/dist/tui.js +52 -0
- package/dist/tui.test.d.ts +1 -0
- package/dist/tui.test.js +19 -0
- package/dist/types.d.ts +5 -0
- package/dist/weixin-download.test.js +14 -0
- package/docs/.vitepress/config.mts +4 -0
- package/docs/adapters/browser/band.md +63 -0
- package/docs/adapters/browser/notebooklm.md +69 -0
- package/docs/adapters/browser/ones.md +59 -0
- package/docs/adapters/browser/spotify.md +62 -0
- package/docs/adapters/browser/tieba.md +45 -0
- package/docs/adapters/browser/xiaohongshu.md +19 -10
- package/docs/adapters/browser/xueqiu.md +5 -0
- package/docs/adapters/browser/zsxq.md +49 -0
- package/docs/adapters/index.md +67 -63
- package/docs/adapters-doc/ones.md +32 -0
- package/docs/guide/browser-bridge.md +12 -0
- package/docs/guide/troubleshooting.md +9 -4
- package/docs/superpowers/plans/2026-03-31-daemon-lifecycle-redesign.md +857 -0
- package/docs/superpowers/specs/2026-03-31-daemon-lifecycle-redesign.md +208 -0
- package/docs/zh/guide/browser-bridge.md +12 -0
- package/extension/dist/background.js +794 -513
- package/extension/src/background.test.ts +202 -2
- package/extension/src/background.ts +189 -10
- package/extension/src/cdp.ts +54 -0
- package/extension/src/protocol.ts +11 -5
- package/package.json +1 -1
- package/scripts/postinstall.js +16 -0
- package/src/browser/cdp.ts +24 -17
- package/src/browser/daemon-client.ts +11 -1
- package/src/browser/dom-helpers.test.ts +15 -1
- package/src/browser/dom-helpers.ts +1 -0
- package/src/browser/mcp.ts +18 -13
- package/src/browser/page.test.ts +58 -0
- package/src/browser/page.ts +34 -2
- package/src/browser/stealth.test.ts +153 -0
- package/src/browser/stealth.ts +198 -0
- package/src/browser.test.ts +1 -1
- package/src/build-manifest.test.ts +2 -0
- package/src/build-manifest.ts +6 -1
- package/src/cli.ts +21 -3
- package/src/clis/antigravity/SKILL.md +3 -12
- package/src/clis/antigravity/serve.ts +5 -10
- package/src/clis/band/bands.ts +76 -0
- package/src/clis/band/mentions.ts +134 -0
- package/src/clis/band/post.ts +187 -0
- package/src/clis/band/posts.ts +106 -0
- package/src/clis/bilibili/subtitle.test.ts +60 -0
- package/src/clis/bilibili/subtitle.ts +4 -0
- package/src/clis/chatwise/ask.ts +0 -2
- package/src/clis/chatwise/export.ts +0 -2
- package/src/clis/chatwise/history.ts +0 -2
- package/src/clis/chatwise/model.ts +0 -2
- package/src/clis/chatwise/new.ts +1 -2
- package/src/clis/chatwise/read.ts +0 -2
- package/src/clis/chatwise/screenshot.ts +1 -2
- package/src/clis/chatwise/send.ts +0 -2
- package/src/clis/chatwise/status.ts +1 -2
- package/src/clis/ctrip/search.test.ts +73 -0
- package/src/clis/ctrip/search.ts +97 -47
- package/src/clis/doubao/detail.test.ts +53 -0
- package/src/clis/doubao/detail.ts +41 -0
- package/src/clis/doubao/history.test.ts +45 -0
- package/src/clis/doubao/history.ts +32 -0
- package/src/clis/doubao/meeting-summary.ts +53 -0
- package/src/clis/doubao/meeting-transcript.ts +48 -0
- package/src/clis/doubao/utils.test.ts +45 -0
- package/src/clis/doubao/utils.ts +371 -0
- package/src/clis/douyin/_shared/public-api.ts +84 -0
- package/src/clis/douyin/_shared/sts2.test.ts +31 -0
- package/src/clis/douyin/_shared/sts2.ts +11 -3
- package/src/clis/douyin/activities.test.ts +41 -1
- package/src/clis/douyin/activities.ts +12 -3
- package/src/clis/douyin/collections.test.ts +35 -2
- package/src/clis/douyin/collections.ts +1 -1
- package/src/clis/douyin/draft.test.ts +444 -2
- package/src/clis/douyin/draft.ts +382 -218
- package/src/clis/douyin/hashtag.test.ts +42 -2
- package/src/clis/douyin/hashtag.ts +11 -3
- package/src/clis/douyin/profile.test.ts +43 -1
- package/src/clis/douyin/profile.ts +9 -2
- package/src/clis/douyin/user-videos.test.ts +122 -0
- package/src/clis/douyin/user-videos.ts +101 -0
- package/src/clis/douyin/videos.test.ts +52 -2
- package/src/clis/douyin/videos.ts +49 -15
- package/src/clis/facebook/search.test.ts +70 -0
- package/src/clis/facebook/search.yaml +4 -3
- package/src/clis/instagram/download.test.ts +159 -0
- package/src/clis/instagram/download.ts +286 -0
- package/src/clis/notebooklm/bind-current.test.ts +43 -0
- package/src/clis/notebooklm/bind-current.ts +36 -0
- package/src/clis/notebooklm/binding.test.ts +53 -0
- package/src/clis/notebooklm/compat.test.ts +19 -0
- package/src/clis/notebooklm/current.ts +38 -0
- package/src/clis/notebooklm/get.ts +53 -0
- package/src/clis/notebooklm/history.test.ts +70 -0
- package/src/clis/notebooklm/history.ts +36 -0
- package/src/clis/notebooklm/list.ts +40 -0
- package/src/clis/notebooklm/note-list.test.ts +64 -0
- package/src/clis/notebooklm/note-list.ts +42 -0
- package/src/clis/notebooklm/notes-get.test.ts +88 -0
- package/src/clis/notebooklm/notes-get.ts +67 -0
- package/src/clis/notebooklm/rpc.test.ts +126 -0
- package/src/clis/notebooklm/rpc.ts +286 -0
- package/src/clis/notebooklm/shared.ts +98 -0
- package/src/clis/notebooklm/source-fulltext.test.ts +123 -0
- package/src/clis/notebooklm/source-fulltext.ts +69 -0
- package/src/clis/notebooklm/source-get.test.ts +100 -0
- package/src/clis/notebooklm/source-get.ts +60 -0
- package/src/clis/notebooklm/source-guide.test.ts +121 -0
- package/src/clis/notebooklm/source-guide.ts +69 -0
- package/src/clis/notebooklm/source-list.ts +45 -0
- package/src/clis/notebooklm/status.ts +34 -0
- package/src/clis/notebooklm/summary.test.ts +94 -0
- package/src/clis/notebooklm/summary.ts +45 -0
- package/src/clis/notebooklm/utils.test.ts +446 -0
- package/src/clis/notebooklm/utils.ts +893 -0
- package/src/clis/ones/common.ts +187 -0
- package/src/clis/ones/enrich-tasks.ts +47 -0
- package/src/clis/ones/login.ts +103 -0
- package/src/clis/ones/logout.ts +19 -0
- package/src/clis/ones/me.ts +34 -0
- package/src/clis/ones/my-tasks.ts +148 -0
- package/src/clis/ones/resolve-labels.ts +80 -0
- package/src/clis/ones/task-helpers.test.ts +14 -0
- package/src/clis/ones/task-helpers.ts +214 -0
- package/src/clis/ones/task.ts +79 -0
- package/src/clis/ones/tasks.ts +92 -0
- package/src/clis/ones/token-info.ts +46 -0
- package/src/clis/ones/worklog.test.ts +24 -0
- package/src/clis/ones/worklog.ts +306 -0
- package/src/clis/spotify/spotify.ts +328 -0
- package/src/clis/spotify/utils.test.ts +87 -0
- package/src/clis/spotify/utils.ts +92 -0
- package/src/clis/substack/utils.test.ts +54 -0
- package/src/clis/substack/utils.ts +10 -2
- package/src/clis/tieba/commands.test.ts +86 -0
- package/src/clis/tieba/hot.ts +52 -0
- package/src/clis/tieba/posts.ts +108 -0
- package/src/clis/tieba/read.ts +158 -0
- package/src/clis/tieba/search.ts +119 -0
- package/src/clis/tieba/utils.test.ts +322 -0
- package/src/clis/tieba/utils.ts +348 -0
- package/src/clis/v2ex/hot.yaml +4 -1
- package/src/clis/v2ex/latest.yaml +4 -1
- package/src/clis/v2ex/topic.yaml +6 -1
- package/src/clis/weixin/download.ts +95 -6
- package/src/clis/weread/book.ts +256 -13
- package/src/clis/weread/commands.test.ts +409 -0
- package/src/{weread-private-api-regression.test.ts → clis/weread/private-api-regression.test.ts} +108 -30
- package/src/clis/weread/search-regression.test.ts +440 -0
- package/src/clis/weread/search.ts +189 -9
- package/src/clis/weread/shelf.ts +20 -122
- package/src/clis/weread/utils.test.ts +81 -1
- package/src/clis/weread/utils.ts +293 -7
- package/src/clis/xiaohongshu/comments.test.ts +85 -9
- package/src/clis/xiaohongshu/comments.ts +76 -17
- package/src/clis/xiaohongshu/download.test.ts +96 -0
- package/src/clis/xiaohongshu/download.ts +83 -22
- package/src/clis/xiaohongshu/note-helpers.ts +25 -0
- package/src/clis/xiaohongshu/note.test.ts +164 -0
- package/src/clis/xiaohongshu/note.ts +86 -0
- package/src/clis/xiaohongshu/publish.test.ts +79 -1
- package/src/clis/xiaohongshu/publish.ts +84 -30
- package/src/clis/xiaohongshu/search.test.ts +11 -4
- package/src/clis/xiaohongshu/search.ts +13 -0
- package/src/clis/xiaohongshu/user-helpers.test.ts +23 -0
- package/src/clis/xiaohongshu/user-helpers.ts +4 -0
- package/src/clis/xueqiu/comments.test.ts +823 -0
- package/src/clis/xueqiu/comments.ts +461 -0
- package/src/clis/youtube/search.ts +57 -17
- package/src/clis/youtube/transcript.ts +2 -4
- package/src/clis/youtube/utils.test.ts +43 -0
- package/src/clis/youtube/utils.ts +69 -0
- package/src/clis/youtube/video.ts +16 -15
- package/src/clis/zhihu/question.test.ts +71 -0
- package/src/clis/zhihu/question.ts +27 -15
- package/src/clis/zsxq/dynamics.ts +60 -0
- package/src/clis/zsxq/groups.ts +41 -0
- package/src/clis/zsxq/search.test.ts +29 -0
- package/src/clis/zsxq/search.ts +54 -0
- package/src/clis/zsxq/topic.test.ts +34 -0
- package/src/clis/zsxq/topic.ts +68 -0
- package/src/clis/zsxq/topics.test.ts +29 -0
- package/src/clis/zsxq/topics.ts +36 -0
- package/src/clis/zsxq/utils.ts +351 -0
- package/src/commanderAdapter.test.ts +77 -0
- package/src/commanderAdapter.ts +8 -1
- package/src/commands/daemon.test.ts +238 -0
- package/src/commands/daemon.ts +135 -0
- package/src/completion.ts +2 -1
- package/src/constants.ts +3 -0
- package/src/daemon.test.ts +88 -0
- package/src/daemon.ts +26 -14
- package/src/discovery.ts +52 -2
- package/src/electron-apps.test.ts +50 -0
- package/src/electron-apps.ts +89 -0
- package/src/engine.test.ts +45 -9
- package/src/execution.ts +24 -19
- package/src/external-clis.yaml +17 -0
- package/src/idle-manager.ts +60 -0
- package/src/launcher.test.ts +67 -0
- package/src/launcher.ts +185 -0
- package/src/main.ts +3 -2
- package/src/registry.test.ts +15 -0
- package/src/registry.ts +32 -3
- package/src/runtime.ts +13 -7
- package/src/serialization.test.ts +19 -1
- package/src/serialization.ts +2 -0
- package/src/tui.test.ts +23 -0
- package/src/tui.ts +65 -0
- package/src/types.ts +5 -0
- package/src/weixin-download.test.ts +27 -0
- package/tests/e2e/band-auth.test.ts +20 -0
- package/tests/e2e/browser-auth-helpers.ts +18 -0
- package/tests/e2e/browser-auth.test.ts +35 -47
- package/tests/e2e/browser-public-extended.test.ts +6 -2
- package/tests/e2e/browser-public.test.ts +288 -0
- package/tests/e2e/management.test.ts +1 -1
- package/tests/e2e/plugin-management.test.ts +1 -1
- package/vitest.config.ts +1 -0
- package/chatwise-opencli.ps1 +0 -82
- package/dist/clis/chatwise/shared.d.ts +0 -2
- package/dist/clis/chatwise/shared.js +0 -6
- package/dist/weread-private-api-regression.test.d.ts +0 -1
- package/dist/weread-search-regression.test.d.ts +0 -1
- package/dist/weread-search-regression.test.js +0 -39
- package/src/clis/chatwise/shared.ts +0 -8
- package/src/weread-search-regression.test.ts +0 -44
package/dist/serialization.js
CHANGED
|
@@ -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 {};
|
package/dist/tui.test.js
ADDED
|
@@ -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
|
|
11
|
-
| `opencli xiaohongshu
|
|
12
|
-
| `opencli xiaohongshu
|
|
13
|
-
| `opencli xiaohongshu
|
|
14
|
-
| `opencli xiaohongshu
|
|
15
|
-
| `opencli xiaohongshu
|
|
16
|
-
| `opencli xiaohongshu
|
|
17
|
-
| `opencli xiaohongshu creator-
|
|
18
|
-
| `opencli xiaohongshu creator-
|
|
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
|