@zenalexa/unicli 0.215.1 → 0.216.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 +15 -15
- package/README.md +233 -389
- package/README.zh-CN.md +235 -362
- package/dist/adapters/1688/assets.d.ts +2 -0
- package/dist/adapters/1688/assets.d.ts.map +1 -0
- package/dist/adapters/1688/assets.js +102 -0
- package/dist/adapters/1688/assets.js.map +1 -0
- package/dist/adapters/51job/jobs.d.ts +2 -0
- package/dist/adapters/51job/jobs.d.ts.map +1 -0
- package/dist/adapters/51job/jobs.js +292 -0
- package/dist/adapters/51job/jobs.js.map +1 -0
- package/dist/adapters/_shared/browser-tools.d.ts +10 -0
- package/dist/adapters/_shared/browser-tools.d.ts.map +1 -0
- package/dist/adapters/_shared/browser-tools.js +42 -0
- package/dist/adapters/_shared/browser-tools.js.map +1 -0
- package/dist/adapters/antigravity/extra.d.ts +2 -0
- package/dist/adapters/antigravity/extra.d.ts.map +1 -0
- package/dist/adapters/antigravity/extra.js +52 -0
- package/dist/adapters/antigravity/extra.js.map +1 -0
- package/dist/adapters/baidu-scholar/search.d.ts +2 -0
- package/dist/adapters/baidu-scholar/search.d.ts.map +1 -0
- package/dist/adapters/baidu-scholar/search.js +34 -0
- package/dist/adapters/baidu-scholar/search.js.map +1 -0
- package/dist/adapters/bilibili/compat.d.ts +2 -0
- package/dist/adapters/bilibili/compat.d.ts.map +1 -0
- package/dist/adapters/bilibili/compat.js +114 -0
- package/dist/adapters/bilibili/compat.js.map +1 -0
- package/dist/adapters/chatgpt/image.d.ts +2 -0
- package/dist/adapters/chatgpt/image.d.ts.map +1 -0
- package/dist/adapters/chatgpt/image.js +81 -0
- package/dist/adapters/chatgpt/image.js.map +1 -0
- package/dist/adapters/chatgpt-app/chatgpt-app.d.ts +2 -0
- package/dist/adapters/chatgpt-app/chatgpt-app.d.ts.map +1 -0
- package/dist/adapters/chatgpt-app/chatgpt-app.js +9 -0
- package/dist/adapters/chatgpt-app/chatgpt-app.js.map +1 -0
- package/dist/adapters/chatwise/extra.d.ts +2 -0
- package/dist/adapters/chatwise/extra.d.ts.map +1 -0
- package/dist/adapters/chatwise/extra.js +35 -0
- package/dist/adapters/chatwise/extra.js.map +1 -0
- package/dist/adapters/codex/extra.d.ts +2 -0
- package/dist/adapters/codex/extra.d.ts.map +1 -0
- package/dist/adapters/codex/extra.js +35 -0
- package/dist/adapters/codex/extra.js.map +1 -0
- package/dist/adapters/deepseek/web.d.ts +2 -0
- package/dist/adapters/deepseek/web.d.ts.map +1 -0
- package/dist/adapters/deepseek/web.js +187 -0
- package/dist/adapters/deepseek/web.js.map +1 -0
- package/dist/adapters/doubao/web.d.ts +2 -0
- package/dist/adapters/doubao/web.d.ts.map +1 -0
- package/dist/adapters/doubao/web.js +138 -0
- package/dist/adapters/doubao/web.js.map +1 -0
- package/dist/adapters/eastmoney/market-data.d.ts +2 -0
- package/dist/adapters/eastmoney/market-data.d.ts.map +1 -0
- package/dist/adapters/eastmoney/market-data.js +753 -0
- package/dist/adapters/eastmoney/market-data.js.map +1 -0
- package/dist/adapters/gitee/user.d.ts +2 -0
- package/dist/adapters/gitee/user.d.ts.map +1 -0
- package/dist/adapters/gitee/user.js +54 -0
- package/dist/adapters/gitee/user.js.map +1 -0
- package/dist/adapters/google-scholar/cite.d.ts +2 -0
- package/dist/adapters/google-scholar/cite.d.ts.map +1 -0
- package/dist/adapters/google-scholar/cite.js +82 -0
- package/dist/adapters/google-scholar/cite.js.map +1 -0
- package/dist/adapters/google-scholar/profile.d.ts +2 -0
- package/dist/adapters/google-scholar/profile.d.ts.map +1 -0
- package/dist/adapters/google-scholar/profile.js +80 -0
- package/dist/adapters/google-scholar/profile.js.map +1 -0
- package/dist/adapters/google-scholar/search.d.ts +2 -0
- package/dist/adapters/google-scholar/search.d.ts.map +1 -0
- package/dist/adapters/google-scholar/search.js +54 -0
- package/dist/adapters/google-scholar/search.js.map +1 -0
- package/dist/adapters/gov-law/laws.d.ts +2 -0
- package/dist/adapters/gov-law/laws.d.ts.map +1 -0
- package/dist/adapters/gov-law/laws.js +58 -0
- package/dist/adapters/gov-law/laws.js.map +1 -0
- package/dist/adapters/gov-policy/policy.d.ts +2 -0
- package/dist/adapters/gov-policy/policy.d.ts.map +1 -0
- package/dist/adapters/gov-policy/policy.js +58 -0
- package/dist/adapters/gov-policy/policy.js.map +1 -0
- package/dist/adapters/jd/commerce.d.ts +2 -0
- package/dist/adapters/jd/commerce.d.ts.map +1 -0
- package/dist/adapters/jd/commerce.js +133 -0
- package/dist/adapters/jd/commerce.js.map +1 -0
- package/dist/adapters/jianyu/detail.d.ts +2 -0
- package/dist/adapters/jianyu/detail.d.ts.map +1 -0
- package/dist/adapters/jianyu/detail.js +27 -0
- package/dist/adapters/jianyu/detail.js.map +1 -0
- package/dist/adapters/jimeng/workspace.d.ts +2 -0
- package/dist/adapters/jimeng/workspace.d.ts.map +1 -0
- package/dist/adapters/jimeng/workspace.js +49 -0
- package/dist/adapters/jimeng/workspace.js.map +1 -0
- package/dist/adapters/ke/rent-transaction.d.ts +2 -0
- package/dist/adapters/ke/rent-transaction.d.ts.map +1 -0
- package/dist/adapters/ke/rent-transaction.js +63 -0
- package/dist/adapters/ke/rent-transaction.js.map +1 -0
- package/dist/adapters/linux-do/search.d.ts +2 -0
- package/dist/adapters/linux-do/search.d.ts.map +1 -0
- package/dist/adapters/linux-do/search.js +75 -0
- package/dist/adapters/linux-do/search.js.map +1 -0
- package/dist/adapters/linux-do/topic-content.d.ts +2 -0
- package/dist/adapters/linux-do/topic-content.d.ts.map +1 -0
- package/dist/adapters/linux-do/topic-content.js +32 -0
- package/dist/adapters/linux-do/topic-content.js.map +1 -0
- package/dist/adapters/maimai/talents.d.ts +2 -0
- package/dist/adapters/maimai/talents.d.ts.map +1 -0
- package/dist/adapters/maimai/talents.js +64 -0
- package/dist/adapters/maimai/talents.js.map +1 -0
- package/dist/adapters/mubu/docs.d.ts +2 -0
- package/dist/adapters/mubu/docs.d.ts.map +1 -0
- package/dist/adapters/mubu/docs.js +96 -0
- package/dist/adapters/mubu/docs.js.map +1 -0
- package/dist/adapters/nowcoder/nowcoder.d.ts +2 -0
- package/dist/adapters/nowcoder/nowcoder.d.ts.map +1 -0
- package/dist/adapters/nowcoder/nowcoder.js +480 -0
- package/dist/adapters/nowcoder/nowcoder.js.map +1 -0
- package/dist/adapters/powerchina/search.d.ts +2 -0
- package/dist/adapters/powerchina/search.d.ts.map +1 -0
- package/dist/adapters/powerchina/search.js +41 -0
- package/dist/adapters/powerchina/search.js.map +1 -0
- package/dist/adapters/quark/actions.d.ts +2 -0
- package/dist/adapters/quark/actions.d.ts.map +1 -0
- package/dist/adapters/quark/actions.js +151 -0
- package/dist/adapters/quark/actions.js.map +1 -0
- package/dist/adapters/reddit/browser-utils.d.ts +7 -0
- package/dist/adapters/reddit/browser-utils.d.ts.map +1 -0
- package/dist/adapters/reddit/browser-utils.js +68 -0
- package/dist/adapters/reddit/browser-utils.js.map +1 -0
- package/dist/adapters/reddit/listings.d.ts +2 -0
- package/dist/adapters/reddit/listings.d.ts.map +1 -0
- package/dist/adapters/reddit/listings.js +193 -0
- package/dist/adapters/reddit/listings.js.map +1 -0
- package/dist/adapters/reddit/search.d.ts +2 -0
- package/dist/adapters/reddit/search.d.ts.map +1 -0
- package/dist/adapters/reddit/search.js +66 -0
- package/dist/adapters/reddit/search.js.map +1 -0
- package/dist/adapters/spotify/api.d.ts +2 -0
- package/dist/adapters/spotify/api.d.ts.map +1 -0
- package/dist/adapters/spotify/api.js +252 -0
- package/dist/adapters/spotify/api.js.map +1 -0
- package/dist/adapters/taobao/commerce.d.ts +2 -0
- package/dist/adapters/taobao/commerce.d.ts.map +1 -0
- package/dist/adapters/taobao/commerce.js +130 -0
- package/dist/adapters/taobao/commerce.js.map +1 -0
- package/dist/adapters/tdx/hot-rank.d.ts +2 -0
- package/dist/adapters/tdx/hot-rank.d.ts.map +1 -0
- package/dist/adapters/tdx/hot-rank.js +34 -0
- package/dist/adapters/tdx/hot-rank.js.map +1 -0
- package/dist/adapters/ths/hot-rank.d.ts +2 -0
- package/dist/adapters/ths/hot-rank.d.ts.map +1 -0
- package/dist/adapters/ths/hot-rank.js +34 -0
- package/dist/adapters/ths/hot-rank.js.map +1 -0
- package/dist/adapters/toutiao/articles.d.ts +2 -0
- package/dist/adapters/toutiao/articles.d.ts.map +1 -0
- package/dist/adapters/toutiao/articles.js +41 -0
- package/dist/adapters/toutiao/articles.js.map +1 -0
- package/dist/adapters/twitter/lists-extra.d.ts +2 -0
- package/dist/adapters/twitter/lists-extra.d.ts.map +1 -0
- package/dist/adapters/twitter/lists-extra.js +125 -0
- package/dist/adapters/twitter/lists-extra.js.map +1 -0
- package/dist/adapters/uiverse/components.d.ts +2 -0
- package/dist/adapters/uiverse/components.d.ts.map +1 -0
- package/dist/adapters/uiverse/components.js +138 -0
- package/dist/adapters/uiverse/components.js.map +1 -0
- package/dist/adapters/wanfang/search.d.ts +2 -0
- package/dist/adapters/wanfang/search.d.ts.map +1 -0
- package/dist/adapters/wanfang/search.js +34 -0
- package/dist/adapters/wanfang/search.js.map +1 -0
- package/dist/adapters/weixin/drafts.d.ts +2 -0
- package/dist/adapters/weixin/drafts.d.ts.map +1 -0
- package/dist/adapters/weixin/drafts.js +69 -0
- package/dist/adapters/weixin/drafts.js.map +1 -0
- package/dist/adapters/weread/ai-outline.d.ts +2 -0
- package/dist/adapters/weread/ai-outline.d.ts.map +1 -0
- package/dist/adapters/weread/ai-outline.js +28 -0
- package/dist/adapters/weread/ai-outline.js.map +1 -0
- package/dist/adapters/xiaoyuzhou/media.d.ts +2 -0
- package/dist/adapters/xiaoyuzhou/media.d.ts.map +1 -0
- package/dist/adapters/xiaoyuzhou/media.js +105 -0
- package/dist/adapters/xiaoyuzhou/media.js.map +1 -0
- package/dist/adapters/xueqiu/extra.d.ts +2 -0
- package/dist/adapters/xueqiu/extra.d.ts.map +1 -0
- package/dist/adapters/xueqiu/extra.js +74 -0
- package/dist/adapters/xueqiu/extra.js.map +1 -0
- package/dist/adapters/youtube/personal.d.ts +2 -0
- package/dist/adapters/youtube/personal.d.ts.map +1 -0
- package/dist/adapters/youtube/personal.js +183 -0
- package/dist/adapters/youtube/personal.js.map +1 -0
- package/dist/adapters/zhihu/actions.d.ts +2 -0
- package/dist/adapters/zhihu/actions.d.ts.map +1 -0
- package/dist/adapters/zhihu/actions.js +110 -0
- package/dist/adapters/zhihu/actions.js.map +1 -0
- package/dist/browser/adapter-authoring.d.ts.map +1 -1
- package/dist/browser/adapter-authoring.js +3 -3
- package/dist/browser/adapter-authoring.js.map +1 -1
- package/dist/browser/bridge.d.ts.map +1 -1
- package/dist/browser/bridge.js +2 -3
- package/dist/browser/bridge.js.map +1 -1
- package/dist/browser/daemon-client.d.ts.map +1 -1
- package/dist/browser/daemon-client.js +17 -5
- package/dist/browser/daemon-client.js.map +1 -1
- package/dist/browser/network-cache.js +2 -2
- package/dist/browser/network-cache.js.map +1 -1
- package/dist/browser/site-memory.d.ts.map +1 -1
- package/dist/browser/site-memory.js +11 -8
- package/dist/browser/site-memory.js.map +1 -1
- package/dist/browser/target-errors.d.ts +2 -2
- package/dist/browser/target-errors.js +2 -2
- package/dist/browser/verify-fixture.d.ts.map +1 -1
- package/dist/browser/verify-fixture.js +2 -2
- package/dist/browser/verify-fixture.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +5 -2
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +8 -2
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/browser-operator-runtime.d.ts.map +1 -1
- package/dist/commands/browser-operator-runtime.js +2 -2
- package/dist/commands/browser-operator-runtime.js.map +1 -1
- package/dist/commands/browser-operator.d.ts.map +1 -1
- package/dist/commands/browser-operator.js +2 -2
- package/dist/commands/browser-operator.js.map +1 -1
- package/dist/commands/describe.d.ts +2 -2
- package/dist/commands/describe.d.ts.map +1 -1
- package/dist/commands/describe.js +14 -3
- package/dist/commands/describe.js.map +1 -1
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +7 -6
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/explore.js +2 -2
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/generate.js +3 -3
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +4 -10
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/migrate.d.ts +9 -9
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +22 -22
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/repair.d.ts.map +1 -1
- package/dist/commands/repair.js +9 -4
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/search.d.ts +3 -3
- package/dist/commands/search.js +4 -4
- package/dist/commands/skills.d.ts +3 -0
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +8 -4
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/synthesize.js +2 -2
- package/dist/commands/synthesize.js.map +1 -1
- package/dist/discovery/aliases.d.ts.map +1 -1
- package/dist/discovery/aliases.js +69 -0
- package/dist/discovery/aliases.js.map +1 -1
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +130 -0
- package/dist/discovery/loader.js.map +1 -1
- package/dist/engine/kernel/execute.d.ts.map +1 -1
- package/dist/engine/kernel/execute.js +27 -4
- package/dist/engine/kernel/execute.js.map +1 -1
- package/dist/engine/user-home.d.ts +9 -0
- package/dist/engine/user-home.d.ts.map +1 -0
- package/dist/engine/user-home.js +12 -0
- package/dist/engine/user-home.js.map +1 -0
- package/dist/fast-path.d.ts +14 -0
- package/dist/fast-path.d.ts.map +1 -0
- package/dist/fast-path.js +565 -0
- package/dist/fast-path.js.map +1 -0
- package/dist/hub/index.d.ts +1 -1
- package/dist/hub/index.d.ts.map +1 -1
- package/dist/hub/index.js +28 -17
- package/dist/hub/index.js.map +1 -1
- package/dist/main.js +6 -3
- package/dist/main.js.map +1 -1
- package/dist/manifest-compact.txt +11 -11
- package/dist/manifest-search.json +1 -1
- package/dist/manifest.json +27600 -1016
- package/dist/mcp/tools.js +1 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/output/error-map.d.ts.map +1 -1
- package/dist/output/error-map.js +16 -5
- package/dist/output/error-map.js.map +1 -1
- package/dist/protocol/acp.js +1 -1
- package/dist/protocol/acp.js.map +1 -1
- package/dist/registry.d.ts +3 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +34 -1
- package/dist/registry.js.map +1 -1
- package/dist/runtime/usage-ledger.d.ts +6 -7
- package/dist/runtime/usage-ledger.d.ts.map +1 -1
- package/dist/runtime/usage-ledger.js +6 -7
- package/dist/runtime/usage-ledger.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +57 -52
- package/src/adapters/1688/assets.ts +114 -0
- package/src/adapters/51job/jobs.ts +327 -0
- package/src/adapters/_shared/browser-tools.ts +59 -0
- package/src/adapters/antigravity/extra.ts +53 -0
- package/src/adapters/baidu-scholar/search.ts +38 -0
- package/src/adapters/bilibili/compat.ts +132 -0
- package/src/adapters/binance/asks.yaml +41 -0
- package/src/adapters/binance/depth.yaml +41 -0
- package/src/adapters/binance/gainers.yaml +42 -0
- package/src/adapters/binance/hot.yaml +1 -1
- package/src/adapters/binance/kline.yaml +1 -1
- package/src/adapters/binance/klines.yaml +46 -0
- package/src/adapters/binance/losers.yaml +42 -0
- package/src/adapters/binance/pairs.yaml +38 -0
- package/src/adapters/binance/price.yaml +32 -0
- package/src/adapters/binance/prices.yaml +30 -0
- package/src/adapters/binance/ticker.yaml +2 -2
- package/src/adapters/binance/top.yaml +46 -0
- package/src/adapters/binance/trades.yaml +42 -0
- package/src/adapters/chatgpt/image.ts +84 -0
- package/src/adapters/chatgpt-app/chatgpt-app.ts +11 -0
- package/src/adapters/chatwise/extra.ts +36 -0
- package/src/adapters/codex/extra.ts +36 -0
- package/src/adapters/deepseek/web.ts +203 -0
- package/src/adapters/doubao/web.ts +154 -0
- package/src/adapters/eastmoney/market-data.ts +829 -0
- package/src/adapters/excel/insert-image.yaml +80 -0
- package/src/adapters/excel/insert-link.yaml +90 -0
- package/src/adapters/excel/list.yaml +63 -0
- package/src/adapters/excel/read.yaml +74 -0
- package/src/adapters/excel/set-cell.yaml +77 -0
- package/src/adapters/excel/set-font.yaml +87 -0
- package/src/adapters/excel/status.yaml +29 -0
- package/src/adapters/gh/search-repos.yaml +62 -0
- package/src/adapters/gitee/user.ts +59 -0
- package/src/adapters/google-scholar/cite.ts +95 -0
- package/src/adapters/google-scholar/profile.ts +91 -0
- package/src/adapters/google-scholar/search.ts +58 -0
- package/src/adapters/gov-law/laws.ts +61 -0
- package/src/adapters/gov-policy/policy.ts +61 -0
- package/src/adapters/imessage/contact.yaml +7 -2
- package/src/adapters/imessage/recent.yaml +7 -2
- package/src/adapters/imessage/search.yaml +7 -2
- package/src/adapters/jd/commerce.ts +142 -0
- package/src/adapters/jianyu/detail.ts +28 -0
- package/src/adapters/jimeng/workspace.ts +53 -0
- package/src/adapters/ke/rent-transaction.ts +70 -0
- package/src/adapters/linux-do/search.ts +92 -0
- package/src/adapters/linux-do/topic-content.ts +45 -0
- package/src/adapters/maimai/talents.ts +65 -0
- package/src/adapters/mubu/docs.ts +107 -0
- package/src/adapters/nowcoder/nowcoder.ts +570 -0
- package/src/adapters/powerchina/search.ts +45 -0
- package/src/adapters/powerpoint/add-slide.yaml +93 -0
- package/src/adapters/powerpoint/insert-image.yaml +71 -0
- package/src/adapters/powerpoint/insert-link.yaml +94 -0
- package/src/adapters/powerpoint/list.yaml +58 -0
- package/src/adapters/powerpoint/set-font.yaml +101 -0
- package/src/adapters/powerpoint/slides.yaml +73 -0
- package/src/adapters/powerpoint/status.yaml +29 -0
- package/src/adapters/quark/actions.ts +169 -0
- package/src/adapters/reddit/browser-utils.ts +93 -0
- package/src/adapters/reddit/listings.ts +223 -0
- package/src/adapters/reddit/search.ts +74 -0
- package/src/adapters/spotify/api.ts +292 -0
- package/src/adapters/taobao/commerce.ts +134 -0
- package/src/adapters/tdx/hot-rank.ts +35 -0
- package/src/adapters/ths/hot-rank.ts +35 -0
- package/src/adapters/toutiao/articles.ts +45 -0
- package/src/adapters/twitter/lists-extra.ts +139 -0
- package/src/adapters/uiverse/components.ts +154 -0
- package/src/adapters/vercel/list.yaml +2 -1
- package/src/adapters/wanfang/search.ts +38 -0
- package/src/adapters/weixin/drafts.ts +74 -0
- package/src/adapters/weread/ai-outline.ts +32 -0
- package/src/adapters/word/insert-image.yaml +73 -0
- package/src/adapters/word/insert-link.yaml +82 -0
- package/src/adapters/word/insert-text.yaml +72 -0
- package/src/adapters/word/list.yaml +63 -0
- package/src/adapters/word/read.yaml +63 -0
- package/src/adapters/word/set-font.yaml +97 -0
- package/src/adapters/word/status.yaml +29 -0
- package/src/adapters/xiaoyuzhou/media.ts +139 -0
- package/src/adapters/xueqiu/extra.ts +78 -0
- package/src/adapters/youtube/personal.ts +215 -0
- package/src/adapters/zhihu/actions.ts +111 -0
- package/src/hub/external-clis-harness.yaml +211 -0
- package/src/hub/index.ts +29 -25
- package/src/adapters/linux-do/search.yaml +0 -44
- package/src/adapters/meituan/hot.yaml +0 -34
- package/src/adapters/reddit/frontpage.test.ts +0 -15
- package/src/adapters/reddit/frontpage.yaml +0 -41
- package/src/adapters/reddit/hot.test.ts +0 -15
- package/src/adapters/reddit/hot.yaml +0 -41
- package/src/adapters/reddit/new.test.ts +0 -15
- package/src/adapters/reddit/new.yaml +0 -42
- package/src/adapters/reddit/popular.test.ts +0 -15
- package/src/adapters/reddit/popular.yaml +0 -41
- package/src/adapters/reddit/rising.test.ts +0 -15
- package/src/adapters/reddit/rising.yaml +0 -41
- package/src/adapters/reddit/search.test.ts +0 -15
- package/src/adapters/reddit/search.yaml +0 -52
- package/src/adapters/reddit/subreddit.test.ts +0 -15
- package/src/adapters/reddit/subreddit.yaml +0 -50
- package/src/adapters/reddit/top.test.ts +0 -15
- package/src/adapters/reddit/top.yaml +0 -48
- package/src/adapters/reddit/trending.test.ts +0 -15
- package/src/adapters/reddit/trending.yaml +0 -33
package/src/hub/index.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* External CLI Hub — registry and auto-discovery for third-party CLIs.
|
|
3
3
|
*
|
|
4
|
-
* Reads
|
|
4
|
+
* Reads the external CLI registries at startup, checks which binaries are
|
|
5
5
|
* installed on $PATH, and exposes lookup helpers for the rest of the
|
|
6
6
|
* system (Commander registration, `unicli ext` subcommands, AGENTS.md).
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
-
import { readFileSync } from "node:fs";
|
|
9
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
10
10
|
import { join, dirname } from "node:path";
|
|
11
11
|
import { fileURLToPath } from "node:url";
|
|
12
12
|
import { execFileSync } from "node:child_process";
|
|
@@ -30,6 +30,7 @@ export interface ExternalCli {
|
|
|
30
30
|
|
|
31
31
|
let _cache: ExternalCli[] | null = null;
|
|
32
32
|
const _installedCache = new Map<string, boolean>();
|
|
33
|
+
const REGISTRY_FILES = ["external-clis.yaml", "external-clis-harness.yaml"];
|
|
33
34
|
|
|
34
35
|
// ── Loader ──────────────────────────────────────────────────────────────
|
|
35
36
|
|
|
@@ -40,26 +41,35 @@ const _installedCache = new Map<string, boolean>();
|
|
|
40
41
|
* At runtime we may be executing from `dist/hub/`, so we try the source
|
|
41
42
|
* sibling first (`../../src/hub/`) then fall back to the co-located path.
|
|
42
43
|
*/
|
|
43
|
-
function resolveYamlPath(): string {
|
|
44
|
+
function resolveYamlPath(fileName: string): string | null {
|
|
44
45
|
// Running from dist/hub/index.js → ../../src/hub/external-clis.yaml
|
|
45
|
-
const fromDist = join(
|
|
46
|
-
__dirname,
|
|
47
|
-
"..",
|
|
48
|
-
"..",
|
|
49
|
-
"src",
|
|
50
|
-
"hub",
|
|
51
|
-
"external-clis.yaml",
|
|
52
|
-
);
|
|
46
|
+
const fromDist = join(__dirname, "..", "..", "src", "hub", fileName);
|
|
53
47
|
// Running from src/hub/index.ts (dev via tsx)
|
|
54
|
-
const fromSrc = join(__dirname,
|
|
48
|
+
const fromSrc = join(__dirname, fileName);
|
|
55
49
|
|
|
56
50
|
// Prefer the source copy (always present in both dev & installed package)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
51
|
+
if (existsSync(fromSrc)) return fromSrc;
|
|
52
|
+
if (existsSync(fromDist)) return fromDist;
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function readRegistryFile(fileName: string): ExternalCli[] {
|
|
57
|
+
const path = resolveYamlPath(fileName);
|
|
58
|
+
if (!path) return [];
|
|
59
|
+
|
|
60
|
+
const raw = readFileSync(path, "utf-8");
|
|
61
|
+
const parsed = yaml.load(raw);
|
|
62
|
+
return Array.isArray(parsed) ? (parsed as ExternalCli[]) : [];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function dedupeRegistry(entries: ExternalCli[]): ExternalCli[] {
|
|
66
|
+
const seen = new Set<string>();
|
|
67
|
+
return entries.filter((entry) => {
|
|
68
|
+
const key = `${entry.name}\0${entry.binary}`;
|
|
69
|
+
if (seen.has(key)) return false;
|
|
70
|
+
seen.add(key);
|
|
71
|
+
return true;
|
|
72
|
+
});
|
|
63
73
|
}
|
|
64
74
|
|
|
65
75
|
/**
|
|
@@ -70,13 +80,7 @@ export function loadExternalClis(): ExternalCli[] {
|
|
|
70
80
|
if (_cache) return _cache;
|
|
71
81
|
|
|
72
82
|
try {
|
|
73
|
-
|
|
74
|
-
const parsed = yaml.load(raw);
|
|
75
|
-
if (!Array.isArray(parsed)) {
|
|
76
|
-
_cache = [];
|
|
77
|
-
return _cache;
|
|
78
|
-
}
|
|
79
|
-
_cache = parsed as ExternalCli[];
|
|
83
|
+
_cache = dedupeRegistry(REGISTRY_FILES.flatMap(readRegistryFile));
|
|
80
84
|
return _cache;
|
|
81
85
|
} catch {
|
|
82
86
|
_cache = [];
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
site: linux-do
|
|
2
|
-
name: search
|
|
3
|
-
description: Search Linux.do forum topics
|
|
4
|
-
domain: linux.do
|
|
5
|
-
type: web-api
|
|
6
|
-
strategy: public
|
|
7
|
-
|
|
8
|
-
args:
|
|
9
|
-
query:
|
|
10
|
-
required: true
|
|
11
|
-
positional: true
|
|
12
|
-
description: Search query
|
|
13
|
-
limit:
|
|
14
|
-
type: int
|
|
15
|
-
default: 20
|
|
16
|
-
description: Number of results
|
|
17
|
-
|
|
18
|
-
pipeline:
|
|
19
|
-
- fetch:
|
|
20
|
-
url: https://linux.do/search.json
|
|
21
|
-
params:
|
|
22
|
-
q: "${{ args.query }}"
|
|
23
|
-
|
|
24
|
-
- select: topics
|
|
25
|
-
|
|
26
|
-
- map:
|
|
27
|
-
rank: ${{ index + 1 }}
|
|
28
|
-
title: ${{ item.title }}
|
|
29
|
-
views: ${{ item.views }}
|
|
30
|
-
likes: ${{ item.like_count }}
|
|
31
|
-
replies: ${{ (item.posts_count || 1) - 1 }}
|
|
32
|
-
url: ${{ 'https://linux.do/t/topic/' + item.id }}
|
|
33
|
-
|
|
34
|
-
- limit: ${{ args.limit }}
|
|
35
|
-
|
|
36
|
-
columns: [rank, title, views, likes, replies, url]
|
|
37
|
-
|
|
38
|
-
# schema-v2 metadata — injected by `unicli migrate schema-v2`
|
|
39
|
-
capabilities: ["http.fetch"]
|
|
40
|
-
minimum_capability: http.fetch
|
|
41
|
-
trust: public
|
|
42
|
-
confidentiality: public
|
|
43
|
-
quarantine: false
|
|
44
|
-
schema_version: v2
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
site: meituan
|
|
2
|
-
name: hot
|
|
3
|
-
description: Meituan hot search keywords
|
|
4
|
-
domain: apimobile.meituan.com
|
|
5
|
-
type: web-api
|
|
6
|
-
strategy: public
|
|
7
|
-
|
|
8
|
-
args:
|
|
9
|
-
limit:
|
|
10
|
-
type: int
|
|
11
|
-
default: 20
|
|
12
|
-
|
|
13
|
-
pipeline:
|
|
14
|
-
- fetch:
|
|
15
|
-
url: https://apimobile.meituan.com/group/v1/recommend/hotword/1
|
|
16
|
-
|
|
17
|
-
- select: data.hotSearchWords
|
|
18
|
-
|
|
19
|
-
- map:
|
|
20
|
-
rank: ${{ index + 1 }}
|
|
21
|
-
keyword: "${{ item.word || item }}"
|
|
22
|
-
count: "${{ item.count || '' }}"
|
|
23
|
-
|
|
24
|
-
- limit: ${{ args.limit }}
|
|
25
|
-
|
|
26
|
-
columns: [rank, keyword, count]
|
|
27
|
-
|
|
28
|
-
# schema-v2 metadata — injected by `unicli migrate schema-v2`
|
|
29
|
-
capabilities: ["http.fetch"]
|
|
30
|
-
minimum_capability: http.fetch
|
|
31
|
-
trust: public
|
|
32
|
-
confidentiality: public
|
|
33
|
-
quarantine: false
|
|
34
|
-
schema_version: v2
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
runAdapterWithFixture,
|
|
4
|
-
expectAdapterShape,
|
|
5
|
-
} from "../../../tests/adapter-runner.js";
|
|
6
|
-
|
|
7
|
-
describe("reddit frontpage", () => {
|
|
8
|
-
it("returns rows with declared columns against fixture", async () => {
|
|
9
|
-
const { output } = await runAdapterWithFixture("reddit", "frontpage");
|
|
10
|
-
expectAdapterShape(output, {
|
|
11
|
-
columns: ["rank", "title", "subreddit", "score", "comments", "author"],
|
|
12
|
-
minItems: 1,
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
site: reddit
|
|
2
|
-
name: frontpage
|
|
3
|
-
description: Reddit front page / r/all
|
|
4
|
-
domain: www.reddit.com
|
|
5
|
-
type: web-api
|
|
6
|
-
strategy: public
|
|
7
|
-
|
|
8
|
-
args:
|
|
9
|
-
limit:
|
|
10
|
-
type: int
|
|
11
|
-
default: 20
|
|
12
|
-
description: Number of posts
|
|
13
|
-
|
|
14
|
-
pipeline:
|
|
15
|
-
- fetch:
|
|
16
|
-
url: https://www.reddit.com/r/all.json
|
|
17
|
-
params:
|
|
18
|
-
limit: ${{ args.limit }}
|
|
19
|
-
raw_json: "1"
|
|
20
|
-
- select: data.children
|
|
21
|
-
|
|
22
|
-
- map:
|
|
23
|
-
rank: ${{ index + 1 }}
|
|
24
|
-
title: ${{ item.data.title }}
|
|
25
|
-
subreddit: ${{ item.data.subreddit_name_prefixed }}
|
|
26
|
-
score: ${{ item.data.score }}
|
|
27
|
-
comments: ${{ item.data.num_comments }}
|
|
28
|
-
author: ${{ item.data.author }}
|
|
29
|
-
url: ${{ item.data.url }}
|
|
30
|
-
|
|
31
|
-
- limit: ${{ args.limit }}
|
|
32
|
-
|
|
33
|
-
columns: [rank, title, subreddit, score, comments, author]
|
|
34
|
-
|
|
35
|
-
# schema-v2 metadata — injected by `unicli migrate schema-v2`
|
|
36
|
-
capabilities: ["http.fetch"]
|
|
37
|
-
minimum_capability: http.fetch
|
|
38
|
-
trust: public
|
|
39
|
-
confidentiality: public
|
|
40
|
-
quarantine: false
|
|
41
|
-
schema_version: v2
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
runAdapterWithFixture,
|
|
4
|
-
expectAdapterShape,
|
|
5
|
-
} from "../../../tests/adapter-runner.js";
|
|
6
|
-
|
|
7
|
-
describe("reddit hot", () => {
|
|
8
|
-
it("returns rows with declared columns against fixture", async () => {
|
|
9
|
-
const { output } = await runAdapterWithFixture("reddit", "hot");
|
|
10
|
-
expectAdapterShape(output, {
|
|
11
|
-
columns: ["rank", "title", "subreddit", "score", "comments", "author"],
|
|
12
|
-
minItems: 1,
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
site: reddit
|
|
2
|
-
name: hot
|
|
3
|
-
description: Reddit front page hot posts
|
|
4
|
-
domain: www.reddit.com
|
|
5
|
-
type: web-api
|
|
6
|
-
strategy: public
|
|
7
|
-
browser: false
|
|
8
|
-
|
|
9
|
-
args:
|
|
10
|
-
limit:
|
|
11
|
-
type: int
|
|
12
|
-
default: 20
|
|
13
|
-
description: Number of posts
|
|
14
|
-
|
|
15
|
-
pipeline:
|
|
16
|
-
- fetch:
|
|
17
|
-
url: https://www.reddit.com/r/all/hot.json
|
|
18
|
-
params:
|
|
19
|
-
limit: ${{ args.limit }}
|
|
20
|
-
- select: data.children
|
|
21
|
-
|
|
22
|
-
- map:
|
|
23
|
-
rank: ${{ index + 1 }}
|
|
24
|
-
title: ${{ item.data.title }}
|
|
25
|
-
subreddit: ${{ item.data.subreddit_name_prefixed }}
|
|
26
|
-
score: ${{ item.data.score }}
|
|
27
|
-
comments: ${{ item.data.num_comments }}
|
|
28
|
-
author: ${{ item.data.author }}
|
|
29
|
-
url: ${{ item.data.url }}
|
|
30
|
-
|
|
31
|
-
- limit: ${{ args.limit }}
|
|
32
|
-
|
|
33
|
-
columns: [rank, title, subreddit, score, comments, author]
|
|
34
|
-
|
|
35
|
-
# schema-v2 metadata — injected by `unicli migrate schema-v2`
|
|
36
|
-
capabilities: ["http.fetch"]
|
|
37
|
-
minimum_capability: http.fetch
|
|
38
|
-
trust: public
|
|
39
|
-
confidentiality: public
|
|
40
|
-
quarantine: false
|
|
41
|
-
schema_version: v2
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
runAdapterWithFixture,
|
|
4
|
-
expectAdapterShape,
|
|
5
|
-
} from "../../../tests/adapter-runner.js";
|
|
6
|
-
|
|
7
|
-
describe("reddit new", () => {
|
|
8
|
-
it("returns rows with declared columns against fixture", async () => {
|
|
9
|
-
const { output } = await runAdapterWithFixture("reddit", "new");
|
|
10
|
-
expectAdapterShape(output, {
|
|
11
|
-
columns: ["title", "author", "subreddit", "score", "comments"],
|
|
12
|
-
minItems: 1,
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
site: reddit
|
|
2
|
-
name: new
|
|
3
|
-
description: Reddit newest posts from all subreddits
|
|
4
|
-
domain: www.reddit.com
|
|
5
|
-
type: web-api
|
|
6
|
-
strategy: public
|
|
7
|
-
|
|
8
|
-
args:
|
|
9
|
-
subreddit:
|
|
10
|
-
type: str
|
|
11
|
-
description: Subreddit name (without r/)
|
|
12
|
-
limit:
|
|
13
|
-
type: int
|
|
14
|
-
default: 20
|
|
15
|
-
|
|
16
|
-
pipeline:
|
|
17
|
-
- fetch:
|
|
18
|
-
url: "https://www.reddit.com/${{ args.subreddit ? 'r/' + args.subreddit + '/' : '' }}new.json"
|
|
19
|
-
params:
|
|
20
|
-
limit: "${{ args.limit }}"
|
|
21
|
-
|
|
22
|
-
- select: data.children
|
|
23
|
-
|
|
24
|
-
- map:
|
|
25
|
-
title: "${{ item.data.title }}"
|
|
26
|
-
author: "${{ item.data.author }}"
|
|
27
|
-
subreddit: "${{ item.data.subreddit }}"
|
|
28
|
-
score: "${{ item.data.score }}"
|
|
29
|
-
comments: "${{ item.data.num_comments }}"
|
|
30
|
-
url: "${{ 'https://www.reddit.com' + item.data.permalink }}"
|
|
31
|
-
|
|
32
|
-
- limit: ${{ args.limit }}
|
|
33
|
-
|
|
34
|
-
columns: [title, author, subreddit, score, comments]
|
|
35
|
-
|
|
36
|
-
# schema-v2 metadata — injected by `unicli migrate schema-v2`
|
|
37
|
-
capabilities: ["http.fetch"]
|
|
38
|
-
minimum_capability: http.fetch
|
|
39
|
-
trust: public
|
|
40
|
-
confidentiality: public
|
|
41
|
-
quarantine: false
|
|
42
|
-
schema_version: v2
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
runAdapterWithFixture,
|
|
4
|
-
expectAdapterShape,
|
|
5
|
-
} from "../../../tests/adapter-runner.js";
|
|
6
|
-
|
|
7
|
-
describe("reddit popular", () => {
|
|
8
|
-
it("returns rows with declared columns against fixture", async () => {
|
|
9
|
-
const { output } = await runAdapterWithFixture("reddit", "popular");
|
|
10
|
-
expectAdapterShape(output, {
|
|
11
|
-
columns: ["rank", "title", "subreddit", "score", "comments", "author"],
|
|
12
|
-
minItems: 1,
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
site: reddit
|
|
2
|
-
name: popular
|
|
3
|
-
description: Reddit popular posts (/r/popular)
|
|
4
|
-
domain: www.reddit.com
|
|
5
|
-
type: web-api
|
|
6
|
-
strategy: public
|
|
7
|
-
|
|
8
|
-
args:
|
|
9
|
-
limit:
|
|
10
|
-
type: int
|
|
11
|
-
default: 20
|
|
12
|
-
description: Number of posts
|
|
13
|
-
|
|
14
|
-
pipeline:
|
|
15
|
-
- fetch:
|
|
16
|
-
url: https://www.reddit.com/r/popular.json
|
|
17
|
-
params:
|
|
18
|
-
limit: ${{ args.limit }}
|
|
19
|
-
raw_json: "1"
|
|
20
|
-
- select: data.children
|
|
21
|
-
|
|
22
|
-
- map:
|
|
23
|
-
rank: ${{ index + 1 }}
|
|
24
|
-
title: ${{ item.data.title }}
|
|
25
|
-
subreddit: ${{ item.data.subreddit_name_prefixed }}
|
|
26
|
-
score: ${{ item.data.score }}
|
|
27
|
-
comments: ${{ item.data.num_comments }}
|
|
28
|
-
author: ${{ item.data.author }}
|
|
29
|
-
url: ${{ item.data.url }}
|
|
30
|
-
|
|
31
|
-
- limit: ${{ args.limit }}
|
|
32
|
-
|
|
33
|
-
columns: [rank, title, subreddit, score, comments, author]
|
|
34
|
-
|
|
35
|
-
# schema-v2 metadata — injected by `unicli migrate schema-v2`
|
|
36
|
-
capabilities: ["http.fetch"]
|
|
37
|
-
minimum_capability: http.fetch
|
|
38
|
-
trust: public
|
|
39
|
-
confidentiality: public
|
|
40
|
-
quarantine: false
|
|
41
|
-
schema_version: v2
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
runAdapterWithFixture,
|
|
4
|
-
expectAdapterShape,
|
|
5
|
-
} from "../../../tests/adapter-runner.js";
|
|
6
|
-
|
|
7
|
-
describe("reddit rising", () => {
|
|
8
|
-
it("returns rows with declared columns against fixture", async () => {
|
|
9
|
-
const { output } = await runAdapterWithFixture("reddit", "rising");
|
|
10
|
-
expectAdapterShape(output, {
|
|
11
|
-
columns: ["title", "author", "subreddit", "score", "comments"],
|
|
12
|
-
minItems: 1,
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
site: reddit
|
|
2
|
-
name: rising
|
|
3
|
-
description: Reddit rising posts
|
|
4
|
-
domain: www.reddit.com
|
|
5
|
-
type: web-api
|
|
6
|
-
strategy: public
|
|
7
|
-
|
|
8
|
-
args:
|
|
9
|
-
subreddit:
|
|
10
|
-
type: str
|
|
11
|
-
description: Subreddit name (without r/)
|
|
12
|
-
limit:
|
|
13
|
-
type: int
|
|
14
|
-
default: 20
|
|
15
|
-
|
|
16
|
-
pipeline:
|
|
17
|
-
- fetch:
|
|
18
|
-
url: "https://www.reddit.com/${{ args.subreddit ? 'r/' + args.subreddit + '/' : '' }}rising.json"
|
|
19
|
-
params:
|
|
20
|
-
limit: "${{ args.limit }}"
|
|
21
|
-
|
|
22
|
-
- select: data.children
|
|
23
|
-
|
|
24
|
-
- map:
|
|
25
|
-
title: "${{ item.data.title }}"
|
|
26
|
-
author: "${{ item.data.author }}"
|
|
27
|
-
subreddit: "${{ item.data.subreddit }}"
|
|
28
|
-
score: "${{ item.data.score }}"
|
|
29
|
-
comments: "${{ item.data.num_comments }}"
|
|
30
|
-
|
|
31
|
-
- limit: ${{ args.limit }}
|
|
32
|
-
|
|
33
|
-
columns: [title, author, subreddit, score, comments]
|
|
34
|
-
|
|
35
|
-
# schema-v2 metadata — injected by `unicli migrate schema-v2`
|
|
36
|
-
capabilities: ["http.fetch"]
|
|
37
|
-
minimum_capability: http.fetch
|
|
38
|
-
trust: public
|
|
39
|
-
confidentiality: public
|
|
40
|
-
quarantine: false
|
|
41
|
-
schema_version: v2
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
runAdapterWithFixture,
|
|
4
|
-
expectAdapterShape,
|
|
5
|
-
} from "../../../tests/adapter-runner.js";
|
|
6
|
-
|
|
7
|
-
describe("reddit search", () => {
|
|
8
|
-
it("returns rows with declared columns against fixture", async () => {
|
|
9
|
-
const { output } = await runAdapterWithFixture("reddit", "search");
|
|
10
|
-
expectAdapterShape(output, {
|
|
11
|
-
columns: ["rank", "title", "subreddit", "score", "comments", "author"],
|
|
12
|
-
minItems: 1,
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
site: reddit
|
|
2
|
-
name: search
|
|
3
|
-
description: Search Reddit posts
|
|
4
|
-
domain: www.reddit.com
|
|
5
|
-
type: web-api
|
|
6
|
-
strategy: public
|
|
7
|
-
browser: false
|
|
8
|
-
|
|
9
|
-
args:
|
|
10
|
-
query:
|
|
11
|
-
type: str
|
|
12
|
-
required: true
|
|
13
|
-
positional: true
|
|
14
|
-
description: Search query
|
|
15
|
-
limit:
|
|
16
|
-
type: int
|
|
17
|
-
default: 20
|
|
18
|
-
description: Number of results
|
|
19
|
-
sort:
|
|
20
|
-
type: str
|
|
21
|
-
default: relevance
|
|
22
|
-
choices: [relevance, hot, top, new, comments]
|
|
23
|
-
description: Sort order
|
|
24
|
-
|
|
25
|
-
pipeline:
|
|
26
|
-
- fetch:
|
|
27
|
-
url: https://www.reddit.com/search.json
|
|
28
|
-
params:
|
|
29
|
-
q: ${{ args.query }}
|
|
30
|
-
sort: ${{ args.sort || 'relevance' }}
|
|
31
|
-
limit: ${{ args.limit }}
|
|
32
|
-
- select: data.children
|
|
33
|
-
|
|
34
|
-
- map:
|
|
35
|
-
rank: ${{ index + 1 }}
|
|
36
|
-
title: ${{ item.data.title }}
|
|
37
|
-
subreddit: ${{ item.data.subreddit_name_prefixed }}
|
|
38
|
-
score: ${{ item.data.score }}
|
|
39
|
-
comments: ${{ item.data.num_comments }}
|
|
40
|
-
author: ${{ item.data.author }}
|
|
41
|
-
|
|
42
|
-
- limit: ${{ args.limit }}
|
|
43
|
-
|
|
44
|
-
columns: [rank, title, subreddit, score, comments, author]
|
|
45
|
-
|
|
46
|
-
# schema-v2 metadata — injected by `unicli migrate schema-v2`
|
|
47
|
-
capabilities: ["http.fetch"]
|
|
48
|
-
minimum_capability: http.fetch
|
|
49
|
-
trust: public
|
|
50
|
-
confidentiality: public
|
|
51
|
-
quarantine: false
|
|
52
|
-
schema_version: v2
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
runAdapterWithFixture,
|
|
4
|
-
expectAdapterShape,
|
|
5
|
-
} from "../../../tests/adapter-runner.js";
|
|
6
|
-
|
|
7
|
-
describe("reddit subreddit", () => {
|
|
8
|
-
it("returns rows with declared columns against fixture", async () => {
|
|
9
|
-
const { output } = await runAdapterWithFixture("reddit", "subreddit");
|
|
10
|
-
expectAdapterShape(output, {
|
|
11
|
-
columns: ["rank", "title", "score", "comments", "author"],
|
|
12
|
-
minItems: 1,
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
site: reddit
|
|
2
|
-
name: subreddit
|
|
3
|
-
description: Get posts from a specific subreddit
|
|
4
|
-
domain: www.reddit.com
|
|
5
|
-
type: web-api
|
|
6
|
-
strategy: public
|
|
7
|
-
|
|
8
|
-
args:
|
|
9
|
-
name:
|
|
10
|
-
type: str
|
|
11
|
-
required: true
|
|
12
|
-
positional: true
|
|
13
|
-
description: "Subreddit name (e.g. programming, rust, webdev)"
|
|
14
|
-
sort:
|
|
15
|
-
type: str
|
|
16
|
-
default: hot
|
|
17
|
-
choices: [hot, new, top, rising]
|
|
18
|
-
description: Sort order
|
|
19
|
-
limit:
|
|
20
|
-
type: int
|
|
21
|
-
default: 20
|
|
22
|
-
description: Number of posts
|
|
23
|
-
|
|
24
|
-
pipeline:
|
|
25
|
-
- fetch:
|
|
26
|
-
url: "https://www.reddit.com/r/${{ args.name }}/${{ args.sort }}.json"
|
|
27
|
-
params:
|
|
28
|
-
limit: ${{ args.limit }}
|
|
29
|
-
raw_json: "1"
|
|
30
|
-
- select: data.children
|
|
31
|
-
|
|
32
|
-
- map:
|
|
33
|
-
rank: ${{ index + 1 }}
|
|
34
|
-
title: ${{ item.data.title }}
|
|
35
|
-
score: ${{ item.data.score }}
|
|
36
|
-
comments: ${{ item.data.num_comments }}
|
|
37
|
-
author: ${{ item.data.author }}
|
|
38
|
-
url: ${{ 'https://www.reddit.com' + item.data.permalink }}
|
|
39
|
-
|
|
40
|
-
- limit: ${{ args.limit }}
|
|
41
|
-
|
|
42
|
-
columns: [rank, title, score, comments, author]
|
|
43
|
-
|
|
44
|
-
# schema-v2 metadata — injected by `unicli migrate schema-v2`
|
|
45
|
-
capabilities: ["http.fetch"]
|
|
46
|
-
minimum_capability: http.fetch
|
|
47
|
-
trust: public
|
|
48
|
-
confidentiality: public
|
|
49
|
-
quarantine: false
|
|
50
|
-
schema_version: v2
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
runAdapterWithFixture,
|
|
4
|
-
expectAdapterShape,
|
|
5
|
-
} from "../../../tests/adapter-runner.js";
|
|
6
|
-
|
|
7
|
-
describe("reddit top", () => {
|
|
8
|
-
it("returns rows with declared columns against fixture", async () => {
|
|
9
|
-
const { output } = await runAdapterWithFixture("reddit", "top");
|
|
10
|
-
expectAdapterShape(output, {
|
|
11
|
-
columns: ["rank", "title", "subreddit", "score", "comments"],
|
|
12
|
-
minItems: 1,
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
site: reddit
|
|
2
|
-
name: top
|
|
3
|
-
description: Reddit top posts
|
|
4
|
-
domain: www.reddit.com
|
|
5
|
-
type: web-api
|
|
6
|
-
strategy: public
|
|
7
|
-
|
|
8
|
-
args:
|
|
9
|
-
subreddit:
|
|
10
|
-
type: str
|
|
11
|
-
description: Subreddit name (without r/)
|
|
12
|
-
time:
|
|
13
|
-
type: str
|
|
14
|
-
default: day
|
|
15
|
-
choices: [hour, day, week, month, year, all]
|
|
16
|
-
limit:
|
|
17
|
-
type: int
|
|
18
|
-
default: 20
|
|
19
|
-
|
|
20
|
-
pipeline:
|
|
21
|
-
- fetch:
|
|
22
|
-
url: "https://www.reddit.com/${{ args.subreddit ? 'r/' + args.subreddit + '/' : '' }}top.json"
|
|
23
|
-
params:
|
|
24
|
-
t: "${{ args.time }}"
|
|
25
|
-
limit: "${{ args.limit }}"
|
|
26
|
-
|
|
27
|
-
- select: data.children
|
|
28
|
-
|
|
29
|
-
- map:
|
|
30
|
-
rank: ${{ index + 1 }}
|
|
31
|
-
title: "${{ item.data.title }}"
|
|
32
|
-
author: "${{ item.data.author }}"
|
|
33
|
-
subreddit: "${{ item.data.subreddit }}"
|
|
34
|
-
score: "${{ item.data.score }}"
|
|
35
|
-
comments: "${{ item.data.num_comments }}"
|
|
36
|
-
url: "${{ 'https://www.reddit.com' + item.data.permalink }}"
|
|
37
|
-
|
|
38
|
-
- limit: ${{ args.limit }}
|
|
39
|
-
|
|
40
|
-
columns: [rank, title, subreddit, score, comments]
|
|
41
|
-
|
|
42
|
-
# schema-v2 metadata — injected by `unicli migrate schema-v2`
|
|
43
|
-
capabilities: ["http.fetch"]
|
|
44
|
-
minimum_capability: http.fetch
|
|
45
|
-
trust: public
|
|
46
|
-
confidentiality: public
|
|
47
|
-
quarantine: false
|
|
48
|
-
schema_version: v2
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
runAdapterWithFixture,
|
|
4
|
-
expectAdapterShape,
|
|
5
|
-
} from "../../../tests/adapter-runner.js";
|
|
6
|
-
|
|
7
|
-
describe("reddit trending", () => {
|
|
8
|
-
it("returns rows with declared columns against fixture", async () => {
|
|
9
|
-
const { output } = await runAdapterWithFixture("reddit", "trending");
|
|
10
|
-
expectAdapterShape(output, {
|
|
11
|
-
columns: ["name", "subscribers", "title", "description"],
|
|
12
|
-
minItems: 1,
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
});
|