@zenalexa/unicli 0.225.0 → 0.225.2

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 (224) hide show
  1. package/AGENTS.md +5 -5
  2. package/README.md +3 -3
  3. package/README.zh-CN.md +3 -3
  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/browser/cdp-client.d.ts +5 -1
  39. package/dist/browser/cdp-client.d.ts.map +1 -1
  40. package/dist/browser/cdp-client.js +24 -16
  41. package/dist/browser/cdp-client.js.map +1 -1
  42. package/dist/browser/daemon.js +29 -7
  43. package/dist/browser/daemon.js.map +1 -1
  44. package/dist/browser/launcher.d.ts.map +1 -1
  45. package/dist/browser/launcher.js +22 -8
  46. package/dist/browser/launcher.js.map +1 -1
  47. package/dist/browser/local-profiles.d.ts +2 -0
  48. package/dist/browser/local-profiles.d.ts.map +1 -1
  49. package/dist/browser/local-profiles.js +42 -2
  50. package/dist/browser/local-profiles.js.map +1 -1
  51. package/dist/browser/page.d.ts +2 -2
  52. package/dist/browser/page.d.ts.map +1 -1
  53. package/dist/browser/page.js +2 -2
  54. package/dist/browser/page.js.map +1 -1
  55. package/dist/browser/protocol.d.ts +13 -1
  56. package/dist/browser/protocol.d.ts.map +1 -1
  57. package/dist/browser/protocol.js +5 -0
  58. package/dist/browser/protocol.js.map +1 -1
  59. package/dist/commands/browser/actions.d.ts.map +1 -1
  60. package/dist/commands/browser/actions.js +428 -5
  61. package/dist/commands/browser/actions.js.map +1 -1
  62. package/dist/commands/browser/index.d.ts.map +1 -1
  63. package/dist/commands/browser/index.js +26 -4
  64. package/dist/commands/browser/index.js.map +1 -1
  65. package/dist/commands/compute.js +12 -1
  66. package/dist/commands/compute.js.map +1 -1
  67. package/dist/commands/do.d.ts +15 -13
  68. package/dist/commands/do.d.ts.map +1 -1
  69. package/dist/commands/do.js +36 -21
  70. package/dist/commands/do.js.map +1 -1
  71. package/dist/commands/schema.d.ts.map +1 -1
  72. package/dist/commands/schema.js +22 -0
  73. package/dist/commands/schema.js.map +1 -1
  74. package/dist/commands/search.d.ts.map +1 -1
  75. package/dist/commands/search.js +14 -3
  76. package/dist/commands/search.js.map +1 -1
  77. package/dist/compute/contracts.d.ts +55 -0
  78. package/dist/compute/contracts.d.ts.map +1 -0
  79. package/dist/compute/contracts.js +487 -0
  80. package/dist/compute/contracts.js.map +1 -0
  81. package/dist/discovery/aliases.d.ts +8 -1
  82. package/dist/discovery/aliases.d.ts.map +1 -1
  83. package/dist/discovery/aliases.js +151 -20
  84. package/dist/discovery/aliases.js.map +1 -1
  85. package/dist/discovery/core-catalog.d.ts.map +1 -1
  86. package/dist/discovery/core-catalog.js +39 -67
  87. package/dist/discovery/core-catalog.js.map +1 -1
  88. package/dist/discovery/intents.d.ts +32 -4
  89. package/dist/discovery/intents.d.ts.map +1 -1
  90. package/dist/discovery/intents.js +192 -3
  91. package/dist/discovery/intents.js.map +1 -1
  92. package/dist/discovery/loader.d.ts.map +1 -1
  93. package/dist/discovery/loader.js +3 -0
  94. package/dist/discovery/loader.js.map +1 -1
  95. package/dist/discovery/macos-dynamic.d.ts +1 -0
  96. package/dist/discovery/macos-dynamic.d.ts.map +1 -1
  97. package/dist/discovery/macos-dynamic.js +20 -1
  98. package/dist/discovery/macos-dynamic.js.map +1 -1
  99. package/dist/discovery/search.d.ts.map +1 -1
  100. package/dist/discovery/search.js +21 -5
  101. package/dist/discovery/search.js.map +1 -1
  102. package/dist/engine/browser/evidence.d.ts +34 -1
  103. package/dist/engine/browser/evidence.d.ts.map +1 -1
  104. package/dist/engine/browser/evidence.js +141 -6
  105. package/dist/engine/browser/evidence.js.map +1 -1
  106. package/dist/engine/kernel/stages.d.ts.map +1 -1
  107. package/dist/engine/kernel/stages.js +14 -4
  108. package/dist/engine/kernel/stages.js.map +1 -1
  109. package/dist/engine/objective/catalog.d.ts +23 -0
  110. package/dist/engine/objective/catalog.d.ts.map +1 -0
  111. package/dist/engine/objective/catalog.js +42 -0
  112. package/dist/engine/objective/catalog.js.map +1 -0
  113. package/dist/engine/objective/delivery.d.ts +18 -0
  114. package/dist/engine/objective/delivery.d.ts.map +1 -0
  115. package/dist/engine/objective/delivery.js +64 -0
  116. package/dist/engine/objective/delivery.js.map +1 -0
  117. package/dist/engine/objective/index.d.ts +20 -0
  118. package/dist/engine/objective/index.d.ts.map +1 -0
  119. package/dist/engine/objective/index.js +20 -0
  120. package/dist/engine/objective/index.js.map +1 -0
  121. package/dist/engine/objective/media-playback.d.ts +17 -0
  122. package/dist/engine/objective/media-playback.d.ts.map +1 -0
  123. package/dist/engine/objective/media-playback.js +186 -0
  124. package/dist/engine/objective/media-playback.js.map +1 -0
  125. package/dist/engine/objective/output.d.ts +20 -0
  126. package/dist/engine/objective/output.d.ts.map +1 -0
  127. package/dist/engine/objective/output.js +88 -0
  128. package/dist/engine/objective/output.js.map +1 -0
  129. package/dist/engine/objective/planner.d.ts +17 -0
  130. package/dist/engine/objective/planner.d.ts.map +1 -0
  131. package/dist/engine/objective/planner.js +60 -0
  132. package/dist/engine/objective/planner.js.map +1 -0
  133. package/dist/engine/objective/types.d.ts +66 -0
  134. package/dist/engine/objective/types.d.ts.map +1 -0
  135. package/dist/engine/objective/types.js +16 -0
  136. package/dist/engine/objective/types.js.map +1 -0
  137. package/dist/engine/steps/browser-helpers.d.ts.map +1 -1
  138. package/dist/engine/steps/browser-helpers.js +34 -0
  139. package/dist/engine/steps/browser-helpers.js.map +1 -1
  140. package/dist/engine/steps/fetch-text.d.ts.map +1 -1
  141. package/dist/engine/steps/fetch-text.js +2 -2
  142. package/dist/engine/steps/fetch-text.js.map +1 -1
  143. package/dist/engine/steps/fetch.d.ts +1 -0
  144. package/dist/engine/steps/fetch.d.ts.map +1 -1
  145. package/dist/engine/steps/fetch.js +24 -4
  146. package/dist/engine/steps/fetch.js.map +1 -1
  147. package/dist/fast-path/handlers/discovery.d.ts +5 -5
  148. package/dist/fast-path/handlers/discovery.d.ts.map +1 -1
  149. package/dist/fast-path/handlers/discovery.js +61 -8
  150. package/dist/fast-path/handlers/discovery.js.map +1 -1
  151. package/dist/fast-path/render.d.ts +2 -0
  152. package/dist/fast-path/render.d.ts.map +1 -1
  153. package/dist/fast-path/render.js +9 -0
  154. package/dist/fast-path/render.js.map +1 -1
  155. package/dist/manifest-compact.txt +3 -2
  156. package/dist/manifest.json +215 -17
  157. package/dist/mcp/handler.d.ts +2 -16
  158. package/dist/mcp/handler.d.ts.map +1 -1
  159. package/dist/mcp/handler.js.map +1 -1
  160. package/dist/mcp/http-transport.d.ts +7 -1
  161. package/dist/mcp/http-transport.d.ts.map +1 -1
  162. package/dist/mcp/http-transport.js +20 -1
  163. package/dist/mcp/http-transport.js.map +1 -1
  164. package/dist/mcp/jsonrpc.d.ts +27 -0
  165. package/dist/mcp/jsonrpc.d.ts.map +1 -0
  166. package/dist/mcp/jsonrpc.js +12 -0
  167. package/dist/mcp/jsonrpc.js.map +1 -0
  168. package/dist/mcp/origin-guard.d.ts +26 -0
  169. package/dist/mcp/origin-guard.d.ts.map +1 -0
  170. package/dist/mcp/origin-guard.js +42 -0
  171. package/dist/mcp/origin-guard.js.map +1 -0
  172. package/dist/mcp/profiles/computer-use.d.ts.map +1 -1
  173. package/dist/mcp/profiles/computer-use.js +30 -270
  174. package/dist/mcp/profiles/computer-use.js.map +1 -1
  175. package/dist/mcp/streamable-http/session.d.ts +4 -22
  176. package/dist/mcp/streamable-http/session.d.ts.map +1 -1
  177. package/dist/mcp/streamable-http/session.js +4 -24
  178. package/dist/mcp/streamable-http/session.js.map +1 -1
  179. package/dist/mcp/tools.d.ts.map +1 -1
  180. package/dist/mcp/tools.js +74 -54
  181. package/dist/mcp/tools.js.map +1 -1
  182. package/dist/output/envelope.d.ts +2 -0
  183. package/dist/output/envelope.d.ts.map +1 -1
  184. package/dist/output/envelope.js.map +1 -1
  185. package/dist/output/error-map.d.ts +14 -0
  186. package/dist/output/error-map.d.ts.map +1 -1
  187. package/dist/output/error-map.js +20 -0
  188. package/dist/output/error-map.js.map +1 -1
  189. package/dist/transport/cascade.d.ts.map +1 -1
  190. package/dist/transport/cascade.js +77 -5
  191. package/dist/transport/cascade.js.map +1 -1
  192. package/dist/transport/refs.d.ts +33 -1
  193. package/dist/transport/refs.d.ts.map +1 -1
  194. package/dist/transport/refs.js +40 -1
  195. package/dist/transport/refs.js.map +1 -1
  196. package/package.json +3 -1
  197. package/server.json +2 -2
  198. package/skills/unicli/SKILL.md +1 -1
  199. package/skills/unicli-claude-code/SKILL.md +1 -1
  200. package/skills/unicli-hermes/SKILL.md +1 -1
  201. package/src/adapters/_electron/desktop-shared.ts +5 -1
  202. package/src/adapters/_electron/shared.ts +15 -0
  203. package/src/adapters/antigravity/extra.ts +10 -1
  204. package/src/adapters/chatwise/extra.ts +10 -1
  205. package/src/adapters/codex/codex.ts +6 -0
  206. package/src/adapters/codex/extra.ts +10 -1
  207. package/src/adapters/codex/projects.ts +9 -1
  208. package/src/adapters/cursor/cursor.ts +9 -0
  209. package/src/adapters/defuddle/read.yaml +30 -0
  210. package/src/adapters/discord-app/discord-app.ts +16 -1
  211. package/src/adapters/jina/read.yaml +30 -0
  212. package/src/adapters/macos/brightness.yaml +6 -3
  213. package/src/adapters/macos/calendar-list.yaml +9 -11
  214. package/src/adapters/macos/calendar-today.yaml +1 -1
  215. package/src/adapters/macos/safari-url.yaml +8 -4
  216. package/src/adapters/maoyan/hot.yaml +1 -1
  217. package/src/adapters/markdown-new/read.yaml +50 -0
  218. package/src/adapters/notion-app/notion-app.ts +17 -1
  219. package/src/adapters/ollama-cloud/fetch.yaml +39 -0
  220. package/src/adapters/ollama-cloud/search.yaml +43 -0
  221. package/src/adapters/spotify/api.ts +54 -8
  222. package/src/adapters/weibo/trending.yaml +2 -0
  223. package/src/adapters/xiaohongshu/browser-state.ts +59 -2
  224. package/src/adapters/xiaohongshu/feed.ts +103 -0
