@zenalexa/unicli 0.210.0 → 0.211.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 (81) hide show
  1. package/AGENTS.md +21 -7
  2. package/README.md +680 -83
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +5 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/agents.d.ts +14 -3
  7. package/dist/commands/agents.d.ts.map +1 -1
  8. package/dist/commands/agents.js +369 -140
  9. package/dist/commands/agents.js.map +1 -1
  10. package/dist/commands/mcp.d.ts +3 -4
  11. package/dist/commands/mcp.d.ts.map +1 -1
  12. package/dist/commands/mcp.js +47 -62
  13. package/dist/commands/mcp.js.map +1 -1
  14. package/dist/commands/schema.d.ts +12 -0
  15. package/dist/commands/schema.d.ts.map +1 -0
  16. package/dist/commands/schema.js +72 -0
  17. package/dist/commands/schema.js.map +1 -0
  18. package/dist/commands/search.d.ts +12 -0
  19. package/dist/commands/search.d.ts.map +1 -0
  20. package/dist/commands/search.js +47 -0
  21. package/dist/commands/search.js.map +1 -0
  22. package/dist/discovery/aliases.d.ts +31 -0
  23. package/dist/discovery/aliases.d.ts.map +1 -0
  24. package/dist/discovery/aliases.js +477 -0
  25. package/dist/discovery/aliases.js.map +1 -0
  26. package/dist/discovery/loader.d.ts.map +1 -1
  27. package/dist/discovery/loader.js +25 -0
  28. package/dist/discovery/loader.js.map +1 -1
  29. package/dist/discovery/search.d.ts +73 -0
  30. package/dist/discovery/search.d.ts.map +1 -0
  31. package/dist/discovery/search.js +355 -0
  32. package/dist/discovery/search.js.map +1 -0
  33. package/dist/manifest-compact.txt +15 -0
  34. package/dist/manifest-search.json +1 -0
  35. package/dist/manifest.json +433 -244
  36. package/dist/mcp/oauth.d.ts +33 -0
  37. package/dist/mcp/oauth.d.ts.map +1 -0
  38. package/dist/mcp/oauth.js +220 -0
  39. package/dist/mcp/oauth.js.map +1 -0
  40. package/dist/mcp/schema.d.ts +65 -0
  41. package/dist/mcp/schema.d.ts.map +1 -0
  42. package/dist/mcp/schema.js +136 -0
  43. package/dist/mcp/schema.js.map +1 -0
  44. package/dist/mcp/server.d.ts +23 -10
  45. package/dist/mcp/server.d.ts.map +1 -1
  46. package/dist/mcp/server.js +350 -182
  47. package/dist/mcp/server.js.map +1 -1
  48. package/dist/mcp/sse-transport.d.ts +34 -0
  49. package/dist/mcp/sse-transport.d.ts.map +1 -0
  50. package/dist/mcp/sse-transport.js +182 -0
  51. package/dist/mcp/sse-transport.js.map +1 -0
  52. package/dist/mcp/streamable-http.d.ts +64 -0
  53. package/dist/mcp/streamable-http.d.ts.map +1 -0
  54. package/dist/mcp/streamable-http.js +312 -0
  55. package/dist/mcp/streamable-http.js.map +1 -0
  56. package/dist/permissions/sensitive-paths.js +2 -2
  57. package/dist/permissions/sensitive-paths.js.map +1 -1
  58. package/package.json +7 -7
  59. package/src/adapters/1688/_site.json +9 -0
  60. package/src/adapters/barchart/_site.json +10 -0
  61. package/src/adapters/jd/_site.json +9 -0
  62. package/src/adapters/linkedin/_site.json +10 -0
  63. package/src/adapters/macos/finder-copy.yaml +40 -0
  64. package/src/adapters/macos/finder-move.yaml +40 -0
  65. package/src/adapters/macos/finder-new-folder.yaml +36 -0
  66. package/src/adapters/macos/safari-history.yaml +23 -0
  67. package/src/adapters/macos/safari-url.yaml +22 -0
  68. package/src/adapters/macos/screen-recording.yaml +32 -0
  69. package/src/adapters/macos/wallpaper.yaml +33 -0
  70. package/src/adapters/reuters/_site.json +9 -0
  71. package/src/adapters/sinablog/_site.json +9 -0
  72. package/src/adapters/smzdm/_site.json +9 -0
  73. package/src/adapters/weixin/_site.json +9 -0
  74. package/src/adapters/1688/manifest.yaml +0 -7
  75. package/src/adapters/barchart/manifest.yaml +0 -8
  76. package/src/adapters/jd/manifest.yaml +0 -7
  77. package/src/adapters/linkedin/manifest.yaml +0 -8
  78. package/src/adapters/reuters/manifest.yaml +0 -7
  79. package/src/adapters/sinablog/manifest.yaml +0 -7
  80. package/src/adapters/smzdm/manifest.yaml +0 -7
  81. package/src/adapters/weixin/manifest.yaml +0 -7
