publishport-opencli 1.0.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/LICENSE +214 -0
- package/README.md +299 -0
- package/README.zh-CN.md +341 -0
- package/cli-manifest.json +51513 -0
- package/clis/12306/auth.js +25 -0
- package/clis/12306/me.js +9 -0
- package/clis/12306/orders.js +13 -0
- package/clis/12306/passengers.js +14 -0
- package/clis/12306/price.js +1 -0
- package/clis/12306/stations.js +1 -0
- package/clis/12306/train.js +1 -0
- package/clis/12306/trains.js +1 -0
- package/clis/12306/utils.js +1 -0
- package/clis/1688/assets.js +127 -0
- package/clis/1688/auth.js +1 -0
- package/clis/1688/download.js +1 -0
- package/clis/1688/item.js +21 -0
- package/clis/1688/search.js +129 -0
- package/clis/1688/shared.js +11 -0
- package/clis/1688/store.js +26 -0
- package/clis/1point3acres/auth.js +18 -0
- package/clis/1point3acres/digest.js +1 -0
- package/clis/1point3acres/forum.js +1 -0
- package/clis/1point3acres/forums.js +1 -0
- package/clis/1point3acres/hot.js +1 -0
- package/clis/1point3acres/latest.js +1 -0
- package/clis/1point3acres/notifications.js +1 -0
- package/clis/1point3acres/search.js +1 -0
- package/clis/1point3acres/thread.js +2 -0
- package/clis/1point3acres/user.js +1 -0
- package/clis/1point3acres/utils.js +6 -0
- package/clis/36kr/article.js +20 -0
- package/clis/36kr/hot.js +16 -0
- package/clis/36kr/news.js +1 -0
- package/clis/36kr/search.js +36 -0
- package/clis/51job/company.js +36 -0
- package/clis/51job/detail.js +35 -0
- package/clis/51job/hot.js +1 -0
- package/clis/51job/search.js +1 -0
- package/clis/51job/utils.js +21 -0
- package/clis/_atlassian/shared.js +21 -0
- package/clis/_shared/article/auth.js +16 -0
- package/clis/_shared/article/douban-md2draft.js +4 -0
- package/clis/_shared/article/format.js +1 -0
- package/clis/_shared/article/images.js +95 -0
- package/clis/_shared/article/login.js +1 -0
- package/clis/_shared/article/page-runtime.js +745 -0
- package/clis/_shared/article/publish.js +34 -0
- package/clis/_shared/common.js +1 -0
- package/clis/_shared/content-guard.js +1 -0
- package/clis/_shared/desktop-commands.js +1 -0
- package/clis/_shared/search-adapter.js +1 -0
- package/clis/_shared/site-auth.js +1 -0
- package/clis/_shared/token-auth.js +2 -0
- package/clis/_shared/video-publish.js +62 -0
- package/clis/aibase/news.js +31 -0
- package/clis/amazon/auth.js +19 -0
- package/clis/amazon/bestsellers.js +1 -0
- package/clis/amazon/discussion.js +20 -0
- package/clis/amazon/movers-shakers.js +1 -0
- package/clis/amazon/new-releases.js +1 -0
- package/clis/amazon/offer.js +29 -0
- package/clis/amazon/product.js +25 -0
- package/clis/amazon/rankings.js +68 -0
- package/clis/amazon/search.js +16 -0
- package/clis/amazon/shared.js +11 -0
- package/clis/antigravity/SKILL.md +38 -0
- package/clis/antigravity/_actions.js +201 -0
- package/clis/antigravity/audit-extras.js +78 -0
- package/clis/antigravity/delete.js +1 -0
- package/clis/antigravity/dump.js +1 -0
- package/clis/antigravity/extract-code.js +18 -0
- package/clis/antigravity/history.js +1 -0
- package/clis/antigravity/mark-read.js +1 -0
- package/clis/antigravity/model.js +90 -0
- package/clis/antigravity/new.js +9 -0
- package/clis/antigravity/read.js +10 -0
- package/clis/antigravity/rename.js +1 -0
- package/clis/antigravity/send.js +11 -0
- package/clis/antigravity/serve.js +97 -0
- package/clis/antigravity/status.js +1 -0
- package/clis/antigravity/storage.js +12 -0
- package/clis/antigravity/watch.js +6 -0
- package/clis/apple-podcasts/episodes.js +1 -0
- package/clis/apple-podcasts/search.js +1 -0
- package/clis/apple-podcasts/top.js +1 -0
- package/clis/apple-podcasts/utils.js +1 -0
- package/clis/archive/item.js +1 -0
- package/clis/archive/search.js +1 -0
- package/clis/archive/snapshots.js +1 -0
- package/clis/archive/wayback.js +1 -0
- package/clis/arxiv/author.js +1 -0
- package/clis/arxiv/paper.js +1 -0
- package/clis/arxiv/recent.js +1 -0
- package/clis/arxiv/search.js +1 -0
- package/clis/arxiv/utils.js +1 -0
- package/clis/autohome/__fixtures__/catalog.html +11 -0
- package/clis/autohome/__fixtures__/koubei.json +116 -0
- package/clis/autohome/brand.js +1 -0
- package/clis/autohome/score.js +1 -0
- package/clis/autohome/utils.js +1 -0
- package/clis/baidu-scholar/search.js +63 -0
- package/clis/baijiahao/article.js +1 -0
- package/clis/baijiahao/lists.js +1 -0
- package/clis/baijiahao/login.js +1 -0
- package/clis/baijiahao/publish.js +57 -0
- package/clis/baijiahao/stats.js +1 -0
- package/clis/baijiahao/whoami.js +1 -0
- package/clis/band/auth.js +29 -0
- package/clis/band/bands.js +37 -0
- package/clis/band/mentions.js +6 -0
- package/clis/band/post.js +76 -0
- package/clis/band/posts.js +50 -0
- package/clis/barchart/flow.js +70 -0
- package/clis/barchart/greeks.js +88 -0
- package/clis/barchart/options.js +61 -0
- package/clis/barchart/quote.js +87 -0
- package/clis/bbc/news.js +1 -0
- package/clis/bbc/topic.js +1 -0
- package/clis/bbc/utils.js +1 -0
- package/clis/bilibili/article.js +1 -0
- package/clis/bilibili/auth.js +1 -0
- package/clis/bilibili/categories.js +1 -0
- package/clis/bilibili/coin.js +1 -0
- package/clis/bilibili/comment-del.js +1 -0
- package/clis/bilibili/comment-like.js +1 -0
- package/clis/bilibili/comment.js +1 -0
- package/clis/bilibili/comments.js +1 -0
- package/clis/bilibili/dm-list.js +1 -0
- package/clis/bilibili/dm-read.js +1 -0
- package/clis/bilibili/dm-send.js +1 -0
- package/clis/bilibili/download.js +7 -0
- package/clis/bilibili/drafts.js +1 -0
- package/clis/bilibili/dynamic-post.js +24 -0
- package/clis/bilibili/dynamic.js +1 -0
- package/clis/bilibili/favorite-add.js +1 -0
- package/clis/bilibili/favorite.js +1 -0
- package/clis/bilibili/feed.js +2 -0
- package/clis/bilibili/follow.js +1 -0
- package/clis/bilibili/following.js +1 -0
- package/clis/bilibili/history.js +1 -0
- package/clis/bilibili/hot.js +15 -0
- package/clis/bilibili/like.js +1 -0
- package/clis/bilibili/me.js +1 -0
- package/clis/bilibili/partitions.js +1 -0
- package/clis/bilibili/ranking.js +1 -0
- package/clis/bilibili/search.js +1 -0
- package/clis/bilibili/stats.js +1 -0
- package/clis/bilibili/subtitle.js +21 -0
- package/clis/bilibili/summary.js +1 -0
- package/clis/bilibili/topics.js +1 -0
- package/clis/bilibili/unfollow.js +1 -0
- package/clis/bilibili/upload.js +1 -0
- package/clis/bilibili/user-videos.js +1 -0
- package/clis/bilibili/utils.js +50 -0
- package/clis/bilibili/video-drafts.js +1 -0
- package/clis/bilibili/video.js +1 -0
- package/clis/binance/asks.js +1 -0
- package/clis/binance/depth.js +1 -0
- package/clis/binance/gainers.js +1 -0
- package/clis/binance/klines.js +1 -0
- package/clis/binance/losers.js +1 -0
- package/clis/binance/pairs.js +1 -0
- package/clis/binance/price.js +1 -0
- package/clis/binance/prices.js +1 -0
- package/clis/binance/ticker.js +1 -0
- package/clis/binance/top.js +1 -0
- package/clis/binance/trades.js +1 -0
- package/clis/bloomberg/businessweek.js +12 -0
- package/clis/bloomberg/crypto.js +1 -0
- package/clis/bloomberg/economics.js +1 -0
- package/clis/bloomberg/feeds.js +1 -0
- package/clis/bloomberg/green.js +1 -0
- package/clis/bloomberg/industries.js +1 -0
- package/clis/bloomberg/main.js +1 -0
- package/clis/bloomberg/markets.js +1 -0
- package/clis/bloomberg/news.js +57 -0
- package/clis/bloomberg/opinions.js +1 -0
- package/clis/bloomberg/politics.js +1 -0
- package/clis/bloomberg/pursuits.js +1 -0
- package/clis/bloomberg/tech.js +1 -0
- package/clis/bloomberg/utils.js +17 -0
- package/clis/bluesky/post.js +1 -0
- package/clis/bluesky/shared.js +56 -0
- package/clis/bluesky/whoami.js +1 -0
- package/clis/booking/search.js +93 -0
- package/clis/boss/auth.js +13 -0
- package/clis/boss/batchgreet.js +1 -0
- package/clis/boss/chatlist.js +1 -0
- package/clis/boss/chatmsg.js +1 -0
- package/clis/boss/detail.js +1 -0
- package/clis/boss/exchange.js +1 -0
- package/clis/boss/greet.js +1 -0
- package/clis/boss/invite.js +4 -0
- package/clis/boss/joblist.js +1 -0
- package/clis/boss/mark.js +1 -0
- package/clis/boss/recommend.js +1 -0
- package/clis/boss/resume.js +90 -0
- package/clis/boss/search.js +1 -0
- package/clis/boss/send.js +1 -0
- package/clis/boss/stats.js +1 -0
- package/clis/boss/utils.js +161 -0
- package/clis/brave/search.js +23 -0
- package/clis/chaoxing/assignments.js +1 -0
- package/clis/chaoxing/auth.js +21 -0
- package/clis/chaoxing/exams.js +1 -0
- package/clis/chaoxing/utils.js +58 -0
- package/clis/chatgpt/ask.js +1 -0
- package/clis/chatgpt/auth.js +17 -0
- package/clis/chatgpt/detail.js +1 -0
- package/clis/chatgpt/history.js +1 -0
- package/clis/chatgpt/image.js +1 -0
- package/clis/chatgpt/model.js +1 -0
- package/clis/chatgpt/new.js +1 -0
- package/clis/chatgpt/project-file-add.js +1 -0
- package/clis/chatgpt/project-list.js +1 -0
- package/clis/chatgpt/read.js +1 -0
- package/clis/chatgpt/send.js +1 -0
- package/clis/chatgpt/status.js +1 -0
- package/clis/chatgpt/utils.js +1092 -0
- package/clis/chatgpt-app/ask.js +1 -0
- package/clis/chatgpt-app/ax.js +512 -0
- package/clis/chatgpt-app/model.js +1 -0
- package/clis/chatgpt-app/new.js +1 -0
- package/clis/chatgpt-app/read.js +1 -0
- package/clis/chatgpt-app/send.js +1 -0
- package/clis/chatgpt-app/status.js +1 -0
- package/clis/chatwise/ask.js +1 -0
- package/clis/chatwise/export.js +21 -0
- package/clis/chatwise/history.js +26 -0
- package/clis/chatwise/model.js +48 -0
- package/clis/chatwise/new.js +1 -0
- package/clis/chatwise/read.js +25 -0
- package/clis/chatwise/screenshot.js +1 -0
- package/clis/chatwise/send.js +1 -0
- package/clis/chatwise/status.js +1 -0
- package/clis/chatwise/utils.js +75 -0
- package/clis/chess/analyze.js +1 -0
- package/clis/chess/game.js +1 -0
- package/clis/chess/games.js +1 -0
- package/clis/chess/stats.js +1 -0
- package/clis/chess/utils.js +1 -0
- package/clis/claude/ask.js +4 -0
- package/clis/claude/auth.js +19 -0
- package/clis/claude/detail.js +1 -0
- package/clis/claude/history.js +1 -0
- package/clis/claude/new.js +1 -0
- package/clis/claude/read.js +1 -0
- package/clis/claude/send.js +1 -0
- package/clis/claude/status.js +1 -0
- package/clis/claude/utils.js +179 -0
- package/clis/cnblogs/article.js +1 -0
- package/clis/cnblogs/login.js +1 -0
- package/clis/cnblogs/stats.js +37 -0
- package/clis/cnblogs/whoami.js +1 -0
- package/clis/cnki/search.js +38 -0
- package/clis/codex/_actions.js +72 -0
- package/clis/codex/archive.js +1 -0
- package/clis/codex/ask.js +23 -0
- package/clis/codex/dump.js +1 -0
- package/clis/codex/export.js +12 -0
- package/clis/codex/extract-diff.js +28 -0
- package/clis/codex/history.js +1 -0
- package/clis/codex/model.js +118 -0
- package/clis/codex/new.js +1 -0
- package/clis/codex/pin.js +1 -0
- package/clis/codex/projects.js +1 -0
- package/clis/codex/read.js +16 -0
- package/clis/codex/rename.js +34 -0
- package/clis/codex/screenshot.js +1 -0
- package/clis/codex/send.js +16 -0
- package/clis/codex/sidebar.js +1 -0
- package/clis/codex/status.js +1 -0
- package/clis/coingecko/categories.js +1 -0
- package/clis/coingecko/coin.js +1 -0
- package/clis/coingecko/derivatives.js +1 -0
- package/clis/coingecko/exchanges.js +1 -0
- package/clis/coingecko/global.js +1 -0
- package/clis/coingecko/top.js +1 -0
- package/clis/coingecko/trending.js +1 -0
- package/clis/confluence/create.js +1 -0
- package/clis/confluence/page.js +1 -0
- package/clis/confluence/search.js +1 -0
- package/clis/confluence/shared.js +1 -0
- package/clis/confluence/update.js +1 -0
- package/clis/coupang/add-to-cart.js +86 -0
- package/clis/coupang/auth.js +16 -0
- package/clis/coupang/product.js +161 -0
- package/clis/coupang/search.js +385 -0
- package/clis/coupang/utils.js +1 -0
- package/clis/crates/crate.js +1 -0
- package/clis/crates/search.js +1 -0
- package/clis/crates/utils.js +1 -0
- package/clis/csdn/article.js +29 -0
- package/clis/csdn/columns.js +1 -0
- package/clis/csdn/login.js +1 -0
- package/clis/csdn/stats.js +71 -0
- package/clis/csdn/whoami.js +1 -0
- package/clis/cto51/article.js +1 -0
- package/clis/cto51/whoami.js +1 -0
- package/clis/ctrip/auth.js +1 -0
- package/clis/ctrip/flight.js +17 -0
- package/clis/ctrip/hotel-search.js +24 -0
- package/clis/ctrip/hotel-suggest.js +1 -0
- package/clis/ctrip/search.js +1 -0
- package/clis/ctrip/utils.js +119 -0
- package/clis/cursor/ask.js +22 -0
- package/clis/cursor/composer.js +12 -0
- package/clis/cursor/dump.js +1 -0
- package/clis/cursor/export.js +23 -0
- package/clis/cursor/extract-code.js +18 -0
- package/clis/cursor/history.js +26 -0
- package/clis/cursor/model.js +18 -0
- package/clis/cursor/new.js +1 -0
- package/clis/cursor/read.js +27 -0
- package/clis/cursor/screenshot.js +1 -0
- package/clis/cursor/send.js +12 -0
- package/clis/cursor/status.js +1 -0
- package/clis/dblp/author.js +1 -0
- package/clis/dblp/paper.js +1 -0
- package/clis/dblp/search.js +1 -0
- package/clis/dblp/utils.js +1 -0
- package/clis/dblp/venue.js +1 -0
- package/clis/deepseek/ask.js +1 -0
- package/clis/deepseek/auth.js +22 -0
- package/clis/deepseek/detail.js +1 -0
- package/clis/deepseek/history.js +1 -0
- package/clis/deepseek/new.js +1 -0
- package/clis/deepseek/read.js +1 -0
- package/clis/deepseek/send.js +50 -0
- package/clis/deepseek/status.js +1 -0
- package/clis/deepseek/utils.js +202 -0
- package/clis/defillama/protocol.js +1 -0
- package/clis/defillama/protocols.js +1 -0
- package/clis/defillama/utils.js +1 -0
- package/clis/devto/auth.js +9 -0
- package/clis/devto/latest.js +1 -0
- package/clis/devto/publish.js +17 -0
- package/clis/devto/read.js +3 -0
- package/clis/devto/stats.js +27 -0
- package/clis/devto/tag.js +1 -0
- package/clis/devto/top.js +1 -0
- package/clis/devto/user.js +1 -0
- package/clis/dianping/__fixtures__/search.html +168 -0
- package/clis/dianping/__fixtures__/shop.html +6 -0
- package/clis/dianping/auth.js +10 -0
- package/clis/dianping/cityResolver.js +4 -0
- package/clis/dianping/search.js +1 -0
- package/clis/dianping/shop.js +1 -0
- package/clis/dianping/utils.js +1 -0
- package/clis/dictionary/examples.js +1 -0
- package/clis/dictionary/search.js +1 -0
- package/clis/dictionary/synonyms.js +1 -0
- package/clis/discord-app/channels.js +1 -0
- package/clis/discord-app/delete.js +66 -0
- package/clis/discord-app/goto.js +1 -0
- package/clis/discord-app/members.js +21 -0
- package/clis/discord-app/read.js +1 -0
- package/clis/discord-app/search.js +29 -0
- package/clis/discord-app/send.js +10 -0
- package/clis/discord-app/servers.js +1 -0
- package/clis/discord-app/status.js +1 -0
- package/clis/discord-app/thread-read.js +1 -0
- package/clis/discord-app/threads.js +1 -0
- package/clis/discord-app/utils.js +226 -0
- package/clis/discord-web/auth.js +10 -0
- package/clis/discord-web/send.js +13 -0
- package/clis/dockerhub/image.js +1 -0
- package/clis/dockerhub/search.js +1 -0
- package/clis/dockerhub/utils.js +1 -0
- package/clis/dongchedi/__fixtures__/search.json +60 -0
- package/clis/dongchedi/__fixtures__/series-detail.json +911 -0
- package/clis/dongchedi/__fixtures__/series-score.json +1396 -0
- package/clis/dongchedi/koubei.js +1 -0
- package/clis/dongchedi/models.js +1 -0
- package/clis/dongchedi/score.js +1 -0
- package/clis/dongchedi/search.js +1 -0
- package/clis/dongchedi/series.js +1 -0
- package/clis/dongchedi/specs.js +1 -0
- package/clis/dongchedi/utils.js +1 -0
- package/clis/douban/article.js +53 -0
- package/clis/douban/auth.js +21 -0
- package/clis/douban/book-hot.js +1 -0
- package/clis/douban/download.js +1 -0
- package/clis/douban/marks.js +59 -0
- package/clis/douban/movie-hot.js +1 -0
- package/clis/douban/photos.js +1 -0
- package/clis/douban/reviews.js +53 -0
- package/clis/douban/search.js +1 -0
- package/clis/douban/subject.js +1 -0
- package/clis/douban/top250.js +50 -0
- package/clis/douban/utils.js +344 -0
- package/clis/doubao/ask.js +1 -0
- package/clis/doubao/auth.js +28 -0
- package/clis/doubao/detail.js +1 -0
- package/clis/doubao/history.js +1 -0
- package/clis/doubao/meeting-summary.js +1 -0
- package/clis/doubao/meeting-transcript.js +1 -0
- package/clis/doubao/new.js +1 -0
- package/clis/doubao/read.js +1 -0
- package/clis/doubao/send.js +1 -0
- package/clis/doubao/status.js +1 -0
- package/clis/doubao/utils.js +704 -0
- package/clis/doubao-app/ask.js +1 -0
- package/clis/doubao-app/dump.js +1 -0
- package/clis/doubao-app/new.js +1 -0
- package/clis/doubao-app/read.js +1 -0
- package/clis/doubao-app/screenshot.js +1 -0
- package/clis/doubao-app/send.js +1 -0
- package/clis/doubao-app/status.js +1 -0
- package/clis/doubao-app/utils.js +64 -0
- package/clis/douyin/_shared/browser-fetch.js +28 -0
- package/clis/douyin/_shared/creation-id.js +1 -0
- package/clis/douyin/_shared/evaluate-result.js +1 -0
- package/clis/douyin/_shared/imagex-upload.js +1 -0
- package/clis/douyin/_shared/public-api.js +1 -0
- package/clis/douyin/_shared/sts2.js +1 -0
- package/clis/douyin/_shared/text-extra.js +1 -0
- package/clis/douyin/_shared/timing.js +1 -0
- package/clis/douyin/_shared/tos-upload.js +5 -0
- package/clis/douyin/_shared/transcode.js +1 -0
- package/clis/douyin/_shared/types.js +1 -0
- package/clis/douyin/_shared/vod-upload.js +5 -0
- package/clis/douyin/activities.js +1 -0
- package/clis/douyin/auth.js +1 -0
- package/clis/douyin/collections.js +1 -0
- package/clis/douyin/delete.js +76 -0
- package/clis/douyin/draft.js +166 -0
- package/clis/douyin/drafts.js +1 -0
- package/clis/douyin/hashtag.js +1 -0
- package/clis/douyin/location.js +1 -0
- package/clis/douyin/profile.js +1 -0
- package/clis/douyin/publish-image.js +64 -0
- package/clis/douyin/publish.js +14 -0
- package/clis/douyin/search.js +51 -0
- package/clis/douyin/stats.js +1 -0
- package/clis/douyin/update.js +1 -0
- package/clis/douyin/user-videos.js +1 -0
- package/clis/douyin/videos.js +1 -0
- package/clis/duckduckgo/search.js +1 -0
- package/clis/duckduckgo/suggest.js +1 -0
- package/clis/eastmoney/_secid.js +1 -0
- package/clis/eastmoney/announcement.js +1 -0
- package/clis/eastmoney/article.js +1 -0
- package/clis/eastmoney/convertible.js +1 -0
- package/clis/eastmoney/etf.js +1 -0
- package/clis/eastmoney/holders.js +1 -0
- package/clis/eastmoney/hot-rank.js +30 -0
- package/clis/eastmoney/index-board.js +1 -0
- package/clis/eastmoney/kline.js +1 -0
- package/clis/eastmoney/kuaixun.js +1 -0
- package/clis/eastmoney/longhu.js +1 -0
- package/clis/eastmoney/money-flow.js +1 -0
- package/clis/eastmoney/northbound.js +1 -0
- package/clis/eastmoney/quote.js +1 -0
- package/clis/eastmoney/rank.js +1 -0
- package/clis/eastmoney/sectors.js +1 -0
- package/clis/eastmoney/whoami.js +1 -0
- package/clis/endoflife/product.js +1 -0
- package/clis/endoflife/utils.js +1 -0
- package/clis/facebook/__fixtures__/notifications-page.html +13 -0
- package/clis/facebook/add-friend.js +24 -0
- package/clis/facebook/auth.js +1 -0
- package/clis/facebook/comment.js +18 -0
- package/clis/facebook/events.js +26 -0
- package/clis/facebook/feed.js +209 -0
- package/clis/facebook/friends.js +24 -0
- package/clis/facebook/groups.js +32 -0
- package/clis/facebook/join-group.js +25 -0
- package/clis/facebook/like.js +29 -0
- package/clis/facebook/marketplace-inbox.js +34 -0
- package/clis/facebook/marketplace-listings.js +33 -0
- package/clis/facebook/memories.js +21 -0
- package/clis/facebook/notifications.js +31 -0
- package/clis/facebook/post.js +88 -0
- package/clis/facebook/profile.js +18 -0
- package/clis/facebook/search.js +22 -0
- package/clis/flathub/app.js +1 -0
- package/clis/flathub/search.js +1 -0
- package/clis/flathub/utils.js +1 -0
- package/clis/flomo/auth.js +22 -0
- package/clis/flomo/memos.js +13 -0
- package/clis/gemini/ask.js +1 -0
- package/clis/gemini/auth.js +14 -0
- package/clis/gemini/deep-research-result.js +4 -0
- package/clis/gemini/deep-research.js +1 -0
- package/clis/gemini/detail.js +1 -0
- package/clis/gemini/history.js +1 -0
- package/clis/gemini/image.js +3 -0
- package/clis/gemini/new.js +1 -0
- package/clis/gemini/read.js +1 -0
- package/clis/gemini/status.js +1 -0
- package/clis/gemini/utils.js +1234 -0
- package/clis/geogebra/add-circle.js +1 -0
- package/clis/geogebra/add-line.js +1 -0
- package/clis/geogebra/add-point.js +1 -0
- package/clis/geogebra/add-polygon.js +1 -0
- package/clis/geogebra/eval.js +1 -0
- package/clis/geogebra/hexagon.js +1 -0
- package/clis/geogebra/info.js +13 -0
- package/clis/geogebra/list.js +1 -0
- package/clis/geogebra/triangle.js +1 -0
- package/clis/geogebra/utils.js +99 -0
- package/clis/ghost/publish.js +1 -0
- package/clis/ghost/shared.js +1 -0
- package/clis/ghost/whoami.js +1 -0
- package/clis/gitee/auth.js +12 -0
- package/clis/gitee/index.js +1 -0
- package/clis/gitee/search.js +1 -0
- package/clis/gitee/trending.js +240 -0
- package/clis/gitee/user.js +71 -0
- package/clis/github/auth.js +7 -0
- package/clis/github-trending/repos.js +1 -0
- package/clis/google/news.js +1 -0
- package/clis/google/search.js +90 -0
- package/clis/google/suggest.js +1 -0
- package/clis/google/trends.js +1 -0
- package/clis/google/utils.js +1 -0
- package/clis/google-scholar/cite.js +20 -0
- package/clis/google-scholar/profile.js +36 -0
- package/clis/google-scholar/search.js +35 -0
- package/clis/goproxy/module.js +1 -0
- package/clis/goproxy/utils.js +1 -0
- package/clis/goproxy/versions.js +1 -0
- package/clis/gov-law/recent.js +1 -0
- package/clis/gov-law/search.js +14 -0
- package/clis/gov-law/shared.js +29 -0
- package/clis/gov-policy/__fixtures__/recent.html +16 -0
- package/clis/gov-policy/__fixtures__/search.html +41 -0
- package/clis/gov-policy/recent.js +8 -0
- package/clis/gov-policy/search.js +8 -0
- package/clis/gov-policy/utils.js +1 -0
- package/clis/grok/ask.js +1 -0
- package/clis/grok/auth.js +17 -0
- package/clis/grok/delete.js +1 -0
- package/clis/grok/detail.js +1 -0
- package/clis/grok/export-all.js +170 -0
- package/clis/grok/export-utils.js +1 -0
- package/clis/grok/export.js +106 -0
- package/clis/grok/history.js +1 -0
- package/clis/grok/image.js +119 -0
- package/clis/grok/image.test.ts +127 -0
- package/clis/grok/new.js +1 -0
- package/clis/grok/pin.js +1 -0
- package/clis/grok/read.js +1 -0
- package/clis/grok/send.js +1 -0
- package/clis/grok/status.js +1 -0
- package/clis/grok/utils.js +337 -0
- package/clis/guazi/__fixtures__/detail.html +7 -0
- package/clis/guazi/__fixtures__/list.html +5 -0
- package/clis/guazi/browse.js +1 -0
- package/clis/guazi/car.js +1 -0
- package/clis/guazi/utils.js +1 -0
- package/clis/hackernews/ask.js +1 -0
- package/clis/hackernews/auth.js +9 -0
- package/clis/hackernews/best.js +1 -0
- package/clis/hackernews/comment.js +61 -0
- package/clis/hackernews/jobs.js +1 -0
- package/clis/hackernews/new.js +1 -0
- package/clis/hackernews/read.js +11 -0
- package/clis/hackernews/search.js +1 -0
- package/clis/hackernews/show.js +1 -0
- package/clis/hackernews/submit.js +65 -0
- package/clis/hackernews/top.js +1 -0
- package/clis/hackernews/user.js +1 -0
- package/clis/hashnode/auth.js +11 -0
- package/clis/hashnode/publish.js +92 -0
- package/clis/hf/auth.js +12 -0
- package/clis/hf/datasets.js +1 -0
- package/clis/hf/models.js +1 -0
- package/clis/hf/paper.js +1 -0
- package/clis/hf/spaces.js +1 -0
- package/clis/hf/top.js +1 -0
- package/clis/homebrew/cask.js +1 -0
- package/clis/homebrew/formula.js +1 -0
- package/clis/homebrew/popular.js +1 -0
- package/clis/homebrew/utils.js +1 -0
- package/clis/huodongxing/events.js +1 -0
- package/clis/hupu/__fixtures__/hot-home.html +64 -0
- package/clis/hupu/auth.js +14 -0
- package/clis/hupu/detail.js +7 -0
- package/clis/hupu/hot.js +14 -0
- package/clis/hupu/like.js +1 -0
- package/clis/hupu/mentions.js +91 -0
- package/clis/hupu/reply.js +1 -0
- package/clis/hupu/search.js +1 -0
- package/clis/hupu/unlike.js +1 -0
- package/clis/hupu/utils.js +243 -0
- package/clis/imdb/person.js +140 -0
- package/clis/imdb/reviews.js +40 -0
- package/clis/imdb/search.js +113 -0
- package/clis/imdb/title.js +1 -0
- package/clis/imdb/top.js +1 -0
- package/clis/imdb/trending.js +1 -0
- package/clis/imdb/utils.js +162 -0
- package/clis/imooc/article.js +59 -0
- package/clis/imooc/login.js +1 -0
- package/clis/imooc/whoami.js +1 -0
- package/clis/indeed/job.js +20 -0
- package/clis/indeed/search.js +37 -0
- package/clis/indeed/utils.js +1 -0
- package/clis/infoq/article.js +19 -0
- package/clis/infoq/login.js +1 -0
- package/clis/infoq/whoami.js +1 -0
- package/clis/instagram/_shared/private-publish.js +75 -0
- package/clis/instagram/_shared/protocol-capture.js +180 -0
- package/clis/instagram/_shared/runtime-info.js +33 -0
- package/clis/instagram/auth.js +22 -0
- package/clis/instagram/collection-create.js +38 -0
- package/clis/instagram/collection-delete.js +72 -0
- package/clis/instagram/comment.js +26 -0
- package/clis/instagram/detail.js +2 -0
- package/clis/instagram/download.js +83 -0
- package/clis/instagram/explore.js +27 -0
- package/clis/instagram/follow.js +24 -0
- package/clis/instagram/followers.js +30 -0
- package/clis/instagram/following.js +74 -0
- package/clis/instagram/like.js +25 -0
- package/clis/instagram/note.js +162 -0
- package/clis/instagram/post.js +718 -0
- package/clis/instagram/profile.js +25 -0
- package/clis/instagram/reel.js +452 -0
- package/clis/instagram/save.js +25 -0
- package/clis/instagram/saved.js +37 -0
- package/clis/instagram/search.js +23 -0
- package/clis/instagram/story.js +21 -0
- package/clis/instagram/unfollow.js +21 -0
- package/clis/instagram/unlike.js +25 -0
- package/clis/instagram/unsave.js +25 -0
- package/clis/instagram/user.js +1 -0
- package/clis/jd/add-cart.js +22 -0
- package/clis/jd/auth.js +12 -0
- package/clis/jd/cart.js +59 -0
- package/clis/jd/detail.js +42 -0
- package/clis/jd/item.js +98 -0
- package/clis/jd/item.test.ts +517 -0
- package/clis/jd/reviews.js +31 -0
- package/clis/jd/search.js +42 -0
- package/clis/jianshu/article.js +1 -0
- package/clis/jianshu/login.js +1 -0
- package/clis/jianshu/notebooks.js +1 -0
- package/clis/jianshu/whoami.js +1 -0
- package/clis/jianyu/auth.js +28 -0
- package/clis/jianyu/detail.js +1 -0
- package/clis/jianyu/search.js +73 -0
- package/clis/jianyu/shared/china-bid-search.js +86 -0
- package/clis/jianyu/shared/procurement-contract.js +1 -0
- package/clis/jianyu/shared/procurement-detail.js +18 -0
- package/clis/jike/auth.js +19 -0
- package/clis/jike/comment.js +82 -0
- package/clis/jike/create.js +83 -0
- package/clis/jike/feed.js +32 -0
- package/clis/jike/like.js +38 -0
- package/clis/jike/notifications.js +115 -0
- package/clis/jike/post.js +33 -0
- package/clis/jike/repost.js +67 -0
- package/clis/jike/search.js +29 -0
- package/clis/jike/topic.js +20 -0
- package/clis/jike/user.js +19 -0
- package/clis/jike/utils.js +15 -0
- package/clis/jimeng/auth.js +13 -0
- package/clis/jimeng/generate.js +60 -0
- package/clis/jimeng/history.js +32 -0
- package/clis/jimeng/new.js +26 -0
- package/clis/jimeng/workspaces.js +22 -0
- package/clis/jira/attachments.js +1 -0
- package/clis/jira/comments.js +1 -0
- package/clis/jira/issue.js +1 -0
- package/clis/jira/links.js +1 -0
- package/clis/jira/search.js +1 -0
- package/clis/jira/shared.js +1 -0
- package/clis/juejin/article.js +5 -0
- package/clis/juejin/categories.js +1 -0
- package/clis/juejin/hot.js +1 -0
- package/clis/juejin/login.js +1 -0
- package/clis/juejin/recommend.js +1 -0
- package/clis/juejin/stats.js +53 -0
- package/clis/juejin/tags.js +1 -0
- package/clis/juejin/utils.js +1 -0
- package/clis/juejin/whoami.js +1 -0
- package/clis/ke/auth.js +14 -0
- package/clis/ke/chengjiao.js +45 -0
- package/clis/ke/ershoufang.js +50 -0
- package/clis/ke/utils.js +21 -0
- package/clis/ke/xiaoqu.js +45 -0
- package/clis/ke/zufang.js +50 -0
- package/clis/kimi/_utils.js +38 -0
- package/clis/kimi/audit-extras.js +64 -0
- package/clis/kimi/auth.js +17 -0
- package/clis/kimi/chat.js +77 -0
- package/clis/kimi/storage.js +14 -0
- package/clis/kimi/ui.js +89 -0
- package/clis/kimi/usage.js +51 -0
- package/clis/kuaishou/auth.js +1 -0
- package/clis/kuaishou/publish.js +53 -0
- package/clis/lesswrong/_helpers.js +9 -0
- package/clis/lesswrong/comments.js +9 -0
- package/clis/lesswrong/curated.js +5 -0
- package/clis/lesswrong/frontpage.js +5 -0
- package/clis/lesswrong/new.js +5 -0
- package/clis/lesswrong/read.js +5 -0
- package/clis/lesswrong/sequences.js +5 -0
- package/clis/lesswrong/shortform.js +5 -0
- package/clis/lesswrong/tag.js +5 -0
- package/clis/lesswrong/tags.js +5 -0
- package/clis/lesswrong/top-month.js +5 -0
- package/clis/lesswrong/top-week.js +5 -0
- package/clis/lesswrong/top-year.js +5 -0
- package/clis/lesswrong/top.js +5 -0
- package/clis/lesswrong/user-posts.js +5 -0
- package/clis/lesswrong/user.js +5 -0
- package/clis/lichess/top.js +1 -0
- package/clis/lichess/user.js +1 -0
- package/clis/lichess/utils.js +1 -0
- package/clis/linkedin/auth.js +27 -0
- package/clis/linkedin/comment.js +1 -0
- package/clis/linkedin/connect.js +244 -0
- package/clis/linkedin/create.js +113 -0
- package/clis/linkedin/follow.js +1 -0
- package/clis/linkedin/inbox.js +1 -0
- package/clis/linkedin/job-detail.js +40 -0
- package/clis/linkedin/jobs-preferences.js +34 -0
- package/clis/linkedin/like.js +1 -0
- package/clis/linkedin/notifications.js +1 -0
- package/clis/linkedin/people-search.js +1 -0
- package/clis/linkedin/post-analytics.js +1 -0
- package/clis/linkedin/post-comments.js +1 -0
- package/clis/linkedin/post-detail.js +1 -0
- package/clis/linkedin/posts-core.js +138 -0
- package/clis/linkedin/posts.js +1 -0
- package/clis/linkedin/profile-analytics.js +1 -0
- package/clis/linkedin/profile-api.js +218 -0
- package/clis/linkedin/profile-experience.js +1 -0
- package/clis/linkedin/profile-projects.js +1 -0
- package/clis/linkedin/profile-read.js +3 -0
- package/clis/linkedin/reply.js +1 -0
- package/clis/linkedin/repost.js +1 -0
- package/clis/linkedin/safe-send.js +155 -0
- package/clis/linkedin/salesnav-inbox.js +21 -0
- package/clis/linkedin/salesnav-message.js +33 -0
- package/clis/linkedin/salesnav-search.js +15 -0
- package/clis/linkedin/salesnav-thread.js +1 -0
- package/clis/linkedin/search-api.js +42 -0
- package/clis/linkedin/search.js +50 -0
- package/clis/linkedin/sent-invitations.js +46 -0
- package/clis/linkedin/services-read.js +57 -0
- package/clis/linkedin/shared.js +10 -0
- package/clis/linkedin/social-api.js +260 -0
- package/clis/linkedin/thread-snapshot.js +81 -0
- package/clis/linkedin/timeline.js +37 -0
- package/clis/linkedin-learning/auth.js +27 -0
- package/clis/linkedin-learning/course.js +17 -0
- package/clis/linkedin-learning/search.js +17 -0
- package/clis/linkedin-learning/trending.js +17 -0
- package/clis/linux-do/auth.js +20 -0
- package/clis/linux-do/categories.js +1 -0
- package/clis/linux-do/feed.js +19 -0
- package/clis/linux-do/search.js +1 -0
- package/clis/linux-do/tags.js +1 -0
- package/clis/linux-do/topic-content.js +28 -0
- package/clis/linux-do/topic.js +1 -0
- package/clis/linux-do/user-posts.js +1 -0
- package/clis/linux-do/user-topics.js +1 -0
- package/clis/lobsters/active.js +1 -0
- package/clis/lobsters/domain.js +1 -0
- package/clis/lobsters/hot.js +1 -0
- package/clis/lobsters/newest.js +1 -0
- package/clis/lobsters/read.js +11 -0
- package/clis/lobsters/tag.js +1 -0
- package/clis/maimai/auth.js +19 -0
- package/clis/maimai/search-talents.js +37 -0
- package/clis/manus/_utils.js +28 -0
- package/clis/manus/auth.js +20 -0
- package/clis/manus/connectors.js +4 -0
- package/clis/manus/credits.js +4 -0
- package/clis/manus/list.js +7 -0
- package/clis/manus/read.js +7 -0
- package/clis/manus/skills.js +4 -0
- package/clis/manus/status.js +8 -0
- package/clis/mastodon/post.js +1 -0
- package/clis/mastodon/shared.js +48 -0
- package/clis/mastodon/whoami.js +1 -0
- package/clis/maven/artifact.js +1 -0
- package/clis/maven/search.js +1 -0
- package/clis/maven/utils.js +1 -0
- package/clis/mdn/search.js +1 -0
- package/clis/medium/article.js +12 -0
- package/clis/medium/feed.js +1 -0
- package/clis/medium/login.js +1 -0
- package/clis/medium/search.js +1 -0
- package/clis/medium/stats.js +56 -0
- package/clis/medium/tag.js +1 -0
- package/clis/medium/user.js +1 -0
- package/clis/medium/utils.js +62 -0
- package/clis/medium/whoami.js +1 -0
- package/clis/mubu/doc.js +1 -0
- package/clis/mubu/docs.js +1 -0
- package/clis/mubu/notes.js +1 -0
- package/clis/mubu/recent.js +1 -0
- package/clis/mubu/search.js +1 -0
- package/clis/mubu/utils.js +31 -0
- package/clis/note/auth.js +12 -0
- package/clis/note/note-utils.js +2 -0
- package/clis/note/publish.js +17 -0
- package/clis/notebooklm/add-source.js +46 -0
- package/clis/notebooklm/auth.js +21 -0
- package/clis/notebooklm/create.js +1 -0
- package/clis/notebooklm/current.js +1 -0
- package/clis/notebooklm/generate-audio.js +1 -0
- package/clis/notebooklm/generate-slides.js +1 -0
- package/clis/notebooklm/get.js +1 -0
- package/clis/notebooklm/history.js +1 -0
- package/clis/notebooklm/list.js +1 -0
- package/clis/notebooklm/note-list.js +1 -0
- package/clis/notebooklm/notes-get.js +1 -0
- package/clis/notebooklm/open.js +1 -0
- package/clis/notebooklm/rpc.js +36 -0
- package/clis/notebooklm/shared.js +1 -0
- package/clis/notebooklm/source-fulltext.js +1 -0
- package/clis/notebooklm/source-get.js +1 -0
- package/clis/notebooklm/source-guide.js +1 -0
- package/clis/notebooklm/source-list.js +1 -0
- package/clis/notebooklm/status.js +1 -0
- package/clis/notebooklm/summary.js +1 -0
- package/clis/notebooklm/utils.js +172 -0
- package/clis/notebooklm/write-note.js +1 -0
- package/clis/nowcoder/auth.js +24 -0
- package/clis/nowcoder/comment.js +1 -0
- package/clis/nowcoder/comments.js +1 -0
- package/clis/nowcoder/companies.js +1 -0
- package/clis/nowcoder/creators.js +1 -0
- package/clis/nowcoder/delete.js +1 -0
- package/clis/nowcoder/detail.js +46 -0
- package/clis/nowcoder/dm-list.js +1 -0
- package/clis/nowcoder/dm-read.js +1 -0
- package/clis/nowcoder/dm-send.js +1 -0
- package/clis/nowcoder/drafts.js +1 -0
- package/clis/nowcoder/experience.js +20 -0
- package/clis/nowcoder/hot.js +1 -0
- package/clis/nowcoder/inbox.js +1 -0
- package/clis/nowcoder/jobs.js +1 -0
- package/clis/nowcoder/like.js +1 -0
- package/clis/nowcoder/my.js +1 -0
- package/clis/nowcoder/notifications.js +16 -0
- package/clis/nowcoder/papers.js +22 -0
- package/clis/nowcoder/post.js +1 -0
- package/clis/nowcoder/practice.js +21 -0
- package/clis/nowcoder/recommend.js +1 -0
- package/clis/nowcoder/referral.js +21 -0
- package/clis/nowcoder/salary.js +22 -0
- package/clis/nowcoder/search.js +31 -0
- package/clis/nowcoder/suggest.js +17 -0
- package/clis/nowcoder/topics.js +1 -0
- package/clis/nowcoder/trending.js +1 -0
- package/clis/nowcoder/utils.js +68 -0
- package/clis/npm/downloads.js +1 -0
- package/clis/npm/package.js +1 -0
- package/clis/npm/search.js +1 -0
- package/clis/npm/utils.js +1 -0
- package/clis/nuget/package.js +1 -0
- package/clis/nuget/search.js +1 -0
- package/clis/nuget/utils.js +1 -0
- package/clis/nvd/cve.js +1 -0
- package/clis/oeis/search.js +1 -0
- package/clis/oeis/sequence.js +1 -0
- package/clis/oeis/utils.js +1 -0
- package/clis/ones/common.js +23 -0
- package/clis/ones/enrich-tasks.js +1 -0
- package/clis/ones/login.js +2 -0
- package/clis/ones/logout.js +1 -0
- package/clis/ones/me.js +1 -0
- package/clis/ones/my-tasks.js +1 -0
- package/clis/ones/resolve-labels.js +1 -0
- package/clis/ones/task-helpers.js +1 -0
- package/clis/ones/task.js +1 -0
- package/clis/ones/tasks.js +1 -0
- package/clis/ones/token-info.js +1 -0
- package/clis/ones/worklog.js +14 -0
- package/clis/openalex/search.js +1 -0
- package/clis/openalex/utils.js +1 -0
- package/clis/openalex/work.js +1 -0
- package/clis/openfda/drug-label.js +1 -0
- package/clis/openfda/food-recall.js +1 -0
- package/clis/openfda/utils.js +1 -0
- package/clis/openreview/author.js +1 -0
- package/clis/openreview/paper.js +1 -0
- package/clis/openreview/reviews.js +4 -0
- package/clis/openreview/search.js +1 -0
- package/clis/openreview/utils.js +1 -0
- package/clis/openreview/venue.js +1 -0
- package/clis/oschina/article.js +1 -0
- package/clis/oschina/catalogs.js +1 -0
- package/clis/oschina/login.js +1 -0
- package/clis/oschina/stats.js +54 -0
- package/clis/oschina/whoami.js +1 -0
- package/clis/osv/query.js +1 -0
- package/clis/osv/utils.js +1 -0
- package/clis/osv/vulnerability.js +1 -0
- package/clis/packagist/package.js +1 -0
- package/clis/packagist/search.js +1 -0
- package/clis/packagist/utils.js +1 -0
- package/clis/paperreview/feedback.js +1 -0
- package/clis/paperreview/review.js +1 -0
- package/clis/paperreview/submit.js +1 -0
- package/clis/paperreview/utils.js +1 -0
- package/clis/pinterest/api.js +1 -0
- package/clis/pinterest/auth.js +1 -0
- package/clis/pinterest/boards.js +1 -0
- package/clis/pinterest/client.js +20 -0
- package/clis/pinterest/publish.js +13 -0
- package/clis/pixiv/auth.js +17 -0
- package/clis/pixiv/detail.js +1 -0
- package/clis/pixiv/download.js +1 -0
- package/clis/pixiv/illusts.js +1 -0
- package/clis/pixiv/ranking.js +26 -0
- package/clis/pixiv/search.js +1 -0
- package/clis/pixiv/user.js +1 -0
- package/clis/pixiv/utils.js +18 -0
- package/clis/powerchina/auth.js +17 -0
- package/clis/powerchina/search.js +1 -0
- package/clis/producthunt/browse.js +54 -0
- package/clis/producthunt/hot.js +64 -0
- package/clis/producthunt/posts.js +1 -0
- package/clis/producthunt/today.js +1 -0
- package/clis/producthunt/utils.js +1 -0
- package/clis/pubmed/article.js +1 -0
- package/clis/pubmed/author.js +1 -0
- package/clis/pubmed/citations.js +1 -0
- package/clis/pubmed/clinical-trial.js +1 -0
- package/clis/pubmed/journal.js +1 -0
- package/clis/pubmed/mesh.js +1 -0
- package/clis/pubmed/related.js +1 -0
- package/clis/pubmed/review.js +1 -0
- package/clis/pubmed/search.js +1 -0
- package/clis/pubmed/utils.js +1 -0
- package/clis/pypi/downloads.js +1 -0
- package/clis/pypi/package.js +1 -0
- package/clis/pypi/utils.js +1 -0
- package/clis/qiita/auth.js +1 -0
- package/clis/qiita/gql.js +32 -0
- package/clis/qiita/publish.js +7 -0
- package/clis/qiita/stats.js +37 -0
- package/clis/qoder/_utils.js +113 -0
- package/clis/qoder/composer.js +1 -0
- package/clis/qoder/history.js +25 -0
- package/clis/qoder/quest.js +1 -0
- package/clis/qoder/read.js +1 -0
- package/clis/qoder/status.js +1 -0
- package/clis/qoder/ui.js +59 -0
- package/clis/quark/auth.js +16 -0
- package/clis/quark/ls.js +1 -0
- package/clis/quark/mkdir.js +1 -0
- package/clis/quark/mv.js +1 -0
- package/clis/quark/rename.js +1 -0
- package/clis/quark/rm.js +1 -0
- package/clis/quark/save.js +1 -0
- package/clis/quark/share-tree.js +1 -0
- package/clis/quark/utils.js +13 -0
- package/clis/quora/create-answer.js +22 -0
- package/clis/quora/create-question.js +24 -0
- package/clis/quora/shared.js +43 -0
- package/clis/quora/whoami.js +1 -0
- package/clis/qwen/ask.js +1 -0
- package/clis/qwen/auth.js +17 -0
- package/clis/qwen/detail.js +1 -0
- package/clis/qwen/history.js +1 -0
- package/clis/qwen/image.js +31 -0
- package/clis/qwen/new.js +1 -0
- package/clis/qwen/read.js +1 -0
- package/clis/qwen/send.js +1 -0
- package/clis/qwen/status.js +1 -0
- package/clis/qwen/utils.js +185 -0
- package/clis/reddit/auth.js +17 -0
- package/clis/reddit/comment.js +36 -0
- package/clis/reddit/frontpage.js +40 -0
- package/clis/reddit/home.js +32 -0
- package/clis/reddit/hot.js +46 -0
- package/clis/reddit/popular.js +46 -0
- package/clis/reddit/read.js +398 -0
- package/clis/reddit/reply.js +56 -0
- package/clis/reddit/save.js +30 -0
- package/clis/reddit/saved.js +24 -0
- package/clis/reddit/search.js +51 -0
- package/clis/reddit/submit.js +42 -0
- package/clis/reddit/subreddit-info.js +29 -0
- package/clis/reddit/subreddit.js +52 -0
- package/clis/reddit/subscribe.js +29 -0
- package/clis/reddit/subscribed.js +68 -0
- package/clis/reddit/upvote.js +43 -0
- package/clis/reddit/upvoted.js +24 -0
- package/clis/reddit/user-comments.js +20 -0
- package/clis/reddit/user-posts.js +17 -0
- package/clis/reddit/user.js +20 -0
- package/clis/reddit/whoami.js +19 -0
- package/clis/rednote/auth.js +19 -0
- package/clis/rednote/comments.js +1 -0
- package/clis/rednote/download.js +1 -0
- package/clis/rednote/feed.js +1 -0
- package/clis/rednote/note.js +1 -0
- package/clis/rednote/notifications.js +67 -0
- package/clis/rednote/search.js +32 -0
- package/clis/rednote/user.js +1 -0
- package/clis/rest-countries/country.js +1 -0
- package/clis/rest-countries/region.js +1 -0
- package/clis/rest-countries/utils.js +1 -0
- package/clis/reuters/article-detail.js +1 -0
- package/clis/reuters/auth.js +39 -0
- package/clis/reuters/search.js +1 -0
- package/clis/reuters/utils.js +50 -0
- package/clis/rfc/rfc.js +1 -0
- package/clis/rfc/utils.js +1 -0
- package/clis/rubygems/gem.js +1 -0
- package/clis/rubygems/search.js +1 -0
- package/clis/rubygems/utils.js +1 -0
- package/clis/segmentfault/_signed-request.js +43 -0
- package/clis/segmentfault/article.js +3 -0
- package/clis/segmentfault/channels.js +1 -0
- package/clis/segmentfault/login.js +1 -0
- package/clis/segmentfault/stats.js +82 -0
- package/clis/segmentfault/tags.js +1 -0
- package/clis/segmentfault/whoami.js +1 -0
- package/clis/semanticscholar/citations.js +1 -0
- package/clis/semanticscholar/paper.js +1 -0
- package/clis/semanticscholar/recommendations.js +1 -0
- package/clis/semanticscholar/search.js +1 -0
- package/clis/semanticscholar/utils.js +1 -0
- package/clis/sinablog/article.js +1 -0
- package/clis/sinablog/hot.js +1 -0
- package/clis/sinablog/search.js +1 -0
- package/clis/sinablog/user.js +1 -0
- package/clis/sinablog/utils.js +153 -0
- package/clis/sinafinance/news.js +1 -0
- package/clis/sinafinance/rolling-news.js +20 -0
- package/clis/sinafinance/stock-rank.js +41 -0
- package/clis/sinafinance/stock.js +1 -0
- package/clis/slock/attachment-download.js +1 -0
- package/clis/slock/attachment-upload.js +34 -0
- package/clis/slock/attachment-url.js +1 -0
- package/clis/slock/auth-verify.js +1 -0
- package/clis/slock/bookmark-add.js +11 -0
- package/clis/slock/bookmark-list.js +10 -0
- package/clis/slock/bookmark-remove.js +7 -0
- package/clis/slock/channel-action.js +1 -0
- package/clis/slock/channel-archive.js +1 -0
- package/clis/slock/channel-create.js +1 -0
- package/clis/slock/channel-files.js +1 -0
- package/clis/slock/channel-info.js +1 -0
- package/clis/slock/channel-join.js +1 -0
- package/clis/slock/channel-leave.js +1 -0
- package/clis/slock/channel-list.js +1 -0
- package/clis/slock/channel-mark.js +1 -0
- package/clis/slock/channel-members.js +1 -0
- package/clis/slock/channel-unarchive.js +1 -0
- package/clis/slock/dm-list.js +1 -0
- package/clis/slock/errors.js +1 -0
- package/clis/slock/in-page.js +113 -0
- package/clis/slock/inbox-done.js +9 -0
- package/clis/slock/inbox-read-all.js +1 -0
- package/clis/slock/inbox.js +1 -0
- package/clis/slock/login.js +1 -0
- package/clis/slock/message-read.js +61 -0
- package/clis/slock/message-search.js +24 -0
- package/clis/slock/message-send.js +55 -0
- package/clis/slock/reaction-add.js +1 -0
- package/clis/slock/reaction-remove.js +1 -0
- package/clis/slock/resolve.js +1 -0
- package/clis/slock/server-list.js +9 -0
- package/clis/slock/server-use.js +18 -0
- package/clis/slock/shared.js +1 -0
- package/clis/slock/task-claim.js +14 -0
- package/clis/slock/task-convert.js +35 -0
- package/clis/slock/task-create.js +24 -0
- package/clis/slock/task-delete.js +9 -0
- package/clis/slock/task-get.js +11 -0
- package/clis/slock/task-list-server.js +12 -0
- package/clis/slock/task-list.js +14 -0
- package/clis/slock/task-status.js +19 -0
- package/clis/slock/task-unclaim.js +13 -0
- package/clis/slock/thread-done.js +1 -0
- package/clis/slock/thread-follow.js +1 -0
- package/clis/slock/thread-list.js +1 -0
- package/clis/slock/thread-state.js +1 -0
- package/clis/slock/thread-undone.js +1 -0
- package/clis/slock/thread-unfollow.js +1 -0
- package/clis/slock/unread-summary.js +18 -0
- package/clis/slock/whoami.js +1 -0
- package/clis/smzdm/search.js +71 -0
- package/clis/sohu/article.js +1 -0
- package/clis/sohu/attributes.js +1 -0
- package/clis/sohu/categories.js +1 -0
- package/clis/sohu/channels.js +1 -0
- package/clis/sohu/columns.js +1 -0
- package/clis/sohu/login.js +1 -0
- package/clis/sohu/mpbp.js +1 -0
- package/clis/sohu/stats.js +95 -0
- package/clis/sohu/topics.js +1 -0
- package/clis/sohu/whoami.js +1 -0
- package/clis/spotify/spotify.js +1 -0
- package/clis/spotify/utils.js +8 -0
- package/clis/stackoverflow/bounties.js +1 -0
- package/clis/stackoverflow/hot.js +1 -0
- package/clis/stackoverflow/read.js +13 -0
- package/clis/stackoverflow/related.js +1 -0
- package/clis/stackoverflow/search.js +1 -0
- package/clis/stackoverflow/tag.js +1 -0
- package/clis/stackoverflow/unanswered.js +1 -0
- package/clis/stackoverflow/user.js +1 -0
- package/clis/stackoverflow/utils.js +1 -0
- package/clis/steam/app.js +1 -0
- package/clis/steam/search.js +1 -0
- package/clis/steam/top-sellers.js +1 -0
- package/clis/steam/utils.js +1 -0
- package/clis/substack/auth.js +11 -0
- package/clis/substack/feed.js +1 -0
- package/clis/substack/post-utils.js +2 -0
- package/clis/substack/publication.js +1 -0
- package/clis/substack/publish.js +10 -0
- package/clis/substack/search.js +1 -0
- package/clis/substack/utils.js +108 -0
- package/clis/suno/auth.js +21 -0
- package/clis/suno/download.js +17 -0
- package/clis/suno/generate.js +4 -0
- package/clis/suno/list.js +14 -0
- package/clis/suno/status.js +1 -0
- package/clis/suno/utils.js +102 -0
- package/clis/taobao/add-cart.js +93 -0
- package/clis/taobao/auth.js +8 -0
- package/clis/taobao/cart.js +68 -0
- package/clis/taobao/detail.js +48 -0
- package/clis/taobao/reviews.js +52 -0
- package/clis/taobao/search.js +64 -0
- package/clis/tdx/hot-rank.js +25 -0
- package/clis/telegram/send.js +18 -0
- package/clis/telegram/shared.js +21 -0
- package/clis/telegram/whoami.js +1 -0
- package/clis/test-utils.js +1 -0
- package/clis/threads/post.js +152 -0
- package/clis/threads/shared.js +27 -0
- package/clis/threads/whoami.js +1 -0
- package/clis/ths/hot-rank.js +27 -0
- package/clis/tieba/hot.js +16 -0
- package/clis/tieba/posts.js +1 -0
- package/clis/tieba/read.js +84 -0
- package/clis/tieba/search.js +54 -0
- package/clis/tieba/utils.js +1 -0
- package/clis/tiktok/auth.js +30 -0
- package/clis/tiktok/comment.js +69 -0
- package/clis/tiktok/creator-videos.js +45 -0
- package/clis/tiktok/explore.js +76 -0
- package/clis/tiktok/follow.js +49 -0
- package/clis/tiktok/following.js +103 -0
- package/clis/tiktok/friends.js +79 -0
- package/clis/tiktok/like.js +19 -0
- package/clis/tiktok/live.js +79 -0
- package/clis/tiktok/notifications.js +77 -0
- package/clis/tiktok/profile.js +26 -0
- package/clis/tiktok/publish.js +82 -0
- package/clis/tiktok/save.js +15 -0
- package/clis/tiktok/search.js +24 -0
- package/clis/tiktok/unfollow.js +59 -0
- package/clis/tiktok/unlike.js +19 -0
- package/clis/tiktok/unsave.js +17 -0
- package/clis/tiktok/user.js +143 -0
- package/clis/tiktok/utils.js +272 -0
- package/clis/toutiao/article.js +1 -0
- package/clis/toutiao/articles.js +6 -0
- package/clis/toutiao/auth.js +50 -0
- package/clis/toutiao/hot.js +1 -0
- package/clis/toutiao/utils.js +2 -0
- package/clis/trae-cn/activity.js +1 -0
- package/clis/trae-cn/approve.js +1 -0
- package/clis/trae-cn/ask.js +1 -0
- package/clis/trae-cn/dump.js +1 -0
- package/clis/trae-cn/export.js +3 -0
- package/clis/trae-cn/model.js +1 -0
- package/clis/trae-cn/new.js +1 -0
- package/clis/trae-cn/read.js +1 -0
- package/clis/trae-cn/screenshot.js +1 -0
- package/clis/trae-cn/select-model.js +1 -0
- package/clis/trae-cn/send.js +1 -0
- package/clis/trae-cn/setup.js +1 -0
- package/clis/trae-cn/status.js +1 -0
- package/clis/trae-cn/targets.js +1 -0
- package/clis/trae-cn/utils.js +456 -0
- package/clis/trae-cn/watch.js +3 -0
- package/clis/trae-solo/_actions.js +41 -0
- package/clis/trae-solo/_fs.js +6 -0
- package/clis/trae-solo/_state.js +2 -0
- package/clis/trae-solo/automation.js +43 -0
- package/clis/trae-solo/history.js +15 -0
- package/clis/trae-solo/mode.js +31 -0
- package/clis/trae-solo/model.js +50 -0
- package/clis/trae-solo/renderer-storage.js +11 -0
- package/clis/trae-solo/settings.js +1 -0
- package/clis/trae-solo/skill-fs.js +1 -0
- package/clis/trae-solo/skill.js +81 -0
- package/clis/trae-solo/state-fs.js +2 -0
- package/clis/trae-solo/status.js +1 -0
- package/clis/trae-solo/task-fs.js +5 -0
- package/clis/trae-solo/user-rules.js +1 -0
- package/clis/trae-solo/workspaces-fs.js +1 -0
- package/clis/tumblr/auth.js +24 -0
- package/clis/tumblr/publish.js +14 -0
- package/clis/tvmaze/search.js +1 -0
- package/clis/tvmaze/show.js +1 -0
- package/clis/tvmaze/utils.js +1 -0
- package/clis/twitter/accept.js +116 -0
- package/clis/twitter/article.js +116 -0
- package/clis/twitter/auth.js +4 -0
- package/clis/twitter/block.js +62 -0
- package/clis/twitter/bookmark-folder.js +4 -0
- package/clis/twitter/bookmark-folders.js +4 -0
- package/clis/twitter/bookmark.js +44 -0
- package/clis/twitter/bookmarks.js +27 -0
- package/clis/twitter/delete.js +36 -0
- package/clis/twitter/device-follow.js +13 -0
- package/clis/twitter/dm-list.js +1 -0
- package/clis/twitter/dm-read.js +1 -0
- package/clis/twitter/dm-send.js +13 -0
- package/clis/twitter/dm-shared.js +6 -0
- package/clis/twitter/download.js +38 -0
- package/clis/twitter/follow-batch.js +43 -0
- package/clis/twitter/follow.js +39 -0
- package/clis/twitter/followers.js +59 -0
- package/clis/twitter/following.js +4 -0
- package/clis/twitter/hide-reply.js +57 -0
- package/clis/twitter/like.js +48 -0
- package/clis/twitter/likes.js +14 -0
- package/clis/twitter/list-add-batch.js +1 -0
- package/clis/twitter/list-add-core.js +35 -0
- package/clis/twitter/list-add.js +1 -0
- package/clis/twitter/list-batch-utils.js +1 -0
- package/clis/twitter/list-create.js +12 -0
- package/clis/twitter/list-delete.js +36 -0
- package/clis/twitter/list-remove-batch.js +1 -0
- package/clis/twitter/list-remove-core.js +127 -0
- package/clis/twitter/list-remove.js +1 -0
- package/clis/twitter/list-tweets.js +27 -0
- package/clis/twitter/lists.js +27 -0
- package/clis/twitter/notifications.js +4 -0
- package/clis/twitter/post.js +158 -0
- package/clis/twitter/profile.js +66 -0
- package/clis/twitter/quote.js +123 -0
- package/clis/twitter/reply-dm.js +112 -0
- package/clis/twitter/reply.js +97 -0
- package/clis/twitter/retweet.js +62 -0
- package/clis/twitter/schedule.js +96 -0
- package/clis/twitter/scheduled-delete.js +60 -0
- package/clis/twitter/scheduled-list.js +15 -0
- package/clis/twitter/scheduled-utils.js +18 -0
- package/clis/twitter/search.js +12 -0
- package/clis/twitter/shared.js +76 -0
- package/clis/twitter/thread.js +4 -0
- package/clis/twitter/timeline.js +4 -0
- package/clis/twitter/trending.js +18 -0
- package/clis/twitter/tweets.js +12 -0
- package/clis/twitter/unblock.js +45 -0
- package/clis/twitter/unbookmark.js +41 -0
- package/clis/twitter/unfollow.js +45 -0
- package/clis/twitter/unlike.js +48 -0
- package/clis/twitter/unretweet.js +62 -0
- package/clis/twitter/utils.js +55 -0
- package/clis/uisdc/news.js +25 -0
- package/clis/uiverse/_shared.js +257 -0
- package/clis/uiverse/code.js +1 -0
- package/clis/uiverse/preview.js +1 -0
- package/clis/upwork/auth.js +19 -0
- package/clis/upwork/detail.js +22 -0
- package/clis/upwork/feed.js +21 -0
- package/clis/upwork/search.js +21 -0
- package/clis/upwork/utils.js +1 -0
- package/clis/v2ex/auth.js +10 -0
- package/clis/v2ex/daily.js +41 -0
- package/clis/v2ex/hot.js +1 -0
- package/clis/v2ex/latest.js +1 -0
- package/clis/v2ex/me.js +58 -0
- package/clis/v2ex/member.js +1 -0
- package/clis/v2ex/node.js +1 -0
- package/clis/v2ex/nodes.js +1 -0
- package/clis/v2ex/notifications.js +40 -0
- package/clis/v2ex/replies.js +1 -0
- package/clis/v2ex/topic.js +1 -0
- package/clis/v2ex/user.js +1 -0
- package/clis/vk/post.js +1 -0
- package/clis/vk/shared.js +8 -0
- package/clis/vk/whoami.js +1 -0
- package/clis/wanfang/search.js +42 -0
- package/clis/web/read.js +260 -0
- package/clis/wechat-channels/auth.js +31 -0
- package/clis/wechat-channels/publish.js +298 -0
- package/clis/weibo/article.js +1 -0
- package/clis/weibo/auth.js +17 -0
- package/clis/weibo/comments.js +28 -0
- package/clis/weibo/delete.js +84 -0
- package/clis/weibo/favorites.js +27 -0
- package/clis/weibo/feed.js +33 -0
- package/clis/weibo/hot.js +17 -0
- package/clis/weibo/me.js +51 -0
- package/clis/weibo/post.js +46 -0
- package/clis/weibo/publish.js +98 -0
- package/clis/weibo/search.js +47 -0
- package/clis/weibo/user-posts.js +92 -0
- package/clis/weibo/user.js +37 -0
- package/clis/weibo/utils.js +16 -0
- package/clis/weixin/article.js +1 -0
- package/clis/weixin/create-draft.js +152 -0
- package/clis/weixin/download.js +100 -0
- package/clis/weixin/drafts.js +27 -0
- package/clis/weixin/login.js +1 -0
- package/clis/weixin/search.js +44 -0
- package/clis/weixin/stats.js +43 -0
- package/clis/weixin/whoami.js +1 -0
- package/clis/weread/ai-outline.js +2 -0
- package/clis/weread/auth.js +24 -0
- package/clis/weread/book-search.js +2 -0
- package/clis/weread/book.js +3 -0
- package/clis/weread/highlights.js +1 -0
- package/clis/weread/notebooks.js +1 -0
- package/clis/weread/notes.js +1 -0
- package/clis/weread/ranking.js +1 -0
- package/clis/weread/search.js +1 -0
- package/clis/weread/shelf.js +1 -0
- package/clis/weread/utils.js +67 -0
- package/clis/weread-official/book.js +1 -0
- package/clis/weread-official/discover.js +1 -0
- package/clis/weread-official/list-apis.js +1 -0
- package/clis/weread-official/notes.js +1 -0
- package/clis/weread-official/readdata.js +1 -0
- package/clis/weread-official/review.js +1 -0
- package/clis/weread-official/search.js +1 -0
- package/clis/weread-official/shelf.js +1 -0
- package/clis/weread-official/utils.js +1 -0
- package/clis/wikidata/entity.js +1 -0
- package/clis/wikidata/search.js +1 -0
- package/clis/wikidata/utils.js +1 -0
- package/clis/wikipedia/page.js +3 -0
- package/clis/wikipedia/random.js +1 -0
- package/clis/wikipedia/search.js +1 -0
- package/clis/wikipedia/summary.js +1 -0
- package/clis/wikipedia/trending.js +1 -0
- package/clis/wikipedia/utils.js +1 -0
- package/clis/wordpress/login.js +1 -0
- package/clis/wordpress/publish.js +1 -0
- package/clis/wordpress/shared.js +54 -0
- package/clis/wordpress/whoami.js +1 -0
- package/clis/woshipm/article.js +1 -0
- package/clis/woshipm/login.js +1 -0
- package/clis/woshipm/stats.js +52 -0
- package/clis/woshipm/whoami.js +1 -0
- package/clis/wttr/current.js +1 -0
- package/clis/wttr/forecast.js +1 -0
- package/clis/wttr/utils.js +1 -0
- package/clis/xianyu/auth.js +11 -0
- package/clis/xianyu/chat.js +1 -0
- package/clis/xianyu/im.js +240 -0
- package/clis/xianyu/inbox.js +1 -0
- package/clis/xianyu/item.js +97 -0
- package/clis/xianyu/messages.js +1 -0
- package/clis/xianyu/publish.js +245 -0
- package/clis/xianyu/reply.js +1 -0
- package/clis/xianyu/search.js +141 -0
- package/clis/xianyu/utils.js +1 -0
- package/clis/xiaoe/auth.js +10 -0
- package/clis/xiaoe/catalog.js +134 -0
- package/clis/xiaoe/content.js +16 -0
- package/clis/xiaoe/courses.js +43 -0
- package/clis/xiaoe/detail.js +19 -0
- package/clis/xiaoe/play-url.js +97 -0
- package/clis/xiaohongshu/ask.js +130 -0
- package/clis/xiaohongshu/auth.js +13 -0
- package/clis/xiaohongshu/collection-helpers.js +64 -0
- package/clis/xiaohongshu/comments.js +89 -0
- package/clis/xiaohongshu/creator-note-detail.js +80 -0
- package/clis/xiaohongshu/creator-notes-summary.js +1 -0
- package/clis/xiaohongshu/creator-notes.js +107 -0
- package/clis/xiaohongshu/creator-profile.js +13 -0
- package/clis/xiaohongshu/creator-stats.js +13 -0
- package/clis/xiaohongshu/delete-note.js +69 -0
- package/clis/xiaohongshu/download.js +200 -0
- package/clis/xiaohongshu/draft-clear.js +44 -0
- package/clis/xiaohongshu/draft-delete.js +37 -0
- package/clis/xiaohongshu/draft-open.js +1 -0
- package/clis/xiaohongshu/draft-utils.js +36 -0
- package/clis/xiaohongshu/drafts.js +1 -0
- package/clis/xiaohongshu/feed.js +38 -0
- package/clis/xiaohongshu/follow.js +75 -0
- package/clis/xiaohongshu/liked.js +1 -0
- package/clis/xiaohongshu/note-helpers.js +1 -0
- package/clis/xiaohongshu/note.js +32 -0
- package/clis/xiaohongshu/notifications.js +1 -0
- package/clis/xiaohongshu/publish-video.js +87 -0
- package/clis/xiaohongshu/publish.js +637 -0
- package/clis/xiaohongshu/saved.js +1 -0
- package/clis/xiaohongshu/search.js +194 -0
- package/clis/xiaohongshu/unfollow.js +98 -0
- package/clis/xiaohongshu/user-helpers.js +1 -0
- package/clis/xiaohongshu/user.js +30 -0
- package/clis/xiaoyuzhou/auth.js +3 -0
- package/clis/xiaoyuzhou/download.js +1 -0
- package/clis/xiaoyuzhou/episode.js +1 -0
- package/clis/xiaoyuzhou/podcast-episodes.js +1 -0
- package/clis/xiaoyuzhou/podcast.js +1 -0
- package/clis/xiaoyuzhou/transcript.js +1 -0
- package/clis/xiaoyuzhou/utils.js +1 -0
- package/clis/xueqiu/article.js +4 -0
- package/clis/xueqiu/auth.js +27 -0
- package/clis/xueqiu/comments.js +38 -0
- package/clis/xueqiu/danjuan-utils.js +84 -0
- package/clis/xueqiu/earnings-date.js +1 -0
- package/clis/xueqiu/events.js +17 -0
- package/clis/xueqiu/feed.js +1 -0
- package/clis/xueqiu/fund-holdings.js +1 -0
- package/clis/xueqiu/fund-snapshot.js +1 -0
- package/clis/xueqiu/groups.js +1 -0
- package/clis/xueqiu/hashtags.js +26 -0
- package/clis/xueqiu/hot-stock.js +1 -0
- package/clis/xueqiu/hot.js +1 -0
- package/clis/xueqiu/kline.js +1 -0
- package/clis/xueqiu/search.js +1 -0
- package/clis/xueqiu/stock.js +1 -0
- package/clis/xueqiu/stocks.js +13 -0
- package/clis/xueqiu/users.js +12 -0
- package/clis/xueqiu/utils.js +9 -0
- package/clis/xueqiu/watchlist.js +1 -0
- package/clis/yahoo/search.js +21 -0
- package/clis/yahoo-finance/quote.js +50 -0
- package/clis/yollomi/background.js +1 -0
- package/clis/yollomi/edit.js +1 -0
- package/clis/yollomi/face-swap.js +1 -0
- package/clis/yollomi/generate.js +1 -0
- package/clis/yollomi/models.js +1 -0
- package/clis/yollomi/object-remover.js +1 -0
- package/clis/yollomi/remove-bg.js +1 -0
- package/clis/yollomi/restore.js +1 -0
- package/clis/yollomi/try-on.js +1 -0
- package/clis/yollomi/upload.js +17 -0
- package/clis/yollomi/upscale.js +1 -0
- package/clis/yollomi/utils.js +16 -0
- package/clis/yollomi/video.js +1 -0
- package/clis/youdao/note.js +113 -0
- package/clis/youtube/auth.js +20 -0
- package/clis/youtube/channel.js +118 -0
- package/clis/youtube/comments.js +64 -0
- package/clis/youtube/feed.js +89 -0
- package/clis/youtube/history.js +87 -0
- package/clis/youtube/like.js +33 -0
- package/clis/youtube/playlist.js +47 -0
- package/clis/youtube/publish.js +56 -0
- package/clis/youtube/search.js +39 -0
- package/clis/youtube/subscribe.js +42 -0
- package/clis/youtube/subscriptions.js +26 -0
- package/clis/youtube/transcript-group.js +2 -0
- package/clis/youtube/transcript.js +417 -0
- package/clis/youtube/unlike.js +33 -0
- package/clis/youtube/unsubscribe.js +42 -0
- package/clis/youtube/utils.js +34 -0
- package/clis/youtube/video.js +96 -0
- package/clis/youtube/watch-later.js +41 -0
- package/clis/yuanbao/ask.js +145 -0
- package/clis/yuanbao/auth.js +23 -0
- package/clis/yuanbao/detail.js +1 -0
- package/clis/yuanbao/history.js +1 -0
- package/clis/yuanbao/new.js +16 -0
- package/clis/yuanbao/read.js +1 -0
- package/clis/yuanbao/send.js +1 -0
- package/clis/yuanbao/shared.js +127 -0
- package/clis/yuanbao/status.js +1 -0
- package/clis/yuque/article.js +1 -0
- package/clis/yuque/whoami.js +1 -0
- package/clis/zhihu/answer-comments.js +11 -0
- package/clis/zhihu/answer-detail.js +11 -0
- package/clis/zhihu/answer.js +15 -0
- package/clis/zhihu/article-transform.js +1 -0
- package/clis/zhihu/article.js +7 -0
- package/clis/zhihu/auth.js +11 -0
- package/clis/zhihu/collection.js +7 -0
- package/clis/zhihu/collections.js +7 -0
- package/clis/zhihu/comment.js +17 -0
- package/clis/zhihu/download.js +39 -0
- package/clis/zhihu/favorite.js +39 -0
- package/clis/zhihu/follow.js +19 -0
- package/clis/zhihu/followers.js +1 -0
- package/clis/zhihu/following.js +1 -0
- package/clis/zhihu/hot.js +21 -0
- package/clis/zhihu/like.js +16 -0
- package/clis/zhihu/paginate.js +11 -0
- package/clis/zhihu/pin.js +24 -0
- package/clis/zhihu/pins.js +1 -0
- package/clis/zhihu/question.js +7 -0
- package/clis/zhihu/recommend.js +7 -0
- package/clis/zhihu/search.js +11 -0
- package/clis/zhihu/stats.js +41 -0
- package/clis/zhihu/target.js +1 -0
- package/clis/zhihu/text.js +6 -0
- package/clis/zhihu/user-answers.js +1 -0
- package/clis/zhihu/user-arg.js +1 -0
- package/clis/zhihu/user-articles.js +1 -0
- package/clis/zhihu/user.js +11 -0
- package/clis/zhihu/write-shared.js +71 -0
- package/clis/zlibrary/info.js +1 -0
- package/clis/zlibrary/search.js +1 -0
- package/clis/zlibrary/utils.js +48 -0
- package/clis/zsxq/auth.js +33 -0
- package/clis/zsxq/dynamics.js +1 -0
- package/clis/zsxq/groups.js +1 -0
- package/clis/zsxq/search.js +1 -0
- package/clis/zsxq/topic.js +1 -0
- package/clis/zsxq/topics.js +1 -0
- package/clis/zsxq/utils.js +72 -0
- package/dist/src/adapter-shadow.d.ts +11 -0
- package/dist/src/adapter-shadow.js +2 -0
- package/dist/src/adapter-shadow.test.d.ts +1 -0
- package/dist/src/adapter-source.d.ts +11 -0
- package/dist/src/adapter-source.js +1 -0
- package/dist/src/adapter-source.test.d.ts +1 -0
- package/dist/src/browser/analyze.d.ts +118 -0
- package/dist/src/browser/analyze.js +1 -0
- package/dist/src/browser/analyze.test.d.ts +1 -0
- package/dist/src/browser/article-extract.d.ts +57 -0
- package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
- package/dist/src/browser/article-extract.js +2 -0
- package/dist/src/browser/article-extract.test.d.ts +1 -0
- package/dist/src/browser/ax-snapshot.d.ts +37 -0
- package/dist/src/browser/ax-snapshot.js +2 -0
- package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
- package/dist/src/browser/base-page.d.ts +151 -0
- package/dist/src/browser/base-page.js +225 -0
- package/dist/src/browser/base-page.test.d.ts +1 -0
- package/dist/src/browser/bridge-readiness.d.ts +14 -0
- package/dist/src/browser/bridge-readiness.js +1 -0
- package/dist/src/browser/bridge-readiness.test.d.ts +1 -0
- package/dist/src/browser/bridge.d.ts +26 -0
- package/dist/src/browser/bridge.js +1 -0
- package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
- package/dist/src/browser/cdp.d.ts +51 -0
- package/dist/src/browser/cdp.js +1 -0
- package/dist/src/browser/cdp.test.d.ts +1 -0
- package/dist/src/browser/compound.d.ts +59 -0
- package/dist/src/browser/compound.js +82 -0
- package/dist/src/browser/compound.test.d.ts +1 -0
- package/dist/src/browser/config.d.ts +2 -0
- package/dist/src/browser/config.js +1 -0
- package/dist/src/browser/daemon-client.d.ts +79 -0
- package/dist/src/browser/daemon-client.js +1 -0
- package/dist/src/browser/daemon-client.test.d.ts +1 -0
- package/dist/src/browser/daemon-lifecycle.d.ts +37 -0
- package/dist/src/browser/daemon-lifecycle.js +12 -0
- package/dist/src/browser/daemon-transport.d.ts +55 -0
- package/dist/src/browser/daemon-transport.js +1 -0
- package/dist/src/browser/daemon-version.d.ts +4 -0
- package/dist/src/browser/daemon-version.js +2 -0
- package/dist/src/browser/dom-helpers.d.ts +41 -0
- package/dist/src/browser/dom-helpers.js +166 -0
- package/dist/src/browser/dom-helpers.test.d.ts +1 -0
- package/dist/src/browser/dom-snapshot.d.ts +93 -0
- package/dist/src/browser/dom-snapshot.js +809 -0
- package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
- package/dist/src/browser/errors.d.ts +38 -0
- package/dist/src/browser/errors.js +5 -0
- package/dist/src/browser/errors.test.d.ts +1 -0
- package/dist/src/browser/extract.d.ts +69 -0
- package/dist/src/browser/extract.js +42 -0
- package/dist/src/browser/extract.test.d.ts +1 -0
- package/dist/src/browser/find.d.ts +84 -0
- package/dist/src/browser/find.js +328 -0
- package/dist/src/browser/find.test.d.ts +1 -0
- package/dist/src/browser/fingerprint.d.ts +44 -0
- package/dist/src/browser/fingerprint.js +82 -0
- package/dist/src/browser/html-tree.d.ts +75 -0
- package/dist/src/browser/html-tree.js +61 -0
- package/dist/src/browser/html-tree.test.d.ts +1 -0
- package/dist/src/browser/index.d.ts +14 -0
- package/dist/src/browser/index.js +1 -0
- package/dist/src/browser/managed-chrome.d.ts +89 -0
- package/dist/src/browser/managed-chrome.js +1 -0
- package/dist/src/browser/network-cache.d.ts +49 -0
- package/dist/src/browser/network-cache.js +1 -0
- package/dist/src/browser/network-cache.test.d.ts +1 -0
- package/dist/src/browser/network-key.d.ts +22 -0
- package/dist/src/browser/network-key.js +1 -0
- package/dist/src/browser/network-key.test.d.ts +1 -0
- package/dist/src/browser/page.d.ts +83 -0
- package/dist/src/browser/page.js +15 -0
- package/dist/src/browser/page.test.d.ts +1 -0
- package/dist/src/browser/profile.d.ts +96 -0
- package/dist/src/browser/profile.js +2 -0
- package/dist/src/browser/proxy-test.d.ts +28 -0
- package/dist/src/browser/proxy-test.js +12 -0
- package/dist/src/browser/shape-filter.d.ts +52 -0
- package/dist/src/browser/shape-filter.js +1 -0
- package/dist/src/browser/shape-filter.test.d.ts +1 -0
- package/dist/src/browser/shape.d.ts +23 -0
- package/dist/src/browser/shape.js +1 -0
- package/dist/src/browser/shape.test.d.ts +1 -0
- package/dist/src/browser/stealth.d.ts +18 -0
- package/dist/src/browser/stealth.js +391 -0
- package/dist/src/browser/stealth.test.d.ts +1 -0
- package/dist/src/browser/tabs.d.ts +13 -0
- package/dist/src/browser/tabs.js +2 -0
- package/dist/src/browser/target-errors.d.ts +39 -0
- package/dist/src/browser/target-errors.js +1 -0
- package/dist/src/browser/target-errors.test.d.ts +1 -0
- package/dist/src/browser/target-resolver.d.ts +158 -0
- package/dist/src/browser/target-resolver.js +423 -0
- package/dist/src/browser/target-resolver.test.d.ts +1 -0
- package/dist/src/browser/trace.d.ts +21 -0
- package/dist/src/browser/trace.js +2 -0
- package/dist/src/browser/utils.d.ts +20 -0
- package/dist/src/browser/utils.js +1 -0
- package/dist/src/browser/utils.test.d.ts +1 -0
- package/dist/src/browser/verify-fixture.d.ts +65 -0
- package/dist/src/browser/verify-fixture.js +2 -0
- package/dist/src/browser/verify-fixture.test.d.ts +1 -0
- package/dist/src/browser/visual-refs.d.ts +11 -0
- package/dist/src/browser/visual-refs.js +94 -0
- package/dist/src/browser-session-lock.d.ts +13 -0
- package/dist/src/browser-session-lock.js +1 -0
- package/dist/src/browser-session-lock.test.d.ts +1 -0
- package/dist/src/browser.test.d.ts +1 -0
- package/dist/src/build-manifest.d.ts +103 -0
- package/dist/src/build-manifest.js +16 -0
- package/dist/src/build-manifest.test.d.ts +1 -0
- package/dist/src/capabilityRouting.d.ts +19 -0
- package/dist/src/capabilityRouting.js +1 -0
- package/dist/src/capabilityRouting.test.d.ts +1 -0
- package/dist/src/cli-argv-preprocess.d.ts +63 -0
- package/dist/src/cli-argv-preprocess.js +1 -0
- package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
- package/dist/src/cli.d.ts +79 -0
- package/dist/src/cli.js +132 -0
- package/dist/src/cli.test.d.ts +1 -0
- package/dist/src/commanderAdapter.d.ts +21 -0
- package/dist/src/commanderAdapter.js +3 -0
- package/dist/src/commanderAdapter.test.d.ts +1 -0
- package/dist/src/commands/auth.d.ts +40 -0
- package/dist/src/commands/auth.js +2 -0
- package/dist/src/commands/auth.test.d.ts +1 -0
- package/dist/src/commands/daemon.d.ts +25 -0
- package/dist/src/commands/daemon.js +1 -0
- package/dist/src/commands/daemon.test.d.ts +1 -0
- package/dist/src/completion-fast.d.ts +22 -0
- package/dist/src/completion-fast.js +1 -0
- package/dist/src/completion-shared.d.ts +13 -0
- package/dist/src/completion-shared.js +30 -0
- package/dist/src/completion.d.ts +21 -0
- package/dist/src/completion.js +1 -0
- package/dist/src/completion.test.d.ts +1 -0
- package/dist/src/constants.d.ts +22 -0
- package/dist/src/constants.js +1 -0
- package/dist/src/convention-audit.d.ts +50 -0
- package/dist/src/convention-audit.js +2 -0
- package/dist/src/convention-audit.test.d.ts +1 -0
- package/dist/src/daemon-utils.d.ts +18 -0
- package/dist/src/daemon-utils.js +1 -0
- package/dist/src/daemon.d.ts +22 -0
- package/dist/src/daemon.js +1 -0
- package/dist/src/daemon.test.d.ts +1 -0
- package/dist/src/discovery.d.ts +43 -0
- package/dist/src/discovery.js +2 -0
- package/dist/src/doctor.d.ts +38 -0
- package/dist/src/doctor.js +13 -0
- package/dist/src/doctor.test.d.ts +1 -0
- package/dist/src/download/article-download.d.ts +72 -0
- package/dist/src/download/article-download.js +21 -0
- package/dist/src/download/article-download.test.d.ts +1 -0
- package/dist/src/download/index.d.ts +71 -0
- package/dist/src/download/index.js +7 -0
- package/dist/src/download/index.test.d.ts +1 -0
- package/dist/src/download/media-download.d.ts +49 -0
- package/dist/src/download/media-download.js +1 -0
- package/dist/src/download/media-download.test.d.ts +1 -0
- package/dist/src/download/progress.d.ts +36 -0
- package/dist/src/download/progress.js +5 -0
- package/dist/src/download/progress.test.d.ts +1 -0
- package/dist/src/electron-apps.d.ts +31 -0
- package/dist/src/electron-apps.js +1 -0
- package/dist/src/electron-apps.test.d.ts +1 -0
- package/dist/src/engine.test.d.ts +1 -0
- package/dist/src/errors.d.ts +117 -0
- package/dist/src/errors.js +2 -0
- package/dist/src/errors.test.d.ts +1 -0
- package/dist/src/execution.d.ts +24 -0
- package/dist/src/execution.js +2 -0
- package/dist/src/execution.test.d.ts +1 -0
- package/dist/src/extension-manifest-regression.test.d.ts +1 -0
- package/dist/src/external-clis.yaml +109 -0
- package/dist/src/external.d.ts +49 -0
- package/dist/src/external.js +1 -0
- package/dist/src/external.test.d.ts +1 -0
- package/dist/src/help.d.ts +88 -0
- package/dist/src/help.js +8 -0
- package/dist/src/help.test.d.ts +1 -0
- package/dist/src/hooks.d.ts +46 -0
- package/dist/src/hooks.js +1 -0
- package/dist/src/hooks.test.d.ts +4 -0
- package/dist/src/interceptor.d.ts +44 -0
- package/dist/src/interceptor.js +123 -0
- package/dist/src/interceptor.test.d.ts +4 -0
- package/dist/src/launcher.d.ts +41 -0
- package/dist/src/launcher.js +7 -0
- package/dist/src/launcher.test.d.ts +1 -0
- package/dist/src/logger.d.ts +26 -0
- package/dist/src/logger.js +9 -0
- package/dist/src/main.d.ts +5 -0
- package/dist/src/main.js +10 -0
- package/dist/src/manifest-types.d.ts +43 -0
- package/dist/src/manifest-types.js +1 -0
- package/dist/src/node-network.d.ts +10 -0
- package/dist/src/node-network.js +1 -0
- package/dist/src/node-network.test.d.ts +1 -0
- package/dist/src/observation/artifact.d.ts +16 -0
- package/dist/src/observation/artifact.js +8 -0
- package/dist/src/observation/artifact.test.d.ts +1 -0
- package/dist/src/observation/events.d.ts +89 -0
- package/dist/src/observation/events.js +1 -0
- package/dist/src/observation/index.d.ts +7 -0
- package/dist/src/observation/index.js +1 -0
- package/dist/src/observation/manager.d.ts +9 -0
- package/dist/src/observation/manager.js +1 -0
- package/dist/src/observation/manager.test.d.ts +1 -0
- package/dist/src/observation/redaction.d.ts +11 -0
- package/dist/src/observation/redaction.js +2 -0
- package/dist/src/observation/redaction.test.d.ts +1 -0
- package/dist/src/observation/retention.d.ts +32 -0
- package/dist/src/observation/retention.js +1 -0
- package/dist/src/observation/retention.test.d.ts +1 -0
- package/dist/src/observation/ring-buffer.d.ts +22 -0
- package/dist/src/observation/ring-buffer.js +1 -0
- package/dist/src/observation/ring-buffer.test.d.ts +1 -0
- package/dist/src/observation/session.d.ts +25 -0
- package/dist/src/observation/session.js +1 -0
- package/dist/src/output.d.ts +14 -0
- package/dist/src/output.js +2 -0
- package/dist/src/output.test.d.ts +1 -0
- package/dist/src/package-exports.test.d.ts +1 -0
- package/dist/src/package-paths.d.ts +8 -0
- package/dist/src/package-paths.js +1 -0
- package/dist/src/pipeline/executor.d.ts +11 -0
- package/dist/src/pipeline/executor.js +1 -0
- package/dist/src/pipeline/executor.test.d.ts +4 -0
- package/dist/src/pipeline/index.d.ts +5 -0
- package/dist/src/pipeline/index.js +1 -0
- package/dist/src/pipeline/registry.d.ts +28 -0
- package/dist/src/pipeline/registry.js +1 -0
- package/dist/src/pipeline/steps/browser.d.ts +13 -0
- package/dist/src/pipeline/steps/browser.js +1 -0
- package/dist/src/pipeline/steps/download.d.ts +18 -0
- package/dist/src/pipeline/steps/download.js +1 -0
- package/dist/src/pipeline/steps/download.test.d.ts +1 -0
- package/dist/src/pipeline/steps/fetch.d.ts +5 -0
- package/dist/src/pipeline/steps/fetch.js +31 -0
- package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
- package/dist/src/pipeline/steps/intercept.d.ts +5 -0
- package/dist/src/pipeline/steps/intercept.js +1 -0
- package/dist/src/pipeline/steps/tap.d.ts +12 -0
- package/dist/src/pipeline/steps/tap.js +53 -0
- package/dist/src/pipeline/steps/transform.d.ts +9 -0
- package/dist/src/pipeline/steps/transform.js +1 -0
- package/dist/src/pipeline/template.d.ts +17 -0
- package/dist/src/pipeline/template.js +1 -0
- package/dist/src/pipeline/template.test.d.ts +4 -0
- package/dist/src/pipeline/transform.test.d.ts +4 -0
- package/dist/src/plugin-manifest.d.ts +70 -0
- package/dist/src/plugin-manifest.js +1 -0
- package/dist/src/plugin-manifest.test.d.ts +4 -0
- package/dist/src/plugin-scaffold.d.ts +28 -0
- package/dist/src/plugin-scaffold.js +75 -0
- package/dist/src/plugin-scaffold.test.d.ts +4 -0
- package/dist/src/plugin.d.ts +145 -0
- package/dist/src/plugin.js +20 -0
- package/dist/src/plugin.test.d.ts +4 -0
- package/dist/src/rate-limit.d.ts +15 -0
- package/dist/src/rate-limit.js +2 -0
- package/dist/src/rate-limit.test.d.ts +1 -0
- package/dist/src/registry-api.d.ts +13 -0
- package/dist/src/registry-api.js +1 -0
- package/dist/src/registry.d.ts +130 -0
- package/dist/src/registry.js +1 -0
- package/dist/src/registry.test.d.ts +4 -0
- package/dist/src/runtime-detect.d.ts +31 -0
- package/dist/src/runtime-detect.js +1 -0
- package/dist/src/runtime-detect.test.d.ts +1 -0
- package/dist/src/runtime.d.ts +57 -0
- package/dist/src/runtime.js +1 -0
- package/dist/src/scripts/framework.d.ts +7 -0
- package/dist/src/scripts/framework.js +1 -0
- package/dist/src/scripts/interact.d.ts +4 -0
- package/dist/src/scripts/interact.js +1 -0
- package/dist/src/scripts/store.d.ts +13 -0
- package/dist/src/scripts/store.js +1 -0
- package/dist/src/serialization.d.ts +42 -0
- package/dist/src/serialization.js +4 -0
- package/dist/src/serialization.test.d.ts +1 -0
- package/dist/src/skills.d.ts +14 -0
- package/dist/src/skills.js +6 -0
- package/dist/src/skills.test.d.ts +1 -0
- package/dist/src/snapshotFormatter.d.ts +11 -0
- package/dist/src/snapshotFormatter.js +3 -0
- package/dist/src/snapshotFormatter.test.d.ts +7 -0
- package/dist/src/tui.d.ts +28 -0
- package/dist/src/tui.js +16 -0
- package/dist/src/tui.test.d.ts +1 -0
- package/dist/src/types.d.ts +236 -0
- package/dist/src/types.js +1 -0
- package/dist/src/utils.d.ts +57 -0
- package/dist/src/utils.js +38 -0
- package/dist/src/utils.test.d.ts +1 -0
- package/dist/src/validate.d.ts +21 -0
- package/dist/src/validate.js +3 -0
- package/dist/src/validate.test.d.ts +9 -0
- package/dist/src/verify.d.ts +27 -0
- package/dist/src/verify.js +2 -0
- package/dist/src/verify.test.d.ts +8 -0
- package/dist/src/version.d.ts +4 -0
- package/dist/src/version.js +1 -0
- package/dist/src/weixin-download.test.d.ts +1 -0
- package/docs/guide/browser-bridge.md +94 -0
- package/docs/guide/electron-app-cli.md +199 -0
- package/docs/guide/exit-codes.md +24 -0
- package/docs/guide/extending-opencli.md +134 -0
- package/docs/guide/getting-started.md +81 -0
- package/docs/guide/installation.md +52 -0
- package/docs/guide/plugins.md +226 -0
- package/docs/guide/remote-orchestration.md +116 -0
- package/docs/guide/troubleshooting.md +69 -0
- package/package.json +116 -0
- package/scripts/check-doc-coverage.sh +81 -0
- package/scripts/check-listing-id-pairing.mjs +193 -0
- package/scripts/check-silent-column-drop.mjs +105 -0
- package/scripts/check-typed-error-lint.mjs +118 -0
- package/scripts/clean-dist.cjs +13 -0
- package/scripts/copy-yaml.cjs +12 -0
- package/scripts/fetch-adapters.js +293 -0
- package/scripts/minify-release.mjs +115 -0
- package/scripts/postinstall.js +174 -0
- package/scripts/silent-column-drop-baseline.json +910 -0
- package/scripts/typed-error-lint-baseline.json +1098 -0
- package/skills/opencli-adapter-author/SKILL.md +256 -0
- package/skills/opencli-adapter-author/references/adapter-template.md +471 -0
- package/skills/opencli-adapter-author/references/api-discovery.md +295 -0
- package/skills/opencli-adapter-author/references/coverage-matrix.md +81 -0
- package/skills/opencli-adapter-author/references/field-conventions.md +172 -0
- package/skills/opencli-adapter-author/references/field-decode-playbook.md +181 -0
- package/skills/opencli-adapter-author/references/jsdom-fixture-pattern.md +196 -0
- package/skills/opencli-adapter-author/references/output-design.md +149 -0
- package/skills/opencli-adapter-author/references/site-memory/bilibili.md +70 -0
- package/skills/opencli-adapter-author/references/site-memory/eastmoney.md +70 -0
- package/skills/opencli-adapter-author/references/site-memory/tonghuashun.md +51 -0
- package/skills/opencli-adapter-author/references/site-memory/xueqiu.md +58 -0
- package/skills/opencli-adapter-author/references/site-memory.md +231 -0
- package/skills/opencli-adapter-author/references/site-recon.md +134 -0
- package/skills/opencli-adapter-author/references/strategy-selection.md +169 -0
- package/skills/opencli-adapter-author/references/success-rate-pitfalls.md +162 -0
- package/skills/opencli-adapter-author/references/typed-errors.md +234 -0
- package/skills/opencli-autofix/SKILL.md +297 -0
- package/skills/opencli-browser/SKILL.md +468 -0
- package/skills/opencli-browser-sitemap/SKILL.md +96 -0
- package/skills/opencli-sitemap-author/SKILL.md +161 -0
- package/skills/opencli-sitemap-author/references/sitemap-schema.md +660 -0
- package/skills/opencli-usage/SKILL.md +168 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as L,Strategy as O}from"@jackwener/opencli/registry";import{ArgumentError as W,CommandExecutionError as F}from"@jackwener/opencli/errors";import{SEARCH_COLUMNS as b,detectAuthOrPageFailure as P,parsePrice as j,parseReviewCount as x,requireSearchLimit as f,wrapDianpingStep as $}from"./utils.js";import{resolveCityIdAsync as D,resolveDefaultCityId as A}from"./cityResolver.js";export function extractSearchRows(){const J=document.querySelectorAll("#shop-all-list li");if(J.length===0){const z=document.body;return{ok:!1,sample:(z&&(z.innerText||z.textContent)||"").slice(0,800),url:location.href}}const Q=[];J.forEach((z,Z)=>{if(!(z.querySelector(".tit h4, .review-num, .mean-price, .tag-addr")||z.querySelector('.tit a, a[data-shopid], a[href*="/shop/"]')))return;const K=z.querySelector('.tit a[href*="/shop/"]')||z.querySelector("a[data-shopid]")||z.querySelector('a[href*="/shop/"]'),T=K&&K.getAttribute("data-shopid")||K&&(K.getAttribute("href")||"").match(/\/shop\/([^?#/]+)/)?.[1]||"",G=z.querySelector(".tit h4"),Y=G&&G.textContent&&G.textContent.trim()||K&&K.getAttribute("title")||"",B=z.querySelector(".review-num b"),U=B&&B.textContent&&B.textContent.trim()||"",q=z.querySelector(".mean-price b"),_=q&&q.textContent&&q.textContent.trim()||"",H=Array.from(z.querySelectorAll(".tag-addr .tag")).map((V)=>V.textContent.trim()).filter(Boolean);let M="";const N=z.querySelector(".nebula_star");if(N){const V=N.outerHTML.match(/star_(\d{2})/g);if(V&&V.length)M=V[V.length-1].match(/star_(\d{2})/)[1]}Q.push({rank:Z+1,shop_id:T,name:Y,starClass:M,reviewsRaw:U,priceRaw:_,cuisine:H[0]||"",district:H[1]||"",url:T?"https://www.dianping.com/shop/"+T:""})});return{ok:!0,rows:Q}}L({site:"dianping",name:"search",access:"read",description:"大众点评店铺搜索(按关键词 + 城市)",domain:"www.dianping.com",strategy:O.COOKIE,args:[{name:"keyword",required:!0,positional:!0,help:'搜索关键词,例如 "火锅"'},{name:"city",help:"城市名(北京/上海/汕头/beijing/shantou/...)或 cityId 数字。未在静态表中的城市会通过 dianping.com 在线解析。不传则使用 cookie 默认城市"},{name:"limit",type:"int",default:15,help:"返回的店铺数量(最多 15,dianping 单页固定 15 条)"}],columns:b,func:async(J,Q)=>{const z=String(Q.keyword||"").trim();if(!z)throw new W("keyword","must be a non-empty string");const Z=f(Q.limit);let X=await $("city resolve",()=>D(J,Q.city));if(X==null)X=await $("default city resolve",()=>A(J));if(X==null)throw new F("dianping search 需要城市:未传 --city 且无法确定默认城市。请显式指定,例如 --city 上海");const T=`https://www.dianping.com${`/search/keyword/${X}/0_${encodeURIComponent(z)}`}`;await $(`search "${z}" navigation`,async()=>{await J.goto(T);await J.wait(2)});const G=await $(`search "${z}" extraction`,()=>J.evaluate(`(${extractSearchRows.toString()})()`));if(!G||!G.ok)P({text:String(G?.sample||""),url:String(G?.url||T)},`search "${z}"`,{emptyPatterns:[/没有找到|暂无结果|暂无商户|换个关键词|未找到相关/i]});const Y=(G.rows||[]).slice(0,Z);if(Y.length===0)throw new F("dianping search parser found no result-shaped shop cards");if(Y.some((B)=>!B?.shop_id))throw new F("dianping search parser found result cards without shop_id values");return Y.map((B)=>({rank:B.rank,shop_id:B.shop_id,name:B.name,rating:B.starClass?Number((Number(B.starClass)/10).toFixed(1)):null,reviews:x(B.reviewsRaw),price:j(B.priceRaw),cuisine:B.cuisine,district:B.district,url:B.url}))}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as F,Strategy as O}from"@jackwener/opencli/registry";import{SHOP_COLUMNS as P,detectAuthOrPageFailure as f,normalizeShopId as I,parsePrice as R,parseReviewCount as S,wrapDianpingStep as C}from"./utils.js";export function extractShopFields(){const X=document.querySelector(".shop-head");if(!X){const B=document.body;return{ok:!1,sample:(B&&(B.innerText||B.textContent)||"").slice(0,800),url:location.href}}const V=X.textContent.trim().replace(/\s+/g," "),J=document.querySelector(".shop-name, .shop-head h2, .shop-head h1");let W=J&&J.textContent&&J.textContent.trim()||"";if(!W){const Q=(document.title||"").match(/【([^】]+)】/);if(Q)W=Q[1].trim()}const q=document.querySelector(".star-score"),$=q&&q.textContent&&q.textContent.trim()||"",z=Array.from(document.querySelectorAll(".shop-feature")).map((B)=>B.textContent.trim()).filter(Boolean),Y=document.querySelector(".desc-info"),G=Y&&Y.textContent&&Y.textContent.trim()||"",A=V.match(/距(?:地铁)?[^\s]+?步行\d+m/),H=A?A[0]:"",Z=document.querySelector(".reviews, .review-num, .reviewCount, .reviewCountSentence");let K=Z&&Z.textContent&&Z.textContent.trim()||"";if(!K){const B=document.querySelector(".review-title"),Q=B&&B.textContent,j=Q&&Q.match(/评价\(([\d.,万]+)\)/);if(j)K=j[1]}const L=V.match(/[¥¥]\s*\d+(?:\.\d+)?/),N={},D=["口味","环境","服务","食材"];for(const B of D){const Q=V.match(new RegExp(B+"[::]\\s*([0-9.]+)"));if(Q)N[B]=Number(Q[1])}const U=V.match(/营业中[^\s]*\d{1,2}:\d{2}-(?:次日)?\d{1,2}:\d{2}|今日休息|暂停营业/),_=V.match(/[^\s]+?(?:口味|人气|环境|服务)榜\s*[·•]\s*第\d+名/);return{ok:!0,name:W,rating:$,reviewsRaw:K,priceRaw:L&&L[0]||"",breakdown:N,features:z,address:G,subway:H,hours:U&&U[0]||"",rank:_&&_[0]||"",url:location.href}}F({site:"dianping",name:"shop",access:"read",aliases:["detail"],description:"大众点评店铺详情(按 shop_id)",domain:"www.dianping.com",strategy:O.COOKIE,args:[{name:"shop_id",required:!0,positional:!0,help:"店铺 ID(来自 search 的 shop_id 列,或 https://www.dianping.com/shop/<id> URL 段)"}],columns:P,func:async(X,V)=>{const J=I(V.shop_id),W=`https://www.dianping.com/shop/${J}`;await C(`shop ${J} navigation`,async()=>{await X.goto(W);await X.wait(3)});const q=await C(`shop ${J} extraction`,()=>X.evaluate(`(${extractShopFields.toString()})()`));if(!q||!q.ok)f({text:String(q?.sample||""),url:String(q?.url||W)},`shop ${J}`,{emptyPatterns:[/商户不存在|店铺不存在|店铺已关闭|页面不存在|404|已下线|没有找到相关商户/i]});const $=q.rating?Number(q.rating):null,z=S(q.reviewsRaw),Y=R(q.priceRaw),G=q.breakdown||{};return[["shop_id",J],["name",q.name||""],["rating",Number.isFinite($)?$:null],["reviews",z],["price",Y],["rank",q.rank||""],["taste",Number.isFinite(G["口味"])?G["口味"]:null],["environment",Number.isFinite(G["环境"])?G["环境"]:null],["service",Number.isFinite(G["服务"])?G["服务"]:null],["ingredients",Number.isFinite(G["食材"])?G["食材"]:null],["hours",q.hours||""],["address",q.address||""],["subway",q.subway||""],["features",(q.features||[]).join(", ")],["url",q.url||W]].map(([H,Z])=>({field:H,value:Z}))}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ArgumentError as L,AuthRequiredError as N,CommandExecutionError as O,EmptyResultError as S}from"@jackwener/opencli/errors";export const CITY_ID={beijing:2,"北京":2,shanghai:1,"上海":1,guangzhou:4,"广州":4,shenzhen:7,"深圳":7,hangzhou:3,"杭州":3,chengdu:8,"成都":8,chongqing:9,"重庆":9,nanjing:5,"南京":5,suzhou:6,"苏州":6,xian:17,"西安":17,wuhan:16,"武汉":16,tianjin:10,"天津":10,qingdao:21,"青岛":21,changsha:344,"长沙":344,dalian:19,"大连":19,shenyang:18,"沈阳":18,kunming:25,"昆明":25,fuzhou:110,"福州":110,xiamen:14,"厦门":14,hefei:26,"合肥":26},SEARCH_COLUMNS=["rank","shop_id","name","rating","reviews","price","cuisine","district","url"],SHOP_COLUMNS=["field","value"];export function resolveCityId(F){if(F==null||F==="")return null;const B=String(F).trim().toLowerCase();if(/^\d+$/.test(B))return Number(B);const z=CITY_ID[B];if(!z){const G=Object.keys(CITY_ID).filter((J)=>/^[a-z]+$/.test(J)).join(", ");throw new L("city",`unknown city '${F}'. pass a numeric cityId or one of: ${G}`)}return z}export function requireSearchLimit(F){const B=F==null||F===""?15:F,z=typeof B==="number"?B:Number(String(B).trim());if(!Number.isInteger(z)||z<1||z>15)throw new L("limit must be an integer between 1 and 15 (dianping single page)");return z}export function normalizeShopId(F){const B=String(F||"").trim();if(!B)throw new L("shop_id must be a non-empty string");const z=B.match(/\/shop\/([^?#/]+)/),G=z?z[1]:B;if(!/^[A-Za-z0-9_-]+$/.test(G))throw new L(`'${B}' does not look like a dianping shop id`);return G}export function wrapDianpingStep(F,B){return Promise.resolve().then(B).catch((z)=>{if(z?.code)throw z;const G=z?.message||String(z);throw new O(`dianping ${F} failed: ${G}`)})}export function detectAuthOrPageFailure({text:F="",url:B=""},z,{emptyPatterns:G=[]}={}){const J=`${B} ${F}`;if(/verify\.meituan\.com|verifyimg|身份核实|请依次点击|美团安全验证|Yoda/i.test(J))throw new N("dianping.com",`dianping ${z} blocked by captcha — open ${B||"www.dianping.com"} manually in this profile and solve the captcha, then retry`);if(/login\.dianping\.com|account\.dianping\.com|请先登录|未登录|请登录/.test(J))throw new N("dianping.com",`dianping ${z} requires login — sign in to dianping.com in this profile, then retry`);if(G.some((Q)=>Q.test(J)))throw new S(`dianping ${z}`);const K=F?`; sample: ${String(F).slice(0,160)}`:"";throw new O(`dianping ${z} did not render expected data${K}`,"This usually means dianping changed its HTML, returned an unexpected error page, or the browser profile hit an unrecognized anti-bot state.")}export function parseReviewCount(F){if(F==null)return null;const B=String(F).trim();if(!B)return null;const z=B.match(/^([\d.]+)\s*万/);if(z){const K=Number(z[1]);return Number.isFinite(K)?Math.round(K*1e4):null}const G=B.match(/(\d+(?:\.\d+)?)/);if(!G)return null;const J=Number(G[1]);return Number.isFinite(J)?Math.round(J):null}export function parsePrice(F){if(!F)return null;const B=String(F).match(/[¥¥]\s*(\d+(?:\.\d+)?)/);if(!B)return null;const z=Number(B[1]);return Number.isFinite(z)?z:null}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as e,Strategy as i}from"@jackwener/opencli/registry";e({site:"dictionary",name:"examples",access:"read",description:"Read real-world example sentences utilizing the word",domain:"api.dictionaryapi.dev",strategy:i.PUBLIC,browser:!1,args:[{name:"word",type:"string",required:!0,positional:!0,help:"Word to get example sentences for"}],columns:["word","example"],pipeline:[{fetch:{url:"https://api.dictionaryapi.dev/api/v2/entries/en/${{ args.word | urlencode }}"}},{map:{word:"${{ item.word }}",example:"${{ (() => { if (item.meanings) { for (const m of item.meanings) { if (m.definitions) { for (const d of m.definitions) { if (d.example) return d.example; } } } } return 'No example found in API.'; })() }}"}},{limit:1}]});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as i,Strategy as e}from"@jackwener/opencli/registry";i({site:"dictionary",name:"search",access:"read",description:"Search the Free Dictionary API for definitions, parts of speech, and pronunciations.",domain:"api.dictionaryapi.dev",strategy:e.PUBLIC,browser:!1,args:[{name:"word",type:"string",required:!0,positional:!0,help:"Word to define (e.g., serendipity)"}],columns:["word","phonetic","type","definition"],pipeline:[{fetch:{url:"https://api.dictionaryapi.dev/api/v2/entries/en/${{ args.word | urlencode }}"}},{map:{word:"${{ item.word }}",phonetic:"${{ (() => { if (item.phonetic) return item.phonetic; if (item.phonetics) { for (const p of item.phonetics) { if (p.text) return p.text; } } return ''; })() }}",type:"${{ (() => { if (item.meanings && item.meanings[0] && item.meanings[0].partOfSpeech) return item.meanings[0].partOfSpeech; return 'N/A'; })() }}",definition:"${{ (() => { if (item.meanings && item.meanings[0] && item.meanings[0].definitions && item.meanings[0].definitions[0] && item.meanings[0].definitions[0].definition) return item.meanings[0].definitions[0].definition; return 'No definition found in API.'; })() }}"}},{limit:1}]});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as n,Strategy as s}from"@jackwener/opencli/registry";n({site:"dictionary",name:"synonyms",access:"read",description:"Find synonyms for a specific word",domain:"api.dictionaryapi.dev",strategy:s.PUBLIC,browser:!1,args:[{name:"word",type:"string",required:!0,positional:!0,help:"Word to find synonyms for (e.g., serendipity)"}],columns:["word","synonyms"],pipeline:[{fetch:{url:"https://api.dictionaryapi.dev/api/v2/entries/en/${{ args.word | urlencode }}"}},{map:{word:"${{ item.word }}",synonyms:"${{ (() => { const s = new Set(); if (item.meanings) { for (const m of item.meanings) { if (m.synonyms) { for (const syn of m.synonyms) s.add(syn); } if (m.definitions) { for (const d of m.definitions) { if (d.synonyms) { for (const syn of d.synonyms) s.add(syn); } } } } } const arr = Array.from(s); return arr.length > 0 ? arr.slice(0, 5).join(', ') : 'No synonyms found in API.'; })() }}"}},{limit:1}]});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as n,Strategy as s}from"@jackwener/opencli/registry";import{EmptyResultError as t}from"@jackwener/opencli/errors";import{listDiscordChannels as o}from"./utils.js";export const channelsCommand=n({site:"discord-app",name:"channels",access:"read",description:"List channels in the current Discord server",domain:"localhost",strategy:s.UI,browser:!0,args:[],columns:["Index","Channel","Type","guild_id","channel_id","url"],func:async(r)=>{const e=await o(r);if(e.length===0)throw new t("discord-app channels","No Discord channels were found in the current server sidebar.");return e}}),__test__={channelsCommand};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import{cli as G,Strategy as H}from"@jackwener/opencli/registry";import{CommandExecutionError as A}from"@jackwener/opencli/errors";function B(q){return`(async () => {
|
|
2
|
+
try {
|
|
3
|
+
const messageId = ${JSON.stringify(q)};
|
|
4
|
+
|
|
5
|
+
// Find the message element by its ID attribute (format: chat-messages-{channelId}-{messageId})
|
|
6
|
+
const msgEl = document.querySelector('[id$="-' + messageId + '"]');
|
|
7
|
+
if (!msgEl) {
|
|
8
|
+
return { ok: false, message: 'Could not find a message with ID ' + messageId + ' in the current channel.' };
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Find the closest list item wrapper that Discord uses for messages
|
|
12
|
+
const listItem = msgEl.closest('[id^="chat-messages-"]') || msgEl;
|
|
13
|
+
|
|
14
|
+
// Hover over the message to reveal the action toolbar
|
|
15
|
+
listItem.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true }));
|
|
16
|
+
listItem.dispatchEvent(new MouseEvent('mouseover', { bubbles: true }));
|
|
17
|
+
await new Promise(r => setTimeout(r, 500));
|
|
18
|
+
|
|
19
|
+
// Look for the "More" button in the message toolbar
|
|
20
|
+
// Discord shows a toolbar with buttons when hovering over a message
|
|
21
|
+
const toolbar = listItem.querySelector('[class*="toolbar"]') ||
|
|
22
|
+
document.querySelector('[id^="message-actions-"]');
|
|
23
|
+
if (!toolbar) {
|
|
24
|
+
return { ok: false, message: 'Could not find the message action toolbar. Try scrolling so the message is fully visible.' };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const buttons = Array.from(toolbar.querySelectorAll('button, [role="button"], div[class*="button"]'));
|
|
28
|
+
const moreBtn = buttons.find(btn => {
|
|
29
|
+
const label = (btn.getAttribute('aria-label') || '').toLowerCase();
|
|
30
|
+
return label === 'more' || label.includes('more');
|
|
31
|
+
});
|
|
32
|
+
if (!moreBtn) {
|
|
33
|
+
return { ok: false, message: 'Could not find the "More" button on the message toolbar.' };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
moreBtn.click();
|
|
37
|
+
await new Promise(r => setTimeout(r, 500));
|
|
38
|
+
|
|
39
|
+
// Find "Delete Message" in the context menu
|
|
40
|
+
const menuItems = Array.from(document.querySelectorAll('[role="menuitem"], [id*="message-actions"]'));
|
|
41
|
+
const deleteItem = menuItems.find(item => {
|
|
42
|
+
const text = (item.textContent || '').trim().toLowerCase();
|
|
43
|
+
return text.includes('delete message') || text === 'delete';
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
if (!deleteItem) {
|
|
47
|
+
// Close the menu by pressing Escape
|
|
48
|
+
document.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
|
|
49
|
+
return { ok: false, message: 'No "Delete Message" option found. You may not have permission to delete this message.' };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
deleteItem.click();
|
|
53
|
+
await new Promise(r => setTimeout(r, 500));
|
|
54
|
+
|
|
55
|
+
// Confirm deletion in the modal dialog
|
|
56
|
+
const confirmBtn = document.querySelector('[type="submit"], button[class*="colorRed"], button[class*="danger"]');
|
|
57
|
+
if (!confirmBtn) {
|
|
58
|
+
return { ok: false, message: 'Delete confirmation dialog did not appear.' };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
confirmBtn.click();
|
|
62
|
+
return { ok: true, message: 'Message ' + messageId + ' deleted successfully.' };
|
|
63
|
+
} catch (e) {
|
|
64
|
+
return { ok: false, message: e.toString() };
|
|
65
|
+
}
|
|
66
|
+
})()`}G({site:"discord-app",name:"delete",access:"write",description:"Delete a message by its ID in the active Discord channel",domain:"localhost",strategy:H.UI,browser:!0,args:[{name:"message_id",type:"string",required:!0,positional:!0,help:"The ID of the message to delete (visible via Developer Mode or the read command)"}],columns:["status","message"],func:async(q,F)=>{if(!q)throw new A("Browser session required for discord-app delete");const v=F.message_id;if(!/^\d+$/.test(v))throw new A(`Invalid message ID: "${v}". A Discord message ID is a numeric snowflake (e.g. 1234567890123456789).`);await q.wait(0.5);const z=await q.evaluate(B(v));if(z.ok)await q.wait(1);return[{status:z.ok?"success":"failed",message:z.message}]}});export const __test__={buildDeleteScript:B};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as a,Strategy as o}from"@jackwener/opencli/registry";import{navigateToDiscordTarget as n,parsePositiveInt as s,resolveDiscordChannelTarget as d}from"./utils.js";export const gotoCommand=a({site:"discord-app",name:"goto",access:"read",description:"Open a Discord channel by id/name/url without sending messages",domain:"localhost",strategy:o.UI,browser:!0,args:[{name:"guild",required:!1,help:"Guild/server id or visible name"},{name:"channel",required:!1,help:"Channel id or visible name"},{name:"url",required:!1,help:"Discord channel URL"},{name:"timeout",required:!1,default:"8",help:"Seconds to wait for Discord to show the route (default: 8)"}],columns:["Status","guild_id","channel_id","url"],func:async(t,i)=>{const r=s(i.timeout,8,"timeout"),e=await d(t,i,{required:!0});await n(t,e,{timeoutMs:r*1000});return[{Status:"Opened",guild_id:e.guild_id,channel_id:e.channel_id,url:e.url}]}}),__test__={gotoCommand};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import{cli as s,Strategy as m}from"@jackwener/opencli/registry";export const membersCommand=s({site:"discord-app",name:"members",access:"read",description:"List online members in the current Discord channel",domain:"localhost",strategy:m.UI,browser:!0,args:[],columns:["Index","Name","Status"],func:async(e)=>{const t=await e.evaluate(`
|
|
2
|
+
(function() {
|
|
3
|
+
const results = [];
|
|
4
|
+
// Discord member list sidebar
|
|
5
|
+
const items = document.querySelectorAll('[class*="member_"], [data-list-item-id*="members"]');
|
|
6
|
+
|
|
7
|
+
items.forEach((item, i) => {
|
|
8
|
+
const nameEl = item.querySelector('[class*="username_"], [class*="nameTag"]');
|
|
9
|
+
const statusEl = item.querySelector('[class*="activity"], [class*="customStatus"]');
|
|
10
|
+
|
|
11
|
+
const name = nameEl ? nameEl.textContent.trim() : (item.textContent || '').trim().substring(0, 50);
|
|
12
|
+
const status = statusEl ? statusEl.textContent.trim() : '';
|
|
13
|
+
|
|
14
|
+
if (name && name.length > 0) {
|
|
15
|
+
results.push({ Index: i + 1, Name: name, Status: status || 'Online' });
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
return results.slice(0, 50); // Limit to 50
|
|
20
|
+
})()
|
|
21
|
+
`);if(t.length===0)return[{Index:0,Name:"No members visible",Status:"Toggle member list first"}];return t}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as A,Strategy as F}from"@jackwener/opencli/registry";import{EmptyResultError as G}from"@jackwener/opencli/errors";import{assertDiscordMessageRowsBelongToTarget as H,maybeNavigateToDiscordChannel as J,parsePositiveInt as K,readDiscordMessages as L}from"./utils.js";export const readCommand=A({site:"discord-app",name:"read",access:"read",description:"Read recent messages from the active or targeted Discord channel",domain:"localhost",strategy:F.UI,browser:!0,args:[{name:"count",required:!1,help:"Number of messages to read (default: 20)",default:"20"},{name:"guild",required:!1,help:"Guild/server id or visible name for targeted reads"},{name:"channel",required:!1,help:"Channel id or visible name for targeted reads"},{name:"url",required:!1,help:"Discord channel URL to open before reading"}],columns:["Author","Time","Message","channel_id","message_id"],func:async(f,j)=>{const x=K(j.count,20,"count"),z=await J(f,j,{waitForContent:"messages"}),q=H(await L(f,x),z,"Discord channel read");if(q.length===0)throw new G("discord-app read","No messages were found in the selected Discord channel.");return q}}),__test__={readCommand};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import{cli as c,Strategy as i}from"@jackwener/opencli/registry";import{CommandExecutionError as o,EmptyResultError as u}from"@jackwener/opencli/errors";export const searchCommand=c({site:"discord-app",name:"search",access:"read",description:"Search messages in the current Discord server/channel (Cmd+F)",domain:"localhost",strategy:i.UI,browser:!0,args:[{name:"query",required:!0,positional:!0,help:"Search query"}],columns:["Index","Author","Message"],func:async(e,n)=>{const r=n.query,a=process.platform==="darwin";await e.pressKey(a?"Meta+F":"Control+F");await e.wait(0.5);await e.evaluate(`
|
|
2
|
+
(function(q) {
|
|
3
|
+
const input = document.querySelector('[aria-label*="Search"], [class*="searchBar"] input, [placeholder*="Search"]');
|
|
4
|
+
if (!input) throw new Error('Search input not found');
|
|
5
|
+
input.focus();
|
|
6
|
+
const setter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;
|
|
7
|
+
setter.call(input, q);
|
|
8
|
+
input.dispatchEvent(new Event('input', { bubbles: true }));
|
|
9
|
+
})(${JSON.stringify(r)})
|
|
10
|
+
`);await e.pressKey("Enter");await e.wait(2);const t=await e.evaluate(`
|
|
11
|
+
(function() {
|
|
12
|
+
const items = [];
|
|
13
|
+
const resultNodes = document.querySelectorAll('[class*="searchResult_"], [id*="search-result"]');
|
|
14
|
+
|
|
15
|
+
resultNodes.forEach((node, i) => {
|
|
16
|
+
const author = node.querySelector('[class*="username"]')?.textContent?.trim() || '—';
|
|
17
|
+
const content = node.querySelector('[id^="message-content-"], [class*="messageContent"]')?.textContent?.trim() || node.textContent?.trim();
|
|
18
|
+
items.push({
|
|
19
|
+
Index: i + 1,
|
|
20
|
+
Author: author,
|
|
21
|
+
Message: (content || '').substring(0, 200),
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const bodyText = document.body?.innerText || document.body?.textContent || '';
|
|
26
|
+
const empty = /no results|no messages match|没有结果|无结果/i.test(bodyText);
|
|
27
|
+
return { items, empty };
|
|
28
|
+
})()
|
|
29
|
+
`);if(!t||!Array.isArray(t.items))throw new o("Discord search returned malformed browser payload.");const s=t.items;await e.pressKey("Escape");if(s.length===0){if(!t.empty)throw new o("Discord search result selector returned no rows and no explicit empty-state marker.");throw new u("discord-app search",`No results for "${r}".`)}return s}});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{cli as a,Strategy as r}from"@jackwener/opencli/registry";export const sendCommand=a({site:"discord-app",name:"send",access:"write",description:"Send a message in the active Discord channel",domain:"localhost",strategy:r.UI,browser:!0,args:[{name:"text",required:!0,positional:!0,help:"Message to send"}],columns:["Status"],func:async(e,t)=>{const s=t.text;await e.evaluate(`
|
|
2
|
+
(function(text) {
|
|
3
|
+
// Discord uses a Slate-based editor with [data-slate-editor="true"] or role="textbox"
|
|
4
|
+
const editor = document.querySelector('[role="textbox"][data-slate-editor="true"], [class*="slateTextArea"]');
|
|
5
|
+
if (!editor) throw new Error('Could not find Discord message input. Make sure a channel is open.');
|
|
6
|
+
|
|
7
|
+
editor.focus();
|
|
8
|
+
document.execCommand('insertText', false, text);
|
|
9
|
+
})(${JSON.stringify(s)})
|
|
10
|
+
`);await e.wait(0.3);await e.pressKey("Enter");return[{Status:"Success"}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as s,Strategy as t}from"@jackwener/opencli/registry";import{EmptyResultError as o}from"@jackwener/opencli/errors";import{listDiscordServers as i}from"./utils.js";export const serversCommand=s({site:"discord-app",name:"servers",access:"read",description:"List all Discord servers (guilds) in the sidebar",domain:"localhost",strategy:t.UI,browser:!0,args:[],columns:["Index","Server","guild_id","url"],func:async(e)=>{const r=await i(e);if(r.length===0)throw new o("discord-app servers","No Discord servers were found in the sidebar.");return r}}),__test__={serversCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as o,Strategy as s}from"@jackwener/opencli/registry";export const statusCommand=o({site:"discord-app",name:"status",access:"read",description:"Check active CDP connection to Discord Desktop",domain:"localhost",strategy:s.UI,browser:!0,args:[],columns:["Status","Url","Title"],func:async(t)=>{const e=await t.evaluate("window.location.href"),a=await t.evaluate("document.title");return[{Status:"Connected",Url:e,Title:a}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as z,Strategy as A}from"@jackwener/opencli/registry";import{EmptyResultError as C}from"@jackwener/opencli/errors";import{assertDiscordMessageRowsBelongToTarget as F,navigateToDiscordTarget as G,parsePositiveInt as H,readDiscordMessages as J,resolveDiscordThreadTarget as K}from"./utils.js";export const threadReadCommand=z({site:"discord-app",name:"thread-read",access:"read",description:"Read recent messages from a Discord thread/post by id or URL",domain:"localhost",strategy:A.UI,browser:!0,args:[{name:"thread",required:!1,help:"Thread/post id, or a full Discord thread/post URL"},{name:"count",required:!1,default:"20",help:"Number of messages to read (default: 20)"},{name:"guild",required:!1,help:"Parent guild/server id or visible name"},{name:"channel",required:!1,help:"Parent forum/channel id or visible name"},{name:"url",required:!1,help:"Discord thread/post URL"}],columns:["Author","Time","Message","channel_id","message_id"],func:async(b,f)=>{const x=H(f.count,20,"count"),j=await K(b,f);await G(b,j,{waitForContent:"messages"});const q=F(await J(b,x),j,"Discord thread read");if(q.length===0)throw new C("discord-app thread-read","No messages were found in the selected Discord thread.");return q}}),__test__={threadReadCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as a,Strategy as o}from"@jackwener/opencli/registry";import{EmptyResultError as s}from"@jackwener/opencli/errors";import{listDiscordThreads as d,maybeNavigateToDiscordChannel as n,parsePositiveInt as l}from"./utils.js";export const threadsCommand=a({site:"discord-app",name:"threads",access:"read",description:"List visible Discord forum/thread posts in the active or targeted channel",domain:"localhost",strategy:o.UI,browser:!0,args:[{name:"limit",required:!1,default:"30",help:"Maximum thread/post cards to return (default: 30)"},{name:"guild",required:!1,help:"Guild/server id or visible name for targeted thread listing"},{name:"channel",required:!1,help:"Forum/channel id or visible name for targeted thread listing"},{name:"url",required:!1,help:"Discord forum/channel URL to open before listing threads"}],columns:["Index","Thread","Author","Updated","Preview","guild_id","channel_id","thread_id","url"],func:async(e,r)=>{const i=l(r.limit,30,"limit");await n(e,r,{waitForContent:"threads",contentTimeoutMs:3000});const t=await d(e,i);if(t.length===0)throw new s("discord-app threads","No visible forum/thread posts were found in the selected Discord channel.");return t}}),__test__={threadsCommand};
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import{ArgumentError as o,CommandExecutionError as u}from"@jackwener/opencli/errors";const S=new Set(["discord.com","canary.discord.com","ptb.discord.com"]),_="https://discord.com",y=/^\d{3,}$/;function c(e){return typeof e==="string"&&e.trim()?e.trim():""}export function unwrapEvaluateResult(e){if(e&&typeof e==="object"&&!Array.isArray(e)&&"session"in e&&"data"in e)return e.data;return e}function f(e,t){const r=unwrapEvaluateResult(e);if(!r||typeof r!=="object"||Array.isArray(r))throw new u(`${t} returned malformed browser output.`);return r}function m(e,t){const r=unwrapEvaluateResult(e);if(!Array.isArray(r))throw new u(`${t} returned malformed browser output.`);return r}function b(e,t,r,n){if(!e||typeof e!=="object"||Array.isArray(e))throw new u(`${r} returned malformed row ${n+1}.`);const i=String(e[t]||"").trim();if(!i)throw new u(`${r} row ${n+1} is missing ${t}.`);return i}function g(e,t,r){e.forEach((n,i)=>{t.forEach((a)=>b(n,a,r,i))});return e}export function isDiscordSnowflake(e){return y.test(String(e||"").trim())}export function normalizeDiscordName(e){return String(e||"").trim().replace(/^#/,"").replace(/\s+/g," ").toLowerCase()}export function parseDiscordChannelUrl(e){const t=c(e);if(!t)return null;let r;try{r=new URL(t,_)}catch{return null}if(!S.has(r.hostname))return null;const n=r.pathname.split("/").filter(Boolean);if(n[0]!=="channels"||n.length<3)return null;const i=decodeURIComponent(n[1]||""),a=decodeURIComponent(n[2]||""),l=n[3]?decodeURIComponent(n[3]):void 0;if(!i||!a)return null;return{guild_id:i,channel_id:a,...l?{thread_id:l}:{},url:buildDiscordChannelUrl({guildId:i,channelId:a,threadId:l})}}export function buildDiscordChannelUrl({guildId:e,channelId:t,threadId:r}){if(!e||!t)throw new o("Discord channel navigation requires both guild_id and channel_id.");const n=`${_}/channels/${encodeURIComponent(String(e))}/${encodeURIComponent(String(t))}`;return r?`${n}/${encodeURIComponent(String(r))}`:n}export function parsePositiveInt(e,t,r){if(e===void 0||e===null||e==="")return t;const n=String(e).trim();if(!/^\d+$/.test(n))throw new o(`--${r} must be a positive integer.`);const i=parseInt(n,10);if(!Number.isFinite(i)||i<=0)throw new o(`--${r} must be a positive integer.`);return i}export function hasDiscordChannelTarget(e={}){return Boolean(c(e.url)||c(e.guild)||c(e.channel))}export function buildListChannelsScript(){return`
|
|
2
|
+
(function __opencliDiscordListChannels() {
|
|
3
|
+
function parseRoute(raw) {
|
|
4
|
+
try {
|
|
5
|
+
var url = new URL(raw, 'https://discord.com');
|
|
6
|
+
var parts = url.pathname.split('/').filter(Boolean);
|
|
7
|
+
if (parts[0] !== 'channels' || parts.length < 3) return null;
|
|
8
|
+
return { guild_id: parts[1], channel_id: parts[2], thread_id: parts[3] || '' };
|
|
9
|
+
} catch (_) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function absUrl(path) {
|
|
15
|
+
try { return new URL(path, 'https://discord.com').href; } catch (_) { return ''; }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function cleanChannelLabel(label) {
|
|
19
|
+
var cleaned = String(label || '').trim();
|
|
20
|
+
var commaIdx = cleaned.search(/[,,]/);
|
|
21
|
+
if (commaIdx !== -1) cleaned = cleaned.slice(commaIdx + 1).trimStart();
|
|
22
|
+
return cleaned;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function inferType(label, el) {
|
|
26
|
+
var raw = String(label || '').toLowerCase();
|
|
27
|
+
var id = String(el.getAttribute('data-list-item-id') || '').toLowerCase();
|
|
28
|
+
if (raw.indexOf('voice') !== -1 || id.indexOf('voice') !== -1) return 'Voice';
|
|
29
|
+
if (raw.indexOf('forum') !== -1 || id.indexOf('forum') !== -1) return 'Forum';
|
|
30
|
+
if (raw.indexOf('announcement') !== -1 || raw.indexOf('news') !== -1 || id.indexOf('announcement') !== -1) return 'Announcement';
|
|
31
|
+
if (raw.indexOf('stage') !== -1 || id.indexOf('stage') !== -1) return 'Stage';
|
|
32
|
+
return 'Text';
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function channelName(label, el) {
|
|
36
|
+
var cleaned = cleanChannelLabel(label);
|
|
37
|
+
var m = cleaned.match(/^(.+?)\\s*[((](.+?)[))]\\s*$/);
|
|
38
|
+
if (m) return m[1].trim();
|
|
39
|
+
var ariaName = el.getAttribute('aria-label') || '';
|
|
40
|
+
if (ariaName && ariaName !== label) return cleanChannelLabel(ariaName).replace(/\\s*[((].*?[))]\\s*$/, '').trim();
|
|
41
|
+
var text = (el.textContent || '').replace(/\\s+/g, ' ').trim();
|
|
42
|
+
return text.replace(/\\s*[((].*?[))]\\s*$/, '').trim();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
var links = Array.from(document.querySelectorAll('a[href*="/channels/"]'));
|
|
46
|
+
var seen = new Set();
|
|
47
|
+
var rows = [];
|
|
48
|
+
links.forEach(function(el) {
|
|
49
|
+
var href = el.getAttribute('href') || '';
|
|
50
|
+
var route = parseRoute(href);
|
|
51
|
+
if (!route || route.thread_id || !route.channel_id || route.channel_id === '@me') return;
|
|
52
|
+
var key = route.guild_id + '/' + route.channel_id;
|
|
53
|
+
if (seen.has(key)) return;
|
|
54
|
+
|
|
55
|
+
var label = el.getAttribute('aria-label') || el.getAttribute('title') || '';
|
|
56
|
+
var cleaned = cleanChannelLabel(label);
|
|
57
|
+
if (/[((]\\s*category\\s*[))]/i.test(cleaned)) return;
|
|
58
|
+
|
|
59
|
+
var name = channelName(cleaned, el);
|
|
60
|
+
if (!name) return;
|
|
61
|
+
|
|
62
|
+
var type = inferType(cleaned, el);
|
|
63
|
+
rows.push({
|
|
64
|
+
Index: rows.length + 1,
|
|
65
|
+
Channel: name,
|
|
66
|
+
Type: type,
|
|
67
|
+
guild_id: route.guild_id,
|
|
68
|
+
channel_id: route.channel_id,
|
|
69
|
+
url: absUrl('/channels/' + route.guild_id + '/' + route.channel_id)
|
|
70
|
+
});
|
|
71
|
+
seen.add(key);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
return rows;
|
|
75
|
+
})()
|
|
76
|
+
`}export function buildListServersScript(){return`
|
|
77
|
+
(function __opencliDiscordListServers() {
|
|
78
|
+
function parseGuildId(raw) {
|
|
79
|
+
try {
|
|
80
|
+
var url = new URL(raw, 'https://discord.com');
|
|
81
|
+
var parts = url.pathname.split('/').filter(Boolean);
|
|
82
|
+
if (parts[0] !== 'channels' || parts.length !== 2 || !parts[1] || parts[1] === '@me') return '';
|
|
83
|
+
return parts[1];
|
|
84
|
+
} catch (_) {
|
|
85
|
+
return '';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
var rows = [];
|
|
90
|
+
var seen = new Set();
|
|
91
|
+
var items = Array.from(document.querySelectorAll('a[href^="/channels/"], [data-list-item-id*="guildsnav___"], [class*="listItem_"]'));
|
|
92
|
+
items.forEach(function(item) {
|
|
93
|
+
var link = item.matches && item.matches('a[href^="/channels/"]') ? item : item.querySelector && item.querySelector('a[href^="/channels/"]');
|
|
94
|
+
var href = link ? link.getAttribute('href') || '' : '';
|
|
95
|
+
var guildId = parseGuildId(href);
|
|
96
|
+
if (!guildId || seen.has(guildId)) return;
|
|
97
|
+
|
|
98
|
+
var named = item.querySelector && item.querySelector('[data-dnd-name]');
|
|
99
|
+
var name = named ? named.getAttribute('data-dnd-name') : '';
|
|
100
|
+
if (!name) name = item.getAttribute && item.getAttribute('aria-label') || '';
|
|
101
|
+
if (!name && link) name = link.getAttribute('aria-label') || link.getAttribute('title') || '';
|
|
102
|
+
name = String(name || '').replace(/\\s+/g, ' ').trim();
|
|
103
|
+
if (!name || /^direct messages$/i.test(name)) return;
|
|
104
|
+
|
|
105
|
+
rows.push({
|
|
106
|
+
Index: rows.length + 1,
|
|
107
|
+
Server: name.slice(0, 80),
|
|
108
|
+
guild_id: guildId,
|
|
109
|
+
url: 'https://discord.com/channels/' + guildId
|
|
110
|
+
});
|
|
111
|
+
seen.add(guildId);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
return rows;
|
|
115
|
+
})()
|
|
116
|
+
`}export function buildReadMessagesScript(e){return`
|
|
117
|
+
(function __opencliDiscordReadMessages(limit) {
|
|
118
|
+
function textOf(el) { return el ? String(el.textContent || '').replace(/\\s+/g, ' ').trim() : ''; }
|
|
119
|
+
function routeOfMessage(node) {
|
|
120
|
+
var id = node && node.getAttribute ? node.getAttribute('id') || '' : '';
|
|
121
|
+
var match = id.match(/^chat-messages-(\\d+)-(\\d+)/);
|
|
122
|
+
return match ? { channel_id: match[1], message_id: match[2] } : {};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
var results = [];
|
|
126
|
+
var nodes = Array.from(document.querySelectorAll('[id^="chat-messages-"], [class*="messageListItem"]'));
|
|
127
|
+
var seen = new Set();
|
|
128
|
+
|
|
129
|
+
nodes.forEach(function(node) {
|
|
130
|
+
var route = routeOfMessage(node);
|
|
131
|
+
var contentEl = node.querySelector('[id^="message-content-"], [class*="messageContent"]');
|
|
132
|
+
if (!contentEl) return;
|
|
133
|
+
|
|
134
|
+
var key = route.message_id || textOf(contentEl);
|
|
135
|
+
if (!key || seen.has(key)) return;
|
|
136
|
+
seen.add(key);
|
|
137
|
+
|
|
138
|
+
var authorEl = node.querySelector('[class*="username"], [class*="headerText"] span, h3 span');
|
|
139
|
+
var timeEl = node.querySelector('time');
|
|
140
|
+
results.push({
|
|
141
|
+
Author: textOf(authorEl) || '—',
|
|
142
|
+
Time: timeEl ? (timeEl.getAttribute('datetime') || textOf(timeEl)) : '',
|
|
143
|
+
Message: textOf(contentEl).slice(0, 300),
|
|
144
|
+
...(route.channel_id ? { channel_id: route.channel_id } : {}),
|
|
145
|
+
...(route.message_id ? { message_id: route.message_id } : {})
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
return results.slice(-limit);
|
|
150
|
+
})(${Math.max(1,parseInt(String(e),10)||20)})
|
|
151
|
+
`}export function buildListThreadsScript(e){return`
|
|
152
|
+
(function __opencliDiscordListThreads(limit) {
|
|
153
|
+
function parseRoute(raw) {
|
|
154
|
+
try {
|
|
155
|
+
var url = new URL(raw, 'https://discord.com');
|
|
156
|
+
var parts = url.pathname.split('/').filter(Boolean);
|
|
157
|
+
if (parts[0] !== 'channels' || parts.length < 4) return null;
|
|
158
|
+
return { guild_id: parts[1], channel_id: parts[2], thread_id: parts[3], url: 'https://discord.com/channels/' + parts[1] + '/' + parts[2] + '/' + parts[3] };
|
|
159
|
+
} catch (_) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function clean(text) {
|
|
165
|
+
return String(text || '').replace(/\\s+/g, ' ').trim();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function firstUsefulLine(text) {
|
|
169
|
+
var lines = String(text || '').split(/\\n+/).map(clean).filter(Boolean);
|
|
170
|
+
return lines.find(function(line) {
|
|
171
|
+
return !/^(new|unread|locked|pinned|thread|post)$/i.test(line);
|
|
172
|
+
}) || '';
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
var rows = [];
|
|
176
|
+
var seen = new Set();
|
|
177
|
+
var links = Array.from(document.querySelectorAll('a[href*="/channels/"]'));
|
|
178
|
+
links.forEach(function(link) {
|
|
179
|
+
if (link.closest('[id^="chat-messages-"], [class*="messageListItem"]')) return;
|
|
180
|
+
var route = parseRoute(link.getAttribute('href') || '');
|
|
181
|
+
if (!route || seen.has(route.thread_id)) return;
|
|
182
|
+
var card = link.closest('[role="listitem"], li, article, [class*="container_"], [class*="card_"], [class*="mainCard_"]') || link;
|
|
183
|
+
var label = clean(link.getAttribute('aria-label') || link.getAttribute('title') || '');
|
|
184
|
+
var titleEl = card.querySelector('[class*="title"], [class*="name"], h3, h2, strong');
|
|
185
|
+
var title = clean(titleEl && titleEl.textContent) || label || firstUsefulLine(card.textContent);
|
|
186
|
+
if (!title) return;
|
|
187
|
+
var authorEl = card.querySelector('[class*="username"], [class*="author"], [class*="user"]');
|
|
188
|
+
var timeEl = card.querySelector('time');
|
|
189
|
+
rows.push({
|
|
190
|
+
Index: rows.length + 1,
|
|
191
|
+
Thread: title.slice(0, 140),
|
|
192
|
+
Author: clean(authorEl && authorEl.textContent),
|
|
193
|
+
Updated: timeEl ? (timeEl.getAttribute('datetime') || clean(timeEl.textContent)) : '',
|
|
194
|
+
Preview: firstUsefulLine(card.textContent).slice(0, 240),
|
|
195
|
+
guild_id: route.guild_id,
|
|
196
|
+
channel_id: route.channel_id,
|
|
197
|
+
thread_id: route.thread_id,
|
|
198
|
+
url: route.url
|
|
199
|
+
});
|
|
200
|
+
seen.add(route.thread_id);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
return rows.slice(0, limit);
|
|
204
|
+
})(${Math.max(1,parseInt(String(e),10)||30)})
|
|
205
|
+
`}export function buildRouteStateScript(){return`
|
|
206
|
+
(function __opencliDiscordRouteState() {
|
|
207
|
+
function parseRoute(raw) {
|
|
208
|
+
try {
|
|
209
|
+
var url = new URL(raw, 'https://discord.com');
|
|
210
|
+
var parts = url.pathname.split('/').filter(Boolean);
|
|
211
|
+
if (parts[0] !== 'channels' || parts.length < 3) return null;
|
|
212
|
+
return { guild_id: parts[1], channel_id: parts[2], thread_id: parts[3] || '' };
|
|
213
|
+
} catch (_) {
|
|
214
|
+
return null;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
url: window.location.href,
|
|
219
|
+
title: document.title,
|
|
220
|
+
route: parseRoute(window.location.href),
|
|
221
|
+
has_messages: !!document.querySelector('[id^="chat-messages-"], [class*="messageListItem"]'),
|
|
222
|
+
has_threads: !!document.querySelector('a[href*="/channels/"][href*="/"]'),
|
|
223
|
+
has_header: !!document.querySelector('[class*="title"], [aria-label*="Channel"], [aria-label*="频道"]')
|
|
224
|
+
};
|
|
225
|
+
})()
|
|
226
|
+
`}async function p(e){const t=f(await e.evaluate(buildRouteStateScript()),"Discord route state");if(t&&t.route)return t.route;const r=typeof t?.url==="string"?t.url:"";return parseDiscordChannelUrl(r)}export async function listDiscordChannels(e){return g(m(await e.evaluate(buildListChannelsScript()),"Discord channel list"),["Channel","guild_id","channel_id","url"],"Discord channel list")}export async function listDiscordServers(e){return g(m(await e.evaluate(buildListServersScript()),"Discord server list"),["Server","guild_id","url"],"Discord server list")}function x(e,t){if(!t)return!1;if(String(e.channel_id||"")===t)return!0;return normalizeDiscordName(e.Channel)===normalizeDiscordName(t)}function w(e,t){if(!t)return!0;return String(e.guild_id||"")===t||normalizeDiscordName(e.Server)===normalizeDiscordName(t)}export async function resolveDiscordChannelTarget(e,t={},r={}){const n=c(t.url);if(n){const s=parseDiscordChannelUrl(n);if(!s||s.thread_id)throw new o("--url must be a Discord channel URL like https://discord.com/channels/<guild_id>/<channel_id>.");return s}const i=c(t.guild),a=c(t.channel);if(!i&&!a){if(r.required)throw new o("Pass --url or --guild/--channel to choose a Discord channel.");return null}if(!a)throw new o("Pass --channel with --guild, or use --url.");let l=i;if(i&&!isDiscordSnowflake(i)&&i!=="@me"){const s=(await listDiscordServers(e)).find((v)=>w(v,i));if(s?.guild_id)l=String(s.guild_id)}if(l&&isDiscordSnowflake(l)&&isDiscordSnowflake(a))return{guild_id:l,channel_id:a,url:buildDiscordChannelUrl({guildId:l,channelId:a})};const h=(await listDiscordChannels(e)).find((s)=>w(s,l)&&x(s,a));if(h)return{guild_id:String(h.guild_id),channel_id:String(h.channel_id),url:String(h.url||buildDiscordChannelUrl({guildId:h.guild_id,channelId:h.channel_id}))};if(!l&&isDiscordSnowflake(a)){const s=await p(e);if(s?.guild_id)return{guild_id:s.guild_id,channel_id:a,url:buildDiscordChannelUrl({guildId:s.guild_id,channelId:a})}}throw new o(`Could not resolve Discord channel "${a}".`,'Use "opencli discord-app channels -f json" and retry with --url or numeric --guild/--channel ids.')}export async function waitForDiscordRoute(e,t,r={}){const n=r.timeoutMs??8000,i=r.intervalSeconds??0.5,a=Date.now();let l=null;while(Date.now()-a<=n){l=f(await e.evaluate(buildRouteStateScript()),"Discord route state");const d=l?.route;if(d&&String(d.guild_id)===String(t.guild_id)&&String(d.channel_id)===String(t.channel_id)){if(!t.thread_id||String(d.thread_id||"")===String(t.thread_id))return l}await e.wait(i)}throw new u("Discord did not finish navigating to the requested channel.",`Last observed URL: ${l?.url||"unknown"}`)}export async function waitForDiscordContent(e,t="messages",r={}){const n=r.timeoutMs??5000,i=r.intervalSeconds??0.5,a=Date.now();let l=null;while(Date.now()-a<=n){l=f(await e.evaluate(buildRouteStateScript()),"Discord route state");if(t==="messages"&&l?.has_messages)return l;if(t==="threads"&&l?.has_threads)return l;await e.wait(i)}return l}export async function navigateToDiscordTarget(e,t,r={}){await e.goto(t.url,{waitUntil:"none",settleMs:r.settleMs??1000});const n=await waitForDiscordRoute(e,t,r);if(r.waitForContent==="messages"||r.waitForContent==="threads")return waitForDiscordContent(e,r.waitForContent,{timeoutMs:r.contentTimeoutMs??5000,intervalSeconds:r.intervalSeconds??0.5});return n}export async function maybeNavigateToDiscordChannel(e,t={},r={}){if(!hasDiscordChannelTarget(t))return null;const n=await resolveDiscordChannelTarget(e,t,{required:!0});await navigateToDiscordTarget(e,n,r);return n}export async function readDiscordMessages(e,t){return m(await e.evaluate(buildReadMessagesScript(t)),"Discord message list")}export async function listDiscordThreads(e,t){return g(m(await e.evaluate(buildListThreadsScript(t)),"Discord thread list"),["Thread","guild_id","channel_id","thread_id","url"],"Discord thread list")}export function assertDiscordMessageRowsBelongToTarget(e,t,r="Discord read"){if(!t)return e;const n=String(t.thread_id||t.channel_id||"");if(!n)throw new u(`${r} target is missing a stable channel/thread id.`);for(const i of e){if(!i||typeof i!=="object"||Array.isArray(i))throw new u(`${r} returned malformed message rows.`);const a=i.channel_id==null||i.channel_id===""?"":String(i.channel_id);if(!a)throw new u(`${r} could not verify returned message target.`,`Expected channel/thread id ${n}, but the message row did not include channel_id.`);if(a&&a!==n)throw new u(`${r} returned messages from the wrong Discord target.`,`Expected channel/thread id ${n}, saw ${a}.`)}return e}export async function resolveDiscordThreadTarget(e,t={}){const r=c(t.url);if(r){const d=parseDiscordChannelUrl(r);if(!d||!d.thread_id)throw new o("--url must be a Discord thread/post URL like https://discord.com/channels/<guild_id>/<channel_id>/<thread_id>.");return d}const n=c(t.thread);if(!n)throw new o("Pass --thread <thread_id> or --url <thread_url>.");const i=parseDiscordChannelUrl(n);if(i?.thread_id)return i;const a=hasDiscordChannelTarget(t)?await resolveDiscordChannelTarget(e,t,{required:!0}):null;if(a)return{guild_id:a.guild_id,channel_id:a.channel_id,thread_id:n,url:buildDiscordChannelUrl({guildId:a.guild_id,channelId:a.channel_id,threadId:n})};const l=await p(e);if(l?.guild_id&&l?.channel_id)return{guild_id:l.guild_id,channel_id:l.channel_id,thread_id:n,url:buildDiscordChannelUrl({guildId:l.guild_id,channelId:l.channel_id,threadId:n})};throw new o(`Could not resolve Discord thread "${n}".`,"Open the parent forum/channel first, or pass --guild and --channel ids with --thread.")}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{AuthRequiredError as z}from"@jackwener/opencli/errors";import{registerSiteAuthCommands as H}from"../_shared/site-auth.js";const J="https://discord.com/channels/@me";async function K(b){return b.evaluate(`(() => {
|
|
2
|
+
if (/\\/login(\\b|\\/|\\?|$)/.test(location.pathname)) return null;
|
|
3
|
+
const panel = document.querySelector('[class*=panelTitleContainer]');
|
|
4
|
+
if (!panel) return null;
|
|
5
|
+
const display = (panel.textContent || '').trim();
|
|
6
|
+
const handleEl = document.querySelector('[class*=panelSubtextContainer] [class*=hovered]');
|
|
7
|
+
const handle = handleEl ? (handleEl.textContent || '').trim() : '';
|
|
8
|
+
if (!display && !handle) return null;
|
|
9
|
+
return { display_name: display, username: handle || display };
|
|
10
|
+
})()`)}async function B(b){await b.goto(J);for(let F=0;F<8;F++){const G=await K(b);if(G)return G;await b.wait(1)}const x=await b.evaluate("location.href");if(/\/login/.test(String(x||"")))throw new z("discord.com","Discord redirected to /login — not signed in");throw new z("discord.com","Discord account panel not found — not signed in or app failed to load")}H({site:"discord-web",domain:"discord.com",loginUrl:"https://discord.com/login",columns:["username","display_name"],quickCheckRequiresNavigation:!0,quickCheck:async(b)=>{try{return{logged_in:!0,...await B(b)}}catch(x){if(x instanceof z)return{logged_in:!1};throw x}},verify:B,poll:async(b)=>B(b)});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import{ArgumentError as K,AuthRequiredError as $,CommandExecutionError as P}from"@jackwener/opencli/errors";import{cli as q,Strategy as z}from"@jackwener/opencli/registry";const G=/^(?:@me|\d{3,})\/\d{3,}$/;export function normalizeChannelUrl(b){const f=String(b||"").trim();if(!f)throw new K("Channel is required.",'Pass a channel URL like https://discord.com/channels/<guild>/<channel>, or "<guild>/<channel>".');if(/^https?:\/\//i.test(f)){let J;try{J=new URL(f)}catch{throw new K(`Invalid channel URL: ${f}`)}const M=J.hostname.toLowerCase();if(M!=="discord.com"&&!M.endsWith(".discord.com"))throw new K("Channel URL must be a discord.com URL.");const F=J.pathname.split("/").filter(Boolean);if(F[0]!=="channels"||F.length<3)throw new K("Channel URL must look like /channels/<guild>/<channel>.");return`https://discord.com/channels/${F[1]}/${F[2]}`}if(!G.test(f))throw new K(`Invalid channel reference: ${JSON.stringify(f)}`,'Use "<guild>/<channel>" (numeric ids) or "@me/<dm-channel>", or a full channel URL.');return`https://discord.com/channels/${f}`}q({site:"discord-web",name:"send",access:"write",description:'Send a message to a Discord channel (discord.com). Pass the channel URL or "<guild>/<channel>". Multi-line text is sent as one message.',domain:"discord.com",strategy:z.COOKIE,browser:!0,args:[{name:"channel",type:"string",required:!0,positional:!0,help:'Channel URL (https://discord.com/channels/<guild>/<channel>) or "<guild>/<channel>"'},{name:"text",type:"string",required:!0,positional:!0,help:"Message text (multi-line allowed)"}],columns:["status","channel_id","message"],func:async(b,f)=>{if(!b)throw new P("Browser session required");const J=normalizeChannelUrl(f.channel),M=J.split("/").pop(),F=String(f.text??"");if(!F.trim())throw new K("Message text cannot be empty.");await b.goto(J);let W=!1;for(let B=0;B<12;B++){const Z=await b.evaluate(`(() => {
|
|
2
|
+
if (/\\/login(\\b|\\/|\\?|$)/.test(location.pathname)) return 'login';
|
|
3
|
+
const ed = document.querySelector('[role="textbox"][data-slate-editor="true"]');
|
|
4
|
+
if (!ed) return 'no-editor';
|
|
5
|
+
return 'ready';
|
|
6
|
+
})()`);if(Z==="login")throw new $("discord.com","Discord redirected to /login — not signed in");if(Z==="ready"){W=!0;break}await b.wait(1)}if(!W)throw new P("Discord message box not found — the channel may not exist, or you lack access to it.");const X='[role="textbox"][data-slate-editor="true"]';await b.click(X);await b.pressKey("Control+A");await b.pressKey("Delete");const Q=F.split(`
|
|
7
|
+
`);for(let B=0;B<Q.length;B++){if(B>0)await b.pressKey("Shift+Enter");if(Q[B].length)await b.typeText(X,Q[B])}if(await b.evaluate(`(() => !!document.querySelector('[class*="autocomplete"]'))()`))await b.pressKey("Escape");const V=await b.evaluate(`(() => {
|
|
8
|
+
const ed = document.querySelector('[role="textbox"][data-slate-editor="true"]');
|
|
9
|
+
return ed ? (ed.textContent || '').replace(/\\uFEFF/g, '') : null;
|
|
10
|
+
})()`),Y=(B)=>String(B||"").replace(/\s+/g," ").trim();if(V===null||Y(V)!==Y(F))throw new P(`Composed text did not match before send (got ${JSON.stringify((V||"").slice(0,60))}).`);await b.pressKey("Enter");await b.wait(1);if((await b.evaluate(`(() => {
|
|
11
|
+
const ed = document.querySelector('[role="textbox"][data-slate-editor="true"]');
|
|
12
|
+
return ed ? (ed.textContent || '').replace(/\\uFEFF/g, '') : '';
|
|
13
|
+
})()`)).trim().length>0)throw new P("Message still in the box after Enter — send blocked (slow-mode, rate limit, or no permission to post here).");return[{status:"success",channel_id:M,message:"Message sent"}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as P,Strategy as Q}from"@jackwener/opencli/registry";import{HUB_BASE as R,hubFetch as V,parseImage as W}from"./utils.js";function J(C){const z=String(C??"").trim();if(!z)return null;const x=z.replace(/\.\d+/,"");return x.endsWith("Z")?x:`${x}Z`}P({site:"dockerhub",name:"image",access:"read",description:"Fetch a Docker Hub repository's public metadata (stars, pulls, last updated, status)",domain:"hub.docker.com",strategy:Q.PUBLIC,browser:!1,args:[{name:"image",positional:!0,required:!0,help:'Image name (e.g. "nginx", "library/nginx", "bitnami/redis")'}],columns:["image","official","stars","pulls","description","lastUpdated","lastModified","registered","status","url"],func:async(C)=>{const{owner:z,name:x}=W(C.image),N=`${R}/repositories/${z}/${x}/`,q=await V(N,"dockerhub image"),G=String(q?.namespace??z).trim(),K=G==="library"||G==="_",L=K?`library/${x}`:`${G}/${x}`;return[{image:L,official:K,stars:q?.star_count!=null?Number(q.star_count):null,pulls:q?.pull_count!=null?Number(q.pull_count):null,description:String(q?.description??"").trim(),lastUpdated:J(q?.last_updated),lastModified:J(q?.last_modified),registered:J(q?.date_registered),status:String(q?.status_description??"").trim(),url:`https://hub.docker.com/r/${L}`}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as p,Strategy as m}from"@jackwener/opencli/registry";import{EmptyResultError as h}from"@jackwener/opencli/errors";import{HUB_BASE as d,hubFetch as b,requireBoundedInt as f,requireString as y}from"./utils.js";p({site:"dockerhub",name:"search",access:"read",description:"Search Docker Hub repositories by keyword",domain:"hub.docker.com",strategy:m.PUBLIC,browser:!1,args:[{name:"query",positional:!0,required:!0,help:'Search keyword (e.g. "nginx", "bitnami redis")'},{name:"limit",type:"int",default:25,help:"Max repositories (1-100, single Docker Hub page)"}],columns:["rank","image","official","stars","pulls","description","url"],func:async(t)=>{const i=y(t.query,"query"),s=f(t.limit,25,100),a=`${d}/search/repositories/?query=${encodeURIComponent(i)}&page_size=${s}`,n=await b(a,"dockerhub search"),c=Array.isArray(n?.results)?n.results:[];if(!c.length)throw new h("dockerhub search",`No Docker Hub repositories matched "${i}".`);return c.slice(0,s).map((e,l)=>{const u=String(e.repo_owner??"").trim(),r=String(e.repo_name??"").trim(),o=u?`${u}/${r}`:e.is_official?`library/${r}`:r;return{rank:l+1,image:o,official:Boolean(e.is_official),stars:e.star_count!=null?Number(e.star_count):null,pulls:e.pull_count!=null?Number(e.pull_count):null,description:String(e.short_description??"").trim(),url:o?`https://hub.docker.com/r/${o}`:""}})}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ArgumentError as K,CommandExecutionError as N,EmptyResultError as P}from"@jackwener/opencli/errors";export const HUB_BASE="https://hub.docker.com/v2";const Q="opencli-dockerhub-adapter (+https://github.com/jackwener/opencli)",O=/^[a-z0-9][a-z0-9._-]*$/;export function requireString(I,F){const q=String(I??"").trim();if(!q)throw new K(`dockerhub ${F} cannot be empty`);return q}export function requireBoundedInt(I,F,q,J="limit"){const z=I??F,M=typeof z==="number"?z:Number(z);if(!Number.isInteger(M)||M<=0)throw new K(`dockerhub ${J} must be a positive integer`);if(M>q)throw new K(`dockerhub ${J} must be <= ${q}`);return M}export function parseImage(I){const F=String(I??"").trim().toLowerCase();if(!F)throw new K('dockerhub image name is required (e.g. "nginx", "library/nginx", "bitnami/redis")');const q=F.indexOf("/");let J,z;if(q>=0){J=F.slice(0,q);z=F.slice(q+1)}else{J="library";z=F}if(!O.test(J)||!O.test(z))throw new K(`dockerhub image "${I}" is not a valid repository slug`,'Use lowercase letters / digits / "._-", optionally prefixed with "<owner>/".');if(z.length<2||z.length>255)throw new K(`dockerhub image "${I}" name must be 2-255 chars`);return{owner:J,name:z}}export async function hubFetch(I,F){let q;try{q=await fetch(I,{headers:{"user-agent":Q,accept:"application/json"}})}catch(z){throw new N(`${F} request failed: ${z?.message??z}`,"Check that hub.docker.com is reachable from this network.")}if(q.status===404)throw new P(F,`Docker Hub returned 404 for ${I}.`);if(q.status===429)throw new N(`${F} returned HTTP 429 (rate limited)`,"Docker Hub throttles anonymous traffic; wait a few seconds and retry.");if(!q.ok)throw new N(`${F} returned HTTP ${q.status}`);let J;try{J=await q.json()}catch(z){throw new N(`${F} returned malformed JSON: ${z?.message??z}`)}return J}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"data": [
|
|
3
|
+
{
|
|
4
|
+
"id": "26_dcd_car_series_v2:5273",
|
|
5
|
+
"series_id": 5273,
|
|
6
|
+
"cell_type": 26,
|
|
7
|
+
"koubei": {
|
|
8
|
+
"url": "",
|
|
9
|
+
"tag_list": null
|
|
10
|
+
},
|
|
11
|
+
"display": {
|
|
12
|
+
"title": "宝马X5",
|
|
13
|
+
"series_name": "宝马X5",
|
|
14
|
+
"sub_brand_name": "华晨宝马",
|
|
15
|
+
"agent_price": "51.00-68.00万",
|
|
16
|
+
"official_price": "59.80-74.80万",
|
|
17
|
+
"cover_url": "https://p3-dcd.byteimg.com/img/tos-cn-i-dcdx/bf84f7f297c74b4ab69467bef101e7e1~1080x0.png?psm=motor.search.block",
|
|
18
|
+
"picture_num": 11355,
|
|
19
|
+
"dealer_text": "询最低价"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "200_:7566598885808833062",
|
|
24
|
+
"series_id": null,
|
|
25
|
+
"cell_type": 200,
|
|
26
|
+
"koubei": null,
|
|
27
|
+
"display": {}
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "200_:7601400898518090302",
|
|
31
|
+
"series_id": null,
|
|
32
|
+
"cell_type": 200,
|
|
33
|
+
"koubei": null,
|
|
34
|
+
"display": {}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "200_:7595987626075849241",
|
|
38
|
+
"series_id": null,
|
|
39
|
+
"cell_type": 200,
|
|
40
|
+
"koubei": null,
|
|
41
|
+
"display": {}
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"id": "200_:7621424306387747352",
|
|
45
|
+
"series_id": null,
|
|
46
|
+
"cell_type": 200,
|
|
47
|
+
"koubei": null,
|
|
48
|
+
"display": {}
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "200_:7601471677582803518",
|
|
52
|
+
"series_id": null,
|
|
53
|
+
"cell_type": 200,
|
|
54
|
+
"koubei": null,
|
|
55
|
+
"display": {}
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"has_more": 1,
|
|
59
|
+
"return_count": 37
|
|
60
|
+
}
|