Terminal session manager for AI coding agents. One TUI for Claude, Gemini, OpenCode, Codex, and more.
# Add to your Claude Code skills
git clone https://github.com/asheshgoplani/agent-deckLast scanned: 4/24/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-04-24T06:09:38.736Z",
"semgrepRan": false,
"npmAuditRan": true,
"pipAuditRan": true
}No comments yet. Be the first to share your thoughts!
Your AI agent command center
Features . Conductor . Install . Quick Start . Docs . Discord . FAQ
Option 1: Claude Code Skill (recommended for Claude Code users)
/plugin marketplace add asheshgoplani/agent-deck
/plugin install agent-deck@agent-deck-help
Then ask: "How do I set up MCP pooling?"
Option 2: OpenCode (has built-in Claude skill compatibility)
# Create skill directory
mkdir -p ~/.claude/skills/agent-deck/references
# Download skill and references
curl -sL https://raw.githubusercontent.com/asheshgoplani/agent-deck/main/skills/agent-deck/SKILL.md \
> ~/.claude/skills/agent-deck/SKILL.md
for f in cli-reference config-reference tui-reference troubleshooting; do
curl -sL "https://raw.githubusercontent.com/asheshgoplani/agent-deck/main/skills/agent-deck/references/${f}.md" \
> ~/.claude/skills/agent-deck/references/${f}.md
done
OpenCode will auto-discover the skill from ~/.claude/skills/.
Option 3: Any LLM (ChatGPT, Claude, Gemini, etc.)
Read https://raw.githubusercontent.com/asheshgoplani/agent-deck/main/llms-full.txt
and answer: How do I fork a session?
https://github.com/user-attachments/assets/e4f55917-435c-45ba-92cc-89737d0d1401
Five minutes from zero to a Telegram bot that watches every Claude session you have running.
# 1. Create a Telegram bot via @BotFather, grab the token + your user ID from @userinfobot.
# 2. Run the wizard — it sets up the conductor, bridge daemon, and heartbeat in one shot.
agent-deck conductor setup work --description "Work fleet"
agent-deck session start conductor-work
# 3. Message your bot: /status
That's it. From now on every other agent-deck session you run is supervised by a single
"conductor" session that answers routine questions, escalates the interesting ones to your
phone, and never lets a waiting worker rot.
Two short guides to read next:
docs/CONDUCTOR-SETUP.md — five-minute walkthrough,
Telegram/Slack/Discord wiring, the gotchas (why the plugin auto-disables globally, channel
topology, multi-conductor patterns).docs/WATCHER-SETUP.md — add "doorbells" so the outside world
(GitHub events, gmail, ntfy pushes, meetings) can wake the conductor up.
Running Claude Code on 10 projects? OpenCode on 5 more? Another agent somewhere in the background?
Managing multiple AI sessions gets messy fast. Too many terminal tabs. Hard to track what's running, what's waiting, what's done. Switching between projects means hunting through windows.
Agent Deck is mission control for your AI coding agents.
One terminal. All your agents. Complete visibility.
Try different approaches without losing context. Fork any Claude conversation instantly. Each fork inherits the full conversation history.
f for quick fork, F to customize name/groupAttach MCP servers without touching config files. Need web search? Browser automation? Toggle them on per project or globally. Agent Deck handles the restart automatically.
m to open, Space to toggle, Tab to cycle scope (LOCAL/GLOBAL), type to jump~/.agent-deck/config.toml, then toggle per session — see Configuration ReferenceAttach/detach Claude skills per project with a managed pool workflow.
s to open Skills Manager for a Claude session~/.agent-deck/skills/pool) to keep attach/detach deterministic.agent-deck/skills.toml and materializes into .claude/skillsAgent Deck supports per-group CLAUDE_CONFIG_DIR and env_file overrides. Useful when a single profile hosts groups that should authenticate against different Claude accounts — for example, a personal profile hosting a conductor group pinned to ~/.claude-work while other groups stay on ~/.claude.
Override any group by adding a [groups."<name>".claude] table to ~/.agent-deck/config.toml:
[groups."conductor".claude]
config_dir = "~/.claude-work"
env_file = "~/git/work/.envrc"
Lookup priority: env > group > profile > global > default. The env_file is sourced into the tmux pane before claude (or the custom command) execs, so any exports it contains become part of the session environment.
Human-watchable verification: bash scripts/verify-per-group-claude-config.sh. The harness creates two throwaway groups, launches one normal and one custom-command session, and prints a pass/fail table.
Conductors are first-class agent-deck entities (see agent-deck conductor setup). Each conductor can carry its own Claude config_dir and env_file via a top-level [conductors.<name>.claude] block:
[conductors.gsd-v154.claude]
config_dir = "~/.claude-work"
env_file = "~/git/work/.envrc"
The conductor name is the string you passed to agent-deck conductor setup <name> — it's the same name that appears in session titles (conductor-<name>).
Precedence chain (most-specific → least-specific):
CLAUDE_CONFIG_DIR env var[conductors.<name>.claude] (when the session is a conductor session, i.e. Title starts with conductor-)[groups."<group>".claude] (PR #578)[profiles.<profile>.claude][claude] (global)~/.claude (default)This means a single [conductors.gsd-v154.claude] line replaces the need to duplicate the config into [groups."conductor".claude] — the conductor block scopes to exactly that conductor, not to every conductor that shares the conductor group.
Backward compat: sessions in the conductor group with NO matching [conductors.<name>.claude] block continue to resolve via [groups."conductor".claude] as they did in v1.5.4 Phase 1–3.
Closes issue #602.
Running many sessions? Socket pooling shares MCP processes across all sessions via Unix sockets, reducing MCP memory usage by 85-90%. Connections auto-recover from MCP crashes in ~3 seconds via a reconnecting proxy. Enable with pool_all = true in config.toml.
Press / to fuzzy-search across all sessions. Filter by status with ! (running), @ (waiting), # (idle), $ (error). Press G for global search across all Claude conversations.
Two tiers of keybindings move the cursor around the session list. The global tier is unchanged from earlier versions; the Alt+ tier (added in v1.7.60) restricts movement to the current group only. Press ? in the TUI to see the full table in-app.
| Scope | Keys | What it does |
|---|---|---|
| Global (flat list) | j / k or ↓ / ↑ | Move cursor down / up through every item |
| Global | gg | Jump to top of list |
| Global | G | Open global search across all Claude conversations |
| Global | 1–9 | Jump to Nth root group header |
| Global | / | Open fuzzy search across all sessions |
| Group (current group only) | Alt+j / Alt+k | Next / previous session in current group (skips group boundaries) |
| Group | Alt+1–Alt+9 | Jump to Nth session within the current group |
| Group | Alt+g / Alt+G | First / last session in current group |
| Group | Alt+/ | Open fuzzy search filtered to the current group's sessions |
"Current group" is derived from the cursor position: on a session it's that session's group; on a group header it's that group; on a window it's the parent session's group. On a group boundary Alt+j / Alt+k no-op rather than spilling into the next group.
Smart polling detects what every agent is doing righ