@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/dist/cli.js
CHANGED
|
@@ -14,6 +14,7 @@ import { PKG_VERSION } from './version.js';
|
|
|
14
14
|
import { printCompletionScript } from './completion.js';
|
|
15
15
|
import { loadExternalClis, executeExternalCli, installExternalCli, registerExternalCli, isBinaryInstalled } from './external.js';
|
|
16
16
|
import { registerAllCommands } from './commanderAdapter.js';
|
|
17
|
+
import { getErrorMessage } from './errors.js';
|
|
17
18
|
export function runCli(BUILTIN_CLIS, USER_CLIS) {
|
|
18
19
|
const program = new Command();
|
|
19
20
|
// enablePositionalOptions: prevents parent from consuming flags meant for subcommands;
|
|
@@ -157,8 +158,6 @@ export function runCli(BUILTIN_CLIS, USER_CLIS) {
|
|
|
157
158
|
const r = await generateCliFromUrl({
|
|
158
159
|
url,
|
|
159
160
|
BrowserFactory: getBrowserFactory(),
|
|
160
|
-
builtinClis: BUILTIN_CLIS,
|
|
161
|
-
userClis: USER_CLIS,
|
|
162
161
|
goal: opts.goal,
|
|
163
162
|
site: opts.site,
|
|
164
163
|
workspace,
|
|
@@ -240,7 +239,7 @@ export function runCli(BUILTIN_CLIS, USER_CLIS) {
|
|
|
240
239
|
console.log(chalk.green(`✅ Plugin "${name}" installed successfully. Commands are ready to use.`));
|
|
241
240
|
}
|
|
242
241
|
catch (err) {
|
|
243
|
-
console.error(chalk.red(`Error: ${err
|
|
242
|
+
console.error(chalk.red(`Error: ${getErrorMessage(err)}`));
|
|
244
243
|
process.exitCode = 1;
|
|
245
244
|
}
|
|
246
245
|
});
|
|
@@ -255,24 +254,64 @@ export function runCli(BUILTIN_CLIS, USER_CLIS) {
|
|
|
255
254
|
console.log(chalk.green(`✅ Plugin "${name}" uninstalled.`));
|
|
256
255
|
}
|
|
257
256
|
catch (err) {
|
|
258
|
-
console.error(chalk.red(`Error: ${err
|
|
257
|
+
console.error(chalk.red(`Error: ${getErrorMessage(err)}`));
|
|
259
258
|
process.exitCode = 1;
|
|
260
259
|
}
|
|
261
260
|
});
|
|
262
261
|
pluginCmd
|
|
263
262
|
.command('update')
|
|
264
|
-
.description('Update a plugin to the latest version')
|
|
265
|
-
.argument('
|
|
266
|
-
.
|
|
267
|
-
|
|
263
|
+
.description('Update a plugin (or all plugins) to the latest version')
|
|
264
|
+
.argument('[name]', 'Plugin name (required unless --all is passed)')
|
|
265
|
+
.option('--all', 'Update all installed plugins')
|
|
266
|
+
.action(async (name, opts) => {
|
|
267
|
+
if (!name && !opts.all) {
|
|
268
|
+
console.error(chalk.red('Error: Please specify a plugin name or use the --all flag.'));
|
|
269
|
+
process.exitCode = 1;
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (name && opts.all) {
|
|
273
|
+
console.error(chalk.red('Error: Cannot specify both a plugin name and --all.'));
|
|
274
|
+
process.exitCode = 1;
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const { updatePlugin, updateAllPlugins } = await import('./plugin.js');
|
|
268
278
|
const { discoverPlugins } = await import('./discovery.js');
|
|
279
|
+
if (opts.all) {
|
|
280
|
+
const results = updateAllPlugins();
|
|
281
|
+
if (results.length > 0) {
|
|
282
|
+
await discoverPlugins();
|
|
283
|
+
}
|
|
284
|
+
let hasErrors = false;
|
|
285
|
+
console.log(chalk.bold(' Update Results:'));
|
|
286
|
+
for (const result of results) {
|
|
287
|
+
if (result.success) {
|
|
288
|
+
console.log(` ${chalk.green('✓')} ${result.name}`);
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
hasErrors = true;
|
|
292
|
+
console.log(` ${chalk.red('✗')} ${result.name} — ${chalk.dim(result.error)}`);
|
|
293
|
+
}
|
|
294
|
+
if (results.length === 0) {
|
|
295
|
+
console.log(chalk.dim(' No plugins installed.'));
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
console.log();
|
|
299
|
+
if (hasErrors) {
|
|
300
|
+
console.error(chalk.red('Completed with some errors.'));
|
|
301
|
+
process.exitCode = 1;
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
console.log(chalk.green('✅ All plugins updated successfully.'));
|
|
305
|
+
}
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
269
308
|
try {
|
|
270
309
|
updatePlugin(name);
|
|
271
310
|
await discoverPlugins();
|
|
272
311
|
console.log(chalk.green(`✅ Plugin "${name}" updated successfully.`));
|
|
273
312
|
}
|
|
274
313
|
catch (err) {
|
|
275
|
-
console.error(chalk.red(`Error: ${err
|
|
314
|
+
console.error(chalk.red(`Error: ${getErrorMessage(err)}`));
|
|
276
315
|
process.exitCode = 1;
|
|
277
316
|
}
|
|
278
317
|
});
|
|
@@ -301,9 +340,10 @@ export function runCli(BUILTIN_CLIS, USER_CLIS) {
|
|
|
301
340
|
console.log(chalk.bold(' Installed plugins'));
|
|
302
341
|
console.log();
|
|
303
342
|
for (const p of plugins) {
|
|
343
|
+
const version = p.version ? chalk.green(` @${p.version}`) : '';
|
|
304
344
|
const cmds = p.commands.length > 0 ? chalk.dim(` (${p.commands.join(', ')})`) : '';
|
|
305
345
|
const src = p.source ? chalk.dim(` ← ${p.source}`) : '';
|
|
306
|
-
console.log(` ${chalk.cyan(p.name)}${cmds}${src}`);
|
|
346
|
+
console.log(` ${chalk.cyan(p.name)}${version}${cmds}${src}`);
|
|
307
347
|
}
|
|
308
348
|
console.log();
|
|
309
349
|
console.log(chalk.dim(` ${plugins.length} plugin(s) installed`));
|
|
@@ -343,7 +383,7 @@ export function runCli(BUILTIN_CLIS, USER_CLIS) {
|
|
|
343
383
|
executeExternalCli(name, args, externalClis);
|
|
344
384
|
}
|
|
345
385
|
catch (err) {
|
|
346
|
-
console.error(chalk.red(`Error: ${err
|
|
386
|
+
console.error(chalk.red(`Error: ${getErrorMessage(err)}`));
|
|
347
387
|
process.exitCode = 1;
|
|
348
388
|
}
|
|
349
389
|
}
|
|
@@ -374,28 +414,16 @@ export function runCli(BUILTIN_CLIS, USER_CLIS) {
|
|
|
374
414
|
siteGroups.set('antigravity', antigravityCmd);
|
|
375
415
|
registerAllCommands(program, siteGroups);
|
|
376
416
|
// ── Unknown command fallback ──────────────────────────────────────────────
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
'kill', 'killall', 'chmod', 'chown', 'passwd', 'su', 'mount',
|
|
380
|
-
'umount', 'format', 'diskutil',
|
|
381
|
-
]);
|
|
417
|
+
// Security: do NOT auto-discover and register arbitrary system binaries.
|
|
418
|
+
// Only explicitly registered external CLIs (via `opencli register`) are allowed.
|
|
382
419
|
program.on('command:*', (operands) => {
|
|
383
420
|
const binary = operands[0];
|
|
384
|
-
|
|
385
|
-
console.error(chalk.red(`Refusing to register system command '${binary}'.`));
|
|
386
|
-
process.exitCode = 1;
|
|
387
|
-
return;
|
|
388
|
-
}
|
|
421
|
+
console.error(chalk.red(`error: unknown command '${binary}'`));
|
|
389
422
|
if (isBinaryInstalled(binary)) {
|
|
390
|
-
console.
|
|
391
|
-
registerExternalCli(binary);
|
|
392
|
-
passthroughExternal(binary);
|
|
393
|
-
}
|
|
394
|
-
else {
|
|
395
|
-
console.error(chalk.red(`error: unknown command '${binary}'`));
|
|
396
|
-
program.outputHelp();
|
|
397
|
-
process.exitCode = 1;
|
|
423
|
+
console.error(chalk.dim(` Tip: '${binary}' exists on your PATH. Use 'opencli register ${binary}' to add it as an external CLI.`));
|
|
398
424
|
}
|
|
425
|
+
program.outputHelp();
|
|
426
|
+
process.exitCode = 1;
|
|
399
427
|
});
|
|
400
428
|
program.parse();
|
|
401
429
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared command factories for Electron/desktop app adapters.
|
|
3
|
+
* Eliminates duplicate screenshot/status/new/dump implementations
|
|
4
|
+
* across cursor, codex, chatwise, etc.
|
|
5
|
+
*/
|
|
6
|
+
import type { CliOptions } from '../../registry.js';
|
|
7
|
+
/**
|
|
8
|
+
* Factory: capture DOM HTML + accessibility snapshot.
|
|
9
|
+
*/
|
|
10
|
+
export declare function makeScreenshotCommand(site: string, displayName?: string, extra?: Partial<CliOptions>): import("../../registry.js").CliCommand;
|
|
11
|
+
/**
|
|
12
|
+
* Factory: check CDP connection status.
|
|
13
|
+
*/
|
|
14
|
+
export declare function makeStatusCommand(site: string, displayName?: string, extra?: Partial<CliOptions>): import("../../registry.js").CliCommand;
|
|
15
|
+
/**
|
|
16
|
+
* Factory: start a new session via Cmd/Ctrl+N.
|
|
17
|
+
*/
|
|
18
|
+
export declare function makeNewCommand(site: string, displayName?: string, extra?: Partial<CliOptions>): import("../../registry.js").CliCommand;
|
|
19
|
+
/**
|
|
20
|
+
* Factory: dump DOM + snapshot for reverse-engineering.
|
|
21
|
+
*/
|
|
22
|
+
export declare function makeDumpCommand(site: string): import("../../registry.js").CliCommand;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared command factories for Electron/desktop app adapters.
|
|
3
|
+
* Eliminates duplicate screenshot/status/new/dump implementations
|
|
4
|
+
* across cursor, codex, chatwise, etc.
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'node:fs';
|
|
7
|
+
import { cli, Strategy } from '../../registry.js';
|
|
8
|
+
/**
|
|
9
|
+
* Factory: capture DOM HTML + accessibility snapshot.
|
|
10
|
+
*/
|
|
11
|
+
export function makeScreenshotCommand(site, displayName, extra = {}) {
|
|
12
|
+
const label = displayName ?? site;
|
|
13
|
+
return cli({
|
|
14
|
+
...extra,
|
|
15
|
+
site,
|
|
16
|
+
name: 'screenshot',
|
|
17
|
+
description: `Capture a snapshot of the current ${label} window (DOM + Accessibility tree)`,
|
|
18
|
+
domain: 'localhost',
|
|
19
|
+
strategy: Strategy.UI,
|
|
20
|
+
browser: true,
|
|
21
|
+
args: [
|
|
22
|
+
{ name: 'output', required: false, help: `Output file path (default: /tmp/${site}-snapshot.txt)` },
|
|
23
|
+
],
|
|
24
|
+
columns: ['Status', 'File'],
|
|
25
|
+
func: async (page, kwargs) => {
|
|
26
|
+
const outputPath = kwargs.output || `/tmp/${site}-snapshot.txt`;
|
|
27
|
+
const snap = await page.snapshot({ compact: true });
|
|
28
|
+
const html = await page.evaluate('document.documentElement.outerHTML');
|
|
29
|
+
const htmlPath = outputPath.replace(/\.\w+$/, '') + '-dom.html';
|
|
30
|
+
const snapPath = outputPath.replace(/\.\w+$/, '') + '-a11y.txt';
|
|
31
|
+
fs.writeFileSync(htmlPath, html);
|
|
32
|
+
fs.writeFileSync(snapPath, typeof snap === 'string' ? snap : JSON.stringify(snap, null, 2));
|
|
33
|
+
return [
|
|
34
|
+
{ Status: 'Success', File: htmlPath },
|
|
35
|
+
{ Status: 'Success', File: snapPath },
|
|
36
|
+
];
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Factory: check CDP connection status.
|
|
42
|
+
*/
|
|
43
|
+
export function makeStatusCommand(site, displayName, extra = {}) {
|
|
44
|
+
const label = displayName ?? site;
|
|
45
|
+
return cli({
|
|
46
|
+
...extra,
|
|
47
|
+
site,
|
|
48
|
+
name: 'status',
|
|
49
|
+
description: `Check active CDP connection to ${label}`,
|
|
50
|
+
domain: 'localhost',
|
|
51
|
+
strategy: Strategy.UI,
|
|
52
|
+
browser: true,
|
|
53
|
+
columns: ['Status', 'Url', 'Title'],
|
|
54
|
+
func: async (page) => {
|
|
55
|
+
const url = await page.evaluate('window.location.href');
|
|
56
|
+
const title = await page.evaluate('document.title');
|
|
57
|
+
return [{ Status: 'Connected', Url: url, Title: title }];
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Factory: start a new session via Cmd/Ctrl+N.
|
|
63
|
+
*/
|
|
64
|
+
export function makeNewCommand(site, displayName, extra = {}) {
|
|
65
|
+
const label = displayName ?? site;
|
|
66
|
+
return cli({
|
|
67
|
+
...extra,
|
|
68
|
+
site,
|
|
69
|
+
name: 'new',
|
|
70
|
+
description: `Start a new ${label} session`,
|
|
71
|
+
domain: 'localhost',
|
|
72
|
+
strategy: Strategy.UI,
|
|
73
|
+
browser: true,
|
|
74
|
+
columns: ['Status'],
|
|
75
|
+
func: async (page) => {
|
|
76
|
+
const isMac = process.platform === 'darwin';
|
|
77
|
+
await page.pressKey(isMac ? 'Meta+N' : 'Control+N');
|
|
78
|
+
await page.wait(1);
|
|
79
|
+
return [{ Status: 'Success' }];
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Factory: dump DOM + snapshot for reverse-engineering.
|
|
85
|
+
*/
|
|
86
|
+
export function makeDumpCommand(site) {
|
|
87
|
+
return cli({
|
|
88
|
+
site,
|
|
89
|
+
name: 'dump',
|
|
90
|
+
description: `Dump the DOM and Accessibility tree of ${site} for reverse-engineering`,
|
|
91
|
+
domain: 'localhost',
|
|
92
|
+
strategy: Strategy.UI,
|
|
93
|
+
browser: true,
|
|
94
|
+
columns: ['action', 'files'],
|
|
95
|
+
func: async (page) => {
|
|
96
|
+
const dom = await page.evaluate('document.body.innerHTML');
|
|
97
|
+
fs.writeFileSync(`/tmp/${site}-dom.html`, dom);
|
|
98
|
+
const snap = await page.snapshot({ interactive: false });
|
|
99
|
+
fs.writeFileSync(`/tmp/${site}-snapshot.json`, JSON.stringify(snap, null, 2));
|
|
100
|
+
return [
|
|
101
|
+
{
|
|
102
|
+
action: 'Dom extraction finished',
|
|
103
|
+
files: `/tmp/${site}-dom.html, /tmp/${site}-snapshot.json`,
|
|
104
|
+
},
|
|
105
|
+
];
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { createServer } from 'node:http';
|
|
13
13
|
import { CDPBridge } from '../../browser/cdp.js';
|
|
14
|
+
import { getErrorMessage } from '../../errors.js';
|
|
14
15
|
// ─── Helpers ─────────────────────────────────────────────────────────
|
|
15
16
|
function generateMsgId() {
|
|
16
17
|
const chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
|
@@ -389,12 +390,14 @@ export async function startServe(opts = {}) {
|
|
|
389
390
|
}
|
|
390
391
|
catch (err) {
|
|
391
392
|
cdp = null;
|
|
392
|
-
const
|
|
393
|
+
const errMsg = getErrorMessage(err);
|
|
394
|
+
const cause = err instanceof Error ? err.cause : undefined;
|
|
395
|
+
const isRefused = cause?.code === 'ECONNREFUSED' || errMsg.includes('ECONNREFUSED');
|
|
393
396
|
throw new Error(isRefused
|
|
394
397
|
? `Cannot connect to Antigravity at ${endpoint}.\n` +
|
|
395
398
|
' 1. Make sure Antigravity is running\n' +
|
|
396
399
|
' 2. Launch with: --remote-debugging-port=9224'
|
|
397
|
-
: `CDP connection failed: ${
|
|
400
|
+
: `CDP connection failed: ${errMsg}`);
|
|
398
401
|
}
|
|
399
402
|
console.error('[serve] ✅ CDP connected.');
|
|
400
403
|
// Quick verification
|
|
@@ -11,7 +11,7 @@ cli({
|
|
|
11
11
|
{ name: 'query', positional: true, required: true, help: 'Search keyword' },
|
|
12
12
|
{ name: 'limit', type: 'int', default: 10, help: 'Max results' },
|
|
13
13
|
],
|
|
14
|
-
columns: ['id', 'title', 'author', 'episodes', 'genre'],
|
|
14
|
+
columns: ['id', 'title', 'author', 'episodes', 'genre', 'url'],
|
|
15
15
|
func: async (_page, args) => {
|
|
16
16
|
const term = encodeURIComponent(args.query);
|
|
17
17
|
const limit = Math.max(1, Math.min(Number(args.limit), 25));
|
|
@@ -24,6 +24,7 @@ cli({
|
|
|
24
24
|
author: p.artistName,
|
|
25
25
|
episodes: p.trackCount ?? '-',
|
|
26
26
|
genre: p.primaryGenreName ?? '-',
|
|
27
|
+
url: p.collectionViewUrl || '',
|
|
27
28
|
}));
|
|
28
29
|
},
|
|
29
30
|
});
|
|
@@ -11,14 +11,14 @@ cli({
|
|
|
11
11
|
{ name: 'query', positional: true, required: true, help: 'Search keyword (e.g. "attention is all you need")' },
|
|
12
12
|
{ name: 'limit', type: 'int', default: 10, help: 'Max results (max 25)' },
|
|
13
13
|
],
|
|
14
|
-
columns: ['id', 'title', 'authors', 'published'],
|
|
14
|
+
columns: ['id', 'title', 'authors', 'published', 'url'],
|
|
15
15
|
func: async (_page, args) => {
|
|
16
16
|
const limit = Math.max(1, Math.min(Number(args.limit), 25));
|
|
17
|
-
const query = encodeURIComponent(`all:${args.
|
|
17
|
+
const query = encodeURIComponent(`all:${args.query}`);
|
|
18
18
|
const xml = await arxivFetch(`search_query=${query}&max_results=${limit}&sortBy=relevance`);
|
|
19
19
|
const entries = parseEntries(xml);
|
|
20
20
|
if (!entries.length)
|
|
21
21
|
throw new CliError('NOT_FOUND', 'No papers found', 'Try a different keyword');
|
|
22
|
-
return entries.map(e => ({ id: e.id, title: e.title, authors: e.authors, published: e.published }));
|
|
22
|
+
return entries.map(e => ({ id: e.id, title: e.title, authors: e.authors, published: e.published, url: e.url }));
|
|
23
23
|
},
|
|
24
24
|
});
|
package/dist/clis/bbc/news.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import './dynamic.js';
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
const { mockApiGet } = vi.hoisted(() => ({
|
|
3
|
+
mockApiGet: vi.fn(),
|
|
4
|
+
}));
|
|
5
|
+
vi.mock('./utils.js', () => ({
|
|
6
|
+
apiGet: mockApiGet,
|
|
7
|
+
}));
|
|
8
|
+
import { getRegistry } from '../../registry.js';
|
|
9
|
+
import './dynamic.js';
|
|
10
|
+
describe('bilibili dynamic adapter', () => {
|
|
11
|
+
const command = getRegistry().get('bilibili/dynamic');
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
mockApiGet.mockReset();
|
|
14
|
+
});
|
|
15
|
+
it('maps desc text rows from the dynamic feed payload', async () => {
|
|
16
|
+
mockApiGet.mockResolvedValue({
|
|
17
|
+
data: {
|
|
18
|
+
items: [
|
|
19
|
+
{
|
|
20
|
+
id_str: '123',
|
|
21
|
+
modules: {
|
|
22
|
+
module_author: { name: 'Alice' },
|
|
23
|
+
module_dynamic: { desc: { text: 'hello world' } },
|
|
24
|
+
module_stat: { like: { count: 9 } },
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
const result = await command.func({}, { limit: 5 });
|
|
31
|
+
expect(mockApiGet).toHaveBeenCalledWith({}, '/x/polymer/web-dynamic/v1/feed/all', { params: {}, signed: false });
|
|
32
|
+
expect(result).toEqual([
|
|
33
|
+
{
|
|
34
|
+
id: '123',
|
|
35
|
+
author: 'Alice',
|
|
36
|
+
text: 'hello world',
|
|
37
|
+
likes: 9,
|
|
38
|
+
url: 'https://t.bilibili.com/123',
|
|
39
|
+
},
|
|
40
|
+
]);
|
|
41
|
+
});
|
|
42
|
+
it('falls back to archive title when desc text is absent', async () => {
|
|
43
|
+
mockApiGet.mockResolvedValue({
|
|
44
|
+
data: {
|
|
45
|
+
items: [
|
|
46
|
+
{
|
|
47
|
+
id_str: '456',
|
|
48
|
+
modules: {
|
|
49
|
+
module_author: { name: 'Bob' },
|
|
50
|
+
module_dynamic: { major: { archive: { title: 'Video title' } } },
|
|
51
|
+
module_stat: { like: { count: 3 } },
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
const result = await command.func({}, { limit: 5 });
|
|
58
|
+
expect(result).toEqual([
|
|
59
|
+
{
|
|
60
|
+
id: '456',
|
|
61
|
+
author: 'Bob',
|
|
62
|
+
text: 'Video title',
|
|
63
|
+
likes: 3,
|
|
64
|
+
url: 'https://t.bilibili.com/456',
|
|
65
|
+
},
|
|
66
|
+
]);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cli, Strategy } from '../../registry.js';
|
|
2
|
-
import { apiGet, payloadData } from './utils.js';
|
|
2
|
+
import { apiGet, payloadData, getSelfUid } from './utils.js';
|
|
3
3
|
cli({
|
|
4
4
|
site: 'bilibili',
|
|
5
5
|
name: 'favorite',
|
|
@@ -13,9 +13,11 @@ cli({
|
|
|
13
13
|
columns: ['rank', 'title', 'author', 'plays', 'url'],
|
|
14
14
|
func: async (page, kwargs) => {
|
|
15
15
|
const { limit = 20, page: pageNum = 1 } = kwargs;
|
|
16
|
+
// Get current user's UID
|
|
17
|
+
const uid = await getSelfUid(page);
|
|
16
18
|
// Get default favorite folder ID
|
|
17
19
|
const foldersPayload = await apiGet(page, '/x/v3/fav/folder/created/list-all', {
|
|
18
|
-
params: { up_mid:
|
|
20
|
+
params: { up_mid: uid },
|
|
19
21
|
signed: true,
|
|
20
22
|
});
|
|
21
23
|
const folders = payloadData(foldersPayload)?.list ?? [];
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { cli, Strategy } from '../../registry.js';
|
|
2
|
+
import { CommandExecutionError } from '../../errors.js';
|
|
2
3
|
import { fetchJson, getSelfUid, resolveUid } from './utils.js';
|
|
3
4
|
cli({
|
|
4
5
|
site: 'bilibili',
|
|
@@ -13,7 +14,7 @@ cli({
|
|
|
13
14
|
columns: ['mid', 'name', 'sign', 'following', 'fans'],
|
|
14
15
|
func: async (page, kwargs) => {
|
|
15
16
|
if (!page)
|
|
16
|
-
throw new
|
|
17
|
+
throw new CommandExecutionError('Browser session required for bilibili following');
|
|
17
18
|
// 1. Resolve UID (default to self)
|
|
18
19
|
const uid = kwargs.uid
|
|
19
20
|
? await resolveUid(page, kwargs.uid)
|
|
@@ -23,7 +24,7 @@ cli({
|
|
|
23
24
|
// 2. Fetch following list (standard Cookie API, no Wbi signing needed)
|
|
24
25
|
const payload = await fetchJson(page, `https://api.bilibili.com/x/relation/followings?vmid=${uid}&pn=${pn}&ps=${ps}&order=desc`);
|
|
25
26
|
if (payload.code !== 0) {
|
|
26
|
-
throw new
|
|
27
|
+
throw new CommandExecutionError(`获取关注列表失败: ${payload.message} (${payload.code})`);
|
|
27
28
|
}
|
|
28
29
|
const list = payload.data?.list || [];
|
|
29
30
|
if (list.length === 0) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { cli, Strategy } from '../../registry.js';
|
|
2
|
+
import { AuthRequiredError, CommandExecutionError, EmptyResultError, SelectorError } from '../../errors.js';
|
|
2
3
|
import { apiGet } from './utils.js';
|
|
3
4
|
cli({
|
|
4
5
|
site: 'bilibili',
|
|
@@ -12,7 +13,7 @@ cli({
|
|
|
12
13
|
columns: ['index', 'from', 'to', 'content'],
|
|
13
14
|
func: async (page, kwargs) => {
|
|
14
15
|
if (!page)
|
|
15
|
-
throw new
|
|
16
|
+
throw new CommandExecutionError('Browser session required for bilibili subtitle');
|
|
16
17
|
// 1. 先前往视频详情页 (建立有鉴权的 Session,且这里不需要加载完整个视频)
|
|
17
18
|
await page.goto(`https://www.bilibili.com/video/${kwargs.bvid}/`);
|
|
18
19
|
// 2. 利用 __INITIAL_STATE__ 获取基础信息,拿 CID
|
|
@@ -21,7 +22,7 @@ cli({
|
|
|
21
22
|
return state?.videoData?.cid;
|
|
22
23
|
})()`);
|
|
23
24
|
if (!cid) {
|
|
24
|
-
throw new
|
|
25
|
+
throw new SelectorError('videoData.cid', '无法在页面中提取到当前视频的 CID,请检查页面是否正常加载。');
|
|
25
26
|
}
|
|
26
27
|
// 3. 在 Node 端使用 apiGet 获取带 Wbi 签名的字幕列表
|
|
27
28
|
// 之前纯靠 evaluate 里的 fetch 会失败,因为 B 站 /wbi/ 开头的接口强校验 w_rid,未签名直接被风控返回 403 HTML
|
|
@@ -30,11 +31,11 @@ cli({
|
|
|
30
31
|
signed: true, // 开启 wbi_sign 自动签名
|
|
31
32
|
});
|
|
32
33
|
if (payload.code !== 0) {
|
|
33
|
-
throw new
|
|
34
|
+
throw new CommandExecutionError(`获取视频播放信息失败: ${payload.message} (${payload.code})`);
|
|
34
35
|
}
|
|
35
36
|
const subtitles = payload.data?.subtitle?.subtitles || [];
|
|
36
37
|
if (subtitles.length === 0) {
|
|
37
|
-
throw new
|
|
38
|
+
throw new EmptyResultError('bilibili subtitle', '此视频没有发现外挂或智能字幕。');
|
|
38
39
|
}
|
|
39
40
|
// 4. 选择目标字幕语言
|
|
40
41
|
const target = kwargs.lang
|
|
@@ -42,7 +43,7 @@ cli({
|
|
|
42
43
|
: subtitles[0];
|
|
43
44
|
const targetSubUrl = target.subtitle_url;
|
|
44
45
|
if (!targetSubUrl || targetSubUrl === '') {
|
|
45
|
-
throw new
|
|
46
|
+
throw new AuthRequiredError('bilibili.com', '[风控拦截/未登录] 获取到的 subtitle_url 为空!请确保 CLI 已成功登录且风控未封锁此账号。');
|
|
46
47
|
}
|
|
47
48
|
const finalUrl = targetSubUrl.startsWith('//') ? 'https:' + targetSubUrl : targetSubUrl;
|
|
48
49
|
// 5. 解析并拉取 CDN 的 JSON 文件
|
|
@@ -69,11 +70,11 @@ cli({
|
|
|
69
70
|
`;
|
|
70
71
|
const items = await page.evaluate(fetchJs);
|
|
71
72
|
if (items?.error) {
|
|
72
|
-
throw new
|
|
73
|
+
throw new CommandExecutionError(`字幕获取失败: ${items.error}${items.text ? ' — ' + items.text : ''}`);
|
|
73
74
|
}
|
|
74
75
|
const finalItems = items?.data || [];
|
|
75
76
|
if (!Array.isArray(finalItems)) {
|
|
76
|
-
throw new
|
|
77
|
+
throw new CommandExecutionError('解析到的字幕列表对象不符合数组格式');
|
|
77
78
|
}
|
|
78
79
|
// 6. 数据映射
|
|
79
80
|
return finalItems.map((item, idx) => ({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Bilibili shared helpers: WBI signing, authenticated fetch, nav data, UID resolution.
|
|
3
3
|
*/
|
|
4
|
-
import { AuthRequiredError } from '../../errors.js';
|
|
4
|
+
import { AuthRequiredError, EmptyResultError } from '../../errors.js';
|
|
5
5
|
const MIXIN_KEY_ENC_TAB = [
|
|
6
6
|
46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,
|
|
7
7
|
33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,
|
|
@@ -92,5 +92,5 @@ export async function resolveUid(page, input) {
|
|
|
92
92
|
const results = payload?.data?.result ?? [];
|
|
93
93
|
if (results.length > 0)
|
|
94
94
|
return String(results[0].mid);
|
|
95
|
-
throw new
|
|
95
|
+
throw new EmptyResultError(`bilibili user search: ${input}`, 'User may not exist or username may have changed.');
|
|
96
96
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* BOSS直聘 batchgreet — batch greet recommended candidates.
|
|
3
3
|
*/
|
|
4
4
|
import { cli, Strategy } from '../../registry.js';
|
|
5
|
-
import { requirePage, navigateToChat, fetchRecommendList, clickCandidateInList, typeAndSendMessage, verbose, } from './
|
|
5
|
+
import { requirePage, navigateToChat, fetchRecommendList, clickCandidateInList, typeAndSendMessage, verbose, } from './utils.js';
|
|
6
6
|
cli({
|
|
7
7
|
site: 'boss',
|
|
8
8
|
name: 'batchgreet',
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cli, Strategy } from '../../registry.js';
|
|
2
|
-
import { requirePage, navigateToChat, bossFetch, findFriendByUid } from './
|
|
2
|
+
import { requirePage, navigateToChat, bossFetch, findFriendByUid } from './utils.js';
|
|
3
3
|
cli({
|
|
4
4
|
site: 'boss',
|
|
5
5
|
name: 'chatmsg',
|
package/dist/clis/boss/detail.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* BOSS直聘 job detail — fetch full job posting details via browser cookie API.
|
|
3
3
|
*/
|
|
4
4
|
import { cli, Strategy } from '../../registry.js';
|
|
5
|
-
import { requirePage, navigateTo, bossFetch, verbose } from './
|
|
5
|
+
import { requirePage, navigateTo, bossFetch, verbose } from './utils.js';
|
|
6
6
|
cli({
|
|
7
7
|
site: 'boss',
|
|
8
8
|
name: 'detail',
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* BOSS直聘 exchange — request phone/wechat exchange with a candidate.
|
|
3
3
|
*/
|
|
4
4
|
import { cli, Strategy } from '../../registry.js';
|
|
5
|
-
import { requirePage, navigateToChat, bossFetch, findFriendByUid, verbose } from './
|
|
5
|
+
import { requirePage, navigateToChat, bossFetch, findFriendByUid, verbose } from './utils.js';
|
|
6
6
|
cli({
|
|
7
7
|
site: 'boss',
|
|
8
8
|
name: 'exchange',
|
package/dist/clis/boss/greet.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* BOSS直聘 greet — send greeting to a new candidate (initiate chat).
|
|
3
3
|
*/
|
|
4
4
|
import { cli, Strategy } from '../../registry.js';
|
|
5
|
-
import { requirePage, navigateToChat, findFriendByUid, clickCandidateInList, typeAndSendMessage, verbose, } from './
|
|
5
|
+
import { requirePage, navigateToChat, findFriendByUid, clickCandidateInList, typeAndSendMessage, verbose, } from './utils.js';
|
|
6
6
|
cli({
|
|
7
7
|
site: 'boss',
|
|
8
8
|
name: 'greet',
|
package/dist/clis/boss/invite.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* BOSS直聘 invite — send interview invitation to a candidate.
|
|
3
3
|
*/
|
|
4
4
|
import { cli, Strategy } from '../../registry.js';
|
|
5
|
-
import { requirePage, navigateToChat, bossFetch, findFriendByUid, verbose } from './
|
|
5
|
+
import { requirePage, navigateToChat, bossFetch, findFriendByUid, verbose } from './utils.js';
|
|
6
6
|
cli({
|
|
7
7
|
site: 'boss',
|
|
8
8
|
name: 'invite',
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* BOSS直聘 job list — list my published jobs via boss API.
|
|
3
3
|
*/
|
|
4
4
|
import { cli, Strategy } from '../../registry.js';
|
|
5
|
-
import { requirePage, navigateToChat, bossFetch, verbose } from './
|
|
5
|
+
import { requirePage, navigateToChat, bossFetch, verbose } from './utils.js';
|
|
6
6
|
cli({
|
|
7
7
|
site: 'boss',
|
|
8
8
|
name: 'joblist',
|
package/dist/clis/boss/mark.js
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* 6=已交换微信, 7=不合适, 8=牛人发起, 11=收藏
|
|
7
7
|
*/
|
|
8
8
|
import { cli, Strategy } from '../../registry.js';
|
|
9
|
-
import { requirePage, navigateToChat, bossFetch, findFriendByUid, verbose } from './
|
|
9
|
+
import { requirePage, navigateToChat, bossFetch, findFriendByUid, verbose } from './utils.js';
|
|
10
|
+
import { ArgumentError, EmptyResultError } from '../../errors.js';
|
|
10
11
|
const LABEL_MAP = {
|
|
11
12
|
'新招呼': 1, '沟通中': 2, '已约面': 3, '已获取简历': 4,
|
|
12
13
|
'已交换电话': 5, '已交换微信': 6, '不合适': 7, '牛人发起': 8, '收藏': 11,
|
|
@@ -43,14 +44,14 @@ cli({
|
|
|
43
44
|
labelId = entry[1];
|
|
44
45
|
}
|
|
45
46
|
else {
|
|
46
|
-
throw new
|
|
47
|
+
throw new ArgumentError(`未知标签: ${labelInput}。可用标签: ${Object.keys(LABEL_MAP).join(', ')}`);
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
50
|
verbose(`${remove ? 'Removing' : 'Adding'} label ${labelId} for ${kwargs.uid}...`);
|
|
50
51
|
await navigateToChat(page);
|
|
51
52
|
const friend = await findFriendByUid(page, kwargs.uid, { checkGreetList: true });
|
|
52
53
|
if (!friend)
|
|
53
|
-
throw new
|
|
54
|
+
throw new EmptyResultError('boss candidate search');
|
|
54
55
|
const friendName = friend.name || '候选人';
|
|
55
56
|
const action = remove ? 'deleteMark' : 'addMark';
|
|
56
57
|
const params = new URLSearchParams({
|