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{registerArticleLogin as k}from"../_shared/article/login.js";import{csdnProfile as b}from"./article.js";k({site:"csdn",domain:"csdn.net",profile:{home:b.home,originRe:b.originRe,checkAuth:b.checkAuth},loginUrl:"https://passport.csdn.net/login",loginDescription:"打开 CSDN 登录页并等待浏览器完成登录(供桌面客户端引导登录)。"});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import{cli as $,Strategy as K}from"@jackwener/opencli/registry";import{EmptyResultError as O}from"@jackwener/opencli/errors";const P="https://mp.csdn.net/mp_blog/manage/article",U=20,b=`
|
|
2
|
+
() => {
|
|
3
|
+
const dateRe = /^\\d{4}-\\d{2}-\\d{2}(\\s|$)/;
|
|
4
|
+
return Array.from(document.querySelectorAll('.article-list-item-mp')).map((row) => {
|
|
5
|
+
const link = row.querySelector('.list-item-title a');
|
|
6
|
+
const titleEl = row.querySelector('.list-item-title');
|
|
7
|
+
const title = (link?.textContent || titleEl?.innerText || '').trim();
|
|
8
|
+
const editUrl = link?.href || '';
|
|
9
|
+
const viewUrl = Array.from(row.querySelectorAll('a'))
|
|
10
|
+
.map((a) => a.href)
|
|
11
|
+
.find((h) => h && h.includes('article/details')) || '';
|
|
12
|
+
const idMatch = editUrl.match(/articleId=(\\d+)/) || viewUrl.match(/details\\/(\\d+)/);
|
|
13
|
+
const id = idMatch ? idMatch[1] : '';
|
|
14
|
+
// 徽章块 innerText 混着日期行,按行拆开滤掉日期与空行
|
|
15
|
+
const badges = Array.from(row.querySelectorAll('.article-list-type'))
|
|
16
|
+
.flatMap((b) => (b.innerText || '').split('\\n'))
|
|
17
|
+
.map((s) => s.trim())
|
|
18
|
+
.filter((s) => s && !dateRe.test(s));
|
|
19
|
+
const publishedAt = (row.querySelector('.article-list-item-time')?.innerText || '').trim();
|
|
20
|
+
// 指标列顺序与表头一致:阅读 / 点赞 / 评论 / 收藏
|
|
21
|
+
const nums = Array.from(row.querySelectorAll('.item-info-left p'))
|
|
22
|
+
.map((p) => parseInt((p.innerText || '').trim().replace(/,/g, ''), 10));
|
|
23
|
+
const opers = Array.from(row.querySelectorAll('.item-info-oper a'))
|
|
24
|
+
.map((a) => (a.textContent || '').trim());
|
|
25
|
+
const status = opers.includes('彻底删除') ? '回收站' : '已发布';
|
|
26
|
+
return {
|
|
27
|
+
id,
|
|
28
|
+
title,
|
|
29
|
+
url: viewUrl,
|
|
30
|
+
edit_url: editUrl,
|
|
31
|
+
published_at: publishedAt,
|
|
32
|
+
views: Number.isFinite(nums[0]) ? nums[0] : '',
|
|
33
|
+
likes: Number.isFinite(nums[1]) ? nums[1] : '',
|
|
34
|
+
comments: Number.isFinite(nums[2]) ? nums[2] : '',
|
|
35
|
+
collects: Number.isFinite(nums[3]) ? nums[3] : '',
|
|
36
|
+
status,
|
|
37
|
+
badges: badges.join(','),
|
|
38
|
+
};
|
|
39
|
+
}).filter((r) => r.title);
|
|
40
|
+
}
|
|
41
|
+
`,h=`
|
|
42
|
+
async () => {
|
|
43
|
+
for (let i = 0; i < 40; i++) {
|
|
44
|
+
if (document.querySelector('.article-list-item-mp')) break;
|
|
45
|
+
if (/passport\\.csdn\\.net/.test(location.href)) break;
|
|
46
|
+
const t = document.body?.innerText || '';
|
|
47
|
+
if (t.includes('暂无数据') || t.includes('暂无文章')) break;
|
|
48
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
href: location.href,
|
|
52
|
+
hasRows: !!document.querySelector('.article-list-item-mp'),
|
|
53
|
+
bodyHint: (document.body?.innerText || '').slice(0, 200),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
`,j=`
|
|
57
|
+
() => {
|
|
58
|
+
const next = document.querySelector('[class*=pagination] .btn-next, [class*=pagination] button.next, .el_mcm-pagination .btn-next');
|
|
59
|
+
if (next && !next.disabled && !next.classList.contains('is-disabled')) {
|
|
60
|
+
next.click();
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
const byText = Array.from(document.querySelectorAll('[class*=pagination] button, [class*=pagination] li'))
|
|
64
|
+
.find((el) => (el.textContent || '').trim() === '下一页');
|
|
65
|
+
if (byText && !byText.disabled && !byText.classList.contains('is-disabled') && !byText.classList.contains('disabled')) {
|
|
66
|
+
byText.click();
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
`;function D(q){if(q&&typeof q==="object"&&!Array.isArray(q)&&"session"in q&&"data"in q)return q.data;return q}$({site:"csdn",name:"stats",access:"read",description:"CSDN 文章数据(每篇阅读/点赞/评论/收藏等全量运营指标)",domain:"mp.csdn.net",strategy:K.COOKIE,browser:!0,args:[{name:"limit",type:"number",default:20,help:"返回条数"}],columns:["id","type","title","url","published_at","views","likes","comments","collects","shares","status","badges","edit_url"],func:async(q,Z)=>{const B=Number(Z.limit)||20;await q.goto(P);const x=D(await q.evaluate(h));if(x&&/passport\.csdn\.net/.test(String(x.href||"")))throw Error("未登录 CSDN:页面被重定向到登录页。请先在 Chrome 中登录 mp.csdn.net(可用 opencli csdn login)。");const F=new Set,v=[];for(let f=1;f<=U&&v.length<B;f++){const H=D(await q.evaluate(b));let Q=0;for(const z of Array.isArray(H)?H:[]){const Y=z.id||`${z.title}@@${z.published_at}`;if(F.has(Y))continue;F.add(Y);v.push(z);Q++}if(v.length>=B)break;const V=D(await q.evaluate(j));if(!V)break;await q.wait(2);if(Q===0&&!V)break}if(v.length===0){if(String(x?.bodyHint||"").includes("登录")||!x?.hasRows)throw Error("未能读取 CSDN 文章列表:可能未登录或页面未加载出内容。请确认已在 Chrome 中登录 mp.csdn.net 后重试。");throw new O("csdn stats","内容管理页没有任何文章。")}return v.slice(0,B).map((f)=>({id:f.id,type:"文章",title:f.title,url:f.url,published_at:f.published_at,views:f.views,likes:f.likes,comments:f.comments,collects:f.collects,shares:"",status:f.status,badges:f.badges,edit_url:f.edit_url}))}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as v,Strategy as x}from"@jackwener/opencli/registry";import{checkLogin as z,cookieQuickCheck as A}from"../_shared/article/auth.js";import{csdnProfile as m}from"./article.js";const B={home:m.home,originRe:m.originRe,checkAuth:m.checkAuth};v({site:"csdn",name:"whoami",access:"read",description:"查看当前登录的 CSDN 账号信息",domain:"editor.csdn.net",strategy:x.COOKIE,browser:!0,args:[],columns:["logged_in","user_id","username"],authStatus:{quickCheck:A("https://www.csdn.net",["UserToken"])},func:async(q)=>{const b=await z(q,B);return[{logged_in:b.isAuthenticated,user_id:b.userId||"",username:b.username||""}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CliError as Y,CommandExecutionError as L}from"@jackwener/opencli/errors";import{cli as P,Strategy as S}from"@jackwener/opencli/registry";import{publishArticle as _}from"../_shared/article/publish.js";export const cto51Profile={home:"https://blog.51cto.com/blogger/publish",outputFormat:"markdown",checkAuth:async(X)=>{try{const G=await(await fetch("https://blog.51cto.com/blogger/publish",{credentials:"include"})).text(),K=G.match(/<li class="more user">\s*<a[^>]*href="([^"]+)"[^>]*>\s*<img[^>]*src="([^"]+)"/);if(!K)return{isAuthenticated:!1,error:"未登录或解析页面失败"};const q=K[1],V=K[2],z=q.split("/").filter(Boolean).pop()||"",Q=G.match(/<meta\s+name="csrf-token"\s+content="([^"]+)"/),U=Q?Q[1]:"";return{isAuthenticated:!0,userId:z,username:z,avatar:V,_csrf:U}}catch(B){return{isAuthenticated:!1,error:String(B&&B.message||B)}}},image:{uploadFn:async(X,B)=>{const G=await fetch(X,{credentials:"omit"});if(!G.ok)throw Error("下载图片失败: "+G.status);const K=await G.blob(),q=K.type||"image/jpeg",V=q.split("/")[1]||"jpeg",z=String(Date.now())+"."+V,U=await(await fetch("https://blog.51cto.com/getUploadSign",{method:"POST",credentials:"include",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8","X-Requested-With":"XMLHttpRequest"},body:"upload_type=image"})).json();if(U.code!==0)throw Error(U.msg||"获取上传签名失败");const Z=U.data,v=await(await fetch("https://blog.51cto.com/getUploadConfig",{method:"POST",credentials:"include",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8","X-Requested-With":"XMLHttpRequest"},body:new URLSearchParams({upload_type:"image",upload_sign:Z.sign,ext:q,name:z}).toString()})).json();if(v.code!==0)throw Error(v.msg||"获取上传配置失败");const A=v.data,W=A.fields,H=new FormData;H.append("key",W.key);H.append("policy",W.policy);H.append("x-amz-algorithm",W["x-amz-algorithm"]);H.append("x-amz-signature",W["x-amz-signature"]);H.append("x-amz-credential",W["x-amz-credential"]);H.append("X-Amz-Date",W["X-Amz-Date"]);H.append("Content-Type",q);H.append("file",K,z);const F=await fetch(A.url,{method:"POST",body:H});if(!F.ok)throw Error("上传到 COS 失败: "+F.status);return{url:"https://s2.51cto.com/"+W.key}},skip:["s2.51cto.com","51cto.com"]},publish:async(X,B)=>{let G="";try{const $=(await(await fetch("https://blog.51cto.com/blogger/publish",{credentials:"include"})).text()).match(/<meta\s+name="csrf-token"\s+content="([^"]+)"/);if($)G=$[1]}catch(U){}const K=new URLSearchParams({title:X.title,content:X.content,pid:"",cate_id:"",custom_id:"0",tag:"",abstract:"",banner_type:"0",blog_type:"1",copy_code:"1",is_hide:"0",top_time:"0",is_comment:"0",is_old:"0",blog_id:"",did:"",work_id:"",class_id:"",subjectId:"",import_type:"-1",invite_code:"",raffle:"",orig:"",_csrf:G}),q=await fetch("https://blog.51cto.com/blogger/draft",{method:"POST",credentials:"include",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8","X-Requested-With":"XMLHttpRequest",Accept:"application/json, text/javascript, */*; q=0.01"},body:K.toString()}),V=await q.text();let z=null;try{z=JSON.parse(V)}catch(U){}if(!q.ok||!z||z.status!==1||!z.data)return{ok:!1,stage:"publish",status:q.status,message:z&&z.msg||V.slice(0,300)};const Q=String(z.data.did);return{ok:!0,id:Q,url:"https://blog.51cto.com/blogger/draft/"+Q,draft:!0}}};P({site:"cto51",name:"article",access:"write",description:"发布 51CTO 博客文章(草稿)。正文默认为 Markdown;图片自动转存到 51CTO 图床(腾讯云 COS)。",domain:"blog.51cto.com",strategy:S.COOKIE,browser:!0,args:[{name:"title",positional:!0,required:!0,help:"文章标题"},{name:"text",positional:!0,help:"文章正文(默认 Markdown;传 --html 则视为 HTML)"},{name:"file",help:"正文文件路径(UTF-8,默认 Markdown)"},{name:"html",type:"boolean",help:"将正文视为 HTML 而非 Markdown"},{name:"draft",type:"boolean",help:"(保留参数,51CTO 只支持保存草稿)"},{name:"execute",type:"boolean",help:"真正执行创建/发布。没有此参数时命令拒绝写操作。"}],columns:["status","outcome","message","target_type","target","created_target","created_url"],func:async(X,B)=>{if(!X)throw new L("51CTO 文章发布需要浏览器会话");if(!B.execute)throw new Y("INVALID_INPUT","该 51CTO 写操作需要 --execute 参数确认");const G=String(B.title??"").trim();if(!G)throw new Y("INVALID_INPUT","文章标题不能为空");const K=typeof B.text==="string"?B.text:void 0,q=typeof B.file==="string"?B.file:void 0;if(K&&q)throw new Y("INVALID_INPUT","正文与 --file 不能同时使用");let V=K??"";if(q){const{readFile:v,stat:A}=await import("node:fs/promises");let W;try{W=await A(q)}catch{throw new Y("INVALID_INPUT","文件不存在: "+q)}if(!W.isFile())throw new Y("INVALID_INPUT","必须是可读文本文件: "+q);let H;try{H=await v(q)}catch{throw new Y("INVALID_INPUT","无法读取文件: "+q)}try{V=new TextDecoder("utf-8",{fatal:!0}).decode(H)}catch{throw new Y("INVALID_INPUT","文件不是有效 UTF-8 编码: "+q)}}if(!V.trim())throw new Y("INVALID_INPUT","正文内容不能为空");const z=!0,Q=await _(X,{title:G,body:V,format:B.html?"html":"markdown",draftOnly:z,profile:cto51Profile}),U=Q.images.uploaded.length|0,Z=Q.images.failed.length|0;let $="已保存 51CTO 草稿";if(U||Z)$+=`(图片:${U} 张已转存${Z?`,${Z} 张失败`:""})`;return[{status:"success",outcome:"draft",message:$,target_type:"article",target:"",created_target:"article:"+Q.id,created_url:Q.url}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as x,Strategy as z}from"@jackwener/opencli/registry";import{checkLogin as B}from"../_shared/article/auth.js";import{cto51Profile as q}from"./article.js";const C={home:q.home,checkAuth:q.checkAuth};x({site:"cto51",name:"whoami",access:"read",description:"查看当前 51CTO 登录账号信息。",domain:"blog.51cto.com",strategy:z.COOKIE,browser:!0,columns:["logged_in","user_id","username"],func:async(v)=>{const b=await B(v,C);return[{logged_in:b.isAuthenticated,user_id:b.userId||"",username:b.username||""}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AuthRequiredError as n,CommandExecutionError as f}from"@jackwener/opencli/errors";import{registerSiteAuthCommands as w}from"../_shared/site-auth.js";async function a(i){const o=(await i.getCookies({url:"https://www.ctrip.com"})).find((t)=>t.name==="login_uid");return Boolean(o&&o.value)}async function p(i){if(!await a(i))throw new n("ctrip.com","Ctrip login_uid cookie missing — anonymous");await i.goto("https://my.ctrip.com/myinfo/MyInfoIndex.aspx");await i.wait(2);const c=await i.getCookies({url:"https://www.ctrip.com"}),o=Object.fromEntries(c.map((m)=>[m.name,m.value])),t=o.login_uid||"";if(!t)throw new n("ctrip.com","Ctrip login_uid cookie absent after navigation");const u=o.AHeadUserInfo||"",s=new URLSearchParams(u),r=s.get("UserName")||"";let e="";if(r)try{e=decodeURIComponent(r)}catch{e=r}const d=s.get("VipGrade")||"";return{user_id:t,name:e,vip_grade:d}}w({site:"ctrip",domain:"ctrip.com",loginUrl:"https://passport.ctrip.com/user/login",columns:["user_id","name","vip_grade"],quickCheck:a,verify:p,poll:async(i)=>{if(!await a(i))throw new n("ctrip.com","Waiting for Ctrip login_uid cookie");return p(i)}});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import{ArgumentError as q,AuthRequiredError as x,CommandExecutionError as Q,EmptyResultError as y}from"@jackwener/opencli/errors";import{cli as U,Strategy as S}from"@jackwener/opencli/registry";import{buildFlightExtractJs as h,buildScrollUntilJs as F,parseIataCode as j,parseIsoDate as R}from"./utils.js";const V=1,Y=50,D=20;function J(K){if(K===void 0||K===null||K==="")return D;const B=Number(K);if(!Number.isFinite(B)||!Number.isInteger(B))throw new q(`--limit must be an integer between ${V} and ${Y}, got ${JSON.stringify(K)}`);if(B<V||B>Y)throw new q(`--limit must be between ${V} and ${Y}, got ${B}`);return B}const N=`
|
|
2
|
+
new Promise((resolve) => {
|
|
3
|
+
const detect = () => {
|
|
4
|
+
if (location.pathname.includes('captcha') || /验证码|verify the human/i.test(document.body?.innerText || '')) return 'captcha';
|
|
5
|
+
if (document.querySelector('.flight-list > span > div')) return 'content';
|
|
6
|
+
return null;
|
|
7
|
+
};
|
|
8
|
+
const found = detect();
|
|
9
|
+
if (found) return resolve(found);
|
|
10
|
+
const observer = new MutationObserver(() => {
|
|
11
|
+
const result = detect();
|
|
12
|
+
if (result) { observer.disconnect(); resolve(result); }
|
|
13
|
+
});
|
|
14
|
+
observer.observe(document.documentElement, { childList: true, subtree: true });
|
|
15
|
+
setTimeout(() => { observer.disconnect(); resolve('timeout'); }, 8000);
|
|
16
|
+
})
|
|
17
|
+
`;U({site:"ctrip",name:"flight",access:"read",description:"搜索携程一程机票(按出发/到达 IATA 三字码 + 日期)",domain:"flights.ctrip.com",strategy:S.COOKIE,browser:!0,navigateBefore:!1,args:[{name:"from",required:!0,positional:!0,help:"Departure IATA code (e.g. BJS / PEK)"},{name:"to",required:!0,positional:!0,help:"Arrival IATA code (e.g. SHA / PVG)"},{name:"date",required:!0,help:"Departure date (YYYY-MM-DD)"},{name:"limit",type:"int",default:D,help:`Number of flights (${V}-${Y})`}],columns:["rank","airline","flightNo","aircraft","departureTime","departureAirport","arrivalTime","arrivalAirport","terminal","price","currency","cabin","url"],func:async(K,B)=>{const P=j("from",B.from),Z=j("to",B.to);if(P===Z)throw new q(`--from and --to must differ (got ${P})`);const z=R("date",B.date),G=J(B.limit),H=`https://flights.ctrip.com/online/list/oneway-${P.toLowerCase()}-${Z.toLowerCase()}?depdate=${z}&cabin=Y_S_C_F&adult=1&child=0&infant=0`;await K.goto(H);const $=await K.evaluate(N);if($==="captcha")throw new x("flights.ctrip.com","Ctrip is asking for a captcha; complete it in your browser session and retry");if($!=="content")throw new Q(`Ctrip flight page did not render flight cards (state=${String($)})`);const X=await K.evaluate(F(".flight-list > span > div",G)),O=await K.evaluate(h());if(!Array.isArray(O))throw new Q("Ctrip flight DOM extraction returned malformed rows");const W=O;if(W.length===0){if(Number(X)>0)throw new Q("Ctrip flight cards rendered but parser did not find required flight anchors");throw new y("ctrip flight",`No flights for ${P}→${Z} on ${z}`)}const b=W.filter((v)=>v.departureTime&&v.departureAirport&&v.arrivalTime&&v.arrivalAirport&&v.airline&&v.flightNo).slice(0,G).map((v,f)=>({rank:f+1,airline:v.airline,flightNo:v.flightNo,aircraft:v.aircraft,departureTime:v.departureTime,departureAirport:v.departureAirport,arrivalTime:v.arrivalTime,arrivalAirport:v.arrivalAirport,terminal:v.terminal,price:v.price,currency:v.currency,cabin:v.cabin,url:H}));if(b.length===0)throw new Q("Ctrip flight rows were missing required airline/flight/time/airport anchors");return b}});export const __test__={parseFlightLimit:J,WAIT_FOR_FLIGHTS_JS:N};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import{ArgumentError as v,AuthRequiredError as H,CommandExecutionError as b,EmptyResultError as f}from"@jackwener/opencli/errors";import{cli as X,Strategy as y}from"@jackwener/opencli/registry";import{mapHotelRow as C,parseCityId as S,parseIsoDate as U}from"./utils.js";const P=1,Q=30,j=10;function W(G){if(G===void 0||G===null||G==="")return j;const z=Number(G);if(!Number.isFinite(z)||!Number.isInteger(z))throw new v(`--limit must be an integer between ${P} and ${Q}, got ${JSON.stringify(G)}`);if(z<P||z>Q)throw new v(`--limit must be between ${P} and ${Q}, got ${z}`);return z}const x=`
|
|
2
|
+
new Promise((resolve) => {
|
|
3
|
+
const detect = () => {
|
|
4
|
+
if (location.pathname.includes('captcha') || /验证码|verify the human/i.test(document.body?.innerText || '')) return 'captcha';
|
|
5
|
+
const hotels = window.__NEXT_DATA__?.props?.pageProps?.initListData?.hotelList;
|
|
6
|
+
if (Array.isArray(hotels)) return 'content';
|
|
7
|
+
return null;
|
|
8
|
+
};
|
|
9
|
+
const found = detect();
|
|
10
|
+
if (found) return resolve(found);
|
|
11
|
+
const observer = new MutationObserver(() => {
|
|
12
|
+
const result = detect();
|
|
13
|
+
if (result) { observer.disconnect(); resolve(result); }
|
|
14
|
+
});
|
|
15
|
+
observer.observe(document.documentElement, { childList: true, subtree: true });
|
|
16
|
+
setTimeout(() => { observer.disconnect(); resolve('timeout'); }, 5000);
|
|
17
|
+
})
|
|
18
|
+
`,D=`
|
|
19
|
+
(() => {
|
|
20
|
+
const list = window.__NEXT_DATA__?.props?.pageProps?.initListData?.hotelList;
|
|
21
|
+
if (!Array.isArray(list)) return null;
|
|
22
|
+
return list;
|
|
23
|
+
})()
|
|
24
|
+
`;function F(G,z){if(Date.parse(G+"T00:00:00Z")>=Date.parse(z+"T00:00:00Z"))throw new v(`--checkin must be earlier than --checkout (got ${G} >= ${z})`)}X({site:"ctrip",name:"hotel-search",access:"read",description:"搜索携程酒店列表(按城市 + 入住/离店日期)",domain:"hotels.ctrip.com",strategy:y.COOKIE,browser:!0,navigateBefore:!1,args:[{name:"city",required:!0,positional:!0,help:"Numeric Ctrip city ID (use `ctrip search` or `ctrip hotel-suggest` to discover)"},{name:"checkin",required:!0,help:"Check-in date (YYYY-MM-DD)"},{name:"checkout",required:!0,help:"Check-out date (YYYY-MM-DD)"},{name:"limit",type:"int",default:j,help:`Number of hotels (${P}-${Q}); SSR first page returns ~13 entries`}],columns:["rank","hotelId","name","enName","star","score","scoreLabel","reviewCount","cityName","district","address","lat","lon","price","currency","url"],func:async(G,z)=>{const q=S(z.city),V=U("checkin",z.checkin),Y=U("checkout",z.checkout);F(V,Y);const J=W(z.limit),N=`https://hotels.ctrip.com/hotels/list?city=${q}&checkin=${V}&checkout=${Y}`;await G.goto(N);const Z=await G.evaluate(x);if(Z==="captcha")throw new H("hotels.ctrip.com","Ctrip is asking for a captcha; complete it in your browser session and retry");if(Z!=="content")throw new b(`Ctrip hotel-search page did not expose SSR hotel list (state=${String(Z)})`);const $=await G.evaluate(D);if(!Array.isArray($))throw new b("Ctrip hotel-search returned malformed SSR hotel list");if($.length===0)throw new f("ctrip hotel-search",`No hotels for city=${q} on ${V} → ${Y}`);const B=$.map((K,O)=>C(K,O)).filter((K)=>K.hotelId&&K.name).slice(0,J);if(B.length===0)throw new b("Ctrip hotel-search SSR rows were missing required hotelId/name anchors");return B}});export const __test__={parseHotelLimit:W,assertCheckinBeforeCheckout:F,WAIT_FOR_SSR_JS:x,EXTRACT_HOTELS_JS:D};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ArgumentError as o,EmptyResultError as a}from"@jackwener/opencli/errors";import{cli as n,Strategy as c}from"@jackwener/opencli/registry";import{fetchSuggest as l,mapSuggestRow as u,parseLimit as m}from"./utils.js";n({site:"ctrip",name:"hotel-suggest",access:"read",description:"搜索携程酒店上下文联想:城市、商圈、单酒店匹配",strategy:c.PUBLIC,browser:!1,args:[{name:"query",required:!0,positional:!0,help:"Search keyword (city, business area, or hotel name)"},{name:"limit",type:"int",default:15,help:"Number of results (1-50)"}],columns:["rank","id","type","displayType","name","eName","cityId","cityName","provinceName","countryName","lat","lon","score","url"],func:async(t)=>{const r=String(t.query||"").trim();if(!r)throw new o("Search keyword cannot be empty");const i=m(t.limit),s=(await l(r,"H")).filter((e)=>!!e&&typeof e==="object").slice(0,i).map(u).filter((e)=>e.name);if(!s.length)throw new a("ctrip hotel-suggest",'Try a city, business area, or hotel keyword such as "陆家嘴" or "汉庭酒店"');return s}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ArgumentError as o,EmptyResultError as s}from"@jackwener/opencli/errors";import{cli as n,Strategy as c}from"@jackwener/opencli/registry";import{fetchSuggest as m,mapSuggestRow as l,parseLimit as p}from"./utils.js";n({site:"ctrip",name:"search",access:"read",description:"搜索携程目的地、景区、火车站和地标联想结果",strategy:c.PUBLIC,browser:!1,args:[{name:"query",required:!0,positional:!0,help:"Search keyword (city, scenic spot, landmark)"},{name:"limit",type:"int",default:15,help:"Number of results (1-50)"}],columns:["rank","id","type","displayType","name","eName","cityId","cityName","provinceName","countryName","lat","lon","score","url"],func:async(r)=>{const t=String(r.query||"").trim();if(!t)throw new o("Search keyword cannot be empty");const a=p(r.limit),i=(await m(t,"D")).filter((e)=>!!e&&typeof e==="object").slice(0,a).map(l).filter((e)=>e.name);if(!i.length)throw new s("ctrip search",'Try a destination, scenic spot, or landmark keyword such as "苏州" or "故宫"');return i}});
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import{ArgumentError as Y,CliError as J}from"@jackwener/opencli/errors";const X="https://m.ctrip.com/restapi/soa2/21881/json/gaHotelSearchEngine",Z=1,j=50;export function parseLimit(z,K=15){if(z===void 0||z===null||z==="")return K;const G=Number(z);if(!Number.isFinite(G)||!Number.isInteger(G))throw new Y(`--limit must be an integer between ${Z} and ${j}, got ${JSON.stringify(z)}`);if(G<Z||G>j)throw new Y(`--limit must be between ${Z} and ${j}, got ${G}`);return G}export async function fetchSuggest(z,K){let G;try{G=await fetch(X,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({keyword:z,searchType:K,platform:"online",pageID:"102001",head:{Locale:"zh-CN",LocaleController:"zh_cn",Currency:"CNY",PageId:"102001",clientID:"opencli-ctrip",group:"ctrip",Frontend:{sessionID:1,pvid:1},HotelExtension:{group:"CTRIP",WebpSupport:!1}}})})}catch(V){throw new J("FETCH_ERROR",`ctrip suggest fetch failed: ${V instanceof Error?V.message:String(V)}`,"Check your network connection and retry")}if(!G.ok)throw new J("FETCH_ERROR",`ctrip suggest failed with status ${G.status}`,"Retry the command or verify ctrip.com is reachable");let Q;try{Q=await G.json()}catch(V){throw new J("COMMAND_EXEC",`ctrip suggest returned invalid JSON: ${V instanceof Error?V.message:String(V)}`,"Ctrip may have changed the endpoint response format; retry later")}if(Q&&Q.Result===!1){const V=Q.ErrorCode??"unknown";throw new J("COMMAND_EXEC",`ctrip suggest API returned Result=false (ErrorCode=${V})`,"Verify keyword and retry; this typically means upstream rejected the query envelope")}return Array.isArray(Q?.Response?.searchResults)?Q.Response.searchResults:[]}export function pickCoords(z){const K=[[z.gdLat,z.gdLon],[z.gLat,z.gLon],[z.lat,z.lon]];for(const[G,Q]of K)if(Number.isFinite(G)&&Number.isFinite(Q)&&(G!==0||Q!==0))return{lat:G,lon:Q};return{lat:null,lon:null}}export function buildUrl(z){const K=z?.id?String(z.id):"",G=z?.cityId??"",Q=z?.cityName?String(z.cityName):"";switch(z?.type){case"City":return G?`https://you.ctrip.com/place/${encodeURIComponent(Q)}${G}.html`:null;case"Markland":return K&&G?`https://you.ctrip.com/sight/${encodeURIComponent(Q)}${G}/${K}.html`:null;case"Hotel":return K?`https://hotels.ctrip.com/hotels/detail/?hotelid=${K}`:null;case"BusinessArea":case"Zone":return G&&K?`https://hotels.ctrip.com/hotels/list?city=${G}&zone=${K}`:null;case"RailwayStation":return K?`https://trains.ctrip.com/trainstation/${K}.html`:null;default:return null}}function x(z){return Number.isFinite(z)&&z!==0?z:null}function L(...z){for(const K of z){const G=Number(K);if(Number.isFinite(G)&&G!==0)return G}return null}export function mapSuggestRow(z,K){const{lat:G,lon:Q}=pickCoords(z);return{rank:K+1,id:z?.id?String(z.id):null,type:z?.type?String(z.type):null,displayType:z?.displayType?String(z.displayType).trim():null,name:String(z?.displayName||z?.word||z?.cityName||"").replace(/\s+/g," ").trim()||null,eName:z?.eName?String(z.eName).trim():null,cityId:Number.isFinite(z?.cityId)&&z.cityId!==0?z.cityId:null,cityName:z?.cityName?String(z.cityName).trim():null,provinceName:z?.provinceName?String(z.provinceName).trim():null,countryName:z?.countryName?String(z.countryName).trim():null,lat:G,lon:Q,score:L(z?.commentScore,z?.cStar),url:buildUrl(z)}}const _=/^(\d{4})-(\d{2})-(\d{2})$/;export function parseIsoDate(z,K){if(K===void 0||K===null||K==="")throw new Y(`--${z} is required (YYYY-MM-DD)`);const G=String(K).trim(),Q=_.exec(G);if(!Q)throw new Y(`--${z} must be YYYY-MM-DD, got ${JSON.stringify(K)}`);const V=Number(Q[1]),W=Number(Q[2]),B=Number(Q[3]);if(W<1||W>12||B<1||B>31)throw new Y(`--${z} has invalid month/day: ${G}`);const $=new Date(Date.UTC(V,W-1,B));if($.getUTCFullYear()!==V||$.getUTCMonth()!==W-1||$.getUTCDate()!==B)throw new Y(`--${z} is not a real calendar date: ${G}`);return G}export function parseIataCode(z,K){if(K===void 0||K===null||K==="")throw new Y(`--${z} is required (3-letter IATA code, e.g. PEK, SHA)`);const G=String(K).trim().toUpperCase();if(!/^[A-Z]{3}$/.test(G))throw new Y(`--${z} must be a 3-letter IATA code, got ${JSON.stringify(K)}`);return G}export function parseCityId(z){if(z===void 0||z===null||z==="")throw new Y("--city is required (numeric city ID from `ctrip search` or `ctrip hotel-suggest`)");const K=Number(z);if(!Number.isFinite(K)||!Number.isInteger(K)||K<=0)throw new Y(`--city must be a positive integer city ID, got ${JSON.stringify(z)}`);return K}export function pickHotelMapCoords(z){if(!Array.isArray(z)||z.length===0)return{lat:null,lon:null};const K=(Q)=>{const V=Number(Q?.coordinateType);if(V===1)return 0;if(V===2)return 1;if(V===3)return 2;return 3},G=[...z].sort((Q,V)=>K(Q)-K(V));for(const Q of G){const V=Number(Q?.latitude),W=Number(Q?.longitude);if(Number.isFinite(V)&&Number.isFinite(W)&&(V!==0||W!==0))return{lat:V,lon:W}}return{lat:null,lon:null}}export function mapHotelRow(z,K){const G=z?.hotelInfo??{},Q=Array.isArray(z?.roomInfo)?z.roomInfo:[],V=G.summary??{},W=G.nameInfo??{},B=G.hotelStar??{},$=G.commentInfo??{},F=G.positionInfo??{},H=(Q[0]??{}).priceInfo??{},q=V.hotelId?String(V.hotelId):null,{lat:D,lon:O}=pickHotelMapCoords(F.mapCoordinate);let P=null;if($.commenterNumber){const R=String($.commenterNumber).replace(/[^\d]/g,"");if(R)P=Number(R)}const U=$.commentScore?Number($.commentScore):null,b=Number.isFinite(B.star)&&B.star>0?B.star:null,k=Number.isFinite(H.price)&&H.price>0?H.price:null;return{rank:K+1,hotelId:q,name:W.name?String(W.name).trim():null,enName:W.enName?String(W.enName).trim():null,star:b,score:Number.isFinite(U)&&U>0?U:null,scoreLabel:$.commentDescription?String($.commentDescription).trim():null,reviewCount:P,cityName:F.cityName?String(F.cityName).trim():null,district:F.positionDesc?String(F.positionDesc).trim():null,address:F.address?String(F.address).trim():null,lat:D,lon:O,price:k,currency:H.currency?String(H.currency).trim():null,url:q?`https://hotels.ctrip.com/hotels/detail/?hotelid=${q}`:null}}export function buildFlightExtractJs(){return`
|
|
2
|
+
(() => {
|
|
3
|
+
const cleanText = (value) => (value || '').replace(/\\s+/g, ' ').trim();
|
|
4
|
+
const isTime = (s) => /^([01]?\\d|2[0-3]):[0-5]\\d$/.test(s);
|
|
5
|
+
const isCurrency = (s) => /^[¥$€£]$/.test(s);
|
|
6
|
+
const isPriceDigits = (s) => /^\\d+([.,]\\d+)?$/.test(s);
|
|
7
|
+
const isFlightNo = (s) => /^[A-Z0-9]{2}\\d{3,4}[A-Z]?$/.test(s);
|
|
8
|
+
|
|
9
|
+
const rows = [];
|
|
10
|
+
document.querySelectorAll('.flight-list > span > div').forEach((card) => {
|
|
11
|
+
// Collect ordered text chunks (text nodes only, skip whitespace-only).
|
|
12
|
+
const chunks = [];
|
|
13
|
+
const walk = (node) => {
|
|
14
|
+
for (const c of node.childNodes) {
|
|
15
|
+
if (c.nodeType === 3) {
|
|
16
|
+
const t = cleanText(c.textContent);
|
|
17
|
+
if (t) chunks.push(t);
|
|
18
|
+
} else if (c.nodeType === 1) {
|
|
19
|
+
walk(c);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
walk(card);
|
|
24
|
+
if (chunks.length < 8) return;
|
|
25
|
+
|
|
26
|
+
// Anchor on first HH:MM — that's depTime; depAirport is immediately after.
|
|
27
|
+
const firstTimeIdx = chunks.findIndex(isTime);
|
|
28
|
+
if (firstTimeIdx < 1) return;
|
|
29
|
+
const airline = chunks[0];
|
|
30
|
+
const flightNo = chunks[1] || null;
|
|
31
|
+
if (!airline || !isFlightNo(flightNo)) return;
|
|
32
|
+
const aircraft = chunks[2] && !isTime(chunks[2]) ? chunks[2] : null;
|
|
33
|
+
|
|
34
|
+
const depTime = chunks[firstTimeIdx];
|
|
35
|
+
const depAirport = chunks[firstTimeIdx + 1] || null;
|
|
36
|
+
// Second HH:MM after depTime is arrTime
|
|
37
|
+
const arrTimeIdx = chunks.findIndex((c, i) => i > firstTimeIdx && isTime(c));
|
|
38
|
+
if (arrTimeIdx < 0) return;
|
|
39
|
+
const arrTime = chunks[arrTimeIdx];
|
|
40
|
+
const arrAirport = chunks[arrTimeIdx + 1] || null;
|
|
41
|
+
if (!depAirport || !arrAirport) return;
|
|
42
|
+
// Optional terminal chunk right after arrAirport (matches /^T\\d$/ or single letter)
|
|
43
|
+
let terminal = null;
|
|
44
|
+
if (arrTimeIdx + 2 < chunks.length && /^T\\d$/.test(chunks[arrTimeIdx + 2])) {
|
|
45
|
+
terminal = chunks[arrTimeIdx + 2];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Price: scan for currency symbol then a digit-only chunk
|
|
49
|
+
let price = null;
|
|
50
|
+
let currency = null;
|
|
51
|
+
for (let i = 0; i < chunks.length - 1; i++) {
|
|
52
|
+
if (isCurrency(chunks[i]) && isPriceDigits(chunks[i + 1])) {
|
|
53
|
+
currency = chunks[i];
|
|
54
|
+
price = Number(chunks[i + 1].replace(',', ''));
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Cabin: scan from end for first non-CTA Chinese chunk ending in "舱"
|
|
59
|
+
let cabin = null;
|
|
60
|
+
for (let i = chunks.length - 1; i >= 0; i--) {
|
|
61
|
+
if (/舱$/.test(chunks[i])) { cabin = chunks[i]; break; }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
rows.push({
|
|
65
|
+
airline,
|
|
66
|
+
flightNo,
|
|
67
|
+
aircraft,
|
|
68
|
+
departureTime: depTime,
|
|
69
|
+
departureAirport: depAirport,
|
|
70
|
+
arrivalTime: arrTime,
|
|
71
|
+
arrivalAirport: arrAirport,
|
|
72
|
+
terminal,
|
|
73
|
+
price,
|
|
74
|
+
currency,
|
|
75
|
+
cabin,
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
return rows;
|
|
79
|
+
})()
|
|
80
|
+
`}export function buildScrollUntilJs(z,K,G=8){if(!Number.isInteger(K)||K<1||K>100)throw new Y(`targetCount must be an integer between 1 and 100, got ${JSON.stringify(K)}`);if(!Number.isInteger(G)||G<1||G>30)throw new Y(`maxScrolls must be an integer between 1 and 30, got ${JSON.stringify(G)}`);return`
|
|
81
|
+
(async () => {
|
|
82
|
+
const sel = ${JSON.stringify(z)};
|
|
83
|
+
const isVisible = (el) => {
|
|
84
|
+
const style = window.getComputedStyle(el);
|
|
85
|
+
if (style.display === 'none' || style.visibility === 'hidden' || Number(style.opacity) === 0) return false;
|
|
86
|
+
const rect = el.getBoundingClientRect();
|
|
87
|
+
return rect.width > 0 && rect.height > 0;
|
|
88
|
+
};
|
|
89
|
+
const countItems = () => Array.from(document.querySelectorAll(sel)).filter(isVisible).length;
|
|
90
|
+
let lastCount = countItems();
|
|
91
|
+
let plateauRounds = 0;
|
|
92
|
+
for (let i = 0; i < ${G}; i++) {
|
|
93
|
+
if (countItems() >= ${K}) break;
|
|
94
|
+
const lastHeight = document.body.scrollHeight;
|
|
95
|
+
window.scrollTo(0, lastHeight);
|
|
96
|
+
await new Promise((resolve) => {
|
|
97
|
+
let to;
|
|
98
|
+
const ob = new MutationObserver(() => {
|
|
99
|
+
if (document.body.scrollHeight > lastHeight) {
|
|
100
|
+
clearTimeout(to);
|
|
101
|
+
ob.disconnect();
|
|
102
|
+
setTimeout(resolve, 200);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
ob.observe(document.body, { childList: true, subtree: true });
|
|
106
|
+
to = setTimeout(() => { ob.disconnect(); resolve(null); }, 2500);
|
|
107
|
+
});
|
|
108
|
+
const newCount = countItems();
|
|
109
|
+
if (newCount === lastCount) {
|
|
110
|
+
plateauRounds++;
|
|
111
|
+
if (plateauRounds >= 2) break;
|
|
112
|
+
} else {
|
|
113
|
+
plateauRounds = 0;
|
|
114
|
+
lastCount = newCount;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return countItems();
|
|
118
|
+
})()
|
|
119
|
+
`}export const __test__={ENDPOINT:X,MIN_LIMIT:Z,MAX_LIMIT:j};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import{cli as L,Strategy as M}from"@jackwener/opencli/registry";import{ArgumentError as N,selectorError as O}from"@jackwener/opencli/errors";export const askCommand=L({site:"cursor",name:"ask",access:"write",description:"Send a prompt and wait for the AI response (send + wait + read)",domain:"localhost",strategy:M.UI,browser:!0,args:[{name:"text",required:!0,positional:!0,help:"Prompt to send"},{name:"timeout",type:"int",required:!1,help:"Max seconds to wait for response (default: 30)",default:30}],columns:["Role","Text"],func:async(h,D)=>{const{text:z,timeout:q}=D;if(!Number.isInteger(q)||q<1)throw new N("--timeout must be a positive integer (seconds)");const J=await h.evaluate(`
|
|
2
|
+
document.querySelectorAll('[data-message-role]').length
|
|
3
|
+
`);if(!await h.evaluate(`(function(text) {
|
|
4
|
+
let editor = document.querySelector('.aislash-editor-input, [data-lexical-editor="true"], [contenteditable="true"]');
|
|
5
|
+
if (!editor) return false;
|
|
6
|
+
editor.focus();
|
|
7
|
+
document.execCommand('insertText', false, text);
|
|
8
|
+
return true;
|
|
9
|
+
})(${JSON.stringify(z)})`))throw O("Cursor input element");await h.wait(0.5);await h.pressKey("Enter");const F=2,K=Math.ceil(q/F);let B="";for(let G=0;G<K;G++){await h.wait(F);const H=await h.evaluate(`
|
|
10
|
+
(function(prevCount) {
|
|
11
|
+
const msgs = document.querySelectorAll('[data-message-role]');
|
|
12
|
+
if (msgs.length <= prevCount) return null;
|
|
13
|
+
|
|
14
|
+
const lastMsg = msgs[msgs.length - 1];
|
|
15
|
+
const role = lastMsg.getAttribute('data-message-role');
|
|
16
|
+
if (role === 'human') return null; // Still waiting for assistant
|
|
17
|
+
|
|
18
|
+
const root = lastMsg.querySelector('.markdown-root');
|
|
19
|
+
const text = root ? root.innerText : lastMsg.innerText;
|
|
20
|
+
return text ? text.trim() : null;
|
|
21
|
+
})(${J})
|
|
22
|
+
`);if(H){B=H;break}}if(!B)return[{Role:"User",Text:z},{Role:"System",Text:`No response received within ${q}s. The AI may still be generating.`}];return[{Role:"User",Text:z},{Role:"Assistant",Text:B}]}});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import{cli as A,Strategy as B}from"@jackwener/opencli/registry";import{selectorError as D}from"@jackwener/opencli/errors";export const composerCommand=A({site:"cursor",name:"composer",access:"write",description:"Send a prompt directly into Cursor Composer (Cmd+I shortcut)",domain:"localhost",strategy:B.UI,browser:!0,args:[{name:"text",required:!0,positional:!0,help:"Text to send into Composer"}],columns:["Status","InjectedText"],func:async(b,z)=>{const q=z.text;await b.pressKey("Meta+I");await b.wait(1);if(!await b.evaluate(`(function(text) {
|
|
2
|
+
let composer = document.activeElement;
|
|
3
|
+
if (!composer || !composer.isContentEditable) {
|
|
4
|
+
composer = document.querySelector('.composer-bar [data-lexical-editor="true"], [id*="composer"] [contenteditable="true"], .aislash-editor-input');
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
if (!composer) return false;
|
|
8
|
+
|
|
9
|
+
composer.focus();
|
|
10
|
+
document.execCommand('insertText', false, text);
|
|
11
|
+
return true;
|
|
12
|
+
})(${JSON.stringify(q)})`))throw D("Cursor Composer input element","Could not find Cursor Composer input element after pressing Cmd+I.");await b.wait(0.5);await b.pressKey("Enter");await b.wait(1);return[{Status:"Success",InjectedText:q}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{makeDumpCommand as m}from"../_shared/desktop-commands.js";export const dumpCommand=m("cursor");
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import*as a from"node:fs";import{cli as m,Strategy as i}from"@jackwener/opencli/registry";function l(e,n){return m({site:e,name:"export",access:"read",description:`Export the current ${e} conversation to a Markdown file`,domain:"localhost",strategy:i.UI,browser:!0,args:[{name:"output",required:!1,help:`Output file (default: /tmp/${e}-export.md)`}],columns:["Status","File","Messages"],func:async(o,r)=>{const t=r.output||`/tmp/${e}-export.md`,s=await o.evaluate(`
|
|
2
|
+
(function() {
|
|
3
|
+
const selectors = ${JSON.stringify(n)}.split(',');
|
|
4
|
+
let messages = [];
|
|
5
|
+
|
|
6
|
+
for (const sel of selectors) {
|
|
7
|
+
const nodes = document.querySelectorAll(sel.trim());
|
|
8
|
+
if (nodes.length > 0) {
|
|
9
|
+
messages = Array.from(nodes).map(n => n.innerText || n.textContent);
|
|
10
|
+
break;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
if (messages.length === 0) {
|
|
15
|
+
const main = document.querySelector('main, [role="main"], .messages-list, [role="log"]');
|
|
16
|
+
if (main) messages = [main.innerText || main.textContent];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (messages.length === 0) messages = [document.body.innerText];
|
|
20
|
+
|
|
21
|
+
return messages.map((m, i) => '## Message ' + (i + 1) + '\\n\\n' + m.trim()).join('\\n\\n---\\n\\n');
|
|
22
|
+
})()
|
|
23
|
+
`);a.writeFileSync(t,`# ${e} Conversation Export\\n\\n`+s);return[{Status:"Success",File:t,Messages:s.split("## Message").length-1}]}})}export const cursorExport=l("cursor","[data-message-role]");
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import{cli as o,Strategy as n}from"@jackwener/opencli/registry";export const extractCodeCommand=o({site:"cursor",name:"extract-code",access:"read",description:"Extract multi-line code blocks from the current Cursor conversation",domain:"localhost",strategy:n.UI,browser:!0,args:[],columns:["Code"],func:async(t)=>{const e=await t.evaluate(`
|
|
2
|
+
(function() {
|
|
3
|
+
// Find standard pre/code blocks
|
|
4
|
+
let elements = Array.from(document.querySelectorAll('pre code, .markdown-root pre'));
|
|
5
|
+
|
|
6
|
+
// Fallback to Monaco editor content inside the UI
|
|
7
|
+
if (elements.length === 0) {
|
|
8
|
+
elements = Array.from(document.querySelectorAll('.monaco-editor'));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// Generic fallback to any code tag that spans multiple lines
|
|
12
|
+
if (elements.length === 0) {
|
|
13
|
+
elements = Array.from(document.querySelectorAll('code')).filter(c => c.innerText.includes('\\n'));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return elements.map(el => el.innerText || el.textContent || '').filter(text => text.trim().length > 0);
|
|
17
|
+
})()
|
|
18
|
+
`);if(!e||e.length===0)return[{Code:"No code blocks found in Cursor."}];return e.map((r)=>({Code:r}))}});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import{cli as i,Strategy as s}from"@jackwener/opencli/registry";export const historyCommand=i({site:"cursor",name:"history",access:"read",description:"List recent chat sessions from the Cursor sidebar",domain:"localhost",strategy:s.UI,browser:!0,args:[],columns:["Index","Title"],func:async(e)=>{const t=await e.evaluate(`
|
|
2
|
+
(function() {
|
|
3
|
+
const results = [];
|
|
4
|
+
// Cursor chat history lives in sidebar items
|
|
5
|
+
const entries = document.querySelectorAll('.agent-sidebar-list-item, [data-testid="chat-history-item"], .chat-history-item, .tree-item');
|
|
6
|
+
|
|
7
|
+
entries.forEach((item, i) => {
|
|
8
|
+
const title = (item.textContent || item.innerText || '').trim().substring(0, 100);
|
|
9
|
+
if (title) results.push({ Index: i + 1, Title: title });
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
// Fallback: try to find sidebar text items
|
|
13
|
+
if (results.length === 0) {
|
|
14
|
+
const sidebar = document.querySelector('.sidebar, [class*="sidebar"], .agent-sidebar, .side-bar-container');
|
|
15
|
+
if (sidebar) {
|
|
16
|
+
const links = sidebar.querySelectorAll('a, [role="treeitem"], [role="option"]');
|
|
17
|
+
links.forEach((link, i) => {
|
|
18
|
+
const text = (link.textContent || '').trim().substring(0, 100);
|
|
19
|
+
if (text) results.push({ Index: i + 1, Title: text });
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return results;
|
|
25
|
+
})()
|
|
26
|
+
`);if(t.length===0)return[{Index:0,Title:"No chat history found. Open the AI sidebar first."}];return t}});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import{cli as v,Strategy as x}from"@jackwener/opencli/registry";export const modelCommand=v({site:"cursor",name:"model",access:"read",description:"Get or switch the currently active AI model in Cursor",domain:"localhost",strategy:x.UI,browser:!0,args:[{name:"model-name",required:!1,positional:!0,help:"The ID of the model to switch to (e.g. claude-3.5-sonnet)"}],columns:["Status","Model"],func:async(f,q)=>{const b=q["model-name"];if(!b)return[{Status:"Active",Model:await f.evaluate(`
|
|
2
|
+
(function() {
|
|
3
|
+
const m = document.querySelector('.composer-unified-dropdown-model span, [class*="unifiedmodeldropdown"] span');
|
|
4
|
+
return m ? m.textContent.trim() : 'Unknown or Not Found';
|
|
5
|
+
})()
|
|
6
|
+
`)}];else return[{Status:await f.evaluate(`
|
|
7
|
+
(function(targetModel) {
|
|
8
|
+
const dropdown = document.querySelector('.composer-unified-dropdown-model, [class*="unifiedmodeldropdown"]');
|
|
9
|
+
if (!dropdown) return 'Dropdown not found';
|
|
10
|
+
|
|
11
|
+
dropdown.click();
|
|
12
|
+
// After clicking, the DOM usually spawns a popup list.
|
|
13
|
+
// Because it's hard to predict exactly how the list renders,
|
|
14
|
+
// a simple scriptable approach is just to click it, and hope we can select it via UI.
|
|
15
|
+
// In many React apps, clicking it opens a menu, and clicking the item works.
|
|
16
|
+
return 'Dropdown opened. Automated switching is not fully generic. Please implement precise list navigation depending on DOM.';
|
|
17
|
+
})(${JSON.stringify(b)})
|
|
18
|
+
`),Model:b}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{makeNewCommand as o}from"../_shared/desktop-commands.js";export const newCommand=o("cursor","Cursor chat or Composer");
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import{cli as r,Strategy as o}from"@jackwener/opencli/registry";import{EmptyResultError as s}from"@jackwener/opencli/errors";export const readCommand=r({site:"cursor",name:"read",access:"read",description:"Read the current Cursor chat/composer conversation history",domain:"localhost",strategy:o.UI,browser:!0,columns:["Role","Text"],func:async(e)=>{const t=await e.evaluate(`
|
|
2
|
+
(function() {
|
|
3
|
+
const messages = Array.from(document.querySelectorAll('[data-message-role]'));
|
|
4
|
+
|
|
5
|
+
if (messages.length === 0) {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
return messages.map(msg => {
|
|
10
|
+
const role = msg.getAttribute('data-message-role');
|
|
11
|
+
let text = '';
|
|
12
|
+
|
|
13
|
+
// Try to get structured markdown root for AI, or lexical text for human
|
|
14
|
+
const markdownRoot = msg.querySelector('.markdown-root');
|
|
15
|
+
if (markdownRoot) {
|
|
16
|
+
text = markdownRoot.innerText || markdownRoot.textContent;
|
|
17
|
+
} else {
|
|
18
|
+
text = msg.innerText || msg.textContent;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
Role: role === 'human' ? 'User' : 'Assistant',
|
|
23
|
+
Text: text.trim()
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
})()
|
|
27
|
+
`);if(!t||t.length===0)throw new s("cursor read","No conversation history found in Cursor.");return t}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{makeScreenshotCommand as o}from"../_shared/desktop-commands.js";export const screenshotCursor=o("cursor");
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import{cli as z,Strategy as A}from"@jackwener/opencli/registry";import{selectorError as B}from"@jackwener/opencli/errors";export const sendCommand=z({site:"cursor",name:"send",access:"write",description:"Send a prompt directly into Cursor Composer/Chat",domain:"localhost",strategy:A.UI,browser:!0,args:[{name:"text",required:!0,positional:!0,help:"Text to send into Cursor"}],columns:["Status","InjectedText"],func:async(f,v)=>{const q=v.text;if(!await f.evaluate(`(function(text) {
|
|
2
|
+
// Find the Lexical editor input for Composer or Chat
|
|
3
|
+
let composer = document.querySelector('.aislash-editor-input, [data-lexical-editor="true"], [contenteditable="true"]');
|
|
4
|
+
|
|
5
|
+
if (!composer) {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
composer.focus();
|
|
10
|
+
document.execCommand('insertText', false, text);
|
|
11
|
+
return true;
|
|
12
|
+
})(${JSON.stringify(q)})`))throw B("Cursor Composer input element");await f.wait(0.5);await f.pressKey("Enter");await f.wait(1);return[{Status:"Success",InjectedText:q}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{makeStatusCommand as o}from"../_shared/desktop-commands.js";export const statusCommand=o("cursor","Cursor AI Editor");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as C,Strategy as D}from"@jackwener/opencli/registry";import{ArgumentError as H,CommandExecutionError as J,EmptyResultError as f}from"@jackwener/opencli/errors";import{DBLP_ORIGIN as x,decodeXmlEntities as K,dblpFetchJson as Q,dblpFetchXml as _,extractRecordKey as b,recordXmlToRow as q,requireBoundedInt as I,requireQuery as S}from"./utils.js";const j=/^[0-9a-z]+(?:\/[0-9a-z-]+)+$/i;function F(G){const M=String(G?.info?.url??"").trim().match(/\/pid\/([^/]+(?:\/[^/]+)+)$/);return M?M[1]:""}function P(G){return G[0]}function k(G){const V=[],M=/<r>\s*([\s\S]*?)\s*<\/r>/g;let L;while((L=M.exec(String(G||"")))!==null){const O=L[1];if(/^<crossref/.test(O))continue;V.push(O)}return V}C({site:"dblp",name:"author",access:"read",description:"List dblp publications by a given author (newest first; resolves to top PID match)",domain:"dblp.org",strategy:D.PUBLIC,browser:!1,args:[{name:"author",positional:!0,required:!1,help:'Author name (e.g. "Yoshua Bengio"). Optional when --pid is given.'},{name:"pid",help:'Canonical dblp PID (e.g. "56/953"). Bypasses author search.'},{name:"limit",type:"int",default:20,help:"Max publications (1-200)"}],columns:["rank","key","title","authors","venue","year","type","doi","pid","url"],func:async(G)=>{const V=I(G.limit,20,200),M=G.pid!=null?String(G.pid).trim():"";let L="",O="";if(M){if(!j.test(M))throw new H(`dblp pid "${M}" is not a valid PID`,'Expected something like "56/953" — visit the author page on dblp.org to find it.');L=M}else{const U=S(G.author,"author"),z=(await Q(`/search/author/api?q=${encodeURIComponent(U)}&format=json&h=20`,"dblp author search"))?.result?.hits?.hit,Z=Array.isArray(z)?z:z?[z]:[];if(!Z.length)throw new f("dblp author",`No dblp author matched "${U}". Try a different spelling, or pass --pid to bypass author search.`);const $=P(Z);L=F($);if(!L)throw new J(`dblp author search for "${U}" returned a hit without a PID URL`,"dblp may have changed its author-search response shape; retry or pass --pid manually.");O=K(String($?.info?.author??"")).trim()}const B=await _(`/pid/${L}.xml`,`dblp pid ${L}`),W=k(B);if(!W.length)throw new f("dblp author",`dblp PID ${L}${O?` (${O})`:""} has no publications.`);return W.slice(0,V).map((U,Y)=>{const z=q(`<root>${U}</root>`);return{rank:Y+1,key:z.key||b(U),title:z.title,authors:z.authors,venue:z.venue,year:z.year,type:z.type,doi:z.doi,pid:L,url:z.open_access_url||z.dblp_url}})}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as t,Strategy as s}from"@jackwener/opencli/registry";import{EmptyResultError as l}from"@jackwener/opencli/errors";import{PAPER_COLUMNS as p,dblpFetchXml as c,recordXmlToRow as d,requireRecordKey as i}from"./utils.js";t({site:"dblp",name:"paper",aliases:["detail","view"],access:"read",description:"Fetch a dblp record by canonical key (e.g. conf/nips/VaswaniSPUJGKP17)",domain:"dblp.org",strategy:s.PUBLIC,browser:!1,args:[{name:"key",positional:!0,required:!0,help:"dblp record key (round-tripped from the `key` column of `dblp search`)"}],columns:p,func:async(a)=>{const r=i(a.key),o=await c(`/rec/${encodeURI(r)}.xml`,"dblp paper"),e=d(o);if(!e.key&&!e.title)throw new l("dblp paper",`dblp returned an empty record for key "${r}".`);return[e]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as l,Strategy as c}from"@jackwener/opencli/registry";import{EmptyResultError as p}from"@jackwener/opencli/errors";import{SEARCH_COLUMNS as h,dblpFetchJson as u,requireBoundedInt as d,requireQuery as m,searchHitToRow as b}from"./utils.js";l({site:"dblp",name:"search",access:"read",description:"Search dblp computer-science bibliography by free-text query",domain:"dblp.org",strategy:c.PUBLIC,browser:!1,args:[{name:"query",positional:!0,required:!0,help:'Search keyword (title / author / venue, e.g. "attention is all you need")'},{name:"limit",type:"int",default:20,help:"Max results (1-100, single dblp page)"}],columns:h,func:async(e)=>{const t=m(e.query),r=d(e.limit,20,100),o=`/search/publ/api?q=${encodeURIComponent(t)}&format=json&h=${r}`,a=(await u(o,"dblp search"))?.result?.hits?.hit,s=Array.isArray(a)?a:[];if(s.length===0)throw new p("dblp search",`No publications matched "${t}".`);return s.slice(0,r).map((i,n)=>b(i,n+1))}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ArgumentError as j,CommandExecutionError as $,EmptyResultError as N}from"@jackwener/opencli/errors";export const DBLP_ORIGIN="https://dblp.org";const O=/^[a-z]+(?:\/[A-Za-z0-9_.-]+)+$/;async function q(Q,J,S){let U;try{U=await fetch(Q,{headers:{accept:S,"user-agent":"opencli-dblp/1.0 (+https://github.com/jackwener/opencli)"}})}catch(W){throw new $(`${J} request failed: ${W?.message??W}`,"Check that dblp.org is reachable from this network.")}if(!U.ok){if(U.status===429)throw new $(`${J} returned HTTP 429 (rate limited)`,"dblp throttles clients that fetch too aggressively. Wait a few seconds and retry, or lower --limit.");if(U.status===404)throw new N(J,"dblp returned 404 — the requested record may not exist.");throw new $(`${J} returned HTTP ${U.status}`,"Inspect the response in a browser at the same URL for more context.")}return U}export async function dblpFetchJson(Q,J){const S=await q(`${DBLP_ORIGIN}${Q}`,J,"application/json");let U;try{U=await S.json()}catch(Z){throw new $(`${J} returned malformed JSON: ${Z?.message??Z}`)}const W=String(U?.result?.status?.["@code"]??"").trim();if(!W)throw new $(`${J} returned JSON without result.status.@code`,"dblp changed its JSON envelope or returned a partial error payload; inspect the raw response in a browser.");if(W!=="200"){const Z=String(U?.result?.status?.text??"").trim();throw new $(`${J} returned API status ${W}${Z?` (${Z})`:""}`,"dblp accepted the HTTP request but reported an API-level failure. Retry later or inspect the same query in a browser.")}return U}export async function dblpFetchXml(Q,J){return(await q(`${DBLP_ORIGIN}${Q}`,J,"application/xml")).text()}export function coerceInt(Q){if(Q===void 0||Q===null||Q==="")return NaN;const J=typeof Q==="number"?Q:Number(Q);return Number.isFinite(J)&&Number.isInteger(J)?J:NaN}export function requireBoundedInt(Q,J,S,U="limit"){const Z=coerceInt(Q??J);if(!Number.isInteger(Z)||Z<=0)throw new j(`dblp ${U} must be a positive integer`);if(Z>S)throw new j(`dblp ${U} must be <= ${S}`);return Z}export function requireQuery(Q,J="query"){const S=String(Q??"").trim();if(!S)throw new j(`dblp ${J} cannot be empty`);return S}export function requireRecordKey(Q){const J=String(Q??"").trim();if(!J)throw new j("dblp paper key is required");if(!O.test(J))throw new j(`dblp paper key "${Q}" is not a valid record key`,'Expected something like "conf/nips/VaswaniSPUJGKP17" — copy the `key` column from `dblp search`.');return J}export function decodeXmlEntities(Q){if(!Q)return"";return String(Q).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/'/g,"'").replace(/"/g,'"').replace(/&#x([0-9a-fA-F]+);/g,(J,S)=>String.fromCodePoint(parseInt(S,16))).replace(/&#(\d+);/g,(J,S)=>String.fromCodePoint(parseInt(S,10)))}function M(Q){return String(Q||"").replace(/\s+\d{4,}$/,"").trim()}export function normalizeAuthors(Q){if(!Q)return[];const J=Q?.author;if(!J)return[];return(Array.isArray(J)?J:[J]).map((U)=>{if(U&&typeof U==="object")return M(U.text||U["#text"]||"");return M(String(U))}).filter(Boolean)}export function searchHitToRow(Q,J){const S=Q?.info??{},U=normalizeAuthors(S.authors),W=String(S.key??"").trim();return{rank:J,key:W,title:K(decodeXmlEntities(S.title??"")).trim(),authors:U.join(", "),venue:decodeXmlEntities(S.venue??""),year:String(S.year??"").trim(),type:_(S.type),doi:String(S.doi??"").trim(),url:String(S.ee??S.url??"").trim()}}function K(Q){return String(Q||"").replace(/\.\s*$/,"")}function _(Q){if(!Q)return"";const J=String(Q);if(/Conference and Workshop/i.test(J))return"conf";if(/Journal Articles/i.test(J))return"journal";if(/Books and Theses/i.test(J))return"book";if(/Editorship/i.test(J))return"editorship";if(/Reference Works/i.test(J))return"reference";if(/Informal/i.test(J))return"preprint";return J.toLowerCase().split(/\s+/)[0]}export function extractFirst(Q,J){const S=String(Q||"").match(new RegExp(`<${J}\\b[^>]*>([\\s\\S]*?)<\\/${J}>`));return S?S[1]:""}export function extractAll(Q,J){const S=[],U=new RegExp(`<${J}\\b[^>]*>([\\s\\S]*?)<\\/${J}>`,"g");let W;while((W=U.exec(String(Q||"")))!==null)S.push(W[1]);return S}export function extractOpenAccessLink(Q){const J=String(Q||"").match(/<ee\b[^>]*type=["']oa["'][^>]*>([\s\S]*?)<\/ee>/);if(J)return J[1].trim();const S=String(Q||"").match(/<ee\b[^>]*>([\s\S]*?)<\/ee>/);return S?S[1].trim():""}export function extractRecordKey(Q){const J=String(Q||"").match(/<(?:article|inproceedings|incollection|proceedings|book|phdthesis|mastersthesis)\b[^>]*\bkey="([^"]+)"/);return J?J[1]:""}export function extractRecordType(Q){const J=String(Q||"").match(/<(article|inproceedings|incollection|proceedings|book|phdthesis|mastersthesis)\b/);if(!J)return"";switch(J[1]){case"inproceedings":return"conf";case"article":return"journal";case"incollection":return"incollection";case"proceedings":return"editorship";case"book":return"book";case"phdthesis":return"phdthesis";case"mastersthesis":return"mastersthesis";default:return J[1]}}export function recordXmlToRow(Q){const J=extractRecordKey(Q),S=extractRecordType(Q),U=K(decodeXmlEntities(extractFirst(Q,"title"))),W=extractAll(Q,"author").map((z)=>M(decodeXmlEntities(z))),Z=decodeXmlEntities(extractFirst(Q,"year")),B=decodeXmlEntities(extractFirst(Q,"pages")),G=S==="conf"?decodeXmlEntities(extractFirst(Q,"booktitle")):decodeXmlEntities(extractFirst(Q,"journal")),H=(()=>{const z=String(Q||"").match(/<ee\b[^>]*>([^<]*?(?:doi\.org\/|10\.[^"<]+))<\/ee>/i);if(!z)return"";const Y=z[1].replace(/^https?:\/\/(?:dx\.)?doi\.org\//i,"");return Y.startsWith("10.")?Y:""})();return{key:J,type:S,title:U,authors:W.join(", "),venue:G,year:Z,pages:B,doi:H,open_access_url:extractOpenAccessLink(Q),dblp_url:J?`${DBLP_ORIGIN}/rec/${J}.html`:""}}export const SEARCH_COLUMNS=["rank","key","title","authors","venue","year","type","doi","url"],PAPER_COLUMNS=["key","type","title","authors","venue","year","pages","doi","open_access_url","dblp_url"];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as u,Strategy as c}from"@jackwener/opencli/registry";import{EmptyResultError as l}from"@jackwener/opencli/errors";import{DBLP_ORIGIN as p,decodeXmlEntities as m,dblpFetchJson as f,requireBoundedInt as d,requireQuery as y}from"./utils.js";function h(t){const e=String(t??"").trim();if(!e)return"";if(/Conference or Workshop/i.test(e))return"conf";if(/Journal/i.test(e))return"journal";if(/Series/i.test(e))return"series";if(/Book/i.test(e))return"book";if(/Reference/i.test(e))return"reference";return e.toLowerCase().split(/\s+/)[0]}function v(t,e){const r=t?.info??{},n=String(r.url??"").trim();return{rank:e,acronym:String(r.acronym??"").trim(),venue:m(r.venue??""),type:h(r.type),url:n.startsWith("http")?n:n?`${p}${n.startsWith("/")?"":"/"}${n}`:""}}u({site:"dblp",name:"venue",access:"read",description:"Search dblp venue registry (conferences / journals) by name or acronym",domain:"dblp.org",strategy:c.PUBLIC,browser:!1,args:[{name:"query",positional:!0,required:!0,help:'Venue name or acronym (e.g. "ICLR", "neural networks")'},{name:"limit",type:"int",default:20,help:"Max venues (1-100, single dblp page)"}],columns:["rank","acronym","venue","type","url"],func:async(t)=>{const e=y(t.query),r=d(t.limit,20,100),n=`/search/venue/api?q=${encodeURIComponent(e)}&format=json&h=${r}`,o=(await f(n,"dblp venue"))?.result?.hits?.hit,i=Array.isArray(o)?o:[];if(i.length===0)throw new l("dblp venue",`No dblp venues matched "${e}".`);return i.slice(0,r).map((s,a)=>v(s,a+1))}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as _,Strategy as x}from"@jackwener/opencli/registry";import{CliError as L,CommandExecutionError as V,EXIT_CODES as U,TimeoutError as X}from"@jackwener/opencli/errors";import{DEEPSEEK_DOMAIN as y,DEEPSEEK_URL as F,ensureOnDeepSeek as S,selectModel as M,setFeature as f,sendMessage as C,sendWithFile as T,getBubbleCount as A,waitForResponse as B,parseBoolFlag as v,withRetry as Y,pickResumeUrl as c,TEXTAREA_SELECTOR as b}from"./utils.js";export const askCommand=_({site:"deepseek",name:"ask",access:"write",description:"Send a prompt to DeepSeek and get the response",domain:y,strategy:x.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"prompt",positional:!0,required:!0,help:"Prompt to send"},{name:"timeout",type:"int",default:120,help:"Max seconds to wait for response"},{name:"new",type:"boolean",default:!1,help:"Start a new chat before sending"},{name:"model",default:"instant",choices:["instant","expert","vision"],help:"Model to use: instant, expert, or vision"},{name:"think",type:"boolean",default:!1,help:"Enable DeepThink mode"},{name:"search",type:"boolean",default:!1,help:"Enable web search"},{name:"file",help:"Attach a file (PDF, image, text) with the prompt"}],func:async(q,z)=>{const $=z.prompt,K=(z.timeout||120)*1000,Q=v(z.think),N=v(z.search),G=z.model||"instant";if((G==="vision"||G==="expert")&&N)throw new L("ARGUMENT",`DeepSeek ${G} mode does not support --search.`,"Run without --search, or use --model instant for web search.",U.USAGE_ERROR);if(v(z.new)){await q.goto(F);try{await q.wait({selector:b,timeout:8})}catch{}}else if(await S(q)){const H=await c(q);if(!H)throw new V("Workspace was recycled but no prior conversation could be loaded","Pass --new to start a fresh chat, or wait for the sidebar to populate before retrying.");await q.goto(H);try{await q.wait({selector:b,timeout:5})}catch{}}const P=(await q.evaluate("window.location.href")||"").includes("/a/chat/s/"),D=z.__opencliOptionSources?.model==="cli";if(P&&D)throw new L("ARGUMENT",`Cannot switch to ${G} model inside an existing conversation.`,"Re-run with --new to start a fresh chat before selecting a model.",U.USAGE_ERROR);if(!P){if(!(await Y(()=>M(q,G)))?.ok)throw new V(`Could not switch to ${G} model`)}if(!(await Y(()=>f(q,"DeepThink",Q)))?.ok&&Q)throw new V("Could not enable DeepThink");let j;if(G!=="vision"&&G!=="expert"){j=await Y(()=>f(q,"Search",N));if(!j?.ok&&N)throw new V("Could not enable Search")}if(z.file){const W=await Y(()=>A(q));try{const J=await T(q,z.file,$);if(J&&!J.ok)throw new V(J.reason||"Failed to attach file")}catch(J){if(!String(J?.message||J).includes("Promise was collected"))throw J}const H=await B(q,W,$,K,Q);if(!H)throw new X("deepseek ask",z.timeout,"No DeepSeek reply observed before timeout. Retry with --timeout increased.");if(Q&&typeof H==="object"&&H.response!==void 0)return[H];return[{response:H}]}const O=await Y(()=>A(q)),I=await Y(()=>C(q,$));if(!I?.ok)throw new V(I?.reason||"Failed to send message");const Z=await B(q,O,$,K,Q);if(!Z)throw new X("deepseek ask",z.timeout,"No DeepSeek reply observed before timeout. Retry with --timeout increased.");if(Q&&typeof Z==="object"&&Z.response!==void 0)return[Z];return[{response:Z}]}});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import{AuthRequiredError as J,CommandExecutionError as G}from"@jackwener/opencli/errors";import{registerSiteAuthCommands as L}from"../_shared/site-auth.js";const K=`(async () => {
|
|
2
|
+
try {
|
|
3
|
+
let token = '';
|
|
4
|
+
const raw = localStorage.getItem('userToken');
|
|
5
|
+
if (raw) { try { token = JSON.parse(raw).value || ''; } catch { token = raw; } }
|
|
6
|
+
if (!token) return { kind: 'auth', detail: 'DeepSeek userToken missing from localStorage — anonymous' };
|
|
7
|
+
const r = await fetch('/api/v0/users/current', {
|
|
8
|
+
headers: { Authorization: 'Bearer ' + token, Accept: 'application/json' },
|
|
9
|
+
});
|
|
10
|
+
if (r.status === 401 || r.status === 403) return { kind: 'auth', detail: 'DeepSeek users/current HTTP ' + r.status };
|
|
11
|
+
if (!r.ok) return { kind: 'http', httpStatus: r.status };
|
|
12
|
+
const d = await r.json();
|
|
13
|
+
if (!d || d.code !== 0) return { kind: 'auth', detail: 'DeepSeek users/current code=' + String(d && d.code) + ' — anonymous' };
|
|
14
|
+
const u = (d.data && (d.data.biz_data || d.data.user || d.data)) || {};
|
|
15
|
+
const userId = String(u.id || u.user_id || u.uuid || '');
|
|
16
|
+
const name = String(u.name || u.nickname || u.username || '');
|
|
17
|
+
if (!userId && !name) return { kind: 'render-error', detail: 'DeepSeek users/current ok but no id/name field — response shape drift' };
|
|
18
|
+
return { ok: true, user_id: userId, name };
|
|
19
|
+
} catch (e) {
|
|
20
|
+
return { kind: 'exception', detail: String(e && e.message || e) };
|
|
21
|
+
}
|
|
22
|
+
})()`;async function N(F){await F.goto("https://chat.deepseek.com/");await F.wait(2);const z=await F.evaluate(K);if(z?.kind==="auth")throw new J("chat.deepseek.com",z.detail);if(z?.kind==="http")throw new G(`HTTP ${z.httpStatus} from DeepSeek users/current`);if(z?.kind==="render-error")throw new G(z.detail);if(z?.kind==="exception")throw new G(`DeepSeek whoami failed: ${z.detail}`);if(!z?.ok)throw new G(`Unexpected DeepSeek probe: ${JSON.stringify(z)}`);return{user_id:z.user_id,name:z.name}}L({site:"deepseek",domain:"chat.deepseek.com",loginUrl:"https://chat.deepseek.com/sign_in",columns:["user_id","name"],verify:N,poll:async(F)=>{const z=await F.evaluate(K);if(!z?.ok)throw new J("chat.deepseek.com","Waiting for DeepSeek login");return{user_id:z.user_id,name:z.name}}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as B,Strategy as F}from"@jackwener/opencli/registry";import{EmptyResultError as H}from"@jackwener/opencli/errors";import{DEEPSEEK_DOMAIN as J,MESSAGE_SELECTOR as Q,ensureOnDeepSeek as U,getVisibleMessages as W,parseDeepSeekConversationId as X}from"./utils.js";export const detailCommand=B({site:"deepseek",name:"detail",access:"read",description:"Read a specific DeepSeek conversation by ID",domain:J,strategy:F.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"id",required:!0,positional:!0,help:"Conversation ID (UUID) or full /a/chat/s/<id> URL"}],columns:["Role","Text"],func:async(f,z)=>{const q=X(z.id);await U(f);await f.goto(`https://chat.deepseek.com/a/chat/s/${q}`);try{await f.wait({selector:Q,timeout:10})}catch{}const x=await W(f);if(x.length===0)throw new H("deepseek detail",`No visible messages found for conversation ${q}. Verify the ID is correct and that you are logged in.`);return x}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as o,Strategy as r}from"@jackwener/opencli/registry";import{DEEPSEEK_DOMAIN as n,getConversationList as a}from"./utils.js";export const historyCommand=o({site:"deepseek",name:"history",access:"read",description:"List conversation history from DeepSeek sidebar",domain:n,strategy:r.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[{name:"limit",type:"int",default:20,help:"Max conversations to show"}],columns:["Index","Title","Url"],func:async(t,i)=>{const s=Math.max(1,i.limit||20),e=await a(t);if(e.length===0)return[{Index:0,Title:"No conversation history found.",Url:""}];return e.slice(0,s)}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as f,Strategy as q}from"@jackwener/opencli/registry";import{CommandExecutionError as v}from"@jackwener/opencli/errors";import{DEEPSEEK_DOMAIN as z,DEEPSEEK_URL as B,TEXTAREA_SELECTOR as F}from"./utils.js";export const newCommand=f({site:"deepseek",name:"new",access:"read",description:"Start a new conversation in DeepSeek",domain:z,strategy:q.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[],columns:["Status"],func:async(b)=>{await b.goto(B);try{await b.wait({selector:F,timeout:8})}catch{throw new v("DeepSeek composer did not mount within 8 s","Verify you are logged into chat.deepseek.com.")}return[{Status:"New chat started"}]}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cli as v,Strategy as x}from"@jackwener/opencli/registry";import{DEEPSEEK_DOMAIN as z,ensureOnDeepSeek as B,getVisibleMessages as C}from"./utils.js";export const readCommand=v({site:"deepseek",name:"read",access:"read",description:"Read the current DeepSeek conversation",domain:z,strategy:x.COOKIE,browser:!0,siteSession:"persistent",navigateBefore:!1,args:[],columns:["Role","Text"],func:async(h)=>{await B(h);const q=await C(h);if(q.length>0)return q;return[{Role:"system",Text:"No visible messages found."}]}});
|