@@ -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(`
@@ -0,0 +1,30 @@
1
+ site: defuddle
2
+ name: read
3
+ description: Read a public URL through defuddle.md and return Markdown with frontmatter
4
+ type: web-api
5
+ domain: defuddle.md
6
+ strategy: public
7
+
8
+ args:
9
+ url:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Public URL to convert to Markdown
14
+ format: uri
15
+
16
+ pipeline:
17
+ - fetch_text:
18
+ url: "https://defuddle.md/${{ args.url }}"
19
+ headers:
20
+ Accept: "text/markdown"
21
+
22
+ columns: []
23
+
24
+ # schema-v2 metadata — injected by `unicli migrate schema-v2`
25
+ capabilities: ["http.fetch"]
26
+ minimum_capability: http.fetch
27
+ trust: public
28
+ confidentiality: public
29
+ quarantine: false
30
+ schema_version: v2
@@ -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();
@@ -0,0 +1,30 @@
1
+ site: jina
2
+ name: read
3
+ description: Read a public URL through Jina Reader and return Markdown
4
+ type: web-api
5
+ domain: r.jina.ai
6
+ strategy: public
7
+
8
+ args:
9
+ url:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Public URL to convert to Markdown
14
+ format: uri
15
+
16
+ pipeline:
17
+ - fetch_text:
18
+ url: "https://r.jina.ai/${{ args.url }}"
19
+ headers:
20
+ Accept: "text/plain"
21
+
22
+ columns: []
23
+
24
+ # schema-v2 metadata — injected by `unicli migrate schema-v2`
25
+ capabilities: ["http.fetch"]
26
+ minimum_capability: http.fetch
27
+ trust: public
28
+ confidentiality: public
29
+ quarantine: false
30
+ schema_version: v2
@@ -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 }}
@@ -0,0 +1,50 @@
1
+ site: markdown-new
2
+ name: read
3
+ description: Convert a public URL to Markdown through markdown.new
4
+ type: web-api
5
+ domain: markdown.new
6
+ strategy: public
7
+
8
+ args:
9
+ url:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Public URL to convert to Markdown
14
+ format: uri
15
+ method:
16
+ type: str
17
+ default: auto
18
+ choices: [auto, ai, browser]
19
+ description: Conversion method requested from markdown.new
20
+ retain_images:
21
+ type: bool
22
+ default: false
23
+ description: Keep image references in the returned Markdown
24
+
25
+ pipeline:
26
+ - fetch:
27
+ url: https://markdown.new/
28
+ method: POST
29
+ headers:
30
+ Accept: "application/json"
31
+ body:
32
+ url: "${{ args.url }}"
33
+ method: "${{ args.method }}"
34
+ retain_images: ${{ args.retain_images }}
35
+ - map:
36
+ title: "${{ item.title || '' }}"
37
+ url: "${{ item.url || args.url }}"
38
+ method: "${{ item.method || args.method }}"
39
+ tokens: "${{ item.tokens || '' }}"
40
+ content: "${{ item.content || '' }}"
41
+
42
+ columns: [title, url, method, tokens, content]
43
+
44
+ # schema-v2 metadata — injected by `unicli migrate schema-v2`
45
+ capabilities: ["http.fetch", "map"]
46
+ minimum_capability: http.fetch
47
+ trust: public
48
+ confidentiality: public
49
+ quarantine: false
50
+ schema_version: v2
@@ -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",
@@ -0,0 +1,39 @@
1
+ site: ollama-cloud
2
+ name: fetch
3
+ description: Fetch a public URL through Ollama Cloud web_fetch
4
+ type: web-api
5
+ domain: ollama.com
6
+ strategy: public # auth is via OLLAMA_API_KEY Authorization header, no cookies
7
+
8
+ args:
9
+ url:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Public URL to fetch
14
+ format: uri
15
+
16
+ pipeline:
17
+ - fetch:
18
+ url: https://ollama.com/api/web_fetch
19
+ method: POST
20
+ headers:
21
+ Accept: "application/json"
22
+ Authorization: "Bearer ${{ env.OLLAMA_API_KEY || '' }}"
23
+ body:
24
+ url: "${{ args.url }}"
25
+ - map:
26
+ title: "${{ item.title || '' }}"
27
+ url: "${{ args.url }}"
28
+ content: "${{ item.content || '' }}"
29
+ links: "${{ Array.isArray(item.links) ? item.links.join('\\n') : '' }}"
30
+
31
+ columns: [title, url, content, links]
32
+
33
+ # schema-v2 metadata — injected by `unicli migrate schema-v2`
34
+ capabilities: ["http.fetch", "map"]
35
+ minimum_capability: http.fetch
36
+ trust: public
37
+ confidentiality: public
38
+ quarantine: false
39
+ schema_version: v2