@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.
- package/AGENTS.md +5 -5
- package/README.md +92 -92
- package/README.zh-CN.md +69 -69
- package/dist/adapters/_electron/desktop-shared.d.ts.map +1 -1
- package/dist/adapters/_electron/desktop-shared.js +2 -1
- package/dist/adapters/_electron/desktop-shared.js.map +1 -1
- package/dist/adapters/_electron/shared.d.ts +6 -0
- package/dist/adapters/_electron/shared.d.ts.map +1 -1
- package/dist/adapters/_electron/shared.js +9 -0
- package/dist/adapters/_electron/shared.js.map +1 -1
- package/dist/adapters/antigravity/extra.js +4 -1
- package/dist/adapters/antigravity/extra.js.map +1 -1
- package/dist/adapters/chatwise/extra.js +4 -1
- package/dist/adapters/chatwise/extra.js.map +1 -1
- package/dist/adapters/codex/codex.js +3 -1
- package/dist/adapters/codex/codex.js.map +1 -1
- package/dist/adapters/codex/extra.js +4 -1
- package/dist/adapters/codex/extra.js.map +1 -1
- package/dist/adapters/codex/projects.d.ts.map +1 -1
- package/dist/adapters/codex/projects.js +3 -1
- package/dist/adapters/codex/projects.js.map +1 -1
- package/dist/adapters/cursor/cursor.js +6 -1
- package/dist/adapters/cursor/cursor.js.map +1 -1
- package/dist/adapters/discord-app/discord-app.js +10 -1
- package/dist/adapters/discord-app/discord-app.js.map +1 -1
- package/dist/adapters/notion-app/notion-app.js +11 -1
- package/dist/adapters/notion-app/notion-app.js.map +1 -1
- package/dist/adapters/spotify/api.js +36 -6
- package/dist/adapters/spotify/api.js.map +1 -1
- package/dist/adapters/xiaohongshu/browser-state.d.ts +2 -1
- package/dist/adapters/xiaohongshu/browser-state.d.ts.map +1 -1
- package/dist/adapters/xiaohongshu/browser-state.js +56 -2
- package/dist/adapters/xiaohongshu/browser-state.js.map +1 -1
- package/dist/adapters/xiaohongshu/feed.d.ts +24 -0
- package/dist/adapters/xiaohongshu/feed.d.ts.map +1 -0
- package/dist/adapters/xiaohongshu/feed.js +82 -0
- package/dist/adapters/xiaohongshu/feed.js.map +1 -0
- package/dist/adapters/xueqiu/extra.js +2 -2
- package/dist/adapters/xueqiu/extra.js.map +1 -1
- package/dist/browser/cdp-client.d.ts +15 -1
- package/dist/browser/cdp-client.d.ts.map +1 -1
- package/dist/browser/cdp-client.js +45 -16
- package/dist/browser/cdp-client.js.map +1 -1
- package/dist/browser/daemon.js +29 -7
- package/dist/browser/daemon.js.map +1 -1
- package/dist/browser/launcher.d.ts.map +1 -1
- package/dist/browser/launcher.js +22 -8
- package/dist/browser/launcher.js.map +1 -1
- package/dist/browser/local-profiles.d.ts +2 -0
- package/dist/browser/local-profiles.d.ts.map +1 -1
- package/dist/browser/local-profiles.js +42 -2
- package/dist/browser/local-profiles.js.map +1 -1
- package/dist/browser/page.d.ts +2 -2
- package/dist/browser/page.d.ts.map +1 -1
- package/dist/browser/page.js +2 -2
- package/dist/browser/page.js.map +1 -1
- package/dist/browser/protocol.d.ts +7 -0
- package/dist/browser/protocol.d.ts.map +1 -1
- package/dist/browser/protocol.js +5 -0
- package/dist/browser/protocol.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/architecture.d.ts +3 -1
- package/dist/commands/architecture.d.ts.map +1 -1
- package/dist/commands/architecture.js +13 -5
- package/dist/commands/architecture.js.map +1 -1
- package/dist/commands/browser/index.d.ts.map +1 -1
- package/dist/commands/browser/index.js +26 -4
- package/dist/commands/browser/index.js.map +1 -1
- package/dist/commands/delivery.d.ts.map +1 -1
- package/dist/commands/delivery.js.map +1 -1
- package/dist/commands/describe.d.ts.map +1 -1
- package/dist/commands/describe.js +104 -9
- package/dist/commands/describe.js.map +1 -1
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +3 -13
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/do.d.ts +16 -13
- package/dist/commands/do.d.ts.map +1 -1
- package/dist/commands/do.js +72 -18
- package/dist/commands/do.js.map +1 -1
- package/dist/commands/social.d.ts.map +1 -1
- package/dist/commands/social.js +3 -13
- package/dist/commands/social.js.map +1 -1
- package/dist/core/architecture-tree.d.ts +26 -6
- package/dist/core/architecture-tree.d.ts.map +1 -1
- package/dist/core/architecture-tree.js +184 -40
- package/dist/core/architecture-tree.js.map +1 -1
- package/dist/core/capability-matrix.d.ts +63 -0
- package/dist/core/capability-matrix.d.ts.map +1 -0
- package/dist/core/capability-matrix.js +316 -0
- package/dist/core/capability-matrix.js.map +1 -0
- package/dist/core/command-contract-lint.d.ts.map +1 -1
- package/dist/core/command-contract-lint.js +3 -1
- package/dist/core/command-contract-lint.js.map +1 -1
- package/dist/core/command-contract.d.ts +10 -3
- package/dist/core/command-contract.d.ts.map +1 -1
- package/dist/core/command-contract.js +87 -5
- package/dist/core/command-contract.js.map +1 -1
- package/dist/discovery/aliases.d.ts.map +1 -1
- package/dist/discovery/aliases.js +26 -0
- package/dist/discovery/aliases.js.map +1 -1
- package/dist/discovery/core-catalog.d.ts +1 -0
- package/dist/discovery/core-catalog.d.ts.map +1 -1
- package/dist/discovery/core-catalog.js +22 -5
- package/dist/discovery/core-catalog.js.map +1 -1
- package/dist/discovery/intents.d.ts +31 -4
- package/dist/discovery/intents.d.ts.map +1 -1
- package/dist/discovery/intents.js +166 -3
- package/dist/discovery/intents.js.map +1 -1
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +3 -0
- package/dist/discovery/loader.js.map +1 -1
- package/dist/discovery/search.d.ts.map +1 -1
- package/dist/discovery/search.js +10 -1
- package/dist/discovery/search.js.map +1 -1
- package/dist/engine/cascade.d.ts.map +1 -1
- package/dist/engine/cascade.js +21 -25
- package/dist/engine/cascade.js.map +1 -1
- package/dist/engine/chromium-cookies.d.ts +27 -0
- package/dist/engine/chromium-cookies.d.ts.map +1 -1
- package/dist/engine/chromium-cookies.js +53 -14
- package/dist/engine/chromium-cookies.js.map +1 -1
- package/dist/engine/cookie-capture.d.ts +30 -0
- package/dist/engine/cookie-capture.d.ts.map +1 -0
- package/dist/engine/cookie-capture.js +104 -0
- package/dist/engine/cookie-capture.js.map +1 -0
- package/dist/engine/cookie-extractor.d.ts.map +1 -1
- package/dist/engine/cookie-extractor.js +4 -12
- package/dist/engine/cookie-extractor.js.map +1 -1
- package/dist/engine/cookie-refresh.d.ts +59 -8
- package/dist/engine/cookie-refresh.d.ts.map +1 -1
- package/dist/engine/cookie-refresh.js +80 -58
- package/dist/engine/cookie-refresh.js.map +1 -1
- package/dist/engine/cookie-source.d.ts +110 -0
- package/dist/engine/cookie-source.d.ts.map +1 -0
- package/dist/engine/cookie-source.js +207 -0
- package/dist/engine/cookie-source.js.map +1 -0
- package/dist/engine/cookies.d.ts +37 -25
- package/dist/engine/cookies.d.ts.map +1 -1
- package/dist/engine/cookies.js +58 -157
- package/dist/engine/cookies.js.map +1 -1
- package/dist/engine/delivery/index.d.ts +2 -1
- package/dist/engine/delivery/index.d.ts.map +1 -1
- package/dist/engine/delivery/index.js +2 -1
- package/dist/engine/delivery/index.js.map +1 -1
- package/dist/engine/delivery/spec.d.ts +44 -0
- package/dist/engine/delivery/spec.d.ts.map +1 -0
- package/dist/engine/delivery/spec.js +82 -0
- package/dist/engine/delivery/spec.js.map +1 -0
- package/dist/engine/executor.d.ts +17 -6
- package/dist/engine/executor.d.ts.map +1 -1
- package/dist/engine/executor.js +131 -68
- package/dist/engine/executor.js.map +1 -1
- package/dist/engine/kernel/stages.d.ts.map +1 -1
- package/dist/engine/kernel/stages.js +14 -4
- package/dist/engine/kernel/stages.js.map +1 -1
- package/dist/engine/objective/catalog.d.ts +23 -0
- package/dist/engine/objective/catalog.d.ts.map +1 -0
- package/dist/engine/objective/catalog.js +42 -0
- package/dist/engine/objective/catalog.js.map +1 -0
- package/dist/engine/objective/delivery.d.ts +18 -0
- package/dist/engine/objective/delivery.d.ts.map +1 -0
- package/dist/engine/objective/delivery.js +64 -0
- package/dist/engine/objective/delivery.js.map +1 -0
- package/dist/engine/objective/index.d.ts +20 -0
- package/dist/engine/objective/index.d.ts.map +1 -0
- package/dist/engine/objective/index.js +20 -0
- package/dist/engine/objective/index.js.map +1 -0
- package/dist/engine/objective/media-playback.d.ts +17 -0
- package/dist/engine/objective/media-playback.d.ts.map +1 -0
- package/dist/engine/objective/media-playback.js +186 -0
- package/dist/engine/objective/media-playback.js.map +1 -0
- package/dist/engine/objective/output.d.ts +20 -0
- package/dist/engine/objective/output.d.ts.map +1 -0
- package/dist/engine/objective/output.js +88 -0
- package/dist/engine/objective/output.js.map +1 -0
- package/dist/engine/objective/planner.d.ts +17 -0
- package/dist/engine/objective/planner.d.ts.map +1 -0
- package/dist/engine/objective/planner.js +60 -0
- package/dist/engine/objective/planner.js.map +1 -0
- package/dist/engine/objective/types.d.ts +66 -0
- package/dist/engine/objective/types.d.ts.map +1 -0
- package/dist/engine/objective/types.js +16 -0
- package/dist/engine/objective/types.js.map +1 -0
- package/dist/engine/runtime.d.ts.map +1 -1
- package/dist/engine/runtime.js +9 -4
- package/dist/engine/runtime.js.map +1 -1
- package/dist/engine/step-observer.d.ts +62 -0
- package/dist/engine/step-observer.d.ts.map +1 -0
- package/dist/engine/step-observer.js +38 -0
- package/dist/engine/step-observer.js.map +1 -0
- package/dist/engine/steps/browser-helpers.d.ts.map +1 -1
- package/dist/engine/steps/browser-helpers.js +36 -8
- package/dist/engine/steps/browser-helpers.js.map +1 -1
- package/dist/engine/steps/fetch-text.d.ts.map +1 -1
- package/dist/engine/steps/fetch-text.js +106 -33
- package/dist/engine/steps/fetch-text.js.map +1 -1
- package/dist/engine/steps/fetch.d.ts +20 -0
- package/dist/engine/steps/fetch.d.ts.map +1 -1
- package/dist/engine/steps/fetch.js.map +1 -1
- package/dist/engine/steps/index.d.ts +2 -0
- package/dist/engine/steps/index.d.ts.map +1 -1
- package/dist/engine/steps/index.js +2 -0
- package/dist/engine/steps/index.js.map +1 -1
- package/dist/engine/steps/split-text.d.ts +26 -0
- package/dist/engine/steps/split-text.d.ts.map +1 -0
- package/dist/engine/steps/split-text.js +89 -0
- package/dist/engine/steps/split-text.js.map +1 -0
- package/dist/engine/steps/to-entries.d.ts +9 -0
- package/dist/engine/steps/to-entries.d.ts.map +1 -0
- package/dist/engine/steps/to-entries.js +27 -0
- package/dist/engine/steps/to-entries.js.map +1 -0
- package/dist/fast-path/handlers/discovery.d.ts.map +1 -1
- package/dist/fast-path/handlers/discovery.js +7 -7
- package/dist/fast-path/handlers/discovery.js.map +1 -1
- package/dist/manifest-compact.txt +3 -2
- package/dist/manifest.json +183 -17
- package/dist/mcp/tools.js +1 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/output/auth-guidance.d.ts +17 -3
- package/dist/output/auth-guidance.d.ts.map +1 -1
- package/dist/output/auth-guidance.js +27 -3
- package/dist/output/auth-guidance.js.map +1 -1
- package/dist/output/error-map.d.ts.map +1 -1
- package/dist/output/error-map.js +4 -0
- package/dist/output/error-map.js.map +1 -1
- package/package.json +4 -2
- package/server.json +2 -2
- package/skills/unicli/SKILL.md +1 -1
- package/skills/unicli-claude-code/SKILL.md +1 -1
- package/skills/unicli-hermes/SKILL.md +1 -1
- package/src/adapters/12306/price.yaml +91 -0
- package/src/adapters/12306/stations.yaml +52 -0
- package/src/adapters/12306/trains.yaml +129 -0
- package/src/adapters/_electron/desktop-shared.ts +5 -1
- package/src/adapters/_electron/shared.ts +15 -0
- package/src/adapters/antigravity/extra.ts +10 -1
- package/src/adapters/chatwise/extra.ts +10 -1
- package/src/adapters/codex/codex.ts +6 -0
- package/src/adapters/codex/extra.ts +10 -1
- package/src/adapters/codex/projects.ts +9 -1
- package/src/adapters/cursor/cursor.ts +9 -0
- package/src/adapters/discord-app/discord-app.ts +16 -1
- package/src/adapters/macos/brightness.yaml +6 -3
- package/src/adapters/macos/calendar-list.yaml +9 -11
- package/src/adapters/macos/calendar-today.yaml +1 -1
- package/src/adapters/macos/safari-url.yaml +8 -4
- package/src/adapters/maoyan/hot.yaml +1 -1
- package/src/adapters/notion-app/notion-app.ts +17 -1
- package/src/adapters/spotify/api.ts +54 -8
- package/src/adapters/weibo/trending.yaml +2 -0
- package/src/adapters/xiaohongshu/browser-state.ts +59 -2
- package/src/adapters/xiaohongshu/feed.ts +103 -0
- 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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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
|
|
19
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
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
|
|
18
|
-
|
|
19
|
-
|
|
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"]
|
|
@@ -7,15 +7,23 @@
|
|
|
7
7
|
* Commands: search, read, write, new, status, sidebar, favorites, export, screenshot
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import {
|
|
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",
|