ov/skills/ssh/SKILL.md
Generic SSH support for ov — `--host <alias>` re-execs any command on a remote machine; `ov ssh tunnel` exposes remote SPICE/VNC endpoints on the local host for external GUI apps.
npx skillsauth add overthinkos/overthink-plugins ov:sshInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
MUST be invoked before any work involving: ov --host <alias|target>
remote execution, ov ssh tunnel port forwarding for external SPICE/VNC
viewers, or managing host aliases via ov settings set hosts.<alias>.
ov --host <alias> — re-exec any ov command on a remote machineSet --host (or OV_HOST) at the top level of any ov invocation.
ov shells out to the system ssh binary, runs ov <rest of argv> on
the remote host, and streams stdin/stdout/stderr through. Exit code
propagates.
# Alias setup (once per workstation):
ov settings set hosts.o o.atrawog.org
ov settings set hosts.prod [email protected]:2222
# Any ov verb works:
ov --host o status
ov --host o start openclaw
ov --host o vm list
ov --host o deploy add host fedora-coder
ov --host o test spice status arch
ov --host o test spice screenshot arch - > /tmp/local.png # stdout pipes back
LocalOnly commands are NOT re-execed, even when --host is set:
ov settings …, ov version, ov ssh tunnel …. These manage the local
workstation (settings file, CLI version, local tunnel listener) and
would be meaningless on the remote host.
Transport: system ssh binary via os/exec, so ~/.ssh/config,
agent forwarding, and ControlMaster all work transparently. If your
target needs a specific key, set it in ~/.ssh/config — ov stays out
of SSH authentication.
Client-only flags stripped before re-exec: --host, --dir / -C,
--repo, --kdbx. These are workstation-local concerns and must not be
forwarded to the remote side.
ov ssh tunnel — expose a remote VM's display for external GUI appsFor apps that aren't ov (virt-viewer, remote-viewer with a bare URL,
TigerVNC, Spicy), open an SSH-forwarded local endpoint:
ov ssh tunnel spice <vm> [--uri qemu+ssh://user@host/session] [--tcp]
ov ssh tunnel vnc <vm> [--uri qemu+ssh://user@host/session] [--tcp]
Default mode preserves the wire format: UNIX socket in, UNIX socket out
(local path under /tmp/ov-tunnel-<id>.sock). --tcp forces a
127.0.0.1:<random> TCP listener for clients that don't understand
spice+unix:// / vnc+unix://.
$ ov ssh tunnel spice arch --uri qemu+ssh://o.atrawog.org/session
spice tunnel: spice+unix:///tmp/ov-tunnel-8e4c.sock
Connect with: remote-viewer spice+unix:///tmp/ov-tunnel-8e4c.sock
Press Ctrl-C to close the tunnel.
Blocks until SIGINT/SIGTERM; closes listener + SSH client cleanly on exit.
Not needed for virt-manager or remote-viewer --connect qemu+ssh://
— those auto-forward UNIX-socket listeners through libvirt's RPC
fd-passing, with zero ov involvement. See /ov-vms:arch.
| Command | Effect |
|---|---|
| ov settings set hosts.<alias> <ssh-target> | create/update alias |
| ov settings get hosts.<alias> | print resolved target |
| ov settings reset hosts.<alias> | delete alias |
| ov settings list | show all settings including host_aliases map |
<ssh-target> forms: host, user@host, user@host:port. When
resolving, plain words that look like aliases (no @, no .) are
looked up in hosts.*; anything else is treated as a raw ssh target
and passed through.
--hostov test libvirt|spice|vnc --uri qemu+ssh://…
instead; it runs ov locally and forwards the display channel over SSH.ov isn't installed on the remote machine → use --uri or
ov ssh tunnel./ov-vms:arch — "Connecting from a remote workstation" —
the canonical worked example across all three paths./ov:settings — hosts.<alias> key schema./ov:spice — --uri + --socket flags on ov test spice./ov:libvirt — --uri flag on every ov test libvirt verb./ov:vnc — ov test vnc vm <name> … subcommand group.tools
Use when authoring or modifying a charly PLUGIN — a candy with a `plugin:` block that contributes Providers (verbs/kinds/deploy-targets/steps/builders/commands), its own CUE schema, builtin (compiled-in) or external (out-of-tree git repo). Covers the unified Provider model, the per-plugin CUE-schema contract (single source → Go params for dev + schema-over-Describe RPC for runtime), the SDK, and the loader.
tools
The CUE data-validation / configuration CLI (cue), pinned to v0.16.1. Use when working with the cue candy, installing the cue binary into a box or onto a target:local dev host, or running the offline schema-vendoring pipeline that feeds charly's egress validation.
tools
CUE EGRESS validation — validating (and, where it adds value, generating) the config files charly WRITES to a system BEFORE the bytes hit disk. MUST be invoked before working on charly/egress.go, the vendored schemas under candy/plugin-egress/egress-schemas/vendor/, the ValidateEgress / registerVendoredEgressKind path, the offline `task cue:vendor` pipeline, or adding an egress schema for any written artifact (cloud-init, k8s manifests, traefik routes, runtime config, install ledger, systemd/quadlet units, ssh_config, libvirt XML).
tools
Kubernetes cluster-probe declarative check verb — the `kube:` check verb (nodes, pods, ingress, storage class, addon health, apply/delete, and arbitrary resource GETs) served out-of-process by the candy/plugin-kube plugin (vendored client-go; no external kubectl required).