原生 macOS · 基于 GhosttyNative macOS · Built on Ghostty

一个窗口,
看住所有 Agent。
One window
for every agent.

几个编程 Agent 一起跑的时候,麻烦的不是再开一个终端,而是你得不停去看:谁还在干活,谁停下来等你,关掉窗口之后那段对话去了哪。AgentDeck 把这些会话放在同一条侧边栏里。每一格都是真正的 Ghostty 终端,本地目录和 SSH 服务器排在一起。

The hard part of running several coding agents is not opening another terminal. It is seeing which one is still working, which one stopped to wait for you, and where a conversation went after the window closed. AgentDeck keeps those sessions in one sidebar. Each row is a real Ghostty terminal, local folders and SSH servers together.

macOS 14 及以上 · Apple 芯片 · 免费,MITmacOS 14 or later · Apple silicon · Free, MIT

AgentDeck

codex · shop

+ 新建 AgentNew agent

等你Needs you 1

运行中Working 1

空闲Idle 1

已退出Exited 1

Codex~/src/shop

~/src/agentdeck main

❯ claude

● Reading Sources/UI/SidebarView.swift

+ 18 − 2 ActivityBadge

这一轮还没结束。你的 Ghostty 配置文件不会被改。Still on this turn. Your Ghostty config file is left alone.

~/src/shop

❯ codex

等你确认Waiting for you

Sources/Remote/SSH.swift

允许这次修改?Allow this edit?

y yes n no

~/src/api

❯ grok

✓ 本轮完成Turn complete

对话 id 还在。退出后再开,会回到这里。The conversation id is kept. Starting it again resumes here.

❯

~/notes

❯ gemini

进程已退出,回到了 shell。The process exited. You are back at the shell.

再启动会接着上次的对话。Starting it again continues the last conversation.

❯

~

%

ecs-prod · ubuntu · tmux

已重新挂上。原来的会话还在,里面的 Agent 也在。Reattached. The session is still there, agent included.

这台机器上没有为 AgentDeck 安装任何东西。Nothing was installed on this machine for AgentDeck.

ubuntu@ecs-prod:~/app$

可点的界面示意。点左侧会话会换掉终端内容;右上角的「总览」把所有 Agent 列在一起,旁边可以打开性能面板。颜色和 App 里的状态一致。A clickable sketch. Choose a session to change the terminal. Agents, at the top right, lists every agent together, next to the performance panel. Status colors match the app.

状态Status

不用切过去,也知道该看谁。See who needs you without switching over.

每个 Agent 会话旁边有自己的状态。动效也有含义:还在干活,文字上会有一道光扫过;等你的时候,圆点外面的圈会扩出去。系统打开「减弱动态效果」后,这些动画会停。

Every agent session carries its own status, and the motion means something. While it is working, a light sweeps across the label. While it is waiting on you, a ring expands from the dot. With Reduce Motion on, the animation stops.

  1. 运行中Working

    这一轮还没结束。Claude Code 用它自己的 hooks 报告状态。AgentDeck 只在启动时加上参数,不改你的设置文件。其他 Agent 则靠回车、响铃、通知和进度来判断。

    This turn is still going. Claude Code reports through its own hooks. AgentDeck passes flags at launch and never edits your settings files. Other agents are read from generic signals: Return, the bell, notifications, and progress.

  2. 等你Needs you

    权限确认、一个问题,或一条通知。⌘⇧J 跳到下一个这样的会话。响铃和通知也会在 Dock 上标出来。

    A permission prompt, a question, or a notification. ⌘⇧J jumps to the next session that needs you. Bells and notifications also badge the Dock.

  3. 本轮完成Turn done

    这一轮结束了,会话还在。点进去可以接着看。退出之后再开,也会回到同一段对话。

    This turn is finished, and the session is still there. Open it to read the result. After it exits, starting it again returns to the same conversation.

  4. 已退出Exited

    Agent 进程结束了,你回到 shell。再启动会接着上次的对话。

    The agent process has ended and you are back at the shell. Starting it again continues the last conversation.

刚启动、还在等第一次输入时,显示「就绪」。普通 Shell 没有这些状态。SSH 断了以后会出现重连按钮,提示为「已断开」,⌘⇧R 也会重连。

Right after launch, before the first prompt, the label is 就绪. A plain shell has none of these states. A dropped SSH session gets a reconnect button, described as 已断开. ⌘⇧R reconnects too.

总览Overview

所有 Agent,列在一屏里。Every agent, on one screen.

