Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Agent Detection Matrix

Standardized checklist for analyzing and onboarding new AI coding agent CLIs. Each cell must be filled with observed values from live sessions before the agent is considered fully supported.

Detection Matrix

1. Identity & Rendering

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Version testedv2.1.81v0.116.0v0.34.0v0.86.2v1.2.20
Date tested2026-03-212026-03-212026-03-222026-03-222026-03-22
Rendering engineInk (React)Ink (React)Ink-like (Node.js)Python rich + readlineBubble Tea (Go)
Cursor positioningRelative (\033[NA])Absolute (\033[r;cH)Relative (\033[1A])Sequential (no cursor)Absolute (\033[r;cH)
Scroll mechanism\r\n paddingScroll regions (\033[n;mr])\r\n paddingNormal scrollFull-screen redraw
Screen clear on menusSometimes (\033[2J)NoNoN/AFull-screen TUI
Parsing strategyChanged-rows deltaChanged-rows deltaChanged-rows deltaChanged-rows deltaScreen snapshot

2. Prompt Line

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Prompt char (U+276F) (U+203A, bold)> (purple, rgb 215,175,255)> (green, ANSI #40)None (framed box)
Prompt backgroundNoneDark gray (rgb 57,57,57)Dark gray (rgb 65,65,65)NoneDark (rgb 30,30,30)
Prompt box border──── separatorsBackground color only▀▀▀ top / ▄▄▄ bottomNone┃╹▀ vertical frame
Ghost text styledim cell attribute\033[2m dimGray (rgb 175,175,175)N/AGray placeholder
Multiline inputEnter = submitEnter = newlineEnter = submitEnter = submitUnknown

3. Separator Lines

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Uses separatorsYesPartiallyYesYes (green ─────)No (uses ┃╹▀)
Separator chars (U+2500) (U+2500) (U+2500) (U+2500) (vertical frame)
Separator colorGray (rgb 136,136,136)StandardDark gray (rgb 88,88,88)Green (rgb 0,204,0)N/A
Separator purposeFrame prompt boxBetween tool output & summaryAbove prompt areaBetween conversation turnsPrompt box border
Decorated separatorsYes (──── label ──)NoNoNoN/A
Min run length4+ charsFull widthFull widthFull widthN/A

4. Status / Chrome Lines

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Mode line⏵⏵ <mode> (last row)NoneNoneNoneMode in prompt box (Build/Plan)
Status line(s)0-N below separator1 line below prompt2-row status bar (4 columns)Token report after responseRight panel (context, cost, LSP)
Status indent2 spaces (\033[2C)2 spaces1 spaceNoneN/A (panel layout)
Info lineNoneNoneShift+Tab to accept edits + MCP/skills countNonetab agents · ctrl+p commands
Subprocess countIn mode lineNoneNoneNoneNone (progress bar instead)

5. Spinner / Working Indicators

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Spinner chars✶✻✳✢· (U+2720-273F) (U+2022)⠋⠙⠹⠸⠴⠦⠧⠇ (braille)░█ / █░ (Knight Rider)■⬝ (progress bar)
Spinner colorWhiteStandardBlue/green (varies)StandardStandard
Spinner positionAbove separatorInline with outputBelow output, above separatorInline (backspace overwrite)Footer row
Time display(1m 32s)(10s • esc to interrupt)(esc to cancel, Ns)NoneNone
Token display↓ 2.2k tokensNoneNoneTokens: Nk sent, N received. Cost: $X.XXNone
Tip textSpinner verb namesNoneItalic tips during spinnerNoneNone
Detected byis_chrome_rowis_chrome_rowparse_status_lineparse_status_lineN/A (full TUI)

6. Interactive Menus

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Permission promptMultiselect (❯ 1. Yes)Not observed (sandbox)None (model-level refusal)File add: Y/N/A/S/D△ Permission required inline
Selection char (blue)Not observedN/AN/A⇆ select
Footer patternEsc to cancel/closeesc to interruptesc to cancel (in spinner)Noneenter confirm
OSC 777 notifyYesNoNoNoNo
OSC 0 window titleYes (task + spinner)YesYes (◇ Ready (workspace))NoNo
Slash commands/mcp, /stats, /status/model, /mcp, /fast/help, /settings, /model, /stats/helpNone observed

7. System Messages

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Output prefix (white/green/red) (U+2022) (U+2726, purple)None (blue text)None (inline in panel)
Tool call display + verb + description╭───╮ ✓ ToolName ╰───╯ boxNone read / write
Warning prefixN/A (U+26A0)N/AOrange textN/A
Error indicator (red) + error textRed text┃ Error: inline
Interrupt markerN/ANot observed^Cesc interrupt hint
Tool result (U+23BF) or inlineInside ╭───╮ boxInline completion marker

Trigger Procedures

How to force each UI state for analysis and testing.

Procedure A: Start agent in each permission mode

AgentRestricted modePermissive mode
Claude Codeclaude --permission-mode defaultclaude --permission-mode bypassPermissions
Codex CLIcodex -a untrustedcodex (suggest mode, default)
Gemini CLIgemini (default, workspace-restricted)gemini --sandbox=false (unconfirmed)
AiderN/A (no sandbox)N/A
OpenCodeUnknownUnknown

Procedure B: Trigger permission/approval prompt

AgentActionExpected result
Claude Code (default mode)“create a file /tmp/test.txt with hello”Multiselect: Yes/Yes+allow/No
Codex CLI (untrusted)SameNot observed — auto-approves in sandbox
Gemini CLI“create a file /tmp/test.txt with hello”Text refusal (workspace restriction)
AiderOpen file not in chatAdd file to the chat? (Y)es/(N)o/(A)ll/(S)kip all/(D)on't ask again
OpenCodeAccess external directory△ Permission required with Allow once / Allow always / Reject

Procedure C: Trigger interactive menus

AgentCommandExpected result
Claude Code/mcpServer list with selection
Claude Code/statsUsage heatmap with date cycling
Claude Code/statusSettings panel with search box
Codex CLI/modelModel selector
Codex CLI/mcpMCP server list
Gemini CLI/settingsSettings panel (unconfirmed)
Gemini CLI/statsUsage stats

Procedure D: Observe working state

AgentActionWhat to capture
AnySend a complex multi-tool taskSpinner animation, cursor-up distance
AnySend task during active subprocessSubprocess count display
AnyPress Escape during workInterrupt marker

Procedure E: Capture raw ANSI

For each state above:

session action=output session_id=<id> limit=8000 format=raw

Look for:

  • Cursor positioning: \033[NA] (relative up), \033[r;cH (absolute)
  • Colors: \033[38;2;R;G;Bm (RGB foreground)
  • Background: \033[48;2;R;G;Bm
  • Screen clear: \033[2J
  • Scroll regions: \033[n;mr
  • OSC sequences: \033]777;..., \033]0;..., \033]8;...

Onboarding a New Agent

  1. Fill the detection matrix columns by running procedures A-E
  2. Create docs/architecture/agents/<name>.md with observed layouts
  3. Update chrome.rs if new markers/chars are needed
  4. Add test cases from real captured text
  5. Run /agent-ui-audit skill to verify parser compatibility