Expose OpenClaw skills management via obol CLI#196
Closed
Conversation
OpenClaw has built-in skill support (list, info, check) but the obol CLI only exposed "skills sync". This fills that gap: - `obol openclaw skills list <id>` — list skills via kubectl exec passthrough - `obol openclaw skills info <id> <name>` — skill details via passthrough - `obol openclaw skills check <id>` — readiness check via passthrough - `obol openclaw skills add <id> <slug>` — install from clawhub registry + sync - `obol openclaw skills remove <id> <name>` — remove + re-sync remaining - `obol openclaw skills sync <id> --from ./dir` — (existing) direct sync The query commands (list, info, check) delegate to the in-pod openclaw binary via kubectl exec — zero reimplementation. The mutation commands (add, remove) manage a per-instance skills directory on the host and sync to the pod's ConfigMap. Skill hierarchy follows OpenClaw's loading precedence: bundled (image) < managed < workspace (ConfigMap mount) Skills installed via "add" land in the workspace tier, which has highest precedence and cleanly overrides bundled defaults.
The ConfigMap name must match what the Helm chart creates (openclaw-skills), not include the instance ID. Also restart the deployment after ConfigMap updates so the init container re-extracts skills, and handle the last-skill-removed case with an empty archive to ensure the extracted directory is cleaned.
Three skills for OpenClaw agents to interact with the Obol Stack: - obol-blockchain: Ethereum RPC via eRPC gateway with rpc.py helper, ERC-20 reference, and verified contract addresses - obol-k8s: Kubernetes awareness via ServiceAccount API with kube.py helper (pods, logs, events, deployments, configmaps) - obol-dvt: DVT cluster monitoring via Obol API, imported from obol-mcp PR #3 with curl fallback and API examples All facts verified on-chain and against official documentation.
Agent validation uncovered issues in all 3 skills: obol-dvt (FAIL → PASS): - Rewrote api-examples.md: 5 of 7 response shapes from obol-mcp PR #3 were wrong (lock nested under cluster_definition, effectiveness is dict keyed by pubkey with time-period scores, exit summary uses operator_exits dict, techne returns tiers object, badges have name/description/qualified fields) - Fixed all workflow scripts in SKILL.md to match real API fields - Added gold tier to Techne (API returns it, was previously removed) obol-blockchain (WARN → PASS): - Added Paths section with absolute pod path - Fixed misleading "always works" comment on evm/chainId curl example obol-k8s (WARN → PASS): - Added Paths section with absolute pod path - Fixed constraints: describe outputs JSON, not human-readable text - Added configmaps to Quick Start examples Also adds skills/_tests/smoke_test.py (18 tests, all passing).
Collaborator
Author
OpenClaw Skills: Test Suite Results (#180)Three OpenClaw skills created, fact-checked, and validated end-to-end in the running cluster. Skills Overview
Part 1: Smoke Tests (18/18 PASS)Automated test script ( Part 2: Agent-Driven ValidationThree Claude agents each read a SKILL.md and attempted the documented workflows as if they were an OpenClaw agent. Results after fixes:
Fact-Checking (Prior Commit)All facts verified on-chain or against official sources:
DVT API Response Shape Fixes (Detail)The original api-examples.md was imported from
How to Run Smoke Testsobol kubectl exec -i -n openclaw-default deploy/openclaw -- \
python3 - < skills/_tests/smoke_test.py |
This was referenced Feb 19, 2026
Collaborator
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
We don't expose the skill management of OpenClaw — the
obol openclaw skillscommand only hadsync. OpenClaw's CLI has full skills introspection (list,info,check) and the clawhub registry provides install/update, but none of this was surfaced through the obol wrapper.This PR fills that gap:
obol openclaw skills list <id>openclaw skills listobol openclaw skills info <id> <name>openclaw skills infoobol openclaw skills check <id>openclaw skills checkobol openclaw skills add <id> <slug>clawhub install→ ConfigMap syncobol openclaw skills remove <id> <name>obol openclaw skills sync <id> --fromDesign
list,info,check) passthrough to the in-pod openclaw binary via kubectl exec. Zero reimplementation.add,remove) manage a per-instance skills directory at<deployment>/skills/and sync to the pod's ConfigMap.addusesclawhub install --dir(via npx fallback) to install from the registry.Skill hierarchy
Follows OpenClaw's loading precedence (later overrides earlier):
openclaw-bundled— built into the container imageopenclaw-managed—~/.config/obol/skills/inside containeropenclaw-workspace— ConfigMap mount (wheresync/addputs skills)Skills installed via
addland in the workspace tier (highest precedence), cleanly overriding bundled defaults.Testing with clawhub
Test plan
TestSkillsDir— path construction for managed skills directoryTestSkillsNotRemoteCapable— skills routes through kubectl execTestSkillsRemove_MissingDeployment— error on missing deploymentTestSkillsRemove_SkillNotFound— error on missing skillTestSkillsRemove_LastSkill— removes dir, skips sync when emptyTestSkillsRemove_WithRemainingSkills— removes target, preserves othersTestSkillsAdd_MissingDeployment— error on missing deploymentTestSkillsAdd_CreatesManagedDir— creates skills dir before binary lookupTestFindClawHub_ReturnsErrorWhenMissing— error when no clawhub/npxTestSkillsDirStructure— skills dir nested under deployment dirTestRemoteCapableCommands— updated to include skills as non-remotego test ./...passesgo build ./cmd/obolsucceeds