@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,44 @@
1
+ site: kuaishou
2
+ name: search
3
+ description: Search Kuaishou videos
4
+ domain: www.kuaishou.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, author, likes, url]
20
+
21
+ pipeline:
22
+ - navigate:
23
+ url: https://www.kuaishou.com/search/video?searchKey=${{ args.query | urlencode }}
24
+ settleMs: 4000
25
+
26
+ - scroll:
27
+ times: 2
28
+
29
+ - evaluate: |
30
+ (async () => {
31
+ const limit = ${{ args.limit }};
32
+ const clean = v => (v || '').replace(/\s+/g, ' ').trim();
33
+ const cards = document.querySelectorAll('[class*="video-card"], [class*="search-result-item"], a[href*="/short-video/"]');
34
+ return Array.from(cards).slice(0, limit).map((card, i) => {
35
+ const title = clean(card.querySelector('[class*="title"], [class*="caption"], [class*="desc"]')?.textContent);
36
+ const author = clean(card.querySelector('[class*="author"], [class*="nickname"]')?.textContent);
37
+ const likes = clean(card.querySelector('[class*="like"], [class*="count"]')?.textContent);
38
+ const link = card.querySelector('a[href*="/short-video/"]') || card.closest('a');
39
+ return {
40
+ rank: i + 1, title: title.substring(0, 100), author, likes,
41
+ url: link?.href || '',
42
+ };
43
+ }).filter(r => r.title || r.author);
44
+ })()
@@ -0,0 +1,47 @@
1
+ site: linkedin
2
+ name: jobs
3
+ description: Search LinkedIn job postings
4
+ domain: www.linkedin.com
5
+ type: web-api
6
+ strategy: cookie
7
+ auth_cookies: [li_at, JSESSIONID]
8
+
9
+ args:
10
+ query:
11
+ type: str
12
+ required: true
13
+ positional: true
14
+ description: Job search query
15
+ location:
16
+ type: str
17
+ description: Location filter
18
+ limit:
19
+ type: int
20
+ default: 20
21
+
22
+ pipeline:
23
+ - fetch:
24
+ url: https://www.linkedin.com/voyager/api/voyagerJobsDashJobCards
25
+ params:
26
+ decorationId: "com.linkedin.voyager.dash.deco.jobs.search.JobSearchCardsCollection-186"
27
+ q: jserpFilters
28
+ queryContext: "List(primaryHitType->JOBS,spellCorrectionEnabled->true)"
29
+ keywords: "${{ args.query }}"
30
+ locationFallback: "${{ args.location || '' }}"
31
+ count: "${{ args.limit }}"
32
+ headers:
33
+ csrf-token: "${{ cookies.JSESSIONID }}"
34
+
35
+ - select: "included"
36
+
37
+ - filter: "item.title || item.entityCustomTrackingInfo"
38
+
39
+ - map:
40
+ title: "${{ item.title || '' }}"
41
+ company: "${{ item.primaryDescription?.text || '' }}"
42
+ location: "${{ item.secondaryDescription?.text || '' }}"
43
+ posted: "${{ item.tertiaryDescription?.text || '' }}"
44
+
45
+ - limit: ${{ args.limit }}
46
+
47
+ columns: [title, company, location, posted]
@@ -0,0 +1,35 @@
1
+ site: lobsters
2
+ name: search
3
+ description: Search Lobsters stories
4
+ type: web-api
5
+ domain: lobste.rs
6
+ strategy: public
7
+
8
+ args:
9
+ query:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ limit:
14
+ type: int
15
+ default: 20
16
+
17
+ pipeline:
18
+ - fetch:
19
+ url: https://lobste.rs/search.json
20
+ params:
21
+ q: "${{ args.query }}"
22
+ what: stories
23
+ order: relevance
24
+
25
+ - map:
26
+ title: ${{ item.title }}
27
+ score: ${{ item.score }}
28
+ author: "${{ item.submitter_user ? item.submitter_user.username : '' }}"
29
+ comments: ${{ item.comment_count }}
30
+ tags: "${{ (item.tags || []).join(', ') }}"
31
+ url: ${{ item.url }}
32
+
33
+ - limit: ${{ args.limit }}
34
+
35
+ columns: [title, score, author, comments, tags]
@@ -0,0 +1,16 @@
1
+ site: macos
2
+ name: active-app
3
+ description: Get the currently active macOS application
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 get name of first application process whose frontmost is true'
14
+ parse: text
15
+
16
+ columns: [result]
@@ -0,0 +1,14 @@
1
+ site: macos
2
+ name: apps-list
3
+ description: List installed macOS applications
4
+ type: desktop
5
+ binary: ls
6
+ detect: which ls
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: ls
11
+ args: ["/Applications"]
12
+ parse: lines
13
+
14
+ columns: [name]
@@ -0,0 +1,31 @@
1
+ # Desktop adapter — list running macOS applications via JXA
2
+ site: macos
3
+ name: apps
4
+ description: List running applications with name, PID, and bundle ID
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 se = Application('System Events');
18
+ var procs = se.applicationProcesses.whose({backgroundOnly: false})();
19
+ var result = [];
20
+ for (var i = 0; i < procs.length; i++) {
21
+ var p = procs[i];
22
+ result.push({
23
+ name: p.name(),
24
+ pid: p.unixId(),
25
+ bundleId: p.bundleIdentifier() || ''
26
+ });
27
+ }
28
+ JSON.stringify(result);
29
+ parse: json
30
+
31
+ columns: [name, pid, bundleId]
@@ -0,0 +1,26 @@
1
+ # Desktop adapter — get macOS battery status via JXA + shell
2
+ site: macos
3
+ name: battery
4
+ description: Get battery percentage, charging status, and time remaining
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 app = Application.currentApplication();
18
+ app.includeStandardAdditions = true;
19
+ var raw = app.doShellScript('pmset -g batt');
20
+ var pct = (raw.match(/\t(\d+)%/) || [])[1] || 'unknown';
21
+ var st = (raw.match(/; (\w[\w ]+?);/) || [])[1] || 'unknown';
22
+ var rem = (raw.match(/(\d+:\d+) remaining/) || [])[1] || 'N/A';
23
+ JSON.stringify([{percent: pct, status: st, remaining: rem}]);
24
+ parse: json
25
+
26
+ columns: [percent, status, remaining]
@@ -0,0 +1,14 @@
1
+ site: macos
2
+ name: bluetooth
3
+ description: Check macOS Bluetooth status
4
+ type: desktop
5
+ binary: system_profiler
6
+ detect: which system_profiler
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: system_profiler
11
+ args: ["SPBluetoothDataType", "-json"]
12
+ parse: json
13
+
14
+ columns: [result]
@@ -0,0 +1,22 @@
1
+ site: macos
2
+ name: brightness
3
+ description: Get current screen brightness
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.currentApplication();
17
+ app.includeStandardAdditions = true;
18
+ const result = app.doShellScript('ioreg -c AppleBacklightDisplay | grep brightness');
19
+ JSON.stringify({ brightness: result });
20
+ parse: json
21
+
22
+ columns: [brightness]
@@ -0,0 +1,25 @@
1
+ # Desktop adapter — prevent macOS from sleeping via caffeinate
2
+ site: macos
3
+ name: caffeinate
4
+ description: Keep Mac awake for a specified duration (prevents display sleep)
5
+ type: desktop
6
+ binary: caffeinate
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ duration:
11
+ type: int
12
+ default: 3600
13
+ description: Duration in seconds to stay awake (default 1 hour)
14
+
15
+ pipeline:
16
+ - exec:
17
+ command: caffeinate
18
+ args:
19
+ - "-d"
20
+ - "-t"
21
+ - "${{ args.duration }}"
22
+ parse: text
23
+ timeout: "${{ (args.duration + 10) * 1000 }}"
24
+
25
+ columns: []
@@ -0,0 +1,81 @@
1
+ # Desktop adapter — create a macOS Calendar event via JXA (injection-safe)
2
+ site: macos
3
+ name: calendar-create
4
+ description: Create a new calendar event with title, date, time, and duration
5
+ type: desktop
6
+ binary: osascript
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ title:
11
+ type: str
12
+ required: true
13
+ positional: true
14
+ description: Event title
15
+ date:
16
+ type: str
17
+ default: "today"
18
+ description: "Event date (YYYY-MM-DD or 'today')"
19
+ time:
20
+ type: str
21
+ default: "09:00"
22
+ description: "Event start time (HH:MM)"
23
+ duration:
24
+ type: int
25
+ default: 60
26
+ description: Event duration in minutes
27
+ calendar:
28
+ type: str
29
+ default: ""
30
+ description: Calendar name (uses default calendar if empty)
31
+
32
+ pipeline:
33
+ - exec:
34
+ command: osascript
35
+ args:
36
+ - "-l"
37
+ - "JavaScript"
38
+ - "-e"
39
+ - |
40
+ ObjC.import('Foundation');
41
+ var env = $.NSProcessInfo.processInfo.environment;
42
+ var title = ObjC.unwrap(env.objectForKey('UNICLI_TITLE')) || 'New Event';
43
+ var dateStr = ObjC.unwrap(env.objectForKey('UNICLI_DATE')) || 'today';
44
+ var timeStr = ObjC.unwrap(env.objectForKey('UNICLI_TIME')) || '09:00';
45
+ var duration = parseInt(ObjC.unwrap(env.objectForKey('UNICLI_DURATION'))) || 60;
46
+ var calName = ObjC.unwrap(env.objectForKey('UNICLI_CALENDAR')) || '';
47
+
48
+ var cal = Application('Calendar');
49
+ var targetCal;
50
+ if (calName) {
51
+ var calendars = cal.calendars.whose({name: calName})();
52
+ targetCal = calendars.length > 0 ? calendars[0] : cal.defaultCalendar();
53
+ } else {
54
+ targetCal = cal.calendars()[0];
55
+ }
56
+
57
+ var now = new Date();
58
+ var dateParts;
59
+ if (dateStr === 'today') {
60
+ dateParts = [now.getFullYear(), now.getMonth(), now.getDate()];
61
+ } else {
62
+ var dp = dateStr.split('-');
63
+ dateParts = [parseInt(dp[0]), parseInt(dp[1]) - 1, parseInt(dp[2])];
64
+ }
65
+ var tp = timeStr.split(':');
66
+ var start = new Date(dateParts[0], dateParts[1], dateParts[2], parseInt(tp[0]), parseInt(tp[1]));
67
+ var end = new Date(start.getTime() + duration * 60000);
68
+
69
+ var evt = cal.Event({summary: title, startDate: start, endDate: end});
70
+ targetCal.events.push(evt);
71
+ JSON.stringify([{created: true, title: title, start: start.toISOString(), end: end.toISOString(), calendar: targetCal.name()}]);
72
+ env:
73
+ UNICLI_TITLE: "${{ args.title }}"
74
+ UNICLI_DATE: "${{ args.date }}"
75
+ UNICLI_TIME: "${{ args.time }}"
76
+ UNICLI_DURATION: "${{ args.duration }}"
77
+ UNICLI_CALENDAR: "${{ args.calendar }}"
78
+ parse: json
79
+ timeout: 15000
80
+
81
+ columns: [created, title, start, end, calendar]
@@ -0,0 +1,53 @@
1
+ # Desktop adapter — list macOS Calendar events via JXA
2
+ site: macos
3
+ name: calendar-list
4
+ description: List calendar events for the next N days
5
+ type: desktop
6
+ binary: osascript
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ days:
11
+ type: int
12
+ default: 1
13
+ description: Number of days ahead to fetch events
14
+
15
+ pipeline:
16
+ - exec:
17
+ command: osascript
18
+ args:
19
+ - "-l"
20
+ - "JavaScript"
21
+ - "-e"
22
+ - |
23
+ var cal = Application('Calendar');
24
+ var days = parseInt($.NSProcessInfo.processInfo.environment.objectForKey('UNICLI_DAYS').js) || 1;
25
+ var now = new Date();
26
+ var end = new Date(now.getTime() + days * 86400000);
27
+ var calendars = cal.calendars();
28
+ var result = [];
29
+ for (var c = 0; c < calendars.length; c++) {
30
+ var events = calendars[c].events();
31
+ for (var e = 0; e < events.length; e++) {
32
+ var ev = events[e];
33
+ var start = ev.startDate();
34
+ if (start >= now && start <= end) {
35
+ result.push({
36
+ calendar: calendars[c].name(),
37
+ title: ev.summary(),
38
+ start: start.toISOString(),
39
+ end: ev.endDate().toISOString(),
40
+ location: ev.location() || '',
41
+ notes: (ev.description() || '').substring(0, 200)
42
+ });
43
+ }
44
+ }
45
+ }
46
+ result.sort(function(a, b) { return a.start < b.start ? -1 : 1; });
47
+ JSON.stringify(result);
48
+ env:
49
+ UNICLI_DAYS: "${{ args.days }}"
50
+ parse: json
51
+ timeout: 30000
52
+
53
+ columns: [calendar, title, start, end, location]
@@ -0,0 +1,30 @@
1
+ site: macos
2
+ name: calendar-today
3
+ description: List today's calendar events from macOS Calendar.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('Calendar');
17
+ const now = new Date();
18
+ const start = new Date(now.getFullYear(), now.getMonth(), now.getDate());
19
+ const end = new Date(start.getTime() + 86400000);
20
+ const out = [];
21
+ for (const cal of app.calendars()) {
22
+ const evts = cal.events.whose({startDate: {_greaterThan: start}, startDate: {_lessThan: end}})();
23
+ for (const e of evts) {
24
+ out.push({ calendar: cal.name(), summary: e.summary(), start: e.startDate().toISOString(), end: e.endDate().toISOString(), location: e.location() || '' });
25
+ }
26
+ }
27
+ JSON.stringify(out);
28
+ parse: json
29
+
30
+ columns: [calendar, summary, start, end, location]
@@ -0,0 +1,23 @@
1
+ # Desktop adapter — get macOS clipboard contents via JXA
2
+ site: macos
3
+ name: clipboard
4
+ description: Get current clipboard text contents
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 app = Application.currentApplication();
18
+ app.includeStandardAdditions = true;
19
+ var clip = app.theClipboard();
20
+ JSON.stringify([{content: typeof clip === 'string' ? clip : String(clip)}]);
21
+ parse: json
22
+
23
+ columns: [content]
@@ -0,0 +1,59 @@
1
+ # Desktop adapter — search macOS Contacts via JXA (injection-safe)
2
+ site: macos
3
+ name: contacts-search
4
+ description: Search contacts by name, email, or phone
5
+ type: desktop
6
+ binary: osascript
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ query:
11
+ type: str
12
+ required: true
13
+ positional: true
14
+ description: Search query (name, email, or phone)
15
+
16
+ pipeline:
17
+ - exec:
18
+ command: osascript
19
+ args:
20
+ - "-l"
21
+ - "JavaScript"
22
+ - "-e"
23
+ - |
24
+ ObjC.import('Foundation');
25
+ var env = $.NSProcessInfo.processInfo.environment;
26
+ var query = (ObjC.unwrap(env.objectForKey('UNICLI_QUERY')) || '').toLowerCase();
27
+ var contacts = Application('Contacts');
28
+ var people = contacts.people();
29
+ var result = [];
30
+ var max = Math.min(people.length, 500);
31
+ for (var i = 0; i < max; i++) {
32
+ var p = people[i];
33
+ var first = p.firstName() || '';
34
+ var last = p.lastName() || '';
35
+ var fullName = (first + ' ' + last).trim();
36
+ var emails = [];
37
+ try { emails = p.emails.value(); } catch(e) {}
38
+ var phones = [];
39
+ try { phones = p.phones.value(); } catch(e) {}
40
+ var match = fullName.toLowerCase().indexOf(query) !== -1
41
+ || emails.some(function(e) { return e.toLowerCase().indexOf(query) !== -1; })
42
+ || phones.some(function(ph) { return ph.indexOf(query) !== -1; });
43
+ if (match) {
44
+ result.push({
45
+ name: fullName,
46
+ email: emails[0] || '',
47
+ phone: phones[0] || '',
48
+ company: p.organization() || ''
49
+ });
50
+ }
51
+ if (result.length >= 20) break;
52
+ }
53
+ JSON.stringify(result);
54
+ env:
55
+ UNICLI_QUERY: "${{ args.query }}"
56
+ parse: json
57
+ timeout: 30000
58
+
59
+ columns: [name, email, phone, company]
@@ -0,0 +1,19 @@
1
+ # Desktop adapter — get macOS dark mode status via JXA
2
+ site: macos
3
+ name: dark-mode
4
+ description: Get current dark mode 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
+ - "JSON.stringify({darkMode: Application('System Events').appearancePreferences.darkMode()})"
17
+ parse: json
18
+
19
+ columns: [darkMode]
@@ -0,0 +1,31 @@
1
+ # Desktop adapter — get macOS disk information via JXA
2
+ site: macos
3
+ name: disk-info
4
+ description: Get disk names, capacity, and free space for all mounted volumes
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 app = Application('Finder');
18
+ var disks = app.disks();
19
+ var result = [];
20
+ for (var i = 0; i < disks.length; i++) {
21
+ var d = disks[i];
22
+ result.push({
23
+ name: d.name(),
24
+ capacity: Math.round(d.capacity() / 1073741824 * 100) / 100,
25
+ freeSpace: Math.round(d.freeSpace() / 1073741824 * 100) / 100
26
+ });
27
+ }
28
+ JSON.stringify(result);
29
+ parse: json
30
+
31
+ columns: [name, capacity, freeSpace]
@@ -0,0 +1,14 @@
1
+ site: macos
2
+ name: disk-usage
3
+ description: Get disk usage summary
4
+ type: desktop
5
+ binary: df
6
+ detect: which df
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: df
11
+ args: ["-h"]
12
+ parse: text
13
+
14
+ columns: [result]
@@ -0,0 +1,21 @@
1
+ site: macos
2
+ name: do-not-disturb
3
+ description: Toggle macOS Focus/Do Not Disturb mode
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.currentApplication();
17
+ app.includeStandardAdditions = true;
18
+ app.doShellScript('defaults -currentHost read com.apple.notificationcenterui doNotDisturb 2>/dev/null || echo 0');
19
+ parse: text
20
+
21
+ columns: [result]
@@ -0,0 +1,16 @@
1
+ site: macos
2
+ name: empty-trash
3
+ description: Empty the macOS Trash
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 "Finder" to empty the trash'
14
+ parse: text
15
+
16
+ columns: [result]
@@ -0,0 +1,24 @@
1
+ # Desktop adapter — recently opened files via Spotlight (mdfind)
2
+ site: macos
3
+ name: finder-recent
4
+ description: List files opened in the last 7 days
5
+ type: desktop
6
+ binary: mdfind
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ pipeline:
10
+ - exec:
11
+ command: mdfind
12
+ args:
13
+ - "kMDItemLastUsedDate >= $time.today(-7)"
14
+ - "-onlyin"
15
+ - "$HOME"
16
+ parse: lines
17
+ timeout: 30000
18
+
19
+ - limit: 20
20
+
21
+ - map:
22
+ path: "${{ item.line }}"
23
+
24
+ columns: [path]