@zenalexa/unicli 0.224.1 → 0.225.1

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 (256) hide show
  1. package/AGENTS.md +5 -5
  2. package/README.md +92 -92
  3. package/README.zh-CN.md +69 -69
  4. package/dist/adapters/_electron/desktop-shared.d.ts.map +1 -1
  5. package/dist/adapters/_electron/desktop-shared.js +2 -1
  6. package/dist/adapters/_electron/desktop-shared.js.map +1 -1
  7. package/dist/adapters/_electron/shared.d.ts +6 -0
  8. package/dist/adapters/_electron/shared.d.ts.map +1 -1
  9. package/dist/adapters/_electron/shared.js +9 -0
  10. package/dist/adapters/_electron/shared.js.map +1 -1
  11. package/dist/adapters/antigravity/extra.js +4 -1
  12. package/dist/adapters/antigravity/extra.js.map +1 -1
  13. package/dist/adapters/chatwise/extra.js +4 -1
  14. package/dist/adapters/chatwise/extra.js.map +1 -1
  15. package/dist/adapters/codex/codex.js +3 -1
  16. package/dist/adapters/codex/codex.js.map +1 -1
  17. package/dist/adapters/codex/extra.js +4 -1
  18. package/dist/adapters/codex/extra.js.map +1 -1
  19. package/dist/adapters/codex/projects.d.ts.map +1 -1
  20. package/dist/adapters/codex/projects.js +3 -1
  21. package/dist/adapters/codex/projects.js.map +1 -1
  22. package/dist/adapters/cursor/cursor.js +6 -1
  23. package/dist/adapters/cursor/cursor.js.map +1 -1
  24. package/dist/adapters/discord-app/discord-app.js +10 -1
  25. package/dist/adapters/discord-app/discord-app.js.map +1 -1
  26. package/dist/adapters/notion-app/notion-app.js +11 -1
  27. package/dist/adapters/notion-app/notion-app.js.map +1 -1
  28. package/dist/adapters/spotify/api.js +36 -6
  29. package/dist/adapters/spotify/api.js.map +1 -1
  30. package/dist/adapters/xiaohongshu/browser-state.d.ts +2 -1
  31. package/dist/adapters/xiaohongshu/browser-state.d.ts.map +1 -1
  32. package/dist/adapters/xiaohongshu/browser-state.js +56 -2
  33. package/dist/adapters/xiaohongshu/browser-state.js.map +1 -1
  34. package/dist/adapters/xiaohongshu/feed.d.ts +24 -0
  35. package/dist/adapters/xiaohongshu/feed.d.ts.map +1 -0
  36. package/dist/adapters/xiaohongshu/feed.js +82 -0
  37. package/dist/adapters/xiaohongshu/feed.js.map +1 -0
  38. package/dist/adapters/xueqiu/extra.js +2 -2
  39. package/dist/adapters/xueqiu/extra.js.map +1 -1
  40. package/dist/browser/cdp-client.d.ts +15 -1
  41. package/dist/browser/cdp-client.d.ts.map +1 -1
  42. package/dist/browser/cdp-client.js +45 -16
  43. package/dist/browser/cdp-client.js.map +1 -1
  44. package/dist/browser/daemon.js +29 -7
  45. package/dist/browser/daemon.js.map +1 -1
  46. package/dist/browser/launcher.d.ts.map +1 -1
  47. package/dist/browser/launcher.js +22 -8
  48. package/dist/browser/launcher.js.map +1 -1
  49. package/dist/browser/local-profiles.d.ts +2 -0
  50. package/dist/browser/local-profiles.d.ts.map +1 -1
  51. package/dist/browser/local-profiles.js +42 -2
  52. package/dist/browser/local-profiles.js.map +1 -1
  53. package/dist/browser/page.d.ts +2 -2
  54. package/dist/browser/page.d.ts.map +1 -1
  55. package/dist/browser/page.js +2 -2
  56. package/dist/browser/page.js.map +1 -1
  57. package/dist/browser/protocol.d.ts +7 -0
  58. package/dist/browser/protocol.d.ts.map +1 -1
  59. package/dist/browser/protocol.js +5 -0
  60. package/dist/browser/protocol.js.map +1 -1
  61. package/dist/cli.d.ts.map +1 -1
  62. package/dist/cli.js +4 -3
  63. package/dist/cli.js.map +1 -1
  64. package/dist/commands/architecture.d.ts +3 -1
  65. package/dist/commands/architecture.d.ts.map +1 -1
  66. package/dist/commands/architecture.js +13 -5
  67. package/dist/commands/architecture.js.map +1 -1
  68. package/dist/commands/browser/index.d.ts.map +1 -1
  69. package/dist/commands/browser/index.js +26 -4
  70. package/dist/commands/browser/index.js.map +1 -1
  71. package/dist/commands/delivery.d.ts.map +1 -1
  72. package/dist/commands/delivery.js.map +1 -1
  73. package/dist/commands/describe.d.ts.map +1 -1
  74. package/dist/commands/describe.js +104 -9
  75. package/dist/commands/describe.js.map +1 -1
  76. package/dist/commands/dispatch.d.ts.map +1 -1
  77. package/dist/commands/dispatch.js +3 -13
  78. package/dist/commands/dispatch.js.map +1 -1
  79. package/dist/commands/do.d.ts +16 -13
  80. package/dist/commands/do.d.ts.map +1 -1
  81. package/dist/commands/do.js +72 -18
  82. package/dist/commands/do.js.map +1 -1
  83. package/dist/commands/social.d.ts.map +1 -1
  84. package/dist/commands/social.js +3 -13
  85. package/dist/commands/social.js.map +1 -1
  86. package/dist/core/architecture-tree.d.ts +26 -6
  87. package/dist/core/architecture-tree.d.ts.map +1 -1
  88. package/dist/core/architecture-tree.js +184 -40
  89. package/dist/core/architecture-tree.js.map +1 -1
  90. package/dist/core/capability-matrix.d.ts +63 -0
  91. package/dist/core/capability-matrix.d.ts.map +1 -0
  92. package/dist/core/capability-matrix.js +316 -0
  93. package/dist/core/capability-matrix.js.map +1 -0
  94. package/dist/core/command-contract-lint.d.ts.map +1 -1
  95. package/dist/core/command-contract-lint.js +3 -1
  96. package/dist/core/command-contract-lint.js.map +1 -1
  97. package/dist/core/command-contract.d.ts +10 -3
  98. package/dist/core/command-contract.d.ts.map +1 -1
  99. package/dist/core/command-contract.js +87 -5
  100. package/dist/core/command-contract.js.map +1 -1
  101. package/dist/discovery/aliases.d.ts.map +1 -1
  102. package/dist/discovery/aliases.js +26 -0
  103. package/dist/discovery/aliases.js.map +1 -1
  104. package/dist/discovery/core-catalog.d.ts +1 -0
  105. package/dist/discovery/core-catalog.d.ts.map +1 -1
  106. package/dist/discovery/core-catalog.js +22 -5
  107. package/dist/discovery/core-catalog.js.map +1 -1
  108. package/dist/discovery/intents.d.ts +31 -4
  109. package/dist/discovery/intents.d.ts.map +1 -1
  110. package/dist/discovery/intents.js +166 -3
  111. package/dist/discovery/intents.js.map +1 -1
  112. package/dist/discovery/loader.d.ts.map +1 -1
  113. package/dist/discovery/loader.js +3 -0
  114. package/dist/discovery/loader.js.map +1 -1
  115. package/dist/discovery/search.d.ts.map +1 -1
  116. package/dist/discovery/search.js +10 -1
  117. package/dist/discovery/search.js.map +1 -1
  118. package/dist/engine/cascade.d.ts.map +1 -1
  119. package/dist/engine/cascade.js +21 -25
  120. package/dist/engine/cascade.js.map +1 -1
  121. package/dist/engine/chromium-cookies.d.ts +27 -0
  122. package/dist/engine/chromium-cookies.d.ts.map +1 -1
  123. package/dist/engine/chromium-cookies.js +53 -14
  124. package/dist/engine/chromium-cookies.js.map +1 -1
  125. package/dist/engine/cookie-capture.d.ts +30 -0
  126. package/dist/engine/cookie-capture.d.ts.map +1 -0
  127. package/dist/engine/cookie-capture.js +104 -0
  128. package/dist/engine/cookie-capture.js.map +1 -0
  129. package/dist/engine/cookie-extractor.d.ts.map +1 -1
  130. package/dist/engine/cookie-extractor.js +4 -12
  131. package/dist/engine/cookie-extractor.js.map +1 -1
  132. package/dist/engine/cookie-refresh.d.ts +59 -8
  133. package/dist/engine/cookie-refresh.d.ts.map +1 -1
  134. package/dist/engine/cookie-refresh.js +80 -58
  135. package/dist/engine/cookie-refresh.js.map +1 -1
  136. package/dist/engine/cookie-source.d.ts +110 -0
  137. package/dist/engine/cookie-source.d.ts.map +1 -0
  138. package/dist/engine/cookie-source.js +207 -0
  139. package/dist/engine/cookie-source.js.map +1 -0
  140. package/dist/engine/cookies.d.ts +37 -25
  141. package/dist/engine/cookies.d.ts.map +1 -1
  142. package/dist/engine/cookies.js +58 -157
  143. package/dist/engine/cookies.js.map +1 -1
  144. package/dist/engine/delivery/index.d.ts +2 -1
  145. package/dist/engine/delivery/index.d.ts.map +1 -1
  146. package/dist/engine/delivery/index.js +2 -1
  147. package/dist/engine/delivery/index.js.map +1 -1
  148. package/dist/engine/delivery/spec.d.ts +44 -0
  149. package/dist/engine/delivery/spec.d.ts.map +1 -0
  150. package/dist/engine/delivery/spec.js +82 -0
  151. package/dist/engine/delivery/spec.js.map +1 -0
  152. package/dist/engine/executor.d.ts +17 -6
  153. package/dist/engine/executor.d.ts.map +1 -1
  154. package/dist/engine/executor.js +131 -68
  155. package/dist/engine/executor.js.map +1 -1
  156. package/dist/engine/kernel/stages.d.ts.map +1 -1
  157. package/dist/engine/kernel/stages.js +14 -4
  158. package/dist/engine/kernel/stages.js.map +1 -1
  159. package/dist/engine/objective/catalog.d.ts +23 -0
  160. package/dist/engine/objective/catalog.d.ts.map +1 -0
  161. package/dist/engine/objective/catalog.js +42 -0
  162. package/dist/engine/objective/catalog.js.map +1 -0
  163. package/dist/engine/objective/delivery.d.ts +18 -0
  164. package/dist/engine/objective/delivery.d.ts.map +1 -0
  165. package/dist/engine/objective/delivery.js +64 -0
  166. package/dist/engine/objective/delivery.js.map +1 -0
  167. package/dist/engine/objective/index.d.ts +20 -0
  168. package/dist/engine/objective/index.d.ts.map +1 -0
  169. package/dist/engine/objective/index.js +20 -0
  170. package/dist/engine/objective/index.js.map +1 -0
  171. package/dist/engine/objective/media-playback.d.ts +17 -0
  172. package/dist/engine/objective/media-playback.d.ts.map +1 -0
  173. package/dist/engine/objective/media-playback.js +186 -0
  174. package/dist/engine/objective/media-playback.js.map +1 -0
  175. package/dist/engine/objective/output.d.ts +20 -0
  176. package/dist/engine/objective/output.d.ts.map +1 -0
  177. package/dist/engine/objective/output.js +88 -0
  178. package/dist/engine/objective/output.js.map +1 -0
  179. package/dist/engine/objective/planner.d.ts +17 -0
  180. package/dist/engine/objective/planner.d.ts.map +1 -0
  181. package/dist/engine/objective/planner.js +60 -0
  182. package/dist/engine/objective/planner.js.map +1 -0
  183. package/dist/engine/objective/types.d.ts +66 -0
  184. package/dist/engine/objective/types.d.ts.map +1 -0
  185. package/dist/engine/objective/types.js +16 -0
  186. package/dist/engine/objective/types.js.map +1 -0
  187. package/dist/engine/runtime.d.ts.map +1 -1
  188. package/dist/engine/runtime.js +9 -4
  189. package/dist/engine/runtime.js.map +1 -1
  190. package/dist/engine/step-observer.d.ts +62 -0
  191. package/dist/engine/step-observer.d.ts.map +1 -0
  192. package/dist/engine/step-observer.js +38 -0
  193. package/dist/engine/step-observer.js.map +1 -0
  194. package/dist/engine/steps/browser-helpers.d.ts.map +1 -1
  195. package/dist/engine/steps/browser-helpers.js +36 -8
  196. package/dist/engine/steps/browser-helpers.js.map +1 -1
  197. package/dist/engine/steps/fetch-text.d.ts.map +1 -1
  198. package/dist/engine/steps/fetch-text.js +106 -33
  199. package/dist/engine/steps/fetch-text.js.map +1 -1
  200. package/dist/engine/steps/fetch.d.ts +20 -0
  201. package/dist/engine/steps/fetch.d.ts.map +1 -1
  202. package/dist/engine/steps/fetch.js.map +1 -1
  203. package/dist/engine/steps/index.d.ts +2 -0
  204. package/dist/engine/steps/index.d.ts.map +1 -1
  205. package/dist/engine/steps/index.js +2 -0
  206. package/dist/engine/steps/index.js.map +1 -1
  207. package/dist/engine/steps/split-text.d.ts +26 -0
  208. package/dist/engine/steps/split-text.d.ts.map +1 -0
  209. package/dist/engine/steps/split-text.js +89 -0
  210. package/dist/engine/steps/split-text.js.map +1 -0
  211. package/dist/engine/steps/to-entries.d.ts +9 -0
  212. package/dist/engine/steps/to-entries.d.ts.map +1 -0
  213. package/dist/engine/steps/to-entries.js +27 -0
  214. package/dist/engine/steps/to-entries.js.map +1 -0
  215. package/dist/fast-path/handlers/discovery.d.ts.map +1 -1
  216. package/dist/fast-path/handlers/discovery.js +7 -7
  217. package/dist/fast-path/handlers/discovery.js.map +1 -1
  218. package/dist/manifest-compact.txt +3 -2
  219. package/dist/manifest.json +183 -17
  220. package/dist/mcp/tools.js +1 -1
  221. package/dist/mcp/tools.js.map +1 -1
  222. package/dist/output/auth-guidance.d.ts +17 -3
  223. package/dist/output/auth-guidance.d.ts.map +1 -1
  224. package/dist/output/auth-guidance.js +27 -3
  225. package/dist/output/auth-guidance.js.map +1 -1
  226. package/dist/output/error-map.d.ts.map +1 -1
  227. package/dist/output/error-map.js +4 -0
  228. package/dist/output/error-map.js.map +1 -1
  229. package/package.json +4 -2
  230. package/server.json +2 -2
  231. package/skills/unicli/SKILL.md +1 -1
  232. package/skills/unicli-claude-code/SKILL.md +1 -1
  233. package/skills/unicli-hermes/SKILL.md +1 -1
  234. package/src/adapters/12306/price.yaml +91 -0
  235. package/src/adapters/12306/stations.yaml +52 -0
  236. package/src/adapters/12306/trains.yaml +129 -0
  237. package/src/adapters/_electron/desktop-shared.ts +5 -1
  238. package/src/adapters/_electron/shared.ts +15 -0
  239. package/src/adapters/antigravity/extra.ts +10 -1
  240. package/src/adapters/chatwise/extra.ts +10 -1
  241. package/src/adapters/codex/codex.ts +6 -0
  242. package/src/adapters/codex/extra.ts +10 -1
  243. package/src/adapters/codex/projects.ts +9 -1
  244. package/src/adapters/cursor/cursor.ts +9 -0
  245. package/src/adapters/discord-app/discord-app.ts +16 -1
  246. package/src/adapters/macos/brightness.yaml +6 -3
  247. package/src/adapters/macos/calendar-list.yaml +9 -11
  248. package/src/adapters/macos/calendar-today.yaml +1 -1
  249. package/src/adapters/macos/safari-url.yaml +8 -4
  250. package/src/adapters/maoyan/hot.yaml +1 -1
  251. package/src/adapters/notion-app/notion-app.ts +17 -1
  252. package/src/adapters/spotify/api.ts +54 -8
  253. package/src/adapters/weibo/trending.yaml +2 -0
  254. package/src/adapters/xiaohongshu/browser-state.ts +59 -2
  255. package/src/adapters/xiaohongshu/feed.ts +103 -0
  256. package/src/adapters/xueqiu/extra.ts +5 -2
