InitOrigin

02 / terminal · Apache-2.0

io-cli

A terminal agent that shows you what it is allowed to do, what it is spending, and what it refused — while it works. The agent loop, the providers, the tools, the sandbox and the session store are all io-harness; none of them are reimplemented here.

from sourcegit clone https://github.com/initorigin/io-cli cargo build --release

It never takes your terminal

No alternate screen and no mouse capture, in any mode, behind any flag. Your terminal's search, selection and tmux copy-mode keep working, and a test fails the build if that changes.

Approvals in place

A write stops the run and shows the diff it proposes. Answer y, a or n and confirm with Enter, where it was asked — so a letter inside a sentence cannot decide a write. Allow for this session remembers that act on that target.

Your key, never on screen

The wizard verifies a key against the live endpoint, writes the file at mode 0600, and writes no key at all when the provider's own environment variable is already set.

Spend, and whether it worked

/cost commits the money and the token split by run, session, model and day; /stats commits the outcomes, first-try counts, gate failures and latencies. Nothing is estimated.

Thirty-six commands, in four groups

ioWith no subcommand, opens an interactive session in this repository
/modelChange the model the next turn is sent to — this session only
/resumeReopen an earlier session and answer whatever its last run stopped on
/statusCommit the whole session state into the scrollback: policy layers, sandbox backend, caps, budgets, connections

It never takes your terminal

io does not enter the alternate screen and does not capture the mouse, in any mode, behind any flag. Every finished message, tool call and system line is committed into the terminal's own scrollback; only a few rows at the bottom repaint.

So when the session ends the whole conversation is still there: your terminal's search finds it, tmux copy-mode scrolls it, a mouse drag selects it — none of which is implemented here. tests/structure.rs captures every byte io writes over a scripted session and fails if the alternate-screen or mouse-capture sequences appear.

Install

macOS · Linuxcurl -fsSL https://raw.githubusercontent.com/initorigin/io-cli/main/install.sh | sh
Windowsirm https://raw.githubusercontent.com/initorigin/io-cli/main/install.ps1 | iex
Homebrewbrew tap initorigin/io-cli https://github.com/initorigin/io-cli brew install initorigin/io-cli/io
Scoopscoop bucket add io-cli https://github.com/initorigin/io-cli scoop install io
From sourcegit clone https://github.com/initorigin/io-cli cargo build --release · binary at target/release/io · Rust 1.95+
cargo installNot a path. There is no crates.io publish — the distribution channel is the GitHub Release
IO_VERSION · IO_INSTALL_DIRInstall a specific version, or somewhere other than ~/.local/bin — %LOCALAPPDATA%\io\bin on Windows. Neither script needs administrator rights, and neither edits your PATH: if the directory is not on it, the script prints the line to add

Both scripts pick the right build for your machine, verify it against the published SHA256SUMS before unpacking, and install into a directory you own — no administrator rights, and no edit to your shell profile or PATH. The tap and the bucket live in this repository rather than in two of their own, which is why brew tap and scoop bucket add name a URL. There is no crates.io publish: Rust 1.95 or later to build from source.

Thirty-six commands, four groups

the session

/clear · /resume · /fork · /profile · /contain · /setup · /exit

this turn

/model · /effort · /undo · /plan · /steer · /compact · /image · /copy · /copy diff · /commit

inspect

/help · /status · /context · /expand · /fleet · /skills · /cost · /stats · /store · /export

configure

/config · /theme · /remember · /memory · /mcp · /provider · /plugin · /gates · /import

Grouped by what you are doing rather than by which part of the harness answers, and each group is capped at ten. Eleven of them run while a turn is in flight and the rest are refused — the rule is what a command does, not how harmless it looks.

Keys

Shift+TabChange the permission posture, from the next turn.
Esc EscAt an empty prompt, rewinds the last turn — its files, its memory and the conversation head.
Ctrl+FThe tree of children this turn has spawned, and what it is costing.
Ctrl+TCommit the last step’s full detail into the scrollback. Nothing here opens a pane.
Ctrl+CRefused in both spellings, deliberately.

The argv surface

ioWith no subcommand, opens an interactive session. Global flags: -C, -m, --profile, --plain, on either side of a subcommand.
io setupThe first-run wizard: provider, credential verified against the live endpoint, model, posture, theme.
io exec "<goal>"One goal to completion with no terminal interaction. Takes --json, --sandbox, --policy, --provider.
io resumeCarries on a run that stopped for a question, a plan or an interrupted call; --list shows what is waiting.
io acpServes the Agent Client Protocol on stdio as newline-delimited JSON-RPC 2.0. stdout is the protocol. An image and an embedded resource are declared, so an editor can hand over the file you have open.
io mcp · plugin · config · skillManage MCP servers, capability bundles, configuration keys and skills from a shell — the same parse the slash commands use.
io upgradePrints the command that updates the binary you are running, for the way it was installed. It prints and does not run.

Exit codes

0 · OKThe run finished.
1 · FAILEDThe run failed, or the command line was not understood.
2 · REFUSEDDenied, refused, or the plan was rejected.
3 · CEILINGA step, time, cost or budget ceiling was reached, and nothing judged the work.
4 · PAUSEDWaiting on a question, a plan, an approval or an interrupted call — resumable with io resume, except an approval.
5 · UNFINISHEDThe run ended in a state the table does not name.
6 · UNVERIFIEDThe work was judged and did not hold up: a failed verification gate, or a run that never satisfied its output schema.

Platform support

aarch64-apple-darwinmacOS, Apple silicon · io-harness’s own sandbox-exec
x86_64-apple-darwinmacOS, Intel · as above
x86_64-unknown-linux-muslLinux, statically linked · Landlock, bwrap, namespaces, floor
x86_64-pc-windows-msvcWindows · Job Object, with AppContainer opt-in

The four artifacts and their SHA256SUMS are attached to every GitHub Release, and the full test suite runs on Ubuntu, macOS and Windows in CI. What confines a command is io-harness's, not this product's — io shows you which backend actually answered on this host, in the footer, because the mode asked for and the backend that applied are not the same fact.

Skills, five shipped

Each one is a markdown file the agent reads when it needs it. Add and remove your own with /skills or io skill; the claimed name is the frontmatter name, and a duplicate costs the later one.

Guides