@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
package/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: opencli
|
|
3
|
-
description: "OpenCLI — Make any website or Electron App your CLI. Zero risk, AI-powered, reuse Chrome login.
|
|
3
|
+
description: "OpenCLI — Make any website or Electron App your CLI. Zero risk, AI-powered, reuse Chrome login. 150+ commands across 30+ sites."
|
|
4
4
|
version: 1.1.0
|
|
5
5
|
author: jackwener
|
|
6
6
|
tags: [cli, browser, web, chrome-extension, cdp, bilibili, zhihu, twitter, github, v2ex, hackernews, reddit, xiaohongshu, xueqiu, youtube, boss, coupang, AI, agent]
|
|
@@ -39,7 +39,7 @@ Browser commands require:
|
|
|
39
39
|
|
|
40
40
|
> **Note**: You must be logged into the target website in Chrome before running commands. Tabs opened during command execution are auto-closed afterwards.
|
|
41
41
|
|
|
42
|
-
Public API commands (`hackernews`, `
|
|
42
|
+
Public API commands (`hackernews`, `v2ex`) need no browser.
|
|
43
43
|
|
|
44
44
|
## Commands Reference
|
|
45
45
|
|
|
@@ -48,7 +48,7 @@ Public API commands (`hackernews`, `github search`, `v2ex`) need no browser.
|
|
|
48
48
|
```bash
|
|
49
49
|
# Bilibili (browser)
|
|
50
50
|
opencli bilibili hot --limit 10 # B站热门视频
|
|
51
|
-
opencli bilibili search
|
|
51
|
+
opencli bilibili search "rust" # 搜索视频 (query positional)
|
|
52
52
|
opencli bilibili me # 我的信息
|
|
53
53
|
opencli bilibili favorite # 我的收藏
|
|
54
54
|
opencli bilibili history --limit 20 # 观看历史
|
|
@@ -61,15 +61,19 @@ opencli bilibili following --limit 20 # 我的关注列表 (支持 --uid 查
|
|
|
61
61
|
|
|
62
62
|
# 知乎 (browser)
|
|
63
63
|
opencli zhihu hot --limit 10 # 知乎热榜
|
|
64
|
-
opencli zhihu search
|
|
65
|
-
opencli zhihu question
|
|
64
|
+
opencli zhihu search "AI" # 搜索 (query positional)
|
|
65
|
+
opencli zhihu question 34816524 # 问题详情和回答 (id positional)
|
|
66
66
|
|
|
67
67
|
# 小红书 (browser)
|
|
68
|
-
opencli xiaohongshu search
|
|
68
|
+
opencli xiaohongshu search "美食" # 搜索笔记 (query positional)
|
|
69
69
|
opencli xiaohongshu notifications # 通知(mentions/likes/connections)
|
|
70
70
|
opencli xiaohongshu feed --limit 10 # 推荐 Feed
|
|
71
|
-
opencli xiaohongshu
|
|
72
|
-
opencli xiaohongshu
|
|
71
|
+
opencli xiaohongshu user xxx # 用户主页 (id positional)
|
|
72
|
+
opencli xiaohongshu creator-notes --limit 10 # 创作者笔记列表
|
|
73
|
+
opencli xiaohongshu creator-note-detail --note-id xxx # 笔记详情
|
|
74
|
+
opencli xiaohongshu creator-notes-summary # 笔记数据概览
|
|
75
|
+
opencli xiaohongshu creator-profile # 创作者资料
|
|
76
|
+
opencli xiaohongshu creator-stats # 创作者数据统计
|
|
73
77
|
|
|
74
78
|
# 雪球 Xueqiu (browser)
|
|
75
79
|
opencli xueqiu hot-stock --limit 10 # 雪球热门股票榜
|
|
@@ -77,15 +81,17 @@ opencli xueqiu stock --symbol SH600519 # 查看股票实时行情
|
|
|
77
81
|
opencli xueqiu watchlist # 获取自选股/持仓列表
|
|
78
82
|
opencli xueqiu feed # 我的关注 timeline
|
|
79
83
|
opencli xueqiu hot --limit 10 # 雪球热榜
|
|
80
|
-
opencli xueqiu search
|
|
84
|
+
opencli xueqiu search "特斯拉" # 搜索 (query positional)
|
|
81
85
|
|
|
82
|
-
# GitHub (
|
|
83
|
-
opencli
|
|
86
|
+
# GitHub (via gh External CLI)
|
|
87
|
+
opencli gh repo list # 列出仓库 (passthrough to gh)
|
|
88
|
+
opencli gh pr list --limit 5 # PR 列表
|
|
89
|
+
opencli gh issue list # Issue 列表
|
|
84
90
|
|
|
85
91
|
# Twitter/X (browser)
|
|
86
92
|
opencli twitter trending --limit 10 # 热门话题
|
|
87
93
|
opencli twitter bookmarks --limit 20 # 获取收藏的书签推文
|
|
88
|
-
opencli twitter search
|
|
94
|
+
opencli twitter search "AI" # 搜索推文 (query positional)
|
|
89
95
|
opencli twitter profile elonmusk # 用户资料
|
|
90
96
|
opencli twitter timeline --limit 20 # 时间线
|
|
91
97
|
opencli twitter thread 1234567890 # 推文 thread(原文 + 回复)
|
|
@@ -100,15 +106,15 @@ opencli reddit hot --limit 10 # 热门帖子
|
|
|
100
106
|
opencli reddit hot --subreddit programming # 指定子版块
|
|
101
107
|
opencli reddit frontpage --limit 10 # 首页 /r/all
|
|
102
108
|
opencli reddit popular --limit 10 # /r/popular 热门
|
|
103
|
-
opencli reddit search
|
|
104
|
-
opencli reddit subreddit
|
|
105
|
-
opencli reddit read --
|
|
106
|
-
opencli reddit user
|
|
107
|
-
opencli reddit user-posts
|
|
108
|
-
opencli reddit user-comments
|
|
109
|
-
opencli reddit upvote --
|
|
110
|
-
opencli reddit save --
|
|
111
|
-
opencli reddit comment --
|
|
109
|
+
opencli reddit search "AI" --sort top --time week # 搜索(支持排序+时间过滤)
|
|
110
|
+
opencli reddit subreddit rust --sort top --time month # 子版块浏览(支持时间过滤)
|
|
111
|
+
opencli reddit read --post-id 1abc123 # 阅读帖子 + 评论
|
|
112
|
+
opencli reddit user spez # 用户资料(karma、注册时间)
|
|
113
|
+
opencli reddit user-posts spez # 用户发帖历史
|
|
114
|
+
opencli reddit user-comments spez # 用户评论历史
|
|
115
|
+
opencli reddit upvote --post-id xxx --direction up # 投票(up/down/none)
|
|
116
|
+
opencli reddit save --post-id xxx # 收藏帖子
|
|
117
|
+
opencli reddit comment --post-id xxx "Great!" # 发表评论 (text positional)
|
|
112
118
|
opencli reddit subscribe --subreddit python # 订阅子版块
|
|
113
119
|
opencli reddit saved --limit 10 # 我的收藏
|
|
114
120
|
opencli reddit upvoted --limit 10 # 我的赞
|
|
@@ -116,7 +122,7 @@ opencli reddit upvoted --limit 10 # 我的赞
|
|
|
116
122
|
# V2EX (public + browser)
|
|
117
123
|
opencli v2ex hot --limit 10 # 热门话题
|
|
118
124
|
opencli v2ex latest --limit 10 # 最新话题
|
|
119
|
-
opencli v2ex topic
|
|
125
|
+
opencli v2ex topic 1024 # 主题详情 (id positional)
|
|
120
126
|
opencli v2ex daily # 每日签到 (browser)
|
|
121
127
|
opencli v2ex me # 我的信息 (browser)
|
|
122
128
|
opencli v2ex notifications --limit 10 # 通知 (browser)
|
|
@@ -131,14 +137,26 @@ opencli bbc news --limit 10 # BBC News RSS headlines
|
|
|
131
137
|
opencli weibo hot --limit 10 # 微博热搜
|
|
132
138
|
|
|
133
139
|
# BOSS直聘 (browser)
|
|
134
|
-
opencli boss search
|
|
135
|
-
opencli boss detail --
|
|
140
|
+
opencli boss search "AI agent" # 搜索职位 (query positional)
|
|
141
|
+
opencli boss detail --security-id xxx # 职位详情
|
|
142
|
+
opencli boss recommend --limit 10 # 推荐职位
|
|
143
|
+
opencli boss joblist --limit 10 # 职位列表
|
|
144
|
+
opencli boss greet --security-id xxx # 打招呼
|
|
145
|
+
opencli boss batchgreet --job-id xxx # 批量打招呼
|
|
146
|
+
opencli boss send --uid xxx "消息内容" # 发消息 (text positional)
|
|
147
|
+
opencli boss chatlist --limit 10 # 聊天列表
|
|
148
|
+
opencli boss chatmsg --security-id xxx # 聊天记录
|
|
149
|
+
opencli boss invite --security-id xxx # 邀请沟通
|
|
150
|
+
opencli boss mark --security-id xxx # 标记管理
|
|
151
|
+
opencli boss exchange --security-id xxx # 交换联系方式
|
|
152
|
+
opencli boss resume # 简历管理
|
|
153
|
+
opencli boss stats # 数据统计
|
|
136
154
|
|
|
137
155
|
# YouTube (browser)
|
|
138
|
-
opencli youtube search
|
|
139
|
-
opencli youtube video
|
|
140
|
-
opencli youtube transcript
|
|
141
|
-
opencli youtube transcript
|
|
156
|
+
opencli youtube search "rust" # 搜索视频 (query positional)
|
|
157
|
+
opencli youtube video "https://www.youtube.com/watch?v=xxx" # 视频元数据
|
|
158
|
+
opencli youtube transcript "https://www.youtube.com/watch?v=xxx" # 获取视频字幕/转录
|
|
159
|
+
opencli youtube transcript "xxx" --lang zh-Hans --mode raw # 指定语言 + 原始时间戳模式
|
|
142
160
|
|
|
143
161
|
# Yahoo Finance (browser)
|
|
144
162
|
opencli yahoo-finance quote --symbol AAPL # 股票行情
|
|
@@ -147,22 +165,73 @@ opencli yahoo-finance quote --symbol AAPL # 股票行情
|
|
|
147
165
|
opencli sinafinance news --limit 10 --type 1 # 7x24实时快讯 (0=全部 1=A股 2=宏观 3=公司 4=数据 5=市场 6=国际 7=观点 8=央行 9=其它)
|
|
148
166
|
|
|
149
167
|
# Reuters (browser)
|
|
150
|
-
opencli reuters search
|
|
168
|
+
opencli reuters search "AI" # 路透社搜索 (query positional)
|
|
151
169
|
|
|
152
170
|
# 什么值得买 (browser)
|
|
153
|
-
opencli smzdm search
|
|
171
|
+
opencli smzdm search "耳机" # 搜索好价 (query positional)
|
|
154
172
|
|
|
155
173
|
# 携程 (browser)
|
|
156
|
-
opencli ctrip search
|
|
174
|
+
opencli ctrip search "三亚" # 搜索目的地 (query positional)
|
|
157
175
|
|
|
158
176
|
# Antigravity (Electron/CDP)
|
|
159
177
|
opencli antigravity status # 检查 CDP 连接
|
|
160
178
|
opencli antigravity send "hello" # 发送文本到当前 agent 聊天框
|
|
161
179
|
opencli antigravity read # 读取整个聊天记录面板
|
|
162
180
|
opencli antigravity new # 清空聊天、开启新对话
|
|
181
|
+
opencli antigravity dump # 导出 DOM 和快照调试信息
|
|
163
182
|
opencli antigravity extract-code # 自动抽取 AI 回复中的代码块
|
|
164
183
|
opencli antigravity model claude # 切换底层模型
|
|
165
184
|
opencli antigravity watch # 流式监听增量消息
|
|
185
|
+
opencli antigravity serve --port 8082 # 启动 Anthropic 兼容代理
|
|
186
|
+
|
|
187
|
+
# Barchart (browser)
|
|
188
|
+
opencli barchart quote --symbol AAPL # 股票行情
|
|
189
|
+
opencli barchart options --symbol AAPL # 期权链
|
|
190
|
+
opencli barchart greeks --symbol AAPL # 期权 Greeks
|
|
191
|
+
opencli barchart flow --limit 20 # 异常期权活动
|
|
192
|
+
|
|
193
|
+
# Jike 即刻 (browser)
|
|
194
|
+
opencli jike feed --limit 10 # 动态流
|
|
195
|
+
opencli jike search "AI" # 搜索 (query positional)
|
|
196
|
+
opencli jike create "内容" # 发布动态 (text positional)
|
|
197
|
+
opencli jike like xxx # 点赞 (id positional)
|
|
198
|
+
opencli jike comment xxx "评论" # 评论 (id + text positional)
|
|
199
|
+
opencli jike repost xxx # 转发 (id positional)
|
|
200
|
+
opencli jike notifications # 通知
|
|
201
|
+
|
|
202
|
+
# Linux.do (public)
|
|
203
|
+
opencli linux-do hot --limit 10 # 热门话题
|
|
204
|
+
opencli linux-do latest --limit 10 # 最新话题
|
|
205
|
+
opencli linux-do search "rust" # 搜索 (query positional)
|
|
206
|
+
opencli linux-do topic 1024 # 主题详情 (id positional)
|
|
207
|
+
|
|
208
|
+
# StackOverflow (public)
|
|
209
|
+
opencli stackoverflow hot --limit 10 # 热门问题
|
|
210
|
+
opencli stackoverflow search "typescript" # 搜索 (query positional)
|
|
211
|
+
opencli stackoverflow bounties --limit 10 # 悬赏问题
|
|
212
|
+
|
|
213
|
+
# WeRead 微信读书 (browser)
|
|
214
|
+
opencli weread shelf --limit 10 # 书架
|
|
215
|
+
opencli weread search "AI" # 搜索图书 (query positional)
|
|
216
|
+
opencli weread book xxx # 图书详情 (book-id positional)
|
|
217
|
+
opencli weread highlights xxx # 划线笔记 (book-id positional)
|
|
218
|
+
opencli weread notes xxx # 想法笔记 (book-id positional)
|
|
219
|
+
opencli weread ranking --limit 10 # 排行榜
|
|
220
|
+
|
|
221
|
+
# Jimeng 即梦 AI (browser)
|
|
222
|
+
opencli jimeng generate --prompt "描述" # AI 生图
|
|
223
|
+
opencli jimeng history --limit 10 # 生成历史
|
|
224
|
+
|
|
225
|
+
# Grok (default + explicit web)
|
|
226
|
+
opencli grok ask --prompt "问题" # 提问 Grok(兼容默认路径)
|
|
227
|
+
opencli grok ask --prompt "问题" --web # 显式 grok.com consumer web UI 路径
|
|
228
|
+
|
|
229
|
+
# HuggingFace (public)
|
|
230
|
+
opencli hf top --limit 10 # 热门模型
|
|
231
|
+
|
|
232
|
+
# 超星学习通 (browser)
|
|
233
|
+
opencli chaoxing assignments # 作业列表
|
|
234
|
+
opencli chaoxing exams # 考试列表
|
|
166
235
|
```
|
|
167
236
|
|
|
168
237
|
### Management Commands
|
|
@@ -300,7 +369,7 @@ cli({
|
|
|
300
369
|
site: 'mysite',
|
|
301
370
|
name: 'search',
|
|
302
371
|
strategy: Strategy.INTERCEPT, // Or COOKIE
|
|
303
|
-
args: [{ name: '
|
|
372
|
+
args: [{ name: 'query', required: true, positional: true }],
|
|
304
373
|
columns: ['rank', 'title', 'url'],
|
|
305
374
|
func: async (page, kwargs) => {
|
|
306
375
|
await page.goto('https://www.mysite.com/search');
|
|
@@ -351,7 +420,7 @@ cli({
|
|
|
351
420
|
|
|
352
421
|
```yaml
|
|
353
422
|
# Arguments with defaults
|
|
354
|
-
${{ args.
|
|
423
|
+
${{ args.query }}
|
|
355
424
|
${{ args.limit | default(20) }}
|
|
356
425
|
|
|
357
426
|
# Current item (in map/filter)
|
package/dist/browser/cdp.d.ts
CHANGED
|
@@ -25,13 +25,13 @@ export declare class CDPBridge {
|
|
|
25
25
|
}): Promise<IPage>;
|
|
26
26
|
close(): Promise<void>;
|
|
27
27
|
/** Send a CDP command with timeout guard (P0 fix #4) */
|
|
28
|
-
send(method: string, params?:
|
|
28
|
+
send(method: string, params?: Record<string, unknown>, timeoutMs?: number): Promise<unknown>;
|
|
29
29
|
/** Listen for a CDP event */
|
|
30
|
-
on(event: string, handler: (params:
|
|
30
|
+
on(event: string, handler: (params: unknown) => void): void;
|
|
31
31
|
/** Remove a CDP event listener */
|
|
32
|
-
off(event: string, handler: (params:
|
|
32
|
+
off(event: string, handler: (params: unknown) => void): void;
|
|
33
33
|
/** Wait for a CDP event to fire (one-shot) */
|
|
34
|
-
waitForEvent(event: string, timeoutMs?: number): Promise<
|
|
34
|
+
waitForEvent(event: string, timeoutMs?: number): Promise<unknown>;
|
|
35
35
|
}
|
|
36
36
|
declare function selectCDPTarget(targets: CDPTarget[]): CDPTarget | undefined;
|
|
37
37
|
declare function scoreCDPTarget(target: CDPTarget, preferredPattern?: RegExp): number;
|
package/dist/browser/cdp.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { WebSocket } from 'ws';
|
|
11
11
|
import { wrapForEval } from './utils.js';
|
|
12
|
+
import { generateSnapshotJs, scrollToRefJs, getFormStateJs } from './dom-snapshot.js';
|
|
12
13
|
import { clickJs, typeTextJs, pressKeyJs, waitForTextJs, scrollJs, autoScrollJs, networkRequestsJs, } from './dom-helpers.js';
|
|
13
14
|
const CDP_SEND_TIMEOUT = 30_000; // 30s per command
|
|
14
15
|
export class CDPBridge {
|
|
@@ -35,7 +36,8 @@ export class CDPBridge {
|
|
|
35
36
|
}
|
|
36
37
|
return new Promise((resolve, reject) => {
|
|
37
38
|
const ws = new WebSocket(wsUrl);
|
|
38
|
-
const
|
|
39
|
+
const timeoutMs = (opts?.timeout ?? 10) * 1000; // opts.timeout is in seconds
|
|
40
|
+
const timeout = setTimeout(() => reject(new Error('CDP connect timeout')), timeoutMs);
|
|
39
41
|
ws.on('open', () => {
|
|
40
42
|
clearTimeout(timeout);
|
|
41
43
|
this._ws = ws;
|
|
@@ -137,12 +139,17 @@ class CDPPage {
|
|
|
137
139
|
this.bridge = bridge;
|
|
138
140
|
}
|
|
139
141
|
/** Navigate with proper load event waiting (P1 fix #3) */
|
|
140
|
-
async goto(url) {
|
|
142
|
+
async goto(url, options) {
|
|
141
143
|
await this.bridge.send('Page.enable');
|
|
142
144
|
const loadPromise = this.bridge.waitForEvent('Page.loadEventFired', 30_000)
|
|
143
145
|
.catch(() => { }); // Don't fail if event times out
|
|
144
146
|
await this.bridge.send('Page.navigate', { url });
|
|
145
147
|
await loadPromise;
|
|
148
|
+
// Post-load settle: SPA frameworks need extra time to render after load event
|
|
149
|
+
if (options?.waitUntil !== 'none') {
|
|
150
|
+
const settleMs = options?.settleMs ?? 1000;
|
|
151
|
+
await new Promise(resolve => setTimeout(resolve, settleMs));
|
|
152
|
+
}
|
|
146
153
|
}
|
|
147
154
|
async evaluate(js) {
|
|
148
155
|
const expression = wrapForEval(js);
|
|
@@ -158,14 +165,22 @@ class CDPPage {
|
|
|
158
165
|
}
|
|
159
166
|
async getCookies(opts = {}) {
|
|
160
167
|
const result = await this.bridge.send('Network.getCookies', opts.url ? { urls: [opts.url] } : {});
|
|
161
|
-
const cookies = Array.isArray(result
|
|
162
|
-
|
|
163
|
-
|
|
168
|
+
const cookies = isRecord(result) && Array.isArray(result.cookies) ? result.cookies : [];
|
|
169
|
+
const domain = opts.domain;
|
|
170
|
+
return domain
|
|
171
|
+
? cookies.filter((cookie) => isCookie(cookie) && cookie.domain.includes(domain))
|
|
164
172
|
: cookies;
|
|
165
173
|
}
|
|
166
|
-
async snapshot(
|
|
167
|
-
|
|
168
|
-
|
|
174
|
+
async snapshot(opts = {}) {
|
|
175
|
+
const snapshotJs = generateSnapshotJs({
|
|
176
|
+
viewportExpand: opts.viewportExpand ?? 800,
|
|
177
|
+
maxDepth: Math.max(1, Math.min(Number(opts.maxDepth) || 50, 200)),
|
|
178
|
+
interactiveOnly: opts.interactive ?? false,
|
|
179
|
+
maxTextLength: opts.maxTextLength ?? 120,
|
|
180
|
+
includeScrollInfo: true,
|
|
181
|
+
bboxDedup: true,
|
|
182
|
+
});
|
|
183
|
+
return this.evaluate(snapshotJs);
|
|
169
184
|
}
|
|
170
185
|
// ── Shared DOM operations (P1 fix #5 — using dom-helpers.ts) ──
|
|
171
186
|
async click(ref) {
|
|
@@ -177,13 +192,20 @@ class CDPPage {
|
|
|
177
192
|
async pressKey(key) {
|
|
178
193
|
await this.evaluate(pressKeyJs(key));
|
|
179
194
|
}
|
|
195
|
+
async scrollTo(ref) {
|
|
196
|
+
return this.evaluate(scrollToRefJs(ref));
|
|
197
|
+
}
|
|
198
|
+
async getFormState() {
|
|
199
|
+
return (await this.evaluate(getFormStateJs()));
|
|
200
|
+
}
|
|
180
201
|
async wait(options) {
|
|
181
202
|
if (typeof options === 'number') {
|
|
182
203
|
await new Promise(resolve => setTimeout(resolve, options * 1000));
|
|
183
204
|
return;
|
|
184
205
|
}
|
|
185
|
-
if (options.time) {
|
|
186
|
-
|
|
206
|
+
if (typeof options.time === 'number') {
|
|
207
|
+
const waitTime = options.time;
|
|
208
|
+
await new Promise(resolve => setTimeout(resolve, waitTime * 1000));
|
|
187
209
|
return;
|
|
188
210
|
}
|
|
189
211
|
if (options.text) {
|
|
@@ -206,7 +228,7 @@ class CDPPage {
|
|
|
206
228
|
quality: options.format === 'jpeg' ? (options.quality ?? 80) : undefined,
|
|
207
229
|
captureBeyondViewport: options.fullPage ?? false,
|
|
208
230
|
});
|
|
209
|
-
const base64 = result.data;
|
|
231
|
+
const base64 = isRecord(result) && typeof result.data === 'string' ? result.data : '';
|
|
210
232
|
if (options.path) {
|
|
211
233
|
const fs = await import('node:fs');
|
|
212
234
|
const path = await import('node:path');
|
|
@@ -217,7 +239,8 @@ class CDPPage {
|
|
|
217
239
|
return base64;
|
|
218
240
|
}
|
|
219
241
|
async networkRequests(includeStatic = false) {
|
|
220
|
-
|
|
242
|
+
const result = await this.evaluate(networkRequestsJs(includeStatic));
|
|
243
|
+
return Array.isArray(result) ? result : [];
|
|
221
244
|
}
|
|
222
245
|
async tabs() {
|
|
223
246
|
return [];
|
|
@@ -244,9 +267,18 @@ class CDPPage {
|
|
|
244
267
|
async getInterceptedRequests() {
|
|
245
268
|
const { generateReadInterceptedJs } = await import('../interceptor.js');
|
|
246
269
|
const result = await this.evaluate(generateReadInterceptedJs('__opencli_xhr'));
|
|
247
|
-
return result
|
|
270
|
+
return Array.isArray(result) ? result : [];
|
|
248
271
|
}
|
|
249
272
|
}
|
|
273
|
+
function isRecord(value) {
|
|
274
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
275
|
+
}
|
|
276
|
+
function isCookie(value) {
|
|
277
|
+
return isRecord(value)
|
|
278
|
+
&& typeof value.name === 'string'
|
|
279
|
+
&& typeof value.value === 'string'
|
|
280
|
+
&& typeof value.domain === 'string';
|
|
281
|
+
}
|
|
250
282
|
// ── CDP target selection (unchanged) ──
|
|
251
283
|
function selectCDPTarget(targets) {
|
|
252
284
|
const preferredPattern = compilePreferredPattern(process.env.OPENCLI_CDP_TARGET);
|
|
@@ -306,8 +338,6 @@ function scoreCDPTarget(target, preferredPattern) {
|
|
|
306
338
|
score += 120;
|
|
307
339
|
if (title.includes('discord'))
|
|
308
340
|
score += 120;
|
|
309
|
-
if (title.includes('netease'))
|
|
310
|
-
score += 120;
|
|
311
341
|
if (url.includes('antigravity'))
|
|
312
342
|
score += 100;
|
|
313
343
|
if (url.includes('codex'))
|
|
@@ -320,8 +350,6 @@ function scoreCDPTarget(target, preferredPattern) {
|
|
|
320
350
|
score += 100;
|
|
321
351
|
if (url.includes('discord'))
|
|
322
352
|
score += 100;
|
|
323
|
-
if (url.includes('netease'))
|
|
324
|
-
score += 100;
|
|
325
353
|
return score;
|
|
326
354
|
}
|
|
327
355
|
function compilePreferredPattern(raw) {
|
|
@@ -36,4 +36,5 @@ export declare function isExtensionConnected(): Promise<boolean>;
|
|
|
36
36
|
* Retries up to 3 times with 500ms delay for transient failures.
|
|
37
37
|
*/
|
|
38
38
|
export declare function sendCommand(action: DaemonCommand['action'], params?: Omit<DaemonCommand, 'id' | 'action'>): Promise<unknown>;
|
|
39
|
-
export declare function listSessions(): Promise<
|
|
39
|
+
export declare function listSessions(): Promise<BrowserSessionInfo[]>;
|
|
40
|
+
import type { BrowserSessionInfo } from '../types.js';
|
|
@@ -10,8 +10,21 @@ export function clickJs(ref) {
|
|
|
10
10
|
return `
|
|
11
11
|
(() => {
|
|
12
12
|
const ref = ${safeRef};
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
// 1. data-opencli-ref (set by snapshot engine)
|
|
14
|
+
let el = document.querySelector('[data-opencli-ref="' + ref + '"]');
|
|
15
|
+
// 2. data-ref (legacy)
|
|
16
|
+
if (!el) el = document.querySelector('[data-ref="' + ref + '"]');
|
|
17
|
+
// 3. CSS selector
|
|
18
|
+
if (!el && ref.match(/^[a-zA-Z#.\\[]/)) {
|
|
19
|
+
try { el = document.querySelector(ref); } catch {}
|
|
20
|
+
}
|
|
21
|
+
// 4. Numeric index into interactive elements
|
|
22
|
+
if (!el) {
|
|
23
|
+
const idx = parseInt(ref, 10);
|
|
24
|
+
if (!isNaN(idx)) {
|
|
25
|
+
el = document.querySelectorAll('a, button, input, select, textarea, [role="button"], [tabindex]:not([tabindex="-1"])')[idx];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
15
28
|
if (!el) throw new Error('Element not found: ' + ref);
|
|
16
29
|
el.scrollIntoView({ behavior: 'instant', block: 'center' });
|
|
17
30
|
el.click();
|
|
@@ -26,13 +39,31 @@ export function typeTextJs(ref, text) {
|
|
|
26
39
|
return `
|
|
27
40
|
(() => {
|
|
28
41
|
const ref = ${safeRef};
|
|
29
|
-
|
|
30
|
-
|
|
42
|
+
// 1. data-opencli-ref (set by snapshot engine)
|
|
43
|
+
let el = document.querySelector('[data-opencli-ref="' + ref + '"]');
|
|
44
|
+
// 2. data-ref (legacy)
|
|
45
|
+
if (!el) el = document.querySelector('[data-ref="' + ref + '"]');
|
|
46
|
+
// 3. CSS selector
|
|
47
|
+
if (!el && ref.match(/^[a-zA-Z#.\\[]/)) {
|
|
48
|
+
try { el = document.querySelector(ref); } catch {}
|
|
49
|
+
}
|
|
50
|
+
// 4. Numeric index into typeable elements
|
|
51
|
+
if (!el) {
|
|
52
|
+
const idx = parseInt(ref, 10);
|
|
53
|
+
if (!isNaN(idx)) {
|
|
54
|
+
el = document.querySelectorAll('input, textarea, [contenteditable="true"]')[idx];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
31
57
|
if (!el) throw new Error('Element not found: ' + ref);
|
|
32
58
|
el.focus();
|
|
33
|
-
el.
|
|
34
|
-
|
|
35
|
-
|
|
59
|
+
if (el.isContentEditable) {
|
|
60
|
+
el.textContent = ${safeText};
|
|
61
|
+
el.dispatchEvent(new Event('input', { bubbles: true }));
|
|
62
|
+
} else {
|
|
63
|
+
el.value = ${safeText};
|
|
64
|
+
el.dispatchEvent(new Event('input', { bubbles: true }));
|
|
65
|
+
el.dispatchEvent(new Event('change', { bubbles: true }));
|
|
66
|
+
}
|
|
36
67
|
return 'typed';
|
|
37
68
|
})()
|
|
38
69
|
`;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM Snapshot Engine — Advanced DOM pruning for LLM consumption.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by browser-use's multi-layer pruning pipeline, adapted for opencli's
|
|
5
|
+
* Chrome Extension + CDP architecture. Runs entirely in-page via Runtime.evaluate.
|
|
6
|
+
*
|
|
7
|
+
* Pipeline:
|
|
8
|
+
* 1. Walk DOM tree, collect visibility + layout + interactivity signals
|
|
9
|
+
* 2. Prune invisible, zero-area, non-content elements
|
|
10
|
+
* 3. SVG & decoration collapse
|
|
11
|
+
* 4. Shadow DOM traversal
|
|
12
|
+
* 5. Same-origin iframe content extraction
|
|
13
|
+
* 6. Bounding-box parent-child dedup (link/button wrapping children)
|
|
14
|
+
* 7. Paint-order occlusion detection (overlay/modal coverage)
|
|
15
|
+
* 8. Attribute whitelist filtering
|
|
16
|
+
* 9. Table-aware serialization (markdown tables)
|
|
17
|
+
* 10. Token-efficient serialization with interactive indices
|
|
18
|
+
* 11. data-ref annotation for click/type targeting
|
|
19
|
+
* 12. Hidden interactive element hints (scroll-to-reveal)
|
|
20
|
+
* 13. Incremental diff (mark new elements with *)
|
|
21
|
+
*
|
|
22
|
+
* Additional tools:
|
|
23
|
+
* - scrollToRefJs(ref) — scroll to a data-opencli-ref element
|
|
24
|
+
* - getFormStateJs() — extract all form fields as structured JSON
|
|
25
|
+
*/
|
|
26
|
+
export interface SnapshotOptions {
|
|
27
|
+
/** Extra pixels beyond viewport to include (default 800) */
|
|
28
|
+
viewportExpand?: number;
|
|
29
|
+
/** Maximum DOM depth to traverse (default 50) */
|
|
30
|
+
maxDepth?: number;
|
|
31
|
+
/** Only emit interactive elements and their landmark ancestors */
|
|
32
|
+
interactiveOnly?: boolean;
|
|
33
|
+
/** Maximum text content length per node (default 120) */
|
|
34
|
+
maxTextLength?: number;
|
|
35
|
+
/** Include scroll position info on scrollable containers (default true) */
|
|
36
|
+
includeScrollInfo?: boolean;
|
|
37
|
+
/** Enable bounding-box parent-child dedup (default true) */
|
|
38
|
+
bboxDedup?: boolean;
|
|
39
|
+
/** Traverse Shadow DOM roots (default true) */
|
|
40
|
+
includeShadowDom?: boolean;
|
|
41
|
+
/** Extract same-origin iframe content (default true) */
|
|
42
|
+
includeIframes?: boolean;
|
|
43
|
+
/** Maximum number of iframes to process (default 5) */
|
|
44
|
+
maxIframes?: number;
|
|
45
|
+
/** Enable paint-order occlusion detection (default true) */
|
|
46
|
+
paintOrderCheck?: boolean;
|
|
47
|
+
/** Annotate interactive elements with data-opencli-ref (default true) */
|
|
48
|
+
annotateRefs?: boolean;
|
|
49
|
+
/** Report hidden interactive elements outside viewport (default true) */
|
|
50
|
+
reportHidden?: boolean;
|
|
51
|
+
/** Filter ad/noise elements (default true) */
|
|
52
|
+
filterAds?: boolean;
|
|
53
|
+
/** Serialize tables as markdown (default true) */
|
|
54
|
+
markdownTables?: boolean;
|
|
55
|
+
/** Previous snapshot hash set (JSON array of hashes) for diff marking (default null) */
|
|
56
|
+
previousHashes?: string | null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generate JS to scroll to an element identified by data-opencli-ref.
|
|
60
|
+
* Completes the snapshot→action loop: snapshot identifies `[3]<button>`,
|
|
61
|
+
* caller can then `scrollToRef('3')` to bring it into view.
|
|
62
|
+
*/
|
|
63
|
+
export declare function scrollToRefJs(ref: string): string;
|
|
64
|
+
/**
|
|
65
|
+
* Generate JS to extract all form field values from the page.
|
|
66
|
+
* Returns structured JSON: { forms: [{ id, action, fields: [{ tag, type, name, value, ... }] }] }
|
|
67
|
+
*/
|
|
68
|
+
export declare function getFormStateJs(): string;
|
|
69
|
+
/**
|
|
70
|
+
* Generate JavaScript code that, when evaluated in a page context via CDP
|
|
71
|
+
* Runtime.evaluate, returns a pruned DOM snapshot string optimised for LLMs.
|
|
72
|
+
*
|
|
73
|
+
* The snapshot output format:
|
|
74
|
+
* [42]<button type=submit>Search</button>
|
|
75
|
+
* |scroll|<div> (0.5↑ 3.2↓)
|
|
76
|
+
* *[58]<a href=/r/1>Result 1</a>
|
|
77
|
+
* [59]<a href=/r/2>Result 2</a>
|
|
78
|
+
*
|
|
79
|
+
* - `[id]` — interactive element with backend index for targeting
|
|
80
|
+
* - `*` prefix — newly appeared element (incremental diff)
|
|
81
|
+
* - `|scroll|` — scrollable container with page counts
|
|
82
|
+
* - `|shadow|` — Shadow DOM boundary
|
|
83
|
+
* - `|iframe|` — iframe content
|
|
84
|
+
* - `|table|` — markdown table rendering
|
|
85
|
+
*/
|
|
86
|
+
export declare function generateSnapshotJs(opts?: SnapshotOptions): string;
|