omnilimb 0.8.0__tar.gz

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 (32) hide show
  1. omnilimb-0.8.0/LICENSE +32 -0
  2. omnilimb-0.8.0/PKG-INFO +244 -0
  3. omnilimb-0.8.0/README.md +221 -0
  4. omnilimb-0.8.0/omnilimb/__init__.py +114 -0
  5. omnilimb-0.8.0/omnilimb/_cache.py +123 -0
  6. omnilimb-0.8.0/omnilimb/_errors.py +54 -0
  7. omnilimb-0.8.0/omnilimb/_retry.py +64 -0
  8. omnilimb-0.8.0/omnilimb/_scoring.py +236 -0
  9. omnilimb-0.8.0/omnilimb/backends/__init__.py +42 -0
  10. omnilimb-0.8.0/omnilimb/backends/base.py +56 -0
  11. omnilimb-0.8.0/omnilimb/backends/cli_backend.py +184 -0
  12. omnilimb-0.8.0/omnilimb/backends/native_backend.py +559 -0
  13. omnilimb-0.8.0/omnilimb/config.py +200 -0
  14. omnilimb-0.8.0/omnilimb/dashboard/__init__.py +6 -0
  15. omnilimb-0.8.0/omnilimb/dashboard/dist/index.js +1508 -0
  16. omnilimb-0.8.0/omnilimb/dashboard/dist/style.css +638 -0
  17. omnilimb-0.8.0/omnilimb/dashboard/manifest.json +15 -0
  18. omnilimb-0.8.0/omnilimb/dashboard/plugin_api.py +1357 -0
  19. omnilimb-0.8.0/omnilimb/plugin.yaml +25 -0
  20. omnilimb-0.8.0/omnilimb/registries.py +514 -0
  21. omnilimb-0.8.0/omnilimb/schemas.py +202 -0
  22. omnilimb-0.8.0/omnilimb/skills/omnilimb/SKILL.md +75 -0
  23. omnilimb-0.8.0/omnilimb/tools.py +821 -0
  24. omnilimb-0.8.0/omnilimb.egg-info/PKG-INFO +244 -0
  25. omnilimb-0.8.0/omnilimb.egg-info/SOURCES.txt +30 -0
  26. omnilimb-0.8.0/omnilimb.egg-info/dependency_links.txt +1 -0
  27. omnilimb-0.8.0/omnilimb.egg-info/entry_points.txt +2 -0
  28. omnilimb-0.8.0/omnilimb.egg-info/requires.txt +7 -0
  29. omnilimb-0.8.0/omnilimb.egg-info/top_level.txt +1 -0
  30. omnilimb-0.8.0/pyproject.toml +41 -0
  31. omnilimb-0.8.0/setup.cfg +4 -0
  32. omnilimb-0.8.0/tests/test_omnilimb.py +578 -0
