The Triform CLI
The Triform CLI is the fastest way to drive your platform from a terminal. The
classic platform client is triform, with triform-cli kept as a
compatibility alias. The installer also provides the local triton agent
(triton2 is its temporary compatibility alias) and a
MCP server (triform-mcp).
One install gives you all of it: a chat agent, a uniform command for every element operation, and the MCP bridge your editor’s agent can call.
Quickstart
Three commands take you from nothing to a live call:
# 1. Install (auto-detects your OS + architecture)
curl -fsSL https://triform.cloud/downloads/install.sh | sh
# 2. Authenticate (opens your browser; or use a token — see Authenticate)
triform auth login
# 3. List the tools available in your circle
triform tools
If triform isn’t found after step 1, add the install dir to your PATH (the
installer prints the exact line) and re-open your shell:
export PATH="$HOME/.triform/bin:$PATH"
Install
The installer detects your OS/arch, downloads the matching prebuilt binary,
verifies each SHA-256 checksum, and installs triform, triform-cli,
triform-mcp, triton, and triton2 into ~/.triform/bin. The platform CLI
and local agent have independent release channels and cannot update over one
another. Prebuilt binaries are published for
Linux (x86_64, arm64), macOS (Apple Silicon + Intel), and Windows
(x86_64).
Linux & macOS:
curl -fsSL https://triform.cloud/downloads/install.sh | sh
Windows (PowerShell):
irm https://triform.cloud/downloads/install.ps1 | iex
Options (set as environment variables before the command):
TRIFORM_VERSION=0.1.2— pin a specific version instead of the latest.TRITON_VERSION=0.2.0— independently pin the local agent version.TRIFORM_BIN_DIR=/usr/local/bin— install somewhere other than~/.triform/bin.
Verify
triform --version # prints the version + build SHA
triform --help # full command reference
triton --version # local-agent version
triton --help # local-agent command reference
Troubleshooting
-
triform: command not found— the install dir isn’t on yourPATH. Addexport PATH="$HOME/.triform/bin:$PATH"to your shell rc (~/.zshrc,~/.bashrc) and re-open the terminal. -
macOS “cannot be opened because the developer cannot be verified” — the installer already strips the Gatekeeper quarantine flag; if you moved the binary by hand, run
xattr -dr com.apple.quarantine ~/.triform/bin/triform. -
macOS binary not found right after a brand-new release — Mac builds are added natively shortly after each release, so a just-cut version may briefly lag. Retry in a moment, pin an older version with
TRIFORM_VERSION=…, or build from source (no SDK needed beyond the Xcode Command Line Tools):cargo build --release -p triform-cli -p triform-mcp # then copy target/release/{triform,triform-mcp} onto your PATH # build the local agent separately from the triton/ workspace
Authenticate
Triform talks to a circle on your behalf. Authenticate once and it remembers:
triform auth login # interactive browser login
triform auth login --no-browser # print a URL to open elsewhere (headless / SSH)
triform auth set-api-key <trif_…> # use a bearer token instead of a browser
triform auth status # show who you're authenticated as
triform auth logout # clear stored credentials
For production (triform.cloud) and CI, don’t use a browser login — mint a
trif_ token from an api-token element in your circle and pass it to
triform auth set-api-key, or set it inline with TRIFORM_API_KEY. See
Authentication & access.
Point the CLI at a target and circle (persisted in your config):
triform config show # the resolved circle + URLs
triform config set-circle <name> # default circle for commands
triform config set-url <url> # API target, e.g. https://triform.cloud
You can also override per-command with --circle, --api-url, and --api-key
(or the matching TRIFORM_CIRCLE / TRIFORM_API_URL / TRIFORM_API_KEY
environment variables).
Platform chat
The classic CLI retains its server-backed chat path for compatibility:
triform # open chat; prompts for login when needed
triform "your prompt" # open chat with an initial prompt
triform -p "your prompt" # print one response and exit (scriptable)
triform -p --raw "prompt" # print only the response body and exit
triform -c # continue the latest chat in this directory
triform -r <conversation> # resume a specific chat by name or id
Work locally with Triton
Triton runs its agentic loop on your machine, executes tools in the current working directory, and sends model traffic only through the Triform platform gateway:
triton # interactive local agent
triton "summarize this repository" # start with a prompt
triton prompt "fix the failing test" # one non-interactive turn
triton circle status # circle-aware git porcelain
triton update --check # check only the triton-v* channel
Authenticate once with triform auth login; Triton reuses the same platform
session and never asks for a vendor API key.
Manage elements
Slug-addressed shorthands cover the element lifecycle without remembering URLs:
triform create <slug> --type <T> --name <N> [--description <D>] [--circle <C>]
triform get <slug> # fetch an element (with its _actions/_lifecycle)
triform delete <slug> --confirm
triform enable <slug>
triform disable <slug>
Call any element operation
Every element operation is reachable as a uniform CLI command — the same shape
for a python function, an sql query, or a slack message:
triform tools # list the tools available in your circle
triform <tool> <action> [--field value ...]
triform <tool> --action <action> [--field value ...]
triform <tool> --input '{"field":"value"}'
triform <tool> --help # schema + actions for one tool
Slug-addressed fields (like --slug) resolve against your default circle, so
set one first with triton config set-circle (or pass --circle /
TRIFORM_CIRCLE per-command, as shown above) — without it you’ll see a
Missing path param: element_path error.
Control the output format with -o json|yaml|table (default table).
The tool catalog the CLI scripts, the MCP server exposes to agents, and the HTTP API serves are the same surface — a workflow you script one way is callable verbatim the others.
Wire it into your coding agent (MCP)
The installer also drops triform-mcp. Point any MCP-capable agent at it and it
gains the same tool catalog. For example, with Claude Code:
claude mcp add triform \
--env TRIFORM_API_URL=https://triform.cloud \
--env TRIFORM_API_KEY=trif_your_token \
-- "$HOME/.triform/bin/triform-mcp"
See the MCP server guide for other clients and the full tool surface.
Prefer your own editor + Claude Code?
The CLI isn’t the only way in. Your circle is a real git repo — you can
git clone it and run Claude Code (or any agent) directly against a normal
checkout, no MCP bridge required. See
Clone your circle + run Claude Code.
Related
- Clone your circle + run Claude Code — skip the CLI, work in your own editor
- MCP server — the same tools over the Model Context Protocol
- API structure — the underlying HTTP surface
- Authentication & access — tokens, sessions, and circles
Command reference
A complete index of every verb the triton and triform CLIs accept at
top level. Each entry shows the literal spelling, the most useful flags,
and the help string the CLI itself prints. If triton --help and this
page ever disagree, this page is wrong — open an IMPROVE.
Platform verbs
auth
triform auth <login|set-api-key|status|logout>
The CLI’s own help output (from triform auth --help):
Usage:
triform auth register
triform auth register --username <name> --password <pw> --email <addr>
triform auth login
triform auth login --circle <circle>
triform auth login --no-browser
triform auth login --clone [--dir <path>] # clone the circle after login
triform auth login --no-clone # skip the clone offer
triform auth login --dev-circle <circle>
triform auth passwd # change your password (prompts)
triform auth passwd --current <pw> --new <pw>
triform auth set-api-key <token>
triform auth status
triform auth logout
triform auth ... # compatibility alias
config
triform config <set-circle|set-url|set-chat-url|show>
The CLI’s own help output (from triform config --help):
Usage: triform config <set-circle NAME|set-repo-path PATH|set-url URL|set-chat-url URL|show>
tools
triform tools
List the tools available in your circle. Output format follows -o json|yaml|table (default table).
chat
A bare triform with no subcommand opens chat; the CLI itself prints the canonical spellings:
triform Open Triform chat; prompts for login when needed
triform "prompt" Open Triform chat with an initial prompt
triform -p "prompt" Print one Triform response and exit
triform -p --raw "prompt" Print only the response body and exit
triform -c Continue the latest Triform chat
triform -r <conversation> Resume a Triform chat
help
triform help
Prints the same help as triform --help (the clap-rendered usage block
plus the TOOL_HELP after-block).
update
triform update [--check]
Self-update to the latest released CLI. --check reports whether a newer
release is available without swapping the binary.
crew
The CLI’s own help output (from triform crew --help):
triform crew — orchestrate a crew of triformer agents
Usage:
triform crew list List triformers in the circle
triform crew delegate --to <slug> "<prompt>" [--wait] [--workspace <path>]
Delegate a task to one agent
triform crew status <delegation_id> Check a delegation's status/result
triform crew cancel <delegation_id> [--reason "..."]
Cancel a running delegation
triform crew sessions List recent agent sessions
triform crew signals [--limit N] [--type <event_type>]
List agent tool-level signals
triform crew health Agent health summary (success rate, tool calls)
triform crew orchestrate <plan-file> Fan out a plan of delegations and
wait for all to finish
Plan file (JSON or YAML) for `orchestrate`:
{ "tasks": [ { "to": "ada", "prompt": "..." },
{ "to": "helm", "prompt": "..." } ] }
Flags:
--to <slug> Target agent slug (delegate)
--wait Poll until the delegation reaches a terminal state
--workspace <p> Workspace path to focus the delegate on (repeatable)
--reason "<text>" Cancellation reason (cancel)
--limit N Max signals to return (signals; default 50)
--type <t> Filter signals by event_type (e.g. agent.tool.failed)
The circle is taken from --circle, $TRIFORM_CIRCLE, or `triform config set-circle`.
init
triform init [--reauth]
triform init — set up a local workspace for your circle
triform init [--reauth]
Logs you in (if needed), mints a git access token for your circle, clones the
circle's repo (draft branch) into a folder you choose, and remembers it so
`triform sync` can keep it live.
--reauth force minting a fresh git token even if one is already stored
After init:
triform push publish local edits to the draft branch
triform sync continuously pull draft changes into your local folder
sync
triform sync [--once] [--interval <seconds>]
--once pull a single time and exit
--interval <secs> poll interval (default 15)
clone, push, build, promote, status, deploy
The git-native deploy group. The CLI’s own help output (from triform clone --help and the matching verbs):
triform git-native deploy commands
triform clone <circle> [--dir <path>] [--no-recurse]
Recursively clone a whole circle (every element as a submodule) at the
draft branch, then pull each element's latest draft tip.
triform push [--element <path>]
git push HEAD:draft for the element repo in the current directory
(advances source + reconciles spec; does NOT build/deploy).
triform build [--element <path>] [--clean]
POST ops/build — the deploy step for an SPA (serve reads builds/latest).
triform promote <demo|live> [--element <path>]
POST ops/source/promote — the release (draft->demo->live ref move).
triform deploy [--element <path>] [--clean] [--promote <demo|live>]
push HEAD:draft -> build -> optional promote, in order.
triform status [--element <path>]
Show source/status (branches, clone URL) for the element repo.
Auth: uses the resolved token (see `triform auth`). For git against another
circle, that token must be scoped to it — generate a trif_ token from an
api-token element in the circle (a personal login token is refused by git).
--element defaults to "<circle>" for clone, else is inferred from the element
repo's remote. <circle> for clone is taken from the arg or --circle/TRIFORM_CIRCLE.
Element shorthand verbs
These verbs are slug-addressed shorthands that translate to a real
triform <tool> <action> call. The positional <slug>, when bare
(single segment), is resolved under the current circle (--circle /
TRIFORM_CIRCLE); for a nested element, give the full circle-rooted
ancestry — e.g. triform get my-circle/my-lab/my-eyes — the CLI does
not compose parent segments.
create
triform create <slug> --type T --name N [--description D] [--circle C]
--type is accepted as an alias for --element-type (the canonical
element-tool flag). All other arguments below are forwarded to the
element tool unchanged.
--element-path is the PARENT path and must itself be a full
circle-rooted path (e.g. my-circle/my-parent), not a bare parent slug.
Parent segments are never composed from --slug — give the whole
ancestry explicitly. IMPROVE-5001.
get
triform get <slug>
Fetch an element (with its _actions / _lifecycle attachment).
delete
triform delete <slug> --confirm
--confirm is required; the CLI will refuse without it.
disable
triform disable <slug>
Suspend element execution. Reads still succeed; ops are rejected.
enable
triform enable <slug>
Resume element execution.
Generated tool commands
Every element operation is reachable as a uniform CLI command. The CLI itself documents the four invocation patterns:
Generated tool commands:
triform <tool> <action> [--field value ...]
triform <tool> --action <action> [--field value ...]
triform <tool> --input '{"field":"value"}' (aliases: --json, --patch)
triform <tool> --help
Run triform tools to list the tools available in your circle, and
triform <tool> --help to see a specific tool’s schema + actions.
The tool catalog the CLI scripts, the MCP server exposes to agents, and the HTTP API serves are the same surface — a workflow you script one way is callable verbatim the others.
Universal JSON-object flags
The CLI’s own help text (the same block is appended to every
triform <tool> --help output):
Universal JSON-object flags (accepted by every tool and every action):
--input '{...}' Merge a JSON object's keys into the top-level request
--json '{...}' Alias for --input
--patch '{...}' Alias for --input
--meta '{...}' Alias for --input
All four take one JSON OBJECT (not array/scalar); its keys are merged at
the top level of the request body, ADDING to any --field flags already
given. Example (op-uat update_meta recipe):
triform element update_meta --slug my-elem --meta '{"key":"value"}'