Skip to main content
The Tensormesh Platform CLI is the administrator command line for Tensormesh Platform. It is built for the platform and SRE engineers who run the cache: it reads LMCacheEngine resources and talks to the KV-cache server pod on each GPU node. The command itself is tmo-cli. It covers two surfaces:
  • the Kubernetes CRD (lmcacheengines.lmcache.lmcache.ai), for engine status, conditions, and endpoints
  • each server pod’s HTTP control API, reached through the Kubernetes API-server proxy, for cache state, quotas, and diagnostics
This is the cluster-side administrator CLI. It is not the Tensormesh CLI (tm), which manages accounts, billing, and serverless inference against the hosted API.

Install

The CLI ships with the gated Tensormesh Platform distribution rather than through public Homebrew or krew. It installs from the Tensormesh container registry (GHCR) using the same access token as the Platform chart and images. That token is scoped to artifact pull and grants no access to Tensormesh source code; if you don’t have one, request it from the Tensormesh team. It is the same token used in the install guide. The install script needs curl, tar, and either shasum or sha256sum.

One-line install

The script detects your OS and architecture, pulls the matching binary from GHCR, checks the archive against the digest recorded in the OCI manifest, and installs to /usr/local/bin, falling back to ~/.local/bin when that isn’t writable so no sudo is required. To pin a version or change the target, pass flags after -s --:
--version takes a release tag including the leading v, and defaults to latest. Each flag also has an environment-variable form: TMO_TOKEN, TMO_VERSION, TMO_INSTALL_DIR.

Manual install (air-gapped or CI)

To pull the artifact yourself, authenticate to GHCR and use oras:
Archives are named tmo-cli_<version>_<os>_<arch>.tar.gz, where <version> drops the leading v of the release tag. Builds are published for linux and darwin, on amd64 and arm64.

Verify

Shell completion

To install permanently, run tmo-cli completion <shell> --help and follow the instructions for your shell and platform.

How it connects

tmo-cli uses your existing kubeconfig. If kubectl works, tmo-cli works. Resolution order is --kubeconfig, then $KUBECONFIG, then the tmo-cli config default, then ~/.kube/config.
Commands that talk to engine pods (node, cache, quota, diag) go through the Kubernetes API-server proxy by default, so they need no network path beyond the one kubectl already uses and RBAC on pods/proxy gates them. Pass --direct to reach pod host IPs instead, which is useful when running inside the cluster.

Flags

Four flags are accepted by every command: The rest are command-scoped, and the scoping matters when you script:

Exit codes

Stable and scriptable. Changing one is a breaking change. diag health overloads 1: it exits 0 when every pod in scope is reachable and healthy, and 1 when any pod is unhealthy or unreachable. That makes it usable directly as a health gate in CI.

Common tasks

See the fleet

engine describe looks up recent events by default; pass --no-events to skip that call on a busy cluster.

Deploy or change engines (owned by Helm)

Fleet membership and engine spec belong to the Helm release. tmo-cli cannot create, apply, edit, or delete engines; those verbs exit 2 and point you at Helm. To add, change, or remove an engine, edit the chart values and run helm upgrade.
The CLI’s job in a rollout is the readiness gate afterwards:
--for accepts Available, AllInstancesReady, or ConfigValid, and defaults to AllInstancesReady. --timeout defaults to 5m. A timeout exits 5.

Inspect servers and cache state

engine logs shows the last 100 lines per pod; change that with --tail (-1 for the whole log).

Operate (destructive, gated)

cache clear bypasses read and write locks and drops L1 contents. It refuses while a server still has active sessions; add --force to clear anyway. It and quota rm print a blast-radius preamble and prompt for confirmation, which -y/--yes skips. In a non-TTY without --yes they exit 6 rather than guess.
Quotas are enforced only on engines running the IsolatedLRU eviction policy. Against any other policy the CLI accepts the command and warns, but the budget has no effect. Quota commands query one server (the first ready endpoint, or --node), since every server of an engine shares the same quota config.

Diagnose and file a ticket

diag loglevel set takes a logger and one of DEBUG, INFO, WARNING, ERROR, and applies to one server with --node or the whole engine with --all. diag bundle collects the CR, recent events, and each server’s /conf, /status, /threads, and /periodic-threads-health into a gzip tarball, writing to tmo-bundle-<engine>-<timestamp>.tgz unless you pass --output-file. Secret-looking values are redacted, and /env is excluded entirely unless you pass --include-env (it is still redacted). Attach the tarball to a support ticket.

Output and scripting

Table output is for reading. -o json and -o yaml are the automation contract, wrapped in an envelope carrying tmoOutputVersion: v1:
Use .healthy != true, not .healthy == false. A pod the CLI could not reach has no healthy field at all, only error, so an equality test silently drops the unreachable pods you are looking for.
Single-item commands render under .item, lists under .items. Color is disabled automatically in pipes and non-terminals, and never appears in JSON or YAML.

Troubleshooting

tmo-cli does not phone home. There is no active telemetry in the shipped build.