CLI options

Public flags and subcommands, with examples.

Documentation · Getting started · Slash commands

sh
octet --safe-mode --model claude-sonnet-4-6
octet -p "Explain the code" --tools read,search

This is the documented source surface, not generated help or release qualification. Uppercase metavariables are values you supply; square brackets mark optional arguments. Use octet --help, octet sessions --help, and octet migrate pi --help for authoritative parser details. The frozen docs are supplemented by a source inventory of static octet and octet setup declarations, not a captured --help dump. Unlisted nested-command choices, generated extension flags, and defaults are not inferred here.

Frontend, model, and workspace#

Form Contract
--print / -p, followed by prompt text Final response on stdout; does not itself remove tool authority.
--mode rpc Pi-compatible JSONL automation frontend; conflicts with --print. Separate from native-host protocol 1 and extension API 0.4; interface limits.
--plain Chronological frontend without cursor control.
--color VALUE Terminal color selection; documented example auto; capability fallbacks still apply.
--mouse auto|terminal|off|app Default auto; only app captures mouse and selects the semantic viewport from startup.
--show-reasoning Show reasoning rather than the default collapsed presentation.
--show-images Opt in to bounded inline tool-result display on compatible interactive terminals; off by default. Not upload permission or input-attachment consent. Display behavior.
--model ID Select model; explicitly overrides a resumed selection.
--reasoning LEVEL / --reasoning budget=N Model-capability-gated effort or compatible token budget. Exact levels.
--cache-retention VALUE Provider cache-retention selection; documented example short.
--max-turns N Bound model turns.
--workspace PATH Workspace root for relative tool paths and default bash cwd.
--workspace-trusted / --trust-workspace Admit project config/instructions/resources; cannot relax global safety floors or grant executable trust.
--no-context-files Do not compose context files.
--offline Skip optional discovery and disable remote media reads; inference can still use the network.
--strict-config Treat unknown configuration keys as errors; the default is a warning. Equivalent setting: strict_config = true.

Terminal behavior, provider setup, and configuration values are separate guides.

RPC assistant messages use the completed response's settled cost, not a fresh calculation from the current catalog. Their usage.cost is null when pricing is unknown; a known zero is distinct. Known total-dollar projections include sub-microdollar remainder, while exact integer cost remains in the session ledger. Aggregate scalar costs are known subtotals whenever usage is uncertain or an operation is unpriced.

Tools and limits#