@@ -0,0 +1,129 @@
1
+ site: 12306
2
+ name: trains
3
+ description: List trains between two 12306 stations on a date (telecodes from `12306 stations`)
4
+ type: web-api
5
+ domain: kyfw.12306.cn
6
+ strategy: public
7
+
8
+ args:
9
+ from:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Origin station telecode (e.g. VNP for 北京南) — get it from `12306 stations <name>`
14
+ to:
15
+ type: str
16
+ required: true
17
+ positional: true
18
+ description: Destination station telecode (e.g. AOH) — get it from `12306 stations <name>`
19
+ date:
20
+ type: str
21
+ required: true
22
+ positional: true
23
+ description: Departure date YYYY-MM-DD
24
+ limit:
25
+ type: int
26
+ default: 50
27
+ description: Maximum rows (1-100)
28
+
29
+ pipeline:
30
+ # 1. Mint an anonymous session — 12306 query endpoints reject cookieless requests.
31
+ - fetch_text:
32
+ url: https://kyfw.12306.cn/otn/leftTicket/init
33
+ capture_cookies: true
34
+
35
+ # 2. Query the left-ticket endpoint. 12306 rotates the endpoint NAME every few
36
+ # weeks (queryG/queryO/queryZ/queryA) and signals the right one via `c_url`.
37
+ - fetch:
38
+ url: https://kyfw.12306.cn/otn/leftTicket/queryG
39
+ params:
40
+ "leftTicketDTO.train_date": "${{ args.date }}"
41
+ "leftTicketDTO.from_station": "${{ args.from }}"
42
+ "leftTicketDTO.to_station": "${{ args.to }}"
43
+ purpose_codes: ADULT
44
+ rotate_urls:
45
+ - https://kyfw.12306.cn/otn/leftTicket/queryG
46
+ - https://kyfw.12306.cn/otn/leftTicket/queryO
47
+ - https://kyfw.12306.cn/otn/leftTicket/queryZ
48
+ - https://kyfw.12306.cn/otn/leftTicket/queryA
49
+ rotate_on_field: c_url
50
+
51
+ # 3. Each row in data.result is a URL-encoded `|`-delimited record.
52
+ - select: data.result
53
+
54
+ - split_text:
55
+ mode: per_item
56
+ strip_each: "%0A"
57
+ decode: uri
58
+ field_separator: "|"
59
+ columns:
60
+ - sale_flag # f0
61
+ - bookable_flag # f1 (预订)
62
+ - train_no # f2 internal id
63
+ - code # f3 公开车次 e.g. G547
64
+ - start_tc # f4
65
+ - end_tc # f5
66
+ - from_tc # f6 origin telecode
67
+ - to_tc # f7 dest telecode
68
+ - start_time # f8
69
+ - arrive_time # f9
70
+ - duration # f10
71
+ - can_book # f11 (Y/N)
72
+ - f12
73
+ - f13
74
+ - f14
75
+ - f15
76
+ - f16
77
+ - f17
78
+ - f18
79
+ - f19
80
+ - f20
81
+ - f21
82
+ - f22
83
+ - soft_sleeper # f23 软卧
84
+ - f24
85
+ - f25
86
+ - no_seat # f26 无座
87
+ - f27
88
+ - hard_sleeper # f28 硬卧
89
+ - hard_seat # f29 硬座
90
+ - second_seat # f30 二等座
91
+ - first_seat # f31 一等座
92
+ - business_seat # f32 商务座
93
+
94
+ - map:
95
+ code: ${{ item.code }}
96
+ from_to: ${{ item.from_tc + '→' + item.to_tc }}
97
+ depart: ${{ item.start_time }}
98
+ arrive: ${{ item.arrive_time }}
99
+ duration: ${{ item.duration }}
100
+ business: ${{ item.business_seat }}
101
+ first: ${{ item.first_seat }}
102
+ second: ${{ item.second_seat }}
103
+ soft_sleeper: ${{ item.soft_sleeper }}
104
+ hard_sleeper: ${{ item.hard_sleeper }}
105
+ hard_seat: ${{ item.hard_seat }}
106
+ no_seat: ${{ item.no_seat }}
107
+ bookable: ${{ item.bookable_flag }}
108
+
109
+ - limit: ${{ args.limit }}
110
+
111
+ columns:
112
+ [
113
+ code,
114
+ from_to,
115
+ depart,
116
+ arrive,
117
+ duration,
118
+ second,
119
+ first,
120
+ business,
121
+ hard_sleeper,
122
+ bookable,
123
+ ]
124
+ capabilities: ["http.fetch"]
125
+ minimum_capability: http.fetch
126
+ trust: public
127
+ confidentiality: public
128
+ quarantine: false
129
+ schema_version: v2
@@ -4,7 +4,10 @@ import {
4
4
  resolveAppControlPolicy,
5
5
  } from "../../electron-apps.js";
