The exo CLI
Headless ops from the terminal. Drive your cluster's agents and tools, manage dashboard resources, replay sessions, and sync skills — without opening the browser.
The exo CLI is a single static binary with no runtime dependencies. It talks to two places at once: the Exo dashboard API (for tenant resources like deployments, roles, and skills) and your cluster's Exo Operator (for the in-cluster Agent and Tool custom resources). It caches its session to a file on disk and is the right tool for incident response — when the UI is the wrong shape, the CLI is the right shape.
Install
Download the binary, put it on your $PATH, and confirm the version. Builds ship for macOS (Intel and Apple Silicon), Linux (amd64 and arm64), and Windows.
1# macOS / Linux2chmod +x exo3sudo mv exo /usr/local/bin/4 5exo versionLogin
exo login opens a browser against your Exo endpoint, runs the tenant's sign-in flow (password, OAuth, or SSO), and writes the resulting token to ~/.config/exo/credentials.json (mode 0600). Subsequent commands pick the cached session up automatically.
1exo login --endpoint https://exo.example.com2# Opening browser to https://exo.example.com/login?cli_callback=...3# ✓ Authenticated as ada@example.comTwo surfaces, one binary
Commands fall into two families, and it helps to know which is which when a call fails:
- Cluster commands (
agent,tool,invocation) reach your cluster through its kubeconfig — they proxy to theagentkube-managerservice in theagentkube-systemnamespace. Point them with--kubeconfig,--context, or--manager-url. - Dashboard commands (
deployment,session,audit,skill,role,team,idp, and the other resource verbs) call the Exo API directly with your bearer token fromexo login.
Command reference
1# Session2exo login Authenticate (browser, or --email/--password for CI)3exo logout Delete cached credentials4exo whoami Show the authenticated user5exo me identity Show identity; "exo me permissions" shows effective perms6exo version Print the CLI version7exo tui | exo ui Launch the interactive terminal UI8 9# Cluster resources (via kubeconfig → Exo Operator)10exo agent list | get | create -f | delete | invoke | connect11exo tool list | get | create -f | delete | connect | exec | pause | status | test12exo invocation list | get # agent invocation CRs13 14# Dashboard resources (via Exo API, requires exo login)15exo deployment list | get | delete | rotate-token | retention | resources |16 sessions | invoke-agent | audit | casts17exo session list | get | tool-calls | resume # supervised sessions18exo audit search | export # tenant or per-deployment19exo skill list | get | create | update | delete | sync20exo role list | get | create | update | delete21exo team list | get | create | update | delete | add-user |22 remove-user | attach-role | detach-role23exo permission list | create | update | delete24exo idp list | get | create | update | delete25exo runtime-policy list | get | create | update | delete26exo guardrail list | get | create | update | delete27exo integration list | get | create | update | delete28exo provider list | get | create | update | delete29 30# Add --json to any command for machine-readable output.Interactive TUI
exo tui (alias exo ui) opens a full-screen browser for your tenant: pick a category — Agents, Tools, Deployments, Integrations, Providers, Roles, Teams, Skills — drill into the list, and inspect any resource. From an agent or tool, press c to connect; the TUI shells out to exo agent connect or exo tool connect for you, so you never copy a resource name by hand.
1↑ ↓ / k j move within a list2← → back / forward between panes3enter select · view detail · run the action4c connect to the selected agent or tool5q / esc quitCommon workflows
A few real incantations:
1# Run a supervised agent and drop into its shell2exo agent invoke prod/checkout-bot --reason "investigating stuck order"3 4# Or attach to an already-running supervised session5exo agent connect prod/checkout-bot1# Spin up a bastion pod for a Tool and get a shell with the2# connection string injected (PGHOST, PGPORT, …); auto-pauses when idle3exo tool connect prod/orders-db4exo tool exec prod/orders-db -- psql -c 'select count(*) from orders'1# Search the audit stream for one deployment2exo audit search --deployment <id> --since 2026-05-013 4# Download a session recording as an asciicast5exo deployment casts download <id> <cast-id> -o session.cast1# Materialise tenant skills into a local runtime layout2exo skill sync --runtime claude --output-dir . --prune3# writes ./.claude/skills/<name>/SKILL.md with exo: provenance frontmatterEnvironment & config
1EXO_ENDPOINT Dashboard API base URL (else credentials.json, else default)2EXO_TOKEN Raw bearer token — highest precedence3EXO_CLIENT_ID OAuth client credentials, exchanged at /api/v1/oauth/token4EXO_CLIENT_SECRET (used when no EXO_TOKEN / credentials.json is present)5EXO_CREDENTIALS Override path to credentials.json (default ~/.config/exo/)6EXO_MANAGER_URL Direct agentkube-manager URL (bypass the kube-apiserver proxy)7KUBECONFIG Kubeconfig for cluster commands8NO_COLOR Disable ANSI colour (https://no-color.org)Terraform
The terraform-provider-exo provider is the right tool for managed, reviewed, version-controlled changes — deployments, roles, IdPs. The CLI is the right tool for interactive work; the provider is the right tool for the work you don't want to do interactively. Both speak to the same API and produce the same audit trail.