一、那个让人崩溃的下午
上个月的某个下午,我正在工位上处理一个紧急需求。领导突然走过来:"小王的项目需要紧急支持,你把那几个Agent任务都启动一下,测试环境要用。"
我盯着屏幕上密密麻麻的10个项目目录,心里一阵发麻。每个项目都需要启动不同的Agent CLI工具------有的用codex
,有的用claude
,还有几个用自研的命令行工具。按照以往的流程,我需要:
- 打开第一个终端,
cd
到项目A目录 - 输入
codex start
启动Agent - 重复步骤1-2,再开9个窗口...
15分钟后,我的任务栏挤满了终端窗口,像极了失控的浏览器标签页。更要命的是,测试完成后还要一个个关闭这些窗口。那一刻我意识到:一定有更优雅的解决方案。
二、Rust重构之路
当晚回家后,我打开了VSCode。作为一名Rust开发者,我决定用最擅长的语言来解决这个痛点。核心需求很明确:
- 批量管理项目目录 :不想再手动
cd
来cd
去 - 复用常用命令:那些Agent CLI命令应该存起来,不用每次都敲
- 一键启动全部:选择目录+选择命令,剩下的交给工具
三个晚上的开发后,open-terminal-agents
诞生了。项目代码完全基于Rust标准库,零外部依赖,编译产物只有几MB,非常适合离线环境使用。
三、核心设计思路
3.1 TOML配置驱动
配置文件采用TOML格式,存储在用户主目录的.open-terminal-agents/settings.toml
:
ini
terminal = "powershell"
language = "zh"
[[paths]]
path = "D:\projects\api-service"
alias = "api"
[[paths]]
path = "D:\projects\web-app"
alias = "web"
agent_commands = ["codex", "claude --model sonnet", "ccr code"]
为什么选TOML?相比JSON更易读,比YAML规则简单,Rust生态支持完善。
3.2 跨平台终端适配
最头疼的是跨平台支持。Windows、Linux、macOS的终端启动方式完全不同:
Windows策略:
css
// 优先使用Windows Terminal
if Command::new("wt").arg("--version").status().is_ok() {
Command::new("wt")
.args(["new-tab", "-d", &path, "powershell", "-NoExit", "-Command", &cmd])
.spawn()?;
}
Linux策略:
scss
// 依次尝试常见终端,优雅降级
for terminal in &["gnome-terminal", "konsole", "xfce4-terminal", "alacritty"] {
if Command::new(terminal).arg("--version").status().is_ok() {
// 找到可用终端,启动任务
break;
}
}
macOS策略:
lua
// 使用AppleScript调用原生Terminal
let script = format!(
r#"tell application "Terminal"
do script "cd {} && {}"
end tell"#,
path, cmd
);
Command::new("osascript").arg("-e").arg(&script).spawn()?;
3.3 交互式选择器
使用空格键多选目录和命令,按A
全选,按Q
退出。这套交互逻辑参考了fzf
等工具的最佳实践:
less
$ ota
┌─ 选择项目目录 ──────────────────┐
│ [x] api-service (api) │
│ [x] web-app (web) │
│ [ ] data-pipeline │
└─────────────────────────────────┘
Space: 选择 | A: 全选 | Q: 退出
┌─ 选择Agent命令 ─────────────────┐
│ [x] codex │
│ [x] claude --model sonnet │
│ [ ] ccr code │
└─────────────────────────────────┘
四、实战效果
回到开头的场景,现在只需要:
ruby
$ ota # 启动交互式选择器
# 勾选10个项目目录
# 勾选需要的Agent命令
# 回车确认
3秒钟,10个终端窗口全部就绪。同事看到后直呼"这也太爽了",纷纷来要工具链接。
更让我惊喜的是,工具还解决了团队知识沉淀的问题。新同事入职时,只需要把团队常用的命令配置好:
csharp
$ ota agent-command --add "codex"
$ ota agent-command --add "claude"
新人clone代码后,直接ota
选择项目启动,完全不需要查阅冗长的文档。
五、快速上手
安装
perl
# Rust用户
cargo install --path .
# Windows用户可以通过npm安装
npm install -g open-terminal-agents
基础使用
csharp
# 添加项目目录
ota path --add ~/projects/my-app app
# 添加常用命令
ota agent-command --add "codex"
# 一键启动
ota
配置Windows终端
bash
# 切换到PowerShell
ota terminal powershell
# 或使用CMD
ota terminal cmd
六、写在最后
这个工具目前已在团队内部使用三周,累计节省了大约20小时的重复劳动。下一步计划:
- 支持Windows Terminal的窗格模式,自定义 iTerm 配置文件
如果你也被多终端窗口折磨过,不妨试试这个工具。项目已开源(MIT协议),欢迎提Issue和PR。
GitHub仓库 : open-terminal-agents
命令别名 : ota
(比全称好敲多了)
如果你有什么好的想法建议,欢迎评论区分享~