@zenalexa/unicli 0.209.0 → 0.210.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.
Files changed (325) hide show
  1. package/AGENTS.md +56 -15
  2. package/README.md +228 -278
  3. package/dist/adapters/cursor/cursor.d.ts +2 -1
  4. package/dist/adapters/cursor/cursor.d.ts.map +1 -1
  5. package/dist/adapters/cursor/cursor.js +87 -1
  6. package/dist/adapters/cursor/cursor.js.map +1 -1
  7. package/dist/adapters/discord-app/discord-app.d.ts +1 -1
  8. package/dist/adapters/discord-app/discord-app.js +94 -1
  9. package/dist/adapters/discord-app/discord-app.js.map +1 -1
  10. package/dist/browser/bridge.d.ts +45 -0
  11. package/dist/browser/bridge.d.ts.map +1 -1
  12. package/dist/browser/bridge.js +94 -1
  13. package/dist/browser/bridge.js.map +1 -1
  14. package/dist/browser/cdp-client.d.ts +24 -1
  15. package/dist/browser/cdp-client.d.ts.map +1 -1
  16. package/dist/browser/cdp-client.js +56 -2
  17. package/dist/browser/cdp-client.js.map +1 -1
  18. package/dist/browser/launcher.d.ts +5 -0
  19. package/dist/browser/launcher.d.ts.map +1 -1
  20. package/dist/browser/launcher.js +7 -0
  21. package/dist/browser/launcher.js.map +1 -1
  22. package/dist/cli.d.ts.map +1 -1
  23. package/dist/cli.js +67 -2
  24. package/dist/cli.js.map +1 -1
  25. package/dist/commands/browser.d.ts.map +1 -1
  26. package/dist/commands/browser.js +79 -1
  27. package/dist/commands/browser.js.map +1 -1
  28. package/dist/commands/ext.d.ts +11 -0
  29. package/dist/commands/ext.d.ts.map +1 -0
  30. package/dist/commands/ext.js +122 -0
  31. package/dist/commands/ext.js.map +1 -0
  32. package/dist/commands/skills.d.ts +2 -3
  33. package/dist/commands/skills.d.ts.map +1 -1
  34. package/dist/commands/skills.js +2 -3
  35. package/dist/commands/skills.js.map +1 -1
  36. package/dist/commands/status.d.ts +12 -0
  37. package/dist/commands/status.d.ts.map +1 -0
  38. package/dist/commands/status.js +137 -0
  39. package/dist/commands/status.js.map +1 -0
  40. package/dist/engine/yaml-runner.d.ts +10 -0
  41. package/dist/engine/yaml-runner.d.ts.map +1 -1
  42. package/dist/engine/yaml-runner.js +51 -3
  43. package/dist/engine/yaml-runner.js.map +1 -1
  44. package/dist/hub/index.d.ts +37 -0
  45. package/dist/hub/index.d.ts.map +1 -0
  46. package/dist/hub/index.js +98 -0
  47. package/dist/hub/index.js.map +1 -0
  48. package/dist/hub/passthrough.d.ts +21 -0
  49. package/dist/hub/passthrough.d.ts.map +1 -0
  50. package/dist/hub/passthrough.js +71 -0
  51. package/dist/hub/passthrough.js.map +1 -0
  52. package/dist/manifest.json +1770 -64
  53. package/dist/types.d.ts +15 -0
  54. package/dist/types.d.ts.map +1 -1
  55. package/dist/types.js.map +1 -1
  56. package/package.json +2 -1
  57. package/src/adapters/36kr/latest.yaml +36 -0
  58. package/src/adapters/arxiv/trending.yaml +37 -0
  59. package/src/adapters/baidu/hot.yaml +37 -0
  60. package/src/adapters/baidu/search.yaml +41 -0
  61. package/src/adapters/bbc/technology.yaml +26 -0
  62. package/src/adapters/bbc/top.yaml +26 -0
  63. package/src/adapters/bbc/world.yaml +26 -0
  64. package/src/adapters/bilibili/coin.yaml +33 -0
  65. package/src/adapters/bilibili/later.yaml +31 -0
  66. package/src/adapters/bilibili/live.yaml +41 -0
  67. package/src/adapters/bilibili/trending.yaml +29 -0
  68. package/src/adapters/binance/hot.yaml +39 -0
  69. package/src/adapters/binance/kline.yaml +35 -0
  70. package/src/adapters/binance/ticker.yaml +33 -0
  71. package/src/adapters/bluesky/likes.yaml +35 -0
  72. package/src/adapters/bluesky/notifications.yaml +30 -0
  73. package/src/adapters/bluesky/post.yaml +25 -0
  74. package/src/adapters/chrome/bookmarks.yaml +26 -0
  75. package/src/adapters/chrome/tabs.yaml +25 -0
  76. package/src/adapters/cnki/search.yaml +40 -0
  77. package/src/adapters/cnn/technology.yaml +26 -0
  78. package/src/adapters/cocoapods/info.yaml +33 -0
  79. package/src/adapters/coinbase/prices.yaml +27 -0
  80. package/src/adapters/coinbase/rates.yaml +24 -0
  81. package/src/adapters/coupang/hot.yaml +29 -0
  82. package/src/adapters/crates-io/info.yaml +29 -0
  83. package/src/adapters/crates-io/versions.yaml +33 -0
  84. package/src/adapters/ctrip/hot.yaml +28 -0
  85. package/src/adapters/cursor/cursor.ts +91 -1
  86. package/src/adapters/dangdang/hot.yaml +38 -0
  87. package/src/adapters/dangdang/search.yaml +43 -0
  88. package/src/adapters/deepseek/chat.yaml +33 -0
  89. package/src/adapters/deepseek/models.yaml +18 -0
  90. package/src/adapters/devto/latest.yaml +29 -0
  91. package/src/adapters/devto/search.yaml +34 -0
  92. package/src/adapters/dianping/hot.yaml +43 -0
  93. package/src/adapters/dianping/search.yaml +48 -0
  94. package/src/adapters/discord-app/discord-app.ts +99 -1
  95. package/src/adapters/docker/networks.yaml +20 -0
  96. package/src/adapters/docker/volumes.yaml +19 -0
  97. package/src/adapters/docker-hub/info.yaml +26 -0
  98. package/src/adapters/docker-hub/tags.yaml +34 -0
  99. package/src/adapters/douban/group-hot.yaml +29 -0
  100. package/src/adapters/douban/new-movies.yaml +32 -0
  101. package/src/adapters/douban/tv-hot.yaml +32 -0
  102. package/src/adapters/doubao/ask.yaml +64 -0
  103. package/src/adapters/doubao/new.yaml +18 -0
  104. package/src/adapters/doubao/status.yaml +21 -0
  105. package/src/adapters/douyu/hot.yaml +34 -0
  106. package/src/adapters/douyu/search.yaml +42 -0
  107. package/src/adapters/eastmoney/fund.yaml +36 -0
  108. package/src/adapters/eastmoney/market.yaml +26 -0
  109. package/src/adapters/ele/hot.yaml +40 -0
  110. package/src/adapters/ele/search.yaml +47 -0
  111. package/src/adapters/exchangerate/list.yaml +25 -0
  112. package/src/adapters/facebook/marketplace.yaml +43 -0
  113. package/src/adapters/facebook/post.yaml +29 -0
  114. package/src/adapters/futu/hot.yaml +49 -0
  115. package/src/adapters/futu/quote.yaml +46 -0
  116. package/src/adapters/gitee/repos.yaml +34 -0
  117. package/src/adapters/github-trending/developers.yaml +33 -0
  118. package/src/adapters/github-trending/weekly.yaml +34 -0
  119. package/src/adapters/gitlab/projects.yaml +34 -0
  120. package/src/adapters/godot/scene-export.yaml +1 -1
  121. package/src/adapters/hackernews/comments.yaml +36 -0
  122. package/src/adapters/hackernews/item.yaml +28 -0
  123. package/src/adapters/hf/datasets.yaml +34 -0
  124. package/src/adapters/hf/spaces.yaml +34 -0
  125. package/src/adapters/homebrew/search.yaml +27 -0
  126. package/src/adapters/huggingface-papers/search.yaml +33 -0
  127. package/src/adapters/imdb/box-office.yaml +28 -0
  128. package/src/adapters/infoq/latest.yaml +26 -0
  129. package/src/adapters/instagram/activity.yaml +45 -0
  130. package/src/adapters/instagram/highlights.yaml +48 -0
  131. package/src/adapters/instagram/reels-trending.yaml +51 -0
  132. package/src/adapters/instagram/reels.yaml +34 -0
  133. package/src/adapters/instagram/stories.yaml +29 -0
  134. package/src/adapters/instagram/suggested.yaml +40 -0
  135. package/src/adapters/instagram/tags.yaml +52 -0
  136. package/src/adapters/itch-io/search.yaml +35 -0
  137. package/src/adapters/itch-io/top.yaml +31 -0
  138. package/src/adapters/ithome/hot.yaml +27 -0
  139. package/src/adapters/ithome/latest.yaml +26 -0
  140. package/src/adapters/jianyu/search.yaml +42 -0
  141. package/src/adapters/ke/ershoufang.yaml +75 -0
  142. package/src/adapters/ke/xiaoqu.yaml +73 -0
  143. package/src/adapters/kuaishou/hot.yaml +39 -0
  144. package/src/adapters/kuaishou/search.yaml +44 -0
  145. package/src/adapters/linkedin/jobs.yaml +47 -0
  146. package/src/adapters/lobsters/search.yaml +35 -0
  147. package/src/adapters/macos/active-app.yaml +16 -0
  148. package/src/adapters/macos/apps-list.yaml +14 -0
  149. package/src/adapters/macos/apps.yaml +31 -0
  150. package/src/adapters/macos/battery.yaml +26 -0
  151. package/src/adapters/macos/bluetooth.yaml +14 -0
  152. package/src/adapters/macos/brightness.yaml +22 -0
  153. package/src/adapters/macos/caffeinate.yaml +25 -0
  154. package/src/adapters/macos/calendar-create.yaml +81 -0
  155. package/src/adapters/macos/calendar-list.yaml +53 -0
  156. package/src/adapters/macos/calendar-today.yaml +30 -0
  157. package/src/adapters/macos/clipboard.yaml +23 -0
  158. package/src/adapters/macos/contacts-search.yaml +59 -0
  159. package/src/adapters/macos/dark-mode.yaml +19 -0
  160. package/src/adapters/macos/disk-info.yaml +31 -0
  161. package/src/adapters/macos/disk-usage.yaml +14 -0
  162. package/src/adapters/macos/do-not-disturb.yaml +21 -0
  163. package/src/adapters/macos/empty-trash.yaml +16 -0
  164. package/src/adapters/macos/finder-recent.yaml +24 -0
  165. package/src/adapters/macos/finder-selection.yaml +22 -0
  166. package/src/adapters/macos/finder-tags.yaml +40 -0
  167. package/src/adapters/macos/lock-screen.yaml +16 -0
  168. package/src/adapters/macos/mail-send.yaml +54 -0
  169. package/src/adapters/macos/mail-status.yaml +38 -0
  170. package/src/adapters/macos/messages-send.yaml +42 -0
  171. package/src/adapters/macos/music-control.yaml +43 -0
  172. package/src/adapters/macos/music-now.yaml +34 -0
  173. package/src/adapters/macos/notes-list.yaml +30 -0
  174. package/src/adapters/macos/notes-search.yaml +45 -0
  175. package/src/adapters/macos/notification.yaml +27 -0
  176. package/src/adapters/macos/notify.yaml +46 -0
  177. package/src/adapters/macos/open-app.yaml +21 -0
  178. package/src/adapters/macos/open.yaml +24 -0
  179. package/src/adapters/macos/photos-search.yaml +44 -0
  180. package/src/adapters/macos/processes.yaml +14 -0
  181. package/src/adapters/macos/reminder-create.yaml +75 -0
  182. package/src/adapters/macos/reminders-complete.yaml +33 -0
  183. package/src/adapters/macos/reminders-list.yaml +28 -0
  184. package/src/adapters/macos/safari-tabs.yaml +26 -0
  185. package/src/adapters/macos/say.yaml +36 -0
  186. package/src/adapters/macos/screen-lock.yaml +16 -0
  187. package/src/adapters/macos/screenshot.yaml +34 -0
  188. package/src/adapters/macos/shortcuts-list.yaml +14 -0
  189. package/src/adapters/macos/shortcuts-run.yaml +28 -0
  190. package/src/adapters/macos/sleep.yaml +14 -0
  191. package/src/adapters/macos/spotlight.yaml +43 -0
  192. package/src/adapters/macos/system-info.yaml +32 -0
  193. package/src/adapters/macos/trash.yaml +32 -0
  194. package/src/adapters/macos/uptime.yaml +14 -0
  195. package/src/adapters/macos/volume.yaml +19 -0
  196. package/src/adapters/macos/wifi-info.yaml +14 -0
  197. package/src/adapters/macos/wifi.yaml +63 -0
  198. package/src/adapters/maimai/search.yaml +62 -0
  199. package/src/adapters/maoyan/hot.yaml +33 -0
  200. package/src/adapters/maoyan/search.yaml +40 -0
  201. package/src/adapters/mastodon/timeline.yaml +33 -0
  202. package/src/adapters/mastodon/user.yaml +32 -0
  203. package/src/adapters/medium/article.yaml +22 -0
  204. package/src/adapters/medium/trending.yaml +30 -0
  205. package/src/adapters/meituan/hot.yaml +26 -0
  206. package/src/adapters/mubu/list.yaml +36 -0
  207. package/src/adapters/mubu/search.yaml +54 -0
  208. package/src/adapters/netease-music/playlist.yaml +34 -0
  209. package/src/adapters/netease-music/top.yaml +33 -0
  210. package/src/adapters/notion/databases.yaml +41 -0
  211. package/src/adapters/notion/pages.yaml +44 -0
  212. package/src/adapters/notion/search.yaml +41 -0
  213. package/src/adapters/npm/downloads.yaml +28 -0
  214. package/src/adapters/npm/info.yaml +25 -0
  215. package/src/adapters/npm/search.yaml +35 -0
  216. package/src/adapters/npm/versions.yaml +33 -0
  217. package/src/adapters/npm-trends/trending.yaml +17 -0
  218. package/src/adapters/nytimes/search.yaml +35 -0
  219. package/src/adapters/obsidian/daily.yaml +23 -0
  220. package/src/adapters/obsidian/open.yaml +26 -0
  221. package/src/adapters/obsidian/search.yaml +28 -0
  222. package/src/adapters/ollama/generate.yaml +33 -0
  223. package/src/adapters/ollama/models.yaml +29 -0
  224. package/src/adapters/ollama/ps.yaml +20 -0
  225. package/src/adapters/openrouter/search.yaml +31 -0
  226. package/src/adapters/perplexity/ask.yaml +33 -0
  227. package/src/adapters/pexels/curated.yaml +31 -0
  228. package/src/adapters/pinduoduo/search.yaml +36 -0
  229. package/src/adapters/producthunt/search.yaml +41 -0
  230. package/src/adapters/pypi/search.yaml +37 -0
  231. package/src/adapters/pypi/versions.yaml +31 -0
  232. package/src/adapters/quark/ls.yaml +39 -0
  233. package/src/adapters/quark/search.yaml +39 -0
  234. package/src/adapters/qweather/forecast.yaml +37 -0
  235. package/src/adapters/reddit/new.yaml +34 -0
  236. package/src/adapters/reddit/rising.yaml +33 -0
  237. package/src/adapters/reddit/top.yaml +40 -0
  238. package/src/adapters/reddit/trending.yaml +25 -0
  239. package/src/adapters/replicate/run.yaml +39 -0
  240. package/src/adapters/reuters/latest.yaml +26 -0
  241. package/src/adapters/sinafinance/market.yaml +21 -0
  242. package/src/adapters/slack/messages.yaml +41 -0
  243. package/src/adapters/slack/post.yaml +32 -0
  244. package/src/adapters/slack/search.yaml +28 -0
  245. package/src/adapters/slack/send.yaml +35 -0
  246. package/src/adapters/slack/status.yaml +19 -0
  247. package/src/adapters/slack/users.yaml +37 -0
  248. package/src/adapters/slock/servers.yaml +32 -0
  249. package/src/adapters/spotify/now-playing.yaml +28 -0
  250. package/src/adapters/spotify/playlists.yaml +37 -0
  251. package/src/adapters/spotify/top-tracks.yaml +42 -0
  252. package/src/adapters/stackoverflow/question.yaml +34 -0
  253. package/src/adapters/stackoverflow/tags.yaml +30 -0
  254. package/src/adapters/steam/app-details.yaml +32 -0
  255. package/src/adapters/steam/new-releases.yaml +28 -0
  256. package/src/adapters/steam/search.yaml +36 -0
  257. package/src/adapters/steam/specials.yaml +29 -0
  258. package/src/adapters/steam/wishlist.yaml +36 -0
  259. package/src/adapters/substack/trending.yaml +28 -0
  260. package/src/adapters/taobao/hot.yaml +31 -0
  261. package/src/adapters/taobao/search.yaml +44 -0
  262. package/src/adapters/techcrunch/search.yaml +33 -0
  263. package/src/adapters/theverge/search.yaml +33 -0
  264. package/src/adapters/threads/hot.yaml +44 -0
  265. package/src/adapters/threads/search.yaml +47 -0
  266. package/src/adapters/tiktok/trending.yaml +28 -0
  267. package/src/adapters/toutiao/hot.yaml +31 -0
  268. package/src/adapters/toutiao/search.yaml +47 -0
  269. package/src/adapters/twitch/games.yaml +31 -0
  270. package/src/adapters/twitch/search.yaml +39 -0
  271. package/src/adapters/twitch/streams.yaml +38 -0
  272. package/src/adapters/twitter/lists.yaml +49 -0
  273. package/src/adapters/twitter/media.yaml +48 -0
  274. package/src/adapters/twitter/mentions.yaml +38 -0
  275. package/src/adapters/twitter/mute.yaml +42 -0
  276. package/src/adapters/twitter/pin.yaml +43 -0
  277. package/src/adapters/twitter/quotes.yaml +43 -0
  278. package/src/adapters/twitter/retweets.yaml +44 -0
  279. package/src/adapters/twitter/spaces.yaml +43 -0
  280. package/src/adapters/twitter/unmute.yaml +42 -0
  281. package/src/adapters/unsplash/random.yaml +27 -0
  282. package/src/adapters/v2ex/search.yaml +36 -0
  283. package/src/adapters/vscode/extensions.yaml +23 -0
  284. package/src/adapters/vscode/install-ext.yaml +26 -0
  285. package/src/adapters/vscode/open.yaml +25 -0
  286. package/src/adapters/wechat-channels/hot.yaml +39 -0
  287. package/src/adapters/wechat-channels/search.yaml +57 -0
  288. package/src/adapters/weibo/trending.yaml +28 -0
  289. package/src/adapters/weixin/hot.yaml +22 -0
  290. package/src/adapters/wikipedia/today.yaml +25 -0
  291. package/src/adapters/xiaohongshu/follow.yaml +35 -0
  292. package/src/adapters/xiaohongshu/hashtag.yaml +44 -0
  293. package/src/adapters/xiaohongshu/hot.yaml +34 -0
  294. package/src/adapters/xiaohongshu/like.yaml +27 -0
  295. package/src/adapters/xiaohongshu/profile.yaml +39 -0
  296. package/src/adapters/xiaohongshu/save.yaml +27 -0
  297. package/src/adapters/xiaohongshu/suggest.yaml +34 -0
  298. package/src/adapters/xiaohongshu/trending.yaml +35 -0
  299. package/src/adapters/xiaohongshu/unfollow.yaml +40 -0
  300. package/src/adapters/xueqiu/market.yaml +25 -0
  301. package/src/adapters/yahoo-finance/quote.yaml +35 -0
  302. package/src/adapters/yahoo-finance/search.yaml +42 -0
  303. package/src/adapters/yahoo-finance/trending.yaml +30 -0
  304. package/src/adapters/youtube/playlist.yaml +43 -0
  305. package/src/adapters/youtube/shorts.yaml +42 -0
  306. package/src/adapters/youtube/trending.yaml +41 -0
  307. package/src/adapters/zhihu/answer.yaml +29 -0
  308. package/src/adapters/zhihu/answers.yaml +38 -0
  309. package/src/adapters/zhihu/article.yaml +27 -0
  310. package/src/adapters/zhihu/articles.yaml +38 -0
  311. package/src/adapters/zhihu/collections.yaml +37 -0
  312. package/src/adapters/zhihu/columns.yaml +38 -0
  313. package/src/adapters/zhihu/comment.yaml +42 -0
  314. package/src/adapters/zhihu/followers.yaml +37 -0
  315. package/src/adapters/zhihu/following.yaml +37 -0
  316. package/src/adapters/zhihu/pins.yaml +37 -0
  317. package/src/adapters/zhihu/topic.yaml +35 -0
  318. package/src/adapters/zhihu/topics.yaml +37 -0
  319. package/src/adapters/zhihu/trending.yaml +36 -0
  320. package/src/adapters/zhihu/user.yaml +30 -0
  321. package/src/adapters/zoom/join.yaml +24 -0
  322. package/src/adapters/zoom/start.yaml +17 -0
  323. package/src/hub/external-clis.yaml +343 -0
  324. package/src/hub/index.ts +128 -0
  325. package/src/hub/passthrough.ts +85 -0