6
6
  import { launchElectronApp } from "../../browser/launcher.js";
7
- import { connectElectronApp } from "./shared.js";
7
+ import {
8
+ connectElectronApp,
9
+ ELECTRON_APP_MINIMUM_CAPABILITY,
10
+ } from "./shared.js";
8
11
  import type { BrowserPage } from "../../browser/page.js";
9
12
 
10
13
  export interface ElectronMediaProfile {
@@ -39,6 +42,7 @@ export const ELECTRON_DESKTOP_MEDIA_COMMANDS = [
39
42
  const ELECTRON_DESKTOP_COMMAND_META = {
40
43
  adapter_path: "src/adapters/electron-desktop/electron-desktop.ts",
41
44
  target_surface: "desktop" as const,
45
+ minimum_capability: ELECTRON_APP_MINIMUM_CAPABILITY,
42
46
  };
43
47
 
44
48
  export function registerElectronDesktopCommands(
@@ -15,6 +15,20 @@ import { CDPClient } from "../../browser/cdp-client.js";
15
15
  import { BrowserPage } from "../../browser/page.js";
16
16
  import { injectStealth } from "../../browser/stealth.js";
17
17
 
18
+ export const ELECTRON_APP_MINIMUM_CAPABILITY = "cdp-browser.cdp_attach";
19
+
20
+ export function electronAppCommandMeta(adapterPath: string): {
21
+ adapter_path: string;
22
+ target_surface: "desktop";
23
+ minimum_capability: typeof ELECTRON_APP_MINIMUM_CAPABILITY;
24
+ } {
25
+ return {
26
+ adapter_path: adapterPath,
27
+ target_surface: "desktop",
28
+ minimum_capability: ELECTRON_APP_MINIMUM_CAPABILITY,
29
+ };
30
+ }
31
+
18
32
  /**
19
33
  * Connect to an Electron app via CDP.
20
34
  * Launches the app if not running.
@@ -77,6 +91,7 @@ export function registerAIChatCommands(
77
91
  const desktopCommandMeta = {
78
92
  adapter_path: `src/adapters/${site}/${site}.ts`,
79
93
  target_surface: "desktop" as const,
94
+ minimum_capability: ELECTRON_APP_MINIMUM_CAPABILITY,
80
95
  };
81
96
 
82
97
  /** Escape single quotes in selectors for use in evaluate strings */
@@ -1,7 +1,14 @@
1
1
  import { cli, Strategy } from "../../registry.js";
2
- import { connectElectronApp } from "../_electron/shared.js";
2
+ import {
3
+ connectElectronApp,
4
+ electronAppCommandMeta,
5
+ } from "../_electron/shared.js";
3
6
  import { intArg } from "../_shared/browser-tools.js";
4
7
 
8
+ const ANTIGRAVITY_COMMAND_META = electronAppCommandMeta(
9
+ "src/adapters/antigravity/extra.ts",
10
+ );
11
+
5
12
  async function readAntigravityText(): Promise<string> {
6
13
  const page = await connectElectronApp("antigravity");
7
14
  const text = await page.evaluate("document.body?.innerText ?? ''");
@@ -13,6 +20,7 @@ cli({
13
20
  name: "extract-code",
14
21
  description: "Extract code blocks from the active Antigravity conversation",
15
22
  strategy: Strategy.PUBLIC,
23
+ ...ANTIGRAVITY_COMMAND_META,
16
24
  columns: ["language", "code"],
17
25
  func: async () => {
18
26
  const page = await connectElectronApp("antigravity");
@@ -32,6 +40,7 @@ cli({
32
40
  name: "watch",
33
41
  description: "Poll Antigravity conversation text for updates",
34
42
  strategy: Strategy.PUBLIC,
43
+ ...ANTIGRAVITY_COMMAND_META,
35
44
  args: [
36
45
  { name: "interval", type: "int", default: 2 },
37
46
  { name: "iterations", type: "int", default: 5 },
@@ -1,12 +1,20 @@
1
1
  import { cli, Strategy } from "../../registry.js";
2
- import { connectElectronApp } from "../_electron/shared.js";
2
+ import {
3
+ connectElectronApp,
4
+ electronAppCommandMeta,
5
+ } from "../_electron/shared.js";
3
6
  import { intArg } from "../_shared/browser-tools.js";
4
7
 
8
+ const CHATWISE_COMMAND_META = electronAppCommandMeta(
9
+ "src/adapters/chatwise/extra.ts",
10
+ );
11
+
5
12
  cli({
6
13
  site: "chatwise",
7
14
  name: "history",
8
15
  description: "List ChatWise conversations from the sidebar",
9
16
  strategy: Strategy.PUBLIC,
17
+ ...CHATWISE_COMMAND_META,
10
18
  args: [{ name: "limit", type: "int", default: 20 }],
11
19
  columns: ["title"],
12
20
  func: async (_page, kwargs) => {
@@ -27,6 +35,7 @@ cli({
27
35
  name: "export",
28
36
  description: "Export the current ChatWise conversation as Markdown text",
29
37
  strategy: Strategy.PUBLIC,
38
+ ...CHATWISE_COMMAND_META,
30
39
  columns: ["content"],
31
40
  func: async () => {
32
41
  const page = await connectElectronApp("chatwise");
@@ -7,9 +7,14 @@
7
7
  import {
8
8
  registerAIChatCommands,
9
9
  connectElectronApp,
10
+ electronAppCommandMeta,
10
11
  } from "../_electron/shared.js";
11
12
  import { cli, Strategy } from "../../registry.js";
12
13
 
14
+ const CODEX_COMMAND_META = electronAppCommandMeta(
15
+ "src/adapters/codex/codex.ts",
16
+ );
17
+
13
18
  registerAIChatCommands("codex", {
14
19
  inputSelector: ".input-area textarea, [role='textbox']",
15
20
  responseSelector: ".message:last-child .content, .response:last-child",
@@ -24,6 +29,7 @@ cli({
24
29
  name: "extract-diff",
25
30
  description: "Extract diff patches from the last Codex response",
26
31
  strategy: Strategy.PUBLIC,
32
+ ...CODEX_COMMAND_META,
27
33
  func: async () => {
28
34
  const p = await connectElectronApp("codex");
29
35
  const diffs = await p.evaluate(`
@@ -1,12 +1,20 @@
1
1
  import { cli, Strategy } from "../../registry.js";
2
- import { connectElectronApp } from "../_electron/shared.js";
2
+ import {
3
+ connectElectronApp,
4
+ electronAppCommandMeta,
5
+ } from "../_electron/shared.js";
3
6
  import { intArg } from "../_shared/browser-tools.js";
4
7
 
8
+ const CODEX_EXTRA_COMMAND_META = electronAppCommandMeta(
9
+ "src/adapters/codex/extra.ts",
10
+ );
11
+
5
12
  cli({
6
13
  site: "codex",
7
14
  name: "history",
8
15
  description: "List Codex desktop conversation threads",
9
16
  strategy: Strategy.PUBLIC,
17
+ ...CODEX_EXTRA_COMMAND_META,
10
18
  args: [{ name: "limit", type: "int", default: 20 }],
11
19
  columns: ["title"],
12
20
  func: async (_page, kwargs) => {
@@ -27,6 +35,7 @@ cli({
27
35
  name: "export",
28
36
  description: "Export the current Codex desktop thread as Markdown text",
29
37
  strategy: Strategy.PUBLIC,
38
+ ...CODEX_EXTRA_COMMAND_META,
30
39
  columns: ["content"],
31
40
  func: async () => {
32
41
  const page = await connectElectronApp("codex");
@@ -7,7 +7,14 @@
7
7
  */
8
8
 
9
9
  import { cli, Strategy } from "../../registry.js";
10
- import { connectElectronApp } from "../_electron/shared.js";
10
+ import {
11
+ connectElectronApp,
12
+ electronAppCommandMeta,
13
+ } from "../_electron/shared.js";
14
+
15
+ const CODEX_PROJECTS_COMMAND_META = electronAppCommandMeta(
16
+ "src/adapters/codex/projects.ts",
17
+ );
11
18
 
12
19
  interface CodexConversation {
13
20
  index: number;
@@ -141,6 +148,7 @@ cli({
141
148
  description: "List Codex projects and visible conversations from the sidebar",
142
149
  domain: "localhost",
143
150
  strategy: Strategy.PUBLIC,
151
+ ...CODEX_PROJECTS_COMMAND_META,
144
152
  browser: false,
145
153
  args: [
146
154
  {
@@ -9,9 +9,14 @@ import { writeFileSync } from "node:fs";
9
9
  import {
10
10
  registerAIChatCommands,
11
11
  connectElectronApp,
12
+ electronAppCommandMeta,
12
13
  } from "../_electron/shared.js";
13
14
  import { cli, Strategy } from "../../registry.js";
14
15
 
16
+ const CURSOR_COMMAND_META = electronAppCommandMeta(
17
+ "src/adapters/cursor/cursor.ts",
18
+ );
19
+
15
20
  registerAIChatCommands("cursor", {
16
21
  inputSelector:
17
22
  ".chat-input textarea, [data-testid='chat-input'] textarea, .composer-input textarea",
@@ -28,6 +33,7 @@ cli({
28
33
  name: "composer",
29
34
  description: "Open Cursor Composer mode with a prompt",
30
35
  strategy: Strategy.PUBLIC,
36
+ ...CURSOR_COMMAND_META,
31
37
  args: [
32
38
  {
33
39
  name: "prompt",
@@ -52,6 +58,7 @@ cli({
52
58
  name: "extract-code",
53
59
  description: "Extract code blocks from the last Cursor response",
54
60
  strategy: Strategy.PUBLIC,
61
+ ...CURSOR_COMMAND_META,
55
62
  func: async () => {
56
63
  const p = await connectElectronApp("cursor");
57
64
  const code = await p.evaluate(`
@@ -75,6 +82,7 @@ cli({
75
82
  name: "export",
76
83
  description: "Export the current Cursor conversation to a Markdown file",
77
84
  strategy: Strategy.PUBLIC,
85
+ ...CURSOR_COMMAND_META,
78
86
  args: [
79
87
  {
80
88
  name: "output",
@@ -117,6 +125,7 @@ cli({
117
125
  name: "history",
118
126
  description: "List recent chat sessions from the Cursor sidebar",
119
127
  strategy: Strategy.PUBLIC,
128
+ ...CURSOR_COMMAND_META,
120
129
  func: async () => {
121
130
  const p = await connectElectronApp("cursor");
122
131
  const items = (await p.evaluate(`
@@ -4,15 +4,23 @@
4
4
  * Commands: servers, channels, read, send, search, members, delete, status
5
5
  */
6
6
 
7
- import { connectElectronApp } from "../_electron/shared.js";
7
+ import {
8
+ connectElectronApp,
9
+ electronAppCommandMeta,
10
+ } from "../_electron/shared.js";
8
11
  import { cli, Strategy } from "../../registry.js";
9
12
 
13
+ const DISCORD_APP_COMMAND_META = electronAppCommandMeta(
14
+ "src/adapters/discord-app/discord-app.ts",
15
+ );
16
+
10
17
  // servers -- List Discord servers
11
18
  cli({
12
19
  site: "discord-app",
13
20
  name: "servers",
14
21
  description: "List Discord servers",
15
22
  strategy: Strategy.PUBLIC,
23
+ ...DISCORD_APP_COMMAND_META,
16
24
  func: async () => {
17
25
  const p = await connectElectronApp("discord-app");
18
26
  const servers = await p.evaluate(`
@@ -35,6 +43,7 @@ cli({
35
43
  name: "channels",
36
44
  description: "List channels in current server",
37
45
  strategy: Strategy.PUBLIC,
46
+ ...DISCORD_APP_COMMAND_META,
38
47
  func: async () => {
39
48
  const p = await connectElectronApp("discord-app");
40
49
  const channels = await p.evaluate(`
@@ -55,6 +64,7 @@ cli({
55
64
  name: "read",
56
65
  description: "Read recent messages",
57
66
  strategy: Strategy.PUBLIC,
67
+ ...DISCORD_APP_COMMAND_META,
58
68
  func: async () => {
59
69
  const p = await connectElectronApp("discord-app");
60
70
  const messages = await p.evaluate(`
@@ -79,6 +89,7 @@ cli({
79
89
  name: "send",
80
90
  description: "Send message in current channel",
81
91
  strategy: Strategy.PUBLIC,
92
+ ...DISCORD_APP_COMMAND_META,
82
93
  args: [
83
94
  {
84
95
  name: "message",
@@ -105,6 +116,7 @@ cli({
105
116
  name: "search",
106
117
  description: "Search Discord messages",
107
118
  strategy: Strategy.PUBLIC,
119
+ ...DISCORD_APP_COMMAND_META,
108
120
  args: [
109
121
  {
110
122
  name: "query",
@@ -138,6 +150,7 @@ cli({
138
150
  name: "members",
139
151
  description: "List server members",
140
152
  strategy: Strategy.PUBLIC,
153
+ ...DISCORD_APP_COMMAND_META,
141
154
  func: async () => {
142
155
  const p = await connectElectronApp("discord-app");
143
156
  const members = await p.evaluate(`
@@ -159,6 +172,7 @@ cli({
159
172
  name: "delete",
160
173
  description: "Delete a message by its ID in the active Discord channel",
161
174
  strategy: Strategy.PUBLIC,
175
+ ...DISCORD_APP_COMMAND_META,
162
176
  args: [
163
177
  {
164
178
  name: "message_id",
@@ -257,6 +271,7 @@ cli({
257
271
  name: "status",
258
272
  description: "Discord app status",
259
273
  strategy: Strategy.PUBLIC,
274
+ ...DISCORD_APP_COMMAND_META,
260
275
  func: async () => {
261
276
  const p = await connectElectronApp("discord-app");
262
277
  const title = await p.title();
@@ -15,11 +15,14 @@ pipeline:
15
15
  - |
16
16
  const app = Application.currentApplication();
17
17
  app.includeStandardAdditions = true;
18
- const result = app.doShellScript('ioreg -c AppleBacklightDisplay | grep brightness');
19
- JSON.stringify({ brightness: result });
18
+ const raw = app.doShellScript('ioreg -r -c AppleBacklightDisplay -k brightness 2>/dev/null || true');
19
+ const current = (raw.match(/"brightness"\\s*=\\s*(\\d+)/) || [])[1] || '';
20
+ const max = (raw.match(/"max-brightness"\\s*=\\s*(\\d+)/) || [])[1] || '';
21
+ const percent = current && max ? Math.round(Number(current) / Number(max) * 100) : null;
22
+ JSON.stringify([{ brightness: percent, raw: raw ? raw.split('\\n').slice(0, 8).join('\\n') : '', status: percent === null ? 'unavailable' : 'ok' }]);
20
23
  parse: json
21
24
 
22
- columns: [brightness]
25
+ columns: [brightness, status]
23
26
 
24
27
  # schema-v2 metadata — injected by `unicli migrate schema-v2`
25
28
  capabilities: ["subprocess.exec"]
@@ -28,20 +28,18 @@ pipeline:
28
28
  var calendars = cal.calendars();
29
29
  var result = [];
30
30
  for (var c = 0; c < calendars.length; c++) {
31
- var events = calendars[c].events();
31
+ var events = calendars[c].events.whose({startDate: {_greaterThan: now, _lessThan: end}})();
32
32
  for (var e = 0; e < events.length; e++) {
33
33
  var ev = events[e];
34
34
  var start = ev.startDate();
35
- if (start >= now && start <= end) {
36
- result.push({
37
- calendar: calendars[c].name(),
38
- title: ev.summary(),
39
- start: start.toISOString(),
40
- end: ev.endDate().toISOString(),
41
- location: ev.location() || '',
42
- notes: (ev.description() || '').substring(0, 200)
43
- });
44
- }
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
+ });
45
43
  }
46
44
  }
47
45
  result.sort(function(a, b) { return a.start < b.start ? -1 : 1; });
@@ -19,7 +19,7 @@ pipeline:
19
19
  const end = new Date(start.getTime() + 86400000);
20
20
  const out = [];
21
21
  for (const cal of app.calendars()) {
22
- const evts = cal.events.whose({startDate: {_greaterThan: start}, startDate: {_lessThan: end}})();
22
+ const evts = cal.events.whose({startDate: {_greaterThan: start, _lessThan: end}})();
23
23
  for (const e of evts) {
24
24
  out.push({ calendar: cal.name(), summary: e.summary(), start: e.startDate().toISOString(), end: e.endDate().toISOString(), location: e.location() || '' });
25
25
  }
@@ -14,12 +14,16 @@ pipeline:
14
14
  - "-e"
15
15
  - |
16
16
  const app = Application('Safari');
17
- const win = app.windows[0];
18
- const tab = win.currentTab();
19
- JSON.stringify([{ url: tab.url(), title: tab.name() }]);
17
+ const windows = app.windows();
18
+ if (windows.length === 0) {
19
+ JSON.stringify([{ state: 'no_window', url: '', title: '' }]);
20
+ } else {
21
+ const tab = windows[0].currentTab();
22
+ JSON.stringify([{ state: 'ok', url: tab.url(), title: tab.name() }]);
23
+ }
20
24
  parse: json
21
25
 
22
- columns: [url, title]
26
+ columns: [state, url, title]
23
27
 
24
28
  # schema-v2 metadata — injected by `unicli migrate schema-v2`
25
29
  capabilities: ["subprocess.exec"]
@@ -19,7 +19,7 @@ pipeline:
19
19
  headers:
20
20
  Referer: https://piaofang.maoyan.com/dashboard
21
21
 
22
- - select: movieList.data.list
22
+ - select: movieList.list
23
23
 
24
24
  - map:
25
25
  rank: ${{ index + 1 }}
@@ -7,15 +7,23 @@
7
7
  * Commands: search, read, write, new, status, sidebar, favorites, export, screenshot
8
8
  */
9
9
 
10
- import { connectElectronApp } from "../_electron/shared.js";
10
+ import {
11
+ connectElectronApp,
12
+ electronAppCommandMeta,
13
+ } from "../_electron/shared.js";
11
14
  import { cli, Strategy } from "../../registry.js";
12
15
 
16
+ const NOTION_COMMAND_META = electronAppCommandMeta(
17
+ "src/adapters/notion-app/notion-app.ts",
18
+ );
19
+
13
20
  // search -- Quick-find via Cmd+K
14
21
  cli({
15
22
  site: "notion",
16
23
  name: "search",
17
24
  description: "Search in Notion (Cmd+K)",
18
25
  strategy: Strategy.PUBLIC,
26
+ ...NOTION_COMMAND_META,
19
27
  args: [
20
28
  {
21
29
  name: "query",
@@ -50,6 +58,7 @@ cli({
50
58
  name: "read",
51
59
  description: "Read current Notion page content",
52
60
  strategy: Strategy.PUBLIC,
61
+ ...NOTION_COMMAND_META,
53
62
  func: async () => {
54
63
  const p = await connectElectronApp("notion");
55
64
  const content = await p.evaluate(`
@@ -66,6 +75,7 @@ cli({
66
75
  name: "write",
67
76
  description: "Append text to current Notion page",
68
77
  strategy: Strategy.PUBLIC,
78
+ ...NOTION_COMMAND_META,
69
79
  args: [
70
80
  {
71
81
  name: "text",
@@ -97,6 +107,7 @@ cli({
97
107
  name: "new",
98
108
  description: "Create new Notion page",
99
109
  strategy: Strategy.PUBLIC,
110
+ ...NOTION_COMMAND_META,
100
111
  args: [
101
112
  {
102
113
  name: "title",
@@ -121,6 +132,7 @@ cli({
121
132
  name: "status",
122
133
  description: "Notion workspace status",
123
134
  strategy: Strategy.PUBLIC,
135
+ ...NOTION_COMMAND_META,
124
136
  func: async () => {
125
137
  const p = await connectElectronApp("notion");
126
138
  const title = await p.title();
@@ -134,6 +146,7 @@ cli({
134
146
  name: "sidebar",
135
147
  description: "Read Notion sidebar navigation",
136
148
  strategy: Strategy.PUBLIC,
149
+ ...NOTION_COMMAND_META,
137
150
  func: async () => {
138
151
  const p = await connectElectronApp("notion");
139
152
  const items = await p.evaluate(`
@@ -156,6 +169,7 @@ cli({
156
169
  name: "favorites",
157
170
  description: "List Notion favorites",
158
171
  strategy: Strategy.PUBLIC,
172
+ ...NOTION_COMMAND_META,
159
173
  func: async () => {
160
174
  const p = await connectElectronApp("notion");
161
175
  const items = await p.evaluate(`
@@ -180,6 +194,7 @@ cli({
180
194
  name: "export",
181
195
  description: "Export current Notion page as markdown",
182
196
  strategy: Strategy.PUBLIC,
197
+ ...NOTION_COMMAND_META,
183
198
  func: async () => {
184
199
  const p = await connectElectronApp("notion");
185
200
  const content = await p.evaluate(`
@@ -195,6 +210,7 @@ cli({
195
210
  name: "screenshot",
196
211
  description: "Screenshot current Notion page",
197
212
  strategy: Strategy.PUBLIC,
213
+ ...NOTION_COMMAND_META,
198
214
  args: [
199
215
  {
200
216
  name: "path",