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.
- omnilimb-0.8.0/LICENSE +32 -0
- omnilimb-0.8.0/PKG-INFO +244 -0
- omnilimb-0.8.0/README.md +221 -0
- omnilimb-0.8.0/omnilimb/__init__.py +114 -0
- omnilimb-0.8.0/omnilimb/_cache.py +123 -0
- omnilimb-0.8.0/omnilimb/_errors.py +54 -0
- omnilimb-0.8.0/omnilimb/_retry.py +64 -0
- omnilimb-0.8.0/omnilimb/_scoring.py +236 -0
- omnilimb-0.8.0/omnilimb/backends/__init__.py +42 -0
- omnilimb-0.8.0/omnilimb/backends/base.py +56 -0
- omnilimb-0.8.0/omnilimb/backends/cli_backend.py +184 -0
- omnilimb-0.8.0/omnilimb/backends/native_backend.py +559 -0
- omnilimb-0.8.0/omnilimb/config.py +200 -0
- omnilimb-0.8.0/omnilimb/dashboard/__init__.py +6 -0
- omnilimb-0.8.0/omnilimb/dashboard/dist/index.js +1508 -0
- omnilimb-0.8.0/omnilimb/dashboard/dist/style.css +638 -0
- omnilimb-0.8.0/omnilimb/dashboard/manifest.json +15 -0
- omnilimb-0.8.0/omnilimb/dashboard/plugin_api.py +1357 -0
- omnilimb-0.8.0/omnilimb/plugin.yaml +25 -0
- omnilimb-0.8.0/omnilimb/registries.py +514 -0
- omnilimb-0.8.0/omnilimb/schemas.py +202 -0
- omnilimb-0.8.0/omnilimb/skills/omnilimb/SKILL.md +75 -0
- omnilimb-0.8.0/omnilimb/tools.py +821 -0
- omnilimb-0.8.0/omnilimb.egg-info/PKG-INFO +244 -0
- omnilimb-0.8.0/omnilimb.egg-info/SOURCES.txt +30 -0
- omnilimb-0.8.0/omnilimb.egg-info/dependency_links.txt +1 -0
- omnilimb-0.8.0/omnilimb.egg-info/entry_points.txt +2 -0
- omnilimb-0.8.0/omnilimb.egg-info/requires.txt +7 -0
- omnilimb-0.8.0/omnilimb.egg-info/top_level.txt +1 -0
- omnilimb-0.8.0/pyproject.toml +41 -0
- omnilimb-0.8.0/setup.cfg +4 -0
- 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.
|
omnilimb-0.8.0/PKG-INFO
ADDED
|
@@ -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
|
+
| 🌐 <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 & 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 & 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.
|
omnilimb-0.8.0/README.md
ADDED
|
@@ -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
|
+
| 🌐 <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 & 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 & 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
|
+
)
|