From 8e5b35c0462bb48e6787e4952b9e97cc0919f4af Mon Sep 17 00:00:00 2001 From: Andreas Trawoeger Date: Tue, 20 Oct 2026 17:36:52 +0200 Subject: [PATCH] feat(skills): move the openclaw-cmd skill body beside its candy The check-family skill body leaves candy/plugin-openclaw/charly.yml for .agents/skills/openclaw-cmd/SKILL.md beside the candy, keeping full YAML frontmatter. The node content: and description: blocks are deleted; the description is unreachable after migration because skills_collect.go reads s.Description only on its sf == nil branch. Two files, 102/96. --- .../.agents/skills/openclaw-cmd/SKILL.md | 102 ++++++++++++++++++ candy/plugin-openclaw/charly.yml | 96 ----------------- 2 files changed, 102 insertions(+), 96 deletions(-) create mode 100644 candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md diff --git a/candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md b/candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md new file mode 100644 index 0000000..f3e7bca --- /dev/null +++ b/candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md @@ -0,0 +1,102 @@ +--- +name: openclaw-cmd +description: 'the `openclaw:` check verb — probe a running OpenClaw 2.0 gateway (health/ready/startup + + via the /healthz /readyz /startupz HTTP probe endpoints, status/models/channels/version + + via the in-venue CLI), served out-of-process by plugin-openclaw; the probe surface + is + + verified against npm `openclaw@2026.9.8`.' +--- + +# openclaw — gateway check verb + +## Overview + +`openclaw:` probes a running [OpenClaw](https://openclaw.ai) 2.0 gateway, +served out-of-process over go-plugin gRPC by `opencharly/plugin-openclaw`. +The probe surface below is verified against npm `openclaw@2026.9.8`. +Install the gateway itself with `/charly-openclaw:openclaw` +(opencharly/layer-openclaw). + +## Why it is not the `http:` verb + +`http:` already does URL + status + body/header matchers. This verb exists +for what `http:` structurally cannot do: + +- **Endpoint resolution.** `cc.ResolveEndpoint` turns the in-venue gateway + port into a host-reachable address, so one authored step works unchanged + against a pod's published port and a VM's forwarded one. +- **Domain semantics.** Methods map to the gateway's real probe surface and + return real verdicts, with `json_path:` to assert one field instead of + pattern-matching a JSON blob. +- **In-venue CLI.** The status/models/channels methods run the `openclaw` + binary inside the venue over the reverse channel — `http:` cannot reach + the gateway CLI at all. + +## Methods + +| Group | Methods | +|---|---| +| HTTP probes (host-side) | `health` (`/healthz` — liveness only) `ready` (`/readyz` — readiness, and the endpoint that reports recorded terminal database failures) `startup` (`/startupz` — startup progress) | +| In-venue CLI | `status` (`openclaw status --all`) `models` (`openclaw models status`) `channels` (`openclaw channels status`) `version` (`openclaw --version`) | + +All methods are read-only — there are no mutating methods in this first cut. + +## Input fields + +| Field | Meaning | +|---|---| +| `method` | the operation (also the scalar-sugar primary: `openclaw: health`) | +| `port` | gateway port (default 18789) | +| `timeout` | HTTP probe timeout (default 10s) | +| `json_path` | dotted path into the response; stdout becomes that value | + +## Scalar shorthand + +```yaml +openclaw: health # scalar sugar +openclaw: # map form — identical meaning + method: health +``` + +Both parse. The sugar is enabled by this candy's `plugin.primary: {openclaw: +method}`, which charly reads in a PRE-CONNECT prescan — so the plugin candy +must be composed into the box that authors the step. + +## Examples + +```yaml +# Liveness — the 2.0 container probe. +- check: the gateway's /healthz liveness endpoint reports ok + openclaw: health + stdout: [{contains: ok}] + eventually: 60s + retry_interval: 5s + context: [runtime] + +# Readiness — configured channels healthy. +- check: the gateway is ready + openclaw: ready + context: [runtime] + +# Assert ONE field instead of matching a blob. +- check: the gateway reports ok + openclaw: + method: health + json_path: status + stdout: [{equals: ok}] + context: [runtime] + +# Gateway state via the in-venue CLI. +- check: the gateway CLI reports its model status + openclaw: models + context: [runtime] +``` + +## Cross-References + +- `/charly-openclaw:openclaw` — the candy that installs the gateway +- `/charly-check:check` — the check orchestrator, beds and the R10 sequence +- `/charly-internals:plugin` — the out-of-process plugin model this verb follows diff --git a/candy/plugin-openclaw/charly.yml b/candy/plugin-openclaw/charly.yml index f11fb72..bd4679b 100644 --- a/candy/plugin-openclaw/charly.yml +++ b/candy/plugin-openclaw/charly.yml @@ -53,101 +53,5 @@ openclaw-skill: name: openclaw-cmd family: check owner: plugin-openclaw - description: |- - the `openclaw:` check verb — probe a running OpenClaw 2.0 gateway (health/ready/startup - via the /healthz /readyz /startupz HTTP probe endpoints, status/models/channels/version - via the in-venue CLI), served out-of-process by plugin-openclaw; the probe surface is - verified against npm `openclaw@2026.9.8`. triggers: - "the `openclaw:` check verb / probing an OpenClaw gateway from a candy or box plan" - content: | - # openclaw — gateway check verb - - ## Overview - - `openclaw:` probes a running [OpenClaw](https://openclaw.ai) 2.0 gateway, - served out-of-process over go-plugin gRPC by `opencharly/plugin-openclaw`. - The probe surface below is verified against npm `openclaw@2026.9.8`. - Install the gateway itself with `/charly-openclaw:openclaw` - (opencharly/layer-openclaw). - - ## Why it is not the `http:` verb - - `http:` already does URL + status + body/header matchers. This verb exists - for what `http:` structurally cannot do: - - - **Endpoint resolution.** `cc.ResolveEndpoint` turns the in-venue gateway - port into a host-reachable address, so one authored step works unchanged - against a pod's published port and a VM's forwarded one. - - **Domain semantics.** Methods map to the gateway's real probe surface and - return real verdicts, with `json_path:` to assert one field instead of - pattern-matching a JSON blob. - - **In-venue CLI.** The status/models/channels methods run the `openclaw` - binary inside the venue over the reverse channel — `http:` cannot reach - the gateway CLI at all. - - ## Methods - - | Group | Methods | - |---|---| - | HTTP probes (host-side) | `health` (`/healthz` — liveness only) `ready` (`/readyz` — readiness, and the endpoint that reports recorded terminal database failures) `startup` (`/startupz` — startup progress) | - | In-venue CLI | `status` (`openclaw status --all`) `models` (`openclaw models status`) `channels` (`openclaw channels status`) `version` (`openclaw --version`) | - - All methods are read-only — there are no mutating methods in this first cut. - - ## Input fields - - | Field | Meaning | - |---|---| - | `method` | the operation (also the scalar-sugar primary: `openclaw: health`) | - | `port` | gateway port (default 18789) | - | `timeout` | HTTP probe timeout (default 10s) | - | `json_path` | dotted path into the response; stdout becomes that value | - - ## Scalar shorthand - - ```yaml - openclaw: health # scalar sugar - openclaw: # map form — identical meaning - method: health - ``` - - Both parse. The sugar is enabled by this candy's `plugin.primary: {openclaw: - method}`, which charly reads in a PRE-CONNECT prescan — so the plugin candy - must be composed into the box that authors the step. - - ## Examples - - ```yaml - # Liveness — the 2.0 container probe. - - check: the gateway's /healthz liveness endpoint reports ok - openclaw: health - stdout: [{contains: ok}] - eventually: 60s - retry_interval: 5s - context: [runtime] - - # Readiness — configured channels healthy. - - check: the gateway is ready - openclaw: ready - context: [runtime] - - # Assert ONE field instead of matching a blob. - - check: the gateway reports ok - openclaw: - method: health - json_path: status - stdout: [{equals: ok}] - context: [runtime] - - # Gateway state via the in-venue CLI. - - check: the gateway CLI reports its model status - openclaw: models - context: [runtime] - ``` - - ## Cross-References - - - `/charly-openclaw:openclaw` — the candy that installs the gateway - - `/charly-check:check` — the check orchestrator, beds and the R10 sequence - - `/charly-internals:plugin` — the out-of-process plugin model this verb follows