@jackwener/opencli 1.3.3 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/actions/setup-chrome/action.yml +5 -4
- package/.github/pull_request_template.md +3 -1
- package/.github/workflows/build-extension.yml +7 -1
- package/.github/workflows/ci.yml +46 -6
- package/.github/workflows/docs.yml +1 -1
- package/.github/workflows/e2e-headed.yml +36 -3
- package/.github/workflows/release.yml +1 -1
- package/.github/workflows/security.yml +0 -3
- package/CHANGELOG.md +78 -0
- package/CONTRIBUTING.md +6 -3
- package/PRIVACY.md +57 -0
- package/README.md +31 -4
- package/README.zh-CN.md +31 -4
- package/SKILL.md +107 -2
- package/TESTING.md +1 -0
- package/chatwise-opencli.ps1 +82 -0
- package/dist/analysis.d.ts +38 -0
- package/dist/analysis.js +166 -0
- package/dist/browser/cdp.d.ts +0 -4
- package/dist/browser/cdp.js +53 -41
- package/dist/browser/cdp.test.d.ts +1 -0
- package/dist/browser/cdp.test.js +52 -0
- package/dist/browser/dom-snapshot.d.ts +2 -2
- package/dist/browser/dom-snapshot.js +54 -1
- package/dist/browser/dom-snapshot.test.js +36 -0
- package/dist/browser/index.d.ts +2 -2
- package/dist/browser/index.js +1 -1
- package/dist/browser/mcp.d.ts +0 -2
- package/dist/browser/mcp.js +2 -3
- package/dist/browser/page.d.ts +4 -3
- package/dist/browser/page.js +34 -37
- package/dist/browser/stealth.d.ts +0 -2
- package/dist/browser/stealth.js +24 -9
- package/dist/browser.test.js +2 -2
- package/dist/build-manifest.js +15 -9
- package/dist/build-manifest.test.js +12 -0
- package/dist/cascade.js +4 -2
- package/dist/cli-manifest.json +1325 -256
- package/dist/cli.js +57 -29
- package/dist/clis/_shared/desktop-commands.d.ts +22 -0
- package/dist/clis/_shared/desktop-commands.js +108 -0
- package/dist/clis/antigravity/serve.js +5 -2
- package/dist/clis/apple-podcasts/search.js +2 -1
- package/dist/clis/arxiv/search.js +3 -3
- package/dist/clis/bbc/news.js +0 -1
- package/dist/clis/bilibili/dynamic.test.d.ts +1 -0
- package/dist/clis/bilibili/dynamic.test.js +68 -0
- package/dist/clis/bilibili/favorite.js +4 -2
- package/dist/clis/bilibili/following.js +3 -2
- package/dist/clis/bilibili/subtitle.js +8 -7
- package/dist/clis/bilibili/utils.js +2 -2
- package/dist/clis/boss/batchgreet.js +1 -1
- package/dist/clis/boss/chatlist.js +1 -1
- package/dist/clis/boss/chatmsg.js +1 -1
- package/dist/clis/boss/detail.js +1 -1
- package/dist/clis/boss/exchange.js +1 -1
- package/dist/clis/boss/greet.js +1 -1
- package/dist/clis/boss/invite.js +1 -1
- package/dist/clis/boss/joblist.js +1 -1
- package/dist/clis/boss/mark.js +4 -3
- package/dist/clis/boss/recommend.js +1 -1
- package/dist/clis/boss/resume.js +1 -1
- package/dist/clis/boss/search.js +1 -1
- package/dist/clis/boss/send.js +5 -4
- package/dist/clis/boss/stats.js +1 -1
- package/dist/clis/chatgpt/ask.js +4 -0
- package/dist/clis/chatgpt/new.js +5 -1
- package/dist/clis/chatgpt/read.js +5 -1
- package/dist/clis/chatgpt/send.js +2 -1
- package/dist/clis/chatgpt/status.js +5 -1
- package/dist/clis/chatwise/ask.js +8 -2
- package/dist/clis/chatwise/export.js +2 -0
- package/dist/clis/chatwise/history.js +2 -0
- package/dist/clis/chatwise/model.js +8 -3
- package/dist/clis/chatwise/new.js +3 -18
- package/dist/clis/chatwise/read.js +2 -0
- package/dist/clis/chatwise/screenshot.js +3 -27
- package/dist/clis/chatwise/send.js +8 -2
- package/dist/clis/chatwise/shared.d.ts +2 -0
- package/dist/clis/chatwise/shared.js +6 -0
- package/dist/clis/chatwise/status.js +3 -22
- package/dist/clis/codex/ask.js +6 -2
- package/dist/clis/codex/dump.js +2 -25
- package/dist/clis/codex/new.js +2 -25
- package/dist/clis/codex/screenshot.js +2 -27
- package/dist/clis/codex/send.js +6 -4
- package/dist/clis/codex/status.js +2 -22
- package/dist/clis/ctrip/search.js +0 -1
- package/dist/clis/cursor/ask.js +2 -1
- package/dist/clis/cursor/composer.js +2 -1
- package/dist/clis/cursor/dump.js +2 -25
- package/dist/clis/cursor/new.js +2 -18
- package/dist/clis/cursor/read.js +2 -1
- package/dist/clis/cursor/screenshot.js +1 -30
- package/dist/clis/cursor/send.js +2 -1
- package/dist/clis/cursor/status.js +2 -21
- package/dist/clis/dictionary/examples.yaml +25 -0
- package/dist/clis/dictionary/search.yaml +27 -0
- package/dist/clis/dictionary/synonyms.yaml +25 -0
- package/dist/clis/douban/book-hot.js +1 -1
- package/dist/clis/douban/movie-hot.js +1 -1
- package/dist/clis/douban/search.js +1 -1
- package/dist/clis/douban/utils.d.ts +4 -1
- package/dist/clis/douban/utils.js +156 -1
- package/dist/clis/doubao/ask.js +1 -1
- package/dist/clis/doubao/new.js +1 -1
- package/dist/clis/doubao/read.js +1 -1
- package/dist/clis/doubao/send.js +1 -1
- package/dist/clis/doubao/status.js +1 -1
- package/dist/clis/doubao-app/ask.js +1 -1
- package/dist/clis/doubao-app/new.js +1 -1
- package/dist/clis/doubao-app/read.js +1 -1
- package/dist/clis/doubao-app/send.js +1 -1
- package/dist/clis/douyin/_shared/browser-fetch.d.ts +10 -0
- package/dist/clis/douyin/_shared/browser-fetch.js +30 -0
- package/dist/clis/douyin/_shared/browser-fetch.test.d.ts +1 -0
- package/dist/clis/douyin/_shared/browser-fetch.test.js +31 -0
- package/dist/clis/douyin/_shared/creation-id.d.ts +1 -0
- package/dist/clis/douyin/_shared/creation-id.js +5 -0
- package/dist/clis/douyin/_shared/creation-id.test.d.ts +1 -0
- package/dist/clis/douyin/_shared/creation-id.test.js +22 -0
- package/dist/clis/douyin/_shared/imagex-upload.d.ts +20 -0
- package/dist/clis/douyin/_shared/imagex-upload.js +53 -0
- package/dist/clis/douyin/_shared/imagex-upload.test.d.ts +1 -0
- package/dist/clis/douyin/_shared/imagex-upload.test.js +87 -0
- package/dist/clis/douyin/_shared/sts2.d.ts +8 -0
- package/dist/clis/douyin/_shared/sts2.js +15 -0
- package/dist/clis/douyin/_shared/text-extra.d.ts +18 -0
- package/dist/clis/douyin/_shared/text-extra.js +15 -0
- package/dist/clis/douyin/_shared/text-extra.test.d.ts +1 -0
- package/dist/clis/douyin/_shared/text-extra.test.js +37 -0
- package/dist/clis/douyin/_shared/timing.d.ts +2 -0
- package/dist/clis/douyin/_shared/timing.js +22 -0
- package/dist/clis/douyin/_shared/timing.test.d.ts +1 -0
- package/dist/clis/douyin/_shared/timing.test.js +28 -0
- package/dist/clis/douyin/_shared/tos-upload-short-read.test.d.ts +11 -0
- package/dist/clis/douyin/_shared/tos-upload-short-read.test.js +83 -0
- package/dist/clis/douyin/_shared/tos-upload.d.ts +53 -0
- package/dist/clis/douyin/_shared/tos-upload.js +295 -0
- package/dist/clis/douyin/_shared/tos-upload.test.d.ts +1 -0
- package/dist/clis/douyin/_shared/tos-upload.test.js +229 -0
- package/dist/clis/douyin/_shared/transcode.d.ts +27 -0
- package/dist/clis/douyin/_shared/transcode.js +45 -0
- package/dist/clis/douyin/_shared/transcode.test.d.ts +1 -0
- package/dist/clis/douyin/_shared/transcode.test.js +93 -0
- package/dist/clis/douyin/_shared/types.d.ts +26 -0
- package/dist/clis/douyin/_shared/types.js +1 -0
- package/dist/clis/douyin/activities.d.ts +1 -0
- package/dist/clis/douyin/activities.js +20 -0
- package/dist/clis/douyin/activities.test.d.ts +1 -0
- package/dist/clis/douyin/activities.test.js +22 -0
- package/dist/clis/douyin/collections.d.ts +1 -0
- package/dist/clis/douyin/collections.js +22 -0
- package/dist/clis/douyin/collections.test.d.ts +1 -0
- package/dist/clis/douyin/collections.test.js +23 -0
- package/dist/clis/douyin/delete.d.ts +1 -0
- package/dist/clis/douyin/delete.js +18 -0
- package/dist/clis/douyin/delete.test.d.ts +1 -0
- package/dist/clis/douyin/delete.test.js +11 -0
- package/dist/clis/douyin/draft.d.ts +14 -0
- package/dist/clis/douyin/draft.js +237 -0
- package/dist/clis/douyin/draft.test.d.ts +1 -0
- package/dist/clis/douyin/draft.test.js +11 -0
- package/dist/clis/douyin/drafts.d.ts +1 -0
- package/dist/clis/douyin/drafts.js +23 -0
- package/dist/clis/douyin/drafts.test.d.ts +1 -0
- package/dist/clis/douyin/drafts.test.js +11 -0
- package/dist/clis/douyin/hashtag.d.ts +1 -0
- package/dist/clis/douyin/hashtag.js +45 -0
- package/dist/clis/douyin/hashtag.test.d.ts +1 -0
- package/dist/clis/douyin/hashtag.test.js +25 -0
- package/dist/clis/douyin/location.d.ts +1 -0
- package/dist/clis/douyin/location.js +24 -0
- package/dist/clis/douyin/location.test.d.ts +1 -0
- package/dist/clis/douyin/location.test.js +23 -0
- package/dist/clis/douyin/profile.d.ts +1 -0
- package/dist/clis/douyin/profile.js +28 -0
- package/dist/clis/douyin/profile.test.d.ts +1 -0
- package/dist/clis/douyin/profile.test.js +11 -0
- package/dist/clis/douyin/publish.d.ts +14 -0
- package/dist/clis/douyin/publish.js +288 -0
- package/dist/clis/douyin/publish.test.d.ts +1 -0
- package/dist/clis/douyin/publish.test.js +38 -0
- package/dist/clis/douyin/stats.d.ts +1 -0
- package/dist/clis/douyin/stats.js +27 -0
- package/dist/clis/douyin/stats.test.d.ts +1 -0
- package/dist/clis/douyin/stats.test.js +22 -0
- package/dist/clis/douyin/update.d.ts +1 -0
- package/dist/clis/douyin/update.js +31 -0
- package/dist/clis/douyin/update.test.d.ts +1 -0
- package/dist/clis/douyin/update.test.js +11 -0
- package/dist/clis/douyin/videos.d.ts +1 -0
- package/dist/clis/douyin/videos.js +34 -0
- package/dist/clis/douyin/videos.test.d.ts +1 -0
- package/dist/clis/douyin/videos.test.js +11 -0
- package/dist/clis/grok/ask.d.ts +4 -0
- package/dist/clis/grok/ask.js +28 -10
- package/dist/clis/grok/ask.test.js +18 -0
- package/dist/clis/hackernews/search.yaml +1 -1
- package/dist/clis/instagram/search.yaml +2 -1
- package/dist/clis/jd/item.d.ts +1 -0
- package/dist/clis/jd/item.js +96 -0
- package/dist/clis/jd/item.test.d.ts +1 -0
- package/dist/clis/jd/item.test.js +28 -0
- package/dist/clis/jike/feed.js +1 -1
- package/dist/clis/jike/search.js +1 -1
- package/dist/clis/linkedin/search.js +5 -4
- package/dist/clis/linkedin/timeline.d.ts +21 -0
- package/dist/clis/linkedin/timeline.js +503 -0
- package/dist/clis/linkedin/timeline.test.d.ts +1 -0
- package/dist/clis/linkedin/timeline.test.js +81 -0
- package/dist/clis/linux-do/search.yaml +3 -1
- package/dist/clis/medium/feed.js +1 -1
- package/dist/clis/medium/search.js +2 -2
- package/dist/clis/medium/user.js +1 -1
- package/dist/clis/medium/{shared.js → utils.js} +2 -1
- package/dist/clis/pixiv/detail.yaml +49 -0
- package/dist/clis/pixiv/download.d.ts +7 -0
- package/dist/clis/pixiv/download.js +78 -0
- package/dist/clis/pixiv/download.test.d.ts +1 -0
- package/dist/clis/pixiv/download.test.js +87 -0
- package/dist/clis/pixiv/illusts.d.ts +8 -0
- package/dist/clis/pixiv/illusts.js +65 -0
- package/dist/clis/pixiv/illusts.test.d.ts +1 -0
- package/dist/clis/pixiv/illusts.test.js +99 -0
- package/dist/clis/pixiv/ranking.yaml +53 -0
- package/dist/clis/pixiv/search.d.ts +6 -0
- package/dist/clis/pixiv/search.js +43 -0
- package/dist/clis/pixiv/search.test.d.ts +1 -0
- package/dist/clis/pixiv/search.test.js +83 -0
- package/dist/clis/pixiv/test-utils.d.ts +12 -0
- package/dist/clis/pixiv/test-utils.js +23 -0
- package/dist/clis/pixiv/user.yaml +46 -0
- package/dist/clis/pixiv/utils.d.ts +27 -0
- package/dist/clis/pixiv/utils.js +49 -0
- package/dist/clis/reddit/comment.js +2 -1
- package/dist/clis/reddit/read.js +4 -3
- package/dist/clis/reddit/read.test.d.ts +1 -0
- package/dist/clis/reddit/read.test.js +28 -0
- package/dist/clis/reddit/save.js +2 -1
- package/dist/clis/reddit/saved.js +7 -3
- package/dist/clis/reddit/subscribe.js +2 -1
- package/dist/clis/reddit/upvote.js +2 -1
- package/dist/clis/reddit/upvoted.js +7 -3
- package/dist/clis/reuters/search.js +0 -1
- package/dist/clis/sinablog/article.js +1 -1
- package/dist/clis/sinablog/hot.js +1 -1
- package/dist/clis/sinablog/user.js +1 -1
- package/dist/clis/substack/feed.js +1 -1
- package/dist/clis/substack/publication.js +1 -1
- package/dist/clis/substack/search.js +3 -2
- package/dist/clis/substack/{shared.js → utils.js} +3 -2
- package/dist/clis/tiktok/search.yaml +2 -1
- package/dist/clis/twitter/accept.js +2 -1
- package/dist/clis/twitter/article.js +4 -1
- package/dist/clis/twitter/block.js +2 -1
- package/dist/clis/twitter/bookmark.js +2 -1
- package/dist/clis/twitter/bookmarks.js +3 -2
- package/dist/clis/twitter/delete.js +2 -1
- package/dist/clis/twitter/follow.js +2 -1
- package/dist/clis/twitter/followers.js +3 -2
- package/dist/clis/twitter/following.js +3 -2
- package/dist/clis/twitter/hide-reply.js +2 -1
- package/dist/clis/twitter/like.js +2 -1
- package/dist/clis/twitter/notifications.js +2 -1
- package/dist/clis/twitter/post.js +2 -1
- package/dist/clis/twitter/profile.js +5 -2
- package/dist/clis/twitter/reply-dm.js +2 -1
- package/dist/clis/twitter/reply.js +2 -1
- package/dist/clis/twitter/search.js +32 -13
- package/dist/clis/twitter/search.test.d.ts +1 -0
- package/dist/clis/twitter/search.test.js +156 -0
- package/dist/clis/twitter/thread.js +2 -2
- package/dist/clis/twitter/timeline.js +3 -2
- package/dist/clis/twitter/trending.js +3 -2
- package/dist/clis/twitter/unblock.js +2 -1
- package/dist/clis/twitter/unbookmark.js +2 -1
- package/dist/clis/twitter/unfollow.js +2 -1
- package/dist/clis/v2ex/daily.js +3 -2
- package/dist/clis/v2ex/me.js +3 -2
- package/dist/clis/v2ex/notifications.js +4 -4
- package/dist/clis/web/read.d.ts +16 -0
- package/dist/clis/web/read.js +202 -0
- package/dist/clis/weibo/comments.d.ts +1 -0
- package/dist/clis/weibo/comments.js +53 -0
- package/dist/clis/weibo/feed.d.ts +1 -0
- package/dist/clis/weibo/feed.js +56 -0
- package/dist/clis/weibo/hot.js +0 -1
- package/dist/clis/weibo/me.d.ts +1 -0
- package/dist/clis/weibo/me.js +76 -0
- package/dist/clis/weibo/post.d.ts +1 -0
- package/dist/clis/weibo/post.js +75 -0
- package/dist/clis/weibo/user.d.ts +1 -0
- package/dist/clis/weibo/user.js +63 -0
- package/dist/clis/weibo/utils.d.ts +6 -0
- package/dist/clis/weibo/utils.js +30 -0
- package/dist/clis/weread/search.js +3 -2
- package/dist/clis/xueqiu/danjuan-utils.d.ts +55 -0
- package/dist/clis/xueqiu/danjuan-utils.js +126 -0
- package/dist/clis/xueqiu/danjuan-utils.test.d.ts +1 -0
- package/dist/clis/xueqiu/danjuan-utils.test.js +41 -0
- package/dist/clis/xueqiu/fund-holdings.d.ts +1 -0
- package/dist/clis/xueqiu/fund-holdings.js +28 -0
- package/dist/clis/xueqiu/fund-snapshot.d.ts +1 -0
- package/dist/clis/xueqiu/fund-snapshot.js +25 -0
- package/dist/clis/xueqiu/search.yaml +2 -1
- package/dist/clis/yahoo-finance/quote.js +0 -1
- package/dist/clis/youtube/channel.d.ts +1 -0
- package/dist/clis/youtube/channel.js +150 -0
- package/dist/clis/youtube/comments.d.ts +1 -0
- package/dist/clis/youtube/comments.js +95 -0
- package/dist/clis/youtube/search.js +0 -1
- package/dist/clis/youtube/transcript.js +5 -4
- package/dist/clis/youtube/video.js +3 -2
- package/dist/clis/zhihu/search.yaml +2 -1
- package/dist/daemon.js +7 -3
- package/dist/discovery.js +11 -10
- package/dist/doctor.js +2 -1
- package/dist/download/index.d.ts +4 -12
- package/dist/download/index.js +33 -12
- package/dist/download/index.test.js +79 -2
- package/dist/download/media-download.js +4 -2
- package/dist/engine.test.js +76 -4
- package/dist/execution.d.ts +1 -9
- package/dist/execution.js +56 -46
- package/dist/explore.js +12 -111
- package/dist/external-clis.yaml +0 -25
- package/dist/external.js +7 -5
- package/dist/external.test.js +4 -0
- package/dist/generate.d.ts +0 -9
- package/dist/generate.js +4 -20
- package/dist/hooks.d.ts +46 -0
- package/dist/hooks.js +56 -0
- package/dist/hooks.test.d.ts +4 -0
- package/dist/hooks.test.js +92 -0
- package/dist/interceptor.js +70 -23
- package/dist/main.js +2 -0
- package/dist/output.js +12 -6
- package/dist/pipeline/executor.js +1 -1
- package/dist/pipeline/steps/browser.js +1 -3
- package/dist/pipeline/steps/download.js +42 -26
- package/dist/pipeline/steps/download.test.d.ts +1 -0
- package/dist/pipeline/steps/download.test.js +101 -0
- package/dist/pipeline/steps/fetch.js +40 -22
- package/dist/pipeline/steps/fetch.test.d.ts +1 -0
- package/dist/pipeline/steps/fetch.test.js +123 -0
- package/dist/pipeline/steps/transform.js +2 -6
- package/dist/pipeline/template.js +66 -52
- package/dist/pipeline/template.test.js +28 -0
- package/dist/pipeline/transform.test.js +18 -0
- package/dist/plugin.d.ts +40 -1
- package/dist/plugin.js +214 -17
- package/dist/plugin.test.d.ts +1 -1
- package/dist/plugin.test.js +219 -3
- package/dist/record.js +6 -98
- package/dist/registry-api.d.ts +2 -0
- package/dist/registry-api.js +1 -0
- package/dist/registry.d.ts +5 -2
- package/dist/registry.js +1 -2
- package/dist/runtime.d.ts +0 -1
- package/dist/runtime.js +14 -4
- package/dist/snapshotFormatter.d.ts +7 -14
- package/dist/snapshotFormatter.js +38 -78
- package/dist/utils.d.ts +9 -0
- package/dist/utils.js +29 -0
- package/dist/validate.js +3 -5
- package/dist/weread-search-regression.test.d.ts +1 -0
- package/dist/weread-search-regression.test.js +39 -0
- package/dist/yaml-schema.d.ts +26 -0
- package/dist/yaml-schema.js +5 -0
- package/docs/.vitepress/config.mts +16 -0
- package/docs/adapters/browser/dictionary.md +27 -0
- package/docs/adapters/browser/douyin.md +75 -0
- package/docs/adapters/browser/jd.md +27 -0
- package/docs/adapters/browser/linkedin.md +6 -0
- package/docs/adapters/browser/pixiv.md +92 -0
- package/docs/adapters/browser/twitter.md +6 -0
- package/docs/adapters/browser/web.md +30 -0
- package/docs/adapters/browser/xueqiu.md +27 -9
- package/docs/adapters/index.md +9 -2
- package/docs/comparison.md +125 -0
- package/docs/developer/contributing.md +21 -2
- package/docs/developer/testing.md +14 -8
- package/docs/developer/ts-adapter.md +18 -0
- package/docs/developer/yaml-adapter.md +16 -0
- package/docs/guide/plugins.md +10 -0
- package/docs/zh/guide/plugins.md +10 -0
- package/extension/dist/background.js +100 -35
- package/extension/manifest.json +6 -2
- package/extension/package.json +1 -1
- package/extension/popup.html +84 -0
- package/extension/popup.js +25 -0
- package/extension/src/background.test.ts +46 -1
- package/extension/src/background.ts +128 -34
- package/extension/src/cdp.ts +9 -9
- package/package.json +3 -2
- package/scripts/check-doc-coverage.sh +2 -0
- package/src/analysis.ts +170 -0
- package/src/browser/cdp.test.ts +66 -0
- package/src/browser/cdp.ts +59 -44
- package/src/browser/dom-snapshot.test.ts +42 -0
- package/src/browser/dom-snapshot.ts +56 -3
- package/src/browser/index.ts +2 -2
- package/src/browser/mcp.ts +2 -4
- package/src/browser/page.ts +34 -37
- package/src/browser/stealth.ts +24 -10
- package/src/browser.test.ts +2 -2
- package/src/build-manifest.test.ts +14 -0
- package/src/build-manifest.ts +13 -31
- package/src/cascade.ts +5 -3
- package/src/cli.ts +66 -34
- package/src/clis/_shared/desktop-commands.ts +121 -0
- package/src/clis/antigravity/serve.ts +6 -3
- package/src/clis/apple-podcasts/search.ts +2 -1
- package/src/clis/arxiv/search.ts +3 -3
- package/src/clis/bbc/news.ts +0 -1
- package/src/clis/bilibili/dynamic.test.ts +79 -0
- package/src/clis/bilibili/favorite.ts +5 -2
- package/src/clis/bilibili/following.ts +3 -2
- package/src/clis/bilibili/subtitle.ts +8 -7
- package/src/clis/bilibili/utils.ts +2 -2
- package/src/clis/boss/batchgreet.ts +1 -1
- package/src/clis/boss/chatlist.ts +1 -1
- package/src/clis/boss/chatmsg.ts +1 -1
- package/src/clis/boss/detail.ts +1 -1
- package/src/clis/boss/exchange.ts +1 -1
- package/src/clis/boss/greet.ts +1 -1
- package/src/clis/boss/invite.ts +1 -1
- package/src/clis/boss/joblist.ts +1 -1
- package/src/clis/boss/mark.ts +4 -3
- package/src/clis/boss/recommend.ts +1 -1
- package/src/clis/boss/resume.ts +1 -1
- package/src/clis/boss/search.ts +1 -1
- package/src/clis/boss/send.ts +5 -4
- package/src/clis/boss/stats.ts +1 -1
- package/src/clis/chatgpt/ask.ts +5 -0
- package/src/clis/chatgpt/new.ts +7 -2
- package/src/clis/chatgpt/read.ts +7 -2
- package/src/clis/chatgpt/send.ts +3 -2
- package/src/clis/chatgpt/status.ts +6 -1
- package/src/clis/chatwise/ask.ts +7 -2
- package/src/clis/chatwise/export.ts +2 -0
- package/src/clis/chatwise/history.ts +2 -0
- package/src/clis/chatwise/model.ts +7 -3
- package/src/clis/chatwise/new.ts +3 -20
- package/src/clis/chatwise/read.ts +2 -0
- package/src/clis/chatwise/screenshot.ts +3 -32
- package/src/clis/chatwise/send.ts +7 -2
- package/src/clis/chatwise/shared.ts +8 -0
- package/src/clis/chatwise/status.ts +3 -24
- package/src/clis/codex/ask.ts +5 -2
- package/src/clis/codex/dump.ts +2 -27
- package/src/clis/codex/new.ts +2 -28
- package/src/clis/codex/screenshot.ts +2 -32
- package/src/clis/codex/send.ts +5 -4
- package/src/clis/codex/status.ts +2 -24
- package/src/clis/ctrip/search.ts +0 -1
- package/src/clis/cursor/ask.ts +2 -1
- package/src/clis/cursor/composer.ts +2 -1
- package/src/clis/cursor/dump.ts +2 -27
- package/src/clis/cursor/new.ts +2 -20
- package/src/clis/cursor/read.ts +2 -1
- package/src/clis/cursor/screenshot.ts +1 -36
- package/src/clis/cursor/send.ts +2 -1
- package/src/clis/cursor/status.ts +2 -22
- package/src/clis/dictionary/examples.yaml +25 -0
- package/src/clis/dictionary/search.yaml +27 -0
- package/src/clis/dictionary/synonyms.yaml +25 -0
- package/src/clis/douban/book-hot.ts +1 -1
- package/src/clis/douban/movie-hot.ts +1 -1
- package/src/clis/douban/search.ts +1 -1
- package/src/clis/douban/utils.ts +165 -1
- package/src/clis/doubao/ask.ts +1 -1
- package/src/clis/doubao/new.ts +1 -1
- package/src/clis/doubao/read.ts +1 -1
- package/src/clis/doubao/send.ts +1 -1
- package/src/clis/doubao/status.ts +1 -1
- package/src/clis/doubao-app/ask.ts +1 -1
- package/src/clis/doubao-app/new.ts +1 -1
- package/src/clis/doubao-app/read.ts +1 -1
- package/src/clis/doubao-app/send.ts +1 -1
- package/src/clis/douyin/_shared/browser-fetch.test.ts +38 -0
- package/src/clis/douyin/_shared/browser-fetch.ts +45 -0
- package/src/clis/douyin/_shared/creation-id.test.ts +26 -0
- package/src/clis/douyin/_shared/creation-id.ts +8 -0
- package/src/clis/douyin/_shared/imagex-upload.test.ts +113 -0
- package/src/clis/douyin/_shared/imagex-upload.ts +76 -0
- package/src/clis/douyin/_shared/sts2.ts +20 -0
- package/src/clis/douyin/_shared/text-extra.test.ts +42 -0
- package/src/clis/douyin/_shared/text-extra.ts +33 -0
- package/src/clis/douyin/_shared/timing.test.ts +38 -0
- package/src/clis/douyin/_shared/timing.ts +22 -0
- package/src/clis/douyin/_shared/tos-upload-short-read.test.ts +102 -0
- package/src/clis/douyin/_shared/tos-upload.test.ts +281 -0
- package/src/clis/douyin/_shared/tos-upload.ts +444 -0
- package/src/clis/douyin/_shared/transcode.test.ts +117 -0
- package/src/clis/douyin/_shared/transcode.ts +78 -0
- package/src/clis/douyin/_shared/types.ts +29 -0
- package/src/clis/douyin/activities.test.ts +25 -0
- package/src/clis/douyin/activities.ts +23 -0
- package/src/clis/douyin/collections.test.ts +26 -0
- package/src/clis/douyin/collections.ts +25 -0
- package/src/clis/douyin/delete.test.ts +12 -0
- package/src/clis/douyin/delete.ts +20 -0
- package/src/clis/douyin/draft.test.ts +12 -0
- package/src/clis/douyin/draft.ts +282 -0
- package/src/clis/douyin/drafts.test.ts +12 -0
- package/src/clis/douyin/drafts.ts +27 -0
- package/src/clis/douyin/hashtag.test.ts +28 -0
- package/src/clis/douyin/hashtag.ts +56 -0
- package/src/clis/douyin/location.test.ts +26 -0
- package/src/clis/douyin/location.ts +27 -0
- package/src/clis/douyin/profile.test.ts +12 -0
- package/src/clis/douyin/profile.ts +37 -0
- package/src/clis/douyin/publish.test.ts +45 -0
- package/src/clis/douyin/publish.ts +340 -0
- package/src/clis/douyin/stats.test.ts +25 -0
- package/src/clis/douyin/stats.ts +30 -0
- package/src/clis/douyin/update.test.ts +12 -0
- package/src/clis/douyin/update.ts +43 -0
- package/src/clis/douyin/videos.test.ts +12 -0
- package/src/clis/douyin/videos.ts +49 -0
- package/src/clis/grok/ask.test.ts +25 -0
- package/src/clis/grok/ask.ts +25 -12
- package/src/clis/hackernews/search.yaml +1 -1
- package/src/clis/instagram/search.yaml +2 -1
- package/src/clis/jd/item.test.ts +35 -0
- package/src/clis/jd/item.ts +101 -0
- package/src/clis/jike/feed.ts +1 -1
- package/src/clis/jike/search.ts +1 -1
- package/src/clis/linkedin/search.ts +5 -4
- package/src/clis/linkedin/timeline.test.ts +99 -0
- package/src/clis/linkedin/timeline.ts +532 -0
- package/src/clis/linux-do/search.yaml +3 -1
- package/src/clis/medium/feed.ts +1 -1
- package/src/clis/medium/search.ts +2 -2
- package/src/clis/medium/user.ts +1 -1
- package/src/clis/medium/{shared.ts → utils.ts} +2 -1
- package/src/clis/pixiv/detail.yaml +49 -0
- package/src/clis/pixiv/download.test.ts +114 -0
- package/src/clis/pixiv/download.ts +91 -0
- package/src/clis/pixiv/illusts.test.ts +115 -0
- package/src/clis/pixiv/illusts.ts +78 -0
- package/src/clis/pixiv/ranking.yaml +53 -0
- package/src/clis/pixiv/search.test.ts +97 -0
- package/src/clis/pixiv/search.ts +53 -0
- package/src/clis/pixiv/test-utils.ts +29 -0
- package/src/clis/pixiv/user.yaml +46 -0
- package/src/clis/pixiv/utils.ts +62 -0
- package/src/clis/reddit/comment.ts +2 -1
- package/src/clis/reddit/read.test.ts +34 -0
- package/src/clis/reddit/read.ts +4 -3
- package/src/clis/reddit/save.ts +2 -1
- package/src/clis/reddit/saved.ts +6 -2
- package/src/clis/reddit/subscribe.ts +2 -1
- package/src/clis/reddit/upvote.ts +2 -1
- package/src/clis/reddit/upvoted.ts +6 -2
- package/src/clis/reuters/search.ts +0 -1
- package/src/clis/sinablog/article.ts +1 -1
- package/src/clis/sinablog/hot.ts +1 -1
- package/src/clis/sinablog/user.ts +1 -1
- package/src/clis/substack/feed.ts +1 -1
- package/src/clis/substack/publication.ts +1 -1
- package/src/clis/substack/search.ts +3 -2
- package/src/clis/substack/{shared.ts → utils.ts} +3 -2
- package/src/clis/tiktok/search.yaml +2 -1
- package/src/clis/twitter/accept.ts +2 -1
- package/src/clis/twitter/article.ts +3 -1
- package/src/clis/twitter/block.ts +2 -1
- package/src/clis/twitter/bookmark.ts +2 -1
- package/src/clis/twitter/bookmarks.ts +3 -2
- package/src/clis/twitter/delete.ts +2 -1
- package/src/clis/twitter/follow.ts +2 -1
- package/src/clis/twitter/followers.ts +3 -2
- package/src/clis/twitter/following.ts +3 -2
- package/src/clis/twitter/hide-reply.ts +2 -1
- package/src/clis/twitter/like.ts +2 -1
- package/src/clis/twitter/notifications.ts +2 -1
- package/src/clis/twitter/post.ts +2 -1
- package/src/clis/twitter/profile.ts +4 -2
- package/src/clis/twitter/reply-dm.ts +2 -1
- package/src/clis/twitter/reply.ts +2 -1
- package/src/clis/twitter/search.test.ts +180 -0
- package/src/clis/twitter/search.ts +40 -14
- package/src/clis/twitter/thread.ts +2 -2
- package/src/clis/twitter/timeline.ts +3 -2
- package/src/clis/twitter/trending.ts +3 -2
- package/src/clis/twitter/unblock.ts +2 -1
- package/src/clis/twitter/unbookmark.ts +2 -1
- package/src/clis/twitter/unfollow.ts +2 -1
- package/src/clis/v2ex/daily.ts +3 -2
- package/src/clis/v2ex/me.ts +3 -2
- package/src/clis/v2ex/notifications.ts +3 -4
- package/src/clis/web/read.ts +210 -0
- package/src/clis/weibo/comments.ts +54 -0
- package/src/clis/weibo/feed.ts +57 -0
- package/src/clis/weibo/hot.ts +0 -1
- package/src/clis/weibo/me.ts +77 -0
- package/src/clis/weibo/post.ts +77 -0
- package/src/clis/weibo/user.ts +64 -0
- package/src/clis/weibo/utils.ts +32 -0
- package/src/clis/weread/search.ts +3 -2
- package/src/clis/xueqiu/danjuan-utils.test.ts +49 -0
- package/src/clis/xueqiu/danjuan-utils.ts +176 -0
- package/src/clis/xueqiu/fund-holdings.ts +32 -0
- package/src/clis/xueqiu/fund-snapshot.ts +27 -0
- package/src/clis/xueqiu/search.yaml +2 -1
- package/src/clis/yahoo-finance/quote.ts +0 -1
- package/src/clis/youtube/channel.ts +155 -0
- package/src/clis/youtube/comments.ts +97 -0
- package/src/clis/youtube/search.ts +0 -1
- package/src/clis/youtube/transcript.ts +5 -4
- package/src/clis/youtube/video.ts +3 -2
- package/src/clis/zhihu/search.yaml +2 -1
- package/src/daemon.ts +5 -4
- package/src/discovery.ts +12 -34
- package/src/doctor.ts +3 -2
- package/src/download/index.test.ts +93 -2
- package/src/download/index.ts +44 -23
- package/src/download/media-download.ts +5 -3
- package/src/engine.test.ts +84 -3
- package/src/execution.ts +62 -46
- package/src/explore.ts +21 -90
- package/src/external-clis.yaml +0 -25
- package/src/external.test.ts +9 -0
- package/src/external.ts +12 -10
- package/src/generate.ts +4 -41
- package/src/hooks.test.ts +126 -0
- package/src/hooks.ts +90 -0
- package/src/interceptor.ts +73 -23
- package/src/main.ts +2 -0
- package/src/output.ts +14 -6
- package/src/pipeline/executor.ts +1 -1
- package/src/pipeline/steps/browser.ts +1 -3
- package/src/pipeline/steps/download.test.ts +136 -0
- package/src/pipeline/steps/download.ts +47 -34
- package/src/pipeline/steps/fetch.test.ts +179 -0
- package/src/pipeline/steps/fetch.ts +39 -23
- package/src/pipeline/steps/transform.ts +2 -6
- package/src/pipeline/template.test.ts +28 -0
- package/src/pipeline/template.ts +67 -79
- package/src/pipeline/transform.test.ts +20 -0
- package/src/plugin.test.ts +251 -3
- package/src/plugin.ts +265 -21
- package/src/record.ts +12 -84
- package/src/registry-api.ts +2 -0
- package/src/registry.ts +7 -4
- package/src/runtime.ts +14 -4
- package/src/snapshotFormatter.ts +43 -121
- package/src/utils.ts +39 -0
- package/src/validate.ts +3 -5
- package/src/weread-search-regression.test.ts +44 -0
- package/src/yaml-schema.ts +28 -0
- package/tests/e2e/browser-auth.test.ts +25 -0
- package/tests/e2e/browser-public-extended.test.ts +162 -0
- package/tests/e2e/browser-public.test.ts +7 -146
- package/tests/e2e/plugin-management.test.ts +137 -0
- package/tests/e2e/public-commands.test.ts +34 -1
- package/vitest.config.ts +33 -8
- package/.github/workflows/pkg-pr-new.yml +0 -30
- package/dist/clis/douban/shared.d.ts +0 -4
- package/dist/clis/douban/shared.js +0 -155
- package/src/clis/douban/shared.ts +0 -165
- /package/dist/clis/boss/{common.d.ts → utils.d.ts} +0 -0
- /package/dist/clis/boss/{common.js → utils.js} +0 -0
- /package/dist/clis/doubao/{common.d.ts → utils.d.ts} +0 -0
- /package/dist/clis/doubao/{common.js → utils.js} +0 -0
- /package/dist/clis/doubao-app/{common.d.ts → utils.d.ts} +0 -0
- /package/dist/clis/doubao-app/{common.js → utils.js} +0 -0
- /package/dist/clis/jike/{shared.d.ts → utils.d.ts} +0 -0
- /package/dist/clis/jike/{shared.js → utils.js} +0 -0
- /package/dist/clis/medium/{shared.d.ts → utils.d.ts} +0 -0
- /package/dist/clis/sinablog/{shared.d.ts → utils.d.ts} +0 -0
- /package/dist/clis/sinablog/{shared.js → utils.js} +0 -0
- /package/dist/clis/substack/{shared.d.ts → utils.d.ts} +0 -0
- /package/src/clis/boss/{common.ts → utils.ts} +0 -0
- /package/src/clis/doubao/{common.ts → utils.ts} +0 -0
- /package/src/clis/doubao-app/{common.ts → utils.ts} +0 -0
- /package/src/clis/jike/{shared.ts → utils.ts} +0 -0
- /package/src/clis/sinablog/{shared.ts → utils.ts} +0 -0
package/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: opencli
|
|
3
3
|
description: "OpenCLI — Make any website or Electron App your CLI. Zero risk, AI-powered, reuse Chrome login."
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.4.1
|
|
5
5
|
author: jackwener
|
|
6
6
|
tags: [cli, browser, web, chrome-extension, cdp, bilibili, zhihu, twitter, github, v2ex, hackernews, reddit, xiaohongshu, xueqiu, youtube, boss, coupang, yollomi, AI, agent]
|
|
7
7
|
---
|
|
@@ -15,6 +15,12 @@ tags: [cli, browser, web, chrome-extension, cdp, bilibili, zhihu, twitter, githu
|
|
|
15
15
|
> 该文档包含完整的 API 发现工作流(必须使用浏览器探索)、5 级认证策略决策树、平台 SDK 速查表、`tap` 步骤调试流程、分页 API 模板、级联请求模式、以及常见陷阱。
|
|
16
16
|
> **本文件(SKILL.md)仅提供命令参考和简化模板,不足以正确开发适配器。**
|
|
17
17
|
|
|
18
|
+
> [!IMPORTANT]
|
|
19
|
+
> 创建或修改 adapter 时,再额外遵守 3 条收口规则:
|
|
20
|
+
> 1. 主参数优先用 positional arg,不要把 `query` / `id` / `url` 默认做成 `--query` / `--id` / `--url`
|
|
21
|
+
> 2. 预期中的 adapter 失败优先抛 `CliError` 子类,不要直接 throw 原始 `Error`
|
|
22
|
+
> 3. 新增 adapter 或新增用户可发现命令时,同步更新 adapter docs、`docs/adapters/index.md`、sidebar,以及 README/README.zh-CN 中受影响的入口
|
|
23
|
+
|
|
18
24
|
## Install & Run
|
|
19
25
|
|
|
20
26
|
```bash
|
|
@@ -82,6 +88,9 @@ opencli xueqiu watchlist # 获取自选股/持仓列表
|
|
|
82
88
|
opencli xueqiu feed # 我的关注 timeline
|
|
83
89
|
opencli xueqiu hot --limit 10 # 雪球热榜
|
|
84
90
|
opencli xueqiu search "特斯拉" # 搜索 (query positional)
|
|
91
|
+
opencli xueqiu earnings-date SH600519 # 股票财报发布日期 (symbol positional)
|
|
92
|
+
opencli xueqiu fund-holdings # 蛋卷基金持仓明细 (支持 --account 过滤)
|
|
93
|
+
opencli xueqiu fund-snapshot # 蛋卷基金快照(总资产、子账户、持仓)
|
|
85
94
|
|
|
86
95
|
# GitHub (via gh External CLI)
|
|
87
96
|
opencli gh repo list # 列出仓库 (passthrough to gh)
|
|
@@ -100,6 +109,19 @@ opencli twitter follow elonmusk # 关注用户
|
|
|
100
109
|
opencli twitter unfollow elonmusk # 取消关注
|
|
101
110
|
opencli twitter bookmark https://x.com/... # 收藏推文
|
|
102
111
|
opencli twitter unbookmark https://x.com/... # 取消收藏
|
|
112
|
+
opencli twitter post "Hello world" # 发布推文 (text positional)
|
|
113
|
+
opencli twitter like https://x.com/... # 点赞推文 (url positional)
|
|
114
|
+
opencli twitter reply https://x.com/... "Nice!" # 回复推文 (url + text positional)
|
|
115
|
+
opencli twitter delete https://x.com/... # 删除推文 (url positional)
|
|
116
|
+
opencli twitter block elonmusk # 屏蔽用户 (username positional)
|
|
117
|
+
opencli twitter unblock elonmusk # 取消屏蔽 (username positional)
|
|
118
|
+
opencli twitter followers elonmusk # 用户的粉丝列表 (user positional)
|
|
119
|
+
opencli twitter following elonmusk # 用户的关注列表 (user positional)
|
|
120
|
+
opencli twitter notifications --limit 20 # 通知列表
|
|
121
|
+
opencli twitter hide-reply https://x.com/... # 隐藏回复 (url positional)
|
|
122
|
+
opencli twitter download elonmusk # 下载用户媒体 (username positional, 支持 --tweet-url)
|
|
123
|
+
opencli twitter accept "群,微信" # 自动接受含关键词的 DM 请求 (query positional)
|
|
124
|
+
opencli twitter reply-dm "消息内容" # 批量回复 DM (text positional)
|
|
103
125
|
|
|
104
126
|
# Reddit (browser)
|
|
105
127
|
opencli reddit hot --limit 10 # 热门帖子
|
|
@@ -126,9 +148,21 @@ opencli v2ex topic 1024 # 主题详情 (id positional)
|
|
|
126
148
|
opencli v2ex daily # 每日签到 (browser)
|
|
127
149
|
opencli v2ex me # 我的信息 (browser)
|
|
128
150
|
opencli v2ex notifications --limit 10 # 通知 (browser)
|
|
151
|
+
opencli v2ex node python # 节点话题列表 (name positional)
|
|
152
|
+
opencli v2ex nodes --limit 30 # 所有节点列表
|
|
153
|
+
opencli v2ex member username # 用户资料 (username positional)
|
|
154
|
+
opencli v2ex user username # 用户发帖列表 (username positional)
|
|
155
|
+
opencli v2ex replies 1024 # 主题回复列表 (id positional)
|
|
129
156
|
|
|
130
157
|
# Hacker News (public)
|
|
131
158
|
opencli hackernews top --limit 10 # Top stories
|
|
159
|
+
opencli hackernews new --limit 10 # Newest stories
|
|
160
|
+
opencli hackernews best --limit 10 # Best stories
|
|
161
|
+
opencli hackernews ask --limit 10 # Ask HN posts
|
|
162
|
+
opencli hackernews show --limit 10 # Show HN posts
|
|
163
|
+
opencli hackernews jobs --limit 10 # Job postings
|
|
164
|
+
opencli hackernews search "rust" # 搜索 (query positional)
|
|
165
|
+
opencli hackernews user dang # 用户资料 (username positional)
|
|
132
166
|
|
|
133
167
|
# BBC (public)
|
|
134
168
|
opencli bbc news --limit 10 # BBC News RSS headlines
|
|
@@ -198,11 +232,13 @@ opencli jike comment xxx "评论" # 评论 (id + text positional)
|
|
|
198
232
|
opencli jike repost xxx # 转发 (id positional)
|
|
199
233
|
opencli jike notifications # 通知
|
|
200
234
|
|
|
201
|
-
# Linux.do (public)
|
|
235
|
+
# Linux.do (public + browser)
|
|
202
236
|
opencli linux-do hot --limit 10 # 热门话题
|
|
203
237
|
opencli linux-do latest --limit 10 # 最新话题
|
|
204
238
|
opencli linux-do search "rust" # 搜索 (query positional)
|
|
205
239
|
opencli linux-do topic 1024 # 主题详情 (id positional)
|
|
240
|
+
opencli linux-do categories --limit 20 # 分类列表 (browser)
|
|
241
|
+
opencli linux-do category dev 7 # 分类内话题 (slug + id positional, browser)
|
|
206
242
|
|
|
207
243
|
# StackOverflow (public)
|
|
208
244
|
opencli stackoverflow hot --limit 10 # 热门问题
|
|
@@ -228,6 +264,12 @@ opencli yollomi video "提示词" --model kling-2-1 # 视频
|
|
|
228
264
|
opencli yollomi upload ./photo.jpg # 上传得 URL,供 img2img / 工具链使用
|
|
229
265
|
opencli yollomi remove-bg <image-url> # 去背景(免费)
|
|
230
266
|
opencli yollomi edit <image-url> "改成油画风格" # Qwen 图像编辑
|
|
267
|
+
opencli yollomi background <image-url> # AI 背景生成 (5 credits)
|
|
268
|
+
opencli yollomi face-swap --source <url> --target <url> # 换脸 (3 credits)
|
|
269
|
+
opencli yollomi object-remover <image-url> <mask-url> # AI 去除物体 (3 credits)
|
|
270
|
+
opencli yollomi restore <image-url> # AI 修复老照片 (4 credits)
|
|
271
|
+
opencli yollomi try-on --person <url> --cloth <url> # 虚拟试衣 (3 credits)
|
|
272
|
+
opencli yollomi upscale <image-url> # AI 超分辨率 (1 credit, 支持 --scale 2/4)
|
|
231
273
|
|
|
232
274
|
# Grok (default + explicit web)
|
|
233
275
|
opencli grok ask --prompt "问题" # 提问 Grok(兼容默认路径)
|
|
@@ -328,6 +370,69 @@ opencli devto user username # 用户文章 (username positional)
|
|
|
328
370
|
# Steam (public)
|
|
329
371
|
opencli steam top-sellers --limit 10 # 热销游戏
|
|
330
372
|
|
|
373
|
+
# Apple Podcasts (public)
|
|
374
|
+
opencli apple-podcasts top --limit 10 # 热门播客排行榜 (支持 --country us/cn/gb/jp)
|
|
375
|
+
opencli apple-podcasts search "科技" # 搜索播客 (query positional)
|
|
376
|
+
opencli apple-podcasts episodes 12345 # 播客剧集列表 (id positional, 用 search 获取 ID)
|
|
377
|
+
|
|
378
|
+
# arXiv (public)
|
|
379
|
+
opencli arxiv search "attention" # 搜索论文 (query positional)
|
|
380
|
+
opencli arxiv paper 1706.03762 # 论文详情 (id positional)
|
|
381
|
+
|
|
382
|
+
# Bloomberg (public RSS + browser)
|
|
383
|
+
opencli bloomberg main --limit 10 # Bloomberg 首页头条 (RSS)
|
|
384
|
+
opencli bloomberg markets --limit 10 # 市场新闻 (RSS)
|
|
385
|
+
opencli bloomberg tech --limit 10 # 科技新闻 (RSS)
|
|
386
|
+
opencli bloomberg politics --limit 10 # 政治新闻 (RSS)
|
|
387
|
+
opencli bloomberg economics --limit 10 # 经济新闻 (RSS)
|
|
388
|
+
opencli bloomberg opinions --limit 10 # 观点 (RSS)
|
|
389
|
+
opencli bloomberg industries --limit 10 # 行业新闻 (RSS)
|
|
390
|
+
opencli bloomberg businessweek --limit 10 # Businessweek (RSS)
|
|
391
|
+
opencli bloomberg feeds # 列出所有 RSS feed 别名
|
|
392
|
+
opencli bloomberg news "https://..." # 阅读 Bloomberg 文章全文 (link positional, browser)
|
|
393
|
+
|
|
394
|
+
# Coupang 쿠팡 (browser)
|
|
395
|
+
opencli coupang search "耳机" # 搜索商品 (query positional, 支持 --filter rocket)
|
|
396
|
+
opencli coupang add-to-cart 12345 # 加入购物车 (product-id positional, 或 --url)
|
|
397
|
+
|
|
398
|
+
# Dictionary (public)
|
|
399
|
+
opencli dictionary search "serendipity" # 单词释义 (word positional)
|
|
400
|
+
opencli dictionary synonyms "happy" # 近义词 (word positional)
|
|
401
|
+
opencli dictionary examples "ubiquitous" # 例句 (word positional)
|
|
402
|
+
|
|
403
|
+
# 豆包 Doubao Web (browser)
|
|
404
|
+
opencli doubao status # 检查豆包页面状态
|
|
405
|
+
opencli doubao new # 新建对话
|
|
406
|
+
opencli doubao send "你好" # 发送消息 (text positional)
|
|
407
|
+
opencli doubao read # 读取对话记录
|
|
408
|
+
opencli doubao ask "问题" # 一键提问并等回复 (text positional)
|
|
409
|
+
|
|
410
|
+
# 京东 JD (browser)
|
|
411
|
+
opencli jd item 100291143898 # 商品详情 (sku positional, 含价格/主图/规格)
|
|
412
|
+
|
|
413
|
+
# LinkedIn (browser)
|
|
414
|
+
opencli linkedin search "AI engineer" # 搜索职位 (query positional, 支持 --location/--company/--remote)
|
|
415
|
+
opencli linkedin timeline --limit 20 # 首页动态流
|
|
416
|
+
|
|
417
|
+
# Pixiv (browser)
|
|
418
|
+
opencli pixiv ranking --limit 20 # 插画排行榜 (支持 --mode daily/weekly/monthly)
|
|
419
|
+
opencli pixiv search "風景" # 搜索插画 (query positional)
|
|
420
|
+
opencli pixiv user 12345 # 画师资料 (uid positional)
|
|
421
|
+
opencli pixiv illusts 12345 # 画师作品列表 (user-id positional)
|
|
422
|
+
opencli pixiv detail 12345 # 插画详情 (id positional)
|
|
423
|
+
opencli pixiv download 12345 # 下载插画 (illust-id positional)
|
|
424
|
+
|
|
425
|
+
# Web (browser)
|
|
426
|
+
opencli web read --url "https://..." # 抓取任意网页并导出为 Markdown
|
|
427
|
+
|
|
428
|
+
# 微信公众号 Weixin (browser)
|
|
429
|
+
opencli weixin download --url "https://mp.weixin.qq.com/s/xxx" # 下载公众号文章为 Markdown
|
|
430
|
+
|
|
431
|
+
# 小宇宙 Xiaoyuzhou (public)
|
|
432
|
+
opencli xiaoyuzhou podcast 12345 # 播客资料 (id positional)
|
|
433
|
+
opencli xiaoyuzhou podcast-episodes 12345 # 播客剧集列表 (id positional)
|
|
434
|
+
opencli xiaoyuzhou episode 12345 # 单集详情 (id positional)
|
|
435
|
+
|
|
331
436
|
# Wikipedia (public)
|
|
332
437
|
opencli wikipedia search "AI" # 搜索 (query positional)
|
|
333
438
|
opencli wikipedia summary "Python" # 摘要 (title positional)
|
package/TESTING.md
CHANGED
|
@@ -68,6 +68,7 @@ src/
|
|
|
68
68
|
| `tests/e2e/browser-auth.test.ts` | `bilibili`、`twitter`、`v2ex`、`xueqiu`、`linux-do`、`xiaohongshu` 的需登录命令 graceful failure |
|
|
69
69
|
| `tests/e2e/management.test.ts` | `list`、`validate`、`verify`、`--version`、`--help`、unknown command |
|
|
70
70
|
| `tests/e2e/output-formats.test.ts` | `json` / `yaml` / `csv` / `md` 输出格式校验 |
|
|
71
|
+
| `tests/e2e/plugin-management.test.ts` | `plugin install` / `list` / `update` / `uninstall` 全生命周期 |
|
|
71
72
|
|
|
72
73
|
### 烟雾测试(1 个文件)
|
|
73
74
|
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
[CmdletBinding()]
|
|
2
|
+
param(
|
|
3
|
+
[Parameter(ValueFromRemainingArguments = $true)]
|
|
4
|
+
[string[]]$OpenCliArgs
|
|
5
|
+
)
|
|
6
|
+
|
|
7
|
+
$ErrorActionPreference = 'Stop'
|
|
8
|
+
|
|
9
|
+
$chatwiseExe = 'C:\Program Files\ChatWise\ChatWise.exe'
|
|
10
|
+
if (-not (Test-Path $chatwiseExe)) {
|
|
11
|
+
throw "ChatWise executable not found at $chatwiseExe"
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
$opencli = Get-Command opencli -ErrorAction SilentlyContinue
|
|
15
|
+
if (-not $opencli) {
|
|
16
|
+
throw 'opencli was not found in PATH'
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function Clear-LocalProxyEnv {
|
|
20
|
+
$vars = 'http_proxy','https_proxy','HTTP_PROXY','HTTPS_PROXY'
|
|
21
|
+
foreach ($name in $vars) {
|
|
22
|
+
Set-Item -Path "Env:$name" -Value ''
|
|
23
|
+
}
|
|
24
|
+
$noProxy = '127.0.0.1,localhost'
|
|
25
|
+
Set-Item -Path 'Env:NO_PROXY' -Value $noProxy
|
|
26
|
+
Set-Item -Path 'Env:no_proxy' -Value $noProxy
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function Stop-ChatWiseTree {
|
|
30
|
+
$candidates = Get-CimInstance Win32_Process |
|
|
31
|
+
Where-Object { $_.Name -match '^ChatWise\.exe$|^chatwise\.exe$' }
|
|
32
|
+
|
|
33
|
+
foreach ($proc in $candidates) {
|
|
34
|
+
try {
|
|
35
|
+
Stop-Process -Id $proc.ProcessId -Force -ErrorAction Stop
|
|
36
|
+
} catch {}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
Start-Sleep -Seconds 2
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function Wait-ChatWiseDebugPort {
|
|
43
|
+
param(
|
|
44
|
+
[int]$Port = 9228,
|
|
45
|
+
[int]$TimeoutSeconds = 20
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
$deadline = (Get-Date).AddSeconds($TimeoutSeconds)
|
|
49
|
+
while ((Get-Date) -lt $deadline) {
|
|
50
|
+
try {
|
|
51
|
+
$resp = Invoke-WebRequest -UseBasicParsing -TimeoutSec 2 -Uri "http://127.0.0.1:$Port/json/version"
|
|
52
|
+
if ($resp.StatusCode -ge 200 -and $resp.StatusCode -lt 300) {
|
|
53
|
+
return
|
|
54
|
+
}
|
|
55
|
+
} catch {}
|
|
56
|
+
Start-Sleep -Milliseconds 500
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
throw "ChatWise debugging endpoint did not come up on 127.0.0.1:$Port"
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
Clear-LocalProxyEnv
|
|
63
|
+
Stop-ChatWiseTree
|
|
64
|
+
|
|
65
|
+
$proc = Start-Process -FilePath $chatwiseExe -ArgumentList '--remote-debugging-port=9228' -PassThru
|
|
66
|
+
Start-Sleep -Seconds 4
|
|
67
|
+
|
|
68
|
+
if ($proc.HasExited) {
|
|
69
|
+
throw "ChatWise exited early with code $($proc.ExitCode)"
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
Wait-ChatWiseDebugPort
|
|
73
|
+
|
|
74
|
+
$env:OPENCLI_CDP_ENDPOINT = 'http://127.0.0.1:9228'
|
|
75
|
+
|
|
76
|
+
if (-not $OpenCliArgs -or $OpenCliArgs.Count -eq 0) {
|
|
77
|
+
& $opencli.Source 'chatwise' 'status'
|
|
78
|
+
exit $LASTEXITCODE
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
& $opencli.Source @OpenCliArgs
|
|
82
|
+
exit $LASTEXITCODE
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared API analysis helpers used by both explore.ts and record.ts.
|
|
3
|
+
*
|
|
4
|
+
* Extracts common logic for:
|
|
5
|
+
* - URL pattern normalization
|
|
6
|
+
* - Array path discovery in JSON responses
|
|
7
|
+
* - Field role detection
|
|
8
|
+
* - Auth indicator inference
|
|
9
|
+
* - Capability name inference
|
|
10
|
+
* - Strategy inference
|
|
11
|
+
*/
|
|
12
|
+
/** Normalize a full URL into a pattern (replace IDs, strip volatile params). */
|
|
13
|
+
export declare function urlToPattern(url: string): string;
|
|
14
|
+
export interface ArrayDiscovery {
|
|
15
|
+
path: string;
|
|
16
|
+
items: unknown[];
|
|
17
|
+
}
|
|
18
|
+
/** Find the best (largest) array of objects in a JSON response body. */
|
|
19
|
+
export declare function findArrayPath(obj: unknown, depth?: number): ArrayDiscovery | null;
|
|
20
|
+
/** Flatten nested object keys up to maxDepth. */
|
|
21
|
+
export declare function flattenFields(obj: unknown, prefix: string, maxDepth: number): string[];
|
|
22
|
+
/** Detect semantic field roles (title, url, author, etc.) from sample fields. */
|
|
23
|
+
export declare function detectFieldRoles(sampleFields: string[]): Record<string, string>;
|
|
24
|
+
/** Infer a CLI capability name from a URL. */
|
|
25
|
+
export declare function inferCapabilityName(url: string, goal?: string): string;
|
|
26
|
+
/** Infer auth strategy from detected indicators. */
|
|
27
|
+
export declare function inferStrategy(authIndicators: string[]): string;
|
|
28
|
+
/** Detect auth indicators from HTTP headers. */
|
|
29
|
+
export declare function detectAuthFromHeaders(headers?: Record<string, string>): string[];
|
|
30
|
+
/** Detect auth indicators from URL and response body (heuristic). */
|
|
31
|
+
export declare function detectAuthFromContent(url: string, body: unknown): string[];
|
|
32
|
+
/** Extract non-volatile query params and classify them. */
|
|
33
|
+
export declare function classifyQueryParams(url: string): {
|
|
34
|
+
params: string[];
|
|
35
|
+
hasSearch: boolean;
|
|
36
|
+
hasPagination: boolean;
|
|
37
|
+
hasLimit: boolean;
|
|
38
|
+
};
|
package/dist/analysis.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared API analysis helpers used by both explore.ts and record.ts.
|
|
3
|
+
*
|
|
4
|
+
* Extracts common logic for:
|
|
5
|
+
* - URL pattern normalization
|
|
6
|
+
* - Array path discovery in JSON responses
|
|
7
|
+
* - Field role detection
|
|
8
|
+
* - Auth indicator inference
|
|
9
|
+
* - Capability name inference
|
|
10
|
+
* - Strategy inference
|
|
11
|
+
*/
|
|
12
|
+
import { VOLATILE_PARAMS, SEARCH_PARAMS, PAGINATION_PARAMS, LIMIT_PARAMS, FIELD_ROLES, } from './constants.js';
|
|
13
|
+
// ── URL pattern normalization ───────────────────────────────────────────────
|
|
14
|
+
/** Normalize a full URL into a pattern (replace IDs, strip volatile params). */
|
|
15
|
+
export function urlToPattern(url) {
|
|
16
|
+
try {
|
|
17
|
+
const p = new URL(url);
|
|
18
|
+
const pathNorm = p.pathname
|
|
19
|
+
.replace(/\/\d+/g, '/{id}')
|
|
20
|
+
.replace(/\/[0-9a-fA-F]{8,}/g, '/{hex}')
|
|
21
|
+
.replace(/\/BV[a-zA-Z0-9]{10}/g, '/{bvid}');
|
|
22
|
+
const params = [];
|
|
23
|
+
p.searchParams.forEach((_v, k) => { if (!VOLATILE_PARAMS.has(k))
|
|
24
|
+
params.push(k); });
|
|
25
|
+
return `${p.host}${pathNorm}${params.length ? '?' + params.sort().map(k => `${k}={}`).join('&') : ''}`;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return url;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Find the best (largest) array of objects in a JSON response body. */
|
|
32
|
+
export function findArrayPath(obj, depth = 0) {
|
|
33
|
+
if (depth > 5 || !obj || typeof obj !== 'object')
|
|
34
|
+
return null;
|
|
35
|
+
if (Array.isArray(obj)) {
|
|
36
|
+
if (obj.length >= 2 && obj.some(i => i && typeof i === 'object' && !Array.isArray(i))) {
|
|
37
|
+
return { path: '', items: obj };
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
let best = null;
|
|
42
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
43
|
+
const found = findArrayPath(val, depth + 1);
|
|
44
|
+
if (found) {
|
|
45
|
+
const fullPath = found.path ? `${key}.${found.path}` : key;
|
|
46
|
+
const candidate = { path: fullPath, items: found.items };
|
|
47
|
+
if (!best || candidate.items.length > best.items.length)
|
|
48
|
+
best = candidate;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return best;
|
|
52
|
+
}
|
|
53
|
+
// ── Field flattening & role detection ───────────────────────────────────────
|
|
54
|
+
/** Flatten nested object keys up to maxDepth. */
|
|
55
|
+
export function flattenFields(obj, prefix, maxDepth) {
|
|
56
|
+
if (maxDepth <= 0 || !obj || typeof obj !== 'object')
|
|
57
|
+
return [];
|
|
58
|
+
const names = [];
|
|
59
|
+
const record = obj;
|
|
60
|
+
for (const key of Object.keys(record)) {
|
|
61
|
+
const full = prefix ? `${prefix}.${key}` : key;
|
|
62
|
+
names.push(full);
|
|
63
|
+
const val = record[key];
|
|
64
|
+
if (val && typeof val === 'object' && !Array.isArray(val))
|
|
65
|
+
names.push(...flattenFields(val, full, maxDepth - 1));
|
|
66
|
+
}
|
|
67
|
+
return names;
|
|
68
|
+
}
|
|
69
|
+
/** Detect semantic field roles (title, url, author, etc.) from sample fields. */
|
|
70
|
+
export function detectFieldRoles(sampleFields) {
|
|
71
|
+
const detectedFields = {};
|
|
72
|
+
for (const [role, aliases] of Object.entries(FIELD_ROLES)) {
|
|
73
|
+
for (const f of sampleFields) {
|
|
74
|
+
if (aliases.includes(f.split('.').pop()?.toLowerCase() ?? '')) {
|
|
75
|
+
detectedFields[role] = f;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return detectedFields;
|
|
81
|
+
}
|
|
82
|
+
// ── Capability name inference ───────────────────────────────────────────────
|
|
83
|
+
/** Infer a CLI capability name from a URL. */
|
|
84
|
+
export function inferCapabilityName(url, goal) {
|
|
85
|
+
if (goal)
|
|
86
|
+
return goal;
|
|
87
|
+
const u = url.toLowerCase();
|
|
88
|
+
if (u.includes('hot') || u.includes('popular') || u.includes('ranking') || u.includes('trending'))
|
|
89
|
+
return 'hot';
|
|
90
|
+
if (u.includes('search'))
|
|
91
|
+
return 'search';
|
|
92
|
+
if (u.includes('feed') || u.includes('timeline') || u.includes('dynamic'))
|
|
93
|
+
return 'feed';
|
|
94
|
+
if (u.includes('comment') || u.includes('reply'))
|
|
95
|
+
return 'comments';
|
|
96
|
+
if (u.includes('history'))
|
|
97
|
+
return 'history';
|
|
98
|
+
if (u.includes('profile') || u.includes('userinfo') || u.includes('/me'))
|
|
99
|
+
return 'me';
|
|
100
|
+
if (u.includes('favorite') || u.includes('collect') || u.includes('bookmark'))
|
|
101
|
+
return 'favorite';
|
|
102
|
+
try {
|
|
103
|
+
const segs = new URL(url).pathname
|
|
104
|
+
.split('/')
|
|
105
|
+
.filter(s => s && !s.match(/^\d+$/) && !s.match(/^[0-9a-f]{8,}$/i) && !s.match(/^v\d+$/));
|
|
106
|
+
if (segs.length)
|
|
107
|
+
return segs[segs.length - 1].replace(/[^a-z0-9]/gi, '_').toLowerCase();
|
|
108
|
+
}
|
|
109
|
+
catch { }
|
|
110
|
+
return 'data';
|
|
111
|
+
}
|
|
112
|
+
// ── Strategy inference ──────────────────────────────────────────────────────
|
|
113
|
+
/** Infer auth strategy from detected indicators. */
|
|
114
|
+
export function inferStrategy(authIndicators) {
|
|
115
|
+
if (authIndicators.includes('signature'))
|
|
116
|
+
return 'intercept';
|
|
117
|
+
if (authIndicators.includes('bearer') || authIndicators.includes('csrf'))
|
|
118
|
+
return 'header';
|
|
119
|
+
return 'cookie';
|
|
120
|
+
}
|
|
121
|
+
// ── Auth indicator detection ────────────────────────────────────────────────
|
|
122
|
+
/** Detect auth indicators from HTTP headers. */
|
|
123
|
+
export function detectAuthFromHeaders(headers) {
|
|
124
|
+
if (!headers)
|
|
125
|
+
return [];
|
|
126
|
+
const indicators = [];
|
|
127
|
+
const keys = Object.keys(headers).map(k => k.toLowerCase());
|
|
128
|
+
if (keys.some(k => k === 'authorization'))
|
|
129
|
+
indicators.push('bearer');
|
|
130
|
+
if (keys.some(k => k.startsWith('x-csrf') || k.startsWith('x-xsrf')))
|
|
131
|
+
indicators.push('csrf');
|
|
132
|
+
if (keys.some(k => k.startsWith('x-s') || k === 'x-t' || k === 'x-s-common'))
|
|
133
|
+
indicators.push('signature');
|
|
134
|
+
return indicators;
|
|
135
|
+
}
|
|
136
|
+
/** Detect auth indicators from URL and response body (heuristic). */
|
|
137
|
+
export function detectAuthFromContent(url, body) {
|
|
138
|
+
const indicators = [];
|
|
139
|
+
if (body && typeof body === 'object') {
|
|
140
|
+
const keys = Object.keys(body).map(k => k.toLowerCase());
|
|
141
|
+
if (keys.some(k => k.includes('sign') || k === 'w_rid' || k.includes('token'))) {
|
|
142
|
+
indicators.push('signature');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (url.includes('/wbi/') || url.includes('w_rid='))
|
|
146
|
+
indicators.push('signature');
|
|
147
|
+
if (url.includes('bearer') || url.includes('access_token'))
|
|
148
|
+
indicators.push('bearer');
|
|
149
|
+
return indicators;
|
|
150
|
+
}
|
|
151
|
+
// ── Query param classification ──────────────────────────────────────────────
|
|
152
|
+
/** Extract non-volatile query params and classify them. */
|
|
153
|
+
export function classifyQueryParams(url) {
|
|
154
|
+
const params = [];
|
|
155
|
+
try {
|
|
156
|
+
new URL(url).searchParams.forEach((_v, k) => { if (!VOLATILE_PARAMS.has(k))
|
|
157
|
+
params.push(k); });
|
|
158
|
+
}
|
|
159
|
+
catch { }
|
|
160
|
+
return {
|
|
161
|
+
params,
|
|
162
|
+
hasSearch: params.some(p => SEARCH_PARAMS.has(p)),
|
|
163
|
+
hasPagination: params.some(p => PAGINATION_PARAMS.has(p)),
|
|
164
|
+
hasLimit: params.some(p => LIMIT_PARAMS.has(p)),
|
|
165
|
+
};
|
|
166
|
+
}
|
package/dist/browser/cdp.d.ts
CHANGED
|
@@ -24,13 +24,9 @@ export declare class CDPBridge {
|
|
|
24
24
|
workspace?: string;
|
|
25
25
|
}): Promise<IPage>;
|
|
26
26
|
close(): Promise<void>;
|
|
27
|
-
/** Send a CDP command with timeout guard (P0 fix #4) */
|
|
28
27
|
send(method: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<unknown>;
|
|
29
|
-
/** Listen for a CDP event */
|
|
30
28
|
on(event: string, handler: (params: unknown) => void): void;
|
|
31
|
-
/** Remove a CDP event listener */
|
|
32
29
|
off(event: string, handler: (params: unknown) => void): void;
|
|
33
|
-
/** Wait for a CDP event to fire (one-shot) */
|
|
34
30
|
waitForEvent(event: string, timeoutMs?: number): Promise<unknown>;
|
|
35
31
|
}
|
|
36
32
|
declare function selectCDPTarget(targets: CDPTarget[]): CDPTarget | undefined;
|