侧边栏按会话排。Agent 多了以后,你想问的其实是另一件事:现在谁在等我。⇧⌘A 把终端换成一张列表,每个 Agent 一行,不管它在哪个会话、哪个文件夹。会话都还在后台跑着。

The sidebar is ordered by session. With enough agents, the question changes: who is waiting on me right now. ⇧⌘A swaps the terminal for a list with one row per agent, whichever session or folder it lives in. Every session keeps running behind it.

  • 等你的排在最前Waiting comes first

    按状态分组:等你、运行中、空闲、已退出。等你的那一行直接写着它在等什么,每行还有它在这个状态里停了多久。也可以改成按文件夹分组。

    Grouped by state: needs you, working, idle, exited. A waiting row says what it is waiting for, and every row shows how long it has been in that state. You can group by folder instead.

  • 不进去也能回Answer without going in

    选中一行,下面是它终端的最后几行。在输入框里打字、回车,回复就发给这个 Agent,你还留在列表里。

    Select a row and the last lines of its terminal appear below. Type in the field and press Return: the reply goes to that agent, and you stay on the list.

  • 回车进到它的会话Return opens its session

    ↩ 或双击,切到它所在的会话,光标落在它的窗格里。esc 或点侧边栏里任何一个会话,回到终端。

    ↩ or a double-click goes to its session, with the cursor in its pane. esc, or any session in the sidebar, returns to the terminal.

远程Remote

服务器上什么都不用装。Nothing to install on the server.

侧边栏的「服务器」有你添加的主机,也有 ~/.ssh/config 里的别名,Include 进来的文件也算。可以填地址、用户、端口、密钥或 ssh-agent,也支持 ProxyJump。密码放在钥匙串里。

Servers lists hosts you add and every alias in ~/.ssh/config, including files pulled in with Include. You can set the address, user, port, key or ssh-agent, and ProxyJump. Passwords go in the Keychain.

默认是自动。机器上已经有 tmux 或 zellij 就用它,没有就开一个普通登录 shell,不会催你去装。连接断了可以重连。如果当时跑在 tmux 或 zellij 里,会挂回原来的会话,里面的 Agent 还在。没有多路复用器的话,就按你配置的目录重新登录。

Auto is the default. If the machine already has tmux or zellij, AgentDeck uses it. If not, you get a normal login shell, with no prompt to install anything. Reconnecting a tmux or zellij session attaches again, so the agent is still there. Without a multiplexer, it logs in again, in the directory you set.

性能面板跟着当前会话。看 SSH 会话时,采样的是那台服务器:只开一条 SSH,用一小段 POSIX shell 去读 /proc。服务器上仍然不用装东西。远程采样目前只支持 Linux。

The performance panel follows the selected session. For SSH it samples that server over one connection: a small POSIX shell loop reading /proc. Still nothing to install. Remote sampling currently supports Linux only.

对话Conversations

关掉窗口,对话还在。Close the window. The conversation stays.

Claude Code 和 Grok 在启动时就带上 AgentDeck 分配的对话 id。Codex 会在启动之后,从它自己的 ~/.codex/sessions 里对上 id。重启 App,或者一个已经退出的 Agent 再开,都会回到这段对话。⇧⌘O 按文件夹列出这个 Agent 过去的对话。

Claude Code and Grok start with a conversation id AgentDeck assigns. Codex is matched, after launch, to an id in its own ~/.codex/sessions directory. Relaunching the app, or starting an agent that had exited, resumes that conversation. ⇧⌘O lists past conversations for a folder.

分屏、分组和 SSH 连接也会按退出前的样子回来。第一次打开、没有可恢复的内容时,会在家目录开一个 shell。

Splits, groups, and SSH connections come back the way you left them. With nothing to restore, AgentDeck opens a shell in your home directory.

快捷键Keys

手不用离开键盘。Keep your hands on the keyboard.

⌘⇧J

跳到下一个等你的会话Jump to the next session that needs you

⇧⌘A

Agent 总览:所有 Agent 的列表Agent overview: the list of every agent

⌘⇧[⌘⇧]

上一个 / 下一个会话Previous / next session

⌘1⌘9

跳到对应的会话Jump to a session by number

⌘D⌘⇧D

向右分屏 / 向下分屏Split right / split down

⌘⇧↩

放大 / 还原当前窗格Zoom / restore the current pane

⌘F

在回滚里查找Find in the scrollback

⌘V

把截图或文件贴成路径Paste a screenshot or file as a path

⌘⇧R

重新连接 SSHReconnect SSH

⇧⌘O

