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,75 @@
|
|
|
1
|
+
import*as H from"node:fs";import*as J from"node:path";import{PKG_VERSION as L}from"./version.js";export function createPluginScaffold(b,x={}){if(!/^[a-z][a-z0-9-]*$/.test(b))throw Error(`Invalid plugin name "${b}". Plugin names must start with a lowercase letter and contain only lowercase letters, digits, and hyphens.`);const q=x.dir?J.resolve(x.dir):J.resolve(b);if(H.existsSync(q)&&H.readdirSync(q).length>0)throw Error(`Directory "${q}" already exists and is not empty.`);H.mkdirSync(q,{recursive:!0});const z=[],Q={name:b,version:"0.1.0",description:x.description??`An opencli plugin: ${b}`,opencli:`>=${L}`};B(q,"opencli-plugin.json",JSON.stringify(Q,null,2)+`
|
|
2
|
+
`);z.push("opencli-plugin.json");const U={name:`opencli-plugin-${b}`,version:"0.1.0",type:"module",description:x.description??`An opencli plugin: ${b}`,peerDependencies:{"@jackwener/opencli":`>=${L}`}};B(q,"package.json",JSON.stringify(U,null,2)+`
|
|
3
|
+
`);z.push("package.json");const W=`/**
|
|
4
|
+
* Sample pipeline command for ${b}.
|
|
5
|
+
* Demonstrates the declarative pipeline API.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { cli, Strategy } from '@jackwener/opencli/registry';
|
|
9
|
+
|
|
10
|
+
cli({
|
|
11
|
+
site: '${b}',
|
|
12
|
+
name: 'hello',
|
|
13
|
+
description: 'A sample pipeline command',
|
|
14
|
+
strategy: Strategy.PUBLIC,
|
|
15
|
+
browser: false,
|
|
16
|
+
columns: ['greeting'],
|
|
17
|
+
pipeline: [
|
|
18
|
+
{ fetch: { url: 'https://httpbin.org/get?greeting=hello' } },
|
|
19
|
+
{ select: 'args' },
|
|
20
|
+
],
|
|
21
|
+
});
|
|
22
|
+
`;B(q,"hello.ts",W);z.push("hello.ts");const X=`/**
|
|
23
|
+
* Sample TypeScript command for ${b}.
|
|
24
|
+
* Demonstrates the programmatic cli() registration API.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import { cli, Strategy } from '@jackwener/opencli/registry';
|
|
28
|
+
|
|
29
|
+
cli({
|
|
30
|
+
site: '${b}',
|
|
31
|
+
name: 'greet',
|
|
32
|
+
description: 'Greet someone by name',
|
|
33
|
+
strategy: Strategy.PUBLIC,
|
|
34
|
+
browser: false,
|
|
35
|
+
args: [
|
|
36
|
+
{ name: 'name', positional: true, required: true, help: 'Name to greet' },
|
|
37
|
+
],
|
|
38
|
+
columns: ['greeting'],
|
|
39
|
+
func: async (kwargs) => [{ greeting: \`Hello, \${String(kwargs.name ?? 'World')}!\` }],
|
|
40
|
+
});
|
|
41
|
+
`;B(q,"greet.ts",X);z.push("greet.ts");const Y=`# opencli-plugin-${b}
|
|
42
|
+
|
|
43
|
+
${x.description??`An opencli plugin: ${b}`}
|
|
44
|
+
|
|
45
|
+
## Install
|
|
46
|
+
|
|
47
|
+
\`\`\`bash
|
|
48
|
+
# From local development directory
|
|
49
|
+
opencli plugin install file://${q}
|
|
50
|
+
|
|
51
|
+
# From GitHub (after publishing)
|
|
52
|
+
opencli plugin install github:<user>/opencli-plugin-${b}
|
|
53
|
+
\`\`\`
|
|
54
|
+
|
|
55
|
+
## Commands
|
|
56
|
+
|
|
57
|
+
| Command | Type | Description |
|
|
58
|
+
|---------|------|-------------|
|
|
59
|
+
| \`${b}/hello\` | Pipeline | Sample pipeline command |
|
|
60
|
+
| \`${b}/greet\` | TypeScript | Sample TS command with func() |
|
|
61
|
+
|
|
62
|
+
## Development
|
|
63
|
+
|
|
64
|
+
\`\`\`bash
|
|
65
|
+
# Install locally for development (symlinked, changes reflect immediately)
|
|
66
|
+
opencli plugin install file://${q}
|
|
67
|
+
|
|
68
|
+
# Verify commands are registered
|
|
69
|
+
opencli list | grep ${b}
|
|
70
|
+
|
|
71
|
+
# Run a command
|
|
72
|
+
opencli ${b} hello
|
|
73
|
+
opencli ${b} greet --name World
|
|
74
|
+
\`\`\`
|
|
75
|
+
`;B(q,"README.md",Y);z.push("README.md");return{name:b,dir:q,files:z}}function B(b,x,q){H.writeFileSync(J.join(b,x),q)}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin management: install, uninstall, and list plugins.
|
|
3
|
+
*
|
|
4
|
+
* Plugins live in ~/.opencli/plugins/<name>/.
|
|
5
|
+
* Monorepo clones live in ~/.opencli/monorepos/<repo-name>/.
|
|
6
|
+
* Install source format: "github:user/repo", "github:user/repo/subplugin",
|
|
7
|
+
* "https://github.com/user/repo", "file:///local/plugin", or a local directory path.
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from 'node:fs';
|
|
10
|
+
/** Path to the lock file that tracks installed plugin versions. */
|
|
11
|
+
export declare function getLockFilePath(): string;
|
|
12
|
+
/** Monorepo clones directory: ~/.opencli/monorepos/ */
|
|
13
|
+
export declare function getMonoreposDir(): string;
|
|
14
|
+
export type PluginSourceRecord = {
|
|
15
|
+
kind: 'git';
|
|
16
|
+
url: string;
|
|
17
|
+
} | {
|
|
18
|
+
kind: 'local';
|
|
19
|
+
path: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'monorepo';
|
|
22
|
+
url: string;
|
|
23
|
+
repoName: string;
|
|
24
|
+
subPath: string;
|
|
25
|
+
};
|
|
26
|
+
export interface LockEntry {
|
|
27
|
+
source: PluginSourceRecord;
|
|
28
|
+
commitHash: string;
|
|
29
|
+
installedAt: string;
|
|
30
|
+
updatedAt?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface PluginInfo {
|
|
33
|
+
name: string;
|
|
34
|
+
path: string;
|
|
35
|
+
commands: string[];
|
|
36
|
+
source?: string;
|
|
37
|
+
version?: string;
|
|
38
|
+
installedAt?: string;
|
|
39
|
+
/** If from a monorepo, the monorepo name. */
|
|
40
|
+
monorepoName?: string;
|
|
41
|
+
/** Description from opencli-plugin.json. */
|
|
42
|
+
description?: string;
|
|
43
|
+
}
|
|
44
|
+
interface ParsedSource {
|
|
45
|
+
type: 'git' | 'local';
|
|
46
|
+
name: string;
|
|
47
|
+
subPlugin?: string;
|
|
48
|
+
cloneUrl?: string;
|
|
49
|
+
localPath?: string;
|
|
50
|
+
}
|
|
51
|
+
declare function isLocalPluginSource(source?: string): boolean;
|
|
52
|
+
declare function toStoredPluginSource(source: PluginSourceRecord): string;
|
|
53
|
+
declare function toLocalPluginSource(pluginDir: string): string;
|
|
54
|
+
declare function resolvePluginSource(lockEntry: LockEntry | undefined, pluginDir: string): PluginSourceRecord | undefined;
|
|
55
|
+
declare function resolveStoredPluginSource(lockEntry: LockEntry | undefined, pluginDir: string): string | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Move a directory, with EXDEV fallback.
|
|
58
|
+
* fs.renameSync fails when source and destination are on different
|
|
59
|
+
* filesystems (e.g. /tmp → ~/.opencli). In that case we copy then remove.
|
|
60
|
+
*/
|
|
61
|
+
type MoveDirFsOps = Pick<typeof fs, 'renameSync' | 'cpSync' | 'rmSync'>;
|
|
62
|
+
declare function moveDir(src: string, dest: string, fsOps?: MoveDirFsOps): void;
|
|
63
|
+
export interface ValidationResult {
|
|
64
|
+
valid: boolean;
|
|
65
|
+
errors: string[];
|
|
66
|
+
}
|
|
67
|
+
declare function readLockFileWithWriter(writeLock?: (lock: Record<string, LockEntry>) => void): Record<string, LockEntry>;
|
|
68
|
+
export declare function readLockFile(): Record<string, LockEntry>;
|
|
69
|
+
type WriteLockFileFsOps = Pick<typeof fs, 'mkdirSync' | 'writeFileSync' | 'renameSync' | 'rmSync'>;
|
|
70
|
+
declare function writeLockFileWithFs(lock: Record<string, LockEntry>, fsOps?: WriteLockFileFsOps): void;
|
|
71
|
+
export declare function writeLockFile(lock: Record<string, LockEntry>): void;
|
|
72
|
+
/** Get the HEAD commit hash of a git repo directory. */
|
|
73
|
+
export declare function getCommitHash(dir: string): string | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Validate that a downloaded plugin directory is a structurally valid plugin.
|
|
76
|
+
* Checks for at least one command file (.ts, .js) and a valid
|
|
77
|
+
* package.json if it contains .ts files.
|
|
78
|
+
*/
|
|
79
|
+
export declare function validatePluginStructure(pluginDir: string): ValidationResult;
|
|
80
|
+
declare function installDependencies(dir: string): void;
|
|
81
|
+
/**
|
|
82
|
+
* Monorepo lifecycle: install shared deps at repo root, then install and finalize each sub-plugin.
|
|
83
|
+
*
|
|
84
|
+
* The root install covers monorepos that use npm workspaces to hoist dependencies.
|
|
85
|
+
* For monorepos that do NOT use workspaces, sub-plugins may declare their own
|
|
86
|
+
* production dependencies in their package.json. We install those per sub-plugin
|
|
87
|
+
* so that runtime imports (e.g. `undici`) can be resolved from the sub-plugin
|
|
88
|
+
* directory. When the root already satisfies all deps this is a fast no-op.
|
|
89
|
+
*/
|
|
90
|
+
declare function postInstallMonorepoLifecycle(repoDir: string, pluginDirs: string[]): void;
|
|
91
|
+
/**
|
|
92
|
+
* Install a plugin from a source.
|
|
93
|
+
* Supports:
|
|
94
|
+
* "github:user/repo" — single plugin or full monorepo
|
|
95
|
+
* "github:user/repo/subplugin" — specific sub-plugin from a monorepo
|
|
96
|
+
* "https://github.com/user/repo"
|
|
97
|
+
* "file:///absolute/path" — local plugin directory (symlinked)
|
|
98
|
+
* "/absolute/path" — local plugin directory (symlinked)
|
|
99
|
+
*
|
|
100
|
+
* Returns the installed plugin name(s).
|
|
101
|
+
*/
|
|
102
|
+
export declare function installPlugin(source: string): string | string[];
|
|
103
|
+
/**
|
|
104
|
+
* Install a local plugin by creating a symlink.
|
|
105
|
+
* Used for plugin development: the source directory is symlinked into
|
|
106
|
+
* the plugins dir so changes are reflected immediately.
|
|
107
|
+
*/
|
|
108
|
+
declare function installLocalPlugin(localPath: string, name: string): string;
|
|
109
|
+
/**
|
|
110
|
+
* Uninstall a plugin by name.
|
|
111
|
+
* For monorepo sub-plugins: removes symlink and cleans up the monorepo
|
|
112
|
+
* directory when no more sub-plugins reference it.
|
|
113
|
+
*/
|
|
114
|
+
export declare function uninstallPlugin(name: string): void;
|
|
115
|
+
/** Synchronous check if a path is a symlink. */
|
|
116
|
+
declare function isSymlinkSync(p: string): boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Update a plugin by name (git pull + re-install lifecycle).
|
|
119
|
+
* For monorepo sub-plugins: pulls the monorepo root and re-runs lifecycle
|
|
120
|
+
* for all sub-plugins from the same monorepo.
|
|
121
|
+
*/
|
|
122
|
+
export declare function updatePlugin(name: string): void;
|
|
123
|
+
export interface UpdateResult {
|
|
124
|
+
name: string;
|
|
125
|
+
success: boolean;
|
|
126
|
+
error?: string;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Update all installed plugins.
|
|
130
|
+
* Continues even if individual plugin updates fail.
|
|
131
|
+
*/
|
|
132
|
+
export declare function updateAllPlugins(): UpdateResult[];
|
|
133
|
+
/**
|
|
134
|
+
* List all installed plugins.
|
|
135
|
+
* Reads opencli-plugin.json for description/version when available.
|
|
136
|
+
*/
|
|
137
|
+
export declare function listPlugins(): PluginInfo[];
|
|
138
|
+
/** Parse a plugin source string into clone URL, repo name, and optional sub-plugin. */
|
|
139
|
+
declare function parseSource(source: string): ParsedSource | null;
|
|
140
|
+
/**
|
|
141
|
+
* Resolve the path to the esbuild CLI executable with fallback strategies.
|
|
142
|
+
*/
|
|
143
|
+
export declare function resolveEsbuildBin(): string | null;
|
|
144
|
+
declare function resolveHostOpencliRoot(startFile?: string): string;
|
|
145
|
+
export { resolveHostOpencliRoot as _resolveHostOpencliRoot, resolveEsbuildBin as _resolveEsbuildBin, getCommitHash as _getCommitHash, installDependencies as _installDependencies, parseSource as _parseSource, postInstallMonorepoLifecycle as _postInstallMonorepoLifecycle, readLockFile as _readLockFile, readLockFileWithWriter as _readLockFileWithWriter, updateAllPlugins as _updateAllPlugins, validatePluginStructure as _validatePluginStructure, writeLockFile as _writeLockFile, writeLockFileWithFs as _writeLockFileWithFs, isSymlinkSync as _isSymlinkSync, getMonoreposDir as _getMonoreposDir, installLocalPlugin as _installLocalPlugin, isLocalPluginSource as _isLocalPluginSource, moveDir as _moveDir, resolvePluginSource as _resolvePluginSource, resolveStoredPluginSource as _resolveStoredPluginSource, toStoredPluginSource as _toStoredPluginSource, toLocalPluginSource as _toLocalPluginSource, };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import*as X from"node:fs";import*as u from"node:os";import*as B from"node:path";import{execSync as r,execFileSync as v}from"node:child_process";import{fileURLToPath as f}from"node:url";import{PLUGINS_DIR as x}from"./discovery.js";import{getErrorMessage as U,PluginError as G}from"./errors.js";import{log as T}from"./logger.js";import{isRecord as L}from"./utils.js";import{readPluginManifest as F,isMonorepo as b,getEnabledPlugins as i,checkCompatibility as O}from"./plugin-manifest.js";const I=process.platform==="win32",P="local:";function c(){return process.env.HOME||process.env.USERPROFILE||u.homedir()}export function getLockFilePath(){return B.join(c(),".opencli","plugins.lock.json")}export function getMonoreposDir(){return B.join(c(),".opencli","monorepos")}function k(q){if(!q)return;if(q.startsWith(P))return{kind:"local",path:B.resolve(q.slice(P.length))};return{kind:"git",url:q}}function isLocalPluginSource(q){return k(q)?.kind==="local"}function toStoredPluginSource(q){if(q.kind==="local")return`${P}${B.resolve(q.path)}`;return q.url}function toLocalPluginSource(q){return toStoredPluginSource({kind:"local",path:q})}function e(q){if(!L(q))return;if(typeof q.name!=="string"||typeof q.subPath!=="string")return;return{name:q.name,subPath:q.subPath}}function qq(q,K){if(typeof q==="string"){const Q=k(q);if(!Q)return;if(Q.kind==="git"&&K)return{kind:"monorepo",url:Q.url,repoName:K.name,subPath:K.subPath};return Q}if(!L(q)||typeof q.kind!=="string")return;switch(q.kind){case"git":return typeof q.url==="string"?{kind:"git",url:q.url}:void 0;case"local":return typeof q.path==="string"?{kind:"local",path:B.resolve(q.path)}:void 0;case"monorepo":return typeof q.url==="string"&&typeof q.repoName==="string"&&typeof q.subPath==="string"?{kind:"monorepo",url:q.url,repoName:q.repoName,subPath:q.subPath}:void 0;default:return}}function Kq(q){if(!L(q))return;const K=e(q.monorepo),Q=qq(q.source,K);if(!Q)return;if(typeof q.commitHash!=="string"||typeof q.installedAt!=="string")return;const V={source:Q,commitHash:q.commitHash,installedAt:q.installedAt};if(typeof q.updatedAt==="string")V.updatedAt=q.updatedAt;return V}function resolvePluginSource(q,K){if(q)return q.source;return k(Wq(K))}function resolveStoredPluginSource(q,K){const Q=resolvePluginSource(q,K);return Q?toStoredPluginSource(Q):void 0}function moveDir(q,K,Q=X){try{Q.renameSync(q,K)}catch(V){if(V.code==="EXDEV"){try{Q.cpSync(q,K,{recursive:!0})}catch(Y){try{Q.rmSync(K,{recursive:!0,force:!0})}catch{}throw Y}Q.rmSync(q,{recursive:!0,force:!0})}else throw V}}function S(q,K){const Q=`${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`;return B.join(B.dirname(q),`.${B.basename(q)}.${K}-${Q}`)}function Qq(q){const K=B.join(u.tmpdir(),`opencli-clone-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`);try{v("git",["clone","--depth","1",q,K],{encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(Q){throw new G(`Failed to clone plugin: ${U(Q)}`,"Check the repository URL and your network connection.")}return K}function d(q,K){const Q=Qq(q);try{return K(Q)}finally{try{X.rmSync(Q,{recursive:!0,force:!0})}catch{}}}function Vq(q,K){const Q=resolvePluginSource(q,K);if(!Q||Q.kind==="local")throw Error(`Unable to determine remote source for plugin at ${K}`);return Q.url}function y(q){try{X.lstatSync(q);return!0}catch{return!1}}function C(q,K){const Q=B.resolve(q,K);if(!Q.startsWith(q+B.sep)&&Q!==q)throw new G(`Plugin path "${K}" escapes repo root.`);return Q}function D(q){try{if(X.lstatSync(q).isSymbolicLink()){X.unlinkSync(q);return}X.rmSync(q,{recursive:!0,force:!0})}catch{}}class t{#K=[];#q=!1;track(q){this.#K.push(q);return q}commit(){if(this.#q)return;this.#q=!0;for(const q of this.#K)q.finalize()}rollback(){if(this.#q)return;this.#q=!0;for(const q of[...this.#K].reverse())q.rollback()}}function p(q){const K=new t;try{const Q=q(K);K.commit();return Q}catch(Q){K.rollback();throw Q}}function a(q,K,Q=X){const V=Q.existsSync(K);Q.mkdirSync(B.dirname(K),{recursive:!0});const Y=S(K,"tmp"),Z=V?S(K,"bak"):null;let J=!1;try{moveDir(q,Y,Q);if(Z)Q.renameSync(K,Z);Q.renameSync(Y,K)}catch($){try{Q.rmSync(Y,{recursive:!0,force:!0})}catch{}if(Z&&!Q.existsSync(K))try{Q.renameSync(Z,K)}catch{}throw $}return{finalize(){if(J)return;J=!0;if(Z)try{Q.rmSync(Z,{recursive:!0,force:!0})}catch{}},rollback(){if(J)return;J=!0;try{Q.rmSync(K,{recursive:!0,force:!0})}catch{}if(Z)try{Q.renameSync(Z,K)}catch{}try{Q.rmSync(Y,{recursive:!0,force:!0})}catch{}}}}function Yq(q,K){const Q=y(K);if(Q&&!isSymlinkSync(K))throw Error(`Expected monorepo plugin link at ${K} to be a symlink`);X.mkdirSync(B.dirname(K),{recursive:!0});const V=S(K,"tmp"),Y=Q?S(K,"bak"):null,Z=I?"junction":"dir";let J=!1;try{X.symlinkSync(q,V,Z);if(Y)X.renameSync(K,Y);X.renameSync(V,K)}catch($){D(V);if(Y&&!y(K))try{X.renameSync(Y,K)}catch{}throw $}return{finalize(){if(J)return;J=!0;if(Y)D(Y)},rollback(){if(J)return;J=!0;D(K);if(Y&&!y(K))try{X.renameSync(Y,K)}catch{}D(V)}}}function readLockFileWithWriter(q=writeLockFile){try{const K=X.readFileSync(getLockFilePath(),"utf-8"),Q=JSON.parse(K);if(!L(Q))return{};const V={};let Y=!1;for(const[Z,J]of Object.entries(Q)){const $=Kq(J);if(!$){Y=!0;continue}V[Z]=$;if(JSON.stringify(J)!==JSON.stringify($))Y=!0}if(Y)try{q(V)}catch{}return V}catch{return{}}}export function readLockFile(){return readLockFileWithWriter(writeLockFile)}function writeLockFileWithFs(q,K=X){const Q=getLockFilePath();K.mkdirSync(B.dirname(Q),{recursive:!0});const V=S(Q,"tmp");try{K.writeFileSync(V,JSON.stringify(q,null,2)+`
|
|
2
|
+
`);K.renameSync(V,Q)}catch(Y){try{K.rmSync(V,{force:!0})}catch{}throw Y}}export function writeLockFile(q){writeLockFileWithFs(q,X)}export function getCommitHash(q){try{return v("git",["rev-parse","HEAD"],{cwd:q,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return}}export function validatePluginStructure(q){const K=[];if(!X.existsSync(q))return{valid:!1,errors:["Plugin directory does not exist"]};const Q=X.readdirSync(q),V=Q.some((Z)=>Z.endsWith(".ts")&&!Z.endsWith(".d.ts")&&!Z.endsWith(".test.ts")),Y=Q.some((Z)=>Z.endsWith(".js")&&!Z.endsWith(".d.js"));if(!V&&!Y)K.push("No command files found in plugin directory. A plugin must contain at least one .ts or .js command file.");if(V){const Z=B.join(q,"package.json");if(!X.existsSync(Z))K.push('Plugin contains .ts files but no package.json. A package.json with "type": "module" and "@jackwener/opencli" peer dependency is required for TS plugins.');else try{if(JSON.parse(X.readFileSync(Z,"utf-8")).type!=="module")K.push('Plugin package.json must have "type": "module" for TypeScript plugins.')}catch{K.push("Plugin package.json is malformed or invalid JSON.")}}return{valid:K.length===0,errors:K}}function Zq(q){const K=B.join(q,"package.json");if(!X.existsSync(K))return!1;try{const Q=JSON.parse(X.readFileSync(K,"utf-8"));return Q.dependencies!=null&&Object.keys(Q.dependencies).length>0}catch{return!1}}function installDependencies(q){const K=B.join(q,"package.json");if(!X.existsSync(K))return;try{v("npm",["install","--omit=dev"],{cwd:q,encoding:"utf-8",stdio:["pipe","pipe","pipe"],...I&&{shell:!0}})}catch(Q){throw new G(`npm install failed in ${q}: ${U(Q)}`,"Check your network connection and npm configuration.")}}function h(q){Gq(q);_q(q)}function s(q){installDependencies(q);h(q)}function postInstallMonorepoLifecycle(q,K){installDependencies(q);for(const Q of K){if(Q!==q&&Zq(Q))installDependencies(Q);h(Q)}}function n(q){const K=validatePluginStructure(q);if(!K.valid)throw new G(`Invalid plugin structure:
|
|
3
|
+
- ${K.errors.join(`
|
|
4
|
+
- `)}`);s(q)}function M(q,K,Q){q[K]={...Q,installedAt:Q.installedAt??new Date().toISOString()}}function o(q,K,Q){p((V)=>{V.track(a(q,K));Q(getCommitHash(K))})}function l(q,K,Q,V,Y){p((Z)=>{if(V){X.mkdirSync(V.parentDir,{recursive:!0});Z.track(a(V.stagingDir,q))}const J=getCommitHash(q);for(const $ of Q){const A=B.join(K,$.name),z=C(q,$.subPath);Z.track(Yq(z,A))}Y?.(J)})}export function installPlugin(q){const K=parseSource(q);if(!K)throw Error(`Invalid plugin source: "${q}"
|
|
5
|
+
Supported formats:
|
|
6
|
+
github:user/repo
|
|
7
|
+
github:user/repo/subplugin
|
|
8
|
+
https://github.com/user/repo
|
|
9
|
+
https://<host>/<path>/repo.git
|
|
10
|
+
ssh://git@<host>/<path>/repo.git
|
|
11
|
+
git@<host>:user/repo.git
|
|
12
|
+
file:///absolute/path
|
|
13
|
+
/absolute/path`);const{name:Q,subPlugin:V}=K;if(K.type==="local")return installLocalPlugin(K.localPath,Q);return d(K.cloneUrl,(Y)=>{const Z=F(Y);if(Z?.opencli&&!O(Z.opencli))throw Error(`Plugin requires opencli ${Z.opencli}, but current version is incompatible.`);if(Z&&b(Z))return Jq(Y,K.cloneUrl,Q,Z,V);return $q(Y,K.cloneUrl,Q,Z)})}function $q(q,K,Q,V){const Y=V?.name??Q,Z=B.join(x,Y);if(X.existsSync(Z))throw new G(`Plugin "${Y}" is already installed at ${Z}`,'Use "opencli plugin uninstall" first, or pick a different name.');n(q);o(q,Z,(J)=>{const $=readLockFile();if(J){M($,Y,{source:{kind:"git",url:K},commitHash:J});writeLockFile($)}});return Y}function installLocalPlugin(q,K){if(!X.existsSync(q))throw new G(`Local plugin path does not exist: ${q}`);if(!X.statSync(q).isDirectory())throw new G(`Local plugin path is not a directory: ${q}`);const V=F(q);if(V?.opencli&&!O(V.opencli))throw new G(`Plugin requires opencli ${V.opencli}, but current version is incompatible.`,"Upgrade opencli to a compatible version.");const Y=V?.name??K,Z=B.join(x,Y);if(X.existsSync(Z))throw new G(`Plugin "${Y}" is already installed at ${Z}`,'Use "opencli plugin uninstall" first, or pick a different name.');const J=validatePluginStructure(q);if(!J.valid)throw new G(`Invalid plugin structure:
|
|
14
|
+
- ${J.errors.join(`
|
|
15
|
+
- `)}`);X.mkdirSync(x,{recursive:!0});const $=B.resolve(q),A=I?"junction":"dir";X.symlinkSync($,Z,A);installDependencies(q);h(q);const z=readLockFile(),j=getCommitHash(q);M(z,Y,{source:{kind:"local",path:$},commitHash:j??"local"});writeLockFile(z);return Y}function Xq(q,K,Q,V){const Y=X.realpathSync(K),Z=validatePluginStructure(Y);if(!Z.valid)T.warn(`Plugin "${q}" structure invalid:
|
|
16
|
+
- ${Z.errors.join(`
|
|
17
|
+
- `)}`);s(Y);M(Q,q,{source:V?.source??{kind:"local",path:Y},commitHash:getCommitHash(Y)??"local",installedAt:V?.installedAt??new Date().toISOString(),updatedAt:new Date().toISOString()});writeLockFile(Q)}function Jq(q,K,Q,V,Y){const Z=getMonoreposDir(),J=B.join(Z,Q),$=X.existsSync(J),A=$?J:q,z=$?F(J):V;if(!z||!b(z))throw new G(`Monorepo manifest missing or invalid at ${A}`);let j=i(z);if(Y){j=j.filter((W)=>W.name===Y);if(j.length===0){if(z.plugins?.[Y])throw new G(`Sub-plugin "${Y}" is disabled in the manifest.`);throw new G(`Sub-plugin "${Y}" not found in monorepo. Available: ${Object.keys(z.plugins??{}).join(", ")}`)}}const w=[],H=readLockFile(),N=[];X.mkdirSync(x,{recursive:!0});for(const{name:W,entry:_}of j){if(_.opencli&&!O(_.opencli)){T.warn(`Skipping "${W}": requires opencli ${_.opencli}`);continue}let E;try{E=C(A,_.path)}catch{T.warn(`Skipping "${W}": path "${_.path}" escapes repo root.`);continue}if(!X.existsSync(E)){T.warn(`Skipping "${W}": path "${_.path}" not found in repo.`);continue}const m=validatePluginStructure(E);if(!m.valid){T.warn(`Skipping "${W}": invalid structure — ${m.errors.join(", ")}`);continue}const g=B.join(x,W);if(X.existsSync(g)){T.warn(`Skipping "${W}": already installed at ${g}`);continue}N.push({name:W,entry:_})}if(N.length===0)return w;const R=N.map(({name:W,entry:_})=>({name:W,subPath:_.path}));if($)postInstallMonorepoLifecycle(J,N.map((W)=>C(J,W.entry.path)));else postInstallMonorepoLifecycle(q,N.map((W)=>C(q,W.entry.path)));l(J,x,R,$?void 0:{stagingDir:q,parentDir:Z},(W)=>{for(const{name:_,entry:E}of N){if(W)M(H,_,{source:{kind:"monorepo",url:K,repoName:Q,subPath:E.path},commitHash:W});w.push(_)}writeLockFile(H)});return w}function Bq(q,K,Q,V,Y){const Z=[];for(const[J,$]of Object.entries(K)){if($.source.kind!=="monorepo"||$.source.repoName!==q)continue;const A=Q.plugins?.[J];if(!A||A.disabled)throw Error(`Installed sub-plugin "${J}" no longer exists in ${V}`);if(A.opencli&&!O(A.opencli))throw Error(`Sub-plugin "${J}" requires opencli ${A.opencli}`);const z=C(Y,A.path),j=validatePluginStructure(z);if(!j.valid)throw Error(`Updated sub-plugin "${J}" is invalid:
|
|
18
|
+
- ${j.errors.join(`
|
|
19
|
+
- `)}`);Z.push({name:J,lockEntry:$,manifestEntry:A})}return Z}function Aq(q,K,Q,V,Y){for(const Z of K){if(!Y)continue;M(q,Z.name,{...Z.lockEntry,source:{kind:"monorepo",url:Q,repoName:V,subPath:Z.manifestEntry.path},commitHash:Y,updatedAt:new Date().toISOString()})}}function zq(q,K,Q,V,Y){if(!Y)return;M(q,K,{source:{kind:"git",url:Q},commitHash:Y,installedAt:V?.installedAt??new Date().toISOString(),updatedAt:new Date().toISOString()})}export function uninstallPlugin(q){const K=B.join(x,q);if(!y(K))throw Error(`Plugin "${q}" is not installed.`);const Q=readLockFile(),V=Q[q];if(isSymlinkSync(K))X.unlinkSync(K);else X.rmSync(K,{recursive:!0,force:!0});if(V?.source.kind==="monorepo"){delete Q[q];const Z=V.source.repoName;if(!Object.values(Q).some(($)=>$.source.kind==="monorepo"&&$.source.repoName===Z)){const $=B.join(getMonoreposDir(),Z);try{X.rmSync($,{recursive:!0,force:!0})}catch{}}}else if(Q[q])delete Q[q];writeLockFile(Q)}function isSymlinkSync(q){try{return X.lstatSync(q).isSymbolicLink()}catch{return!1}}export function updatePlugin(q){const K=B.join(x,q);if(!X.existsSync(K))throw Error(`Plugin "${q}" is not installed.`);const Q=readLockFile(),V=Q[q],Y=resolvePluginSource(V,K);if(Y?.kind==="local"){Xq(q,K,Q,V);return}if(Y?.kind==="monorepo"){const J=B.join(getMonoreposDir(),Y.repoName),$=Y.repoName,A=Y.url;d(A,(z)=>{const j=F(z);if(!j||!b(j))throw Error(`Updated source is no longer a monorepo: ${A}`);if(j.opencli&&!O(j.opencli))throw Error(`Plugin requires opencli ${j.opencli}, but current version is incompatible.`);const w=Bq($,Q,j,A,z);if(w.length>0)postInstallMonorepoLifecycle(z,w.map((H)=>C(z,H.manifestEntry.path)));l(J,x,w.map((H)=>({name:H.name,subPath:H.manifestEntry.path})),{stagingDir:z,parentDir:B.dirname(J)},(H)=>{Aq(Q,w,A,$,H);writeLockFile(Q)})});return}const Z=Vq(V,K);d(Z,(J)=>{const $=F(J);if($&&b($))throw Error(`Updated source is now a monorepo: ${Z}`);if($?.opencli&&!O($.opencli))throw Error(`Plugin requires opencli ${$.opencli}, but current version is incompatible.`);n(J);o(J,K,(A)=>{zq(Q,q,Z,Q[q],A);if(A)writeLockFile(Q)})})}export function updateAllPlugins(){return listPlugins().map((q)=>{try{updatePlugin(q.name);return{name:q.name,success:!0}}catch(K){return{name:q.name,success:!1,error:U(K)}}})}export function listPlugins(){if(!X.existsSync(x))return[];const q=X.readdirSync(x,{withFileTypes:!0}),K=readLockFile(),Q=[];for(const V of q){const Y=B.join(x,V.name);if(!(V.isDirectory()||isSymlinkSync(Y)))continue;const J=jq(Y),$=K[V.name],A=F(Y);let z=A?.description,j=A?.version;if($?.source.kind==="monorepo"&&!z){const H=B.join(getMonoreposDir(),$.source.repoName),R=F(H)?.plugins?.[V.name];if(R){z=z??R.description;j=j??R.version}}const w=resolveStoredPluginSource($,Y);Q.push({name:V.name,path:Y,commands:J,source:w,version:j??$?.commitHash?.slice(0,7),installedAt:$?.installedAt,monorepoName:$?.source.kind==="monorepo"?$.source.repoName:void 0,description:z})}return Q}function jq(q){try{const K=X.readdirSync(q);return[...new Set(K.filter((V)=>V.endsWith(".ts")&&!V.endsWith(".d.ts")&&!V.endsWith(".test.ts")||V.endsWith(".js")&&!V.endsWith(".d.js")).map((V)=>B.basename(V,B.extname(V))))]}catch{return[]}}function Wq(q){try{return v("git",["config","--get","remote.origin.url"],{cwd:q,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}catch{return}}function parseSource(q){if(q.startsWith("file://"))try{const $=B.resolve(f(q));return{type:"local",localPath:$,name:B.basename($).replace(/^opencli-plugin-/,"")}}catch{return null}if(B.isAbsolute(q)){const $=B.resolve(q);return{type:"local",localPath:$,name:B.basename($).replace(/^opencli-plugin-/,"")}}const K=q.match(/^github:([\w.-]+)\/([\w.-]+)\/([\w.-]+)$/);if(K){const[,$,A,z]=K,j=A.replace(/^opencli-plugin-/,"");return{type:"git",cloneUrl:`https://github.com/${$}/${A}.git`,name:j,subPlugin:z}}const Q=q.match(/^github:([\w.-]+)\/([\w.-]+)$/);if(Q){const[,$,A]=Q,z=A.replace(/^opencli-plugin-/,"");return{type:"git",cloneUrl:`https://github.com/${$}/${A}.git`,name:z}}const V=q.match(/^https?:\/\/github\.com\/([\w.-]+)\/([\w.-]+?)(?:\.git)?$/);if(V){const[,$,A]=V,z=A.replace(/^opencli-plugin-/,"");return{type:"git",cloneUrl:`https://github.com/${$}/${A}.git`,name:z}}const Y=q.match(/^ssh:\/\/[^/]+\/(.*?)(?:\.git)?$/);if(Y){const j=Y[1].split("/").pop().replace(/^opencli-plugin-/,"");return{type:"git",cloneUrl:q,name:j}}const Z=q.match(/^git@[^:]+:(.+?)(?:\.git)?$/);if(Z){const j=Z[1].split("/").pop().replace(/^opencli-plugin-/,"");return{type:"git",cloneUrl:q,name:j}}const J=q.match(/^https?:\/\/[^/]+\/(.+?)(?:\.git)?$/);if(J){const j=J[1].split("/").pop().replace(/^opencli-plugin-/,"");return{type:"git",cloneUrl:q.endsWith(".git")?q:`${q}.git`,name:j}}return null}function Gq(q){try{const K=resolveHostOpencliRoot(),Q=B.join(q,"node_modules","@jackwener","opencli");if(X.existsSync(Q))X.rmSync(Q,{recursive:!0,force:!0});X.mkdirSync(B.dirname(Q),{recursive:!0});const V=I?"junction":"dir";X.symlinkSync(K,Q,V);T.debug(`Linked host opencli into plugin: ${Q} → ${K}`)}catch(K){T.warn(`Failed to link host opencli into plugin: ${U(K)}`)}}export function resolveEsbuildBin(){const q=resolveHostOpencliRoot();if(I){const Q=B.join(q,"node_modules",".bin","esbuild.cmd");if(X.existsSync(Q))return Q}if(!I)try{const Q=import.meta.resolve("esbuild/package.json");if(Q.startsWith("file://")){const V=f(Q),Y=X.readFileSync(V,"utf8"),Z=JSON.parse(Y);if(Z.bin&&typeof Z.bin==="object"&&Z.bin.esbuild){const J=B.resolve(B.dirname(V),Z.bin.esbuild);if(X.existsSync(J))return J}else if(typeof Z.bin==="string"){const J=B.resolve(B.dirname(V),Z.bin);if(X.existsSync(J))return J}}}catch{}const K=B.join(q,"node_modules",".bin","esbuild");if(X.existsSync(K))return K;try{const V=r(I?"where esbuild":"which esbuild",{encoding:"utf-8",stdio:"pipe"}).trim().split(`
|
|
20
|
+
`)[0].trim();if(V&&X.existsSync(V))return V}catch{}return null}function resolveHostOpencliRoot(q=f(import.meta.url)){let K=B.dirname(q);while(!0){const Q=B.join(K,"package.json");if(X.existsSync(Q))try{if(JSON.parse(X.readFileSync(Q,"utf-8"))?.name==="@jackwener/opencli")return K}catch{}const V=B.dirname(K);if(V===K)break;K=V}return B.resolve(B.dirname(q),"..")}function _q(q){try{const K=resolveEsbuildBin();if(!K){T.warn("esbuild not found. TS plugin files will not be transpiled and may fail to load. Install esbuild (`npm i -g esbuild`) or ensure it is available in the opencli host node_modules.");return}const V=X.readdirSync(q).filter((Y)=>Y.endsWith(".ts")&&!Y.endsWith(".d.ts")&&!Y.endsWith(".test.ts"));for(const Y of V){const Z=Y.replace(/\.ts$/,".js"),J=B.join(q,Z);if(X.existsSync(J))continue;try{v(K,[Y,`--outfile=${Z}`,"--format=esm","--platform=node"],{cwd:q,encoding:"utf-8",stdio:["pipe","pipe","pipe"],...I&&{shell:!0}});T.debug(`Transpiled plugin file: ${Y} → ${Z}`)}catch($){T.warn(`Failed to transpile ${Y}: ${U($)}`)}}}catch(K){T.warn(`TS transpilation setup failed: ${U(K)}`)}}export{resolveHostOpencliRoot as _resolveHostOpencliRoot,resolveEsbuildBin as _resolveEsbuildBin,getCommitHash as _getCommitHash,installDependencies as _installDependencies,parseSource as _parseSource,postInstallMonorepoLifecycle as _postInstallMonorepoLifecycle,readLockFile as _readLockFile,readLockFileWithWriter as _readLockFileWithWriter,updateAllPlugins as _updateAllPlugins,validatePluginStructure as _validatePluginStructure,writeLockFile as _writeLockFile,writeLockFileWithFs as _writeLockFileWithFs,isSymlinkSync as _isSymlinkSync,getMonoreposDir as _getMonoreposDir,installLocalPlugin as _installLocalPlugin,isLocalPluginSource as _isLocalPluginSource,moveDir as _moveDir,resolvePluginSource as _resolvePluginSource,resolveStoredPluginSource as _resolveStoredPluginSource,toStoredPluginSource as _toStoredPluginSource,toLocalPluginSource as _toLocalPluginSource};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface RateLimitRule {
|
|
2
|
+
command: string;
|
|
3
|
+
limit: number;
|
|
4
|
+
windowMs: number;
|
|
5
|
+
}
|
|
6
|
+
export interface RateLimitOptions {
|
|
7
|
+
configPath?: string;
|
|
8
|
+
statePath?: string;
|
|
9
|
+
now?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function getRateLimitConfigPath(homeDir?: string): string;
|
|
12
|
+
export declare function getRateLimitStatePath(homeDir?: string): string;
|
|
13
|
+
export declare function enforceRateLimit(command: string, opts?: RateLimitOptions): void;
|
|
14
|
+
export declare function findRateLimitRule(command: string, configPath?: string): RateLimitRule | null;
|
|
15
|
+
export declare function loadRateLimitRules(configPath?: string): RateLimitRule[];
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import*as m from"node:fs";import*as p from"node:os";import*as f from"node:path";import $ from"js-yaml";import{ConfigError as s,RateLimitError as v,getErrorMessage as S}from"./errors.js";import{isRecord as l}from"./utils.js";const g="rate-limits.yaml",x="rate-limit-state.json";export function getRateLimitConfigPath(t=p.homedir()){return f.join(t,".opencli",g)}export function getRateLimitStatePath(t=p.homedir()){return f.join(t,".opencli",x)}export function enforceRateLimit(t,e={}){const r=e.configPath??getRateLimitConfigPath(),n=findRateLimitRule(t,r);if(!n)return;const o=e.statePath??getRateLimitStatePath(),i=e.now??Date.now(),a=M(o),c=Array.isArray(a.commands[t])?a.commands[t]:[],h=i-n.windowMs,u=c.filter((d)=>Number.isFinite(d)&&d>h);if(u.length>=n.limit){const d=Math.min(...u),b=Math.max(0,d+n.windowMs-i);a.commands[t]=u;y(o,a);throw new v(t,b,r)}a.commands[t]=[...u,i];y(o,a)}export function findRateLimitRule(t,e=getRateLimitConfigPath()){return loadRateLimitRules(e).find((n)=>n.command===t)??null}export function loadRateLimitRules(t=getRateLimitConfigPath()){if(!m.existsSync(t))return[];let e;try{e=$.load(m.readFileSync(t,"utf-8"))??{}}catch(n){throw new s(`Failed to parse ${t}: ${S(n)}`,"Fix the YAML syntax or remove the file to disable command rate limits.")}if(!l(e))throw new s(`Invalid ${t}: root value must be an object with a rules array.`);const r=e.rules;if(r===void 0)return[];if(!Array.isArray(r))throw new s(`Invalid ${t}: rules must be an array.`);return r.map((n,o)=>F(n,o,t))}function F(t,e,r){const n=`${r} rules[${e}]`;if(!l(t))throw new s(`Invalid ${n}: rule must be an object.`);const o=typeof t.command==="string"?t.command.trim():"";if(!o)throw new s(`Invalid ${n}: command must be a non-empty string.`);const i=Number(t.limit);if(!Number.isInteger(i)||i<=0)throw new s(`Invalid ${n}: limit must be a positive integer.`);if(typeof t.window!=="string"&&typeof t.window!=="number")throw new s(`Invalid ${n}: window must be a duration like 10m, 1h, or 500ms.`);return{command:o,limit:i,windowMs:I(t.window,`${n}.window`)}}function I(t,e){const r=String(t).trim(),n=/^(\d+(?:\.\d+)?)(ms|s|m|h)?$/.exec(r);if(!n)throw new s(`Invalid ${e}: expected a duration like 10m, 1h, or 500ms.`);const o=Number.parseFloat(n[1]),i=n[2]??"ms",c=Math.round(o*(i==="h"?3600000:i==="m"?60000:i==="s"?1000:1));if(!Number.isFinite(c)||c<=0)throw new s(`Invalid ${e}: duration must be greater than zero.`);return c}function M(t){if(!m.existsSync(t))return w();try{const e=JSON.parse(m.readFileSync(t,"utf-8"));if(!l(e)||!l(e.commands))return w();const r={};for(const[n,o]of Object.entries(e.commands)){if(!Array.isArray(o))continue;r[n]=o.filter((i)=>typeof i==="number"&&Number.isFinite(i))}return{version:1,commands:r}}catch{return w()}}function y(t,e){m.mkdirSync(f.dirname(t),{recursive:!0});const r=`${t}.${process.pid}.${Date.now()}.tmp`;m.writeFileSync(r,JSON.stringify(e,null,2)+`
|
|
2
|
+
`,"utf-8");m.renameSync(r,t)}function w(){return{version:1,commands:{}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public API for opencli plugins.
|
|
3
|
+
*
|
|
4
|
+
* TS plugins should import from '@jackwener/opencli/registry' which resolves to
|
|
5
|
+
* this file. It re-exports ONLY the core registration API — no serialization,
|
|
6
|
+
* no transitive side-effects — to avoid circular dependency deadlocks when
|
|
7
|
+
* plugins are dynamically imported during discoverPlugins().
|
|
8
|
+
*/
|
|
9
|
+
export { cli, Strategy, getRegistry, fullName, registerCommand } from './registry.js';
|
|
10
|
+
export type { CliCommand, Arg, CliOptions, CommandArgs, SiteSessionMode } from './registry.js';
|
|
11
|
+
export type { IPage } from './types.js';
|
|
12
|
+
export { onStartup, onBeforeExecute, onAfterExecute } from './hooks.js';
|
|
13
|
+
export type { HookFn, HookContext, HookName } from './hooks.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{cli,Strategy,getRegistry,fullName,registerCommand}from"./registry.js";export{onStartup,onBeforeExecute,onAfterExecute}from"./hooks.js";
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core registry: Strategy enum, Arg/CliCommand interfaces, cli() registration.
|
|
3
|
+
*/
|
|
4
|
+
import type { IPage } from './types.js';
|
|
5
|
+
export declare enum Strategy {
|
|
6
|
+
PUBLIC = "public",
|
|
7
|
+
LOCAL = "local",
|
|
8
|
+
COOKIE = "cookie",
|
|
9
|
+
INTERCEPT = "intercept",
|
|
10
|
+
UI = "ui"
|
|
11
|
+
}
|
|
12
|
+
export interface Arg {
|
|
13
|
+
name: string;
|
|
14
|
+
type?: string;
|
|
15
|
+
default?: unknown;
|
|
16
|
+
required?: boolean;
|
|
17
|
+
valueRequired?: boolean;
|
|
18
|
+
positional?: boolean;
|
|
19
|
+
help?: string;
|
|
20
|
+
choices?: string[];
|
|
21
|
+
}
|
|
22
|
+
export type CommandArgs = Record<string, any>;
|
|
23
|
+
export type BrowserCommandFunc = (page: IPage, kwargs: CommandArgs, debug?: boolean) => Promise<unknown>;
|
|
24
|
+
export type NonBrowserCommandFunc = (kwargs: CommandArgs, debug?: boolean) => Promise<unknown>;
|
|
25
|
+
export type CommandAccess = 'read' | 'write';
|
|
26
|
+
export type SiteSessionMode = 'ephemeral' | 'persistent';
|
|
27
|
+
export interface AuthStatusMetadata {
|
|
28
|
+
quickCheck?: BrowserCommandFunc;
|
|
29
|
+
refresh?: BrowserCommandFunc;
|
|
30
|
+
/** [pp-only] 标记「快检必须真实导航页面」的站点(jike/discord:登录态在
|
|
31
|
+
* localStorage/IndexedDB,cookie 罐里没有登录信号,走不了免导航快检)。
|
|
32
|
+
* 置为 true 时,后台批量/单站 `auth status`(quick)**不再开页探测**,直接返回
|
|
33
|
+
* status='unknown' / checked='navigation_required'——由调用方(桌面)改成按需探测
|
|
34
|
+
* (用户打开该平台或发布前才 `--full` whoami),彻底消除 20s 轮询反复弹这两个页。
|
|
35
|
+
* 不缓存:`--full` whoami 仍会真实导航,语义与登出即时可见一致。 */
|
|
36
|
+
quickCheckRequiresNavigation?: boolean;
|
|
37
|
+
}
|
|
38
|
+
interface BaseCliCommand {
|
|
39
|
+
site: string;
|
|
40
|
+
name: string;
|
|
41
|
+
aliases?: string[];
|
|
42
|
+
description: string;
|
|
43
|
+
access: CommandAccess;
|
|
44
|
+
/** Canonical invocation shown in agent-facing help. Generated when omitted. */
|
|
45
|
+
example?: string;
|
|
46
|
+
domain?: string;
|
|
47
|
+
strategy?: Strategy;
|
|
48
|
+
args: Arg[];
|
|
49
|
+
columns?: string[];
|
|
50
|
+
pipeline?: Record<string, unknown>[];
|
|
51
|
+
/** Origin of this command: 'yaml', 'ts', or plugin name. */
|
|
52
|
+
source?: string;
|
|
53
|
+
footerExtra?: (kwargs: CommandArgs) => string | undefined;
|
|
54
|
+
validateArgs?: (kwargs: CommandArgs) => void;
|
|
55
|
+
/**
|
|
56
|
+
* Control pre-navigation and browser-session requirement.
|
|
57
|
+
*
|
|
58
|
+
* After normalizeCommand() expands strategy, this field carries the
|
|
59
|
+
* resolved runtime intent:
|
|
60
|
+
*
|
|
61
|
+
* - `undefined`: no pre-navigation, browser session decided by pipeline steps
|
|
62
|
+
* - `false`: explicitly skip pre-navigation (adapter handles its own navigation)
|
|
63
|
+
* - `true`: needs authenticated browser context but no specific pre-nav URL
|
|
64
|
+
* (e.g. INTERCEPT/UI adapters, or COOKIE without domain)
|
|
65
|
+
* - `string`: pre-navigate to this URL before running the adapter
|
|
66
|
+
* (e.g. `'https://x.com'` for COOKIE strategy with domain)
|
|
67
|
+
*
|
|
68
|
+
* Adapter authors can set this explicitly to override the strategy-based default.
|
|
69
|
+
*/
|
|
70
|
+
navigateBefore?: boolean | string;
|
|
71
|
+
/** Site session lifecycle for adapter commands. */
|
|
72
|
+
siteSession?: SiteSessionMode;
|
|
73
|
+
/** Default browser window mode for commands whose UX requires visibility. */
|
|
74
|
+
defaultWindowMode?: 'foreground' | 'background';
|
|
75
|
+
/** Override the default CLI output format when the user does not pass -f/--format. */
|
|
76
|
+
defaultFormat?: 'table' | 'plain' | 'json' | 'yaml' | 'yml' | 'md' | 'markdown' | 'csv';
|
|
77
|
+
/** Optional auth-status metadata attached by shared auth adapters. */
|
|
78
|
+
authStatus?: AuthStatusMetadata;
|
|
79
|
+
}
|
|
80
|
+
export interface BrowserCliCommand extends BaseCliCommand {
|
|
81
|
+
/** Browser commands receive an IPage. Omitted means true after normalization. */
|
|
82
|
+
browser?: true;
|
|
83
|
+
func?: BrowserCommandFunc;
|
|
84
|
+
}
|
|
85
|
+
export interface NonBrowserCliCommand extends BaseCliCommand {
|
|
86
|
+
/** Non-browser commands do not receive a page argument. */
|
|
87
|
+
browser: false;
|
|
88
|
+
func?: NonBrowserCommandFunc;
|
|
89
|
+
}
|
|
90
|
+
export type CliCommand = BrowserCliCommand | NonBrowserCliCommand;
|
|
91
|
+
type RawCliCommand = BaseCliCommand & {
|
|
92
|
+
browser?: boolean;
|
|
93
|
+
func?: BrowserCommandFunc | NonBrowserCommandFunc;
|
|
94
|
+
};
|
|
95
|
+
/** Internal extension for lazy-loaded TS modules (not exposed in public API) */
|
|
96
|
+
export type InternalCliCommand = CliCommand & {
|
|
97
|
+
_lazy?: boolean;
|
|
98
|
+
_modulePath?: string;
|
|
99
|
+
};
|
|
100
|
+
type RequiredCliOptions = {
|
|
101
|
+
site: string;
|
|
102
|
+
name: string;
|
|
103
|
+
access: CommandAccess;
|
|
104
|
+
description?: string;
|
|
105
|
+
args?: Arg[];
|
|
106
|
+
};
|
|
107
|
+
type BrowserStrategy = Exclude<Strategy, Strategy.PUBLIC | Strategy.LOCAL>;
|
|
108
|
+
type BrowserCliOptions = Partial<Omit<BrowserCliCommand, 'args' | 'description' | 'browser' | 'strategy'>> & RequiredCliOptions & ({
|
|
109
|
+
browser: true;
|
|
110
|
+
strategy?: Strategy;
|
|
111
|
+
} | {
|
|
112
|
+
browser?: true;
|
|
113
|
+
strategy?: BrowserStrategy;
|
|
114
|
+
});
|
|
115
|
+
type NonBrowserCliOptions = Partial<Omit<NonBrowserCliCommand, 'args' | 'description'>> & RequiredCliOptions & ({
|
|
116
|
+
browser: false;
|
|
117
|
+
} | {
|
|
118
|
+
strategy: Strategy.PUBLIC | Strategy.LOCAL;
|
|
119
|
+
browser?: false;
|
|
120
|
+
});
|
|
121
|
+
export type CliOptions = BrowserCliOptions | NonBrowserCliOptions;
|
|
122
|
+
declare global {
|
|
123
|
+
var __opencli_registry__: Map<string, CliCommand> | undefined;
|
|
124
|
+
}
|
|
125
|
+
export declare function cli(opts: CliOptions): CliCommand;
|
|
126
|
+
export declare function getRegistry(): Map<string, CliCommand>;
|
|
127
|
+
export declare function fullName(cmd: Pick<BaseCliCommand, 'site' | 'name'>): string;
|
|
128
|
+
export declare function strategyLabel(cmd: CliCommand): string;
|
|
129
|
+
export declare function registerCommand(cmd: RawCliCommand): void;
|
|
130
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export var Strategy;(function(j){j.PUBLIC="public";j.LOCAL="local";j.COOKIE="cookie";j.INTERCEPT="intercept";j.UI="ui"})(Strategy||(Strategy={}));const H=globalThis.__opencli_registry__??=new Map;export function cli(j){const q={site:j.site,name:j.name,aliases:j.aliases,description:j.description??"",access:j.access,example:j.example,domain:j.domain,strategy:j.strategy,browser:j.browser,args:j.args??[],columns:j.columns,func:j.func,pipeline:j.pipeline,footerExtra:j.footerExtra,validateArgs:j.validateArgs,navigateBefore:j.navigateBefore,siteSession:j.siteSession,defaultWindowMode:j.defaultWindowMode,defaultFormat:j.defaultFormat,authStatus:j.authStatus};registerCommand(q);return H.get(fullName(q))}export function getRegistry(){return H}export function fullName(j){return`${j.site}/${j.name}`}export function strategyLabel(j){return j.strategy??Strategy.PUBLIC}function I(j){J(j);L(j);const q=j.strategy??(j.browser===!1?Strategy.PUBLIC:Strategy.COOKIE),F=j.browser??(q!==Strategy.PUBLIC&&q!==Strategy.LOCAL);let D=j.navigateBefore;if(D===void 0){if(q===Strategy.COOKIE&&j.domain)D=`https://${j.domain}`;else if(q!==Strategy.PUBLIC&&q!==Strategy.LOCAL)D=!0}return F?{...j,strategy:q,browser:!0,navigateBefore:D}:{...j,strategy:q,browser:!1,navigateBefore:D}}function J(j){if(j.access==="read"||j.access==="write")return;const q=`${j.site}/${j.name}`;throw Error(`Command ${q} must declare access: 'read' | 'write'`)}function L(j){if(j.siteSession===void 0)return;const q=`${j.site}/${j.name}`;if(j.siteSession!=="ephemeral"&&j.siteSession!=="persistent")throw Error(`Command ${q} siteSession must be one of: ephemeral, persistent`)}export function registerCommand(j){const q=I(j),F=fullName(q),D=H.get(F);if(D?.aliases)for(const E of D.aliases)H.delete(`${D.site}/${E}`);const G=M(q.aliases,q.name);q.aliases=G.length>0?G:void 0;H.set(F,q);for(const E of G)H.set(`${q.site}/${E}`,q)}function M(j,q){if(!Array.isArray(j)||j.length===0)return[];const F=new Set,D=[];for(const G of j){const E=typeof G==="string"?G.trim():"";if(!E||E===q||F.has(E))continue;F.add(E);D.push(E)}return D}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime detection — identify whether opencli is running under Node.js or Bun.
|
|
3
|
+
*
|
|
4
|
+
* Bun injects `globalThis.Bun` at startup, making detection trivial.
|
|
5
|
+
* This module centralises the check so other code can adapt behaviour
|
|
6
|
+
* (e.g. logging, diagnostics) without littering runtime sniffing everywhere.
|
|
7
|
+
*/
|
|
8
|
+
export type Runtime = 'bun' | 'node';
|
|
9
|
+
export declare const MIN_SUPPORTED_NODE_MAJOR = 20;
|
|
10
|
+
/**
|
|
11
|
+
* Detect the current JavaScript runtime.
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectRuntime(): Runtime;
|
|
14
|
+
/**
|
|
15
|
+
* Return a human-readable version string for the current runtime.
|
|
16
|
+
* Examples: "v22.13.0" (Node), "1.1.42" (Bun)
|
|
17
|
+
*/
|
|
18
|
+
export declare function getRuntimeVersion(): string;
|
|
19
|
+
/**
|
|
20
|
+
* Return a combined label like "node v22.13.0" or "bun 1.1.42".
|
|
21
|
+
*/
|
|
22
|
+
export declare function getRuntimeLabel(): string;
|
|
23
|
+
/**
|
|
24
|
+
* Parse a Node.js version string like "v22.13.0" and return its major version.
|
|
25
|
+
* Returns null for non-Node or malformed inputs.
|
|
26
|
+
*/
|
|
27
|
+
export declare function parseNodeMajor(version: string): number | null;
|
|
28
|
+
/**
|
|
29
|
+
* Whether the given Node.js version satisfies the current minimum support policy.
|
|
30
|
+
*/
|
|
31
|
+
export declare function isSupportedNodeVersion(version?: string): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const MIN_SUPPORTED_NODE_MAJOR=20;export function detectRuntime(){return globalThis.Bun!==void 0?"bun":"node"}export function getRuntimeVersion(){const k=globalThis.Bun;return k?k.version:process.version}export function getRuntimeLabel(){return`${detectRuntime()} ${getRuntimeVersion()}`}export function parseNodeMajor(k){const q=/^v?(\d+)\./.exec(String(k).trim());if(!q)return null;const w=Number(q[1]);return Number.isInteger(w)?w:null}export function isSupportedNodeVersion(k=process.version){const q=parseNodeMajor(k);return q!==null&&q>=MIN_SUPPORTED_NODE_MAJOR}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { IPage } from './types.js';
|
|
2
|
+
import { DEFAULT_BROWSER_COMMAND_TIMEOUT, DEFAULT_BROWSER_CONNECT_TIMEOUT } from './browser/config.js';
|
|
3
|
+
export { DEFAULT_BROWSER_COMMAND_TIMEOUT, DEFAULT_BROWSER_CONNECT_TIMEOUT };
|
|
4
|
+
/**
|
|
5
|
+
* Returns the appropriate browser factory based on site type.
|
|
6
|
+
* Uses CDPBridge for registered Electron apps, otherwise BrowserBridge.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getBrowserFactory(site?: string): new () => IBrowserFactory;
|
|
9
|
+
export type BrowserWindowMode = 'foreground' | 'background';
|
|
10
|
+
export type BrowserSurface = 'browser' | 'adapter';
|
|
11
|
+
/**
|
|
12
|
+
* Timeout with seconds unit. Used for high-level command timeouts.
|
|
13
|
+
*/
|
|
14
|
+
export declare function runWithTimeout<T>(promise: Promise<T>, opts: {
|
|
15
|
+
timeout: number;
|
|
16
|
+
label?: string;
|
|
17
|
+
hint?: string;
|
|
18
|
+
}): Promise<T>;
|
|
19
|
+
/**
|
|
20
|
+
* Timeout with milliseconds unit. Used for low-level internal timeouts.
|
|
21
|
+
* Accepts a factory function to create the rejection error, keeping this
|
|
22
|
+
* utility decoupled from specific error types.
|
|
23
|
+
*/
|
|
24
|
+
export declare function withTimeoutMs<T>(promise: Promise<T>, timeoutMs: number, makeError?: string | (() => Error)): Promise<T>;
|
|
25
|
+
/** Interface for browser factory (BrowserBridge or test mocks) */
|
|
26
|
+
export interface IBrowserFactory {
|
|
27
|
+
connect(opts?: {
|
|
28
|
+
timeout?: number;
|
|
29
|
+
session?: string;
|
|
30
|
+
cdpEndpoint?: string;
|
|
31
|
+
contextId?: string;
|
|
32
|
+
idleTimeout?: number;
|
|
33
|
+
windowMode?: BrowserWindowMode;
|
|
34
|
+
surface?: BrowserSurface;
|
|
35
|
+
siteSession?: 'ephemeral' | 'persistent';
|
|
36
|
+
initScript?: string;
|
|
37
|
+
proxyAuth?: {
|
|
38
|
+
username: string;
|
|
39
|
+
password: string;
|
|
40
|
+
};
|
|
41
|
+
}): Promise<IPage>;
|
|
42
|
+
close(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
export declare function browserSession<T>(BrowserFactory: new () => IBrowserFactory, fn: (page: IPage) => Promise<T>, opts?: {
|
|
45
|
+
session?: string;
|
|
46
|
+
cdpEndpoint?: string;
|
|
47
|
+
contextId?: string;
|
|
48
|
+
idleTimeout?: number;
|
|
49
|
+
windowMode?: BrowserWindowMode;
|
|
50
|
+
surface?: BrowserSurface;
|
|
51
|
+
siteSession?: 'ephemeral' | 'persistent';
|
|
52
|
+
initScript?: string;
|
|
53
|
+
proxyAuth?: {
|
|
54
|
+
username: string;
|
|
55
|
+
password: string;
|
|
56
|
+
};
|
|
57
|
+
}): Promise<T>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{BrowserBridge as X,CDPBridge as Y}from"./browser/index.js";import{TimeoutError as Z}from"./errors.js";import{isElectronApp as $}from"./electron-apps.js";import{DEFAULT_BROWSER_COMMAND_TIMEOUT,DEFAULT_BROWSER_CONNECT_TIMEOUT}from"./browser/config.js";export{DEFAULT_BROWSER_COMMAND_TIMEOUT,DEFAULT_BROWSER_CONNECT_TIMEOUT};export function getBrowserFactory(z){if(z&&$(z))return Y;return X}export async function runWithTimeout(z,G){const q=G.label??"Operation";return withTimeoutMs(z,G.timeout*1000,()=>new Z(q,G.timeout,G.hint))}export function withTimeoutMs(z,G,q="Operation timed out"){const H=typeof q==="string"?()=>Error(q):q;return new Promise((J,Q)=>{const V=setTimeout(()=>Q(H()),G);z.then((K)=>{clearTimeout(V);J(K)},(K)=>{clearTimeout(V);Q(K)})})}export async function browserSession(z,G,q={}){const H=new z;try{const J=await H.connect({timeout:DEFAULT_BROWSER_CONNECT_TIMEOUT,session:q.session,cdpEndpoint:q.cdpEndpoint,contextId:q.contextId,idleTimeout:q.idleTimeout,windowMode:q.windowMode,surface:q.surface,siteSession:q.siteSession,initScript:q.initScript,proxyAuth:q.proxyAuth});return await G(J)}finally{await H.close().catch(()=>{})}}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injected script for detecting frontend frameworks (Vue, React, Next, Nuxt, etc.)
|
|
3
|
+
*
|
|
4
|
+
* Serialized via `.toString()` and evaluated in the page context. Types here are
|
|
5
|
+
* only for the TS boundary — see scripts/store.ts for the same pattern.
|
|
6
|
+
*/
|
|
7
|
+
export declare function detectFramework(): Record<string, boolean>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function detectFramework(){const e={};try{const t=document.querySelector("#app"),r=window;e.vue3=!!(t&&t.__vue_app__);e.vue2=!!(t&&t.__vue__);e.react=!!r.__REACT_DEVTOOLS_GLOBAL_HOOK__||!!document.querySelector("[data-reactroot]");e.nextjs=!!r.__NEXT_DATA__;e.nuxt=!!r.__NUXT__;if(e.vue3&&t?.__vue_app__){const _=t.__vue_app__.config?.globalProperties;e.pinia=!!(_&&_.$pinia);e.vuex=!!(_&&_.$store)}}catch{}return e}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export async function interactFuzz(){const q=(f)=>new Promise((h)=>setTimeout(h,f)),u=Array.from(document.querySelectorAll('button, [role="button"], [role="tab"], .tab, .btn, a[href="javascript:void(0)"], a[href="#"]')).slice(0,15);let j=0;for(const f of u)try{const h=f.getBoundingClientRect();if(h.width>0&&h.height>0){f.dispatchEvent(new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window}));j++;await q(300)}}catch{}return j}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injected script for discovering Pinia or Vuex stores and their actions/state representations.
|
|
3
|
+
*
|
|
4
|
+
* This function is serialized via `.toString()` and evaluated inside the page context,
|
|
5
|
+
* so the types below only exist at the TS boundary — the runtime shapes are whatever
|
|
6
|
+
* Pinia/Vuex put on the Vue app. We use narrow structural types for the fields we touch.
|
|
7
|
+
*/
|
|
8
|
+
export declare function discoverStores(): {
|
|
9
|
+
type: string;
|
|
10
|
+
id: string;
|
|
11
|
+
actions: string[];
|
|
12
|
+
stateKeys: string[];
|
|
13
|
+
}[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function discoverStores(){const s=[];try{const c=document.querySelector("#app");if(!c?.__vue_app__)return s;const r=c.__vue_app__.config?.globalProperties,a=r?.$pinia;if(a?._s)a._s.forEach((o,n)=>{const t=[],i=[];for(const e in o)try{if(e.startsWith("$")||e.startsWith("_"))continue;if(typeof o[e]==="function")t.push(e);else i.push(e)}catch{}s.push({type:"pinia",id:n,actions:t.slice(0,20),stateKeys:i.slice(0,15)})});const p=r?.$store;if(p?._modules?.root?._children){const o=p._modules.root._children;for(const[n,t]of Object.entries(o)){const i=Object.keys(t._rawModule?.actions??{}).slice(0,20),e=Object.keys(t.state??{}).slice(0,15);s.push({type:"vuex",id:n,actions:i,stateKeys:e})}}}catch{}return s}
|