@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,22 @@
1
+ site: macos
2
+ name: finder-selection
3
+ description: Get currently selected files in Finder
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 finder = Application('Finder');
17
+ const sel = finder.selection();
18
+ const out = sel.map(item => ({ name: item.name(), path: item.url().replace('file://', '') }));
19
+ JSON.stringify(out);
20
+ parse: json
21
+
22
+ columns: [name, path]
@@ -0,0 +1,40 @@
1
+ # Desktop adapter — list Finder tags on a file via JXA (injection-safe)
2
+ site: macos
3
+ name: finder-tags
4
+ description: List Finder tags on a file or directory
5
+ type: desktop
6
+ binary: osascript
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ path:
11
+ type: str
12
+ required: true
13
+ positional: true
14
+ description: File or directory path to inspect
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 path = ObjC.unwrap(env.objectForKey('UNICLI_PATH')) || '';
27
+ var url = $.NSURL.fileURLWithPath(path);
28
+ var res = url.resourceValuesForKeysError(['NSURLTagNamesKey'], null);
29
+ var tags = ObjC.unwrap(res.NSURLTagNamesKey) || [];
30
+ var tagList = [];
31
+ for (var i = 0; i < tags.length; i++) {
32
+ tagList.push(ObjC.unwrap(tags[i]));
33
+ }
34
+ JSON.stringify([{path: path, tags: tagList}]);
35
+ env:
36
+ UNICLI_PATH: "${{ args.path }}"
37
+ parse: json
38
+ timeout: 10000
39
+
40
+ columns: [path, tags]
@@ -0,0 +1,16 @@
1
+ # Desktop adapter — lock macOS screen via pmset
2
+ site: macos
3
+ name: lock-screen
4
+ description: Lock the screen (put display to sleep)
5
+ type: desktop
6
+ binary: pmset
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ pipeline:
10
+ - exec:
11
+ command: pmset
12
+ args: ["displaysleepnow"]
13
+ parse: text
14
+ timeout: 5000
15
+
16
+ columns: []
@@ -0,0 +1,54 @@
1
+ # Desktop adapter — send email via macOS Mail.app JXA (injection-safe)
2
+ site: macos
3
+ name: mail-send
4
+ description: Send an email using Mail.app
5
+ type: desktop
6
+ binary: osascript
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ to:
11
+ type: str
12
+ required: true
13
+ description: Recipient email address
14
+ subject:
15
+ type: str
16
+ required: true
17
+ description: Email subject line
18
+ body:
19
+ type: str
20
+ required: true
21
+ description: Email body text
22
+
23
+ pipeline:
24
+ - exec:
25
+ command: osascript
26
+ args:
27
+ - "-l"
28
+ - "JavaScript"
29
+ - "-e"
30
+ - |
31
+ ObjC.import('Foundation');
32
+ var env = $.NSProcessInfo.processInfo.environment;
33
+ var to = ObjC.unwrap(env.objectForKey('UNICLI_TO')) || '';
34
+ var subject = ObjC.unwrap(env.objectForKey('UNICLI_SUBJECT')) || '';
35
+ var body = ObjC.unwrap(env.objectForKey('UNICLI_BODY')) || '';
36
+
37
+ var mail = Application('Mail');
38
+ var msg = mail.OutgoingMessage({
39
+ subject: subject,
40
+ content: body,
41
+ visible: true
42
+ });
43
+ mail.outgoingMessages.push(msg);
44
+ msg.toRecipients.push(mail.Recipient({address: to}));
45
+ mail.send(msg);
46
+ JSON.stringify([{sent: true, to: to, subject: subject}]);
47
+ env:
48
+ UNICLI_TO: "${{ args.to }}"
49
+ UNICLI_SUBJECT: "${{ args.subject }}"
50
+ UNICLI_BODY: "${{ args.body }}"
51
+ parse: json
52
+ timeout: 15000
53
+
54
+ columns: [sent, to, subject]
@@ -0,0 +1,38 @@
1
+ # Desktop adapter — get macOS Mail.app account status via JXA
2
+ site: macos
3
+ name: mail-status
4
+ description: Get Mail.app accounts and unread message counts
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 mail = Application('Mail');
18
+ var accounts = mail.accounts();
19
+ var result = [];
20
+ for (var i = 0; i < accounts.length; i++) {
21
+ var acct = accounts[i];
22
+ var unread = 0;
23
+ var mailboxes = acct.mailboxes();
24
+ for (var j = 0; j < mailboxes.length; j++) {
25
+ unread += mailboxes[j].unreadCount();
26
+ }
27
+ result.push({
28
+ name: acct.name(),
29
+ email: acct.emailAddresses()[0] || '',
30
+ type: acct.accountType(),
31
+ unread: unread
32
+ });
33
+ }
34
+ JSON.stringify(result);
35
+ parse: json
36
+ timeout: 15000
37
+
38
+ columns: [name, email, type, unread]
@@ -0,0 +1,42 @@
1
+ # Desktop adapter — send iMessage via JXA (injection-safe)
2
+ site: macos
3
+ name: messages-send
4
+ description: Send an iMessage to a contact
5
+ type: desktop
6
+ binary: osascript
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ to:
11
+ type: str
12
+ required: true
13
+ description: Recipient phone number or email
14
+ text:
15
+ type: str
16
+ required: true
17
+ description: Message text to send
18
+
19
+ pipeline:
20
+ - exec:
21
+ command: osascript
22
+ args:
23
+ - "-l"
24
+ - "JavaScript"
25
+ - "-e"
26
+ - |
27
+ ObjC.import('Foundation');
28
+ var env = $.NSProcessInfo.processInfo.environment;
29
+ var to = ObjC.unwrap(env.objectForKey('UNICLI_MSG_TO')) || '';
30
+ var text = ObjC.unwrap(env.objectForKey('UNICLI_MSG_TEXT')) || '';
31
+ var msg = Application('Messages');
32
+ var svc = msg.services.whose({serviceType: 'iMessage'})[0];
33
+ var buddy = svc.buddies.whose({handle: to})[0];
34
+ msg.send(text, {to: buddy});
35
+ JSON.stringify([{sent: true, to: to}]);
36
+ env:
37
+ UNICLI_MSG_TO: "${{ args.to }}"
38
+ UNICLI_MSG_TEXT: "${{ args.text }}"
39
+ parse: json
40
+ timeout: 15000
41
+
42
+ columns: [sent, to]
@@ -0,0 +1,43 @@
1
+ # Desktop adapter — Apple Music playback control via JXA (injection-safe)
2
+ site: macos
3
+ name: music-control
4
+ description: Control Apple Music playback (play, pause, next, prev, toggle)
5
+ type: desktop
6
+ binary: osascript
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ action:
11
+ type: str
12
+ required: true
13
+ positional: true
14
+ choices: [play, pause, next, prev, toggle]
15
+ description: Playback action to perform
16
+
17
+ pipeline:
18
+ - exec:
19
+ command: osascript
20
+ args:
21
+ - "-l"
22
+ - "JavaScript"
23
+ - "-e"
24
+ - |
25
+ ObjC.import('Foundation');
26
+ var env = $.NSProcessInfo.processInfo.environment;
27
+ var action = ObjC.unwrap(env.objectForKey('UNICLI_ACTION')) || '';
28
+ var music = Application('Music');
29
+ var result = {action: action, success: true};
30
+ if (action === 'play') { music.play(); }
31
+ else if (action === 'pause') { music.pause(); }
32
+ else if (action === 'next') { music.nextTrack(); }
33
+ else if (action === 'prev') { music.previousTrack(); }
34
+ else if (action === 'toggle') { music.playpause(); }
35
+ else { result.success = false; result.error = 'unknown action'; }
36
+ result.state = music.playerState();
37
+ JSON.stringify([result]);
38
+ env:
39
+ UNICLI_ACTION: "${{ args.action }}"
40
+ parse: json
41
+ timeout: 10000
42
+
43
+ columns: [action, success, state]
@@ -0,0 +1,34 @@
1
+ # Desktop adapter — Apple Music now playing via JXA
2
+ site: macos
3
+ name: music-now
4
+ description: Get currently playing track from Apple Music
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 music = Application('Music');
18
+ if (music.playerState() === 'playing' || music.playerState() === 'paused') {
19
+ var t = music.currentTrack;
20
+ JSON.stringify([{
21
+ name: t.name(),
22
+ artist: t.artist(),
23
+ album: t.album(),
24
+ position: music.playerPosition(),
25
+ duration: t.duration(),
26
+ state: music.playerState()
27
+ }]);
28
+ } else {
29
+ JSON.stringify([{state: 'stopped'}]);
30
+ }
31
+ parse: json
32
+ timeout: 10000
33
+
34
+ columns: [name, artist, album, state]
@@ -0,0 +1,30 @@
1
+ # Desktop adapter — list Apple Notes via JXA
2
+ site: macos
3
+ name: notes-list
4
+ description: List recent Apple Notes with folder and modification date
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 notes = Application('Notes');
18
+ var items = notes.notes().slice(0, 20);
19
+ JSON.stringify(items.map(function(n) {
20
+ return {
21
+ name: n.name(),
22
+ body: n.plaintext().substring(0, 200),
23
+ folder: n.container().name(),
24
+ modified: n.modificationDate().toISOString()
25
+ };
26
+ }));
27
+ parse: json
28
+ timeout: 30000
29
+
30
+ columns: [name, folder, modified]
@@ -0,0 +1,45 @@
1
+ # Desktop adapter — search Apple Notes via JXA (injection-safe)
2
+ site: macos
3
+ name: notes-search
4
+ description: Search Apple Notes by title or content
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 string
15
+
16
+ pipeline:
17
+ - exec:
18
+ command: osascript
19
+ args:
20
+ - "-l"
21
+ - "JavaScript"
22
+ - "-e"
23
+ - |
24
+ ObjC.import('Foundation');
25
+ var notes = Application('Notes');
26
+ var q = ObjC.unwrap($.NSProcessInfo.processInfo.environment.objectForKey('UNICLI_QUERY'));
27
+ var all = notes.notes();
28
+ var results = [];
29
+ for (var i = 0; i < all.length && results.length < 20; i++) {
30
+ var n = all[i];
31
+ if (n.name().toLowerCase().includes(q.toLowerCase()) || n.plaintext().toLowerCase().includes(q.toLowerCase())) {
32
+ results.push({
33
+ name: n.name(),
34
+ folder: n.container().name(),
35
+ snippet: n.plaintext().substring(0, 150)
36
+ });
37
+ }
38
+ }
39
+ JSON.stringify(results);
40
+ env:
41
+ UNICLI_QUERY: "${{ args.query }}"
42
+ parse: json
43
+ timeout: 30000
44
+
45
+ columns: [name, folder, snippet]
@@ -0,0 +1,27 @@
1
+ site: macos
2
+ name: notification
3
+ description: Send a macOS notification
4
+ type: desktop
5
+ binary: osascript
6
+ detect: which osascript
7
+
8
+ args:
9
+ title:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Notification title
14
+ message:
15
+ type: str
16
+ required: true
17
+ description: Notification message
18
+
19
+ pipeline:
20
+ - exec:
21
+ command: osascript
22
+ args:
23
+ - "-e"
24
+ - 'display notification "${{ args.message }}" with title "${{ args.title }}"'
25
+ parse: text
26
+
27
+ columns: [result]
@@ -0,0 +1,46 @@
1
+ # Desktop adapter — send a macOS notification via JXA (injection-safe)
2
+ site: macos
3
+ name: notify
4
+ description: Send a macOS notification with title and optional subtitle
5
+ type: desktop
6
+ binary: osascript
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ message:
11
+ type: str
12
+ required: true
13
+ positional: true
14
+ description: Notification message text
15
+ title:
16
+ type: str
17
+ default: "Uni-CLI"
18
+ description: Notification title
19
+ subtitle:
20
+ type: str
21
+ default: ""
22
+ description: Notification subtitle
23
+
24
+ pipeline:
25
+ - exec:
26
+ command: osascript
27
+ args:
28
+ - "-l"
29
+ - "JavaScript"
30
+ - "-e"
31
+ - |
32
+ var app = Application.currentApplication();
33
+ app.includeStandardAdditions = true;
34
+ var env = $.NSProcessInfo.processInfo.environment;
35
+ var msg = ObjC.unwrap(env.objectForKey('UNICLI_NOTIFY_MSG')) || 'notification';
36
+ var title = ObjC.unwrap(env.objectForKey('UNICLI_NOTIFY_TITLE')) || 'Uni-CLI';
37
+ var sub = ObjC.unwrap(env.objectForKey('UNICLI_NOTIFY_SUB')) || '';
38
+ app.displayNotification(msg, {withTitle: title, subtitle: sub});
39
+ JSON.stringify([{sent: true, message: msg, title: title}]);
40
+ env:
41
+ UNICLI_NOTIFY_MSG: "${{ args.message }}"
42
+ UNICLI_NOTIFY_TITLE: "${{ args.title }}"
43
+ UNICLI_NOTIFY_SUB: "${{ args.subtitle }}"
44
+ parse: json
45
+
46
+ columns: [sent, message, title]
@@ -0,0 +1,21 @@
1
+ site: macos
2
+ name: open-app
3
+ description: Open a macOS application
4
+ type: desktop
5
+ binary: open
6
+ detect: which open
7
+
8
+ args:
9
+ app:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Application name (e.g. Safari, Finder, Terminal)
14
+
15
+ pipeline:
16
+ - exec:
17
+ command: open
18
+ args: ["-a", "${{ args.app }}"]
19
+ parse: text
20
+
21
+ columns: [result]
@@ -0,0 +1,24 @@
1
+ # Desktop adapter — open files, URLs, or apps via macOS open command
2
+ site: macos
3
+ name: open
4
+ description: Open a file, URL, or application using macOS open command
5
+ type: desktop
6
+ binary: open
7
+ detect: "test $(uname) = Darwin"
8
+
9
+ args:
10
+ target:
11
+ type: str
12
+ required: true
13
+ positional: true
14
+ description: File path, URL, or application name to open
15
+
16
+ pipeline:
17
+ - exec:
18
+ command: open
19
+ args:
20
+ - "${{ args.target }}"
21
+ parse: text
22
+ timeout: 10000
23
+
24
+ columns: []
@@ -0,0 +1,44 @@
1
+ # Desktop adapter — search Apple Photos via JXA (injection-safe)
2
+ site: macos
3
+ name: photos-search
4
+ description: Search Apple Photos library by keyword
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 keyword for photos
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 q = ObjC.unwrap(env.objectForKey('UNICLI_QUERY')) || '';
27
+ var photos = Application('Photos');
28
+ var items = photos.search({for: q}).slice(0, 20);
29
+ JSON.stringify(items.map(function(p) {
30
+ return {
31
+ name: p.name() || p.filename(),
32
+ filename: p.filename(),
33
+ date: p.date().toISOString(),
34
+ width: p.width(),
35
+ height: p.height(),
36
+ favorite: p.favorite()
37
+ };
38
+ }));
39
+ env:
40
+ UNICLI_QUERY: "${{ args.query }}"
41
+ parse: json
42
+ timeout: 30000
43
+
44
+ columns: [name, filename, date, width, height, favorite]
@@ -0,0 +1,14 @@
1
+ site: macos
2
+ name: processes
3
+ description: List top processes by CPU usage
4
+ type: desktop
5
+ binary: ps
6
+ detect: which ps
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: ps
11
+ args: ["aux", "--sort=-%cpu"]
12
+ parse: text
13
+
14
+ columns: [result]
@@ -0,0 +1,75 @@
1
+ # Desktop adapter — create a macOS Reminder via JXA (injection-safe)
2
+ site: macos
3
+ name: reminder-create
4
+ description: Create a new reminder in Reminders.app
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: Reminder title
15
+ list:
16
+ type: str
17
+ default: ""
18
+ description: Reminders list name (uses default if empty)
19
+ due:
20
+ type: str
21
+ default: ""
22
+ description: "Due date (YYYY-MM-DD or YYYY-MM-DD HH:MM)"
23
+ notes:
24
+ type: str
25
+ default: ""
26
+ description: Additional notes for the reminder
27
+
28
+ pipeline:
29
+ - exec:
30
+ command: osascript
31
+ args:
32
+ - "-l"
33
+ - "JavaScript"
34
+ - "-e"
35
+ - |
36
+ ObjC.import('Foundation');
37
+ var env = $.NSProcessInfo.processInfo.environment;
38
+ var title = ObjC.unwrap(env.objectForKey('UNICLI_TITLE')) || 'Reminder';
39
+ var listName = ObjC.unwrap(env.objectForKey('UNICLI_LIST')) || '';
40
+ var dueStr = ObjC.unwrap(env.objectForKey('UNICLI_DUE')) || '';
41
+ var notes = ObjC.unwrap(env.objectForKey('UNICLI_NOTES')) || '';
42
+
43
+ var reminders = Application('Reminders');
44
+ var targetList;
45
+ if (listName) {
46
+ var lists = reminders.lists.whose({name: listName})();
47
+ targetList = lists.length > 0 ? lists[0] : reminders.defaultList();
48
+ } else {
49
+ targetList = reminders.defaultList();
50
+ }
51
+
52
+ var props = {name: title, body: notes};
53
+ if (dueStr) {
54
+ var parts = dueStr.split(/[\s-:T]+/);
55
+ var due;
56
+ if (parts.length >= 5) {
57
+ due = new Date(parseInt(parts[0]), parseInt(parts[1])-1, parseInt(parts[2]), parseInt(parts[3]), parseInt(parts[4]));
58
+ } else {
59
+ due = new Date(parseInt(parts[0]), parseInt(parts[1])-1, parseInt(parts[2]), 9, 0);
60
+ }
61
+ props.dueDate = due;
62
+ }
63
+
64
+ var reminder = reminders.Reminder(props);
65
+ targetList.reminders.push(reminder);
66
+ JSON.stringify([{created: true, title: title, list: targetList.name(), due: dueStr || 'none'}]);
67
+ env:
68
+ UNICLI_TITLE: "${{ args.title }}"
69
+ UNICLI_LIST: "${{ args.list }}"
70
+ UNICLI_DUE: "${{ args.due }}"
71
+ UNICLI_NOTES: "${{ args.notes }}"
72
+ parse: json
73
+ timeout: 15000
74
+
75
+ columns: [created, title, list, due]
@@ -0,0 +1,33 @@
1
+ site: macos
2
+ name: reminders-complete
3
+ description: Mark a reminder as complete in macOS Reminders.app
4
+ type: desktop
5
+ binary: osascript
6
+ detect: which osascript
7
+
8
+ args:
9
+ title:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Reminder title to mark complete
14
+
15
+ pipeline:
16
+ - exec:
17
+ command: osascript
18
+ args:
19
+ - "-l"
20
+ - "JavaScript"
21
+ - "-e"
22
+ - |
23
+ const app = Application('Reminders');
24
+ const title = '${{ args.title }}';
25
+ let found = false;
26
+ for (const list of app.lists()) {
27
+ const rems = list.reminders.whose({name: title})();
28
+ for (const r of rems) { r.completed = true; found = true; }
29
+ }
30
+ JSON.stringify({ completed: found, title: title });
31
+ parse: json
32
+
33
+ columns: [completed, title]