恢复这个文件夹里以前的对话Resume an earlier conversation for this folder

⌥⌘P

打开性能监视器Open the performance panel

⌘,

设置Settings

还有这些Also

  • 内置 Claude Code、Codex、Grok、Gemini 和 Shell。其他命令行工具可以自己加。还没安装的,会给出安装命令。命令是打进登录 shell 的,Agent 退出以后,你还在那个 shell 里。Built in: Claude Code, Codex, Grok, Gemini, and a shell. Any other CLI can be added. Ones that are not installed come with an install command. The command is typed into your login shell, so when the agent exits you are still in that shell.
  • 状态跟着窗格走,不跟着会话。在分屏里自己敲 claude 或 codex,AgentDeck 也认得出来,它会有自己的状态,也会出现在总览里。Status belongs to the pane, not the session. Type claude or codex into a split yourself and AgentDeck notices: it gets its own status and its own row in the overview.
  • 剪贴板里如果是截图,⌘V 会先存成 PNG,再贴上路径,这样就能把图交给 Agent。拷进来或拖进来的文件,会变成 shell 转义后的路径。If the clipboard holds a screenshot, ⌘V saves a PNG and pastes the path, which is how you hand an image to an agent. Copied or dragged files paste as shell-escaped paths.
  • 中文、日文、韩文输入法可以用,候选窗贴着光标。Chinese, Japanese, and Korean input methods work, with the candidate window anchored at the cursor.
  • 会话可以重命名,也可以放进分组。分组是侧边栏里可折叠的一段。Sessions can be renamed or moved into a group. A group is a collapsible section in the sidebar.
  • 性能面板里还有 Docker。可以看容器日志、进容器开一个 shell,也可以启动、停止或重启。从容器打开的会话,下次启动 App 时不会恢复。The performance panel also lists Docker containers. You can open logs, a shell inside a container, and start, stop, or restart one. Sessions opened from a container are not restored on the next launch.
  • 每天会查一次更新,菜单里也可以自己检查。更新来自 GitHub Releases,要有 EdDSA 签名,并且 Developer ID 得和当前这个 App 一致。如果有 Agent 正处在这一轮里,重启前会先问你。AgentDeck checks for an update once a day, and you can check from the menu. Updates come from GitHub Releases. Each one is EdDSA-signed and must carry the same Developer ID as the app you have. If an agent is mid-turn, it asks before restarting.
全部细节All the details

窗格Panes

  • ⌘[⌘] 或 ⌘⌥←↑↓→ 在窗格之间移动。⌘[⌘] or ⌘⌥←↑↓→ move between panes.
  • ⌘⌃←↑↓→ 调整大小,⌃⌘= 均分,⌘W 关闭当前窗格。⌘⌃←↑↓→ resize, ⌃⌘= equalizes, ⌘W closes the pane.
  • 新窗格沿用当前文件夹。布局在重启 App 后恢复。A new pane starts in the current folder. Layouts are restored on relaunch.

查找与回滚Find and scrollback

  • ↩⇧↩ 或 ⌘G⇧⌘G 在匹配之间前后跳,旁边有匹配计数。↩⇧↩ or ⌘G⇧⌘G step through matches, with a match counter.
  • ⌘E 用选中的文字查找。⌘E searches for the current selection.
  • ⌘↑⌘↓ 在提示符之间跳。滚动指示条可以直接拖。⌘↑⌘↓ jump between prompts. The scroll indicator can be dragged.

AgentAgents

  • ⌘⇧1…⌘⇧9 按「管理 Agent」里的顺序新建会话。⌘⇧1…⌘⇧9 open a new session, in the order shown in Manage Agents.
  • 自定义 Agent 可以分别填新对话、恢复对话、继续最近对话的参数。参数里的 {id} 会换成对话 id。A custom agent takes separate arguments for a new conversation, resuming one, and continuing the latest. {id} in them becomes the conversation id.
  • AgentDeck 在你登录 shell 的 PATH 里找这些命令,所以 nvm、~/.local/bin 里装的也能找到。AgentDeck looks for the commands on the PATH of your login shell, so ones installed through nvm or in ~/.local/bin are found.

