@zenalexa/unicli 0.208.0 → 0.209.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 +1 -1
- package/README.md +6 -6
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +82 -2
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +20 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/hub.d.ts +13 -0
- package/dist/commands/hub.d.ts.map +1 -0
- package/dist/commands/hub.js +232 -0
- package/dist/commands/hub.js.map +1 -0
- package/dist/commands/research.d.ts +17 -0
- package/dist/commands/research.d.ts.map +1 -0
- package/dist/commands/research.js +257 -0
- package/dist/commands/research.js.map +1 -0
- package/dist/commands/test-gen.d.ts +10 -0
- package/dist/commands/test-gen.d.ts.map +1 -0
- package/dist/commands/test-gen.js +124 -0
- package/dist/commands/test-gen.js.map +1 -0
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +3 -0
- package/dist/discovery/loader.js.map +1 -1
- package/dist/engine/capability.d.ts +40 -0
- package/dist/engine/capability.d.ts.map +1 -0
- package/dist/engine/capability.js +191 -0
- package/dist/engine/capability.js.map +1 -0
- package/dist/engine/endpoint.d.ts +47 -0
- package/dist/engine/endpoint.d.ts.map +1 -0
- package/dist/engine/endpoint.js +295 -0
- package/dist/engine/endpoint.js.map +1 -0
- package/dist/engine/framework.d.ts +28 -0
- package/dist/engine/framework.d.ts.map +1 -0
- package/dist/engine/framework.js +66 -0
- package/dist/engine/framework.js.map +1 -0
- package/dist/engine/probe.d.ts +19 -0
- package/dist/engine/probe.d.ts.map +1 -0
- package/dist/engine/probe.js +85 -0
- package/dist/engine/probe.js.map +1 -0
- package/dist/engine/research.d.ts +38 -0
- package/dist/engine/research.d.ts.map +1 -0
- package/dist/engine/research.js +414 -0
- package/dist/engine/research.js.map +1 -0
- package/dist/engine/yaml-runner.d.ts.map +1 -1
- package/dist/engine/yaml-runner.js +80 -5
- package/dist/engine/yaml-runner.js.map +1 -1
- package/dist/manifest.json +403 -1
- package/dist/mcp/server.js +59 -1
- package/dist/mcp/server.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/cnn/top.yaml +21 -0
- package/src/adapters/cocoapods/search.yaml +16 -0
- package/src/adapters/crates-io/search.yaml +27 -0
- package/src/adapters/docker-hub/search.yaml +26 -0
- package/src/adapters/eastmoney/hot.yaml +23 -0
- package/src/adapters/eastmoney/search.yaml +25 -0
- package/src/adapters/exchangerate/convert.yaml +19 -0
- package/src/adapters/feishu/calendar.yaml +24 -0
- package/src/adapters/feishu/docs.yaml +17 -0
- package/src/adapters/feishu/send.yaml +29 -0
- package/src/adapters/feishu/tasks.yaml +24 -0
- package/src/adapters/gitee/search.yaml +25 -0
- package/src/adapters/gitee/trending.yaml +22 -0
- package/src/adapters/gitlab/search.yaml +24 -0
- package/src/adapters/gitlab/trending.yaml +22 -0
- package/src/adapters/homebrew/info.yaml +15 -0
- package/src/adapters/huggingface-papers/daily.yaml +21 -0
- package/src/adapters/infoq/articles.yaml +29 -0
- package/src/adapters/ip-info/lookup.yaml +15 -0
- package/src/adapters/itch-io/popular.yaml +22 -0
- package/src/adapters/ithome/news.yaml +21 -0
- package/src/adapters/mastodon/search.yaml +29 -0
- package/src/adapters/mastodon/trending.yaml +27 -0
- package/src/adapters/meituan/search.yaml +30 -0
- package/src/adapters/minimax/chat.yaml +33 -0
- package/src/adapters/minimax/models.yaml +18 -0
- package/src/adapters/minimax/tts.yaml +33 -0
- package/src/adapters/netease-music/hot.yaml +24 -0
- package/src/adapters/netease-music/search.yaml +29 -0
- package/src/adapters/npm-trends/compare.yaml +19 -0
- package/src/adapters/nytimes/top.yaml +26 -0
- package/src/adapters/openrouter/models.yaml +22 -0
- package/src/adapters/pexels/search.yaml +28 -0
- package/src/adapters/pinduoduo/hot.yaml +20 -0
- package/src/adapters/pypi/info.yaml +16 -0
- package/src/adapters/qweather/now.yaml +16 -0
- package/src/adapters/replicate/search.yaml +25 -0
- package/src/adapters/replicate/trending.yaml +22 -0
- package/src/adapters/sspai/hot.yaml +21 -0
- package/src/adapters/sspai/latest.yaml +22 -0
- package/src/adapters/techcrunch/latest.yaml +22 -0
- package/src/adapters/theverge/latest.yaml +21 -0
- package/src/adapters/twitch/top.yaml +26 -0
- package/src/adapters/unsplash/search.yaml +28 -0
- package/src/adapters/ycombinator/launches.yaml +20 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
site: meituan
|
|
2
|
+
name: search
|
|
3
|
+
description: Search restaurants/shops on Meituan
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: apimobile.meituan.com
|
|
6
|
+
strategy: cookie
|
|
7
|
+
args:
|
|
8
|
+
query:
|
|
9
|
+
required: true
|
|
10
|
+
positional: true
|
|
11
|
+
description: Search keyword (e.g. "火锅", "coffee")
|
|
12
|
+
city:
|
|
13
|
+
required: false
|
|
14
|
+
default: "1"
|
|
15
|
+
description: City ID (1=北京, 10=上海, 20=广州)
|
|
16
|
+
limit:
|
|
17
|
+
required: false
|
|
18
|
+
default: 20
|
|
19
|
+
pipeline:
|
|
20
|
+
- fetch:
|
|
21
|
+
url: "https://apimobile.meituan.com/group/v4/poi/pcsearch/${{ args.city | default('1') }}?uuid=auto&limit=${{ args.limit | default(20) }}&q=${{ args.query }}"
|
|
22
|
+
- select: data.searchResult
|
|
23
|
+
- map:
|
|
24
|
+
name: "${{ item.title }}"
|
|
25
|
+
score: "${{ item.avgscore }}"
|
|
26
|
+
price: "${{ item.avgprice }}"
|
|
27
|
+
address: "${{ item.address }}"
|
|
28
|
+
category: "${{ item.catName }}"
|
|
29
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
30
|
+
columns: [name, score, price, address, category]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
site: minimax
|
|
2
|
+
name: chat
|
|
3
|
+
description: MiniMax M2 chat completion (OpenAI-compatible API)
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: api.minimax.chat
|
|
6
|
+
strategy: header
|
|
7
|
+
args:
|
|
8
|
+
prompt:
|
|
9
|
+
required: true
|
|
10
|
+
positional: true
|
|
11
|
+
description: Chat message
|
|
12
|
+
model:
|
|
13
|
+
required: false
|
|
14
|
+
default: MiniMax-M2.7
|
|
15
|
+
description: Model name (MiniMax-M2.7, MiniMax-M2.5, MiniMax-M1)
|
|
16
|
+
pipeline:
|
|
17
|
+
- fetch:
|
|
18
|
+
url: "https://api.minimax.chat/v1/text/chatcompletion_v2"
|
|
19
|
+
method: POST
|
|
20
|
+
headers:
|
|
21
|
+
Content-Type: application/json
|
|
22
|
+
Authorization: "Bearer ${{ env.MINIMAX_API_KEY }}"
|
|
23
|
+
body:
|
|
24
|
+
model: "${{ args.model | default('MiniMax-M2.7') }}"
|
|
25
|
+
messages:
|
|
26
|
+
- role: user
|
|
27
|
+
content: "${{ args.prompt }}"
|
|
28
|
+
- select: choices
|
|
29
|
+
- map:
|
|
30
|
+
content: "${{ item.message.content }}"
|
|
31
|
+
model: "${{ item.model }}"
|
|
32
|
+
usage: "${{ item.usage }}"
|
|
33
|
+
columns: [content]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
site: minimax
|
|
2
|
+
name: models
|
|
3
|
+
description: List available MiniMax models
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: api.minimax.chat
|
|
6
|
+
strategy: header
|
|
7
|
+
args: {}
|
|
8
|
+
pipeline:
|
|
9
|
+
- fetch:
|
|
10
|
+
url: "https://api.minimax.chat/v1/models"
|
|
11
|
+
headers:
|
|
12
|
+
Authorization: "Bearer ${{ env.MINIMAX_API_KEY }}"
|
|
13
|
+
- select: data
|
|
14
|
+
- map:
|
|
15
|
+
id: "${{ item.id }}"
|
|
16
|
+
type: "${{ item.type }}"
|
|
17
|
+
created: "${{ item.created }}"
|
|
18
|
+
columns: [id, type, created]
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
site: minimax
|
|
2
|
+
name: tts
|
|
3
|
+
description: MiniMax text-to-speech generation
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: api.minimax.chat
|
|
6
|
+
strategy: header
|
|
7
|
+
args:
|
|
8
|
+
text:
|
|
9
|
+
required: true
|
|
10
|
+
positional: true
|
|
11
|
+
description: Text to convert to speech
|
|
12
|
+
voice:
|
|
13
|
+
required: false
|
|
14
|
+
default: male-qn-qingse
|
|
15
|
+
description: Voice ID
|
|
16
|
+
output:
|
|
17
|
+
required: false
|
|
18
|
+
default: output.mp3
|
|
19
|
+
description: Output file path
|
|
20
|
+
pipeline:
|
|
21
|
+
- fetch:
|
|
22
|
+
url: "https://api.minimax.chat/v1/t2a_v2"
|
|
23
|
+
method: POST
|
|
24
|
+
headers:
|
|
25
|
+
Content-Type: application/json
|
|
26
|
+
Authorization: "Bearer ${{ env.MINIMAX_API_KEY }}"
|
|
27
|
+
body:
|
|
28
|
+
model: speech-02-hd
|
|
29
|
+
text: "${{ args.text }}"
|
|
30
|
+
voice_setting:
|
|
31
|
+
voice_id: "${{ args.voice | default('male-qn-qingse') }}"
|
|
32
|
+
- select: data
|
|
33
|
+
columns: [audio_url, duration]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
site: netease-music
|
|
2
|
+
name: hot
|
|
3
|
+
description: NetEase Cloud Music hot/trending songs
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: music.163.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
limit:
|
|
9
|
+
required: false
|
|
10
|
+
default: 20
|
|
11
|
+
pipeline:
|
|
12
|
+
- fetch:
|
|
13
|
+
url: "https://music.163.com/api/playlist/detail?id=3778678"
|
|
14
|
+
headers:
|
|
15
|
+
Referer: "https://music.163.com"
|
|
16
|
+
- select: result.tracks
|
|
17
|
+
- map:
|
|
18
|
+
rank: "${{ index + 1 }}"
|
|
19
|
+
name: "${{ item.name }}"
|
|
20
|
+
artist: "${{ item.artists[0].name }}"
|
|
21
|
+
album: "${{ item.album.name }}"
|
|
22
|
+
duration: "${{ Math.floor(item.duration / 60000) }}:${{ String(Math.floor((item.duration % 60000) / 1000)).padStart(2, '0') }}"
|
|
23
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
24
|
+
columns: [rank, name, artist, album]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
site: netease-music
|
|
2
|
+
name: search
|
|
3
|
+
description: Search songs on NetEase Cloud Music
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: music.163.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
query:
|
|
9
|
+
required: true
|
|
10
|
+
positional: true
|
|
11
|
+
description: Search keyword
|
|
12
|
+
limit:
|
|
13
|
+
required: false
|
|
14
|
+
default: 20
|
|
15
|
+
pipeline:
|
|
16
|
+
- fetch:
|
|
17
|
+
url: "https://music.163.com/api/search/get/web?s=${{ args.query }}&type=1&offset=0&limit=${{ args.limit | default(20) }}"
|
|
18
|
+
method: POST
|
|
19
|
+
headers:
|
|
20
|
+
Referer: "https://music.163.com"
|
|
21
|
+
Content-Type: application/x-www-form-urlencoded
|
|
22
|
+
- select: result.songs
|
|
23
|
+
- map:
|
|
24
|
+
name: "${{ item.name }}"
|
|
25
|
+
artist: "${{ item.artists[0].name }}"
|
|
26
|
+
album: "${{ item.album.name }}"
|
|
27
|
+
id: "${{ item.id }}"
|
|
28
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
29
|
+
columns: [name, artist, album, id]
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
site: npm-trends
|
|
2
|
+
name: compare
|
|
3
|
+
description: Compare npm package download counts
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: api.npmjs.org
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
packages:
|
|
9
|
+
required: true
|
|
10
|
+
positional: true
|
|
11
|
+
description: Comma-separated package names (e.g. "react,vue,svelte")
|
|
12
|
+
period:
|
|
13
|
+
required: false
|
|
14
|
+
default: last-month
|
|
15
|
+
description: Time period (last-week, last-month, last-year)
|
|
16
|
+
pipeline:
|
|
17
|
+
- fetch:
|
|
18
|
+
url: "https://api.npmjs.org/downloads/point/${{ args.period | default('last-month') }}/${{ args.packages }}"
|
|
19
|
+
columns: [package, downloads, start, end]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
site: nytimes
|
|
2
|
+
name: top
|
|
3
|
+
description: New York Times top stories via RSS
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: rss.nytimes.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
section:
|
|
9
|
+
required: false
|
|
10
|
+
default: HomePage
|
|
11
|
+
description: Section (HomePage, World, Business, Technology, Science, Arts)
|
|
12
|
+
limit:
|
|
13
|
+
required: false
|
|
14
|
+
default: 20
|
|
15
|
+
pipeline:
|
|
16
|
+
- fetch_text:
|
|
17
|
+
url: "https://rss.nytimes.com/services/xml/rss/nyt/${{ args.section | default('HomePage') }}.xml"
|
|
18
|
+
- parse_rss: ~
|
|
19
|
+
- map:
|
|
20
|
+
title: "${{ item.title }}"
|
|
21
|
+
url: "${{ item.link }}"
|
|
22
|
+
author: "${{ item.creator }}"
|
|
23
|
+
date: "${{ item.pubDate }}"
|
|
24
|
+
description: "${{ item.contentSnippet }}"
|
|
25
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
26
|
+
columns: [title, url, author, date]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
site: openrouter
|
|
2
|
+
name: models
|
|
3
|
+
description: List all available AI models on OpenRouter
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: openrouter.ai
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
limit:
|
|
9
|
+
required: false
|
|
10
|
+
default: 30
|
|
11
|
+
pipeline:
|
|
12
|
+
- fetch:
|
|
13
|
+
url: "https://openrouter.ai/api/v1/models"
|
|
14
|
+
- select: data
|
|
15
|
+
- map:
|
|
16
|
+
id: "${{ item.id }}"
|
|
17
|
+
name: "${{ item.name }}"
|
|
18
|
+
context_length: "${{ item.context_length }}"
|
|
19
|
+
pricing_prompt: "${{ item.pricing.prompt }}"
|
|
20
|
+
pricing_completion: "${{ item.pricing.completion }}"
|
|
21
|
+
- limit: "${{ args.limit | default(30) }}"
|
|
22
|
+
columns: [id, name, context_length, pricing_prompt]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
site: pexels
|
|
2
|
+
name: search
|
|
3
|
+
description: Search free stock photos on Pexels
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: api.pexels.com
|
|
6
|
+
strategy: header
|
|
7
|
+
args:
|
|
8
|
+
query:
|
|
9
|
+
required: true
|
|
10
|
+
positional: true
|
|
11
|
+
description: Photo search query
|
|
12
|
+
limit:
|
|
13
|
+
required: false
|
|
14
|
+
default: 20
|
|
15
|
+
pipeline:
|
|
16
|
+
- fetch:
|
|
17
|
+
url: "https://api.pexels.com/v1/search?query=${{ args.query }}&per_page=${{ args.limit | default(20) }}"
|
|
18
|
+
headers:
|
|
19
|
+
Authorization: "${{ env.PEXELS_API_KEY }}"
|
|
20
|
+
- select: photos
|
|
21
|
+
- map:
|
|
22
|
+
photographer: "${{ item.photographer }}"
|
|
23
|
+
url: "${{ item.src.large }}"
|
|
24
|
+
alt: "${{ item.alt }}"
|
|
25
|
+
width: "${{ item.width }}"
|
|
26
|
+
height: "${{ item.height }}"
|
|
27
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
28
|
+
columns: [photographer, alt, url, width, height]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
site: pinduoduo
|
|
2
|
+
name: hot
|
|
3
|
+
description: Pinduoduo hot/trending products
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: mobile.yangkeduo.com
|
|
6
|
+
strategy: cookie
|
|
7
|
+
args:
|
|
8
|
+
limit:
|
|
9
|
+
required: false
|
|
10
|
+
default: 20
|
|
11
|
+
pipeline:
|
|
12
|
+
- fetch:
|
|
13
|
+
url: "https://mobile.yangkeduo.com/proxy/api/api/darwin/hot_search/list"
|
|
14
|
+
- select: data.list
|
|
15
|
+
- map:
|
|
16
|
+
rank: "${{ index + 1 }}"
|
|
17
|
+
keyword: "${{ item.keyword }}"
|
|
18
|
+
heat: "${{ item.heat }}"
|
|
19
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
20
|
+
columns: [rank, keyword, heat]
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
site: pypi
|
|
2
|
+
name: info
|
|
3
|
+
description: Get PyPI package details
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: pypi.org
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
package:
|
|
9
|
+
required: true
|
|
10
|
+
positional: true
|
|
11
|
+
description: Package name (e.g. "requests", "flask")
|
|
12
|
+
pipeline:
|
|
13
|
+
- fetch:
|
|
14
|
+
url: "https://pypi.org/pypi/${{ args.package }}/json"
|
|
15
|
+
- select: info
|
|
16
|
+
columns: [name, version, summary, author, license]
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
site: qweather
|
|
2
|
+
name: now
|
|
3
|
+
description: Current weather from QWeather (和风天气, free tier)
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: devapi.qweather.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
location:
|
|
9
|
+
required: true
|
|
10
|
+
positional: true
|
|
11
|
+
description: Location ID or coordinates (e.g. "101010100" for Beijing)
|
|
12
|
+
pipeline:
|
|
13
|
+
- fetch:
|
|
14
|
+
url: "https://devapi.qweather.com/v7/weather/now?location=${{ args.location }}&key=${{ env.QWEATHER_KEY | default('') }}"
|
|
15
|
+
- select: now
|
|
16
|
+
columns: [temp, feelsLike, text, windDir, windSpeed, humidity, pressure]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
site: replicate
|
|
2
|
+
name: search
|
|
3
|
+
description: Search AI models on Replicate
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: replicate.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
query:
|
|
9
|
+
required: true
|
|
10
|
+
positional: true
|
|
11
|
+
description: Model search query
|
|
12
|
+
limit:
|
|
13
|
+
required: false
|
|
14
|
+
default: 20
|
|
15
|
+
pipeline:
|
|
16
|
+
- fetch:
|
|
17
|
+
url: "https://replicate.com/api/v1/models?query=${{ args.query }}"
|
|
18
|
+
- select: results
|
|
19
|
+
- map:
|
|
20
|
+
name: "${{ item.name }}"
|
|
21
|
+
owner: "${{ item.owner }}"
|
|
22
|
+
description: "${{ item.description }}"
|
|
23
|
+
run_count: "${{ item.run_count }}"
|
|
24
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
25
|
+
columns: [name, owner, description, run_count]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
site: replicate
|
|
2
|
+
name: trending
|
|
3
|
+
description: Trending AI models on Replicate
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: replicate.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
limit:
|
|
9
|
+
required: false
|
|
10
|
+
default: 20
|
|
11
|
+
pipeline:
|
|
12
|
+
- fetch:
|
|
13
|
+
url: "https://replicate.com/api/v1/collections/trending-models"
|
|
14
|
+
- select: models
|
|
15
|
+
- map:
|
|
16
|
+
name: "${{ item.name }}"
|
|
17
|
+
owner: "${{ item.owner }}"
|
|
18
|
+
description: "${{ item.description }}"
|
|
19
|
+
run_count: "${{ item.run_count }}"
|
|
20
|
+
url: "${{ item.url }}"
|
|
21
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
22
|
+
columns: [name, owner, description, run_count]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
site: sspai
|
|
2
|
+
name: hot
|
|
3
|
+
description: Hot/trending articles on Sspai (少数派)
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: sspai.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
limit:
|
|
9
|
+
required: false
|
|
10
|
+
default: 20
|
|
11
|
+
pipeline:
|
|
12
|
+
- fetch:
|
|
13
|
+
url: "https://sspai.com/api/v1/articles?offset=0&limit=${{ args.limit | default(20) }}&sort=hot"
|
|
14
|
+
- select: data
|
|
15
|
+
- map:
|
|
16
|
+
title: "${{ item.title }}"
|
|
17
|
+
author: "${{ item.author.nickname }}"
|
|
18
|
+
likes: "${{ item.like_count }}"
|
|
19
|
+
url: "${{ 'https://sspai.com/post/' + item.id }}"
|
|
20
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
21
|
+
columns: [title, author, likes, url]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
site: sspai
|
|
2
|
+
name: latest
|
|
3
|
+
description: Latest articles on Sspai (少数派)
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: sspai.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
limit:
|
|
9
|
+
required: false
|
|
10
|
+
default: 20
|
|
11
|
+
pipeline:
|
|
12
|
+
- fetch:
|
|
13
|
+
url: "https://sspai.com/api/v1/articles?offset=0&limit=${{ args.limit | default(20) }}&sort=created_at"
|
|
14
|
+
- select: data
|
|
15
|
+
- map:
|
|
16
|
+
title: "${{ item.title }}"
|
|
17
|
+
author: "${{ item.author.nickname }}"
|
|
18
|
+
likes: "${{ item.like_count }}"
|
|
19
|
+
url: "${{ 'https://sspai.com/post/' + item.id }}"
|
|
20
|
+
date: "${{ item.created_at }}"
|
|
21
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
22
|
+
columns: [title, author, likes, url]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
site: techcrunch
|
|
2
|
+
name: latest
|
|
3
|
+
description: Latest TechCrunch articles via RSS
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: techcrunch.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
limit:
|
|
9
|
+
required: false
|
|
10
|
+
default: 20
|
|
11
|
+
pipeline:
|
|
12
|
+
- fetch_text:
|
|
13
|
+
url: "https://techcrunch.com/feed/"
|
|
14
|
+
- parse_rss: ~
|
|
15
|
+
- map:
|
|
16
|
+
title: "${{ item.title }}"
|
|
17
|
+
url: "${{ item.link }}"
|
|
18
|
+
author: "${{ item.creator }}"
|
|
19
|
+
date: "${{ item.pubDate }}"
|
|
20
|
+
description: "${{ item.contentSnippet }}"
|
|
21
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
22
|
+
columns: [title, url, author, date]
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
site: theverge
|
|
2
|
+
name: latest
|
|
3
|
+
description: Latest The Verge articles via RSS
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: theverge.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
limit:
|
|
9
|
+
required: false
|
|
10
|
+
default: 20
|
|
11
|
+
pipeline:
|
|
12
|
+
- fetch_text:
|
|
13
|
+
url: "https://www.theverge.com/rss/index.xml"
|
|
14
|
+
- parse_rss: ~
|
|
15
|
+
- map:
|
|
16
|
+
title: "${{ item.title }}"
|
|
17
|
+
url: "${{ item.link }}"
|
|
18
|
+
author: "${{ item.creator }}"
|
|
19
|
+
date: "${{ item.pubDate }}"
|
|
20
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
21
|
+
columns: [title, url, author, date]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
site: twitch
|
|
2
|
+
name: top
|
|
3
|
+
description: Top live streams on Twitch via GQL public endpoint
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: gql.twitch.tv
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
limit:
|
|
9
|
+
required: false
|
|
10
|
+
default: 20
|
|
11
|
+
pipeline:
|
|
12
|
+
- fetch:
|
|
13
|
+
url: "https://gql.twitch.tv/gql"
|
|
14
|
+
method: POST
|
|
15
|
+
headers:
|
|
16
|
+
Client-Id: "kimne78kx3ncx6brgo4mv6wki5h1ko"
|
|
17
|
+
body:
|
|
18
|
+
query: "query { streams(first: ${{ args.limit | default(20) }}) { edges { node { broadcaster { displayName login } title viewersCount game { name } } } } }"
|
|
19
|
+
- select: data.streams.edges
|
|
20
|
+
- map:
|
|
21
|
+
streamer: "${{ item.node.broadcaster.displayName }}"
|
|
22
|
+
title: "${{ item.node.title }}"
|
|
23
|
+
viewers: "${{ item.node.viewersCount }}"
|
|
24
|
+
game: "${{ item.node.game.name }}"
|
|
25
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
26
|
+
columns: [streamer, title, viewers, game]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
site: unsplash
|
|
2
|
+
name: search
|
|
3
|
+
description: Search free photos on Unsplash
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: unsplash.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
query:
|
|
9
|
+
required: true
|
|
10
|
+
positional: true
|
|
11
|
+
description: Photo search query
|
|
12
|
+
limit:
|
|
13
|
+
required: false
|
|
14
|
+
default: 20
|
|
15
|
+
pipeline:
|
|
16
|
+
- fetch:
|
|
17
|
+
url: "https://unsplash.com/napi/search/photos?query=${{ args.query }}&per_page=${{ args.limit | default(20) }}"
|
|
18
|
+
- select: results
|
|
19
|
+
- map:
|
|
20
|
+
description: "${{ item.description || item.alt_description }}"
|
|
21
|
+
author: "${{ item.user.name }}"
|
|
22
|
+
url: "${{ item.urls.regular }}"
|
|
23
|
+
download: "${{ item.links.download }}"
|
|
24
|
+
likes: "${{ item.likes }}"
|
|
25
|
+
width: "${{ item.width }}"
|
|
26
|
+
height: "${{ item.height }}"
|
|
27
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
28
|
+
columns: [description, author, url, likes]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
site: ycombinator
|
|
2
|
+
name: launches
|
|
3
|
+
description: Latest YC company launches
|
|
4
|
+
type: web-api
|
|
5
|
+
domain: www.ycombinator.com
|
|
6
|
+
strategy: public
|
|
7
|
+
args:
|
|
8
|
+
limit:
|
|
9
|
+
required: false
|
|
10
|
+
default: 20
|
|
11
|
+
pipeline:
|
|
12
|
+
- fetch:
|
|
13
|
+
url: "https://www.ycombinator.com/launches.json"
|
|
14
|
+
- map:
|
|
15
|
+
name: "${{ item.name }}"
|
|
16
|
+
tagline: "${{ item.tagline }}"
|
|
17
|
+
url: "${{ item.url }}"
|
|
18
|
+
batch: "${{ item.batch }}"
|
|
19
|
+
- limit: "${{ args.limit | default(20) }}"
|
|
20
|
+
columns: [name, tagline, url, batch]
|