@jackwener/opencli 1.1.0 → 1.2.0
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/.agents/skills/cross-project-adapter-migration/SKILL.md +2 -2
- package/.github/pull_request_template.md +7 -0
- package/.github/workflows/doc-check.yml +36 -0
- package/.github/workflows/docs.yml +7 -42
- package/CHANGELOG.md +23 -0
- package/CLI-EXPLORER.md +9 -8
- package/CONTRIBUTING.md +39 -1
- package/README.md +33 -19
- package/README.zh-CN.md +64 -27
- package/SKILL.md +102 -33
- package/dist/browser/cdp.d.ts +4 -4
- package/dist/browser/cdp.js +45 -17
- package/dist/browser/daemon-client.d.ts +2 -1
- package/dist/browser/dom-helpers.js +38 -7
- package/dist/browser/dom-snapshot.d.ts +86 -0
- package/dist/browser/dom-snapshot.js +729 -0
- package/dist/browser/dom-snapshot.test.d.ts +11 -0
- package/dist/browser/dom-snapshot.test.js +212 -0
- package/dist/browser/index.d.ts +2 -0
- package/dist/browser/index.js +1 -0
- package/dist/browser/page.d.ts +18 -25
- package/dist/browser/page.js +44 -5
- package/dist/build-manifest.d.ts +11 -4
- package/dist/build-manifest.js +79 -34
- package/dist/build-manifest.test.js +58 -2
- package/dist/cli-manifest.json +4273 -1771
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +255 -162
- package/dist/clis/apple-podcasts/commands.test.d.ts +2 -0
- package/dist/clis/apple-podcasts/commands.test.js +76 -0
- package/dist/clis/apple-podcasts/search.js +2 -2
- package/dist/clis/apple-podcasts/top.js +9 -2
- package/dist/clis/arxiv/search.js +1 -1
- package/dist/clis/barchart/greeks.js +1 -1
- package/dist/clis/barchart/options.js +1 -1
- package/dist/clis/barchart/quote.js +1 -1
- package/dist/clis/bilibili/download.js +1 -1
- package/dist/clis/bilibili/dynamic.js +1 -1
- package/dist/clis/bilibili/favorite.js +1 -1
- package/dist/clis/bilibili/feed.js +1 -1
- package/dist/clis/bilibili/following.js +2 -2
- package/dist/clis/bilibili/history.js +1 -1
- package/dist/clis/bilibili/me.js +1 -1
- package/dist/clis/bilibili/ranking.js +1 -1
- package/dist/clis/bilibili/search.js +3 -3
- package/dist/clis/bilibili/subtitle.js +2 -2
- package/dist/clis/bilibili/user-videos.js +2 -2
- package/dist/{bilibili.d.ts → clis/bilibili/utils.d.ts} +1 -1
- package/dist/clis/bloomberg/businessweek.js +17 -0
- package/dist/clis/bloomberg/economics.js +17 -0
- package/dist/clis/bloomberg/feeds.d.ts +1 -0
- package/dist/clis/bloomberg/feeds.js +15 -0
- package/dist/clis/bloomberg/industries.d.ts +1 -0
- package/dist/clis/bloomberg/industries.js +17 -0
- package/dist/clis/bloomberg/main.d.ts +1 -0
- package/dist/clis/bloomberg/main.js +17 -0
- package/dist/clis/bloomberg/markets.d.ts +1 -0
- package/dist/clis/bloomberg/markets.js +17 -0
- package/dist/clis/bloomberg/news.d.ts +1 -0
- package/dist/clis/bloomberg/news.js +105 -0
- package/dist/clis/bloomberg/opinions.d.ts +1 -0
- package/dist/clis/bloomberg/opinions.js +17 -0
- package/dist/clis/bloomberg/politics.d.ts +1 -0
- package/dist/clis/bloomberg/politics.js +17 -0
- package/dist/clis/bloomberg/tech.d.ts +1 -0
- package/dist/clis/bloomberg/tech.js +17 -0
- package/dist/clis/bloomberg/utils.d.ts +34 -0
- package/dist/clis/bloomberg/utils.js +364 -0
- package/dist/clis/bloomberg/utils.test.d.ts +1 -0
- package/dist/clis/bloomberg/utils.test.js +129 -0
- package/dist/clis/boss/batchgreet.js +12 -99
- package/dist/clis/boss/chatlist.js +9 -26
- package/dist/clis/boss/chatmsg.js +11 -42
- package/dist/clis/boss/common.d.ts +92 -0
- package/dist/clis/boss/common.js +223 -0
- package/dist/clis/boss/detail.js +8 -50
- package/dist/clis/boss/exchange.js +13 -79
- package/dist/clis/boss/greet.js +20 -147
- package/dist/clis/boss/invite.js +26 -121
- package/dist/clis/boss/joblist.js +6 -31
- package/dist/clis/boss/mark.js +12 -85
- package/dist/clis/boss/recommend.js +10 -49
- package/dist/clis/boss/resume.js +18 -118
- package/dist/clis/boss/search.js +13 -61
- package/dist/clis/boss/send.js +18 -152
- package/dist/clis/boss/stats.js +20 -71
- package/dist/clis/chaoxing/assignments.js +1 -1
- package/dist/clis/chaoxing/exams.js +1 -1
- package/dist/{chaoxing.d.ts → clis/chaoxing/utils.d.ts} +1 -1
- package/dist/{chaoxing.js → clis/chaoxing/utils.js} +0 -2
- package/dist/clis/chaoxing/utils.test.d.ts +1 -0
- package/dist/{chaoxing.test.js → clis/chaoxing/utils.test.js} +1 -1
- package/dist/clis/chatgpt/read.js +1 -1
- package/dist/clis/chatwise/export.js +1 -1
- package/dist/clis/chatwise/model.js +2 -2
- package/dist/clis/chatwise/screenshot.js +1 -1
- package/dist/clis/codex/export.js +1 -1
- package/dist/clis/codex/model.js +2 -2
- package/dist/clis/codex/screenshot.js +1 -1
- package/dist/clis/coupang/add-to-cart.js +3 -4
- package/dist/clis/coupang/search.js +2 -4
- package/dist/clis/coupang/utils.test.d.ts +1 -0
- package/dist/{coupang.test.js → clis/coupang/utils.test.js} +1 -1
- package/dist/clis/ctrip/search.js +1 -1
- package/dist/clis/cursor/export.js +1 -1
- package/dist/clis/cursor/model.js +2 -2
- package/dist/clis/cursor/screenshot.js +1 -1
- package/dist/clis/devto/tag.yaml +34 -0
- package/dist/clis/devto/top.yaml +29 -0
- package/dist/clis/devto/user.yaml +33 -0
- package/dist/clis/douban/book-hot.d.ts +1 -0
- package/dist/clis/douban/book-hot.js +14 -0
- package/dist/clis/douban/marks.d.ts +1 -0
- package/dist/clis/douban/marks.js +115 -0
- package/dist/clis/douban/movie-hot.d.ts +1 -0
- package/dist/clis/douban/movie-hot.js +14 -0
- package/dist/clis/douban/reviews.d.ts +1 -0
- package/dist/clis/douban/reviews.js +106 -0
- package/dist/clis/douban/search.d.ts +1 -0
- package/dist/clis/douban/search.js +16 -0
- package/dist/clis/douban/shared.d.ts +4 -0
- package/dist/clis/douban/shared.js +155 -0
- package/dist/clis/douban/subject.yaml +76 -0
- package/dist/clis/douban/top250.yaml +70 -0
- package/dist/clis/douban/utils.d.ts +35 -0
- package/dist/clis/douban/utils.js +48 -0
- package/dist/clis/facebook/add-friend.yaml +43 -0
- package/dist/clis/facebook/events.yaml +44 -0
- package/dist/clis/facebook/feed.yaml +63 -0
- package/dist/clis/facebook/friends.yaml +42 -0
- package/dist/clis/facebook/groups.yaml +50 -0
- package/dist/clis/facebook/join-group.yaml +44 -0
- package/dist/clis/facebook/memories.yaml +39 -0
- package/dist/clis/facebook/notifications.yaml +40 -0
- package/dist/clis/facebook/profile.yaml +37 -0
- package/dist/clis/facebook/search.yaml +46 -0
- package/dist/clis/google/news.d.ts +5 -0
- package/dist/clis/google/news.js +58 -0
- package/dist/clis/google/search.d.ts +10 -0
- package/dist/clis/google/search.js +127 -0
- package/dist/clis/google/suggest.d.ts +5 -0
- package/dist/clis/google/suggest.js +34 -0
- package/dist/clis/google/trends.d.ts +5 -0
- package/dist/clis/google/trends.js +38 -0
- package/dist/clis/google/utils.d.ts +9 -0
- package/dist/clis/google/utils.js +23 -0
- package/dist/clis/google/utils.test.d.ts +1 -0
- package/dist/clis/google/utils.test.js +75 -0
- package/dist/clis/grok/ask.d.ts +14 -0
- package/dist/clis/grok/ask.js +257 -65
- package/dist/clis/grok/ask.test.d.ts +1 -0
- package/dist/clis/grok/ask.test.js +36 -0
- package/dist/clis/instagram/comment.yaml +52 -0
- package/dist/clis/instagram/explore.yaml +43 -0
- package/dist/clis/instagram/follow.yaml +41 -0
- package/dist/clis/instagram/followers.yaml +51 -0
- package/dist/clis/instagram/following.yaml +51 -0
- package/dist/clis/instagram/like.yaml +46 -0
- package/dist/clis/instagram/profile.yaml +42 -0
- package/dist/clis/instagram/save.yaml +46 -0
- package/dist/clis/instagram/saved.yaml +40 -0
- package/dist/clis/instagram/search.yaml +43 -0
- package/dist/clis/instagram/unfollow.yaml +38 -0
- package/dist/clis/instagram/unlike.yaml +46 -0
- package/dist/clis/instagram/unsave.yaml +46 -0
- package/dist/clis/instagram/user.yaml +54 -0
- package/dist/clis/jike/comment.js +2 -3
- package/dist/clis/jike/create.js +1 -2
- package/dist/clis/jike/feed.js +0 -1
- package/dist/clis/jike/like.js +1 -2
- package/dist/clis/jike/notifications.js +0 -1
- package/dist/clis/jike/post.yaml +1 -0
- package/dist/clis/jike/repost.js +2 -3
- package/dist/clis/jike/search.js +2 -3
- package/dist/clis/jike/topic.yaml +1 -0
- package/dist/clis/jike/user.yaml +1 -0
- package/dist/clis/jimeng/generate.yaml +1 -0
- package/dist/clis/jimeng/history.yaml +0 -1
- package/dist/clis/linkedin/search.js +7 -7
- package/dist/clis/linux-do/category.yaml +2 -0
- package/dist/clis/linux-do/search.yaml +4 -3
- package/dist/clis/linux-do/topic.yaml +1 -0
- package/dist/clis/lobsters/active.yaml +29 -0
- package/dist/clis/lobsters/hot.yaml +29 -0
- package/dist/clis/lobsters/newest.yaml +29 -0
- package/dist/clis/lobsters/tag.yaml +34 -0
- package/dist/clis/medium/feed.d.ts +1 -0
- package/dist/clis/medium/feed.js +15 -0
- package/dist/clis/medium/search.d.ts +1 -0
- package/dist/clis/medium/search.js +15 -0
- package/dist/clis/medium/shared.d.ts +5 -0
- package/dist/clis/medium/shared.js +78 -0
- package/dist/clis/medium/user.d.ts +1 -0
- package/dist/clis/medium/user.js +15 -0
- package/dist/clis/notion/export.js +1 -1
- package/dist/clis/reddit/comment.js +3 -4
- package/dist/clis/reddit/read.js +4 -5
- package/dist/clis/reddit/save.js +2 -3
- package/dist/clis/reddit/saved.js +0 -1
- package/dist/clis/reddit/search.yaml +1 -0
- package/dist/clis/reddit/subreddit.yaml +1 -0
- package/dist/clis/reddit/subscribe.js +1 -2
- package/dist/clis/reddit/upvote.js +2 -3
- package/dist/clis/reddit/upvoted.js +0 -1
- package/dist/clis/reddit/user-comments.yaml +1 -0
- package/dist/clis/reddit/user-posts.yaml +1 -0
- package/dist/clis/reddit/user.yaml +1 -0
- package/dist/clis/reuters/search.js +1 -1
- package/dist/clis/sinablog/article.d.ts +1 -0
- package/dist/clis/sinablog/article.js +14 -0
- package/dist/clis/sinablog/hot.d.ts +1 -0
- package/dist/clis/sinablog/hot.js +14 -0
- package/dist/clis/sinablog/search.d.ts +1 -0
- package/dist/clis/sinablog/search.js +51 -0
- package/dist/clis/sinablog/shared.d.ts +7 -0
- package/dist/clis/sinablog/shared.js +187 -0
- package/dist/clis/sinablog/user.d.ts +1 -0
- package/dist/clis/sinablog/user.js +15 -0
- package/dist/clis/smzdm/search.js +2 -3
- package/dist/clis/stackoverflow/search.yaml +1 -0
- package/dist/clis/steam/top-sellers.yaml +29 -0
- package/dist/clis/substack/feed.d.ts +1 -0
- package/dist/clis/substack/feed.js +15 -0
- package/dist/clis/substack/publication.d.ts +1 -0
- package/dist/clis/substack/publication.js +15 -0
- package/dist/clis/substack/search.d.ts +1 -0
- package/dist/clis/substack/search.js +77 -0
- package/dist/clis/substack/shared.d.ts +4 -0
- package/dist/clis/substack/shared.js +129 -0
- package/dist/clis/tiktok/comment.yaml +66 -0
- package/dist/clis/tiktok/explore.yaml +39 -0
- package/dist/clis/tiktok/follow.yaml +39 -0
- package/dist/clis/tiktok/following.yaml +46 -0
- package/dist/clis/tiktok/friends.yaml +47 -0
- package/dist/clis/tiktok/like.yaml +38 -0
- package/dist/clis/tiktok/live.yaml +51 -0
- package/dist/clis/tiktok/notifications.yaml +52 -0
- package/dist/clis/tiktok/profile.yaml +45 -0
- package/dist/clis/tiktok/save.yaml +34 -0
- package/dist/clis/tiktok/search.yaml +46 -0
- package/dist/clis/tiktok/unfollow.yaml +44 -0
- package/dist/clis/tiktok/unlike.yaml +38 -0
- package/dist/clis/tiktok/unsave.yaml +36 -0
- package/dist/clis/tiktok/user.yaml +44 -0
- package/dist/clis/twitter/accept.js +2 -2
- package/dist/clis/twitter/article.js +2 -2
- package/dist/clis/twitter/block.d.ts +1 -0
- package/dist/clis/twitter/block.js +88 -0
- package/dist/clis/twitter/delete.js +1 -1
- package/dist/clis/twitter/download.d.ts +1 -1
- package/dist/clis/twitter/download.js +3 -3
- package/dist/clis/twitter/followers.js +1 -1
- package/dist/clis/twitter/following.js +1 -1
- package/dist/clis/twitter/hide-reply.d.ts +1 -0
- package/dist/clis/twitter/hide-reply.js +66 -0
- package/dist/clis/twitter/like.js +1 -1
- package/dist/clis/twitter/post.js +1 -1
- package/dist/clis/twitter/reply-dm.js +1 -1
- package/dist/clis/twitter/reply.js +2 -2
- package/dist/clis/twitter/search.js +1 -1
- package/dist/clis/twitter/thread.js +2 -2
- package/dist/clis/twitter/timeline.d.ts +23 -0
- package/dist/clis/twitter/timeline.js +42 -14
- package/dist/clis/twitter/timeline.test.d.ts +1 -0
- package/dist/clis/twitter/timeline.test.js +102 -0
- package/dist/clis/twitter/trending.d.ts +1 -0
- package/dist/clis/twitter/trending.js +91 -0
- package/dist/clis/twitter/unblock.d.ts +1 -0
- package/dist/clis/twitter/unblock.js +71 -0
- package/dist/clis/v2ex/topic.yaml +1 -0
- package/dist/clis/weibo/hot.js +0 -1
- package/dist/clis/weread/book.js +1 -1
- package/dist/clis/weread/highlights.js +1 -1
- package/dist/clis/weread/notes.js +1 -1
- package/dist/clis/weread/search.js +1 -1
- package/dist/clis/wikipedia/random.d.ts +1 -0
- package/dist/clis/wikipedia/random.js +19 -0
- package/dist/clis/wikipedia/search.js +4 -4
- package/dist/clis/wikipedia/summary.js +4 -9
- package/dist/clis/wikipedia/trending.d.ts +1 -0
- package/dist/clis/wikipedia/trending.js +35 -0
- package/dist/clis/wikipedia/utils.d.ts +28 -0
- package/dist/clis/wikipedia/utils.js +13 -0
- package/dist/clis/xiaohongshu/creator-note-detail.d.ts +15 -0
- package/dist/clis/xiaohongshu/creator-note-detail.js +69 -5
- package/dist/clis/xiaohongshu/creator-note-detail.test.js +82 -33
- package/dist/clis/xiaohongshu/creator-notes.js +35 -5
- package/dist/clis/xiaohongshu/creator-notes.test.js +37 -6
- package/dist/clis/xiaohongshu/creator-profile.js +0 -1
- package/dist/clis/xiaohongshu/creator-stats.js +0 -1
- package/dist/clis/xiaohongshu/download.js +2 -3
- package/dist/clis/xiaohongshu/feed.yaml +0 -1
- package/dist/clis/xiaohongshu/notifications.yaml +0 -1
- package/dist/clis/xiaohongshu/search.js +2 -2
- package/dist/clis/xiaohongshu/user.js +1 -2
- package/dist/clis/xueqiu/earnings-date.yaml +69 -0
- package/dist/clis/xueqiu/search.yaml +2 -1
- package/dist/clis/xueqiu/stock.yaml +2 -0
- package/dist/clis/yahoo-finance/quote.js +1 -2
- package/dist/clis/youtube/search.js +1 -1
- package/dist/clis/youtube/transcript.js +1 -1
- package/dist/clis/youtube/video.js +1 -1
- package/dist/clis/zhihu/download.js +1 -2
- package/dist/clis/zhihu/question.js +1 -1
- package/dist/clis/zhihu/search.yaml +4 -3
- package/dist/commanderAdapter.d.ts +21 -0
- package/dist/commanderAdapter.js +117 -0
- package/dist/{engine.d.ts → discovery.d.ts} +6 -4
- package/dist/{engine.js → discovery.js} +93 -104
- package/dist/doctor.js +3 -1
- package/dist/doctor.test.js +46 -2
- package/dist/download/index.d.ts +2 -6
- package/dist/download/index.js +19 -46
- package/dist/engine.test.d.ts +0 -3
- package/dist/engine.test.js +80 -11
- package/dist/execution.d.ts +24 -0
- package/dist/execution.js +153 -0
- package/dist/explore.d.ts +76 -3
- package/dist/explore.js +132 -111
- package/dist/external-clis.yaml +48 -0
- package/dist/external.d.ts +7 -2
- package/dist/external.js +11 -14
- package/dist/generate.d.ts +41 -2
- package/dist/generate.js +5 -4
- package/dist/main.js +2 -1
- package/dist/pipeline/executor.d.ts +2 -2
- package/dist/pipeline/executor.js +2 -2
- package/dist/pipeline/executor.test.js +33 -6
- package/dist/pipeline/registry.d.ts +1 -1
- package/dist/pipeline/steps/browser.d.ts +7 -7
- package/dist/pipeline/steps/browser.js +21 -7
- package/dist/pipeline/steps/fetch.d.ts +1 -1
- package/dist/pipeline/steps/fetch.js +11 -7
- package/dist/pipeline/steps/transform.d.ts +6 -5
- package/dist/pipeline/steps/transform.js +30 -9
- package/dist/pipeline/template.d.ts +6 -6
- package/dist/pipeline/template.js +43 -5
- package/dist/pipeline/template.test.js +18 -0
- package/dist/pipeline/transform.test.js +11 -0
- package/dist/plugin.d.ts +31 -0
- package/dist/plugin.js +216 -0
- package/dist/plugin.test.d.ts +4 -0
- package/dist/plugin.test.js +76 -0
- package/dist/registry-api.d.ts +11 -0
- package/dist/registry-api.js +9 -0
- package/dist/registry.d.ts +13 -0
- package/dist/registry.js +8 -1
- package/dist/runtime.d.ts +5 -0
- package/dist/runtime.js +8 -0
- package/dist/serialization.d.ts +34 -0
- package/dist/serialization.js +63 -0
- package/dist/synthesize.d.ts +94 -4
- package/dist/synthesize.js +5 -4
- package/dist/types.d.ts +43 -27
- package/dist/validate.js +8 -2
- package/docs/.vitepress/config.mts +20 -7
- package/docs/adapters/browser/arxiv.md +27 -0
- package/docs/adapters/browser/barchart.md +33 -0
- package/docs/adapters/browser/bilibili.md +9 -0
- package/docs/adapters/browser/bloomberg.md +70 -0
- package/docs/adapters/browser/chaoxing.md +39 -0
- package/docs/adapters/browser/devto.md +35 -0
- package/docs/adapters/browser/douban.md +38 -0
- package/docs/adapters/browser/facebook.md +36 -0
- package/docs/adapters/browser/google.md +62 -0
- package/docs/adapters/browser/grok.md +53 -0
- package/docs/adapters/browser/hf.md +42 -0
- package/docs/adapters/browser/instagram.md +46 -0
- package/docs/adapters/browser/jike.md +45 -0
- package/docs/adapters/browser/jimeng.md +39 -0
- package/docs/adapters/browser/linux-do.md +45 -0
- package/docs/adapters/browser/lobsters.md +32 -0
- package/docs/adapters/browser/medium.md +32 -0
- package/docs/adapters/browser/reddit.md +9 -0
- package/docs/adapters/browser/sinablog.md +36 -0
- package/docs/adapters/browser/sinafinance.md +35 -0
- package/docs/adapters/browser/stackoverflow.md +35 -0
- package/docs/adapters/browser/steam.md +26 -0
- package/docs/adapters/browser/substack.md +38 -0
- package/docs/adapters/browser/tiktok.md +68 -0
- package/docs/adapters/browser/twitter.md +3 -0
- package/docs/adapters/browser/weread.md +48 -0
- package/docs/adapters/browser/wikipedia.md +39 -0
- package/docs/adapters/browser/xiaohongshu.md +5 -1
- package/docs/adapters/browser/xueqiu.md +10 -0
- package/docs/adapters/browser/yahoo-finance.md +6 -5
- package/docs/adapters/desktop/antigravity.md +6 -0
- package/docs/adapters/desktop/chatgpt.md +5 -4
- package/docs/adapters/desktop/codex.md +5 -1
- package/docs/adapters/desktop/cursor.md +4 -0
- package/docs/adapters/desktop/discord.md +7 -7
- package/docs/adapters/index.md +14 -4
- package/docs/advanced/download.md +4 -4
- package/docs/developer/architecture.md +17 -4
- package/docs/guide/getting-started.md +1 -0
- package/docs/guide/plugins.md +153 -0
- package/docs/zh/guide/plugins.md +107 -0
- package/extension/src/background.ts +18 -11
- package/package.json +10 -5
- package/scripts/check-doc-coverage.sh +69 -0
- package/scripts/clean-dist.cjs +13 -0
- package/scripts/copy-yaml.cjs +7 -0
- package/src/browser/cdp.ts +77 -32
- package/src/browser/daemon-client.ts +2 -1
- package/src/browser/dom-helpers.ts +38 -7
- package/src/browser/dom-snapshot.test.ts +249 -0
- package/src/browser/dom-snapshot.ts +770 -0
- package/src/browser/index.ts +2 -0
- package/src/browser/page.ts +57 -20
- package/src/build-manifest.test.ts +70 -2
- package/src/build-manifest.ts +114 -40
- package/src/cli.ts +287 -139
- package/src/clis/apple-podcasts/commands.test.ts +95 -0
- package/src/clis/apple-podcasts/search.ts +2 -2
- package/src/clis/apple-podcasts/top.ts +12 -2
- package/src/clis/arxiv/search.ts +1 -1
- package/src/clis/barchart/greeks.ts +1 -1
- package/src/clis/barchart/options.ts +1 -1
- package/src/clis/barchart/quote.ts +1 -1
- package/src/clis/bilibili/download.ts +1 -1
- package/src/clis/bilibili/dynamic.ts +1 -1
- package/src/clis/bilibili/favorite.ts +1 -1
- package/src/clis/bilibili/feed.ts +1 -1
- package/src/clis/bilibili/following.ts +2 -2
- package/src/clis/bilibili/history.ts +1 -1
- package/src/clis/bilibili/me.ts +1 -1
- package/src/clis/bilibili/ranking.ts +1 -1
- package/src/clis/bilibili/search.ts +3 -3
- package/src/clis/bilibili/subtitle.ts +2 -2
- package/src/clis/bilibili/user-videos.ts +2 -2
- package/src/{bilibili.ts → clis/bilibili/utils.ts} +1 -1
- package/src/clis/bloomberg/businessweek.ts +18 -0
- package/src/clis/bloomberg/economics.ts +18 -0
- package/src/clis/bloomberg/feeds.ts +16 -0
- package/src/clis/bloomberg/industries.ts +18 -0
- package/src/clis/bloomberg/main.ts +18 -0
- package/src/clis/bloomberg/markets.ts +18 -0
- package/src/clis/bloomberg/news.ts +136 -0
- package/src/clis/bloomberg/opinions.ts +18 -0
- package/src/clis/bloomberg/politics.ts +18 -0
- package/src/clis/bloomberg/tech.ts +18 -0
- package/src/clis/bloomberg/utils.test.ts +135 -0
- package/src/clis/bloomberg/utils.ts +429 -0
- package/src/clis/boss/batchgreet.ts +16 -108
- package/src/clis/boss/chatlist.ts +13 -27
- package/src/clis/boss/chatmsg.ts +16 -40
- package/src/clis/boss/common.ts +287 -0
- package/src/clis/boss/detail.ts +9 -55
- package/src/clis/boss/exchange.ts +15 -89
- package/src/clis/boss/greet.ts +25 -162
- package/src/clis/boss/invite.ts +36 -133
- package/src/clis/boss/joblist.ts +7 -36
- package/src/clis/boss/mark.ts +13 -94
- package/src/clis/boss/recommend.ts +12 -57
- package/src/clis/boss/resume.ts +19 -124
- package/src/clis/boss/search.ts +14 -67
- package/src/clis/boss/send.ts +22 -162
- package/src/clis/boss/stats.ts +21 -76
- package/src/clis/chaoxing/assignments.ts +1 -1
- package/src/clis/chaoxing/exams.ts +1 -1
- package/src/{chaoxing.test.ts → clis/chaoxing/utils.test.ts} +1 -1
- package/src/{chaoxing.ts → clis/chaoxing/utils.ts} +1 -3
- package/src/clis/chatgpt/read.ts +1 -1
- package/src/clis/chatwise/export.ts +1 -1
- package/src/clis/chatwise/model.ts +2 -2
- package/src/clis/chatwise/screenshot.ts +1 -1
- package/src/clis/codex/export.ts +1 -1
- package/src/clis/codex/model.ts +2 -2
- package/src/clis/codex/screenshot.ts +1 -1
- package/src/clis/coupang/add-to-cart.ts +3 -4
- package/src/clis/coupang/search.ts +2 -4
- package/src/{coupang.test.ts → clis/coupang/utils.test.ts} +1 -1
- package/src/clis/ctrip/search.ts +1 -1
- package/src/clis/cursor/export.ts +1 -1
- package/src/clis/cursor/model.ts +2 -2
- package/src/clis/cursor/screenshot.ts +1 -1
- package/src/clis/devto/tag.yaml +34 -0
- package/src/clis/devto/top.yaml +29 -0
- package/src/clis/devto/user.yaml +33 -0
- package/src/clis/douban/book-hot.ts +15 -0
- package/src/clis/douban/marks.ts +135 -0
- package/src/clis/douban/movie-hot.ts +15 -0
- package/src/clis/douban/reviews.ts +127 -0
- package/src/clis/douban/search.ts +17 -0
- package/src/clis/douban/shared.ts +165 -0
- package/src/clis/douban/subject.yaml +76 -0
- package/src/clis/douban/top250.yaml +70 -0
- package/src/clis/douban/utils.ts +81 -0
- package/src/clis/facebook/add-friend.yaml +43 -0
- package/src/clis/facebook/events.yaml +44 -0
- package/src/clis/facebook/feed.yaml +63 -0
- package/src/clis/facebook/friends.yaml +42 -0
- package/src/clis/facebook/groups.yaml +50 -0
- package/src/clis/facebook/join-group.yaml +44 -0
- package/src/clis/facebook/memories.yaml +39 -0
- package/src/clis/facebook/notifications.yaml +40 -0
- package/src/clis/facebook/profile.yaml +37 -0
- package/src/clis/facebook/search.yaml +46 -0
- package/src/clis/google/news.ts +66 -0
- package/src/clis/google/search.ts +133 -0
- package/src/clis/google/suggest.ts +40 -0
- package/src/clis/google/trends.ts +44 -0
- package/src/clis/google/utils.test.ts +82 -0
- package/src/clis/google/utils.ts +24 -0
- package/src/clis/grok/ask.test.ts +53 -0
- package/src/clis/grok/ask.ts +300 -69
- package/src/clis/instagram/comment.yaml +52 -0
- package/src/clis/instagram/explore.yaml +43 -0
- package/src/clis/instagram/follow.yaml +41 -0
- package/src/clis/instagram/followers.yaml +51 -0
- package/src/clis/instagram/following.yaml +51 -0
- package/src/clis/instagram/like.yaml +46 -0
- package/src/clis/instagram/profile.yaml +42 -0
- package/src/clis/instagram/save.yaml +46 -0
- package/src/clis/instagram/saved.yaml +40 -0
- package/src/clis/instagram/search.yaml +43 -0
- package/src/clis/instagram/unfollow.yaml +38 -0
- package/src/clis/instagram/unlike.yaml +46 -0
- package/src/clis/instagram/unsave.yaml +46 -0
- package/src/clis/instagram/user.yaml +54 -0
- package/src/clis/jike/comment.ts +2 -3
- package/src/clis/jike/create.ts +1 -2
- package/src/clis/jike/feed.ts +0 -1
- package/src/clis/jike/like.ts +1 -2
- package/src/clis/jike/notifications.ts +0 -1
- package/src/clis/jike/post.yaml +1 -0
- package/src/clis/jike/repost.ts +2 -3
- package/src/clis/jike/search.ts +2 -3
- package/src/clis/jike/topic.yaml +1 -0
- package/src/clis/jike/user.yaml +1 -0
- package/src/clis/jimeng/generate.yaml +1 -0
- package/src/clis/jimeng/history.yaml +0 -1
- package/src/clis/linkedin/search.ts +7 -7
- package/src/clis/linux-do/category.yaml +2 -0
- package/src/clis/linux-do/search.yaml +4 -3
- package/src/clis/linux-do/topic.yaml +1 -0
- package/src/clis/lobsters/active.yaml +29 -0
- package/src/clis/lobsters/hot.yaml +29 -0
- package/src/clis/lobsters/newest.yaml +29 -0
- package/src/clis/lobsters/tag.yaml +34 -0
- package/src/clis/medium/feed.ts +16 -0
- package/src/clis/medium/search.ts +16 -0
- package/src/clis/medium/shared.ts +83 -0
- package/src/clis/medium/user.ts +16 -0
- package/src/clis/notion/export.ts +1 -1
- package/src/clis/reddit/comment.ts +3 -4
- package/src/clis/reddit/read.ts +4 -5
- package/src/clis/reddit/save.ts +2 -3
- package/src/clis/reddit/saved.ts +0 -1
- package/src/clis/reddit/search.yaml +1 -0
- package/src/clis/reddit/subreddit.yaml +1 -0
- package/src/clis/reddit/subscribe.ts +1 -2
- package/src/clis/reddit/upvote.ts +2 -3
- package/src/clis/reddit/upvoted.ts +0 -1
- package/src/clis/reddit/user-comments.yaml +1 -0
- package/src/clis/reddit/user-posts.yaml +1 -0
- package/src/clis/reddit/user.yaml +1 -0
- package/src/clis/reuters/search.ts +1 -1
- package/src/clis/sinablog/article.ts +15 -0
- package/src/clis/sinablog/hot.ts +15 -0
- package/src/clis/sinablog/search.ts +56 -0
- package/src/clis/sinablog/shared.ts +198 -0
- package/src/clis/sinablog/user.ts +16 -0
- package/src/clis/smzdm/search.ts +2 -3
- package/src/clis/stackoverflow/search.yaml +1 -0
- package/src/clis/steam/top-sellers.yaml +29 -0
- package/src/clis/substack/feed.ts +16 -0
- package/src/clis/substack/publication.ts +16 -0
- package/src/clis/substack/search.ts +91 -0
- package/src/clis/substack/shared.ts +132 -0
- package/src/clis/tiktok/comment.yaml +66 -0
- package/src/clis/tiktok/explore.yaml +39 -0
- package/src/clis/tiktok/follow.yaml +39 -0
- package/src/clis/tiktok/following.yaml +46 -0
- package/src/clis/tiktok/friends.yaml +47 -0
- package/src/clis/tiktok/like.yaml +38 -0
- package/src/clis/tiktok/live.yaml +51 -0
- package/src/clis/tiktok/notifications.yaml +52 -0
- package/src/clis/tiktok/profile.yaml +45 -0
- package/src/clis/tiktok/save.yaml +34 -0
- package/src/clis/tiktok/search.yaml +46 -0
- package/src/clis/tiktok/unfollow.yaml +44 -0
- package/src/clis/tiktok/unlike.yaml +38 -0
- package/src/clis/tiktok/unsave.yaml +36 -0
- package/src/clis/tiktok/user.yaml +44 -0
- package/src/clis/twitter/accept.ts +2 -2
- package/src/clis/twitter/article.ts +2 -2
- package/src/clis/twitter/block.ts +92 -0
- package/src/clis/twitter/delete.ts +1 -1
- package/src/clis/twitter/download.ts +3 -3
- package/src/clis/twitter/followers.ts +1 -1
- package/src/clis/twitter/following.ts +1 -1
- package/src/clis/twitter/hide-reply.ts +70 -0
- package/src/clis/twitter/like.ts +1 -1
- package/src/clis/twitter/post.ts +1 -1
- package/src/clis/twitter/reply-dm.ts +1 -1
- package/src/clis/twitter/reply.ts +2 -2
- package/src/clis/twitter/search.ts +1 -1
- package/src/clis/twitter/thread.ts +2 -2
- package/src/clis/twitter/timeline.test.ts +109 -0
- package/src/clis/twitter/timeline.ts +59 -19
- package/src/clis/twitter/trending.ts +113 -0
- package/src/clis/twitter/unblock.ts +75 -0
- package/src/clis/v2ex/topic.yaml +1 -0
- package/src/clis/weibo/hot.ts +0 -1
- package/src/clis/weread/book.ts +1 -1
- package/src/clis/weread/highlights.ts +1 -1
- package/src/clis/weread/notes.ts +1 -1
- package/src/clis/weread/search.ts +1 -1
- package/src/clis/wikipedia/random.ts +19 -0
- package/src/clis/wikipedia/search.ts +11 -5
- package/src/clis/wikipedia/summary.ts +4 -9
- package/src/clis/wikipedia/trending.ts +41 -0
- package/src/clis/wikipedia/utils.ts +31 -0
- package/src/clis/xiaohongshu/creator-note-detail.test.ts +84 -33
- package/src/clis/xiaohongshu/creator-note-detail.ts +89 -5
- package/src/clis/xiaohongshu/creator-notes.test.ts +41 -6
- package/src/clis/xiaohongshu/creator-notes.ts +44 -5
- package/src/clis/xiaohongshu/creator-profile.ts +0 -1
- package/src/clis/xiaohongshu/creator-stats.ts +0 -1
- package/src/clis/xiaohongshu/download.ts +2 -3
- package/src/clis/xiaohongshu/feed.yaml +0 -1
- package/src/clis/xiaohongshu/notifications.yaml +0 -1
- package/src/clis/xiaohongshu/search.ts +2 -2
- package/src/clis/xiaohongshu/user.ts +1 -2
- package/src/clis/xueqiu/earnings-date.yaml +69 -0
- package/src/clis/xueqiu/search.yaml +2 -1
- package/src/clis/xueqiu/stock.yaml +2 -0
- package/src/clis/yahoo-finance/quote.ts +1 -2
- package/src/clis/youtube/search.ts +1 -1
- package/src/clis/youtube/transcript.ts +1 -1
- package/src/clis/youtube/video.ts +1 -1
- package/src/clis/zhihu/download.ts +1 -2
- package/src/clis/zhihu/question.ts +1 -1
- package/src/clis/zhihu/search.yaml +4 -3
- package/src/commanderAdapter.ts +120 -0
- package/src/discovery.ts +277 -0
- package/src/doctor.test.ts +59 -2
- package/src/doctor.ts +4 -2
- package/src/download/index.ts +21 -54
- package/src/engine.test.ts +85 -11
- package/src/execution.ts +164 -0
- package/src/explore.ts +211 -117
- package/src/external-clis.yaml +9 -0
- package/src/external.ts +15 -12
- package/src/generate.ts +58 -9
- package/src/main.ts +2 -1
- package/src/pipeline/executor.test.ts +35 -6
- package/src/pipeline/executor.ts +11 -7
- package/src/pipeline/registry.ts +3 -3
- package/src/pipeline/steps/browser.ts +29 -15
- package/src/pipeline/steps/fetch.ts +18 -13
- package/src/pipeline/steps/transform.ts +40 -15
- package/src/pipeline/template.test.ts +18 -0
- package/src/pipeline/template.ts +86 -13
- package/src/pipeline/transform.test.ts +15 -2
- package/src/plugin.test.ts +86 -0
- package/src/plugin.ts +254 -0
- package/src/registry-api.ts +12 -0
- package/src/registry.ts +24 -1
- package/src/runtime.ts +9 -0
- package/src/serialization.ts +79 -0
- package/src/synthesize.ts +102 -21
- package/src/types.ts +45 -13
- package/src/validate.ts +19 -4
- package/tests/e2e/browser-public.test.ts +36 -0
- package/tests/e2e/public-commands.test.ts +119 -1
- package/dist/clis/feishu/new.d.ts +0 -1
- package/dist/clis/feishu/new.js +0 -27
- package/dist/clis/feishu/read.d.ts +0 -1
- package/dist/clis/feishu/read.js +0 -40
- package/dist/clis/feishu/search.d.ts +0 -1
- package/dist/clis/feishu/search.js +0 -30
- package/dist/clis/feishu/send.d.ts +0 -1
- package/dist/clis/feishu/send.js +0 -39
- package/dist/clis/feishu/status.d.ts +0 -1
- package/dist/clis/feishu/status.js +0 -28
- package/dist/clis/neteasemusic/like.d.ts +0 -1
- package/dist/clis/neteasemusic/like.js +0 -25
- package/dist/clis/neteasemusic/lyrics.d.ts +0 -1
- package/dist/clis/neteasemusic/lyrics.js +0 -47
- package/dist/clis/neteasemusic/next.d.ts +0 -1
- package/dist/clis/neteasemusic/next.js +0 -26
- package/dist/clis/neteasemusic/play.d.ts +0 -1
- package/dist/clis/neteasemusic/play.js +0 -26
- package/dist/clis/neteasemusic/playing.d.ts +0 -1
- package/dist/clis/neteasemusic/playing.js +0 -59
- package/dist/clis/neteasemusic/playlist.d.ts +0 -1
- package/dist/clis/neteasemusic/playlist.js +0 -46
- package/dist/clis/neteasemusic/prev.d.ts +0 -1
- package/dist/clis/neteasemusic/prev.js +0 -25
- package/dist/clis/neteasemusic/search.d.ts +0 -1
- package/dist/clis/neteasemusic/search.js +0 -52
- package/dist/clis/neteasemusic/status.d.ts +0 -1
- package/dist/clis/neteasemusic/status.js +0 -16
- package/dist/clis/neteasemusic/volume.d.ts +0 -1
- package/dist/clis/neteasemusic/volume.js +0 -54
- package/dist/clis/twitter/trending.yaml +0 -46
- package/dist/clis/wechat/chats.d.ts +0 -1
- package/dist/clis/wechat/chats.js +0 -28
- package/dist/clis/wechat/contacts.d.ts +0 -1
- package/dist/clis/wechat/contacts.js +0 -28
- package/dist/clis/wechat/read.d.ts +0 -1
- package/dist/clis/wechat/read.js +0 -58
- package/dist/clis/wechat/search.d.ts +0 -1
- package/dist/clis/wechat/search.js +0 -31
- package/dist/clis/wechat/send.d.ts +0 -1
- package/dist/clis/wechat/send.js +0 -42
- package/dist/clis/wechat/status.d.ts +0 -1
- package/dist/clis/wechat/status.js +0 -29
- package/dist/pipeline.d.ts +0 -7
- package/dist/pipeline.js +0 -7
- package/docs/adapters/browser/github.md +0 -26
- package/docs/adapters/desktop/feishu.md +0 -20
- package/docs/adapters/desktop/neteasemusic.md +0 -31
- package/docs/adapters/desktop/wechat.md +0 -28
- package/docs/public/CNAME +0 -1
- package/src/clis/antigravity/README.md +0 -5
- package/src/clis/antigravity/README.zh-CN.md +0 -51
- package/src/clis/chaoxing/README.md +0 -14
- package/src/clis/chaoxing/README.zh-CN.md +0 -35
- package/src/clis/chatgpt/README.md +0 -5
- package/src/clis/chatgpt/README.zh-CN.md +0 -44
- package/src/clis/chatwise/README.md +0 -5
- package/src/clis/chatwise/README.zh-CN.md +0 -38
- package/src/clis/codex/README.md +0 -5
- package/src/clis/codex/README.zh-CN.md +0 -33
- package/src/clis/cursor/README.md +0 -5
- package/src/clis/cursor/README.zh-CN.md +0 -33
- package/src/clis/discord-app/README.md +0 -5
- package/src/clis/discord-app/README.zh-CN.md +0 -28
- package/src/clis/feishu/README.md +0 -5
- package/src/clis/feishu/README.zh-CN.md +0 -20
- package/src/clis/feishu/new.ts +0 -32
- package/src/clis/feishu/read.ts +0 -48
- package/src/clis/feishu/search.ts +0 -35
- package/src/clis/feishu/send.ts +0 -46
- package/src/clis/feishu/status.ts +0 -34
- package/src/clis/neteasemusic/README.md +0 -5
- package/src/clis/neteasemusic/README.zh-CN.md +0 -31
- package/src/clis/neteasemusic/like.ts +0 -28
- package/src/clis/neteasemusic/lyrics.ts +0 -53
- package/src/clis/neteasemusic/next.ts +0 -30
- package/src/clis/neteasemusic/play.ts +0 -30
- package/src/clis/neteasemusic/playing.ts +0 -62
- package/src/clis/neteasemusic/playlist.ts +0 -51
- package/src/clis/neteasemusic/prev.ts +0 -29
- package/src/clis/neteasemusic/search.ts +0 -58
- package/src/clis/neteasemusic/status.ts +0 -18
- package/src/clis/neteasemusic/volume.ts +0 -61
- package/src/clis/notion/README.md +0 -5
- package/src/clis/notion/README.zh-CN.md +0 -29
- package/src/clis/twitter/trending.yaml +0 -46
- package/src/clis/wechat/README.md +0 -5
- package/src/clis/wechat/README.zh-CN.md +0 -28
- package/src/clis/wechat/chats.ts +0 -33
- package/src/clis/wechat/contacts.ts +0 -33
- package/src/clis/wechat/read.ts +0 -72
- package/src/clis/wechat/search.ts +0 -36
- package/src/clis/wechat/send.ts +0 -49
- package/src/clis/wechat/status.ts +0 -35
- package/src/engine.ts +0 -274
- package/src/pipeline.ts +0 -8
- /package/dist/{bilibili.js → clis/bilibili/utils.js} +0 -0
- /package/dist/{chaoxing.test.d.ts → clis/bloomberg/businessweek.d.ts} +0 -0
- /package/dist/{coupang.test.d.ts → clis/bloomberg/economics.d.ts} +0 -0
- /package/dist/{coupang.d.ts → clis/coupang/utils.d.ts} +0 -0
- /package/dist/{coupang.js → clis/coupang/utils.js} +0 -0
- /package/src/{coupang.ts → clis/coupang/utils.ts} +0 -0
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# Notion 桌面端适配器
|
|
2
|
-
|
|
3
|
-
通过 Chrome DevTools Protocol (CDP) 在终端中控制 **Notion 桌面应用**。
|
|
4
|
-
|
|
5
|
-
## 前置条件
|
|
6
|
-
|
|
7
|
-
通过远程调试端口启动:
|
|
8
|
-
```bash
|
|
9
|
-
/Applications/Notion.app/Contents/MacOS/Notion --remote-debugging-port=9230
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
## 配置
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
export OPENCLI_CDP_ENDPOINT="http://127.0.0.1:9230"
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 命令
|
|
19
|
-
|
|
20
|
-
| 命令 | 说明 |
|
|
21
|
-
|------|------|
|
|
22
|
-
| `notion status` | 检查 CDP 连接 |
|
|
23
|
-
| `notion search "关键词"` | 快速搜索(Cmd+P) |
|
|
24
|
-
| `notion read` | 读取当前页面内容 |
|
|
25
|
-
| `notion new "标题"` | 新建页面(Cmd+N) |
|
|
26
|
-
| `notion write "文本"` | 在当前页面追加文字 |
|
|
27
|
-
| `notion sidebar` | 列出侧边栏页面列表 |
|
|
28
|
-
| `notion favorites` | 列出收藏夹页面列表 |
|
|
29
|
-
| `notion export` | 导出页面为 Markdown |
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
site: twitter
|
|
2
|
-
name: trending
|
|
3
|
-
description: Twitter/X trending topics
|
|
4
|
-
domain: x.com
|
|
5
|
-
|
|
6
|
-
args:
|
|
7
|
-
limit:
|
|
8
|
-
type: int
|
|
9
|
-
default: 20
|
|
10
|
-
description: Number of trends to show
|
|
11
|
-
|
|
12
|
-
pipeline:
|
|
13
|
-
- navigate: https://x.com/explore/tabs/trending
|
|
14
|
-
|
|
15
|
-
- evaluate: |
|
|
16
|
-
(async () => {
|
|
17
|
-
const cookies = document.cookie.split(';').reduce((acc, c) => {
|
|
18
|
-
const [k, v] = c.trim().split('=');
|
|
19
|
-
acc[k] = v;
|
|
20
|
-
return acc;
|
|
21
|
-
}, {});
|
|
22
|
-
const csrfToken = cookies['ct0'] || '';
|
|
23
|
-
const bearerToken = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA';
|
|
24
|
-
const res = await fetch('/i/api/2/guide.json?include_page_configuration=true', {
|
|
25
|
-
credentials: 'include',
|
|
26
|
-
headers: { 'x-twitter-active-user': 'yes', 'x-csrf-token': csrfToken, 'authorization': 'Bearer ' + bearerToken }
|
|
27
|
-
});
|
|
28
|
-
if (!res.ok) throw new Error('HTTP ' + res.status + '. Hint: trending endpoint may require login or API shape changed.');
|
|
29
|
-
const data = await res.json();
|
|
30
|
-
const instructions = data?.timeline?.instructions || [];
|
|
31
|
-
const entries = instructions.flatMap(inst => inst?.addEntries?.entries || inst?.entries || []);
|
|
32
|
-
return entries
|
|
33
|
-
.filter(e => e.content?.timelineModule)
|
|
34
|
-
.flatMap(e => e.content.timelineModule.items || [])
|
|
35
|
-
.map(t => t?.item?.content?.trend)
|
|
36
|
-
.filter(Boolean);
|
|
37
|
-
})()
|
|
38
|
-
|
|
39
|
-
- map:
|
|
40
|
-
rank: ${{ index + 1 }}
|
|
41
|
-
topic: ${{ item.name }}
|
|
42
|
-
tweets: ${{ item.tweetCount || 'N/A' }}
|
|
43
|
-
|
|
44
|
-
- limit: ${{ args.limit }}
|
|
45
|
-
|
|
46
|
-
columns: [rank, topic, tweets]
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# 微信桌面端适配器
|
|
2
|
-
|
|
3
|
-
通过 AppleScript + Accessibility API 在终端中控制**微信 Mac 桌面端**。
|
|
4
|
-
|
|
5
|
-
> **注意:** 微信是原生 macOS 应用(非 Electron),因此无法使用 CDP。此适配器使用 AppleScript 键盘模拟和剪贴板操作。
|
|
6
|
-
|
|
7
|
-
## 前置条件
|
|
8
|
-
|
|
9
|
-
1. 微信必须正在运行且已登录
|
|
10
|
-
2. Terminal 需要 **辅助功能权限**(系统设置 → 隐私与安全性 → 辅助功能)
|
|
11
|
-
|
|
12
|
-
## 命令
|
|
13
|
-
|
|
14
|
-
| 命令 | 说明 |
|
|
15
|
-
|------|------|
|
|
16
|
-
| `wechat status` | 检查微信是否在运行 |
|
|
17
|
-
| `wechat send "消息"` | 发送消息(剪贴板粘贴 + 回车) |
|
|
18
|
-
| `wechat read` | 读取当前聊天内容(Cmd+A → Cmd+C) |
|
|
19
|
-
| `wechat search "关键词"` | 打开搜索并输入关键词(Cmd+F) |
|
|
20
|
-
| `wechat chats` | 切换到聊天列表(Cmd+1) |
|
|
21
|
-
| `wechat contacts` | 切换到通讯录(Cmd+2) |
|
|
22
|
-
|
|
23
|
-
## 限制
|
|
24
|
-
|
|
25
|
-
- **不支持 CDP** — 微信是原生 Cocoa 应用
|
|
26
|
-
- `send` 需要先手动打开正确的会话
|
|
27
|
-
- `read` 通过全选+复制来获取可见内容
|
|
28
|
-
- `search` 可以输入关键词但无法自动点击结果
|
package/src/clis/wechat/chats.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process';
|
|
2
|
-
import { cli, Strategy } from '../../registry.js';
|
|
3
|
-
import type { IPage } from '../../types.js';
|
|
4
|
-
|
|
5
|
-
export const chatsCommand = cli({
|
|
6
|
-
site: 'wechat',
|
|
7
|
-
name: 'chats',
|
|
8
|
-
description: 'Open the WeChat chats panel (conversation list)',
|
|
9
|
-
domain: 'localhost',
|
|
10
|
-
strategy: Strategy.PUBLIC,
|
|
11
|
-
browser: false,
|
|
12
|
-
args: [],
|
|
13
|
-
columns: ['Status'],
|
|
14
|
-
func: async (page: IPage | null) => {
|
|
15
|
-
try {
|
|
16
|
-
// Activate WeChat
|
|
17
|
-
execSync("osascript -e 'tell application \"WeChat\" to activate'");
|
|
18
|
-
execSync("osascript -e 'delay 0.3'");
|
|
19
|
-
|
|
20
|
-
// Cmd+1 switches to Chats tab in WeChat Mac
|
|
21
|
-
execSync(
|
|
22
|
-
"osascript " +
|
|
23
|
-
"-e 'tell application \"System Events\"' " +
|
|
24
|
-
"-e 'keystroke \"1\" using command down' " +
|
|
25
|
-
"-e 'end tell'"
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
return [{ Status: 'Chats panel opened (Cmd+1)' }];
|
|
29
|
-
} catch (err: any) {
|
|
30
|
-
return [{ Status: 'Error: ' + err.message }];
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
});
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process';
|
|
2
|
-
import { cli, Strategy } from '../../registry.js';
|
|
3
|
-
import type { IPage } from '../../types.js';
|
|
4
|
-
|
|
5
|
-
export const contactsCommand = cli({
|
|
6
|
-
site: 'wechat',
|
|
7
|
-
name: 'contacts',
|
|
8
|
-
description: 'Open the WeChat contacts panel',
|
|
9
|
-
domain: 'localhost',
|
|
10
|
-
strategy: Strategy.PUBLIC,
|
|
11
|
-
browser: false,
|
|
12
|
-
args: [],
|
|
13
|
-
columns: ['Status'],
|
|
14
|
-
func: async (page: IPage | null) => {
|
|
15
|
-
try {
|
|
16
|
-
// Activate WeChat
|
|
17
|
-
execSync("osascript -e 'tell application \"WeChat\" to activate'");
|
|
18
|
-
execSync("osascript -e 'delay 0.3'");
|
|
19
|
-
|
|
20
|
-
// Cmd+2 switches to Contacts tab in WeChat Mac
|
|
21
|
-
execSync(
|
|
22
|
-
"osascript " +
|
|
23
|
-
"-e 'tell application \"System Events\"' " +
|
|
24
|
-
"-e 'keystroke \"2\" using command down' " +
|
|
25
|
-
"-e 'end tell'"
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
return [{ Status: 'Contacts panel opened (Cmd+2)' }];
|
|
29
|
-
} catch (err: any) {
|
|
30
|
-
return [{ Status: 'Error: ' + err.message }];
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
});
|
package/src/clis/wechat/read.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { execSync, spawnSync } from 'node:child_process';
|
|
2
|
-
import { cli, Strategy } from '../../registry.js';
|
|
3
|
-
import type { IPage } from '../../types.js';
|
|
4
|
-
|
|
5
|
-
export const readCommand = cli({
|
|
6
|
-
site: 'wechat',
|
|
7
|
-
name: 'read',
|
|
8
|
-
description: 'Read the current chat content by selecting all and copying',
|
|
9
|
-
domain: 'localhost',
|
|
10
|
-
strategy: Strategy.PUBLIC,
|
|
11
|
-
browser: false,
|
|
12
|
-
args: [],
|
|
13
|
-
columns: ['Content'],
|
|
14
|
-
func: async (page: IPage | null) => {
|
|
15
|
-
try {
|
|
16
|
-
// Backup clipboard
|
|
17
|
-
let clipBackup = '';
|
|
18
|
-
try {
|
|
19
|
-
clipBackup = execSync('pbpaste', { encoding: 'utf-8' });
|
|
20
|
-
} catch { /* empty */ }
|
|
21
|
-
|
|
22
|
-
// Activate WeChat
|
|
23
|
-
execSync("osascript -e 'tell application \"WeChat\" to activate'");
|
|
24
|
-
execSync("osascript -e 'delay 0.3'");
|
|
25
|
-
|
|
26
|
-
// Click on the chat area first, then select all and copy
|
|
27
|
-
execSync(
|
|
28
|
-
"osascript " +
|
|
29
|
-
"-e 'tell application \"System Events\"' " +
|
|
30
|
-
"-e 'tell application process \"WeChat\"' " +
|
|
31
|
-
// Click in the message area (center-right of the window)
|
|
32
|
-
"-e 'set frontWin to front window' " +
|
|
33
|
-
"-e 'set winPos to position of frontWin' " +
|
|
34
|
-
"-e 'set winSize to size of frontWin' " +
|
|
35
|
-
"-e 'end tell' " +
|
|
36
|
-
"-e 'end tell'"
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
execSync("osascript -e 'delay 0.2'");
|
|
40
|
-
|
|
41
|
-
// Select all text in chat area and copy
|
|
42
|
-
execSync(
|
|
43
|
-
"osascript " +
|
|
44
|
-
"-e 'tell application \"System Events\"' " +
|
|
45
|
-
"-e 'keystroke \"a\" using command down' " +
|
|
46
|
-
"-e 'delay 0.2' " +
|
|
47
|
-
"-e 'keystroke \"c\" using command down' " +
|
|
48
|
-
"-e 'delay 0.2' " +
|
|
49
|
-
"-e 'end tell'"
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
const content = execSync('pbpaste', { encoding: 'utf-8' }).trim();
|
|
53
|
-
|
|
54
|
-
// Restore clipboard
|
|
55
|
-
if (clipBackup) {
|
|
56
|
-
spawnSync('pbcopy', { input: clipBackup });
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Press Escape to deselect
|
|
60
|
-
execSync(
|
|
61
|
-
"osascript " +
|
|
62
|
-
"-e 'tell application \"System Events\"' " +
|
|
63
|
-
"-e 'key code 53' " + // Escape
|
|
64
|
-
"-e 'end tell'"
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
return [{ Content: content || '(no content captured)' }];
|
|
68
|
-
} catch (err: any) {
|
|
69
|
-
return [{ Content: 'Error: ' + err.message }];
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
});
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process';
|
|
2
|
-
import { cli, Strategy } from '../../registry.js';
|
|
3
|
-
import type { IPage } from '../../types.js';
|
|
4
|
-
|
|
5
|
-
export const searchCommand = cli({
|
|
6
|
-
site: 'wechat',
|
|
7
|
-
name: 'search',
|
|
8
|
-
description: 'Open WeChat search and type a query (find contacts or messages)',
|
|
9
|
-
domain: 'localhost',
|
|
10
|
-
strategy: Strategy.PUBLIC,
|
|
11
|
-
browser: false,
|
|
12
|
-
args: [{ name: 'query', required: true, positional: true, help: 'Search query (contact name or keyword)' }],
|
|
13
|
-
columns: ['Status'],
|
|
14
|
-
func: async (page: IPage | null, kwargs: any) => {
|
|
15
|
-
const query = kwargs.query as string;
|
|
16
|
-
try {
|
|
17
|
-
// Activate WeChat
|
|
18
|
-
execSync("osascript -e 'tell application \"WeChat\" to activate'");
|
|
19
|
-
execSync("osascript -e 'delay 0.3'");
|
|
20
|
-
|
|
21
|
-
// Cmd+F to open search (WeChat Mac uses Cmd+F for search)
|
|
22
|
-
execSync(
|
|
23
|
-
"osascript " +
|
|
24
|
-
"-e 'tell application \"System Events\"' " +
|
|
25
|
-
"-e 'keystroke \"f\" using command down' " +
|
|
26
|
-
"-e 'delay 0.5' " +
|
|
27
|
-
`-e 'keystroke ${JSON.stringify(query)}' ` +
|
|
28
|
-
"-e 'end tell'"
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
return [{ Status: `Searching for: ${query}` }];
|
|
32
|
-
} catch (err: any) {
|
|
33
|
-
return [{ Status: 'Error: ' + err.message }];
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
});
|
package/src/clis/wechat/send.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { execSync, spawnSync } from 'node:child_process';
|
|
2
|
-
import { cli, Strategy } from '../../registry.js';
|
|
3
|
-
import type { IPage } from '../../types.js';
|
|
4
|
-
|
|
5
|
-
export const sendCommand = cli({
|
|
6
|
-
site: 'wechat',
|
|
7
|
-
name: 'send',
|
|
8
|
-
description: 'Send a message in the active WeChat conversation via clipboard paste',
|
|
9
|
-
domain: 'localhost',
|
|
10
|
-
strategy: Strategy.PUBLIC,
|
|
11
|
-
browser: false,
|
|
12
|
-
args: [{ name: 'text', required: true, positional: true, help: 'Message to send' }],
|
|
13
|
-
columns: ['Status'],
|
|
14
|
-
func: async (page: IPage | null, kwargs: any) => {
|
|
15
|
-
const text = kwargs.text as string;
|
|
16
|
-
try {
|
|
17
|
-
// Backup clipboard
|
|
18
|
-
let clipBackup = '';
|
|
19
|
-
try {
|
|
20
|
-
clipBackup = execSync('pbpaste', { encoding: 'utf-8' });
|
|
21
|
-
} catch { /* clipboard may be empty */ }
|
|
22
|
-
|
|
23
|
-
// Copy text to clipboard
|
|
24
|
-
spawnSync('pbcopy', { input: text });
|
|
25
|
-
|
|
26
|
-
// Activate WeChat and paste
|
|
27
|
-
execSync("osascript -e 'tell application \"WeChat\" to activate'");
|
|
28
|
-
execSync("osascript -e 'delay 0.5'");
|
|
29
|
-
|
|
30
|
-
execSync(
|
|
31
|
-
"osascript " +
|
|
32
|
-
"-e 'tell application \"System Events\"' " +
|
|
33
|
-
"-e 'keystroke \"v\" using command down' " +
|
|
34
|
-
"-e 'delay 0.2' " +
|
|
35
|
-
"-e 'keystroke return' " +
|
|
36
|
-
"-e 'end tell'"
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
// Restore clipboard
|
|
40
|
-
if (clipBackup) {
|
|
41
|
-
spawnSync('pbcopy', { input: clipBackup });
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return [{ Status: 'Success' }];
|
|
45
|
-
} catch (err: any) {
|
|
46
|
-
return [{ Status: 'Error: ' + err.message }];
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
});
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process';
|
|
2
|
-
import { cli, Strategy } from '../../registry.js';
|
|
3
|
-
import type { IPage } from '../../types.js';
|
|
4
|
-
|
|
5
|
-
export const statusCommand = cli({
|
|
6
|
-
site: 'wechat',
|
|
7
|
-
name: 'status',
|
|
8
|
-
description: 'Check if WeChat Desktop is running on macOS',
|
|
9
|
-
domain: 'localhost',
|
|
10
|
-
strategy: Strategy.PUBLIC,
|
|
11
|
-
browser: false,
|
|
12
|
-
args: [],
|
|
13
|
-
columns: ['Status', 'Detail'],
|
|
14
|
-
func: async (page: IPage | null) => {
|
|
15
|
-
try {
|
|
16
|
-
const running = execSync("osascript -e 'application \"WeChat\" is running'", { encoding: 'utf-8' }).trim();
|
|
17
|
-
if (running !== 'true') {
|
|
18
|
-
return [{ Status: 'Stopped', Detail: 'WeChat is not running' }];
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// Get window count to check if logged in
|
|
22
|
-
const windowCount = execSync(
|
|
23
|
-
"osascript -e 'tell application \"System Events\" to count windows of application process \"WeChat\"'",
|
|
24
|
-
{ encoding: 'utf-8' }
|
|
25
|
-
).trim();
|
|
26
|
-
|
|
27
|
-
return [{
|
|
28
|
-
Status: 'Running',
|
|
29
|
-
Detail: `${windowCount} window(s) open`,
|
|
30
|
-
}];
|
|
31
|
-
} catch (err: any) {
|
|
32
|
-
return [{ Status: 'Error', Detail: err.message }];
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
});
|
package/src/engine.ts
DELETED
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI discovery: finds YAML/TS CLI definitions and registers them.
|
|
3
|
-
*
|
|
4
|
-
* Supports two modes:
|
|
5
|
-
* 1. FAST PATH (manifest): If a pre-compiled cli-manifest.json exists,
|
|
6
|
-
* registers all YAML commands instantly without runtime YAML parsing.
|
|
7
|
-
* TS modules are loaded lazily only when their command is executed.
|
|
8
|
-
* 2. FALLBACK (filesystem scan): Traditional runtime discovery for development.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import * as fs from 'node:fs';
|
|
12
|
-
import * as path from 'node:path';
|
|
13
|
-
import yaml from 'js-yaml';
|
|
14
|
-
import { type CliCommand, type InternalCliCommand, type Arg, Strategy, registerCommand } from './registry.js';
|
|
15
|
-
import type { IPage } from './types.js';
|
|
16
|
-
import { executePipeline } from './pipeline.js';
|
|
17
|
-
import { log } from './logger.js';
|
|
18
|
-
import { AdapterLoadError } from './errors.js';
|
|
19
|
-
|
|
20
|
-
/** Set of TS module paths that have been loaded */
|
|
21
|
-
const _loadedModules = new Set<string>();
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Discover and register CLI commands.
|
|
25
|
-
* Uses pre-compiled manifest when available for instant startup.
|
|
26
|
-
*/
|
|
27
|
-
export async function discoverClis(...dirs: string[]): Promise<void> {
|
|
28
|
-
// Fast path: try manifest first (production / post-build)
|
|
29
|
-
for (const dir of dirs) {
|
|
30
|
-
const manifestPath = path.resolve(dir, '..', 'cli-manifest.json');
|
|
31
|
-
try {
|
|
32
|
-
await fs.promises.access(manifestPath);
|
|
33
|
-
await loadFromManifest(manifestPath, dir);
|
|
34
|
-
continue; // Skip filesystem scan for this directory
|
|
35
|
-
} catch {
|
|
36
|
-
// Fallback: runtime filesystem scan (development)
|
|
37
|
-
await discoverClisFromFs(dir);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Fast-path: register commands from pre-compiled manifest.
|
|
44
|
-
* YAML pipelines are inlined — zero YAML parsing at runtime.
|
|
45
|
-
* TS modules are deferred — loaded lazily on first execution.
|
|
46
|
-
*/
|
|
47
|
-
async function loadFromManifest(manifestPath: string, clisDir: string): Promise<void> {
|
|
48
|
-
try {
|
|
49
|
-
const raw = await fs.promises.readFile(manifestPath, 'utf-8');
|
|
50
|
-
const manifest = JSON.parse(raw) as any[];
|
|
51
|
-
for (const entry of manifest) {
|
|
52
|
-
if (entry.type === 'yaml') {
|
|
53
|
-
// YAML pipelines fully inlined in manifest — register directly
|
|
54
|
-
const strategy = (Strategy as any)[entry.strategy.toUpperCase()] ?? Strategy.COOKIE;
|
|
55
|
-
const cmd: CliCommand = {
|
|
56
|
-
site: entry.site,
|
|
57
|
-
name: entry.name,
|
|
58
|
-
description: entry.description ?? '',
|
|
59
|
-
domain: entry.domain,
|
|
60
|
-
strategy,
|
|
61
|
-
browser: entry.browser,
|
|
62
|
-
args: entry.args ?? [],
|
|
63
|
-
columns: entry.columns,
|
|
64
|
-
pipeline: entry.pipeline,
|
|
65
|
-
timeoutSeconds: entry.timeout,
|
|
66
|
-
source: `manifest:${entry.site}/${entry.name}`,
|
|
67
|
-
};
|
|
68
|
-
registerCommand(cmd);
|
|
69
|
-
} else if (entry.type === 'ts' && entry.modulePath) {
|
|
70
|
-
// TS adapters: register a lightweight stub.
|
|
71
|
-
// The actual module is loaded lazily on first executeCommand().
|
|
72
|
-
const strategy = (Strategy as any)[(entry.strategy ?? 'cookie').toUpperCase()] ?? Strategy.COOKIE;
|
|
73
|
-
const modulePath = path.resolve(clisDir, entry.modulePath);
|
|
74
|
-
const cmd: InternalCliCommand = {
|
|
75
|
-
site: entry.site,
|
|
76
|
-
name: entry.name,
|
|
77
|
-
description: entry.description ?? '',
|
|
78
|
-
domain: entry.domain,
|
|
79
|
-
strategy,
|
|
80
|
-
browser: entry.browser ?? true,
|
|
81
|
-
args: entry.args ?? [],
|
|
82
|
-
columns: entry.columns,
|
|
83
|
-
timeoutSeconds: entry.timeout,
|
|
84
|
-
source: modulePath,
|
|
85
|
-
_lazy: true,
|
|
86
|
-
_modulePath: modulePath,
|
|
87
|
-
};
|
|
88
|
-
registerCommand(cmd);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
} catch (err: any) {
|
|
92
|
-
log.warn(`Failed to load manifest ${manifestPath}: ${err.message}`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Fallback: traditional filesystem scan (used during development with tsx).
|
|
98
|
-
*/
|
|
99
|
-
async function discoverClisFromFs(dir: string): Promise<void> {
|
|
100
|
-
try { await fs.promises.access(dir); } catch { return; }
|
|
101
|
-
const promises: Promise<any>[] = [];
|
|
102
|
-
const entries = await fs.promises.readdir(dir, { withFileTypes: true });
|
|
103
|
-
|
|
104
|
-
for (const entry of entries) {
|
|
105
|
-
if (!entry.isDirectory()) continue;
|
|
106
|
-
const site = entry.name;
|
|
107
|
-
const siteDir = path.join(dir, site);
|
|
108
|
-
const files = await fs.promises.readdir(siteDir);
|
|
109
|
-
for (const file of files) {
|
|
110
|
-
const filePath = path.join(siteDir, file);
|
|
111
|
-
if (file.endsWith('.yaml') || file.endsWith('.yml')) {
|
|
112
|
-
promises.push(registerYamlCli(filePath, site));
|
|
113
|
-
} else if (
|
|
114
|
-
(file.endsWith('.js') && !file.endsWith('.d.js')) ||
|
|
115
|
-
(file.endsWith('.ts') && !file.endsWith('.d.ts') && !file.endsWith('.test.ts'))
|
|
116
|
-
) {
|
|
117
|
-
promises.push(
|
|
118
|
-
import(`file://${filePath}`).catch((err: any) => {
|
|
119
|
-
log.warn(`Failed to load module ${filePath}: ${err.message}`);
|
|
120
|
-
})
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
await Promise.all(promises);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
async function registerYamlCli(filePath: string, defaultSite: string): Promise<void> {
|
|
129
|
-
try {
|
|
130
|
-
const raw = await fs.promises.readFile(filePath, 'utf-8');
|
|
131
|
-
const def = yaml.load(raw) as any;
|
|
132
|
-
if (!def || typeof def !== 'object') return;
|
|
133
|
-
|
|
134
|
-
const site = def.site ?? defaultSite;
|
|
135
|
-
const name = def.name ?? path.basename(filePath, path.extname(filePath));
|
|
136
|
-
const strategyStr = def.strategy ?? (def.browser === false ? 'public' : 'cookie');
|
|
137
|
-
const strategy = (Strategy as any)[strategyStr.toUpperCase()] ?? Strategy.COOKIE;
|
|
138
|
-
const browser = def.browser ?? (strategy !== Strategy.PUBLIC);
|
|
139
|
-
|
|
140
|
-
const args: Arg[] = [];
|
|
141
|
-
if (def.args && typeof def.args === 'object') {
|
|
142
|
-
for (const [argName, argDef] of Object.entries(def.args as Record<string, any>)) {
|
|
143
|
-
args.push({
|
|
144
|
-
name: argName,
|
|
145
|
-
type: argDef?.type ?? 'str',
|
|
146
|
-
default: argDef?.default,
|
|
147
|
-
required: argDef?.required ?? false,
|
|
148
|
-
help: argDef?.description ?? argDef?.help ?? '',
|
|
149
|
-
choices: argDef?.choices,
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
const cmd: CliCommand = {
|
|
155
|
-
site,
|
|
156
|
-
name,
|
|
157
|
-
description: def.description ?? '',
|
|
158
|
-
domain: def.domain,
|
|
159
|
-
strategy,
|
|
160
|
-
browser,
|
|
161
|
-
args,
|
|
162
|
-
columns: def.columns,
|
|
163
|
-
pipeline: def.pipeline,
|
|
164
|
-
timeoutSeconds: def.timeout,
|
|
165
|
-
source: filePath,
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
registerCommand(cmd);
|
|
169
|
-
} catch (err: any) {
|
|
170
|
-
log.warn(`Failed to load ${filePath}: ${err.message}`);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* Validates and coerces arguments based on the command's Arg definitions.
|
|
176
|
-
*/
|
|
177
|
-
function coerceAndValidateArgs(cmdArgs: Arg[], kwargs: Record<string, any>): Record<string, any> {
|
|
178
|
-
const result: Record<string, any> = { ...kwargs };
|
|
179
|
-
|
|
180
|
-
for (const argDef of cmdArgs) {
|
|
181
|
-
const val = result[argDef.name];
|
|
182
|
-
|
|
183
|
-
// 1. Check required
|
|
184
|
-
if (argDef.required && (val === undefined || val === null || val === '')) {
|
|
185
|
-
throw new Error(`Argument "${argDef.name}" is required.\n${argDef.help ? `Hint: ${argDef.help}` : ''}`);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
if (val !== undefined && val !== null) {
|
|
189
|
-
// 2. Type coercion
|
|
190
|
-
if (argDef.type === 'int' || argDef.type === 'number') {
|
|
191
|
-
const num = Number(val);
|
|
192
|
-
if (Number.isNaN(num)) {
|
|
193
|
-
throw new Error(`Argument "${argDef.name}" must be a valid number. Received: "${val}"`);
|
|
194
|
-
}
|
|
195
|
-
result[argDef.name] = num;
|
|
196
|
-
} else if (argDef.type === 'boolean' || argDef.type === 'bool') {
|
|
197
|
-
if (typeof val === 'string') {
|
|
198
|
-
const lower = val.toLowerCase();
|
|
199
|
-
if (lower === 'true' || lower === '1') result[argDef.name] = true;
|
|
200
|
-
else if (lower === 'false' || lower === '0') result[argDef.name] = false;
|
|
201
|
-
else throw new Error(`Argument "${argDef.name}" must be a boolean (true/false). Received: "${val}"`);
|
|
202
|
-
} else {
|
|
203
|
-
result[argDef.name] = Boolean(val);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// 3. Choices validation
|
|
208
|
-
const coercedVal = result[argDef.name];
|
|
209
|
-
if (argDef.choices && argDef.choices.length > 0) {
|
|
210
|
-
// Only stringent check for string/number types against choices array
|
|
211
|
-
if (!argDef.choices.map(String).includes(String(coercedVal))) {
|
|
212
|
-
throw new Error(`Argument "${argDef.name}" must be one of: ${argDef.choices.join(', ')}. Received: "${coercedVal}"`);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
} else if (argDef.default !== undefined) {
|
|
216
|
-
// Set default if value is missing
|
|
217
|
-
result[argDef.name] = argDef.default;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
return result;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Execute a CLI command. Handles lazy-loading of TS modules.
|
|
225
|
-
*/
|
|
226
|
-
export async function executeCommand(
|
|
227
|
-
cmd: CliCommand,
|
|
228
|
-
page: IPage | null,
|
|
229
|
-
rawKwargs: Record<string, any>,
|
|
230
|
-
debug: boolean = false,
|
|
231
|
-
): Promise<any> {
|
|
232
|
-
let kwargs: Record<string, any>;
|
|
233
|
-
try {
|
|
234
|
-
kwargs = coerceAndValidateArgs(cmd.args, rawKwargs);
|
|
235
|
-
} catch (err: any) {
|
|
236
|
-
// Re-throw validation errors clearly
|
|
237
|
-
throw new Error(`[Argument Validation Error]\n${err.message}`);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Lazy-load TS module on first execution
|
|
241
|
-
const internal = cmd as InternalCliCommand;
|
|
242
|
-
if (internal._lazy && internal._modulePath) {
|
|
243
|
-
const modulePath = internal._modulePath;
|
|
244
|
-
if (!_loadedModules.has(modulePath)) {
|
|
245
|
-
try {
|
|
246
|
-
await import(`file://${modulePath}`);
|
|
247
|
-
_loadedModules.add(modulePath);
|
|
248
|
-
} catch (err: any) {
|
|
249
|
-
throw new AdapterLoadError(
|
|
250
|
-
`Failed to load adapter module ${modulePath}: ${err.message}`,
|
|
251
|
-
'Check that the adapter file exists and has no syntax errors.',
|
|
252
|
-
);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
// After loading, the module's cli() call will have updated the registry
|
|
256
|
-
// with the real func/pipeline. Re-fetch the command.
|
|
257
|
-
const { getRegistry, fullName } = await import('./registry.js');
|
|
258
|
-
const updated = getRegistry().get(fullName(cmd));
|
|
259
|
-
if (updated && updated.func) {
|
|
260
|
-
return updated.func(page!, kwargs, debug);
|
|
261
|
-
}
|
|
262
|
-
if (updated && updated.pipeline) {
|
|
263
|
-
return executePipeline(page, updated.pipeline, { args: kwargs, debug });
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
if (cmd.func) {
|
|
268
|
-
return cmd.func(page!, kwargs, debug);
|
|
269
|
-
}
|
|
270
|
-
if (cmd.pipeline) {
|
|
271
|
-
return executePipeline(page, cmd.pipeline, { args: kwargs, debug });
|
|
272
|
-
}
|
|
273
|
-
throw new Error(`Command ${cmd.site}/${cmd.name} has no func or pipeline`);
|
|
274
|
-
}
|
package/src/pipeline.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* YAML pipeline executor — re-exports from modular pipeline system.
|
|
3
|
-
*
|
|
4
|
-
* This file exists for backward compatibility. All logic has been
|
|
5
|
-
* refactored into src/pipeline/ with modular step handlers.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
export { executePipeline, type PipelineContext } from './pipeline/index.js';
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|