服务器Servers

  • 编辑服务器时有命令预览和「测试连接」,会显示系统、有没有 tmux 或 zellij、已有哪些会话。The server editor shows a command preview and a Test Connection button, which reports the OS, whether tmux or zellij is installed, and existing sessions.
  • 可以按服务器指定用 tmux 或 zellij,也可以附加到一个已有的会话。You can force tmux or zellij per server, or attach to an existing session.
  • 右键 ~/.ssh/config 里的条目可以把它从列表里拿掉。只是在 AgentDeck 里隐藏,文件不会被改,之后可以恢复。Right-click an entry from ~/.ssh/config to remove it from the list. It is only hidden in AgentDeck; the file is not edited, and hidden entries can be restored.
  • Ghostty 的 ssh 集成照常可用(ssh-terminfo、ssh-env)。The ssh integration from Ghostty works as usual (ssh-terminfo, ssh-env).

性能面板Performance panel

  • CPU(每核,服务器上还有负载)、内存、GPU(Apple GPU,服务器上通过 nvidia-smi 读 NVIDIA)、网络、磁盘。CPU (per core, plus load average on servers), memory, GPU (Apple GPU, or NVIDIA through nvidia-smi on servers), network, and disk.
  • 「会话占用」:在 Mac 上是每个会话的进程树,在服务器上是最忙的几个进程。Session usage: the process tree of each session on the Mac, the busiest processes on a server.
  • 显示哪些、多久刷新一次(1、2 或 5 秒)可以在面板菜单里选。Choose which monitors to show and how often they refresh (1, 2, or 5 seconds) from the panel menu.
  • 面板默认关着。关着或窗口隐藏时不采样,也不保持连接。The panel is closed by default. While it is closed or the window is hidden, nothing is sampled and no connection is kept.

设置Settings

  • 终端:配色主题(Ghostty 自带的全部主题加你自己的,带色块和搜索)、字体、字号、行高、光标样式和闪烁、内边距。Terminal: color theme (every theme bundled with Ghostty plus your own, with swatches and search), font, size, line height, cursor style and blink, padding.
  • 还有 Option 当作 Alt、选中即复制、打字时隐藏鼠标。改动带实时预览。Also Option as Alt, copy on select, and hiding the mouse while typing. Changes preview live.
  • 外观:背景不透明度 30–100%,以及模糊程度。只在 AgentDeck 里生效。Appearance: background opacity from 30 to 100%, and blur. This applies inside AgentDeck only.

下载Download

合用就拿去。Take it if it fits.

这是照着一个人自己的工作流做的,开源出来。可以从 Releases 下载签过名的包,也可以自己构建。

Built for one person's workflow, and open-sourced in case it fits yours. Download a signed build from Releases, or build it yourself.

  • 系统SystemmacOS 14 或更高macOS 14 or later
  • 芯片Chip目前只有 Apple 芯片Apple silicon only, for now
  • 远程采样Remote stats目前只支持 LinuxLinux only, for now
  • 许可LicenseMIT。终端引擎是 GhosttyMIT. The terminal engine is Ghostty
从源码构建Build from source

需要 macOS 14 或更高、Xcode 16 或更高、XcodeGen,以及 Zig(版本看 vendor/ghostty/build.zig.zon 里的 minimum_zig_version)。

You need macOS 14 or later, Xcode 16 or later, XcodeGen, and Zig (the version named by minimum_zig_version in vendor/ghostty/build.zig.zon).

git clone --recursive https://github.com/CassianFlorin/AgentDeck.git
cd AgentDeck
scripts/build-ghosttykit.sh      # 构建 GhosttyKit,第一次约 5 分钟builds GhosttyKit, about 5 minutes the first time
scripts/fetch-sparkle.sh         # 下载 Sparkle 更新框架downloads the Sparkle updater
xcodegen
open AgentDeck.xcodeproj

Debug 配置是 ad-hoc 签名,不需要证书。Xcode 26 及以后,Metal 编译器是单独的组件,装一次就行:

The Debug configuration is ad-hoc signed, so no certificate is needed. On Xcode 26 and later the Metal compiler is a separate component; install it once:

xcodebuild -downloadComponent MetalToolchain

如果 Zig 自己下载依赖失败(走 HTTP 代理时报 400,或者报 hash mismatch、DirNotEmpty),先用 curl 把依赖取下来,再离线构建:

If Zig fails to fetch its dependencies (a 400 behind an HTTP proxy, or hash mismatch / DirNotEmpty), fetch them with curl first and build offline:

scripts/prefetch-zig-deps.sh
ZIG_SYSTEM_DIR=vendor/zig-deps/pkg scripts/build-ghosttykit.sh

构建被打断之后报 hash mismatch,用 CLEAN=1 scripts/build-ghosttykit.sh 重来。

For a hash mismatch after an interrupted build, run CLEAN=1 scripts/build-ghosttykit.sh.