Agent CLI

Platform

Upload assets, manage sandbox variables, rebuild the sandbox image, and check integrations, analytics, budget, and usage from the terminal.

Everything on this page drives the same /v1 API the dashboard uses. Install and authenticate first: Agent CLI.

Assets

agent asset stores PNG images past the sandbox they were made in, each behind a link gated on org membership, so it grants nothing by possession and is safe to paste anywhere your team reads. The primary caller is an agent that screenshotted a UI change and wants a link for its PR comment, but the same commands work from your laptop. The workflow: Add screenshots to every pull request.

agent asset upload stores a PNG (10 MiB limit) and prints only the URL, so a script or an agent can capture it directly:

$ agent asset upload schedule-grid.png
https://app.ellipsis.dev/assets/9f2c4b7d1e8a4c02b6f3a1d5e7c90842

A file that is not a PNG fails before upload, and the error names what it actually is (only PNG images are supported (got what looks like JPEG)).

agent asset list shows stored assets newest first (--session <id> scopes to one session's uploads, -l/--limit caps results at up to 250); agent asset get prints one asset's metadata, or downloads its bytes with -o:

$ agent asset list --limit 2
ID                                FILENAME           SIZE       CREATED           SESSION
9f2c4b7d1e8a4c02b6f3a1d5e7c90842  schedule-grid.png  312.4 KiB  2026-07-30 15:21  session_7Hq2mX4p
4c81d95f2ab74e6f90d3c7b8a1e52f04  trade-modal.png    189.7 KiB  2026-07-28 11:46  session_3Vd8nQ2j
$ agent asset get 9f2c4b7d1e8a4c02b6f3a1d5e7c90842 -o schedule-grid.png
✓ wrote schedule-grid.png (312.4 KiB)

agent asset delete (alias rm) removes an asset, so its link stops resolving. A missing, foreign, or already-deleted id prints asset not found: <asset-id> and exits nonzero. An agent's own in-sandbox token cannot delete, so an agent cannot destroy the evidence it posted. Every verb accepts --json (on get, the JSON includes a short-lived download_url; fetch it immediately).

Variables

agent variable (aliases var, env) manages the variables injected into every sandbox, the store that a config's sandbox.variables entries resolve from. Values are write-only: you can set and delete them, never read them back. Injecting them into an agent: Defining the environment.

agent variable list                    # names and timestamps; values stay hidden
agent variable set LOG_LEVEL=debug     # inline KEY=VALUE pairs (several at once)
agent variable set --from-file .env    # or load from a .env or flat-JSON file
agent variable delete NPM_TOKEN        # delete one variable (alias rm)

set accepts inline pairs, -f/--from-file, or both; file pairs load first, so an inline pair with the same name wins.

$ agent variable set NPM_TOKEN=npm_9vKq3xTd8wYz SENTRY_DSN=https://4b7d@o1192.ingest.sentry.io/6301
✓ stored 2 variable(s) (values hidden): NPM_TOKEN, SENTRY_DSN
NAME        CREATED           UPDATED
NPM_TOKEN   2026-07-31 09:40  2026-07-31 09:40
SENTRY_DSN  2026-07-31 09:40  2026-07-31 09:40

An agent's own in-sandbox token can list variable names but not set or delete them, so a prompt-injected agent cannot overwrite your credentials.

Rebuild

agent session start --rebuild skips the sandbox image cache for that session: a fresh full build (image layers, clones, image.setup), whose snapshot then refreshes the cache for later sessions. Combined with a verification prompt, this tests a config's environment definition end to end; the session streams every provisioning phase, and the full log persists as a download.

agent session start --config-file agents/ci-triager.yaml --rebuild --watch "Verify this environment: run gh auth status and pytest --version."

The rest of the workflow: Testing the environment.

Integrations

agent integration shows which integrations are connected, in one table, so you know what a config can name before writing it:

$ agent integration
INTEGRATION  STATUS         DETAILS
github       connected      splitshift-hq (Organization), 5 repos, all repositories
slack        connected      Splitshift (T04J8K2LM)
linear       connected      2 teams, 2 enabled
jira         not connected
sentry       connected      splitshift

List resources: agent github repos, agent slack channels, agent linear teams, agent sentry orgs

One command per resource lists what a connected integration can reach:

agent github repos      # repositories the GitHub installation can reach
agent github members    # org roster, with linked Slack identities
agent slack channels    # channels in the connected Slack workspace
agent slack members     # workspace members, with linked GitHub identities
agent linear teams      # Linear teams, marking which have Ellipsis enabled
agent sentry orgs       # connected Sentry organizations

agent github members lists the logins that --author filters accept elsewhere in the CLI, and the member tables show cross-linked identities both ways: a GitHub member's linked Slack user id, a Slack member's linked GitHub login. A Slack or Linear command against an unconnected workspace says so (Slack is not connected. Connect it in the Ellipsis dashboard, then retry.); Sentry lists nothing, because for Sentry the organization is the connection. Every command accepts --json.

Analytics and budget

agent analytics answers the same questions as the dashboard's analytics page, from the terminal: pull request and review activity across the org, human and bot alike.

agent analytics reviewer --account-type bot     # which apps review the most PRs
agent analytics pr --days 90                    # PR volume and trend, human vs bot
agent analytics review --repo splitshift-api    # review totals, verdicts, top reviewers
$ agent analytics reviewer --account-type bot --limit 3
reviewer         reviews  approved  changes req  comments  lines reviewed
ellipsis[bot]    214      168       31           492       61,408
dependabot[bot]  57       0         0            57        4,912
vercel[bot]      31       0         0            31        0

All three take the window flags --days <n> (default 30, mutually exclusive with --since) and --since/--until, which accept ISO 8601 or today, yesterday, N days ago. --account-type is all, user (humans), or bot (apps and agents). reviewer adds -r/--repo (owner/name, repeatable), --sort reviews|approved|changes-requested|comments|lines, and -l/--limit (default 10). pr adds --status open|draft|merged|closed (repeatable). review adds -r/--repo (bare name, repeatable), --author (reviewer login, repeatable), --review-state APPROVED|CHANGES_REQUESTED|COMMENTED (repeatable), and -l/--limit.

agent budget shows this period's spend against the account budget, and agent usage breaks the period's tokens and cost down by model. What the numbers mean and how limits work: Billing.

$ agent budget
period:     monthly
spent:      $37.41 of $100.00 (37.4%)
remaining:  $62.59
pause at limit: yes
$ agent usage
period:  2026-07-02 → 2026-07-31
tokens:  9,381,204
cost:    $41.62

by model:
  claude-opus-5                    6,942,310  $33.78
  claude-haiku-4-5-20251001        2,438,894  $7.84

Both accept --json for the raw numbers, so a cron job can watch spend with agent budget --json | jq .fraction_used.