CLI Coding Agents: 2026 Q2 Comparison
Claude Code, Copilot CLI, Gemini CLI, Codex CLI, Kiro, OpenCode
Table of Contents
- 1. Overview
- 2. The agents
- 3. Invocation patterns
- 4. Permission models
- 5. Sandbox / isolation
- 6. MCP support
- 7. Hooks
- 8. Skills and custom agents
- 9. Memory and persistence
- 10. Custom model providers
- 11. Remote and cloud execution
- 12. Convergent patterns
- 13. Divergent bets
- 14. Landscape diagram
- 15. Verification provenance (2026-04-18)
- 16. Harness availability on FreeBSD 15.0 (2026-06-21)
- 17. Addendum (2026-10-15): harnesses this comparison missed
- 18. Related
1. Overview
Six terminal-based AI coding agents compete for the developer's shell in 2026 Q2. This note compares their feature surfaces — not their model quality (which changes monthly) but their architectural bets: what contract does each offer between the developer, the agent, and the tools the agent can invoke?
Scope note: this covers the six agents with the deepest CLI surfaces as of April 2026. Other notable tools (Aider, Cursor Agent, Windsurf/Cline, Continue) are omitted either because their primary surface is an IDE extension rather than a terminal CLI, or because their CLI surface is thin enough that comparison at this level of detail is not informative. See Terminal AI Agents 2025 for the broader landscape including IDE-first tools. The 2026-10-15 addendum adds pi (missed here) and DeepSeek Harness (released after Q2), and compares how each harness uses more than one model.
2. The agents
Live re-check (2026-10-08) of the version column against each package registry: Claude Code =npm view @anthropic-ai/claude-code version= -> 2.1.295 (table: 2.1.89, FreeBSD snapshot); Gemini CLI =npm view @google/gemini-cli version= -> 0.63.0 (table: 0.47.0); Codex CLI =npm view @openai/codex version= -> 0.162.0 (table: 0.141.0, BLOCKED); OpenCode =npm view opencode-ai version= -> 1.18.35 (table: 1.17.9, BLOCKED); Aider =pip index versions aider-chat= -> 0.86.2 (table: 0.86.1, closest match of the set). All five have moved forward, none regressed or contradicts the table -- confirms the table as an accurate dated snapshot (2026-04-18/2026-06-21) rather than a current ranking, same pattern as the GitHub-stars snapshot in [[file:../2025-terminal-ai-agents/index.org][Terminal AI Agents 2025]].
| Agent | Vendor | CLI command | Default model | License | FreeBSD 15.0 |
|---|---|---|---|---|---|
| Claude Code | Anthropic | claude |
Opus 4.6 (1M ctx) | Proprietary | 2.1.89 |
| Copilot CLI | GitHub | copilot |
Claude Sonnet 4.5 (1x) | Proprietary | IDE only |
| Gemini CLI | gemini |
Gemini 2.5 Pro / 3 Pro Preview | Open source | 0.47.0 | |
| Codex CLI | OpenAI | codex |
GPT-5.4 | Proprietary | BLOCKED |
| Kiro | AWS | kiro-cli |
Claude Sonnet 4 (via Bedrock) | Proprietary | IDE only |
| OpenCode | Anomaly | opencode |
User-configured (75+ providers) | Open source | BLOCKED |
| Goose | Block | goose |
User-configured | Open source | 0.9.11 |
| Aider | Gauthier | aider |
User-configured | Open source | 0.86.1 (pkg) |
Notable: Copilot CLI defaults to a Claude model, not a GitHub/OpenAI model. Gemini CLI, OpenCode, Goose, and Aider are open source. Goose and Aider are added in the June 2026 update as they have full CLI surfaces comparable to the original six. On FreeBSD 15.0, only Claude Code, Gemini CLI, and Goose run natively; Codex CLI and OpenCode have hard platform checks that block FreeBSD.
3. Invocation patterns
| Feature | Claude Code | Copilot CLI | Gemini CLI | Codex CLI | Kiro | OpenCode |
|---|---|---|---|---|---|---|
| Interactive | claude |
copilot |
gemini |
codex |
kiro-cli |
opencode |
| Non-interactive | claude -p |
copilot -p |
gemini -p |
codex exec / e |
headless mode | - |
| Continue session | claude -c |
- | gemini -r latest |
codex resume |
- | - |
| Resume by ID | claude -r <id> |
- | gemini -r <id> |
codex resume <id> |
- | - |
| Fork session | /branch |
- | - | codex fork |
- | - |
| Pipe stdin | cat f \vert claude -p |
cat f \vert copilot |
cat f \vert gemini |
- (stdin) |
- | - |
| Image input | - | - | - | --image |
- | image drag-drop |
| Worktree | -w |
- | - | - | - | - |
| Tmux integration | --tmux |
- | - | - | - | - |
| Output format | text/json/stream | - | text/json/stream | text/json | - | - |
| JSON schema output | --json-schema |
- | - | --output-schema |
- | - |
| Budget cap | --max-budget-usd |
- | - | - | - | - |
Claude Code and Codex CLI have the deepest non-interactive / scripting surfaces. Gemini CLI matches on output format and session management. Copilot CLI is the simplest invocation surface. Kiro's CLI is the least publicly documented.
4. Permission models
| Feature | Claude Code | Copilot CLI | Gemini CLI | Codex CLI | Kiro | OpenCode |
|---|---|---|---|---|---|---|
| Per-tool allow/deny | --allowedTools |
--allow-tool |
Policy Engine | --allow-tool |
Whitelist | ask/allow/deny |
| Per-tool deny | --disallowedTools |
--deny-tool |
Policy Engine | --deny-tool |
- | deny per tool |
| Session auto-allow | /permissions |
Option 2 (session) | /permissions |
/permissions |
Trusted commands | /permissions |
| Permission modes | 6 modes | 3 options | 4 modes | 3 tiers | via custom agents | per-tool config |
| Skip all permissions | --dangerously-skip |
--allow-all-tools |
--yolo (deprecated) |
--yolo |
agent allowedTools | - |
| Bare / minimal mode | --bare |
- | - | --ephemeral |
- | - |
4.1. Permission mode comparison
| Mode | Claude Code | Copilot CLI | Gemini CLI | Codex CLI |
|---|---|---|---|---|
| Read-only / plan | --permission-mode plan |
- | --approval-mode plan |
--sandbox read-only |
| Ask per action | --permission-mode default |
Option 1 (each time) | --approval-mode default |
--ask-for-approval untrusted |
| Auto-edit, ask shell | --permission-mode acceptEdits |
- | --approval-mode auto_edit |
--ask-for-approval on-request |
| Full auto | --permission-mode bypassPermissions |
--allow-all-tools |
--approval-mode yolo |
--ask-for-approval never |
| Classifier-driven | --permission-mode auto |
- | - | - |
Claude Code's auto mode (permission classifier) is unique — no
other agent has a model-driven permission tier. Codex CLI's separation
of --sandbox (filesystem) from --ask-for-approval (tool invocation)
is architecturally cleaner than a single permission mode.
5. Sandbox / isolation
Claude Code has an opt-in OS sandbox (Seatbelt/bubblewrap) for shell commands only, since 2025-10-20; reproduced on 2.1.299 macOS: sandboxed touch ~/x -> Operation not permitted, Write tool to the same path succeeds, retry ignored when allowUnsandboxedCommands=false; FreeBSD unnamed in docs and sandbox-runtime (platform -> unknown, unsupported)
| Feature | Claude Code | Copilot CLI | Gemini CLI | Codex CLI | Kiro | OpenCode |
|---|---|---|---|---|---|---|
| OS-level sandbox | Bash only, opt-in: macOS Seatbelt, Linux/WSL2 bubblewrap | - | macOS Seatbelt, gVisor, | macOS Seatbelt, Linux | - | - |
| Docker/Podman, LXC | Landlock+seccomp | |||||
| Sandbox tiers | - | - | permissive/restrictive/strict | read-only/workspace-write/ | - | Snapshot only |
| danger-full-access | ||||||
| Worktree isolation | isolation: worktree |
- | -w (experimental) |
- | - | - |
| Network deny | sandbox.network.deniedDomains |
- | - | - | - | - |
| Sandbox CLI tool | /sandbox panel; srt (separate package) |
- | - | codex sandbox |
- | - |
Gemini CLI has the most mature OS-level sandboxing (four backends).
Codex CLI has the cleanest tier model and a standalone codex sandbox
tool for running arbitrary commands under the agent's sandbox policy.
Claude Code has an OS-level sandbox, but a narrower one: it is off by
default (/sandbox or sandbox.enabled) and covers shell commands
only — Bash, PowerShell and Monitor, and the processes they start —
using Seatbelt on macOS and bubblewrap on Linux and WSL2. Sandboxed
commands can write only to the working directory, a per-user temp
directory and --add-dir directories; reads stay open machine-wide
unless denied; network goes through a domain-filtering proxy. The file
tools (Write, Edit), MCP servers and hooks run outside it, under
permission rules alone. On 2.1.299 a sandboxed touch ~/x fails with
Operation not permitted while the Write tool creates the same path.
A blocked command can be retried unsandboxed via
dangerouslyDisableSandbox unless sandbox.allowUnsandboxedCommands
is false. On a platform the runtime doesn't support, Claude Code runs
commands unsandboxed without saying so unless sandbox.failIfUnavailable
is set; FreeBSD, where the harness audit below runs it, is not a
supported platform. The runtime is open source as
@anthropic-ai/sandbox-runtime
(srt); see
the 2025-10-20 announcement
and the sandboxing docs.
Worktree isolation remains filesystem-only. Kiro and OpenCode have no
sandbox primitives.
6. MCP support
| Feature | Claude Code | Copilot CLI | Gemini CLI | Codex CLI | Kiro | OpenCode |
|---|---|---|---|---|---|---|
| MCP config file | .mcp.json |
settings | settings.json |
config.toml |
settings file | opencode.json |
| CLI MCP management | claude mcp |
- | gemini mcp |
codex mcp |
MCP panel | - |
| Multiple configs | --mcp-config a b |
- | - | - | - | - |
| Strict (ignore others) | --strict-mcp-config |
- | - | - | - | - |
| Server auth (OAuth) | claude setup-token |
- | - | codex mcp login |
- | - |
| MCP mention syntax | - | - | @server |
- | # prefix |
- |
| Run as MCP server | - | - | - | codex mcp-server |
- | - |
Codex CLI's codex mcp-server is unique — it can run as an MCP
server, meaning another agent can consume Codex as a tool. Claude Code
has the most flexible multi-config story (--mcp-config accepts
multiple files).
7. Hooks
=code.claude.com/docs/en/hooks=, fetched live 2026-10-08, documents 33 distinct hook events for Claude Code, not the 7 this note counted as of April 2026 (the table's own named events -- SessionStart/End, UserPromptSubmit, AssistantResponseComplete, PreCompact, plus Pre/PostToolUse -- are all still current, just no longer the whole surface). The summary sentence below the table stated the "7 event types" comparison as a present-tense fact with no date qualifier, which reads as current rather than as an April 2026 snapshot; corrected to timestamp it explicitly. Other agents' current hook counts were not re-checked this pass, so the cross-agent ranking in the sentence is left as its original April-2026 comparison.
| Feature | Claude Code | Copilot CLI | Gemini CLI | Codex CLI | Kiro | OpenCode |
|---|---|---|---|---|---|---|
| Hook support | Yes | Yes | Yes | Yes | Yes | No |
| Pre/Post tool use | Yes | Yes | Yes | Yes | Yes | - |
| Session lifecycle | SessionStart/End | sessionStart/End | - | - | AgentSpawn/Stop | - |
| User prompt hook | UserPromptSubmit | userPromptSubmitted | - | - | UserPromptSubmit | - |
| Response hook | AssistantResponseComplete | - | - | - | - | - |
| Error hook | - | errorOccurred | - | - | - | - |
| Pre-compact | PreCompact | - | - | - | - | - |
| Conditional hooks | if hooks |
- | - | - | - | - |
| Veto capability | Yes (deny decision) | - | - | - | Yes (exit code 2) | - |
As of April 2026, Claude Code had the most complete hook surface in
this set (7 event types + conditional if hooks); the surface has
since grown sharply — official docs list 33 distinct hook events as
of October 2026. Copilot CLI is close with 6 hook types
including an errorOccurred hook that no other agent has. Kiro has
5 triggers including AgentSpawn and veto via exit code 2 on
PreToolUse. Earlier versions of this note incorrectly attributed
file-event hooks to Kiro; the official docs show no file-event
triggers.
8. Skills and custom agents
Official GitHub Docs page =docs.github.com/en/copilot/how-tos/copilot-cli/customize-copilot/add-skills=, fetched live 2026-10-08, confirms the exact claim: "Project skills can live under =.github/skills/=, =.claude/skills/=, or =.agents/skills/=." Copilot CLI reads Claude-Code-authored =SKILL.md= files without changes, as stated.
| Feature | Claude Code | Copilot CLI | Gemini CLI | Codex CLI | Kiro | OpenCode |
|---|---|---|---|---|---|---|
| Skills directory | .claude/skills/ |
.github/skills/ etc |
discoverable on disk | - | .kiro/agents/ |
- |
| Skill format | SKILL.md |
SKILL.md |
- | - | - | - |
| Skills install/manage | - | - | gemini skills install |
- | - | - |
| Custom agents | .claude/agents/*.json |
custom agents | /agents |
AGENTS.md |
.kiro/agents/ |
agent config |
| Agent CLI flag | --agent |
- | - | - | - | default_agent |
| Subagent delegation | Agent tool (typed) | - | /agents |
/agent |
- | - |
| Built-in skills | /simplify, /batch etc |
- | extensible via install | - | Specs system | Custom commands |
| Bundled skill count | ~6 | 0 (reads convention) | extensible | 0 | - | - |
| Cross-harness portability | .claude/skills/ |
.claude/skills/ |
- | AGENTS.md |
AGENTS.md |
.claude/skills/ |
The SKILL.md convention (originated by Anthropic) is now read by
Claude Code, Copilot CLI, and OpenCode — the closest thing to a
cross-harness standard. Copilot CLI ships no built-in skills but
discovers SKILL.md files in .claude/skills/ and .agents/, so
project-level skills written for Claude Code work without changes. Gemini CLI has the most developed
install/manage surface for skills. Codex CLI and Kiro use AGENTS.md
as the project-level agent configuration (different convention, same
purpose).
9. Memory and persistence
| Feature | Claude Code | Copilot CLI | Gemini CLI | Codex CLI | Kiro | OpenCode |
|---|---|---|---|---|---|---|
| Project instructions | CLAUDE.md |
AGENTS.md? |
GEMINI.md |
AGENTS.md |
.kiro/steering/ |
AGENTS.md |
| Auto-generated context | - | - | - | - | product/tech/structure.md |
- |
| Cross-session memory | ~/.claude/.../memory/ |
Copilot Memory | /memory |
memories system | steering files | - |
| Memory categories | user/feedback/project/ref | - | hierarchical | - | Always/FileMatch/etc | - |
| Auto-compaction | Yes (at 95%) | Yes (at 95%) | - | - | - | - |
| Manual compact | /compact |
/compact |
- | /compact |
- | - |
| Context visualization | /context |
/context |
- | - | - | - |
| Session export | /export |
- | - | --json |
- | /share |
Kiro's auto-generated product.md, tech.md, structure.md are
unique — the agent bootstraps its own project understanding on first
run. Claude Code has the most structured memory system (typed
categories with an indexed MEMORY.md). Gemini CLI and Copilot CLI
both have auto-compaction at the 95% threshold.
10. Custom model providers
| Feature | Claude Code | Copilot CLI | Gemini CLI | Codex CLI | Kiro | OpenCode |
|---|---|---|---|---|---|---|
| Provider override | API key only | Env vars | --model + auth |
config.toml |
Bedrock only | 75+ via Models.dev |
| Local models | Ollama (via API-compat) | - | - | Ollama (--oss) |
- | Ollama/llama.cpp/etc |
| OpenAI-compatible | - | Yes (env vars) | - | Yes (native) | - | Yes (baseURL config) |
| Anthropic direct | Yes (native) | - | - | Yes (env vars) | Yes (Bedrock) | Yes (provider config) |
| Azure OpenAI | - | Yes (env var) | - | Yes (provider type) | - | - |
| Vertex AI | /setup-vertex |
- | Yes (native) | - | - | - |
| Bedrock | /setup-bedrock |
- | - | - | Yes (native) | - |
OpenCode has the broadest provider story (75+ via Models.dev). Codex
CLI has the cleanest multi-provider config (config.toml profiles).
Claude Code's provider flexibility is limited to API key and
Vertex/Bedrock setup wizards. Kiro is locked to AWS Bedrock.
11. Remote and cloud execution
| Feature | Claude Code | Copilot CLI | Gemini CLI | Codex CLI | Kiro | OpenCode |
|---|---|---|---|---|---|---|
| Remote control | /remote-control |
- | - | --remote ws:// |
- | - |
| Cloud execution | - | - | - | codex cloud |
- | - |
| Desktop app | /desktop |
- | - | codex app (macOS) |
IDE only | - |
| Run as MCP server | - | - | - | codex mcp-server |
- | - |
| ACP protocol | - | Yes | experimental | - | - | - |
Codex CLI is the only agent with cloud-execution (codex cloud) and
MCP-server modes. Copilot CLI supports ACP (Agent Client Protocol) —
a competing open standard to MCP for agent interop. Claude Code's
/remote-control provides browser-to-terminal bridging.
12. Convergent patterns
- Non-interactive mode with
-p/exec— every agent has a script-friendly mode. The shell integration pattern is settled. - MCP as the tool-extension protocol — all six support MCP. Configuration format varies (JSON, TOML, settings) but the transport is standard.
- Project instruction files —
CLAUDE.md,GEMINI.md,AGENTS.md,.kiro/steering/. Every agent auto-loads a project-level context document. No standard name. - Permission tiering — every agent has at least a read-only / ask / auto-approve ladder. The number of tiers varies (2–6) but the shape is the same.
- Session persistence + resume — all but OpenCode support continuing a prior conversation.
13. Divergent bets
item 1 said Claude Code had no OS-level sandbox; it has an opt-in Bash-only one (see sandbox-isolation); the 2026-06-27 pass had marked it correct
- Sandboxing. Gemini CLI and Codex CLI make OS-level sandboxing the agent's boundary (Seatbelt, gVisor, Landlock). Claude Code sandboxes only shell commands, opt-in, and leans on worktree isolation and permission hooks for the rest. Kiro and OpenCode punt entirely.
- Hooks and lifecycle events. Claude Code and Kiro have rich hook surfaces; the others have basic or no hooks.
- Skills portability.
SKILL.mdis becoming a cross-harness convention (Claude Code, Copilot CLI, OpenCode).AGENTS.mdis a competing convention (Codex CLI, Kiro, OpenCode). - Cloud execution. Only Codex CLI has a cloud-execution tier
(
codex cloud). - Model portability. OpenCode supports 75+ providers; Kiro locks to Bedrock.
14. Landscape diagram
The diagram below positions the six agents by their primary architectural bet. Clusters group agents that share the same divergent commitment; edges to the central hub show the feature each agent contributes to the convergent baseline.
15. Verification provenance (2026-04-18)
Each agent's claims were independently verified by a subagent
checking official documentation or local --help output. This
section records what was checked, what version, and what was
corrected.
| Agent | Method | Version/Date | Errors found and fixed |
|---|---|---|---|
| Claude Code | claude --help (local install) |
2.1.114, 2026-04-18 | None in core claims; ~25 power-user flags omitted (in scope) |
| Copilot CLI | docs.github.com official docs |
2026-04-18 fetch | Hooks understated (6 types, not 0); skills dir, custom agents, |
/compact, /context, Azure provider were all incorrectly "-" |
|||
| Gemini CLI | geminicli.com (v0.38.2 stable) |
2026-04-18 fetch | -w worktree flag was fabricated (removed); Windows sandbox |
backend omitted; gemini skills install unverified as CLI subcmd |
|||
| Codex CLI | github.com/openai/codex (v0.121.0) |
2026-04-15 release | None wrong; missing newer subcmds (apply, execpolicy, features) |
| Kiro | kiro.dev/docs/cli/ |
2026-04-18 fetch | CLI is kiro-cli not kiro; permission model not "Autopilot/ |
| Supervised"; only 5 hook triggers (not 8); no file-event hooks; | |||
# mention syntax not found; inclusion mode names not in docs |
|||
| OpenCode | opencode.ai/docs/ (v1.4.11) |
2026-04-18 fetch | /connect and /permissions not slash cmds (config-only); |
repo is anomalyco/opencode not nichochar/opencode; |
|||
| Copilot/ChatGPT auth not explicitly documented (may work via | |||
provider config); skills in .opencode/skills/ confirmed |
Correction (2026-10-15): the April check of Claude Code used
claude --help, which does not surface the /sandbox command or the
sandbox.* settings, so the sandbox rows read "-" and the prose said
there was no OS-level sandbox. A reader pointed out the 2025-10-20
announcement; the rows, the prose and Divergent bets item 1 are
corrected, with the write boundary reproduced on 2.1.299 (see the
sandbox-isolation drawer). The landscape diagram still clusters
Claude Code by its primary bet, hooks.
All corrections have been applied to the tables above. The note is accurate as of the versions listed; flag surfaces change frequently and should be re-verified quarterly.
Channel note: Claude Code 2.1.114 is from the npm/=latest= channel
(FreeBSD). Homebrew's stable channel ships 2.1.98 as of the same
date. All flags in the comparison tables are present in both versions;
the gap is power-user flags (--effort, --from-pr, --chrome,
etc.) that the note intentionally omits as out of scope.
16. Harness availability on FreeBSD 15.0 (2026-06-21)
3 of 6 agents run on FreeBSD; codex/opencode block on platform check; kiro IDE-only
Vetted against FreeBSD nexus 15.0-RELEASE amd64 (the machine that
publishes this site).
16.1. Agent harnesses
| Agent | FreeBSD status | Version | Install method | Blocker |
|---|---|---|---|---|
| Claude Code | INSTALLED | 2.1.89 | npm install -g @anthropic-ai/claude-code |
-- |
| Gemini CLI | INSTALLED | 0.47.0 | npm install -g @google/gemini-cli |
-- |
| Goose | INSTALLED | 0.9.11 | pip install --user goose-ai |
-- |
| Aider | AVAILABLE | 0.86.1 | sudo pkg install py311-aider_chat |
needs sudo |
| Codex CLI | BLOCKED | 0.141.0 | -- | Unsupported platform: freebsd (hard check in bin/codex.js) |
| OpenCode | BLOCKED | 1.17.9 | -- | wanted os: darwin,linux,win32 (package.json os field) |
| Kiro | N/A | -- | -- | IDE-only (VS Code / JetBrains), no standalone CLI binary |
| Copilot CLI | N/A | -- | -- | VS Code extension, not a standalone binary |
Three of six agents run on FreeBSD. Codex CLI and OpenCode have hard
platform checks that could be patched (the underlying Node.js runtime
works) but are not officially supported. Aider is a pure Python package
and would work after sudo pkg install.
16.2. Language runtimes and formal methods
| Tool | Version | Notes |
|---|---|---|
| Node.js | 24.14.1 | -- |
| Deno | 2.6.6 | FreeBSD native binary |
| Python | 3.11.15 | -- |
| GHC | 9.10.3 | lens, boomerang, profunctors installed |
| OCaml | 4.14.2 | opam + lens installed |
| Clojure (clj) | 1.12.0.1488 | JVM, full REPL |
| Babashka (bb) | 1.12.206 | GraalVM native |
| Racket | 9.0 [cs] | -- |
| Lean 4 | 4.27.0-pre | -- |
| Guile | 3.0.10 | -- |
| Emacs | 32.0.50 | custom build at ~/opt/emacs/ |
| Ruby | 3.3.10 | -- |
| Z3 | 4.16.0 | SMT solver |
| Spin | AVAILABLE | sudo pkg install spin (model checker, v6.5.2) |
| Graphviz (dot) | 14.1.4 | -- |
16.3. Infrastructure and deployment
| Tool | Version | Notes |
|---|---|---|
| Bastille | 1.4.3 | FreeBSD jails; needs sudo |
| Docker | unknown | installed but version unknown; jails preferred |
| Terraform | 1.14.7 | -- |
| Git | 2.53.0 | -- |
| GitHub CLI (gh) | 2.83.2 | -- |
| Wrangler (CF) | BLOCKED | workerd has no FreeBSD binary |
| Vale | master | prose linter |
| jq | 1.8.1 | -- |
| tmux | installed | -- |
| opam | 2.5.1 | OCaml package manager |
| cabal | 3.16.1.0 | Haskell package manager |
16.4. Commands requiring sudo
# Install aider (Python AI pair programming)
sudo pkg install py311-aider_chat
# Install Spin (model checker)
sudo pkg install spin
# Bastille jail operations
sudo bastille list
sudo bastille create <name> 15.0-RELEASE <ip>
# Bun runtime (not packaged for FreeBSD as of 2026-06-21)
# Alternative: use Deno 2.6.6 (native FreeBSD binary)
17. Addendum (2026-10-15): harnesses this comparison missed
A reader called the list above too vendor-shaped: one flagship per large lab, and no pi or DeepSeek. Fair. The literature's word for what this note compares is harness — everything around the model: prompts, tools, skills, memory, the control loop — and evaluations increasingly report results per harness–model pair, because in some benchmarks changing the harness moves scores nearly as much as changing the model. Scoping by "has a terminal CLI" and by vendor is what left out the two harnesses below. The tables above stay as the Q2 snapshot; a Q4 note will compare harnesses directly.
Each subsection below was checked by a verification agent against
the npm registry, the GitHub API, shipped docs and changelogs, and
--help / --version runs; no model requests were sent.
17.1. pi (missed in Q2)
pi (MIT, Zechner; npm since 2025-10-22, 0.65-0.80.3 in Q2) is extension-first with no permission prompts or sandbox; "No MCP" by design through Q2, built in from 0.99.0 (2026-09-29); 4 default tools plus grep/find/ls off by default; --help/--version run on 0.79.3 and 1.2.0, rest from shipped docs
pi (earendil-works/pi,
formerly badlogic/pi-mono; npm @earendil-works/pi-coding-agent,
@mariozechner/pi-coding-agent before 2026-05-07; MIT; Mario
Zechner). On npm since 2025-10-22 and released 0.65 through 0.80.3
during Q2, so it belonged in the table and was simply missed. 115k
GitHub stars on 2026-10-15; current version 1.2.0.
Its bet is the opposite of Claude Code's: as little harness as possible, with everything else an extension.
| Feature | pi (Q2: 0.80.3; now: 1.2.0) |
|---|---|
| Non-interactive | pi -p; --mode text/json/rpc |
| Continue / resume | pi -c, pi -r, --session, --fork; /tree session tree |
| Built-in tools | read, bash, edit, write on by default; grep, find, ls ship off |
| System prompt | about 200 words before tools, context files and skills (0.79.3) |
| Permissions | none: "No permission popups"; --tools allowlist, tool_call extension can block |
| Sandbox | none built in; Docker or OpenShell around the process, Gondolin micro-VM extension for tools |
| MCP | Q2: "No MCP" by design; built in since 0.99.0 (2026-09-29), pi mcp |
| Hooks | no shell hooks; ~30 TypeScript extension events, tool_call can veto |
| Skills | SKILL.md in .pi/skills/, .agents/skills/; /skill:name |
| Project instructions | AGENTS.md or CLAUDE.md, global plus parents, concatenated |
| Subagents | none ("No sub-agents"); example extension |
| Memory | no cross-session memory found; auto /compact at window minus 16k |
| Providers | 33 in Q2 (3 subscriptions, 30 API-key), plus models.json for local |
| Run as server | RPC mode (JSONL over stdio) and an SDK, not MCP or ACP |
| FreeBSD | no os gate in the package; not run there; no isolation path on it |
17.2. DeepSeek Harness (new since Q2)
dsh is post-Q2 (npm 0.0.1-rc.1 2026-08-10, latest 0.2.0-rc.2, all prereleases, developer preview, MIT, 250,354 stars 2026-10-15); Web-UI/headless/ACP launcher with no shipped TUI; multi-provider (default deepseek-flash); 3-tier sandbox over file writes only (Seatbelt, bwrap then Landlock, Windows ACL; no network control, no FreeBSD backend); --version/--help/headless --help run on 0.2.0-rc.2, rest from repo docs
dsh (deepseek-ai/deepseek-harness,
npm @deepseek-ai/dsh, MIT). First published 2026-08-10, so it did
not exist in Q2. Every release so far is a prerelease (0.2.0-rc.2 on
latest); the README calls it a developer preview and promises
breaking changes. 250k GitHub stars on 2026-10-15 — more than
anything in the Q2 table.
It is a harness but not a terminal agent: dsh web serves a browser
UI on 127.0.0.1:3080, there is an Electron desktop app, a one-shot
dsh headless mode, and ACP and SDK servers over stdio. No TUI ships.
Its bet is that everything — tools, providers, hooks — is a
plugin on the Cordis framework.
| Feature | DeepSeek Harness (0.2.0-rc.2) |
|---|---|
| Interactive | dsh web (browser), desktop app; no terminal UI |
| Non-interactive | dsh headless "<task>", stdin via -, --json event stream |
| Resume | --session-id |
| Default model | deepseek-flash; multi-provider (Anthropic, OpenAI, Kimi, GLM, OpenAI-compatible) |
| Permission modes | read-only / workspace-write (default) / danger-full-access; approval ask or never |
| Sandbox | Seatbelt (macOS), bwrap then Landlock (Linux), ACL token (Windows); fails closed |
| Sandbox scope | file writes only: no network, process or credential limits |
| MCP | YAML per profile, none enabled by default; no CLI management |
| ACP | yes, dsh --profile acp |
| Hooks | experimental bridges that read Claude Code and Codex hooks.json; 7 of Claude Code's 30 events |
| Skills | SKILL.md in .dsh/skills, .agents/skills |
| Project instructions | AGENTS.md and CLAUDE.md, on by default |
| Subagents | subagent tool (spawn, fork); can delegate to Claude Code or Codex |
| Memory | none built in; auto-compaction at 80% of the window, /compact |
| FreeBSD | installs (no os gate); no sandbox backend, so only danger-full-access would run commands (inferred) |
Where its sandbox differs from Claude Code's: it fails closed when no
backend exists, where Claude Code runs commands unsandboxed unless
sandbox.failIfUnavailable is set; and it has no network control,
which Claude Code's proxy does have.
17.3. Multiple models per session
Aider, Kiro and OpenCode as documented; Claude Code uses ANTHROPIC_DEFAULT_HAIKU_MODEL (SMALL_FAST deprecated); Goose lead/worker removed in v1.29.0 (#7989, 2026-03-18); Gemini routes by complexity and by plan mode, quota fallback prompts; Codex has no auto routing but review_model and agents.default_subagent_model; Copilot CLI auto since 1.0.32 (changelog only); Kiro routing method undocumented (vendor claim)
The Q2 tables ask which providers each harness can reach, not how many models one session uses. Harnesses differ more here than in provider lists. Three patterns: a cheap model for side work (titles, summaries, commit messages); a role split in the main loop (plan and execute, architect and editor, per-subagent models); and routing by task difficulty.
| Harness | Side-work model | Role split | Automatic routing |
|---|---|---|---|
| Claude Code | Haiku (ANTHROPIC_DEFAULT_HAIKU_MODEL) |
opusplan (Opus plans, Sonnet executes); subagent model: |
- (--fallback-model on overload only) |
| Copilot CLI | - | custom agent model; subagent models |
auto since 1.0.32; adapts mid-conversation since 1.0.81 |
| Gemini CLI | flash-lite for utility calls | Pro plans, Flash implements (general.plan.modelRouting) |
auto by complexity; quota fallback prompts |
| Codex CLI | - | review_model; agents.default_subagent_model |
- |
| Kiro | - | custom agent model |
Auto (method undocumented) |
| OpenCode | small_model |
per-agent model |
- |
| Goose | - | GOOSE_SUBAGENT_MODEL; lead/worker removed in v1.29.0 |
- |
| Aider | --weak-model |
--architect with --editor-model |
- |
| pi | - | via extensions (subagent example) | -; manual /model, Ctrl+P cycles |
| DeepSeek Harness | compaction summarizer can differ | subagent tool sets provider and model | - (none documented) |
Every harness here also switches models by hand mid-session.
Two cells in the Q2 tables have since gone stale: Copilot CLI's
default model ("Claude Sonnet 4.5") predates auto, and Claude Code's
model aliases now include fable alongside "Opus 4.6". They are left
as the dated snapshot.
18. Related
- Claude Code Workshop 2026 — deep-dive on Claude Code's surface.
- Claude Code Features — 2026 Q2 — speculative notes on Claude Code's direction.
- Terminal AI Agents 2025 — prior landscape survey; this note is the Q2 2026 update.
- Cloudflare Agents Week 2026 — where the agent infrastructure (sandbox, memory, identity) sits relative to these CLI surfaces.