@zenalexa/unicli 0.207.1 → 0.208.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -4
- package/README.md +30 -17
- package/dist/browser/observe.d.ts +80 -0
- package/dist/browser/observe.d.ts.map +1 -0
- package/dist/browser/observe.js +144 -0
- package/dist/browser/observe.js.map +1 -0
- package/dist/browser/snapshot.d.ts.map +1 -1
- package/dist/browser/snapshot.js +29 -9
- package/dist/browser/snapshot.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +53 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/eval.d.ts +112 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +485 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/mcp.d.ts +16 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +135 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/operate.d.ts.map +1 -1
- package/dist/commands/operate.js +66 -1
- package/dist/commands/operate.js.map +1 -1
- package/dist/commands/skills.d.ts +91 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +266 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/usage.d.ts +17 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +87 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/discovery/loader.d.ts +8 -1
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +100 -6
- package/dist/discovery/loader.js.map +1 -1
- package/dist/engine/update-check.js +1 -1
- package/dist/engine/update-check.js.map +1 -1
- package/dist/engine/yaml-runner.d.ts.map +1 -1
- package/dist/engine/yaml-runner.js +35 -1
- package/dist/engine/yaml-runner.js.map +1 -1
- package/dist/main.d.ts +1 -4
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -4
- package/dist/main.js.map +1 -1
- package/dist/manifest.json +117 -1
- package/dist/mcp/server.d.ts +19 -6
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +401 -115
- package/dist/mcp/server.js.map +1 -1
- package/dist/permissions/sensitive-paths.d.ts +92 -0
- package/dist/permissions/sensitive-paths.d.ts.map +1 -0
- package/dist/permissions/sensitive-paths.js +174 -0
- package/dist/permissions/sensitive-paths.js.map +1 -0
- package/dist/runtime/usage-ledger.d.ts +86 -0
- package/dist/runtime/usage-ledger.d.ts.map +1 -0
- package/dist/runtime/usage-ledger.js +173 -0
- package/dist/runtime/usage-ledger.js.map +1 -0
- package/package.json +8 -7
- package/src/adapters/autoagent/eval-run.yaml +36 -0
- package/src/adapters/cua/bench-list.yaml +20 -0
- package/src/adapters/cua/bench-run.yaml +32 -0
- package/src/adapters/godot/project-run.yaml +31 -0
- package/src/adapters/godot/scene-export.yaml +39 -0
- package/src/adapters/hermes/sessions-search.yaml +61 -0
- package/src/adapters/hermes/skills-list.yaml +30 -0
- package/src/adapters/hermes/skills-read.yaml +46 -0
- package/src/adapters/motion-studio/component-get.yaml +35 -0
- package/src/adapters/openharness/memory-read.yaml +51 -0
- package/src/adapters/openharness/skills-list.yaml +28 -0
- package/src/adapters/renderdoc/capture-list.yaml +42 -0
- package/src/adapters/renderdoc/frame-export.yaml +32 -0
- package/src/adapters/stagehand/wrap-observe.yaml +42 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# trycua/cua bench/run — run a single computer-use benchmark.
|
|
2
|
+
site: cua
|
|
3
|
+
name: bench/run
|
|
4
|
+
description: Run a trycua/cua computer-use benchmark
|
|
5
|
+
type: bridge
|
|
6
|
+
strategy: public
|
|
7
|
+
binary: cua
|
|
8
|
+
detect: which cua
|
|
9
|
+
|
|
10
|
+
args:
|
|
11
|
+
benchmark:
|
|
12
|
+
type: str
|
|
13
|
+
required: true
|
|
14
|
+
positional: true
|
|
15
|
+
description: Benchmark name from `cua bench/list`
|
|
16
|
+
agent:
|
|
17
|
+
type: str
|
|
18
|
+
required: false
|
|
19
|
+
description: Agent backend (e.g. unicli, browser-use, claude)
|
|
20
|
+
|
|
21
|
+
pipeline:
|
|
22
|
+
- exec:
|
|
23
|
+
command: cua
|
|
24
|
+
args:
|
|
25
|
+
- bench
|
|
26
|
+
- run
|
|
27
|
+
- ${{ args.benchmark }}
|
|
28
|
+
- --json
|
|
29
|
+
parse: json
|
|
30
|
+
timeout: 600000
|
|
31
|
+
|
|
32
|
+
columns: [task, score, duration, agent]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Godot project/run — run a project headlessly with optional script.
|
|
2
|
+
site: godot
|
|
3
|
+
name: project/run
|
|
4
|
+
description: Run a Godot project in headless mode
|
|
5
|
+
type: desktop
|
|
6
|
+
strategy: public
|
|
7
|
+
binary: godot
|
|
8
|
+
detect: which godot
|
|
9
|
+
|
|
10
|
+
args:
|
|
11
|
+
project:
|
|
12
|
+
type: str
|
|
13
|
+
required: true
|
|
14
|
+
positional: true
|
|
15
|
+
description: Path to project directory or project.godot file
|
|
16
|
+
script:
|
|
17
|
+
type: str
|
|
18
|
+
required: false
|
|
19
|
+
description: Optional GDScript file to run as main scene
|
|
20
|
+
|
|
21
|
+
pipeline:
|
|
22
|
+
- exec:
|
|
23
|
+
command: godot
|
|
24
|
+
args:
|
|
25
|
+
- --headless
|
|
26
|
+
- --path
|
|
27
|
+
- ${{ args.project }}
|
|
28
|
+
parse: text
|
|
29
|
+
timeout: 60000
|
|
30
|
+
|
|
31
|
+
columns: [output]
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Godot scene/export — export a scene to a known format via godot --headless.
|
|
2
|
+
# Closes the v0.208 coverage gap with CLI-Anything's Godot harness.
|
|
3
|
+
site: godot
|
|
4
|
+
name: scene/export
|
|
5
|
+
description: Export a Godot scene to PNG / GLTF / DAE via headless mode
|
|
6
|
+
type: desktop
|
|
7
|
+
strategy: public
|
|
8
|
+
binary: godot
|
|
9
|
+
detect: which godot
|
|
10
|
+
|
|
11
|
+
args:
|
|
12
|
+
project:
|
|
13
|
+
type: str
|
|
14
|
+
required: true
|
|
15
|
+
positional: true
|
|
16
|
+
description: Path to project directory or project.godot file
|
|
17
|
+
scene:
|
|
18
|
+
type: str
|
|
19
|
+
required: true
|
|
20
|
+
description: Scene path within the project (e.g. res://Main.tscn)
|
|
21
|
+
output:
|
|
22
|
+
type: str
|
|
23
|
+
required: true
|
|
24
|
+
description: Output file path
|
|
25
|
+
|
|
26
|
+
pipeline:
|
|
27
|
+
- exec:
|
|
28
|
+
command: godot
|
|
29
|
+
args:
|
|
30
|
+
- --headless
|
|
31
|
+
- --path
|
|
32
|
+
- ${{ args.project }}
|
|
33
|
+
- --export-pack
|
|
34
|
+
- ${{ args.scene }}
|
|
35
|
+
- ${{ args.output }}
|
|
36
|
+
parse: text
|
|
37
|
+
timeout: 120000
|
|
38
|
+
|
|
39
|
+
columns: [output]
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# NousResearch/hermes-agent sessions/search — query Hermes session FTS.
|
|
2
|
+
# Hermes stores session history in a SQLite database at ~/.hermes/sessions.db.
|
|
3
|
+
#
|
|
4
|
+
# Security:
|
|
5
|
+
# - `args.query` is passed via env var UNICLI_QUERY (bash literal, no shell injection)
|
|
6
|
+
# - Single quotes in the query are doubled (`'` → `''`) via bash parameter
|
|
7
|
+
# expansion before being injected into the SQL string literal — this is
|
|
8
|
+
# the standard SQL string-literal escape. FTS5 MATCH still interprets its
|
|
9
|
+
# own query grammar (e.g. `OR`, `*`) as FTS operators, which is
|
|
10
|
+
# intentional for search.
|
|
11
|
+
# - `args.limit` is typed int in adapter args; bash strips non-digits as
|
|
12
|
+
# a belt-and-suspenders guard to keep LIMIT clause integer-only.
|
|
13
|
+
site: hermes
|
|
14
|
+
name: sessions/search
|
|
15
|
+
description: Search Hermes session history via SQLite FTS5
|
|
16
|
+
type: desktop
|
|
17
|
+
strategy: public
|
|
18
|
+
binary: sh
|
|
19
|
+
detect: test -f ~/.hermes/sessions.db
|
|
20
|
+
|
|
21
|
+
args:
|
|
22
|
+
query:
|
|
23
|
+
type: str
|
|
24
|
+
required: true
|
|
25
|
+
positional: true
|
|
26
|
+
description: FTS5 query string
|
|
27
|
+
limit:
|
|
28
|
+
type: int
|
|
29
|
+
default: 20
|
|
30
|
+
description: Max rows
|
|
31
|
+
|
|
32
|
+
pipeline:
|
|
33
|
+
- exec:
|
|
34
|
+
command: sh
|
|
35
|
+
args:
|
|
36
|
+
- -c
|
|
37
|
+
- |
|
|
38
|
+
db="$HOME/.hermes/sessions.db"
|
|
39
|
+
if [ ! -f "$db" ]; then
|
|
40
|
+
echo "[]"
|
|
41
|
+
exit 0
|
|
42
|
+
fi
|
|
43
|
+
# SQL-escape single quotes: ' -> ''
|
|
44
|
+
q=${UNICLI_QUERY//\'/\'\'}
|
|
45
|
+
# Force integer on limit (strip non-digits)
|
|
46
|
+
lim=${UNICLI_LIMIT//[^0-9]/}
|
|
47
|
+
: "${lim:=20}"
|
|
48
|
+
# Try FTS5 table first; fall back to LIKE if FTS table is missing
|
|
49
|
+
sqlite3 -json "$db" \
|
|
50
|
+
"SELECT id, ts, snippet(sessions_fts, -1, '<b>', '</b>', '...', 16) AS snippet FROM sessions_fts WHERE sessions_fts MATCH '$q' LIMIT $lim;" \
|
|
51
|
+
2>/dev/null \
|
|
52
|
+
|| sqlite3 -json "$db" \
|
|
53
|
+
"SELECT id, ts, substr(content, 1, 200) AS snippet FROM sessions WHERE content LIKE '%$q%' LIMIT $lim;" \
|
|
54
|
+
2>/dev/null \
|
|
55
|
+
|| echo "[]"
|
|
56
|
+
env:
|
|
57
|
+
UNICLI_QUERY: "${{ args.query }}"
|
|
58
|
+
UNICLI_LIMIT: "${{ args.limit }}"
|
|
59
|
+
parse: json
|
|
60
|
+
|
|
61
|
+
columns: [id, ts, snippet]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# NousResearch/hermes-agent skills/list — read on-disk skill files.
|
|
2
|
+
# Hermes stores agent skills as markdown under ~/.hermes/skills/
|
|
3
|
+
#
|
|
4
|
+
# Security note: no user input, so no injection surface. Uses `find`
|
|
5
|
+
# directly with argv (no shell interpolation).
|
|
6
|
+
site: hermes
|
|
7
|
+
name: skills/list
|
|
8
|
+
description: List skills installed in the local Hermes agent (~/.hermes/skills/)
|
|
9
|
+
type: desktop
|
|
10
|
+
strategy: public
|
|
11
|
+
binary: sh
|
|
12
|
+
detect: test -d ~/.hermes/skills
|
|
13
|
+
|
|
14
|
+
pipeline:
|
|
15
|
+
- exec:
|
|
16
|
+
command: sh
|
|
17
|
+
args:
|
|
18
|
+
- -c
|
|
19
|
+
- |
|
|
20
|
+
dir="$HOME/.hermes/skills"
|
|
21
|
+
if [ ! -d "$dir" ]; then
|
|
22
|
+
echo "[]"
|
|
23
|
+
exit 0
|
|
24
|
+
fi
|
|
25
|
+
find "$dir" -maxdepth 1 -name '*.md' -type f 2>/dev/null \
|
|
26
|
+
| sed "s|$dir/||" \
|
|
27
|
+
| jq -R -s 'split("\n") | map(select(length > 0)) | map({name: .})'
|
|
28
|
+
parse: json
|
|
29
|
+
|
|
30
|
+
columns: [name]
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# NousResearch/hermes-agent skills/read — read one skill file by name.
|
|
2
|
+
#
|
|
3
|
+
# Security: `args.name` is passed via environment variable UNICLI_NAME, not
|
|
4
|
+
# template-interpolated into the shell script. Bash expands "$UNICLI_NAME"
|
|
5
|
+
# inside double quotes as a literal string, so command injection is not
|
|
6
|
+
# possible. Path traversal (`name=../../etc/passwd`) is blocked by the
|
|
7
|
+
# case check that rejects slashes and `..` in the name.
|
|
8
|
+
site: hermes
|
|
9
|
+
name: skills/read
|
|
10
|
+
description: Read a Hermes skill file by name (without .md extension)
|
|
11
|
+
type: desktop
|
|
12
|
+
strategy: public
|
|
13
|
+
binary: sh
|
|
14
|
+
detect: test -d ~/.hermes/skills
|
|
15
|
+
|
|
16
|
+
args:
|
|
17
|
+
name:
|
|
18
|
+
type: str
|
|
19
|
+
required: true
|
|
20
|
+
positional: true
|
|
21
|
+
description: Skill name (filename without .md)
|
|
22
|
+
|
|
23
|
+
pipeline:
|
|
24
|
+
- exec:
|
|
25
|
+
command: sh
|
|
26
|
+
args:
|
|
27
|
+
- -c
|
|
28
|
+
- |
|
|
29
|
+
# Reject path traversal and anything with a slash or ".."
|
|
30
|
+
case "$UNICLI_NAME" in
|
|
31
|
+
*/*|*..*|"")
|
|
32
|
+
echo '{"error":"invalid skill name"}'
|
|
33
|
+
exit 1
|
|
34
|
+
;;
|
|
35
|
+
esac
|
|
36
|
+
file="$HOME/.hermes/skills/${UNICLI_NAME}.md"
|
|
37
|
+
if [ ! -f "$file" ]; then
|
|
38
|
+
printf '%s' "$file" | jq -Rs '{error:"not found",path:.}'
|
|
39
|
+
exit 1
|
|
40
|
+
fi
|
|
41
|
+
jq -Rs --arg name "$UNICLI_NAME" '{name:$name,content:.}' < "$file"
|
|
42
|
+
env:
|
|
43
|
+
UNICLI_NAME: "${{ args.name }}"
|
|
44
|
+
parse: json
|
|
45
|
+
|
|
46
|
+
columns: [name, content]
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Motion Studio (motion.dev) — fetch one example component as paste-ready code.
|
|
2
|
+
# motion.dev/examples/<id> serves a Next.js page; we hit the underlying
|
|
3
|
+
# data endpoint and surface the source body.
|
|
4
|
+
site: motion-studio
|
|
5
|
+
name: component/get
|
|
6
|
+
description: Fetch a Motion (motion.dev) example component as paste-ready code
|
|
7
|
+
domain: motion.dev
|
|
8
|
+
type: web-api
|
|
9
|
+
strategy: public
|
|
10
|
+
browser: false
|
|
11
|
+
|
|
12
|
+
args:
|
|
13
|
+
id:
|
|
14
|
+
type: str
|
|
15
|
+
required: true
|
|
16
|
+
positional: true
|
|
17
|
+
description: Example slug from motion.dev/examples/<id> (e.g. react-command-palette)
|
|
18
|
+
|
|
19
|
+
pipeline:
|
|
20
|
+
- fetch_text:
|
|
21
|
+
url: "https://motion.dev/examples/${{ args.id }}"
|
|
22
|
+
headers:
|
|
23
|
+
Accept: text/html
|
|
24
|
+
User-Agent: Uni-CLI/0.208
|
|
25
|
+
|
|
26
|
+
- set:
|
|
27
|
+
html: ${{ ctx.data }}
|
|
28
|
+
|
|
29
|
+
- map:
|
|
30
|
+
id: ${{ args.id }}
|
|
31
|
+
url: "https://motion.dev/examples/${{ args.id }}"
|
|
32
|
+
length: ${{ vars.html.length }}
|
|
33
|
+
preview: ${{ vars.html.slice(0, 1200) }}
|
|
34
|
+
|
|
35
|
+
columns: [id, url, length, preview]
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# HKUDS/OpenHarness memory/read — read MEMORY.md and per-topic memory files
|
|
2
|
+
# from a local OpenHarness install.
|
|
3
|
+
#
|
|
4
|
+
# Security: `args.topic` is passed via UNICLI_TOPIC env var (literal in bash).
|
|
5
|
+
# Path traversal is blocked by the case check rejecting slashes and `..`.
|
|
6
|
+
site: openharness
|
|
7
|
+
name: memory/read
|
|
8
|
+
description: Read OpenHarness MEMORY.md and per-topic memory files (~/.openharness/memory/)
|
|
9
|
+
type: desktop
|
|
10
|
+
strategy: public
|
|
11
|
+
binary: sh
|
|
12
|
+
detect: test -d ~/.openharness
|
|
13
|
+
|
|
14
|
+
args:
|
|
15
|
+
topic:
|
|
16
|
+
type: str
|
|
17
|
+
required: false
|
|
18
|
+
description: Optional topic file (without .md). When omitted, returns MEMORY.md.
|
|
19
|
+
|
|
20
|
+
pipeline:
|
|
21
|
+
- exec:
|
|
22
|
+
command: sh
|
|
23
|
+
args:
|
|
24
|
+
- -c
|
|
25
|
+
- |
|
|
26
|
+
base="$HOME/.openharness"
|
|
27
|
+
if [ ! -d "$base" ]; then
|
|
28
|
+
echo '{"error":"openharness not installed","hint":"~/.openharness not found"}'
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
if [ -n "$UNICLI_TOPIC" ]; then
|
|
32
|
+
case "$UNICLI_TOPIC" in
|
|
33
|
+
*/*|*..*)
|
|
34
|
+
echo '{"error":"invalid topic name"}'
|
|
35
|
+
exit 1
|
|
36
|
+
;;
|
|
37
|
+
esac
|
|
38
|
+
file="$base/memory/${UNICLI_TOPIC}.md"
|
|
39
|
+
else
|
|
40
|
+
file="$base/MEMORY.md"
|
|
41
|
+
fi
|
|
42
|
+
if [ ! -f "$file" ]; then
|
|
43
|
+
printf '%s' "$file" | jq -Rs '{error:"not found",path:.}'
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
jq -Rs --arg path "$file" '{path:$path,content:.}' < "$file"
|
|
47
|
+
env:
|
|
48
|
+
UNICLI_TOPIC: "${{ args.topic }}"
|
|
49
|
+
parse: json
|
|
50
|
+
|
|
51
|
+
columns: [path, content]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# HKUDS/OpenHarness skills/list — list installed OpenHarness skills.
|
|
2
|
+
#
|
|
3
|
+
# Security: no user input; safe argv-only call.
|
|
4
|
+
site: openharness
|
|
5
|
+
name: skills/list
|
|
6
|
+
description: List skills installed in the local OpenHarness (~/.openharness/skills/)
|
|
7
|
+
type: desktop
|
|
8
|
+
strategy: public
|
|
9
|
+
binary: sh
|
|
10
|
+
detect: test -d ~/.openharness/skills
|
|
11
|
+
|
|
12
|
+
pipeline:
|
|
13
|
+
- exec:
|
|
14
|
+
command: sh
|
|
15
|
+
args:
|
|
16
|
+
- -c
|
|
17
|
+
- |
|
|
18
|
+
dir="$HOME/.openharness/skills"
|
|
19
|
+
if [ ! -d "$dir" ]; then
|
|
20
|
+
echo "[]"
|
|
21
|
+
exit 0
|
|
22
|
+
fi
|
|
23
|
+
find "$dir" -maxdepth 2 -name '*.md' -type f 2>/dev/null \
|
|
24
|
+
| sed "s|$dir/||" \
|
|
25
|
+
| jq -R -s 'split("\n") | map(select(length > 0)) | map({name: .})'
|
|
26
|
+
parse: json
|
|
27
|
+
|
|
28
|
+
columns: [name]
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# RenderDoc capture/list — enumerate captures in a directory.
|
|
2
|
+
#
|
|
3
|
+
# Security: `args.dir` is passed via UNICLI_DIR env var (bash literal). There's
|
|
4
|
+
# no attempt to block absolute paths — this is a local directory lister and
|
|
5
|
+
# the user is free to list anywhere they have read access to. The sensitive-
|
|
6
|
+
# path deny list in src/permissions/sensitive-paths.ts does not apply here
|
|
7
|
+
# because we're listing, not reading, and credential directories are allowed
|
|
8
|
+
# to be *listed* by name (the deny list blocks read/exec of credential files).
|
|
9
|
+
site: renderdoc
|
|
10
|
+
name: capture/list
|
|
11
|
+
description: List RenderDoc capture files (.rdc) in a directory
|
|
12
|
+
type: desktop
|
|
13
|
+
strategy: public
|
|
14
|
+
binary: sh
|
|
15
|
+
detect: which renderdoccmd
|
|
16
|
+
|
|
17
|
+
args:
|
|
18
|
+
dir:
|
|
19
|
+
type: str
|
|
20
|
+
required: false
|
|
21
|
+
default: ./captures
|
|
22
|
+
description: Capture directory (defaults to ./captures)
|
|
23
|
+
|
|
24
|
+
pipeline:
|
|
25
|
+
- exec:
|
|
26
|
+
command: sh
|
|
27
|
+
args:
|
|
28
|
+
- -c
|
|
29
|
+
- |
|
|
30
|
+
dir="${UNICLI_DIR:-./captures}"
|
|
31
|
+
if [ ! -d "$dir" ]; then
|
|
32
|
+
echo "[]"
|
|
33
|
+
exit 0
|
|
34
|
+
fi
|
|
35
|
+
find "$dir" -maxdepth 1 -name '*.rdc' -type f 2>/dev/null \
|
|
36
|
+
| sed "s|$dir/||" \
|
|
37
|
+
| jq -R -s 'split("\n") | map(select(length > 0)) | map({name: .})'
|
|
38
|
+
env:
|
|
39
|
+
UNICLI_DIR: "${{ args.dir }}"
|
|
40
|
+
parse: json
|
|
41
|
+
|
|
42
|
+
columns: [name]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# RenderDoc frame/export — convert one capture's first frame to image via renderdoccmd.
|
|
2
|
+
site: renderdoc
|
|
3
|
+
name: frame/export
|
|
4
|
+
description: Export the first frame from a RenderDoc capture (.rdc) as an image
|
|
5
|
+
type: desktop
|
|
6
|
+
strategy: public
|
|
7
|
+
binary: renderdoccmd
|
|
8
|
+
detect: which renderdoccmd
|
|
9
|
+
|
|
10
|
+
args:
|
|
11
|
+
capture:
|
|
12
|
+
type: str
|
|
13
|
+
required: true
|
|
14
|
+
positional: true
|
|
15
|
+
description: Path to .rdc capture file
|
|
16
|
+
output:
|
|
17
|
+
type: str
|
|
18
|
+
required: true
|
|
19
|
+
description: Output image path (.png recommended)
|
|
20
|
+
|
|
21
|
+
pipeline:
|
|
22
|
+
- exec:
|
|
23
|
+
command: renderdoccmd
|
|
24
|
+
args:
|
|
25
|
+
- thumb
|
|
26
|
+
- ${{ args.capture }}
|
|
27
|
+
- --out
|
|
28
|
+
- ${{ args.output }}
|
|
29
|
+
parse: text
|
|
30
|
+
timeout: 60000
|
|
31
|
+
|
|
32
|
+
columns: [output]
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Stagehand wrap/observe — subprocess wrapper around stagehand-cli.
|
|
2
|
+
#
|
|
3
|
+
# Stagehand exposes a vision-grounded `observe()` verb. This adapter shells
|
|
4
|
+
# out to it (if installed) and parses the JSON candidates the same way
|
|
5
|
+
# `unicli operate observe` does. The wrapper exists so users on Uni-CLI's
|
|
6
|
+
# declarative pipelines can tap Stagehand without porting a full LLM stack.
|
|
7
|
+
site: stagehand
|
|
8
|
+
name: wrap/observe
|
|
9
|
+
description: Run Stagehand's observe() verb against an open page (subprocess wrapper)
|
|
10
|
+
type: bridge
|
|
11
|
+
strategy: public
|
|
12
|
+
binary: stagehand
|
|
13
|
+
detect: which stagehand
|
|
14
|
+
|
|
15
|
+
args:
|
|
16
|
+
query:
|
|
17
|
+
type: str
|
|
18
|
+
required: true
|
|
19
|
+
positional: true
|
|
20
|
+
description: Natural-language goal (what should I click to do X?)
|
|
21
|
+
url:
|
|
22
|
+
type: str
|
|
23
|
+
required: false
|
|
24
|
+
description: URL to navigate to before observing
|
|
25
|
+
top_k:
|
|
26
|
+
type: int
|
|
27
|
+
default: 5
|
|
28
|
+
description: Max candidates
|
|
29
|
+
|
|
30
|
+
pipeline:
|
|
31
|
+
- exec:
|
|
32
|
+
command: stagehand
|
|
33
|
+
args:
|
|
34
|
+
- observe
|
|
35
|
+
- --query
|
|
36
|
+
- ${{ args.query }}
|
|
37
|
+
- --top-k
|
|
38
|
+
- ${{ args.top_k }}
|
|
39
|
+
parse: json
|
|
40
|
+
timeout: 60000
|
|
41
|
+
|
|
42
|
+
columns: [action, ref, selector, confidence]
|