@@ -0,0 +1,312 @@
1
+ /**
2
+ * Streamable HTTP transport for the MCP server (spec 2025-03-26).
3
+ *
4
+ * Single endpoint: POST /mcp
5
+ * - JSON-RPC request in body
6
+ * - Response as application/json or text/event-stream (per Accept header)
7
+ * - MCP-Session-Id header for session management
8
+ * - MCP-Protocol-Version header enforced post-initialization
9
+ *
10
+ * DELETE /mcp — terminate session (requires MCP-Session-Id)
11
+ * GET /health — server status + active session count
12
+ *
13
+ * Zero external dependencies — Node.js http + crypto only.
14
+ */
15
+ import { randomUUID } from "node:crypto";
16
+ import { createServer, } from "node:http";
17
+ import { VERSION } from "../constants.js";
18
+ import { handleOAuthRoute, createOAuthMiddleware } from "./oauth.js";
19
+ // ── Constants ──────────────────────────────────────────────────────────────
20
+ const MAX_BODY = 1_048_576; // 1 MB
21
+ const SESSION_TTL_MS = 3_600_000; // 1 hour
22
+ const PRUNE_INTERVAL_MS = 300_000; // 5 minutes
23
+ const HEARTBEAT_MS = 30_000;
24
+ const MCP_PROTOCOL_VERSION = "2025-03-26";
25
+ const ALLOWED_ORIGINS = new Set(["http://localhost", "http://127.0.0.1"]);
26
+ // Methods that may produce long-running responses — served as SSE when
27
+ // the client accepts text/event-stream.
28
+ const STREAMING_METHODS = new Set(["tools/call"]);
29
+ const sessions = new Map();
30
+ // ── Helpers ────────────────────────────────────────────────────────────────
31
+ function jsonResponse(res, status, body, extraHeaders) {
32
+ res.writeHead(status, {
33
+ "Content-Type": "application/json",
34
+ "Cache-Control": "no-store",
35
+ ...extraHeaders,
36
+ });
37
+ res.end(JSON.stringify(body));
38
+ }
39
+ function readBody(req) {
40
+ return new Promise((resolve, reject) => {
41
+ const chunks = [];
42
+ let size = 0;
43
+ req.on("data", (chunk) => {
44
+ size += chunk.length;
45
+ if (size > MAX_BODY) {
46
+ req.destroy();
47
+ reject(new Error("Request too large"));
48
+ return;
49
+ }
50
+ chunks.push(chunk);
51
+ });
52
+ req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8")));
53
+ req.on("error", reject);
54
+ });
55
+ }
56
+ function pruneStaleSessions() {
57
+ const cutoff = Date.now() - SESSION_TTL_MS;
58
+ for (const [id, session] of sessions) {
59
+ if (session.lastSeen < cutoff)
60
+ sessions.delete(id);
61
+ }
62
+ }
63
+ /**
64
+ * Validate Origin header for DNS rebinding protection.
65
+ * Allow requests with no Origin (non-browser clients) or from localhost.
66
+ */
67
+ function isOriginAllowed(req) {
68
+ const origin = req.headers.origin;
69
+ if (!origin)
70
+ return true; // Non-browser clients omit Origin
71
+ // Accept any localhost origin regardless of port
72
+ try {
73
+ const url = new URL(origin);
74
+ if (url.hostname === "localhost" || url.hostname === "127.0.0.1") {
75
+ return true;
76
+ }
77
+ }
78
+ catch {
79
+ // Malformed origin — reject
80
+ }
81
+ return ALLOWED_ORIGINS.has(origin);
82
+ }
83
+ function clientAcceptsSSE(req) {
84
+ const accept = req.headers.accept ?? "";
85
+ return accept.includes("text/event-stream");
86
+ }
87
+ // ── POST /mcp Handler ──────────────────────────────────────────────────────
88
+ async function handlePost(req, res, handler) {
89
+ // Origin validation
90
+ if (!isOriginAllowed(req)) {
91
+ jsonResponse(res, 403, {
92
+ jsonrpc: "2.0",
93
+ id: null,
94
+ error: { code: -32600, message: "Forbidden: invalid Origin" },
95
+ });
96
+ return;
97
+ }
98
+ // Read and parse body
99
+ let body;
100
+ try {
101
+ body = await readBody(req);
102
+ }
103
+ catch {
104
+ jsonResponse(res, 413, {
105
+ jsonrpc: "2.0",
106
+ id: null,
107
+ error: { code: -32600, message: "Request too large" },
108
+ });
109
+ return;
110
+ }
111
+ let parsed;
112
+ try {
113
+ parsed = JSON.parse(body);
114
+ }
115
+ catch {
116
+ jsonResponse(res, 400, {
117
+ jsonrpc: "2.0",
118
+ id: null,
119
+ error: { code: -32700, message: "Parse error" },
120
+ });
121
+ return;
122
+ }
123
+ const sessionId = req.headers["mcp-session-id"];
124
+ const isInitialize = parsed.method === "initialize";
125
+ // Session validation: post-init requests require a valid session
126
+ if (!isInitialize) {
127
+ if (!sessionId || !sessions.has(sessionId)) {
128
+ jsonResponse(res, 400, {
129
+ jsonrpc: "2.0",
130
+ id: parsed.id ?? null,
131
+ error: { code: -32600, message: "Invalid or missing MCP-Session-Id" },
132
+ });
133
+ return;
134
+ }
135
+ sessions.get(sessionId).lastSeen = Date.now();
136
+ }
137
+ // Notification (no id) — respond 204 No Content
138
+ if (parsed.id === undefined || parsed.id === null) {
139
+ try {
140
+ await handler(parsed);
141
+ }
142
+ catch {
143
+ // Notifications have no response — swallow errors
144
+ }
145
+ res.writeHead(204);
146
+ res.end();
147
+ return;
148
+ }
149
+ // Execute the handler
150
+ let response;
151
+ try {
152
+ response = await handler(parsed);
153
+ // Handler returns null for notifications — should not reach here due to
154
+ // the check above, but guard anyway.
155
+ if (!response) {
156
+ res.writeHead(204);
157
+ res.end();
158
+ return;
159
+ }
160
+ }
161
+ catch (err) {
162
+ const message = err instanceof Error ? err.message : String(err);
163
+ jsonResponse(res, 500, {
164
+ jsonrpc: "2.0",
165
+ id: parsed.id ?? null,
166
+ error: { code: -32603, message: `Internal error: ${message}` },
167
+ });
168
+ return;
169
+ }
170
+ // For initialize: create session and return MCP-Session-Id
171
+ if (isInitialize) {
172
+ const newSessionId = randomUUID();
173
+ sessions.set(newSessionId, {
174
+ created: Date.now(),
175
+ lastSeen: Date.now(),
176
+ protocolVersion: MCP_PROTOCOL_VERSION,
177
+ });
178
+ jsonResponse(res, 200, response, {
179
+ "MCP-Session-Id": newSessionId,
180
+ "MCP-Protocol-Version": MCP_PROTOCOL_VERSION,
181
+ });
182
+ return;
183
+ }
184
+ // For streaming-eligible methods: respond with SSE if client accepts it
185
+ if (STREAMING_METHODS.has(parsed.method) && clientAcceptsSSE(req)) {
186
+ res.writeHead(200, {
187
+ "Content-Type": "text/event-stream",
188
+ "Cache-Control": "no-cache",
189
+ Connection: "keep-alive",
190
+ "MCP-Session-Id": sessionId,
191
+ });
192
+ // Send the response as an SSE event
193
+ const eventId = randomUUID();
194
+ res.write(`id: ${eventId}\nevent: message\ndata: ${JSON.stringify(response)}\n\n`);
195
+ // Close the stream after delivering the response
196
+ res.end();
197
+ return;
198
+ }
199
+ // Default: respond with JSON
200
+ const headers = {};
201
+ if (sessionId)
202
+ headers["MCP-Session-Id"] = sessionId;
203
+ jsonResponse(res, 200, response, headers);
204
+ }
205
+ // ── DELETE /mcp Handler ────────────────────────────────────────────────────
206
+ function handleDelete(req, res) {
207
+ const sessionId = req.headers["mcp-session-id"];
208
+ if (!sessionId || !sessions.has(sessionId)) {
209
+ jsonResponse(res, 400, {
210
+ jsonrpc: "2.0",
211
+ id: null,
212
+ error: { code: -32600, message: "Invalid or missing MCP-Session-Id" },
213
+ });
214
+ return;
215
+ }
216
+ sessions.delete(sessionId);
217
+ res.writeHead(204);
218
+ res.end();
219
+ }
220
+ // ── Public API ─────────────────────────────────────────────────────────────
221
+ /**
222
+ * Start the MCP Streamable HTTP transport server (spec 2025-03-26).
223
+ *
224
+ * Single endpoint (POST /mcp) handles all JSON-RPC communication.
225
+ * DELETE /mcp terminates sessions. GET /health returns server info.
226
+ */
227
+ export async function startStreamableHttp(port, handler, options) {
228
+ const oauthMiddleware = options?.auth ? createOAuthMiddleware() : null;
229
+ // Periodic session pruning
230
+ const pruneTimer = setInterval(pruneStaleSessions, PRUNE_INTERVAL_MS);
231
+ pruneTimer.unref(); // Do not keep process alive for pruning
232
+ const server = createServer((req, res) => {
233
+ const method = req.method ?? "";
234
+ const pathname = (req.url ?? "/").split("?")[0];
235
+ // CORS preflight
236
+ if (method === "OPTIONS") {
237
+ res.writeHead(204, {
238
+ "Access-Control-Allow-Origin": req.headers.origin ?? "*",
239
+ "Access-Control-Allow-Methods": "POST, DELETE, OPTIONS",
240
+ "Access-Control-Allow-Headers": "Content-Type, MCP-Session-Id, MCP-Protocol-Version, Authorization, Accept",
241
+ "Access-Control-Max-Age": "86400",
242
+ });
243
+ res.end();
244
+ return;
245
+ }
246
+ // OAuth routes — always public when auth is enabled
247
+ if (options?.auth && handleOAuthRoute(req, res))
248
+ return;
249
+ // Health check
250
+ if (method === "GET" && (pathname === "/health" || pathname === "/")) {
251
+ jsonResponse(res, 200, {
252
+ status: "ok",
253
+ transport: "streamable-http",
254
+ version: VERSION,
255
+ sessions: sessions.size,
256
+ protocolVersion: MCP_PROTOCOL_VERSION,
257
+ });
258
+ return;
259
+ }
260
+ // Main MCP endpoint
261
+ if (pathname === "/mcp") {
262
+ // OAuth middleware — block unauthenticated requests
263
+ if (oauthMiddleware?.(req, res))
264
+ return;
265
+ if (method === "POST") {
266
+ handlePost(req, res, handler).catch(() => {
267
+ if (!res.writableEnded) {
268
+ jsonResponse(res, 500, {
269
+ jsonrpc: "2.0",
270
+ id: null,
271
+ error: { code: -32603, message: "Unexpected server error" },
272
+ });
273
+ }
274
+ });
275
+ return;
276
+ }
277
+ if (method === "DELETE") {
278
+ handleDelete(req, res);
279
+ return;
280
+ }
281
+ }
282
+ // Not found
283
+ res.writeHead(404, { "Content-Type": "application/json" });
284
+ res.end(JSON.stringify({ error: "Not found" }));
285
+ });
286
+ server.on("close", () => {
287
+ clearInterval(pruneTimer);
288
+ sessions.clear();
289
+ });
290
+ await new Promise((resolve, reject) => {
291
+ server.once("error", reject);
292
+ server.listen(port, "127.0.0.1", () => {
293
+ server.off("error", reject);
294
+ resolve();
295
+ });
296
+ });
297
+ process.stderr.write(`unicli MCP server v${VERSION} — Streamable HTTP transport on http://127.0.0.1:${port}\n` +
298
+ ` MCP endpoint: POST/DELETE http://127.0.0.1:${port}/mcp\n` +
299
+ ` Health check: GET http://127.0.0.1:${port}/health\n` +
300
+ ` Protocol: ${MCP_PROTOCOL_VERSION}\n`);
301
+ }
302
+ // Exported for testing
303
+ export const _test = {
304
+ sessions,
305
+ pruneStaleSessions,
306
+ isOriginAllowed,
307
+ ALLOWED_ORIGINS,
308
+ SESSION_TTL_MS,
309
+ HEARTBEAT_MS,
310
+ MCP_PROTOCOL_VERSION,
311
+ };
312
+ //# sourceMappingURL=streamable-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streamable-http.js","sourceRoot":"","sources":["../../src/mcp/streamable-http.ts"],"names":[],"mappings":"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"}
@@ -61,8 +61,8 @@ export const SENSITIVE_PATH_PATTERNS = [
61
61
  // GCP credentials
62
62
  /\/\.config\/gcloud\/(application_default_credentials|legacy_credentials)/,
63
63
  // Azure CLI session + profile
64
- /\/\.azure\/accesstokens\.json$/,
65
- /\/\.azure\/azureprofile\.json$/,
64
+ /\/\.azure\/accesstokens\.json$/i,
65
+ /\/\.azure\/azureprofile\.json$/i,
66
66
  // GitHub CLI host config (contains OAuth token)
67
67
  /\/\.config\/gh\/hosts\.yml$/,
68
68
  // 1Password CLI session state
@@ -1 +1 @@
1
- {"version":3,"file":"sensitive-paths.js","sourceRoot":"","sources":["../../src/permissions/sensitive-paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sensitive-paths.js","sourceRoot":"","sources":["../../src/permissions/sensitive-paths.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zenalexa/unicli",
3
- "version": "0.210.0",
3
+ "version": "0.211.2",
4
4
  "description": "The universal interface between AI agents and the world's software",
5
5
  "type": "module",
6
6
  "main": "dist/main.js",
@@ -69,23 +69,23 @@
69
69
  "dependencies": {
70
70
  "chalk": "^5.4.1",
71
71
  "cli-table3": "^0.6.5",
72
- "commander": "^13.1.0",
72
+ "commander": "^14.0.3",
73
73
  "js-yaml": "^4.1.0",
74
74
  "turndown": "^7.2.4",
75
- "undici": "^7.5.0",
75
+ "undici": "^8.0.2",
76
76
  "ws": "^8.18.0",
77
- "zod": "^3.24.0"
77
+ "zod": "^4.3.6"
78
78
  },
79
79
  "devDependencies": {
80
80
  "@types/js-yaml": "^4.0.9",
81
- "@types/node": "^22.13.0",
81
+ "@types/node": "^25.6.0",
82
82
  "@types/turndown": "^5.0.6",
83
83
  "@types/ws": "^8.5.14",
84
84
  "oxlint": "^1.0.0",
85
85
  "prettier": "^3.5.0",
86
86
  "tsx": "^4.19.0",
87
- "typescript": "^5.7.0",
87
+ "typescript": "^6.0.2",
88
88
  "vitepress": "^1.6.0",
89
- "vitest": "^3.1.0"
89
+ "vitest": "^3.2.4"
90
90
  }
91
91
  }
@@ -0,0 +1,9 @@
1
+ {
2
+ "site": "1688",
3
+ "displayName": "1688.com",
4
+ "type": "web-api",
5
+ "domain": "1688.com",
6
+ "description": "1688.com — Alibaba wholesale B2B marketplace",
7
+ "strategy": "cookie",
8
+ "category": "shopping"
9
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "site": "barchart",
3
+ "displayName": "Barchart",
4
+ "type": "web-api",
5
+ "domain": "barchart.com",
6
+ "description": "Barchart — financial data, options, and market analytics",
7
+ "strategy": "cookie",
8
+ "category": "finance",
9
+ "auth_cookies": ["bcFreeUserPage498", "laravel_session", "XSRF-TOKEN"]
10
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "site": "jd",
3
+ "displayName": "JD.com",
4
+ "type": "web-api",
5
+ "domain": "jd.com",
6
+ "description": "JD.com — Chinese e-commerce platform",
7
+ "strategy": "public",
8
+ "category": "shopping"
9
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "site": "linkedin",
3
+ "displayName": "LinkedIn",
4
+ "type": "web-api",
5
+ "domain": "linkedin.com",
6
+ "description": "LinkedIn — professional networking and job search",
7
+ "strategy": "header",
8
+ "category": "social",
9
+ "auth_cookies": ["li_at", "JSESSIONID"]
10
+ }
@@ -0,0 +1,40 @@
1
+ site: macos
2
+ name: finder-copy
3
+ description: Copy a file or folder to a destination path
4
+ type: desktop
5
+ binary: osascript
6
+ detect: "test $(uname) = Darwin"
7
+
8
+ args:
9
+ source:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Source file or folder path
14
+ destination:
15
+ type: str
16
+ required: true
17
+ positional: true
18
+ description: Destination path
19
+
20
+ pipeline:
21
+ - exec:
22
+ command: osascript
23
+ args:
24
+ - "-l"
25
+ - "JavaScript"
26
+ - "-e"
27
+ - |
28
+ const fm = $.NSFileManager.defaultManager;
29
+ const src = ${{ args.source | json }};
30
+ const dst = ${{ args.destination | json }};
31
+ const err = Ref();
32
+ const ok = fm.copyItemAtPathToPathError(src, dst, err);
33
+ if (!ok) {
34
+ const msg = err[0] ? ObjC.unwrap(err[0].localizedDescription) : 'unknown error';
35
+ throw new Error(msg);
36
+ }
37
+ JSON.stringify([{ copied: src, to: dst, status: 'ok' }]);
38
+ parse: json
39
+
40
+ columns: [copied, to, status]
@@ -0,0 +1,40 @@
1
+ site: macos
2
+ name: finder-move
3
+ description: Move or rename a file or folder
4
+ type: desktop
5
+ binary: osascript
6
+ detect: "test $(uname) = Darwin"
7
+
8
+ args:
9
+ source:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Source file or folder path
14
+ destination:
15
+ type: str
16
+ required: true
17
+ positional: true
18
+ description: Destination path
19
+
20
+ pipeline:
21
+ - exec:
22
+ command: osascript
23
+ args:
24
+ - "-l"
25
+ - "JavaScript"
26
+ - "-e"
27
+ - |
28
+ const fm = $.NSFileManager.defaultManager;
29
+ const src = ${{ args.source | json }};
30
+ const dst = ${{ args.destination | json }};
31
+ const err = Ref();
32
+ const ok = fm.moveItemAtPathToPathError(src, dst, err);
33
+ if (!ok) {
34
+ const msg = err[0] ? ObjC.unwrap(err[0].localizedDescription) : 'unknown error';
35
+ throw new Error(msg);
36
+ }
37
+ JSON.stringify([{ moved: src, to: dst, status: 'ok' }]);
38
+ parse: json
39
+
40
+ columns: [moved, to, status]
@@ -0,0 +1,36 @@
1
+ site: macos
2
+ name: finder-new-folder
3
+ description: Create a new directory (with intermediate directories)
4
+ type: desktop
5
+ binary: osascript
6
+ detect: "test $(uname) = Darwin"
7
+
8
+ args:
9
+ path:
10
+ type: str
11
+ required: true
12
+ positional: true
13
+ description: Directory path to create
14
+
15
+ pipeline:
16
+ - exec:
17
+ command: osascript
18
+ args:
19
+ - "-l"
20
+ - "JavaScript"
21
+ - "-e"
22
+ - |
23
+ const fm = $.NSFileManager.defaultManager;
24
+ const path = ${{ args.path | json }};
25
+ const err = Ref();
26
+ const ok = fm.createDirectoryAtPathWithIntermediateDirectoriesAttributesError(
27
+ path, true, $(), err
28
+ );
29
+ if (!ok) {
30
+ const msg = err[0] ? ObjC.unwrap(err[0].localizedDescription) : 'unknown error';
31
+ throw new Error(msg);
32
+ }
33
+ JSON.stringify([{ created: path, status: 'ok' }]);
34
+ parse: json
35
+
36
+ columns: [created, status]
@@ -0,0 +1,23 @@
1
+ site: macos
2
+ name: safari-history
3
+ description: Get recent Safari browsing history via SQLite
4
+ type: desktop
5
+ binary: sqlite3
6
+ detect: "test $(uname) = Darwin"
7
+
8
+ args:
9
+ limit:
10
+ type: int
11
+ default: 20
12
+ description: Number of recent history entries to return
13
+
14
+ pipeline:
15
+ - exec:
16
+ command: sqlite3
17
+ args:
18
+ - "-json"
19
+ - "$HOME/Library/Safari/History.db"
20
+ - "SELECT hi.url, hv.title, datetime(hv.visit_time + 978307200, 'unixepoch', 'localtime') AS visited_at FROM history_visits hv JOIN history_items hi ON hv.history_item = hi.id ORDER BY hv.visit_time DESC LIMIT ${{ args.limit | int | default(20) }};"
21
+ parse: json
22
+
23
+ columns: [title, url, visited_at]
@@ -0,0 +1,22 @@
1
+ site: macos
2
+ name: safari-url
3
+ description: Get the URL and title of the active Safari tab
4
+ type: desktop
5
+ binary: osascript
6
+ detect: "test $(uname) = Darwin"
7
+
8
+ pipeline:
9
+ - exec:
10
+ command: osascript
11
+ args:
12
+ - "-l"
13
+ - "JavaScript"
14
+ - "-e"
15
+ - |
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() }]);
20
+ parse: json
21
+
22
+ columns: [url, title]
@@ -0,0 +1,32 @@
1
+ site: macos
2
+ name: screen-recording
3
+ description: Record the screen to a video file using screencapture
4
+ type: desktop
5
+ binary: screencapture
6
+ detect: "test $(uname) = Darwin"
7
+
8
+ args:
9
+ file:
10
+ type: str
11
+ default: "/tmp/recording.mov"
12
+ description: Output file path for the recording (must end in .mov or .mp4)
13
+ duration:
14
+ type: int
15
+ default: 10
16
+ description: Recording duration in seconds
17
+
18
+ pipeline:
19
+ - exec:
20
+ command: screencapture
21
+ args:
22
+ - "-x"
23
+ - "-v"
24
+ - "-V"
25
+ - "${{ args.duration | default(10) }}"
26
+ - "${{ args.file | default('/tmp/recording.mov') }}"
27
+ parse: text
28
+ timeout: "${{ (args.duration + 5) * 1000 }}"
29
+
30
+ - evaluate: "JSON.stringify([{ file: ${{ args.file | json }}, duration: ${{ args.duration }}, status: 'recorded' }])"
31
+
32
+ columns: [file, duration, status]
@@ -0,0 +1,33 @@
1
+ site: macos
2
+ name: wallpaper
3
+ description: Get or set the desktop wallpaper
4
+ type: desktop
5
+ binary: osascript
6
+ detect: "test $(uname) = Darwin"
7
+
8
+ args:
9
+ path:
10
+ type: str
11
+ positional: true
12
+ description: Path to image file (omit to get the current wallpaper)
13
+
14
+ pipeline:
15
+ - exec:
16
+ command: osascript
17
+ args:
18
+ - "-l"
19
+ - "JavaScript"
20
+ - "-e"
21
+ - |
22
+ const se = Application('System Events');
23
+ const desktop = se.desktops[0];
24
+ const newPath = ${{ args.path | default("") | json }};
25
+ if (newPath) {
26
+ desktop.picture = newPath;
27
+ JSON.stringify([{ wallpaper: newPath, action: 'set' }]);
28
+ } else {
29
+ JSON.stringify([{ wallpaper: desktop.picture(), action: 'get' }]);
30
+ }
31
+ parse: json
32
+
33
+ columns: [wallpaper, action]