@@ -0,0 +1,28 @@
1
+ site: macos
2
+ name: reminders-list
3
+ description: List all reminders from macOS Reminders.app
4
+ type: desktop
5
+ binary: osascript
6
+ detect: which osascript
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: osascript
11
+ args:
12
+ - "-l"
13
+ - "JavaScript"
14
+ - "-e"
15
+ - |
16
+ const app = Application('Reminders');
17
+ const lists = app.lists();
18
+ const out = [];
19
+ for (const list of lists) {
20
+ const rems = list.reminders.whose({completed: false})();
21
+ for (const r of rems) {
22
+ out.push({ list: list.name(), name: r.name(), dueDate: r.dueDate() ? r.dueDate().toISOString() : '', priority: r.priority() });
23
+ }
24
+ }
25
+ JSON.stringify(out);
26
+ parse: json
27
+
28
+ columns: [list, name, dueDate, priority]
@@ -0,0 +1,26 @@
1
+ site: macos
2
+ name: safari-tabs
3
+ description: List all open Safari tabs
4
+ type: desktop
5
+ binary: osascript
6
+ detect: which osascript
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: osascript
11
+ args:
12
+ - "-l"
13
+ - "JavaScript"
14
+ - "-e"
15
+ - |
16
+ const safari = Application('Safari');
17
+ const out = [];
18
+ for (const win of safari.windows()) {
19
+ for (const tab of win.tabs()) {
20
+ out.push({ title: tab.name(), url: tab.url() });
21
+ }
22
+ }
23
+ JSON.stringify(out);
24
+ parse: json
25
+
26
+ columns: [title, url]
@@ -0,0 +1,36 @@
1
+ # Desktop adapter — macOS text-to-speech via say
2
+ site: macos
3
+ name: say
4
+ description: Speak text aloud using macOS text-to-speech
5
+ type: desktop
6
+ binary: say
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ text:
11
+ type: str
12
+ required: true
13
+ positional: true
14
+ description: Text to speak
15
+ voice:
16
+ type: str
17
+ default: "Alex"
18
+ description: Voice name (e.g. Alex, Samantha, Daniel)
19
+ rate:
20
+ type: int
21
+ default: 200
22
+ description: Speech rate in words per minute
23
+
24
+ pipeline:
25
+ - exec:
26
+ command: say
27
+ args:
28
+ - "-v"
29
+ - "${{ args.voice }}"
30
+ - "-r"
31
+ - "${{ args.rate }}"
32
+ - "${{ args.text }}"
33
+ parse: text
34
+ timeout: 60000
35
+
36
+ columns: []
@@ -0,0 +1,16 @@
1
+ site: macos
2
+ name: screen-lock
3
+ description: Lock the macOS screen
4
+ type: desktop
5
+ binary: osascript
6
+ detect: which osascript
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: osascript
11
+ args:
12
+ - "-e"
13
+ - 'tell application "System Events" to keystroke "q" using {command down, control down}'
14
+ parse: text
15
+
16
+ columns: [result]
@@ -0,0 +1,34 @@
1
+ # Desktop adapter — take a macOS screenshot via screencapture
2
+ site: macos
3
+ name: screenshot
4
+ description: Take a screenshot and save to file or clipboard
5
+ type: desktop
6
+ binary: screencapture
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ file:
11
+ type: str
12
+ default: "/tmp/screenshot.png"
13
+ description: Output file path for the screenshot
14
+ clipboard:
15
+ type: bool
16
+ default: false
17
+ description: Copy screenshot to clipboard instead of saving to file
18
+
19
+ pipeline:
20
+ - if: "args.clipboard"
21
+ then:
22
+ - exec:
23
+ command: screencapture
24
+ args: ["-x", "-c"]
25
+ timeout: 10000
26
+ - evaluate: "JSON.stringify([{output: 'clipboard', message: 'Screenshot copied to clipboard'}])"
27
+ else:
28
+ - exec:
29
+ command: screencapture
30
+ args: ["-x", "${{ args.file }}"]
31
+ timeout: 10000
32
+ - evaluate: "JSON.stringify([{output: '${{ args.file }}', message: 'Screenshot saved'}])"
33
+
34
+ columns: [output, message]
@@ -0,0 +1,14 @@
1
+ site: macos
2
+ name: shortcuts-list
3
+ description: List all Shortcuts.app shortcuts
4
+ type: desktop
5
+ binary: shortcuts
6
+ detect: which shortcuts
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: shortcuts
11
+ args: ["list"]
12
+ parse: lines
13
+
14
+ columns: [name]
@@ -0,0 +1,28 @@
1
+ site: macos
2
+ name: shortcuts-run
3
+ description: Run a Shortcuts.app shortcut
4
+ type: desktop
5
+ binary: shortcuts
6
+ detect: which shortcuts
7
+
8
+ args:
9
+ name:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Shortcut name
14
+ input:
15
+ type: str
16
+ description: Input text for the shortcut
17
+
18
+ pipeline:
19
+ - exec:
20
+ command: shortcuts
21
+ args:
22
+ - "run"
23
+ - "${{ args.name }}"
24
+ - "${{ args.input ? '--input-path' : '' }}"
25
+ - "${{ args.input || '' }}"
26
+ parse: text
27
+
28
+ columns: [result]
@@ -0,0 +1,14 @@
1
+ site: macos
2
+ name: sleep
3
+ description: Put macOS to sleep
4
+ type: desktop
5
+ binary: pmset
6
+ detect: which pmset
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: pmset
11
+ args: ["sleepnow"]
12
+ parse: text
13
+
14
+ columns: [result]
@@ -0,0 +1,43 @@
1
+ # Desktop adapter — search files via macOS Spotlight (mdfind)
2
+ site: macos
3
+ name: spotlight
4
+ description: Search files by name using Spotlight index
5
+ type: desktop
6
+ binary: mdfind
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ query:
11
+ type: str
12
+ required: true
13
+ positional: true
14
+ description: Search query string
15
+ dir:
16
+ type: str
17
+ description: Limit search to a specific directory
18
+
19
+ pipeline:
20
+ - if: "args.dir"
21
+ then:
22
+ - exec:
23
+ command: mdfind
24
+ args:
25
+ - "-name"
26
+ - "${{ args.query }}"
27
+ - "-onlyin"
28
+ - "${{ args.dir }}"
29
+ parse: lines
30
+ timeout: 30000
31
+ else:
32
+ - exec:
33
+ command: mdfind
34
+ args:
35
+ - "-name"
36
+ - "${{ args.query }}"
37
+ parse: lines
38
+ timeout: 30000
39
+
40
+ - map:
41
+ path: "${{ item.line }}"
42
+
43
+ columns: [path]
@@ -0,0 +1,32 @@
1
+ # Desktop adapter — get macOS hardware and software info via system_profiler
2
+ site: macos
3
+ name: system-info
4
+ description: Get hardware model, processor, memory, and OS version
5
+ type: desktop
6
+ binary: system_profiler
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ pipeline:
10
+ - exec:
11
+ command: osascript
12
+ args:
13
+ - "-l"
14
+ - "JavaScript"
15
+ - "-e"
16
+ - |
17
+ var app = Application.currentApplication();
18
+ app.includeStandardAdditions = true;
19
+ var raw = app.doShellScript('system_profiler SPHardwareDataType SPSoftwareDataType -json');
20
+ var data = JSON.parse(raw);
21
+ var hw = data.SPHardwareDataType[0];
22
+ var sw = data.SPSoftwareDataType[0];
23
+ JSON.stringify([{
24
+ model_name: hw.machine_name || hw.model_name || '',
25
+ processor: hw.chip_type || hw.cpu_type || '',
26
+ memory: hw.physical_memory || '',
27
+ serial_number: hw.serial_number || '',
28
+ os_version: sw.os_version || ''
29
+ }]);
30
+ parse: json
31
+
32
+ columns: [model_name, processor, memory, os_version]
@@ -0,0 +1,32 @@
1
+ # Desktop adapter — list macOS Trash contents via JXA
2
+ site: macos
3
+ name: trash
4
+ description: Get Trash item count and list of items
5
+ type: desktop
6
+ binary: osascript
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ pipeline:
10
+ - exec:
11
+ command: osascript
12
+ args:
13
+ - "-l"
14
+ - "JavaScript"
15
+ - "-e"
16
+ - |
17
+ var finder = Application('Finder');
18
+ var trash = finder.trash;
19
+ var items = trash.items();
20
+ var result = [];
21
+ var max = Math.min(items.length, 50);
22
+ for (var i = 0; i < max; i++) {
23
+ result.push({
24
+ name: items[i].name(),
25
+ kind: items[i].kind(),
26
+ size: items[i].size()
27
+ });
28
+ }
29
+ JSON.stringify({count: items.length, items: result});
30
+ parse: json
31
+
32
+ columns: [count, items]
@@ -0,0 +1,14 @@
1
+ site: macos
2
+ name: uptime
3
+ description: Get system uptime
4
+ type: desktop
5
+ binary: uptime
6
+ detect: which uptime
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: uptime
11
+ args: []
12
+ parse: text
13
+
14
+ columns: [result]
@@ -0,0 +1,19 @@
1
+ # Desktop adapter — get macOS system volume settings via JXA
2
+ site: macos
3
+ name: volume
4
+ description: Get system volume settings (output, input, alert levels and mute status)
5
+ type: desktop
6
+ binary: osascript
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ pipeline:
10
+ - exec:
11
+ command: osascript
12
+ args:
13
+ - "-l"
14
+ - "JavaScript"
15
+ - "-e"
16
+ - "var app = Application.currentApplication(); app.includeStandardAdditions = true; JSON.stringify(app.getVolumeSettings())"
17
+ parse: json
18
+
19
+ columns: [outputVolume, inputVolume, alertVolume, outputMuted]
@@ -0,0 +1,14 @@
1
+ site: macos
2
+ name: wifi-info
3
+ description: Get current WiFi connection info
4
+ type: desktop
5
+ binary: networksetup
6
+ detect: which networksetup
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: networksetup
11
+ args: ["-getairportnetwork", "en0"]
12
+ parse: text
13
+
14
+ columns: [result]
@@ -0,0 +1,63 @@
1
+ # Desktop adapter — manage macOS Wi-Fi via networksetup
2
+ site: macos
3
+ name: wifi
4
+ description: Get Wi-Fi status or turn Wi-Fi on/off
5
+ type: desktop
6
+ binary: networksetup
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ action:
11
+ type: str
12
+ required: true
13
+ positional: true
14
+ description: "Action: status, on, or off"
15
+
16
+ pipeline:
17
+ - if: "args.action === 'on'"
18
+ then:
19
+ - exec:
20
+ command: networksetup
21
+ args: ["-setairportpower", "en0", "on"]
22
+ parse: text
23
+ - exec:
24
+ command: osascript
25
+ args:
26
+ - "-l"
27
+ - "JavaScript"
28
+ - "-e"
29
+ - "JSON.stringify([{action: 'on', message: 'Wi-Fi turned on'}])"
30
+ parse: json
31
+ else:
32
+ - if: "args.action === 'off'"
33
+ then:
34
+ - exec:
35
+ command: networksetup
36
+ args: ["-setairportpower", "en0", "off"]
37
+ parse: text
38
+ - exec:
39
+ command: osascript
40
+ args:
41
+ - "-l"
42
+ - "JavaScript"
43
+ - "-e"
44
+ - "JSON.stringify([{action: 'off', message: 'Wi-Fi turned off'}])"
45
+ parse: json
46
+ else:
47
+ - exec:
48
+ command: osascript
49
+ args:
50
+ - "-l"
51
+ - "JavaScript"
52
+ - "-e"
53
+ - |
54
+ var app = Application.currentApplication();
55
+ app.includeStandardAdditions = true;
56
+ var info = app.doShellScript('networksetup -getairportnetwork en0 2>/dev/null || echo "Not connected"');
57
+ var power = app.doShellScript('networksetup -getairportpower en0 2>/dev/null || echo "unknown"');
58
+ var network = (info.match(/Current Wi-Fi Network: (.+)/) || [])[1] || 'Not connected';
59
+ var isOn = power.indexOf('On') !== -1;
60
+ JSON.stringify([{network: network, power: isOn ? 'on' : 'off'}]);
61
+ parse: json
62
+
63
+ columns: [network, power, action, message]
@@ -0,0 +1,62 @@
1
+ site: maimai
2
+ name: search
3
+ description: Search talents/people on Maimai (requires login)
4
+ domain: maimai.cn
5
+ type: browser
6
+ strategy: intercept
7
+ browser: true
8
+
9
+ args:
10
+ query:
11
+ type: str
12
+ required: true
13
+ positional: true
14
+ description: "Search keyword (e.g. Java, product manager)"
15
+ limit:
16
+ type: int
17
+ default: 20
18
+ description: Number of results
19
+
20
+ columns: [name, job_title, company, location, school, degree, active_status]
21
+
22
+ pipeline:
23
+ - navigate:
24
+ url: https://maimai.cn/ent/talents/discover/search_v2
25
+ settleMs: 5000
26
+
27
+ - evaluate: |
28
+ (async () => {
29
+ const query = ${{ args.query | json }};
30
+ const limit = ${{ args.limit }};
31
+ let csrftoken = document.cookie.split('; ')
32
+ .find(r => r.startsWith('csrftoken='))?.split('=')[1] || '';
33
+ if (!csrftoken) {
34
+ const meta = document.querySelector('meta[name="csrf-token"]');
35
+ if (meta) csrftoken = meta.getAttribute('content') || '';
36
+ }
37
+ const body = { search: { page: 0, size: limit, query, sortby: 0 } };
38
+ const res = await fetch('https://maimai.cn/api/ent/discover/search?channel=www&data_version=3.0&version=1.0.0', {
39
+ method: 'POST',
40
+ headers: {
41
+ 'content-type': 'text/plain;charset=UTF-8',
42
+ 'x-csrf-token': csrftoken,
43
+ },
44
+ credentials: 'include',
45
+ body: JSON.stringify(body),
46
+ });
47
+ if (res.status === 401 || res.status === 403) throw new Error('Auth required — login at maimai.cn first');
48
+ const data = await res.json();
49
+ const list = data.data?.list || data.data?.talent_list || [];
50
+ return list.slice(0, limit).map(t => {
51
+ const edu = (t.edu && t.edu[0]) || {};
52
+ return {
53
+ name: t.name || '',
54
+ job_title: t.position || t.job_title || '',
55
+ company: t.company || '',
56
+ location: (t.province || '') + (t.city ? '·' + t.city : ''),
57
+ school: edu.school || '',
58
+ degree: edu.sdegree || '',
59
+ active_status: t.active_state_v2 || t.active_state || '',
60
+ };
61
+ });
62
+ })()
@@ -0,0 +1,33 @@
1
+ site: maoyan
2
+ name: hot
3
+ description: Maoyan current hot movies (box office)
4
+ domain: piaofang.maoyan.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 movies
14
+
15
+ pipeline:
16
+ - fetch:
17
+ url: https://piaofang.maoyan.com/dashboard-ajax/movie
18
+ headers:
19
+ Referer: https://piaofang.maoyan.com/dashboard
20
+
21
+ - select: movieList.data.list
22
+
23
+ - map:
24
+ rank: ${{ index + 1 }}
25
+ title: ${{ item.movieInfo?.movieName || '' }}
26
+ box_office: ${{ item.boxSplitUnit?.num || '' }}
27
+ box_unit: ${{ item.boxSplitUnit?.unit || '' }}
28
+ show_count: ${{ item.showCount || '' }}
29
+ audience: ${{ item.audienceCount || '' }}
30
+
31
+ - limit: ${{ args.limit }}
32
+
33
+ columns: [rank, title, box_office, box_unit, show_count, audience]
@@ -0,0 +1,40 @@
1
+ site: maoyan
2
+ name: search
3
+ description: Search movies on Maoyan
4
+ domain: www.maoyan.com
5
+ strategy: intercept
6
+ browser: true
7
+
8
+ args:
9
+ query:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Search keyword
14
+ limit:
15
+ type: int
16
+ default: 20
17
+ description: Number of results
18
+
19
+ columns: [rank, title, year, score, actors, url]
20
+
21
+ pipeline:
22
+ - navigate:
23
+ url: https://www.maoyan.com/films?showType=3&keyword=${{ args.query | urlencode }}
24
+ settleMs: 3000
25
+
26
+ - evaluate: |
27
+ (async () => {
28
+ const limit = ${{ args.limit }};
29
+ const clean = v => (v || '').replace(/\s+/g, ' ').trim();
30
+ const cards = document.querySelectorAll('.movie-item, .channel-detail .movie-item-hover, dl.movie-list dd');
31
+ return Array.from(cards).slice(0, limit).map((card, i) => {
32
+ const link = card.querySelector('a[href*="/films/"]') || card.closest('a');
33
+ const title = clean(card.querySelector('.channel-detail-movie-name, .movie-title-info .name, .name')?.textContent);
34
+ const year = clean(card.querySelector('.star, .movie-hover-title .year')?.textContent).replace(/[()]/g, '');
35
+ const score = clean(card.querySelector('.channel-detail-orange, .score, .integer')?.textContent);
36
+ const actors = clean(card.querySelector('.movie-hover-info, .actors, .star')?.textContent).substring(0, 80);
37
+ const href = link?.href || '';
38
+ return { rank: i + 1, title, year, score, actors, url: href };
39
+ }).filter(r => r.title);
40
+ })()
@@ -0,0 +1,33 @@
1
+ site: mastodon
2
+ name: timeline
3
+ description: Get Mastodon public timeline
4
+ type: web-api
5
+ domain: mastodon.social
6
+ strategy: public
7
+
8
+ args:
9
+ instance:
10
+ type: str
11
+ default: mastodon.social
12
+ description: Mastodon instance domain
13
+ limit:
14
+ type: int
15
+ default: 20
16
+
17
+ pipeline:
18
+ - fetch:
19
+ url: "https://${{ args.instance }}/api/v1/timelines/public"
20
+ params:
21
+ limit: "${{ args.limit }}"
22
+
23
+ - map:
24
+ author: "${{ item.account ? item.account.acct : '' }}"
25
+ content: "${{ (item.content || '') | strip_html | truncate(200) }}"
26
+ created: ${{ item.created_at }}
27
+ reblogs: ${{ item.reblogs_count }}
28
+ favourites: ${{ item.favourites_count }}
29
+ url: ${{ item.url }}
30
+
31
+ - limit: ${{ args.limit }}
32
+
33
+ columns: [author, content, reblogs, favourites, created]
@@ -0,0 +1,32 @@
1
+ site: mastodon
2
+ name: user
3
+ description: Get Mastodon user profile
4
+ type: web-api
5
+ domain: mastodon.social
6
+ strategy: public
7
+
8
+ args:
9
+ username:
10
+ required: true
11
+ positional: true
12
+ description: "Username (e.g. gargron@mastodon.social)"
13
+ instance:
14
+ type: str
15
+ default: mastodon.social
16
+
17
+ pipeline:
18
+ - fetch:
19
+ url: "https://${{ args.instance }}/api/v1/accounts/lookup"
20
+ params:
21
+ acct: "${{ args.username }}"
22
+
23
+ - map:
24
+ username: ${{ item.acct }}
25
+ display_name: ${{ item.display_name }}
26
+ followers: ${{ item.followers_count }}
27
+ following: ${{ item.following_count }}
28
+ statuses: ${{ item.statuses_count }}
29
+ bio: "${{ (item.note || '') | strip_html | truncate(200) }}"
30
+ url: ${{ item.url }}
31
+
32
+ columns: [username, display_name, followers, following, statuses, url]
@@ -0,0 +1,22 @@
1
+ site: medium
2
+ name: article
3
+ description: Read a Medium article as Markdown
4
+ type: web-api
5
+ domain: medium.com
6
+ strategy: public
7
+
8
+ args:
9
+ url:
10
+ required: true
11
+ positional: true
12
+ description: Medium article URL
13
+
14
+ pipeline:
15
+ - fetch_text:
16
+ url: "${{ args.url }}"
17
+ headers:
18
+ Accept: "text/html"
19
+
20
+ - html_to_md: {}
21
+
22
+ columns: [content]
@@ -0,0 +1,30 @@
1
+ site: medium
2
+ name: trending
3
+ description: Medium trending articles
4
+ type: web-api
5
+ domain: medium.com
6
+ strategy: public
7
+
8
+ args:
9
+ limit:
10
+ type: int
11
+ default: 10
12
+
13
+ pipeline:
14
+ - fetch:
15
+ url: https://medium.com/trending
16
+ headers:
17
+ Accept: application/json
18
+
19
+ - select: payload.references.Post
20
+
21
+ - map:
22
+ title: "${{ item.title || '' }}"
23
+ subtitle: "${{ (item.content?.subtitle || '') | truncate(80) }}"
24
+ claps: "${{ item.virtuals?.totalClapCount || 0 }}"
25
+ reading_time: "${{ Math.round(item.virtuals?.readingTime || 0) }}min"
26
+ url: "${{ 'https://medium.com/p/' + item.uniqueSlug }}"
27
+
28
+ - limit: ${{ args.limit }}
29
+
30
+ columns: [title, subtitle, claps, reading_time, url]