Form Contract
--tools NAMES, --exclude-tools NAMES Final comma-separated allowlist/exclusions; e.g. read,search. Model schemas match the executable registry.
--powershell Additive opt-in for the Windows powershell tool; never replaces bash, conflicts with an exclusive --tools/--no-tools list, and reports itself inert on hosts without PowerShell.
--models PATTERNS Ordered, comma-separated model scope for selection and Ctrl+P cycling: provider/*, a literal provider/model, or a bare-id glob, each with an optional real :level suffix. The first requested match is the default for a new session; a miss warns without discarding the rest. /scoped-models persists the same ordered patterns.
--no-tools Disable tools; conflicts with --tools.
--no-edit Disable edit and write.
--no-write Disable complete-file write.
--no-process, --no-shell Equivalent no-command authority gates.
--allow-shell Enable the shell capability, not a bypass of independent process/effect gates.
--effect-policy controlled_bash_approval|controlled|unsafe_host Select effect admission; default unsafe_host.
--safe-mode Every bash call and workspace mutation requires approval; external paths forced off, executable extensions stopped. Conflicts with --effect-policy.
--shell-path PATH Explicit Bash-compatible shell; no $SHELL lookup.
--bash-timeout-secs N / --exec-timeout-secs N Command timeout in seconds; supplied config example 120.
--max-output-bytes N Output capture bound; supplied config example 1048576.
--allow-remote-read Opt-in HTTPS image/audio reads; default-off. Conflicts with --offline; offline configuration also disables remote reads.
--telemetry PATH Owner-only opt-in telemetry, separate from sessions; no raw prompts/tool payloads.

Tools and permissions explains why full access is not a sandbox. Hard token/cost ceilings also require an enforceable provider output limit. Routes that omit that bound, including Codex Responses, presets explicitly omitting max_output_tokens, and native Responses compaction, refuse hard-ceiling admission before dispatch. A catalog output maximum is not a substitute for a wire-enforced bound. Without those ceilings, the ordinary uncapped route remains available; this does not clear historical usage uncertainty.

Provider setup#

In the interactive first-run flow, an empty catalog with no explicit model selection opens Add an API key first, then Sign in with ChatGPT / other supported OAuth subscriptions, Local/self-hosted models, and Continue without a provider. API-key entry is masked and saved only after review to owner-private, recoverable storage; it is not a command-line secret argument. Subscription choices are ChatGPT (Codex) and GitHub Copilot. See first-run behavior and credential privacy. The octet setup subcommand below still configures explicit custom endpoints; print/RPC modes never open onboarding.

text
octet --login codex
octet --logout PROVIDER
# --headless is the provider-auth option; see generated help for its interaction.

octet setup --preset lm-studio --manual-model ID [--yes]
octet setup --endpoint URL [--api-key-env VAR] [--model ID|--manual-model ID] [--offline] [--yes]

--headless prints the device verification URL/code without opening a browser. The Copilot integration accepts --login copilot [--headless] and --logout copilot, also under the alias github-copilot. It uses only its private OAuth store, not environment or editor credentials. Online shared catalogs can then discover eligible github-copilot/<id> models; offline adds none. First-run subscription setup also offers this device flow, but TUI slash auth commands are not yet integrated. Native-host protocol 1 gains no auth command or credential field. Limits and unrun live qualification.

Setup reviews without writing by default. --yes commits only the reviewed transaction; --cancel leaves the registry unchanged. An explicit --preset lm-studio permits its default endpoint; otherwise choose --endpoint URL. --api-key-env VAR references a credential rather than embedding one. --model ID selects discovered inventory; --manual-model ID supplies a model when discovery is unsuitable. Use --offline --manual-model ID for no-probe recovery.

Additional setup options apply to either recipe:

Form Contract
--provider ID Choose the custom registry provider ID, not a display label or model transport ID.
--label LABEL Set the provider display label.
--no-auth Explicitly select no authentication instead of --api-key-env VAR.
--replace Permit replacement of an existing provider entry; does not bypass confirmation or stale-snapshot checks.
--cancel Cancel without writing the registry; not an offline/no-probe switch.

The pairs --api-key-env / --no-auth, --yes / --cancel, and --model / --manual-model conflict. Preview is not a write: --yes confirms the prepared transaction, whose compare-and-swap rejects a registry changed since its snapshot. Review/cancel/stale-snapshot failures leave the registry unchanged. Privacy, discovery bounds, and transaction failures.

Sessions and diagnostics#

text
octet --continue
octet --resume [SESSION_ID]
octet --fork [ID|PATH]
octet --session-dir PATH

octet sessions list [--query TEXT]
octet sessions inspect ID
octet sessions rename ID "NAME"
octet sessions tag ID TAG...
octet sessions export ID [--format json|html] [--output PATH] [--force] [--include-secrets]
octet sessions delete ID
octet sessions repair ID
octet doctor

--continue selects the latest current-workspace session; bare --resume or --fork opens a picker. --continue and --resume conflict; --fork conflicts with both. Fork creates a new session before startup. Listing and inspection are read-only. Delete moves to recoverable trash; repair backs up before removing only a torn final append. Export redacts by default, refuses an existing destination without --force, and warns for --include-secrets. Both formats always exclude private extension metadata; opting out of credential scrubbing does not widen that visibility boundary. doctor performs read-mostly prerequisite/provider/model checks without an Agent or executable-extension startup. Sessions.

Local evaluation#

text
octet eval run SUITE [--artifact-dir DIR] [--baseline REPORT.json]
octet eval run SUITE --model-profile /absolute/private-model.json

The default is a harness-owned scripted fixture, not a model benchmark. --model-profile explicitly selects an independently running local model server. The owner-private regular JSON file (maximum 16 KiB, no symlinks/hardlinks) has this shape:

json
{
  "schema": "octet-eval-model-1",
  "base_url": "http://127.0.0.1:8000/v1/",
  "model": "operator-selected-model",
  "api_key": "",
  "context_window": 32768,
  "max_output_tokens": 1024,
  "pricing": {"input": 0, "output": 0, "cache_read": 0, "cache_write_5m": 0}
}

The endpoint must be literal-loopback HTTP, with an explicit non-default port and /v1/ path: no DNS names, remote destinations, redirects, query strings, custom headers or ambient credentials. api_key is required; empty means none. Pricing is optional. When present, all four integer rates are required, in microdollars per million tokens; explicit zeros declare a free server. Missing pricing remains unknown, not free. Local routing does not prove the server itself avoids downstream paid inference. Model mode rejects scripted fixture replies in the suite.

Each case uses a new private HOME/workspace/session, cleared environment, no tools/context files, one model turn, and the literal prompt on stdin. The profile's token limit and any known-price case cost ceiling constrain admission; unknown pricing with a cost ceiling refuses before inference. There is no aggregate run-wide cost ceiling.

--case-timeout-ms N defaults to 60000 (range 1–120000); --max-output-bytes N defaults to 262144 per stdout/stderr stream (range 1–1048576). Exceeding either bound terminates/reaps the case. A suite is bounded to 1 MiB, 64 cases and 32 KiB per prompt. Private reports record backend, selected model, pass/latency/token/cost measurements and baseline deltas. Failed or interrupted calls retain available durable accounting; missing usage or pricing is uncertain, never a fabricated exact zero. Failed cases are observations in the report, not necessarily a nonzero harness exit.

Instructions and resources#

Form Contract
--system-prompt [TEXT] Entire composed-instruction override; no argument means explicit empty text. AGENTS/context/skills are ignored.
--prompt NAME Select a named startup/print prompt.
--debug-prompt Show exact final expansion and template hash before provider submission; can expose sensitive included content.
--prompt-template FILE-OR-DIR Explicit prompt source, repeatable in order.
--skill-dir PATH Explicit skill root.
--extension-dir PATH Explicit executable-extension source.
--enable-extension NAME One-invocation activation; not trust.
--trust-extension NAME One-invocation trust of the selected exact source; not activation.

Instructions/prompts/skills and resource discovery cover precedence, file bounds, trust, and reload.

Packages and Serve#

For reviewed local archives:

text
octet extension install --path ARCHIVE
octet extension update --path ARCHIVE
octet extension list

The four official executable bundles and the separate Serve application must match the running host exactly. Current source packages are 0.8.0 with requires_octet = "=0.8.0". The 0.8.0 release records signed assets and public-install evidence. Catalog forms below require verified published assets matching the running host version:

text
octet extension install NAME
octet extension update NAME
octet extension remove NAME

The executable catalog is octet-browse, octet-mcp, octet-subagents, and octet-web-search. Checksummed bundles publish atomically under ~/.octet/extensions/<id>; local updates must match the managed package ID. No install hook, dependency provisioning, activation, trust, or process launch occurs. Packaged skills require explicit loading. Packaging contract.

Serve is a separate version-matched application package. With a reviewed, compatible package installed, octet serve starts its loopback web interface; octet serve --no-open --port 0 avoids opening a browser and lets the OS select a port. extension install/update/remove octet-serve use the published catalog; local archive forms above also apply. Removal leaves sessions and other Serve data intact. Serve setup and limits.

--experimental-streamable-http-mcp is a conspicuous one-shot process-owner opt-in for otherwise-blocked remote MCP. It is not required for local stdio MCP. Read the MCP package's gate and defects before use; this is not stable transport qualification.

Pi interoperability#

text
octet migrate pi --dry-run [--json] [--pi-home PATH] [--project PATH] [--npm-root PATH]

Inventory reads bounded Pi settings/manifests and local/npm/git package locations, parses JS/TS/TSX with tree-sitter, and consumes zero model tokens. It executes no package code, starts no provider/model, changes no files, and does not copy resources/apply recipes. --json is versioned machine output; --npm-root adds only an explicit legacy node_modules search root.

Separate explicit octet migrate import pi and octet migrate restore cover a bounded portable subset without copying credentials or modifying Pi sources. Pi extension execution and its former install/plan/preflight/publish commands are not supported. Inventory classifications are not runtime compatibility claims. Import/restore bounds stay in Pi migration; native provider support is independent of Pi extensions.

Updates and legacy inputs#

/changelog opens this binary's current-version release notes in the interactive TUI, including without a configured model. The read-only report uses rich Markdown, starts at the first row, and supports Up/Down, PageUp/PageDown, Home, and End; Escape or Left closes it. It remains available during active work without interrupting the run or adding notes to the conversation. The muted /changelog · what's new hint sits directly below the splash version, with a shorter fallback in narrow terminals. When startup finds a newer stable release, an accent update hint follows it; octet update uses rich Markdown inline-code styling rather than visible backticks. A late result appears once as a UI-only notice with the same rich action instead of repainting historical splash rows.

Release notes are compiled into the binary: no network fetch, workspace file, or model request is used. Plain and print modes reject the command with guidance to open the interactive TUI; RPC returns its existing error response for prompt, steer, or follow-up invocations. Serve treats it as an unsupported boundary, without inferring an answer. None of these paths sends release-note requests to a provider or changes an API version.

/update checks for a newer release and directs you to octet update to install; that is an update command contract, not a verified octet channel. Do not treat it as a source-build release-promotion path. Current availability and historical Ygg update behavior are deliberately separate.

--safe is hidden compatibility for --safe-mode; --yolo is rejected. --reasoning-mode pro loads legacy state only. --theme-dir and arbitrary theme names remain compatibility inputs; built-in terminal appearance choices are documented in Theme status. See compatibility inputs.