omnilimb-0.8.0/LICENSE ADDED
@@ -0,0 +1,32 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 seanyang1983
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ -------------------------------------------------------------------------------
24
+ THIRD-PARTY NOTICES
25
+
26
+ This project is a compatibility bridge. It does NOT bundle or redistribute
27
+ OpenClaw. When the CLI backend is used, it invokes a user-installed `openclaw`
28
+ binary. OpenClaw is distributed under the MIT License, Copyright (c) 2025
29
+ Peter Steinberger / OpenClaw Foundation. "OpenClaw", "ClawHub" and related marks
30
+ belong to their respective owners; this project is not affiliated with or
31
+ endorsed by them. If you choose to redistribute any OpenClaw components, you must
32
+ include their MIT license and attribution.
@@ -0,0 +1,244 @@
1
+ Metadata-Version: 2.4
2
+ Name: omnilimb
3
+ Version: 0.8.0
4
+ Summary: Run ClawHub skills, sandbox, Playwright browser & multi-language runtimes as Hermes hands/feet. Structured JSON, zero extra LLM tokens.
5
+ Author-email: seanyang1983 <yase19636404@163.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/seanyang1983/omnilimb
8
+ Project-URL: Issues, https://github.com/seanyang1983/omnilimb/issues
9
+ Keywords: hermes,openclaw,clawhub,agent,sandbox,playwright,skills
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Intended Audience :: Developers
14
+ Requires-Python: >=3.10
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Requires-Dist: PyYAML<7,>=6
18
+ Provides-Extra: browser
19
+ Requires-Dist: playwright<2,>=1.44; extra == "browser"
20
+ Provides-Extra: dev
21
+ Requires-Dist: pytest<9,>=8; extra == "dev"
22
+ Dynamic: license-file
23
+
24
+ <p align="center">
25
+ <img src="docs/assets/banner.svg" alt="Omnilimb — give your Hermes agent hands & feet" width="100%" />
26
+ </p>
27
+
28
+ <p align="center">
29
+ <a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-36e0c0.svg"></a>
30
+ <img alt="Python" src="https://img.shields.io/badge/Python-3.10%2B-5b8cff.svg">
31
+ <img alt="Status" src="https://img.shields.io/badge/edition-free%20community-5b8cff.svg">
32
+ <img alt="Tokens" src="https://img.shields.io/badge/execution%20path-0%20extra%20LLM%20tokens-36e0c0.svg">
33
+ <a href="http://www.omnilimb.com"><img alt="Website" src="https://img.shields.io/badge/web-omnilimb.com-9aa4be.svg"></a>
34
+ </p>
35
+
36
+ <p align="center">
37
+ <b>English</b> · <a href="README.zh-CN.md">简体中文</a>
38
+ &nbsp;|&nbsp; 🌐 <a href="http://www.omnilimb.com">omnilimb.com</a>
39
+ </p>
40
+
41
+ # Omnilimb
42
+
43
+ **Your Hermes agent is the brain. Omnilimb is the hands and feet.**
44
+
45
+ Omnilimb is a Hermes plugin that lets an agent *find, install, run and manage*
46
+ [OpenClaw / ClawHub](https://clawhub.ai) community skills — and gives it an
47
+ isolated sandbox, a real Playwright browser, and multi-language runtimes. Every
48
+ capability is exposed as a small, **deterministic structured-JSON tool** the
49
+ agent calls directly, so there are **zero extra LLM tokens on the execution
50
+ path** and no second "agent loop" burning your budget.
51
+
52
+ > ℹ️ Compatible with OpenClaw &amp; ClawHub; not affiliated with them.
53
+ > "Omnilimb" is an independent product ([omnilimb.com](http://www.omnilimb.com)).
54
+
55
+ ---
56
+
57
+ ## Why Omnilimb
58
+
59
+ - ⚡ **Zero token overhead.** The execution path never calls a model. The agent
60
+ decides *once*; Omnilimb does the work deterministically and hands back JSON.
61
+ - 🧰 **A whole toolbox, one small surface.** Eight tools cover skill discovery,
62
+ install, run, sandbox, browser, and runtimes — no sprawling API to learn.
63
+ - 🛡️ **Safe by default.** Third-party skills run in a Docker sandbox with the
64
+ network off and automatic rollback. Path-traversal and zip-slip guarded.
65
+ - 🔌 **No lock-in, no phone-home.** Search talks only to the market you pick.
66
+ Your code, caches and audit log stay on your machine.
67
+ - 🪶 **Runs with or without Node.** The `native` backend is pure Python; the
68
+ `cli` backend bridges the real `openclaw` / `clawhub` binaries for full parity.
69
+ - 🌐 **Bring your own market.** ClawHub, SkillHub, the official China mirror, a
70
+ GitHub index — or add your own adapter in a few lines.
71
+
72
+ <p align="center">
73
+ <img src="docs/assets/architecture.svg" alt="How Omnilimb fits: Hermes brain → Omnilimb deterministic tools → skills/sandbox/browser/runtime" width="100%" />
74
+ </p>
75
+
76
+ ## The tools
77
+
78
+ Omnilimb registers these structured-JSON tools the agent can call:
79
+
80
+ | Tool | What it does |
81
+ |------|--------------|
82
+ | `claw_skill_search` | Search the ClawHub / SkillHub registry |
83
+ | `claw_skill_install` | Install + verify a skill (slug / `git:owner/repo@ref` / local path) |
84
+ | `claw_skill_run` | Deterministically run a skill's script entrypoint |
85
+ | `claw_sandbox_exec` | Run a command in an isolated (Docker) sandbox with rollback |
86
+ | `claw_browser` | Playwright browser automation via a structured action list |
87
+ | `claw_runtime` | Quick snippet in python / node / bash / ruby / go |
88
+ | `claw_skill_list` | List locally installed skills and their provenance |
89
+ | `claw_skill_runs` | Recent run history for installed skills (diagnostics) |
90
+
91
+ <p align="center">
92
+ <img src="docs/assets/tools.svg" alt="The eight Omnilimb tools plus the optional dashboard UI" width="100%" />
93
+ </p>
94
+
95
+ ## Quickstart
96
+
97
+ **As a pip package:**
98
+
99
+ ```bash
100
+ pip install omnilimb # core
101
+ pip install "omnilimb[browser]" # + Playwright
102
+ playwright install chromium # one-time browser download
103
+ hermes plugins enable omnilimb
104
+ ```
105
+
106
+ **As a directory plugin (simplest):**
107
+
108
+ ```bash
109
+ cp -r omnilimb ~/.hermes/plugins/omnilimb
110
+ hermes plugins enable omnilimb
111
+ ```
112
+
113
+ Verify inside a session:
114
+
115
+ ```
116
+ /exo doctor
117
+ ```
118
+
119
+ ### Try it locally — no Hermes, no GUI
120
+
121
+ The plugin is a headless engine; the way to *feel* it is to call its tools and
122
+ read the JSON they return:
123
+
124
+ ```bash
125
+ python scripts/demo.py doctor # backend status
126
+ python scripts/demo.py search github 5 # live ClawHub search
127
+ python scripts/demo.py runtime python "print(6*7)"
128
+ python scripts/demo.py sandbox "echo hi"
129
+ python scripts/demo.py menu # interactive
130
+ ```
131
+
132
+ ## Pick your market
133
+
134
+ Switch the skills marketplace with `omnilimb.market` (or `OMNILIMB_MARKET`):
135
+
136
+ | Market | Source | Notes |
137
+ |--------|--------|-------|
138
+ | `clawhub` (default) | clawhub.ai | Official OpenClaw registry, HTTP API v1 |
139
+ | `skillhub` | api.skillhub.cn | China-focused market; server-side search, public zip download |
140
+ | `clawhub-cn` | mirror-cn.clawhub.com | Official China mirror (Volcengine) |
141
+ | `skillsmp` | skillsmp.com | GitHub-hosted skill index |
142
+
143
+ Add more under `omnilimb.markets` in `~/.hermes/config.yaml` (each is
144
+ `{id, type, base_url, label}` where `type` is one of
145
+ `clawhub | skillhub | clawhub_mirror | skillsmp`). A new adapter class in
146
+ `omnilimb/registries.py` is all it takes to support a new kind of market.
147
+
148
+ ## Pick your backend
149
+
150
+ Set `omnilimb.backend` in `~/.hermes/config.yaml` (or `OMNILIMB_BACKEND`):
151
+
152
+ | Mode | Behaviour |
153
+ |------|-----------|
154
+ | `cli` | Bridges to the real `openclaw` / `clawhub` CLIs. Best registry parity. Requires Node + OpenClaw. |
155
+ | `native` | Fully decoupled Python substrate. No Node. Handles sandbox/browser/runtime + `git:`/local skill installs natively. |
156
+ | `auto` (default) | `cli` if the `openclaw` binary is on PATH, else `native`. |
157
+
158
+ ## Dashboard UI (optional)
159
+
160
+ A dependency-free web UI ships in `dashboard/` for the Hermes dashboard. After
161
+ enabling the plugin and restarting `hermes dashboard`, an **Omnilimb** tab
162
+ appears (after *Skills*) with:
163
+
164
+ - **Search** — discovery across markets (leaderboards, categories) + a per-skill
165
+ health check (体检).
166
+ - **Installed** — view/edit `SKILL.md`, run, smoke-test, manage credentials,
167
+ check readiness, import/export, uninstall.
168
+ - **Favorites** — bookmarked skills.
169
+ - **Audit** — the optional JSONL audit log.
170
+ - **Settings** — backend / market / cache / paths + diagnostics.
171
+
172
+ The UI follows the active dashboard theme and language automatically.
173
+
174
+ ### See it in action
175
+
176
+ Live skill search, a one-click **health check (体检)** with a transparent 0–100
177
+ score, and installed-skill management — all in the dashboard tab (click to enlarge):
178
+
179
+ <table>
180
+ <tr>
181
+ <td width="33%" valign="top"><a href="docs/assets/ui-search.jpg"><img src="docs/assets/ui-search.jpg" alt="Live skill search for PPT across markets"/></a><br/><sub><b>Search</b> — live ClawHub results for “PPT”.</sub></td>
182
+ <td width="33%" valign="top"><a href="docs/assets/ui-healthcheck.jpg"><img src="docs/assets/ui-healthcheck.jpg" alt="Per-skill health check with score breakdown"/></a><br/><sub><b>Health check</b> — transparent 0–100 score.</sub></td>
183
+ <td width="33%" valign="top"><a href="docs/assets/ui-installed.jpg"><img src="docs/assets/ui-installed.jpg" alt="Installed-skills management"/></a><br/><sub><b>Installed</b> — manage everything you’ve added.</sub></td>
184
+ </tr>
185
+ </table>
186
+
187
+ > 🌐 Project site: **[omnilimb.com](http://www.omnilimb.com)**
188
+
189
+ ## Configure (`~/.hermes/config.yaml`)
190
+
191
+ ```yaml
192
+ omnilimb:
193
+ backend: auto # auto | cli | native
194
+ market: clawhub # clawhub | skillhub | clawhub-cn | skillsmp
195
+ sandbox_enabled: true
196
+ sandbox_image: "python:3.12-slim"
197
+ sandbox_network: false
198
+ default_timeout_s: 120
199
+ max_retries: 2
200
+ rollback: true
201
+ registry_base_url: "https://clawhub.ai"
202
+ browser_headless: true
203
+ audit_log: false # write a JSONL audit log of tool calls
204
+ cache_enabled: true # local SQLite cache for discovery + search fallback
205
+ discover_ttl_s: 21600 # discovery leaderboard cache TTL (6h)
206
+ cache_max_age_s: 604800 # max staleness for offline search fallback (7d)
207
+ ```
208
+
209
+ Settings changed from the dashboard's **Settings** tab are written to a separate
210
+ overrides file (`omnilimb.overrides.json`), never to your hand-authored
211
+ `config.yaml`. Resolution order is `env > overrides > config.yaml`.
212
+
213
+ ## Security
214
+
215
+ Third-party skills are untrusted code. Prefer `claw_sandbox_exec` with
216
+ `network: false` for anything you don't fully trust. Without Docker, sandbox
217
+ calls run locally and are flagged `"sandboxed": false`. Skill file operations
218
+ and uninstall are path-traversal guarded; archive extraction is zip-slip
219
+ protected. See [`SECURITY.md`](SECURITY.md) to report a vulnerability.
220
+
221
+ ## Development
222
+
223
+ ```bash
224
+ pip install -e ".[dev,browser]"
225
+ pytest -q
226
+ ```
227
+
228
+ See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the architecture rules (the plugin
229
+ never imports or modifies Hermes core, every handler returns JSON and never
230
+ raises) and how to add a market or backend.
231
+
232
+ ## License &amp; editions
233
+
234
+ > **This is an early test / community edition, licensed under MIT — free to use.
235
+ > A future stable version will adopt an AGPLv3 + commercial dual-license; please
236
+ > plan accordingly.**
237
+
238
+ This repository contains the **free community edition** only. It is feature-
239
+ complete for finding, installing, running, and managing OpenClaw / ClawHub
240
+ skills locally. Commercial/Pro capabilities (skill → native Hermes conversion,
241
+ AI curation, curated packs, auto-update, assistant console) are **not** part of
242
+ this edition and are planned for a future Pro release under a separate license.
243
+
244
+ MIT — see [`LICENSE`](LICENSE). Not affiliated with OpenClaw / ClawHub.
@@ -0,0 +1,221 @@
1
+ <p align="center">
2
+ <img src="docs/assets/banner.svg" alt="Omnilimb — give your Hermes agent hands & feet" width="100%" />
3
+ </p>
4
+
5
+ <p align="center">
6
+ <a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-36e0c0.svg"></a>
7
+ <img alt="Python" src="https://img.shields.io/badge/Python-3.10%2B-5b8cff.svg">
8
+ <img alt="Status" src="https://img.shields.io/badge/edition-free%20community-5b8cff.svg">
9
+ <img alt="Tokens" src="https://img.shields.io/badge/execution%20path-0%20extra%20LLM%20tokens-36e0c0.svg">
10
+ <a href="http://www.omnilimb.com"><img alt="Website" src="https://img.shields.io/badge/web-omnilimb.com-9aa4be.svg"></a>
11
+ </p>
12
+
13
+ <p align="center">
14
+ <b>English</b> · <a href="README.zh-CN.md">简体中文</a>
15
+ &nbsp;|&nbsp; 🌐 <a href="http://www.omnilimb.com">omnilimb.com</a>
16
+ </p>
17
+
18
+ # Omnilimb
19
+
20
+ **Your Hermes agent is the brain. Omnilimb is the hands and feet.**
21
+
22
+ Omnilimb is a Hermes plugin that lets an agent *find, install, run and manage*
23
+ [OpenClaw / ClawHub](https://clawhub.ai) community skills — and gives it an
24
+ isolated sandbox, a real Playwright browser, and multi-language runtimes. Every
25
+ capability is exposed as a small, **deterministic structured-JSON tool** the
26
+ agent calls directly, so there are **zero extra LLM tokens on the execution
27
+ path** and no second "agent loop" burning your budget.
28
+
29
+ > ℹ️ Compatible with OpenClaw &amp; ClawHub; not affiliated with them.
30
+ > "Omnilimb" is an independent product ([omnilimb.com](http://www.omnilimb.com)).
31
+
32
+ ---
33
+
34
+ ## Why Omnilimb
35
+
36
+ - ⚡ **Zero token overhead.** The execution path never calls a model. The agent
37
+ decides *once*; Omnilimb does the work deterministically and hands back JSON.
38
+ - 🧰 **A whole toolbox, one small surface.** Eight tools cover skill discovery,
39
+ install, run, sandbox, browser, and runtimes — no sprawling API to learn.
40
+ - 🛡️ **Safe by default.** Third-party skills run in a Docker sandbox with the
41
+ network off and automatic rollback. Path-traversal and zip-slip guarded.
42
+ - 🔌 **No lock-in, no phone-home.** Search talks only to the market you pick.
43
+ Your code, caches and audit log stay on your machine.
44
+ - 🪶 **Runs with or without Node.** The `native` backend is pure Python; the
45
+ `cli` backend bridges the real `openclaw` / `clawhub` binaries for full parity.
46
+ - 🌐 **Bring your own market.** ClawHub, SkillHub, the official China mirror, a
47
+ GitHub index — or add your own adapter in a few lines.
48
+
49
+ <p align="center">
50
+ <img src="docs/assets/architecture.svg" alt="How Omnilimb fits: Hermes brain → Omnilimb deterministic tools → skills/sandbox/browser/runtime" width="100%" />
51
+ </p>
52
+
53
+ ## The tools
54
+
55
+ Omnilimb registers these structured-JSON tools the agent can call:
56
+
57
+ | Tool | What it does |
58
+ |------|--------------|
59
+ | `claw_skill_search` | Search the ClawHub / SkillHub registry |
60
+ | `claw_skill_install` | Install + verify a skill (slug / `git:owner/repo@ref` / local path) |
61
+ | `claw_skill_run` | Deterministically run a skill's script entrypoint |
62
+ | `claw_sandbox_exec` | Run a command in an isolated (Docker) sandbox with rollback |
63
+ | `claw_browser` | Playwright browser automation via a structured action list |
64
+ | `claw_runtime` | Quick snippet in python / node / bash / ruby / go |
65
+ | `claw_skill_list` | List locally installed skills and their provenance |
66
+ | `claw_skill_runs` | Recent run history for installed skills (diagnostics) |
67
+
68
+ <p align="center">
69
+ <img src="docs/assets/tools.svg" alt="The eight Omnilimb tools plus the optional dashboard UI" width="100%" />
70
+ </p>
71
+
72
+ ## Quickstart
73
+
74
+ **As a pip package:**
75
+
76
+ ```bash
77
+ pip install omnilimb # core
78
+ pip install "omnilimb[browser]" # + Playwright
79
+ playwright install chromium # one-time browser download
80
+ hermes plugins enable omnilimb
81
+ ```
82
+
83
+ **As a directory plugin (simplest):**
84
+
85
+ ```bash
86
+ cp -r omnilimb ~/.hermes/plugins/omnilimb
87
+ hermes plugins enable omnilimb
88
+ ```
89
+
90
+ Verify inside a session:
91
+
92
+ ```
93
+ /exo doctor
94
+ ```
95
+
96
+ ### Try it locally — no Hermes, no GUI
97
+
98
+ The plugin is a headless engine; the way to *feel* it is to call its tools and
99
+ read the JSON they return:
100
+
101
+ ```bash
102
+ python scripts/demo.py doctor # backend status
103
+ python scripts/demo.py search github 5 # live ClawHub search
104
+ python scripts/demo.py runtime python "print(6*7)"
105
+ python scripts/demo.py sandbox "echo hi"
106
+ python scripts/demo.py menu # interactive
107
+ ```
108
+
109
+ ## Pick your market
110
+
111
+ Switch the skills marketplace with `omnilimb.market` (or `OMNILIMB_MARKET`):
112
+
113
+ | Market | Source | Notes |
114
+ |--------|--------|-------|
115
+ | `clawhub` (default) | clawhub.ai | Official OpenClaw registry, HTTP API v1 |
116
+ | `skillhub` | api.skillhub.cn | China-focused market; server-side search, public zip download |
117
+ | `clawhub-cn` | mirror-cn.clawhub.com | Official China mirror (Volcengine) |
118
+ | `skillsmp` | skillsmp.com | GitHub-hosted skill index |
119
+
120
+ Add more under `omnilimb.markets` in `~/.hermes/config.yaml` (each is
121
+ `{id, type, base_url, label}` where `type` is one of
122
+ `clawhub | skillhub | clawhub_mirror | skillsmp`). A new adapter class in
123
+ `omnilimb/registries.py` is all it takes to support a new kind of market.
124
+
125
+ ## Pick your backend
126
+
127
+ Set `omnilimb.backend` in `~/.hermes/config.yaml` (or `OMNILIMB_BACKEND`):
128
+
129
+ | Mode | Behaviour |
130
+ |------|-----------|
131
+ | `cli` | Bridges to the real `openclaw` / `clawhub` CLIs. Best registry parity. Requires Node + OpenClaw. |
132
+ | `native` | Fully decoupled Python substrate. No Node. Handles sandbox/browser/runtime + `git:`/local skill installs natively. |
133
+ | `auto` (default) | `cli` if the `openclaw` binary is on PATH, else `native`. |
134
+
135
+ ## Dashboard UI (optional)
136
+
137
+ A dependency-free web UI ships in `dashboard/` for the Hermes dashboard. After
138
+ enabling the plugin and restarting `hermes dashboard`, an **Omnilimb** tab
139
+ appears (after *Skills*) with:
140
+
141
+ - **Search** — discovery across markets (leaderboards, categories) + a per-skill
142
+ health check (体检).
143
+ - **Installed** — view/edit `SKILL.md`, run, smoke-test, manage credentials,
144
+ check readiness, import/export, uninstall.
145
+ - **Favorites** — bookmarked skills.
146
+ - **Audit** — the optional JSONL audit log.
147
+ - **Settings** — backend / market / cache / paths + diagnostics.
148
+
149
+ The UI follows the active dashboard theme and language automatically.
150
+
151
+ ### See it in action
152
+
153
+ Live skill search, a one-click **health check (体检)** with a transparent 0–100
154
+ score, and installed-skill management — all in the dashboard tab (click to enlarge):
155
+
156
+ <table>
157
+ <tr>
158
+ <td width="33%" valign="top"><a href="docs/assets/ui-search.jpg"><img src="docs/assets/ui-search.jpg" alt="Live skill search for PPT across markets"/></a><br/><sub><b>Search</b> — live ClawHub results for “PPT”.</sub></td>
159
+ <td width="33%" valign="top"><a href="docs/assets/ui-healthcheck.jpg"><img src="docs/assets/ui-healthcheck.jpg" alt="Per-skill health check with score breakdown"/></a><br/><sub><b>Health check</b> — transparent 0–100 score.</sub></td>
160
+ <td width="33%" valign="top"><a href="docs/assets/ui-installed.jpg"><img src="docs/assets/ui-installed.jpg" alt="Installed-skills management"/></a><br/><sub><b>Installed</b> — manage everything you’ve added.</sub></td>
161
+ </tr>
162
+ </table>
163
+
164
+ > 🌐 Project site: **[omnilimb.com](http://www.omnilimb.com)**
165
+
166
+ ## Configure (`~/.hermes/config.yaml`)
167
+
168
+ ```yaml
169
+ omnilimb:
170
+ backend: auto # auto | cli | native
171
+ market: clawhub # clawhub | skillhub | clawhub-cn | skillsmp
172
+ sandbox_enabled: true
173
+ sandbox_image: "python:3.12-slim"
174
+ sandbox_network: false
175
+ default_timeout_s: 120
176
+ max_retries: 2
177
+ rollback: true
178
+ registry_base_url: "https://clawhub.ai"
179
+ browser_headless: true
180
+ audit_log: false # write a JSONL audit log of tool calls
181
+ cache_enabled: true # local SQLite cache for discovery + search fallback
182
+ discover_ttl_s: 21600 # discovery leaderboard cache TTL (6h)
183
+ cache_max_age_s: 604800 # max staleness for offline search fallback (7d)
184
+ ```
185
+
186
+ Settings changed from the dashboard's **Settings** tab are written to a separate
187
+ overrides file (`omnilimb.overrides.json`), never to your hand-authored
188
+ `config.yaml`. Resolution order is `env > overrides > config.yaml`.
189
+
190
+ ## Security
191
+
192
+ Third-party skills are untrusted code. Prefer `claw_sandbox_exec` with
193
+ `network: false` for anything you don't fully trust. Without Docker, sandbox
194
+ calls run locally and are flagged `"sandboxed": false`. Skill file operations
195
+ and uninstall are path-traversal guarded; archive extraction is zip-slip
196
+ protected. See [`SECURITY.md`](SECURITY.md) to report a vulnerability.
197
+
198
+ ## Development
199
+
200
+ ```bash
201
+ pip install -e ".[dev,browser]"
202
+ pytest -q
203
+ ```
204
+
205
+ See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the architecture rules (the plugin
206
+ never imports or modifies Hermes core, every handler returns JSON and never
207
+ raises) and how to add a market or backend.
208
+
209
+ ## License &amp; editions
210
+
211
+ > **This is an early test / community edition, licensed under MIT — free to use.
212
+ > A future stable version will adopt an AGPLv3 + commercial dual-license; please
213
+ > plan accordingly.**
214
+
215
+ This repository contains the **free community edition** only. It is feature-
216
+ complete for finding, installing, running, and managing OpenClaw / ClawHub
217
+ skills locally. Commercial/Pro capabilities (skill → native Hermes conversion,
218
+ AI curation, curated packs, auto-update, assistant console) are **not** part of
219
+ this edition and are planned for a future Pro release under a separate license.
220
+
221
+ MIT — see [`LICENSE`](LICENSE). Not affiliated with OpenClaw / ClawHub.
@@ -0,0 +1,114 @@
1
+ """Omnilimb — Hermes plugin.
2
+
3
+ Turns OpenClaw / ClawHub's mature execution substrate (skill registry, local
4
+ sandbox, Playwright browser automation, multi-language runtimes, retry/rollback)
5
+ into a set of structured-JSON tools for Hermes.
6
+
7
+ Design:
8
+ - Hermes is the brain (LLM/conversation/memory/UI).
9
+ - Omnilimb is the hands/feet (deterministic execution). It NEVER calls an
10
+ LLM itself -> zero extra model tokens on the execution path.
11
+ - Two interchangeable backends, switchable via config:
12
+ * "cli" -> shells out to the real `openclaw` / `clawhub` CLIs.
13
+ * "native" -> a decoupled Python re-implementation (no Node dependency).
14
+ * "auto" -> cli if the `openclaw` binary is present, else native.
15
+
16
+ Every tool handler:
17
+ - has signature `handler(args: dict, **kwargs) -> str`
18
+ - ALWAYS returns a JSON string (success and error alike)
19
+ - NEVER raises
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ import logging
25
+
26
+ from . import schemas, tools
27
+ from .config import get_settings
28
+
29
+ logger = logging.getLogger(__name__)
30
+
31
+ __version__ = "0.8.0"
32
+
33
+
34
+ def _cli_available() -> bool:
35
+ """check_fn used to hide CLI-only behaviour gracefully (never raises)."""
36
+ try:
37
+ from .backends.cli_backend import openclaw_binary
38
+
39
+ return openclaw_binary() is not None
40
+ except Exception: # pragma: no cover - defensive
41
+ return False
42
+
43
+
44
+ def _tools_available() -> bool:
45
+ """Tools are available whenever a backend can be resolved.
46
+
47
+ The CLI backend needs the `openclaw` binary; the native backend always
48
+ resolves. So tools are available unless the user pinned `backend: cli`
49
+ without installing the CLI.
50
+ """
51
+ try:
52
+ settings = get_settings()
53
+ if settings.backend == "cli":
54
+ return _cli_available()
55
+ return True
56
+ except Exception: # pragma: no cover - defensive
57
+ return True
58
+
59
+
60
+ def register(ctx) -> None:
61
+ """Entry point called once at startup. Wires schemas -> handlers.
62
+
63
+ If this function raises, Hermes disables the plugin but keeps running, so we
64
+ keep it defensive and side-effect-light.
65
+ """
66
+ pairs = (
67
+ ("claw_skill_search", schemas.CLAW_SKILL_SEARCH, tools.claw_skill_search),
68
+ ("claw_skill_install", schemas.CLAW_SKILL_INSTALL, tools.claw_skill_install),
69
+ ("claw_skill_list", schemas.CLAW_SKILL_LIST, tools.claw_skill_list),
70
+ ("claw_skill_runs", schemas.CLAW_SKILL_RUNS, tools.claw_skill_runs),
71
+ ("claw_skill_run", schemas.CLAW_SKILL_RUN, tools.claw_skill_run),
72
+ ("claw_sandbox_exec", schemas.CLAW_SANDBOX_EXEC, tools.claw_sandbox_exec),
73
+ ("claw_browser", schemas.CLAW_BROWSER, tools.claw_browser),
74
+ ("claw_runtime", schemas.CLAW_RUNTIME, tools.claw_runtime),
75
+ )
76
+
77
+ for name, schema, handler in pairs:
78
+ ctx.register_tool(
79
+ name=name,
80
+ toolset="omnilimb",
81
+ schema=schema,
82
+ handler=handler,
83
+ check_fn=_tools_available,
84
+ )
85
+
86
+ # Ship an opt-in "how to drive me" skill. Not in the system-prompt index,
87
+ # so it costs zero standing tokens until the agent explicitly loads it.
88
+ try:
89
+ from pathlib import Path
90
+
91
+ skill_md = Path(__file__).parent / "skills" / "omnilimb" / "SKILL.md"
92
+ if skill_md.exists():
93
+ ctx.register_skill("omnilimb", skill_md)
94
+ except Exception as exc: # pragma: no cover - optional
95
+ logger.debug("omnilimb: skill registration skipped: %s", exc)
96
+
97
+ # Diagnostics slash command: /exo status
98
+ try:
99
+ ctx.register_command(
100
+ "exo",
101
+ handler=tools.slash_claw,
102
+ description="Omnilimb status / backend / diagnostics",
103
+ args_hint="[status|backend|doctor]",
104
+ )
105
+ except Exception as exc: # pragma: no cover - optional
106
+ logger.debug("omnilimb: slash command skipped: %s", exc)
107
+
108
+ s = get_settings()
109
+ logger.info(
110
+ "omnilimb v%s registered (backend=%s, resolved=%s)",
111
+ __version__,
112
+ s.backend,
113
+ s.resolved_backend(),
114
+ )