Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 102 additions & 0 deletions candy/plugin-openclaw/.agents/skills/openclaw-cmd/SKILL.md
Original file line number Diff line number Diff line change
@@ -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
96 changes: 0 additions & 96 deletions candy/plugin-openclaw/charly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading