@zenalexa/unicli 0.219.0 → 0.220.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +9 -9
- package/README.md +55 -249
- package/README.zh-CN.md +55 -249
- package/dist/adapters/1point3acres/forum.d.ts +58 -0
- package/dist/adapters/1point3acres/forum.d.ts.map +1 -0
- package/dist/adapters/1point3acres/forum.js +708 -0
- package/dist/adapters/1point3acres/forum.js.map +1 -0
- package/dist/adapters/aibase/news.d.ts +21 -0
- package/dist/adapters/aibase/news.d.ts.map +1 -0
- package/dist/adapters/aibase/news.js +96 -0
- package/dist/adapters/aibase/news.js.map +1 -0
- package/dist/adapters/arxiv/papers.d.ts +27 -0
- package/dist/adapters/arxiv/papers.d.ts.map +1 -0
- package/dist/adapters/arxiv/papers.js +193 -0
- package/dist/adapters/arxiv/papers.js.map +1 -0
- package/dist/adapters/bbc/topic.d.ts +24 -0
- package/dist/adapters/bbc/topic.d.ts.map +1 -0
- package/dist/adapters/bbc/topic.js +122 -0
- package/dist/adapters/bbc/topic.js.map +1 -0
- package/dist/adapters/chatgpt/web.d.ts +24 -0
- package/dist/adapters/chatgpt/web.d.ts.map +1 -0
- package/dist/adapters/chatgpt/web.js +242 -0
- package/dist/adapters/chatgpt/web.js.map +1 -0
- package/dist/adapters/claude/web.d.ts +24 -0
- package/dist/adapters/claude/web.d.ts.map +1 -0
- package/dist/adapters/claude/web.js +575 -0
- package/dist/adapters/claude/web.js.map +1 -0
- package/dist/adapters/codex/projects.d.ts +27 -0
- package/dist/adapters/codex/projects.d.ts.map +1 -0
- package/dist/adapters/codex/projects.js +147 -0
- package/dist/adapters/codex/projects.js.map +1 -0
- package/dist/adapters/coingecko/markets.d.ts +19 -0
- package/dist/adapters/coingecko/markets.d.ts.map +1 -0
- package/dist/adapters/coingecko/markets.js +474 -0
- package/dist/adapters/coingecko/markets.js.map +1 -0
- package/dist/adapters/coupang/product.d.ts +27 -0
- package/dist/adapters/coupang/product.d.ts.map +1 -0
- package/dist/adapters/coupang/product.js +211 -0
- package/dist/adapters/coupang/product.js.map +1 -0
- package/dist/adapters/crates/registry.d.ts +44 -0
- package/dist/adapters/crates/registry.d.ts.map +1 -0
- package/dist/adapters/crates/registry.js +186 -0
- package/dist/adapters/crates/registry.js.map +1 -0
- package/dist/adapters/ctrip/travel.d.ts +83 -0
- package/dist/adapters/ctrip/travel.d.ts.map +1 -0
- package/dist/adapters/ctrip/travel.js +630 -0
- package/dist/adapters/ctrip/travel.js.map +1 -0
- package/dist/adapters/dblp/publications.d.ts +41 -0
- package/dist/adapters/dblp/publications.d.ts.map +1 -0
- package/dist/adapters/dblp/publications.js +409 -0
- package/dist/adapters/dblp/publications.js.map +1 -0
- package/dist/adapters/deepseek/web.d.ts +1 -1
- package/dist/adapters/deepseek/web.d.ts.map +1 -1
- package/dist/adapters/deepseek/web.js +66 -1
- package/dist/adapters/deepseek/web.js.map +1 -1
- package/dist/adapters/defillama/protocols.d.ts +13 -0
- package/dist/adapters/defillama/protocols.d.ts.map +1 -0
- package/dist/adapters/defillama/protocols.js +218 -0
- package/dist/adapters/defillama/protocols.js.map +1 -0
- package/dist/adapters/devto/read.d.ts +26 -0
- package/dist/adapters/devto/read.d.ts.map +1 -0
- package/dist/adapters/devto/read.js +110 -0
- package/dist/adapters/devto/read.js.map +1 -0
- package/dist/adapters/dianping/shop.d.ts +38 -0
- package/dist/adapters/dianping/shop.d.ts.map +1 -0
- package/dist/adapters/dianping/shop.js +194 -0
- package/dist/adapters/dianping/shop.js.map +1 -0
- package/dist/adapters/dockerhub/registry.d.ts +36 -0
- package/dist/adapters/dockerhub/registry.d.ts.map +1 -0
- package/dist/adapters/dockerhub/registry.js +172 -0
- package/dist/adapters/dockerhub/registry.js.map +1 -0
- package/dist/adapters/endoflife/product.d.ts +11 -0
- package/dist/adapters/endoflife/product.d.ts.map +1 -0
- package/dist/adapters/endoflife/product.js +113 -0
- package/dist/adapters/endoflife/product.js.map +1 -0
- package/dist/adapters/facebook/marketplace-extra.d.ts +9 -0
- package/dist/adapters/facebook/marketplace-extra.d.ts.map +1 -0
- package/dist/adapters/facebook/marketplace-extra.js +170 -0
- package/dist/adapters/facebook/marketplace-extra.js.map +1 -0
- package/dist/adapters/flathub/apps.d.ts +17 -0
- package/dist/adapters/flathub/apps.d.ts.map +1 -0
- package/dist/adapters/flathub/apps.js +220 -0
- package/dist/adapters/flathub/apps.js.map +1 -0
- package/dist/adapters/goproxy/module.d.ts +24 -0
- package/dist/adapters/goproxy/module.d.ts.map +1 -0
- package/dist/adapters/goproxy/module.js +221 -0
- package/dist/adapters/goproxy/module.js.map +1 -0
- package/dist/adapters/grok/web.d.ts +29 -0
- package/dist/adapters/grok/web.d.ts.map +1 -0
- package/dist/adapters/grok/web.js +553 -0
- package/dist/adapters/grok/web.js.map +1 -0
- package/dist/adapters/hackernews/read.d.ts +31 -0
- package/dist/adapters/hackernews/read.d.ts.map +1 -0
- package/dist/adapters/hackernews/read.js +201 -0
- package/dist/adapters/hackernews/read.js.map +1 -0
- package/dist/adapters/hf/paper.d.ts +22 -0
- package/dist/adapters/hf/paper.d.ts.map +1 -0
- package/dist/adapters/hf/paper.js +112 -0
- package/dist/adapters/hf/paper.js.map +1 -0
- package/dist/adapters/homebrew/packages.d.ts +52 -0
- package/dist/adapters/homebrew/packages.d.ts.map +1 -0
- package/dist/adapters/homebrew/packages.js +240 -0
- package/dist/adapters/homebrew/packages.js.map +1 -0
- package/dist/adapters/indeed/jobs.d.ts +38 -0
- package/dist/adapters/indeed/jobs.d.ts.map +1 -0
- package/dist/adapters/indeed/jobs.js +300 -0
- package/dist/adapters/indeed/jobs.js.map +1 -0
- package/dist/adapters/instagram/collections.d.ts +9 -0
- package/dist/adapters/instagram/collections.d.ts.map +1 -0
- package/dist/adapters/instagram/collections.js +174 -0
- package/dist/adapters/instagram/collections.js.map +1 -0
- package/dist/adapters/lichess/players.d.ts +46 -0
- package/dist/adapters/lichess/players.d.ts.map +1 -0
- package/dist/adapters/lichess/players.js +221 -0
- package/dist/adapters/lichess/players.js.map +1 -0
- package/dist/adapters/lobsters/read-domain.d.ts +35 -0
- package/dist/adapters/lobsters/read-domain.d.ts.map +1 -0
- package/dist/adapters/lobsters/read-domain.js +306 -0
- package/dist/adapters/lobsters/read-domain.js.map +1 -0
- package/dist/adapters/maven/artifact.d.ts +30 -0
- package/dist/adapters/maven/artifact.d.ts.map +1 -0
- package/dist/adapters/maven/artifact.js +121 -0
- package/dist/adapters/maven/artifact.js.map +1 -0
- package/dist/adapters/mdn/search.d.ts +11 -0
- package/dist/adapters/mdn/search.d.ts.map +1 -0
- package/dist/adapters/mdn/search.js +115 -0
- package/dist/adapters/mdn/search.js.map +1 -0
- package/dist/adapters/medium/tag.d.ts +15 -0
- package/dist/adapters/medium/tag.d.ts.map +1 -0
- package/dist/adapters/medium/tag.js +148 -0
- package/dist/adapters/medium/tag.js.map +1 -0
- package/dist/adapters/npm/package.d.ts +32 -0
- package/dist/adapters/npm/package.d.ts.map +1 -0
- package/dist/adapters/npm/package.js +141 -0
- package/dist/adapters/npm/package.js.map +1 -0
- package/dist/adapters/nuget/package.d.ts +34 -0
- package/dist/adapters/nuget/package.d.ts.map +1 -0
- package/dist/adapters/nuget/package.js +135 -0
- package/dist/adapters/nuget/package.js.map +1 -0
- package/dist/adapters/nvd/cve.d.ts +42 -0
- package/dist/adapters/nvd/cve.d.ts.map +1 -0
- package/dist/adapters/nvd/cve.js +132 -0
- package/dist/adapters/nvd/cve.js.map +1 -0
- package/dist/adapters/oeis/sequences.d.ts +14 -0
- package/dist/adapters/oeis/sequences.d.ts.map +1 -0
- package/dist/adapters/oeis/sequences.js +219 -0
- package/dist/adapters/oeis/sequences.js.map +1 -0
- package/dist/adapters/openalex/works.d.ts +43 -0
- package/dist/adapters/openalex/works.d.ts.map +1 -0
- package/dist/adapters/openalex/works.js +267 -0
- package/dist/adapters/openalex/works.js.map +1 -0
- package/dist/adapters/openfda/records.d.ts +18 -0
- package/dist/adapters/openfda/records.d.ts.map +1 -0
- package/dist/adapters/openfda/records.js +209 -0
- package/dist/adapters/openfda/records.js.map +1 -0
- package/dist/adapters/openreview/papers.d.ts +34 -0
- package/dist/adapters/openreview/papers.d.ts.map +1 -0
- package/dist/adapters/openreview/papers.js +463 -0
- package/dist/adapters/openreview/papers.js.map +1 -0
- package/dist/adapters/osv/security.d.ts +36 -0
- package/dist/adapters/osv/security.d.ts.map +1 -0
- package/dist/adapters/osv/security.js +247 -0
- package/dist/adapters/osv/security.js.map +1 -0
- package/dist/adapters/packagist/package.d.ts +31 -0
- package/dist/adapters/packagist/package.d.ts.map +1 -0
- package/dist/adapters/packagist/package.js +108 -0
- package/dist/adapters/packagist/package.js.map +1 -0
- package/dist/adapters/pubmed/articles.d.ts +31 -0
- package/dist/adapters/pubmed/articles.d.ts.map +1 -0
- package/dist/adapters/pubmed/articles.js +385 -0
- package/dist/adapters/pubmed/articles.js.map +1 -0
- package/dist/adapters/pypi/package.d.ts +38 -0
- package/dist/adapters/pypi/package.d.ts.map +1 -0
- package/dist/adapters/pypi/package.js +235 -0
- package/dist/adapters/pypi/package.js.map +1 -0
- package/dist/adapters/qwen/web.d.ts +26 -0
- package/dist/adapters/qwen/web.d.ts.map +1 -0
- package/dist/adapters/qwen/web.js +672 -0
- package/dist/adapters/qwen/web.js.map +1 -0
- package/dist/adapters/reddit/account.d.ts +12 -0
- package/dist/adapters/reddit/account.d.ts.map +1 -0
- package/dist/adapters/reddit/account.js +409 -0
- package/dist/adapters/reddit/account.js.map +1 -0
- package/dist/adapters/rednote/web.d.ts +30 -0
- package/dist/adapters/rednote/web.d.ts.map +1 -0
- package/dist/adapters/rednote/web.js +858 -0
- package/dist/adapters/rednote/web.js.map +1 -0
- package/dist/adapters/rest-countries/countries.d.ts +14 -0
- package/dist/adapters/rest-countries/countries.d.ts.map +1 -0
- package/dist/adapters/rest-countries/countries.js +231 -0
- package/dist/adapters/rest-countries/countries.js.map +1 -0
- package/dist/adapters/reuters/article-detail.d.ts +37 -0
- package/dist/adapters/reuters/article-detail.d.ts.map +1 -0
- package/dist/adapters/reuters/article-detail.js +139 -0
- package/dist/adapters/reuters/article-detail.js.map +1 -0
- package/dist/adapters/rfc/rfc.d.ts +11 -0
- package/dist/adapters/rfc/rfc.d.ts.map +1 -0
- package/dist/adapters/rfc/rfc.js +121 -0
- package/dist/adapters/rfc/rfc.js.map +1 -0
- package/dist/adapters/rubygems/gem.d.ts +26 -0
- package/dist/adapters/rubygems/gem.d.ts.map +1 -0
- package/dist/adapters/rubygems/gem.js +96 -0
- package/dist/adapters/rubygems/gem.js.map +1 -0
- package/dist/adapters/stackoverflow/questions.d.ts +79 -0
- package/dist/adapters/stackoverflow/questions.d.ts.map +1 -0
- package/dist/adapters/stackoverflow/questions.js +504 -0
- package/dist/adapters/stackoverflow/questions.js.map +1 -0
- package/dist/adapters/steam/app.d.ts +39 -0
- package/dist/adapters/steam/app.d.ts.map +1 -0
- package/dist/adapters/steam/app.js +165 -0
- package/dist/adapters/steam/app.js.map +1 -0
- package/dist/adapters/tiktok/creator-videos.d.ts +52 -0
- package/dist/adapters/tiktok/creator-videos.d.ts.map +1 -0
- package/dist/adapters/tiktok/creator-videos.js +267 -0
- package/dist/adapters/tiktok/creator-videos.js.map +1 -0
- package/dist/adapters/tvmaze/shows.d.ts +13 -0
- package/dist/adapters/tvmaze/shows.d.ts.map +1 -0
- package/dist/adapters/tvmaze/shows.js +240 -0
- package/dist/adapters/tvmaze/shows.js.map +1 -0
- package/dist/adapters/twitter/bookmark-folders.d.ts +33 -0
- package/dist/adapters/twitter/bookmark-folders.d.ts.map +1 -0
- package/dist/adapters/twitter/bookmark-folders.js +290 -0
- package/dist/adapters/twitter/bookmark-folders.js.map +1 -0
- package/dist/adapters/twitter/quote.d.ts +18 -0
- package/dist/adapters/twitter/quote.d.ts.map +1 -0
- package/dist/adapters/twitter/quote.js +285 -0
- package/dist/adapters/twitter/quote.js.map +1 -0
- package/dist/adapters/twitter/tweet-actions.d.ts +12 -0
- package/dist/adapters/twitter/tweet-actions.d.ts.map +1 -0
- package/dist/adapters/twitter/tweet-actions.js +145 -0
- package/dist/adapters/twitter/tweet-actions.js.map +1 -0
- package/dist/adapters/twitter/tweet-url.d.ts +15 -0
- package/dist/adapters/twitter/tweet-url.d.ts.map +1 -0
- package/dist/adapters/twitter/tweet-url.js +57 -0
- package/dist/adapters/twitter/tweet-url.js.map +1 -0
- package/dist/adapters/uisdc/news.d.ts +22 -0
- package/dist/adapters/uisdc/news.d.ts.map +1 -0
- package/dist/adapters/uisdc/news.js +91 -0
- package/dist/adapters/uisdc/news.js.map +1 -0
- package/dist/adapters/weibo/favorites-publish.d.ts +28 -0
- package/dist/adapters/weibo/favorites-publish.d.ts.map +1 -0
- package/dist/adapters/weibo/favorites-publish.js +356 -0
- package/dist/adapters/weibo/favorites-publish.js.map +1 -0
- package/dist/adapters/wikidata/entities.d.ts +15 -0
- package/dist/adapters/wikidata/entities.d.ts.map +1 -0
- package/dist/adapters/wikidata/entities.js +219 -0
- package/dist/adapters/wikidata/entities.js.map +1 -0
- package/dist/adapters/wikipedia/page.d.ts +21 -0
- package/dist/adapters/wikipedia/page.d.ts.map +1 -0
- package/dist/adapters/wikipedia/page.js +116 -0
- package/dist/adapters/wikipedia/page.js.map +1 -0
- package/dist/adapters/wttr/weather.d.ts +12 -0
- package/dist/adapters/wttr/weather.d.ts.map +1 -0
- package/dist/adapters/wttr/weather.js +207 -0
- package/dist/adapters/wttr/weather.js.map +1 -0
- package/dist/adapters/xianyu/publish.d.ts +31 -0
- package/dist/adapters/xianyu/publish.d.ts.map +1 -0
- package/dist/adapters/xianyu/publish.js +349 -0
- package/dist/adapters/xianyu/publish.js.map +1 -0
- package/dist/adapters/xiaohongshu/user-helpers.d.ts +2 -2
- package/dist/adapters/xiaohongshu/user-helpers.d.ts.map +1 -1
- package/dist/adapters/xiaohongshu/user-helpers.js +5 -4
- package/dist/adapters/xiaohongshu/user-helpers.js.map +1 -1
- package/dist/adapters/yuanbao/web.d.ts +27 -0
- package/dist/adapters/yuanbao/web.d.ts.map +1 -0
- package/dist/adapters/yuanbao/web.js +365 -0
- package/dist/adapters/yuanbao/web.js.map +1 -0
- package/dist/adapters/zhihu/collection.d.ts +33 -0
- package/dist/adapters/zhihu/collection.d.ts.map +1 -0
- package/dist/adapters/zhihu/collection.js +185 -0
- package/dist/adapters/zhihu/collection.js.map +1 -0
- package/dist/adapters/zlibrary/web.d.ts +19 -0
- package/dist/adapters/zlibrary/web.d.ts.map +1 -0
- package/dist/adapters/zlibrary/web.js +153 -0
- package/dist/adapters/zlibrary/web.js.map +1 -0
- package/dist/browser/daemon-client.js +2 -2
- package/dist/browser/daemon-client.js.map +1 -1
- package/dist/discovery/macos-dynamic.d.ts.map +1 -1
- package/dist/discovery/macos-dynamic.js +17 -3
- package/dist/discovery/macos-dynamic.js.map +1 -1
- package/dist/manifest-compact.txt +10 -10
- package/dist/manifest-search.json +1 -1
- package/dist/manifest.json +5130 -112
- package/dist/transport/refs.d.ts +5 -3
- package/dist/transport/refs.d.ts.map +1 -1
- package/dist/transport/refs.js +8 -1
- package/dist/transport/refs.js.map +1 -1
- package/dist/transport/sidecar-binary.d.ts +7 -0
- package/dist/transport/sidecar-binary.d.ts.map +1 -1
- package/dist/transport/sidecar-binary.js +28 -8
- package/dist/transport/sidecar-binary.js.map +1 -1
- package/package.json +4 -3
- package/server.json +3 -3
- package/skills/unicli/SKILL.md +1 -1
- package/skills/unicli-claude-code/SKILL.md +1 -1
- package/skills/unicli-hermes/SKILL.md +1 -1
- package/src/adapters/1point3acres/forum.test.ts +300 -0
- package/src/adapters/1point3acres/forum.ts +852 -0
- package/src/adapters/aibase/news.test.ts +42 -0
- package/src/adapters/aibase/news.ts +118 -0
- package/src/adapters/arxiv/papers.test.ts +59 -0
- package/src/adapters/arxiv/papers.ts +226 -0
- package/src/adapters/bbc/topic.test.ts +52 -0
- package/src/adapters/bbc/topic.ts +149 -0
- package/src/adapters/chatgpt/web.test.ts +121 -0
- package/src/adapters/chatgpt/web.ts +286 -0
- package/src/adapters/claude/web.test.ts +206 -0
- package/src/adapters/claude/web.ts +684 -0
- package/src/adapters/codex/projects.test.ts +77 -0
- package/src/adapters/codex/projects.ts +178 -0
- package/src/adapters/coingecko/markets.test.ts +156 -0
- package/src/adapters/coingecko/markets.ts +574 -0
- package/src/adapters/coupang/product.test.ts +111 -0
- package/src/adapters/coupang/product.ts +256 -0
- package/src/adapters/crates/registry.test.ts +89 -0
- package/src/adapters/crates/registry.ts +247 -0
- package/src/adapters/ctrip/travel.test.ts +359 -0
- package/src/adapters/ctrip/travel.ts +792 -0
- package/src/adapters/dblp/publications.test.ts +123 -0
- package/src/adapters/dblp/publications.ts +494 -0
- package/src/adapters/deepseek/web.test.ts +69 -0
- package/src/adapters/deepseek/web.ts +78 -1
- package/src/adapters/defillama/protocols.test.ts +75 -0
- package/src/adapters/defillama/protocols.ts +253 -0
- package/src/adapters/devto/read.test.ts +49 -0
- package/src/adapters/devto/read.ts +145 -0
- package/src/adapters/dianping/shop.test.ts +134 -0
- package/src/adapters/dianping/shop.ts +261 -0
- package/src/adapters/dockerhub/registry.test.ts +97 -0
- package/src/adapters/dockerhub/registry.ts +223 -0
- package/src/adapters/endoflife/product.test.ts +50 -0
- package/src/adapters/endoflife/product.ts +128 -0
- package/src/adapters/facebook/marketplace-extra.test.ts +132 -0
- package/src/adapters/facebook/marketplace-extra.ts +213 -0
- package/src/adapters/flathub/apps.test.ts +85 -0
- package/src/adapters/flathub/apps.ts +254 -0
- package/src/adapters/goproxy/module.test.ts +72 -0
- package/src/adapters/goproxy/module.ts +258 -0
- package/src/adapters/grok/web.test.ts +181 -0
- package/src/adapters/grok/web.ts +640 -0
- package/src/adapters/hackernews/read.test.ts +68 -0
- package/src/adapters/hackernews/read.ts +265 -0
- package/src/adapters/hf/paper.test.ts +48 -0
- package/src/adapters/hf/paper.ts +138 -0
- package/src/adapters/homebrew/packages.test.ts +109 -0
- package/src/adapters/homebrew/packages.ts +304 -0
- package/src/adapters/indeed/jobs.test.ts +230 -0
- package/src/adapters/indeed/jobs.ts +375 -0
- package/src/adapters/instagram/collections.test.ts +94 -0
- package/src/adapters/instagram/collections.ts +206 -0
- package/src/adapters/lichess/players.test.ts +99 -0
- package/src/adapters/lichess/players.ts +277 -0
- package/src/adapters/lobsters/read-domain.test.ts +121 -0
- package/src/adapters/lobsters/read-domain.ts +400 -0
- package/src/adapters/maven/artifact.test.ts +67 -0
- package/src/adapters/maven/artifact.ts +155 -0
- package/src/adapters/mdn/search.test.ts +39 -0
- package/src/adapters/mdn/search.ts +133 -0
- package/src/adapters/medium/tag.test.ts +64 -0
- package/src/adapters/medium/tag.ts +164 -0
- package/src/adapters/npm/package.test.ts +53 -0
- package/src/adapters/npm/package.ts +177 -0
- package/src/adapters/nuget/package.test.ts +102 -0
- package/src/adapters/nuget/package.ts +193 -0
- package/src/adapters/nvd/cve.test.ts +66 -0
- package/src/adapters/nvd/cve.ts +182 -0
- package/src/adapters/oeis/sequences.test.ts +71 -0
- package/src/adapters/oeis/sequences.ts +234 -0
- package/src/adapters/openalex/works.test.ts +99 -0
- package/src/adapters/openalex/works.ts +319 -0
- package/src/adapters/openfda/records.test.ts +90 -0
- package/src/adapters/openfda/records.ts +239 -0
- package/src/adapters/openreview/papers.test.ts +139 -0
- package/src/adapters/openreview/papers.ts +560 -0
- package/src/adapters/osv/security.test.ts +91 -0
- package/src/adapters/osv/security.ts +298 -0
- package/src/adapters/packagist/package.test.ts +62 -0
- package/src/adapters/packagist/package.ts +146 -0
- package/src/adapters/pubmed/articles.test.ts +96 -0
- package/src/adapters/pubmed/articles.ts +497 -0
- package/src/adapters/pypi/package.test.ts +131 -0
- package/src/adapters/pypi/package.ts +297 -0
- package/src/adapters/qwen/web.test.ts +176 -0
- package/src/adapters/qwen/web.ts +758 -0
- package/src/adapters/reddit/account.test.ts +56 -0
- package/src/adapters/reddit/account.ts +493 -0
- package/src/adapters/rednote/web.test.ts +354 -0
- package/src/adapters/rednote/web.ts +968 -0
- package/src/adapters/rest-countries/countries.test.ts +80 -0
- package/src/adapters/rest-countries/countries.ts +271 -0
- package/src/adapters/reuters/article-detail.test.ts +65 -0
- package/src/adapters/reuters/article-detail.ts +186 -0
- package/src/adapters/rfc/rfc.test.ts +37 -0
- package/src/adapters/rfc/rfc.ts +133 -0
- package/src/adapters/rubygems/gem.test.ts +43 -0
- package/src/adapters/rubygems/gem.ts +126 -0
- package/src/adapters/stackoverflow/questions.test.ts +207 -0
- package/src/adapters/stackoverflow/questions.ts +765 -0
- package/src/adapters/steam/app.test.ts +68 -0
- package/src/adapters/steam/app.ts +218 -0
- package/src/adapters/tiktok/creator-videos.test.ts +158 -0
- package/src/adapters/tiktok/creator-videos.ts +370 -0
- package/src/adapters/tvmaze/shows.test.ts +93 -0
- package/src/adapters/tvmaze/shows.ts +271 -0
- package/src/adapters/twitter/bookmark-folders.test.ts +164 -0
- package/src/adapters/twitter/bookmark-folders.ts +366 -0
- package/src/adapters/twitter/quote.test.ts +157 -0
- package/src/adapters/twitter/quote.ts +332 -0
- package/src/adapters/twitter/tweet-actions.test.ts +51 -0
- package/src/adapters/twitter/tweet-actions.ts +187 -0
- package/src/adapters/twitter/tweet-url.ts +65 -0
- package/src/adapters/uisdc/news.test.ts +46 -0
- package/src/adapters/uisdc/news.ts +111 -0
- package/src/adapters/weibo/favorites-publish.test.ts +177 -0
- package/src/adapters/weibo/favorites-publish.ts +426 -0
- package/src/adapters/wikidata/entities.test.ts +103 -0
- package/src/adapters/wikidata/entities.ts +253 -0
- package/src/adapters/wikipedia/page.test.ts +49 -0
- package/src/adapters/wikipedia/page.ts +158 -0
- package/src/adapters/wttr/weather.test.ts +99 -0
- package/src/adapters/wttr/weather.ts +239 -0
- package/src/adapters/xianyu/publish.test.ts +210 -0
- package/src/adapters/xianyu/publish.ts +420 -0
- package/src/adapters/xiaohongshu/user-helpers.ts +5 -2
- package/src/adapters/yuanbao/web.test.ts +144 -0
- package/src/adapters/yuanbao/web.ts +435 -0
- package/src/adapters/zhihu/collection.test.ts +96 -0
- package/src/adapters/zhihu/collection.ts +239 -0
- package/src/adapters/zlibrary/web.test.ts +104 -0
- package/src/adapters/zlibrary/web.ts +192 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/maven/artifact.ts
|
|
3
|
+
* @does Register agent-facing Maven Central artifact version history command.
|
|
4
|
+
* @needs search.maven.org Solr gav core and coordinate validation.
|
|
5
|
+
* @feeds surface coverage ledger, JVM dependency inspection, registry command surface.
|
|
6
|
+
* @breaks Maven coordinate parsing or Solr envelope drift hides dependency versions.
|
|
7
|
+
*/
|
|
8
|
+
import { cli, Strategy } from "../../registry.js";
|
|
9
|
+
const MAVEN_BASE = "https://search.maven.org/solrsearch/select";
|
|
10
|
+
function stringField(value) {
|
|
11
|
+
return typeof value === "string" ? value.trim() : "";
|
|
12
|
+
}
|
|
13
|
+
function epochMsToIso(value) {
|
|
14
|
+
return typeof value === "number" && Number.isFinite(value)
|
|
15
|
+
? new Date(value).toISOString()
|
|
16
|
+
: "";
|
|
17
|
+
}
|
|
18
|
+
export function requireMavenLimit(value, fallback) {
|
|
19
|
+
if (value === undefined || value === null || value === "")
|
|
20
|
+
return fallback;
|
|
21
|
+
const n = Number(value);
|
|
22
|
+
if (!Number.isInteger(n) || n < 1 || n > 200) {
|
|
23
|
+
throw new Error(`limit must be an integer in [1, 200]. Got: ${String(value)}`);
|
|
24
|
+
}
|
|
25
|
+
return n;
|
|
26
|
+
}
|
|
27
|
+
export function parseMavenCoordinate(value) {
|
|
28
|
+
const coordinate = String(value ?? "").trim();
|
|
29
|
+
const parts = coordinate.split(":").map((part) => part.trim());
|
|
30
|
+
if (parts.length !== 2 && parts.length !== 3) {
|
|
31
|
+
throw new Error('coordinate must be "groupId:artifactId" or "groupId:artifactId:version".');
|
|
32
|
+
}
|
|
33
|
+
const [groupId, artifactId, version = ""] = parts;
|
|
34
|
+
if (!groupId || !artifactId) {
|
|
35
|
+
throw new Error("coordinate groupId and artifactId are required.");
|
|
36
|
+
}
|
|
37
|
+
return { groupId, artifactId, version };
|
|
38
|
+
}
|
|
39
|
+
export function mapMavenArtifactRows(body, coordinate) {
|
|
40
|
+
const docs = Array.isArray(body.response?.docs) ? body.response.docs : [];
|
|
41
|
+
if (docs.length === 0) {
|
|
42
|
+
const label = coordinate.version
|
|
43
|
+
? `${coordinate.groupId}:${coordinate.artifactId}:${coordinate.version}`
|
|
44
|
+
: `${coordinate.groupId}:${coordinate.artifactId}`;
|
|
45
|
+
throw new Error(`Maven Central has no published versions for ${label}.`);
|
|
46
|
+
}
|
|
47
|
+
return docs.map((doc) => {
|
|
48
|
+
const version = stringField(doc.v);
|
|
49
|
+
return {
|
|
50
|
+
groupId: stringField(doc.g) || coordinate.groupId,
|
|
51
|
+
artifactId: stringField(doc.a) || coordinate.artifactId,
|
|
52
|
+
version,
|
|
53
|
+
packaging: stringField(doc.p),
|
|
54
|
+
publishedAt: epochMsToIso(doc.timestamp),
|
|
55
|
+
tags: Array.isArray(doc.tags)
|
|
56
|
+
? doc.tags.map(stringField).filter(Boolean).join(", ")
|
|
57
|
+
: "",
|
|
58
|
+
url: version
|
|
59
|
+
? `https://central.sonatype.com/artifact/${coordinate.groupId}/${coordinate.artifactId}/${version}`
|
|
60
|
+
: `https://central.sonatype.com/artifact/${coordinate.groupId}/${coordinate.artifactId}`,
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async function fetchMavenJson(url) {
|
|
65
|
+
const response = await fetch(url, {
|
|
66
|
+
headers: {
|
|
67
|
+
"User-Agent": "unicli (https://github.com/olo-dot-io/Uni-CLI)",
|
|
68
|
+
Accept: "application/json",
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
if (!response.ok)
|
|
72
|
+
throw new Error(`maven artifact returned HTTP ${response.status}.`);
|
|
73
|
+
return response.json();
|
|
74
|
+
}
|
|
75
|
+
cli({
|
|
76
|
+
site: "maven",
|
|
77
|
+
name: "artifact",
|
|
78
|
+
description: "Fetch Maven Central artifact version history",
|
|
79
|
+
domain: "search.maven.org",
|
|
80
|
+
strategy: Strategy.PUBLIC,
|
|
81
|
+
args: [
|
|
82
|
+
{
|
|
83
|
+
name: "coordinate",
|
|
84
|
+
type: "str",
|
|
85
|
+
required: true,
|
|
86
|
+
positional: true,
|
|
87
|
+
description: 'Maven coordinate "groupId:artifactId[:version]"',
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "limit",
|
|
91
|
+
type: "int",
|
|
92
|
+
default: 20,
|
|
93
|
+
description: "Max versions",
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
columns: [
|
|
97
|
+
"groupId",
|
|
98
|
+
"artifactId",
|
|
99
|
+
"version",
|
|
100
|
+
"packaging",
|
|
101
|
+
"publishedAt",
|
|
102
|
+
"tags",
|
|
103
|
+
"url",
|
|
104
|
+
],
|
|
105
|
+
func: async (_page, kwargs) => {
|
|
106
|
+
const coordinate = parseMavenCoordinate(kwargs.coordinate);
|
|
107
|
+
const limit = requireMavenLimit(kwargs.limit, 20);
|
|
108
|
+
const filters = [`g:${coordinate.groupId}`, `a:${coordinate.artifactId}`];
|
|
109
|
+
if (coordinate.version)
|
|
110
|
+
filters.push(`v:${coordinate.version}`);
|
|
111
|
+
const params = new URLSearchParams({
|
|
112
|
+
q: filters.join(" AND "),
|
|
113
|
+
core: "gav",
|
|
114
|
+
rows: String(coordinate.version ? 1 : limit),
|
|
115
|
+
wt: "json",
|
|
116
|
+
});
|
|
117
|
+
const body = (await fetchMavenJson(`${MAVEN_BASE}?${params.toString()}`));
|
|
118
|
+
return mapMavenArtifactRows(body, coordinate);
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact.js","sourceRoot":"","sources":["../../../src/adapters/maven/artifact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/mdn/search.ts
|
|
3
|
+
* @does Register agent-facing MDN Web Docs search command.
|
|
4
|
+
* @needs MDN public search API, bounded limits, locale allowlist.
|
|
5
|
+
* @feeds surface coverage ledger, web-platform documentation search rows.
|
|
6
|
+
* @breaks MDN API drift, weak locale validation, or silent empty rows hide documentation lookup failures.
|
|
7
|
+
*/
|
|
8
|
+
export declare function requireMdnLimit(value: unknown): number;
|
|
9
|
+
export declare function requireMdnLocale(value: unknown): string;
|
|
10
|
+
export declare function mapMdnRows(documents: Array<Record<string, unknown>>, limit: number, fallbackLocale: string): Array<Record<string, unknown>>;
|
|
11
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/adapters/mdn/search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwBH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQtD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMvD;AAMD,wBAAgB,UAAU,CACxB,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,GACrB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAYhC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/mdn/search.ts
|
|
3
|
+
* @does Register agent-facing MDN Web Docs search command.
|
|
4
|
+
* @needs MDN public search API, bounded limits, locale allowlist.
|
|
5
|
+
* @feeds surface coverage ledger, web-platform documentation search rows.
|
|
6
|
+
* @breaks MDN API drift, weak locale validation, or silent empty rows hide documentation lookup failures.
|
|
7
|
+
*/
|
|
8
|
+
import { cli, Strategy } from "../../registry.js";
|
|
9
|
+
const API_BASE = "https://developer.mozilla.org";
|
|
10
|
+
const LOCALES = new Set([
|
|
11
|
+
"de",
|
|
12
|
+
"en-US",
|
|
13
|
+
"es",
|
|
14
|
+
"fr",
|
|
15
|
+
"ja",
|
|
16
|
+
"ko",
|
|
17
|
+
"pt-BR",
|
|
18
|
+
"ru",
|
|
19
|
+
"zh-CN",
|
|
20
|
+
"zh-TW",
|
|
21
|
+
]);
|
|
22
|
+
function requireNonEmpty(value, label) {
|
|
23
|
+
const text = String(value ?? "").trim();
|
|
24
|
+
if (!text)
|
|
25
|
+
throw new Error(`mdn ${label} cannot be empty.`);
|
|
26
|
+
return text;
|
|
27
|
+
}
|
|
28
|
+
export function requireMdnLimit(value) {
|
|
29
|
+
const raw = value === undefined || value === null || value === "" ? 10 : value;
|
|
30
|
+
const limit = Number(raw);
|
|
31
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 50) {
|
|
32
|
+
throw new Error("mdn limit must be an integer in [1, 50].");
|
|
33
|
+
}
|
|
34
|
+
return limit;
|
|
35
|
+
}
|
|
36
|
+
export function requireMdnLocale(value) {
|
|
37
|
+
const locale = String(value ?? "en-US").trim();
|
|
38
|
+
if (!LOCALES.has(locale)) {
|
|
39
|
+
throw new Error(`mdn locale "${String(value)}" is not supported.`);
|
|
40
|
+
}
|
|
41
|
+
return locale;
|
|
42
|
+
}
|
|
43
|
+
function stringField(value) {
|
|
44
|
+
return typeof value === "string" ? value.trim() : "";
|
|
45
|
+
}
|
|
46
|
+
export function mapMdnRows(documents, limit, fallbackLocale) {
|
|
47
|
+
return documents.slice(0, limit).map((doc, index) => {
|
|
48
|
+
const mdnUrl = stringField(doc.mdn_url);
|
|
49
|
+
return {
|
|
50
|
+
rank: index + 1,
|
|
51
|
+
title: stringField(doc.title),
|
|
52
|
+
slug: stringField(doc.slug),
|
|
53
|
+
locale: stringField(doc.locale) || fallbackLocale,
|
|
54
|
+
summary: stringField(doc.summary).replace(/\s+/g, " "),
|
|
55
|
+
url: mdnUrl ? `${API_BASE}${mdnUrl}` : "",
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
async function fetchJson(url, label) {
|
|
60
|
+
const response = await fetch(url, {
|
|
61
|
+
headers: {
|
|
62
|
+
accept: "application/json",
|
|
63
|
+
"user-agent": "unicli-mdn (https://github.com/olo-dot-io/Uni-CLI)",
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
if (response.status === 404)
|
|
67
|
+
throw new Error(`${label} returned no result.`);
|
|
68
|
+
if (response.status === 429)
|
|
69
|
+
throw new Error(`${label} returned HTTP 429.`);
|
|
70
|
+
if (!response.ok)
|
|
71
|
+
throw new Error(`${label} returned HTTP ${response.status}.`);
|
|
72
|
+
return response.json();
|
|
73
|
+
}
|
|
74
|
+
cli({
|
|
75
|
+
site: "mdn",
|
|
76
|
+
name: "search",
|
|
77
|
+
description: "Search MDN Web Docs by keyword",
|
|
78
|
+
domain: "developer.mozilla.org",
|
|
79
|
+
strategy: Strategy.PUBLIC,
|
|
80
|
+
args: [
|
|
81
|
+
{
|
|
82
|
+
name: "query",
|
|
83
|
+
type: "str",
|
|
84
|
+
required: true,
|
|
85
|
+
positional: true,
|
|
86
|
+
description: "Search keyword",
|
|
87
|
+
},
|
|
88
|
+
{ name: "limit", type: "int", default: 10, description: "Max rows" },
|
|
89
|
+
{
|
|
90
|
+
name: "locale",
|
|
91
|
+
type: "str",
|
|
92
|
+
default: "en-US",
|
|
93
|
+
description: "MDN locale",
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
columns: ["rank", "title", "slug", "locale", "summary", "url"],
|
|
97
|
+
func: async (_page, kwargs) => {
|
|
98
|
+
const query = requireNonEmpty(kwargs.query, "query");
|
|
99
|
+
const limit = requireMdnLimit(kwargs.limit);
|
|
100
|
+
const locale = requireMdnLocale(kwargs.locale);
|
|
101
|
+
const url = new URL(`${API_BASE}/api/v1/search`);
|
|
102
|
+
url.searchParams.set("q", query);
|
|
103
|
+
url.searchParams.set("locale", locale);
|
|
104
|
+
url.searchParams.set("size", String(limit));
|
|
105
|
+
const body = (await fetchJson(url, "mdn search"));
|
|
106
|
+
const rows = mapMdnRows(Array.isArray(body.documents)
|
|
107
|
+
? body.documents
|
|
108
|
+
: [], limit, locale);
|
|
109
|
+
if (rows.length === 0) {
|
|
110
|
+
throw new Error(`mdn search returned no rows for "${query}" (${locale}).`);
|
|
111
|
+
}
|
|
112
|
+
return rows;
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/adapters/mdn/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/medium/tag.ts
|
|
3
|
+
* @does Register agent-facing Medium tag RSS reader.
|
|
4
|
+
* @needs Medium public tag RSS feed, strict tag slugs, bounded item parsing.
|
|
5
|
+
* @feeds surface coverage ledger, Medium topical article discovery, RSS reading workflows.
|
|
6
|
+
* @breaks Medium RSS shape drift or weak entity stripping degrades tag article rows.
|
|
7
|
+
*/
|
|
8
|
+
export declare function requireMediumTag(value: unknown): string;
|
|
9
|
+
export declare function requireMediumLimit(value: unknown, fallback?: number): number;
|
|
10
|
+
export declare function decodeMediumHtml(value: unknown): string;
|
|
11
|
+
export declare function stripMediumHtml(value: unknown): string;
|
|
12
|
+
export declare function mediumRssDate(value: unknown): string;
|
|
13
|
+
export declare function extractMediumCategories(block: string): string[];
|
|
14
|
+
export declare function parseMediumTagRss(xml: string, limit: number): Array<Record<string, unknown>>;
|
|
15
|
+
//# sourceMappingURL=tag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../../src/adapters/medium/tag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAgBH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CASvD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAK,GAAG,MAAM,CAUxE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAavD;AAaD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAItD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKpD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAU/D;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GACZ,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiBhC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/medium/tag.ts
|
|
3
|
+
* @does Register agent-facing Medium tag RSS reader.
|
|
4
|
+
* @needs Medium public tag RSS feed, strict tag slugs, bounded item parsing.
|
|
5
|
+
* @feeds surface coverage ledger, Medium topical article discovery, RSS reading workflows.
|
|
6
|
+
* @breaks Medium RSS shape drift or weak entity stripping degrades tag article rows.
|
|
7
|
+
*/
|
|
8
|
+
import { cli, Strategy } from "../../registry.js";
|
|
9
|
+
const MEDIUM_TAG_PATTERN = /^[a-z0-9][a-z0-9-]*$/i;
|
|
10
|
+
const MEDIUM_TAG_LIMIT = 25;
|
|
11
|
+
const HTML_ENTITIES = {
|
|
12
|
+
"&": "&",
|
|
13
|
+
"<": "<",
|
|
14
|
+
">": ">",
|
|
15
|
+
""": '"',
|
|
16
|
+
"'": "'",
|
|
17
|
+
"'": "'",
|
|
18
|
+
" ": " ",
|
|
19
|
+
};
|
|
20
|
+
export function requireMediumTag(value) {
|
|
21
|
+
const tag = String(value ?? "")
|
|
22
|
+
.trim()
|
|
23
|
+
.toLowerCase();
|
|
24
|
+
if (!tag)
|
|
25
|
+
throw new Error("medium tag is required.");
|
|
26
|
+
if (!MEDIUM_TAG_PATTERN.test(tag)) {
|
|
27
|
+
throw new Error(`medium tag "${String(value)}" is not valid.`);
|
|
28
|
+
}
|
|
29
|
+
return tag;
|
|
30
|
+
}
|
|
31
|
+
export function requireMediumLimit(value, fallback = 20) {
|
|
32
|
+
const raw = value === undefined || value === null || value === "" ? fallback : value;
|
|
33
|
+
const limit = Number(raw);
|
|
34
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > MEDIUM_TAG_LIMIT) {
|
|
35
|
+
throw new Error(`medium limit must be an integer in [1, ${MEDIUM_TAG_LIMIT}].`);
|
|
36
|
+
}
|
|
37
|
+
return limit;
|
|
38
|
+
}
|
|
39
|
+
export function decodeMediumHtml(value) {
|
|
40
|
+
return String(value ?? "")
|
|
41
|
+
.replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => {
|
|
42
|
+
const code = Number.parseInt(hex, 16);
|
|
43
|
+
return Number.isFinite(code) ? String.fromCodePoint(code) : "";
|
|
44
|
+
})
|
|
45
|
+
.replace(/&#(\d+);/g, (_, dec) => {
|
|
46
|
+
const code = Number.parseInt(dec, 10);
|
|
47
|
+
return Number.isFinite(code) ? String.fromCodePoint(code) : "";
|
|
48
|
+
})
|
|
49
|
+
.replace(/&(amp|lt|gt|quot|apos|#39|nbsp);/g, (match) => {
|
|
50
|
+
return HTML_ENTITIES[match] ?? match;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function extractXmlTag(block, tag) {
|
|
54
|
+
const cdata = block.match(new RegExp(`<${tag}[^>]*>\\s*<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>\\s*<\\/${tag}>`));
|
|
55
|
+
if (cdata)
|
|
56
|
+
return cdata[1] ?? "";
|
|
57
|
+
const plain = block.match(new RegExp(`<${tag}[^>]*>([\\s\\S]*?)<\\/${tag}>`));
|
|
58
|
+
return plain?.[1] ?? "";
|
|
59
|
+
}
|
|
60
|
+
export function stripMediumHtml(value) {
|
|
61
|
+
return decodeMediumHtml(String(value ?? "").replace(/<[^>]+>/g, " "))
|
|
62
|
+
.replace(/\s+/g, " ")
|
|
63
|
+
.trim();
|
|
64
|
+
}
|
|
65
|
+
export function mediumRssDate(value) {
|
|
66
|
+
const raw = String(value ?? "").trim();
|
|
67
|
+
if (!raw)
|
|
68
|
+
return "";
|
|
69
|
+
const date = new Date(raw);
|
|
70
|
+
return Number.isNaN(date.getTime()) ? "" : date.toISOString().slice(0, 10);
|
|
71
|
+
}
|
|
72
|
+
export function extractMediumCategories(block) {
|
|
73
|
+
const categories = [];
|
|
74
|
+
const re = /<category(?:[^>]*)>(?:<!\[CDATA\[([\s\S]*?)\]\]>|([\s\S]*?))<\/category>/g;
|
|
75
|
+
let match;
|
|
76
|
+
while ((match = re.exec(block)) !== null) {
|
|
77
|
+
const category = decodeMediumHtml((match[1] ?? match[2] ?? "").trim());
|
|
78
|
+
if (category)
|
|
79
|
+
categories.push(category);
|
|
80
|
+
}
|
|
81
|
+
return categories;
|
|
82
|
+
}
|
|
83
|
+
export function parseMediumTagRss(xml, limit) {
|
|
84
|
+
const items = [];
|
|
85
|
+
const re = /<item[^>]*>([\s\S]*?)<\/item>/g;
|
|
86
|
+
let match;
|
|
87
|
+
while ((match = re.exec(xml)) !== null) {
|
|
88
|
+
if (match[1])
|
|
89
|
+
items.push(match[1]);
|
|
90
|
+
}
|
|
91
|
+
if (items.length === 0)
|
|
92
|
+
throw new Error("Medium tag RSS feed has no items.");
|
|
93
|
+
return items.slice(0, limit).map((block, index) => ({
|
|
94
|
+
rank: index + 1,
|
|
95
|
+
title: decodeMediumHtml(extractXmlTag(block, "title")).trim(),
|
|
96
|
+
author: decodeMediumHtml(extractXmlTag(block, "dc:creator")).trim(),
|
|
97
|
+
description: stripMediumHtml(extractXmlTag(block, "description")),
|
|
98
|
+
categories: extractMediumCategories(block).join(", "),
|
|
99
|
+
published: mediumRssDate(decodeMediumHtml(extractXmlTag(block, "pubDate"))),
|
|
100
|
+
url: decodeMediumHtml(extractXmlTag(block, "link")).trim(),
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
async function fetchMediumTagRss(tag) {
|
|
104
|
+
const response = await fetch(`https://medium.com/feed/tag/${tag}`, {
|
|
105
|
+
headers: {
|
|
106
|
+
Accept: "application/rss+xml, application/xml",
|
|
107
|
+
"User-Agent": "unicli-medium/1.0 (https://github.com/olo-dot-io/Uni-CLI)",
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
if (response.status === 404)
|
|
111
|
+
throw new Error(`Medium tag "${tag}" does not exist.`);
|
|
112
|
+
if (!response.ok)
|
|
113
|
+
throw new Error(`Medium tag returned HTTP ${response.status}.`);
|
|
114
|
+
return response.text();
|
|
115
|
+
}
|
|
116
|
+
cli({
|
|
117
|
+
site: "medium",
|
|
118
|
+
name: "tag",
|
|
119
|
+
description: "Latest Medium articles tagged with a keyword from RSS",
|
|
120
|
+
domain: "medium.com",
|
|
121
|
+
strategy: Strategy.PUBLIC,
|
|
122
|
+
browser: false,
|
|
123
|
+
args: [
|
|
124
|
+
{
|
|
125
|
+
name: "tag",
|
|
126
|
+
type: "str",
|
|
127
|
+
required: true,
|
|
128
|
+
positional: true,
|
|
129
|
+
description: "Medium tag slug",
|
|
130
|
+
},
|
|
131
|
+
{ name: "limit", type: "int", default: 20, description: "Max articles" },
|
|
132
|
+
],
|
|
133
|
+
columns: [
|
|
134
|
+
"rank",
|
|
135
|
+
"title",
|
|
136
|
+
"author",
|
|
137
|
+
"description",
|
|
138
|
+
"categories",
|
|
139
|
+
"published",
|
|
140
|
+
"url",
|
|
141
|
+
],
|
|
142
|
+
func: async (_page, kwargs) => {
|
|
143
|
+
const tag = requireMediumTag(kwargs.tag);
|
|
144
|
+
const limit = requireMediumLimit(kwargs.limit);
|
|
145
|
+
return parseMediumTagRss(await fetchMediumTagRss(tag), limit);
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=tag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../../src/adapters/medium/tag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/npm/package.ts
|
|
3
|
+
* @does Register agent-facing npm single-package metadata command.
|
|
4
|
+
* @needs registry.npmjs.org public package documents.
|
|
5
|
+
* @feeds surface coverage ledger, JavaScript package inspection, registry command surface.
|
|
6
|
+
* @breaks npm registry document drift or weak scoped-name parsing hides package metadata failures.
|
|
7
|
+
*/
|
|
8
|
+
interface NpmPackageVersion {
|
|
9
|
+
description?: unknown;
|
|
10
|
+
license?: unknown;
|
|
11
|
+
homepage?: unknown;
|
|
12
|
+
repository?: unknown;
|
|
13
|
+
bugs?: unknown;
|
|
14
|
+
keywords?: unknown;
|
|
15
|
+
}
|
|
16
|
+
interface NpmPackageBody {
|
|
17
|
+
name?: unknown;
|
|
18
|
+
description?: unknown;
|
|
19
|
+
"dist-tags"?: {
|
|
20
|
+
latest?: unknown;
|
|
21
|
+
};
|
|
22
|
+
versions?: Record<string, NpmPackageVersion>;
|
|
23
|
+
maintainers?: unknown;
|
|
24
|
+
time?: {
|
|
25
|
+
created?: unknown;
|
|
26
|
+
modified?: unknown;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export declare function requireNpmPackageName(value: unknown): string;
|
|
30
|
+
export declare function mapNpmPackageRow(body: NpmPackageBody, requested: string): Record<string, unknown>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=package.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/adapters/npm/package.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,UAAU,iBAAiB;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAClD;AAMD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAU5D;AAyCD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqCzB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @owner src/adapters/npm/package.ts
|
|
3
|
+
* @does Register agent-facing npm single-package metadata command.
|
|
4
|
+
* @needs registry.npmjs.org public package documents.
|
|
5
|
+
* @feeds surface coverage ledger, JavaScript package inspection, registry command surface.
|
|
6
|
+
* @breaks npm registry document drift or weak scoped-name parsing hides package metadata failures.
|
|
7
|
+
*/
|
|
8
|
+
import { cli, Strategy } from "../../registry.js";
|
|
9
|
+
const NPM_REGISTRY = "https://registry.npmjs.org";
|
|
10
|
+
function stringField(value) {
|
|
11
|
+
return typeof value === "string" ? value.trim() : "";
|
|
12
|
+
}
|
|
13
|
+
export function requireNpmPackageName(value) {
|
|
14
|
+
const name = String(value ?? "").trim();
|
|
15
|
+
if (!name)
|
|
16
|
+
throw new Error("npm package name is required.");
|
|
17
|
+
if (!/^(@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/i.test(name) ||
|
|
18
|
+
name.includes("..")) {
|
|
19
|
+
throw new Error(`npm package name "${String(value)}" is not valid.`);
|
|
20
|
+
}
|
|
21
|
+
return name;
|
|
22
|
+
}
|
|
23
|
+
function repoUrl(repo) {
|
|
24
|
+
if (typeof repo === "string")
|
|
25
|
+
return repo.replace(/^git\+/, "").replace(/\.git$/, "");
|
|
26
|
+
if (repo &&
|
|
27
|
+
typeof repo === "object" &&
|
|
28
|
+
typeof repo.url === "string") {
|
|
29
|
+
return repo.url
|
|
30
|
+
.replace(/^git\+/, "")
|
|
31
|
+
.replace(/\.git$/, "");
|
|
32
|
+
}
|
|
33
|
+
return "";
|
|
34
|
+
}
|
|
35
|
+
function bugUrl(bugs) {
|
|
36
|
+
if (typeof bugs === "string")
|
|
37
|
+
return bugs;
|
|
38
|
+
if (bugs &&
|
|
39
|
+
typeof bugs === "object" &&
|
|
40
|
+
typeof bugs.url === "string") {
|
|
41
|
+
return bugs.url;
|
|
42
|
+
}
|
|
43
|
+
return "";
|
|
44
|
+
}
|
|
45
|
+
function licenseText(license) {
|
|
46
|
+
if (typeof license === "string")
|
|
47
|
+
return license.trim();
|
|
48
|
+
if (license &&
|
|
49
|
+
typeof license === "object" &&
|
|
50
|
+
typeof license.type === "string") {
|
|
51
|
+
return license.type.trim();
|
|
52
|
+
}
|
|
53
|
+
return "";
|
|
54
|
+
}
|
|
55
|
+
export function mapNpmPackageRow(body, requested) {
|
|
56
|
+
const latest = stringField(body["dist-tags"]?.latest);
|
|
57
|
+
if (!latest) {
|
|
58
|
+
throw new Error(`npm registry has no latest version for "${requested}".`);
|
|
59
|
+
}
|
|
60
|
+
const version = body.versions?.[latest] ?? {};
|
|
61
|
+
const name = stringField(body.name) || requested;
|
|
62
|
+
const maintainers = Array.isArray(body.maintainers)
|
|
63
|
+
? body.maintainers
|
|
64
|
+
.map((item) => {
|
|
65
|
+
if (item && typeof item === "object") {
|
|
66
|
+
const rec = item;
|
|
67
|
+
return stringField(rec.name) || stringField(rec.email);
|
|
68
|
+
}
|
|
69
|
+
return String(item ?? "").trim();
|
|
70
|
+
})
|
|
71
|
+
.filter(Boolean)
|
|
72
|
+
.join(", ")
|
|
73
|
+
: "";
|
|
74
|
+
const keywords = Array.isArray(version.keywords)
|
|
75
|
+
? version.keywords.map(stringField).filter(Boolean).join(", ")
|
|
76
|
+
: "";
|
|
77
|
+
return {
|
|
78
|
+
name,
|
|
79
|
+
latestVersion: latest,
|
|
80
|
+
description: stringField(version.description) || stringField(body.description),
|
|
81
|
+
license: licenseText(version.license),
|
|
82
|
+
homepage: stringField(version.homepage),
|
|
83
|
+
repository: repoUrl(version.repository),
|
|
84
|
+
bugs: bugUrl(version.bugs),
|
|
85
|
+
maintainers,
|
|
86
|
+
keywords,
|
|
87
|
+
created: stringField(body.time?.created).slice(0, 10),
|
|
88
|
+
modified: stringField(body.time?.modified).slice(0, 10),
|
|
89
|
+
url: `https://www.npmjs.com/package/${encodeURIComponent(name)}`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async function fetchNpmJson(name) {
|
|
93
|
+
const path = name.split("/").map(encodeURIComponent).join("/");
|
|
94
|
+
const response = await fetch(`${NPM_REGISTRY}/${path}`, {
|
|
95
|
+
headers: {
|
|
96
|
+
"User-Agent": "unicli (https://github.com/olo-dot-io/Uni-CLI)",
|
|
97
|
+
Accept: "application/json",
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
if (response.status === 404)
|
|
101
|
+
throw new Error(`npm package ${name} returned no result.`);
|
|
102
|
+
if (!response.ok)
|
|
103
|
+
throw new Error(`npm package ${name} returned HTTP ${response.status}.`);
|
|
104
|
+
return response.json();
|
|
105
|
+
}
|
|
106
|
+
cli({
|
|
107
|
+
site: "npm",
|
|
108
|
+
name: "package",
|
|
109
|
+
description: "Single npm package metadata",
|
|
110
|
+
domain: "registry.npmjs.org",
|
|
111
|
+
strategy: Strategy.PUBLIC,
|
|
112
|
+
args: [
|
|
113
|
+
{
|
|
114
|
+
name: "name",
|
|
115
|
+
type: "str",
|
|
116
|
+
required: true,
|
|
117
|
+
positional: true,
|
|
118
|
+
description: "npm package name",
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
columns: [
|
|
122
|
+
"name",
|
|
123
|
+
"latestVersion",
|
|
124
|
+
"description",
|
|
125
|
+
"license",
|
|
126
|
+
"homepage",
|
|
127
|
+
"repository",
|
|
128
|
+
"bugs",
|
|
129
|
+
"maintainers",
|
|
130
|
+
"keywords",
|
|
131
|
+
"created",
|
|
132
|
+
"modified",
|
|
133
|
+
"url",
|
|
134
|
+
],
|
|
135
|
+
func: async (_page, kwargs) => {
|
|
136
|
+
const name = requireNpmPackageName(kwargs.name);
|
|
137
|
+
const body = (await fetchNpmJson(name));
|
|
138
|
+
return [mapNpmPackageRow(body, name)];
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/adapters/npm/package.ts"],"names":[],"mappings":"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"}
|