Go CLI. PTY-based wrapper around AI coding CLIs with automatic limit detection and provider switching.
main.go— entry point, arg routing,ai switch(SIGUSR1 to all PIDs), clipboard helperinternal/config/— YAML config loading, default limit patterns from real CLI sourceinternal/proxy/— PTY proxy: spawns CLI in pseudo-terminal, monitors output, SIGUSR1/SIGQUIT signal handling, provider picker menu (raw mode single-keypress), multi-PID managementinternal/session/— session persistence, Claude Code JSONL session file extraction (~/.claude/projects/<project>/<id>.jsonl), git diff/log capture, continuation prompt builderinternal/logger/— append-only log filetest/— fake provider scripts for testing limit detection flow
go build -o /usr/local/bin/ai .~/.config/ai-cli/config.yaml — provider chain, permission bypass args/env, limit patterns.
- Full PTY passthrough — user sees actual TUI, no filtering
- Output ring buffer (8KB) scanned for limit patterns (ANSI-stripped via regex)
ai switchsends SIGUSR1 to ALL runningaiprocesses via PID files in~/.local/share/ai-cli/pids/- Context extraction reads Claude Code JSONL session files directly, parses user/assistant messages
- Extra CLI args only forwarded to initial provider, not fallbacks (prevents flag leakage)
- Provider picker uses raw mode for single-keypress selection
- Permission bypass baked into config per provider (different mechanisms: CLI flags for Claude/Codex, env var for OpenCode, none needed for Pi)
- Claude Code:
--dangerously-skip-permissionsflag. Sessions stored as JSONL at~/.claude/projects/ - OpenCode:
OPENCODE_PERMISSION='{"*":"allow"}'env var (TUI doesn't support--dangerously-skip-permissions, onlyopencode rundoes). Model format:provider/model(e.g.google/gemini-2.5-flash) - Codex:
--full-autoflag. Model format: just model name (e.g.o3) - Pi: No permission system. Model format: pattern match without provider prefix (e.g.
gemini-2.5-flash). Binary requires full nvm path in config due to lazy-loaded nvm.
GOOGLE_GENERATIVE_AI_API_KEY— for OpenCode's Gemini modelsGEMINI_API_KEY— for Pi's Gemini modelsGROQ_API_KEY— for OpenCode's Groq models- Set in
~/.zshenv