tools/skills/ov/SKILL.md
Overthink CLI (ov) binary installed into container/VM images for in-container use. Use when working with ov binary deployment inside containers, native D-Bus support, or the full ov toolchain (ov binary + virtualization + gocryptfs + socat).
npx skillsauth add overthinkos/overthink-plugins ovInstall 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.
| Property | Value |
|----------|-------|
| Install files | task:, bin/ov |
The ov binary inside containers serves two purposes:
Native D-Bus agent — ov eval dbus commands on the host delegate to an in-venue ov via engine exec container ov eval dbus <cmd> . <args>, which connects to the local D-Bus session bus using godbus/dbus/v5 (pure Go, no external tools needed). The primary path for ov eval dbus notify, ov eval dbus call, ov eval dbus list, and ov eval dbus introspect. The image need NOT bake the ov layer for this: when the venue lacks ov, the explicit dbus commands COPY the host's own binary in on demand (the generic copy-ov-into-a-running-venue mechanism, EnsureOvInVenue over DeployExecutor.PutFile — podman cp for a container, scp for a VM/host) and invoke the delivered copy. Baking the layer only pre-stages the binary so the first call skips the copy.
In-container CLI — full ov functionality available inside the container for scripting, service management, and automation.
The ov layer's copy: bin/ov task is resolved relative to the layer directory, so the image build reads candy/ov/bin/ov — NOT the repo-root bin/ov. Two independent paths need to stay in sync:
| Path | Who reads it |
|------|-------------|
| bin/ov (repo root) | Host-side ov invocations; users running /tmp/ov style tests |
| candy/ov/bin/ov | The ov layer's COPY into images during ov box build |
Canonical workflow — task build:ov compiles to repo-root AND syncs to the layer:
task build:ov # Builds + syncs both paths; rebuild images after.
ov box build <image> # Rebuild affected images.
Manual workflow — if you skip task build:ov and build with go build directly, you MUST sync the layer path, or images will bake the previous binary:
cd ov && go build -o ../bin/ov . # Only updates repo-root bin/ov.
cp bin/ov candy/ov/bin/ov # REQUIRED — sync to layer path.
ov box build <image> # Rebuild affected images.
Why this bites: ov box build uses auto-generated intermediate images (e.g., ghcr.io/overthinkos/fedora-ov-2-dbus-nodejs) that cache the ov layer. If you update bin/ov in repo-root but forget the layer copy, the intermediate's cache hit serves stale content. After cleaning up a stale dual-path situation, podman rmi 'ghcr.io/overthinkos/fedora-ov-2*' forces a clean intermediate rebuild.
ov status ProbeThe ov probe checks:
ov binary exists in the containerov version)Shows as ov:ok (2026.94.1417) in ov status detail view. Returns - for images without the ov layer.
Note: ov version writes to stdout via fmt.Println (the prior
println(version) emitted to stderr; the move to fmt.Println landed
with the MCP server work so the in-process tool-call path — which
captures os.Stdout — returns the CalVer correctly). The layer test at
candy/ov/candy.yml asserts stdout: matches [0-9]{4}\.[0-9]+. The
ov status probe uses CombinedOutput() so it's agnostic to the
stream.
# box.yml -- now included in all images with supervisord
my-image:
layers:
- ov
ov layer is the full toolchain (ov binary + virtualization + gocryptfs + socat); composed into githubrunner, fedora-ov, arch-ov/ov-infrastructure:virtualization, /ov-infrastructure:gocryptfs, /ov-infrastructure:socat -- the layers the ov layer composes alongside the binary to form the full toolchain/ov-coder:ov-mcp -- layers: [ov, supervisord] meta-composition that deploys ov mcp serve (~192-tool MCP gateway) with a /workspace bind mount (volume NAME project) for build-mode tools + auto-fallback to overthinkos/overthink when nothing is bound/ov-infrastructure:dbus-layer -- D-Bus session bus (ov eval dbus commands need this)/ov-selkies:swaync -- notification daemon (needed for ov eval dbus notify to show popups)Use when the user asks about:
/ov-image:layer — layer authoring reference (candy.yml schema, task verbs, service declarations)/ov-eval:eval — declarative testing (eval: block, ov eval box, ov eval live)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).