@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.
Files changed (72) hide show
  1. package/AGENTS.md +4 -4
  2. package/README.md +30 -17
  3. package/dist/browser/observe.d.ts +80 -0
  4. package/dist/browser/observe.d.ts.map +1 -0
  5. package/dist/browser/observe.js +144 -0
  6. package/dist/browser/observe.js.map +1 -0
  7. package/dist/browser/snapshot.d.ts.map +1 -1
  8. package/dist/browser/snapshot.js +29 -9
  9. package/dist/browser/snapshot.js.map +1 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +53 -2
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/eval.d.ts +112 -0
  14. package/dist/commands/eval.d.ts.map +1 -0
  15. package/dist/commands/eval.js +485 -0
  16. package/dist/commands/eval.js.map +1 -0
  17. package/dist/commands/mcp.d.ts +16 -0
  18. package/dist/commands/mcp.d.ts.map +1 -0
  19. package/dist/commands/mcp.js +135 -0
  20. package/dist/commands/mcp.js.map +1 -0
  21. package/dist/commands/operate.d.ts.map +1 -1
  22. package/dist/commands/operate.js +66 -1
  23. package/dist/commands/operate.js.map +1 -1
  24. package/dist/commands/skills.d.ts +91 -0
  25. package/dist/commands/skills.d.ts.map +1 -0
  26. package/dist/commands/skills.js +266 -0
  27. package/dist/commands/skills.js.map +1 -0
  28. package/dist/commands/usage.d.ts +17 -0
  29. package/dist/commands/usage.d.ts.map +1 -0
  30. package/dist/commands/usage.js +87 -0
  31. package/dist/commands/usage.js.map +1 -0
  32. package/dist/discovery/loader.d.ts +8 -1
  33. package/dist/discovery/loader.d.ts.map +1 -1
  34. package/dist/discovery/loader.js +100 -6
  35. package/dist/discovery/loader.js.map +1 -1
  36. package/dist/engine/update-check.js +1 -1
  37. package/dist/engine/update-check.js.map +1 -1
  38. package/dist/engine/yaml-runner.d.ts.map +1 -1
  39. package/dist/engine/yaml-runner.js +35 -1
  40. package/dist/engine/yaml-runner.js.map +1 -1
  41. package/dist/main.d.ts +1 -4
  42. package/dist/main.d.ts.map +1 -1
  43. package/dist/main.js +1 -4
  44. package/dist/main.js.map +1 -1
  45. package/dist/manifest.json +117 -1
  46. package/dist/mcp/server.d.ts +19 -6
  47. package/dist/mcp/server.d.ts.map +1 -1
  48. package/dist/mcp/server.js +401 -115
  49. package/dist/mcp/server.js.map +1 -1
  50. package/dist/permissions/sensitive-paths.d.ts +92 -0
  51. package/dist/permissions/sensitive-paths.d.ts.map +1 -0
  52. package/dist/permissions/sensitive-paths.js +174 -0
  53. package/dist/permissions/sensitive-paths.js.map +1 -0
  54. package/dist/runtime/usage-ledger.d.ts +86 -0
  55. package/dist/runtime/usage-ledger.d.ts.map +1 -0
  56. package/dist/runtime/usage-ledger.js +173 -0
  57. package/dist/runtime/usage-ledger.js.map +1 -0
  58. package/package.json +8 -7
  59. package/src/adapters/autoagent/eval-run.yaml +36 -0
  60. package/src/adapters/cua/bench-list.yaml +20 -0
  61. package/src/adapters/cua/bench-run.yaml +32 -0
  62. package/src/adapters/godot/project-run.yaml +31 -0
  63. package/src/adapters/godot/scene-export.yaml +39 -0
  64. package/src/adapters/hermes/sessions-search.yaml +61 -0
  65. package/src/adapters/hermes/skills-list.yaml +30 -0
  66. package/src/adapters/hermes/skills-read.yaml +46 -0
  67. package/src/adapters/motion-studio/component-get.yaml +35 -0
  68. package/src/adapters/openharness/memory-read.yaml +51 -0
  69. package/src/adapters/openharness/skills-list.yaml +28 -0
  70. package/src/adapters/renderdoc/capture-list.yaml +42 -0
  71. package/src/adapters/renderdoc/frame-export.yaml +32 -0
  72. 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]