基于Git Worktree与Tmux的并行AI开发环境编排工具ag.sh详解 1. 项目概述一个为并行AI开发而生的命令行利器如果你和我一样日常工作中需要频繁地与Claude Code这类AI编程助手打交道同时处理多个开发任务那你一定体会过那种“分身乏术”的混乱感。在终端里开一堆窗口每个窗口对应一个任务分支稍不留神就在错误的上下文中输入了命令或者因为终端意外关闭而丢失了宝贵的对话状态。这种体验说好听点是“充满挑战”说直接点就是效率杀手。今天要聊的ag.sh正是为了解决这个痛点而生的。它是一个纯粹用Bash编写的、开源的命令行工具核心使命就一个让你能像管理操作系统进程一样轻松地并行运行和管理多个独立的AI开发代理。简单来说ag.sh是一个AI开发环境ADE编排器。它把三个强大的概念——Git Worktree、Tmux会话和AI代理如Claude Code——巧妙地捆绑在一起为你创建的每一个开发任务提供一个完全隔离、持久化且状态清晰的“沙盒”。你不再需要手动去创建分支、切换目录、启动Tmux、再连接AI代理。一句ag spawn所有这些繁琐的步骤瞬间完成。你可以同时发起十个不同的功能开发或问题排查任务每个任务都在自己的“泡泡”里运行互不干扰。下班时直接关掉终端第二天回来ag resume一下所有任务的状态——包括未完成的AI对话——都原封不动地回来了。这种丝滑的体验对于追求极致效率的开发者而言无疑是巨大的生产力解放。2. 核心设计理念与架构拆解ag.sh的设计哲学非常清晰可以用三个关键词来概括隔离Isolated、持久Persistent和无状态Stateless。这不仅仅是口号而是其底层架构的基石理解了这三点你就能明白它为何如此高效和可靠。2.1 隔离性Git Worktree 构建的天然屏障隔离是并行开发的生命线。ag.sh实现隔离的核心手段是Git Worktree。对于不熟悉Git Worktree的开发者来说可以把它理解为一个“链接到同一仓库但拥有独立工作目录的分支”。传统的git checkout会在同一个目录下切换文件而git worktree add则会在另一个全新的目录里创建分支的副本。ag.sh正是利用了这一点。每当你执行ag spawn创建一个新任务时它会在后台执行类似以下的操作基于当前分支或指定分支创建一个新的唯一分支例如ag/feature-x-1234。使用git worktree add命令在项目根目录下的一个专属路径如../.ag-worktrees/ag-feature-x-1234中为该分支创建一个独立的工作树。后续所有针对该任务的操作运行AI代理、执行命令都严格限定在这个独立的工作目录中。这意味着什么意味着任务A的AI代理无论如何折腾文件都绝对不可能影响到任务B的代码因为它们物理上就在不同的文件夹里。你可以在任务A里疯狂实验一个破坏性的重构同时在任务B里修复一个生产环境的紧急Bug两者并行不悖。这种基于文件系统的隔离比任何虚拟环境或容器都更轻量、更直接也更容易理解和调试。注意使用Git Worktree的前提是你的Git版本不能太旧需要2.5。使用前最好用git --version确认一下。对于老项目也要确保.git目录结构是标准的。2.2 持久性Tmux 会话守护的“不灭之火”AI开发尤其是与Claude Code的交互往往是一个持续的、有状态的对话过程。你提出了需求AI给出了代码你运行测试反馈错误AI进行修正……这个对话链路一旦中断上下文丢失体验就会大打折扣。ag.sh通过Tmux来解决持久化问题。Tmux是一个终端复用器它可以让你在后台运行会话即使关闭终端窗口会话中的进程也不会终止。ag.sh为每个任务创建的不是一个简单的后台进程而是一个完整的Tmux会话窗口。当你ag spawn时其内部流程大致如下在新的Git Worktree目录中启动一个新的Tmux会话并以任务ID命名如ag-feature-x。在这个Tmux窗口里同时启动两个“窗格”Pane一个运行Claude Code或你配置的其他AI代理命令另一个则是一个普通的Bash Shell方便你手动执行git命令、运行测试等。这个Tmux会话被设置为“脱离”detach状态在后台安静运行。从此这个任务就拥有了“永生”的能力。你可以关掉终端可以重启电脑。只要Tmux的服务器进程还在它通常作为守护进程运行你的AI代理对话和Shell状态就被完好地保存着。第二天你只需要运行ag open task-id就能重新附着attach到这个Tmux窗口仿佛从未离开。ag resume命令更是贴心它能扫描磁盘上所有由ag.sh创建的Worktree并自动为它们恢复对应的Tmux会话。2.3 无状态性Git 作为唯一信源很多工具为了实现状态管理会引入数据库、配置文件或者一个常驻的守护进程daemon。这些组件虽然强大但也带来了复杂性数据库可能损坏配置文件需要同步守护进程可能意外崩溃。ag.sh选择了一条极简的道路无状态。它的全部状态就是Git仓库本身和文件系统上的那些Worktree目录。没有任何额外的元数据需要管理。任务列表是什么就是扫描.ag-worktrees目录下的所有文件夹。任务的状态是什么就是对应的Tmux会话是否存在。这种设计的优势极其明显极其可靠只要你的Git仓库没坏你的工作就丢不了。即使Tmux服务器彻底崩溃你的所有代码更改都安全地保存在Git Worktree里。你损失的顶多是AI对话的上下文对于支持上下文恢复的代理ag.sh甚至会尝试恢复但核心产出——代码——毫发无损。零开销没有后台进程占用内存没有数据库读写消耗IO。工具本身只是一个Bash脚本调用即执行执行完即退出。易于理解和调试所有东西都是可见的、可触摸的。你可以用标准的git worktree list查看所有工作树用tmux ls查看所有会话。出了问题你也完全可以用这些基础工具进行手动干预和修复。这种将状态完全卸载给成熟、可靠的基础设施Git和文件系统的思路体现了Unix哲学的精髓每个工具只做好一件事并通过清晰的接口进行组合。3. 核心功能与命令详解ag.sh的API设计非常克制只有寥寥几个命令但每个都直击要害。下面我们来逐一拆解并补充一些官方文档可能未提及的实操细节和技巧。3.1 任务生命周期管理这是ag.sh最核心的一组命令覆盖了一个任务的生老病死。ag spawn [branch-name]- 孕育新任务这是你的起点。运行它一个新世界就此展开。作用基于当前分支或指定的branch-name创建一个新的Git Worktree和分支并在其中启动一个包含AI代理和Shell的Tmux会话。内部流程详解生成唯一ID工具会生成一个唯一的任务标识符通常结合了分支名和时间戳例如ag-feature-auth-20240415。创建工作树在项目根目录的上一级避免污染项目本身创建.ag-worktrees/task-id目录并执行git worktree add。构建Tmux环境创建名为task-id的Tmux会话。在会话中划分出两个窗格通常左侧窗格运行AI代理如claude -w .右侧窗格是一个普通的Bash并自动cd到工作树目录。可能会设置一些友好的Tmux选项比如窗格标题、状态栏提示等。脱离并返回Tmux会话启动后立即脱离让你回到原来的终端。同时在终端中打印出新任务的ID和如何连接它的提示。实操心得你可以通过环境变量AG_AI_CMD来定制启动AI代理的命令。例如如果你用的是Codeium可以设置export AG_AI_CMDcodeium -w .。这样ag.sh就会用你喜欢的代理来填充左侧窗格。如果你希望新任务基于一个特定的、已存在的远程分支可以先git fetch origin然后执行ag spawn origin/feature-branch。ag.sh会以这个远程分支为起点创建本地跟踪分支和工作树。ag ls- 总览全局当你同时进行着五六个任务时很容易忘记谁是谁。ag ls就是你的任务管理器。作用列出所有由ag.sh创建的、当前活跃的任务。输出解析它通常会显示以下几列信息Task ID: 任务的唯一标识也是Tmux会话名。Branch: 该任务所在的分支。Path: Git Worktree的绝对路径。Status: Tmux会话状态Attached/Detached。Created: 创建时间。背后原理这个命令的实现非常“无状态”。它其实就是去扫描.ag-worktrees目录列出所有子文件夹然后针对每个文件夹去检查是否存在同名的Tmux会话并收集上述信息。没有任何复杂的缓存或数据库查询。ag open task-id- 重返战场这是你最常用的命令之一用于连接到一个正在后台运行的任务。作用附着attach到指定任务ID的Tmux会话窗口。体验执行后你的当前终端窗口会“变身”为那个任务的Tmux窗口。左边是AI代理在等待你的指令右边是准备好的Shell所有历史命令和AI对话上下文都完好如初。你可以无缝继续之前的工作。技巧你可以利用Tmux自身的快捷键在窗格间切换例如Ctrl-b 方向键调整窗格布局甚至创建新的窗格。ag.sh只是搭建了舞台舞台上的表演完全由你通过Tmux来控制。ag kill task-id- 温和终止当你完成一个任务或者想清理一个实验性的任务时使用。作用终止指定任务的Tmux会话但保留其Git Worktree和所有代码更改。重要区别kill只杀进程Tmux会话不删文件。你的代码修改还安全地留在工作树目录和对应的Git分支里。你之后仍然可以手动切换到那个分支去查看或提交代码。使用场景任务已完成AI对话不再需要但代码成果需要保留并后续处理。ag rm task-id- 彻底清除这是清理工具用于当你确定某个任务及其所有产物都不再需要时。作用1. 终止Tmux会话如果存在。2. 删除Git Worktree目录。3. 删除对应的Git分支可选通常通过git worktree remove的某个标志实现。警告这是一个破坏性操作执行前请务必确认该工作树中的更改已经妥善提交或备份。一旦删除通过常规手段难以恢复。安全建议我个人的习惯是在ag rm之前先ag open到那个任务在Shell窗格里运行git status确认没有未提交的重要更改。或者更保守的做法是永远只用ag kill然后手动去清理不再需要的分支和工作树。ag resume- 系统重启后的“时光机”这是体现ag.sh持久性魅力的关键命令。作用扫描所有存在的.ag-worktrees并为每一个尝试重新创建或连接其Tmux会话。内部逻辑遍历.ag-worktrees下的每个目录。检查是否存在同名的Tmux会话。如果不存在则新建一个Tmux会话并尝试在其中恢复AI代理的对话状态如果AI代理客户端支持从磁盘恢复会话历史的话。如果存在则忽略或报告该会话已在运行。为什么重要想象一下你的电脑因为系统更新需要重启或者你不小心关闭了所有的终端窗口。对于传统的开发方式你可能需要重新打开一堆终端cd到不同目录重新启动AI代理并试图回忆之前的对话上下文。而有了ag.sh你只需要在项目根目录下执行一次ag resume所有的工作环境就像从未中断过一样瞬间回归。这种体验极大地降低了上下文切换的成本。3.2 高级配置与定制ag.sh的默认配置已经足够好用但它也提供了一些钩子hook和环境变量允许你进行深度定制使其更贴合你的工作流。环境变量配置AG_WORKTREE_ROOT默认情况下工作树会被创建在${PROJECT_ROOT}/../.ag-worktrees。如果你希望集中管理所有项目的工作树或者想将其放在SSD等其他磁盘上可以通过这个变量来指定根目录。例如export AG_WORKTREE_ROOT$HOME/.cache/ag-worktrees。AG_AI_CMD如前所述这是最重要的定制项。默认值可能是claude -w .。你可以将其改为任何能在终端中运行的AI编程助手命令。例如export AG_AI_CMDcursor_agent --attach .(如果你使用Cursor的Agent模式)export AG_AI_CMDcodeium -w .(使用Codeium)甚至是一个自定义的脚本export AG_AI_CMD$HOME/bin/my_ai_wrapper.shTmux 配置集成ag.sh创建的Tmux会话会继承你的全局Tmux配置通常是~/.tmux.conf。你可以利用这一点来美化或增强任务窗口。状态栏定制你可以在~/.tmux.conf中设置状态栏让其显示会话名即任务ID这样当你同时打开多个终端附着到不同任务时能一眼分清。# 在 ~/.tmux.conf 中 set -g status-left #[fgcolour220]#S #[fgcolour250]| # 显示会话名窗格布局如果你不喜欢默认的左右分屏50%-50%你可以配置Tmux在创建新窗口时使用其他布局比如主窗格大一些。不过ag.sh可能会在创建时指定布局所以最好在ag.sh执行后再用Tmux快捷键如Ctrl-b Space循环切换布局。与现有工作流的融合ag.sh并非要取代你现有的Git工作流而是增强它。提交代码当你在一个任务中完成了功能开发并经过AI和手动测试验证后你需要提交代码。这时你应该在任务的Shell窗格中而不是AI代理窗格执行标准的Git操作# 在 ag.sh 任务窗格的右侧Shell中 git add . git commit -m feat: implement user authentication git push origin HEAD # 推送到远程仓库代码审查推送分支后你可以在GitHub、GitLab等平台上发起合并请求Pull Request。由于每个ag.sh任务都是独立分支这变得非常自然。切换基础分支如果你的develop分支有了重大更新你想让当前任务分支变基rebase到最新的develop上。你可以在任务Shell中执行git fetch origin git rebase origin/develop如果发生冲突你可以直接在Shell中解决或者让AI代理在左侧窗格帮助你分析冲突文件。4. 实战场景与操作流程理解了核心概念和命令后让我们通过几个具体的开发场景来看看ag.sh如何融入并优化你的日常。4.1 场景一并行处理多个功能需求假设你是一名全栈开发者当前产品经理同时提了三个需求A) 用户个人资料页优化B) 支付接口集成C) 后台数据报表导出。传统上你可能会为需求A创建分支feat/profile开始工作中途被需求B打断。暂存A的更改切换分支到feat/payment上下文切换导致效率下降。在B中遇到复杂问题想同时咨询AI但同一个AI会话的上下文会被不同需求污染。使用ag.sh你的工作流将变为# 1. 在项目根目录为每个需求生成独立任务环境 ag spawn feat/profile-optimization ag spawn feat/payment-integration ag spawn feat/report-export # 2. 通过 ag ls 查看所有任务 ag ls # 输出类似 # ID BRANCH PATH STATUS # ag-feat-profile-optimization ag/feat-profile-optimization /path/to/.ag-worktrees/ag-... Detached # ag-feat-payment-integration ag/feat-payment-integration /path/to/.ag-worktrees/ag-... Detached # ag-feat-report-export ag/feat-report-export /path/to/.ag-worktrees/ag-... Detached # 3. 打开第一个任务开始工作 ag open ag-feat-profile-optimization # 现在你处于一个Tmux窗口左边是Claude Code右边是Shell。 # 你可以对AI说“请帮我优化用户个人资料页的响应式布局当前代码在views/profile.html中。” # 同时在右边Shell运行本地开发服务器进行实时预览。 # 4. 临时切换到第二个任务不关闭第一个 # 在当前Tmux窗口中按 Ctrl-b d 脱离当前会话。 # 回到主终端打开第二个任务 ag open ag-feat-payment-integration # 现在你完全进入了支付集成的上下文。AI和Shell都与此相关与第一个任务物理隔离。 # 你可以问AI“如何安全地集成Stripe的PCI兼容支付流程” # 在Shell中安装Stripe的SDK并编写测试。 # 5. 如此往复在三个任务间无缝切换。每个任务的AI对话历史、Shell命令历史、未提交的代码更改都完全独立且持久保存。这个场景下的核心优势零上下文污染和AI讨论布局时它不会突然蹦出关于支付API的建议。状态持久化下班时直接关电脑。第二天ag resume三个任务窗口立刻恢复昨天的对话和未完成的代码都在。物理隔离保障安全在支付集成任务里rm -rf node_modules进行依赖重装绝不会影响到正在优化的个人资料页代码。4.2 场景二长期运行的任务与实验性探索有些任务周期很长比如“重构整个身份验证模块”或者“尝试用新的状态管理库替换Redux”。这些任务风险高周期长不适合在主线分支上直接进行。传统做法是开一个长期存在的特性分支但当你需要切换回主线修复Bug时这个分支上未完成且可能不稳定的代码会让你感到棘手。ag.sh为此类场景提供了完美的沙盒# 1. 从最新的 main 分支创建一个探索性任务 git checkout main git pull origin main ag spawn refactor-auth-module # 2. 进入这个“实验室” ag open ag-refactor-auth-module # 3. 进行大刀阔斧的、甚至可能是破坏性的重构。你可以让AI生成大量实验性代码随意提交到本地的 ag/refactor-auth-module 分支。 # 4. 突然线上出现一个紧急Bug需要你立刻处理。 # 5. 脱离当前任务会话 (Ctrl-b d)回到项目主目录。 # 6. 你完全不需要处理重构分支的“烂摊子”。直接在主分支上创建并切换到一个修复分支 git checkout -b hotfix/critical-bug main # 修复、测试、提交、推送、部署。整个过程与你那个混乱的重构实验环境毫无瓜葛。 # 7. 紧急Bug处理完毕。轻松切回主分支然后重新打开你的长期实验任务 ag open ag-refactor-auth-module # 欢迎回来你离开时AI正在解释的JWT令牌刷新机制还停留在屏幕上。你未完成的模块拆分代码也静静地躺在编辑器里。你可以立刻接上之前的思路。这个场景下的核心优势完美的实验隔离高风险实验被禁锢在独立的Worktree中绝不会污染稳定的开发或生产环境。极低的心理负担你可以随时暂停一个可能失败的长周期实验去处理其他紧急事务而无需担心“保存现场”的问题。ag.sh和Tmux已经为你保存了一切。鼓励探索因为成本极低一个ag spawn命令你会更愿意发起一些天马行空的探索这有助于技术创新。4.3 场景三团队协作与知识传递ag.sh虽然是一个个人生产力工具但它也能间接促进团队协作。假设团队新成员小李需要接手一个你之前用ag.sh开发的、但尚未合并的功能模块。传统方式你可能会给小李一堆零散的信息“这个分支是feat/xxx我上次和Claude讨论的设计文档在某个笔记里测试命令是npm run test:integration……”使用ag.sh的方式你可以将整个.ag-worktrees目录或特定任务的目录纳入.gitignore的例外谨慎操作或者简单地告诉小李“确保你安装了tmux和claude code。”“在项目根目录运行ag resume。”“然后运行ag open ag-feature-name。”小李执行后他看到的不仅仅是你最后的代码快照而是完整的、可交互的开发现场左侧窗格保留着你与AI关于该功能架构的完整对话历史。小李可以滚动查看理解你每一步的决策过程。右侧窗格Shell历史里保存着你运行过的所有关键命令如启动服务、运行特定测试、调试命令。小李可以直接按上箭头重用。代码状态正是你离开时的样子包括所有未提交的、正在进行的修改。这相当于你将开发上下文而不仅仅是代码结果传递给了队友极大降低了交接成本和理解门槛。5. 常见问题、故障排查与进阶技巧即使设计再精良的工具在实际使用中也会遇到各种边界情况。下面是我在长期使用ag.sh过程中积累的一些问题解决经验和进阶用法。5.1 安装与依赖问题问题ag.sh脚本执行报错提示命令不存在或语法错误。原因ag.sh是一个Bash脚本严重依赖Bash的特性以及git,tmux等外部命令。排查步骤检查解释器确保脚本第一行是#!/usr/bin/env bash并且你的系统/usr/bin/env指向正确的Bash。用which bash确认。检查依赖逐一确认以下命令是否可用及其版本。git --version # 需要 2.5 以支持worktree tmux -V # 需要较新版本建议 3.0 bash --version检查脚本权限确保你有执行权限chmod x ag.sh。检查系统路径将ag.sh放在你的PATH路径下或者使用绝对路径执行例如./path/to/ag.sh spawn。问题ag spawn失败提示“fatal: ‘xxx’ is already a working tree”或类似Git错误。原因这通常是因为之前某个ag.sh任务没有完全清理干净残留了Git Worktree的注册信息。解决方案首先使用git worktree list查看所有已注册的工作树。找到那个冲突的、已经不在.ag-worktrees目录下的工作树路径。使用git worktree remove --force path强制将其从Git的注册表中移除。也可以手动删除.git/worktrees目录下对应的子目录风险较高建议先备份。预防措施尽量使用ag kill和ag rm来管理任务生命周期避免手动删除.ag-worktrees目录而不清理Git注册信息。5.2 Tmux 相关问题问题ag open时提示“no such session”或连接失败。原因ATmux服务器未运行或会话已被销毁。可能因为系统重启后Tmux服务器未自动启动或者有人包括你自己手动用tmux kill-session结束了会话。解决A运行ag resume。这个命令会检查所有Worktree并为丢失会话的任务重新创建Tmux窗口。这是恢复任务的首选方法。原因B任务ID输入错误。ag ls列出的ID是完整的但ag open可能支持前缀匹配。如果多个任务ID有相同前缀可能会匹配错误。解决B使用ag ls确认准确的ID或者使用足够长的唯一前缀。问题在ag.sh创建的Tmux窗口内快捷键如Ctrl-b d不起作用。原因Tmux的前缀键Prefix Key默认是Ctrl-b。你可能按成了Ctrl-b然后松手再按d。正确的操作是按住Ctrl和b不放然后按下d再全部松开。这是一个常见的Tmux新手困惑点。技巧你可以修改Tmux的前缀键。例如很多人喜欢改成Ctrl-a更像GNU Screen。在你的~/.tmux.conf中添加set -g prefix C-a然后unbind C-b。注意修改后需要重启Tmux服务器或重新加载配置在Tmux内按前缀键 :然后输入source-file ~/.tmux.conf。5.3 Git 与工作树问题问题在ag.sh任务中执行Git操作感觉有点慢或者出现奇怪的提示。原因Git Worktree虽然独立了工作目录但它们共享同一个.git仓库对象存储。某些Git操作如计算整个仓库的历史可能因为对象库较大而变慢但这通常影响不大。更常见的是你可能不小心在Worktree目录外比如在项目根目录执行了影响全局仓库的命令。最佳实践始终在ag.sh任务提供的Shell窗格内执行Git命令。这个Shell会自动cd到正确的Worktree路径。避免在任务Shell中使用git worktree相关的命令去手动添加/删除其他工作树除非你很清楚在做什么因为这可能会干扰ag.sh的管理。如果你需要在任务分支和主分支之间同步更改推荐使用git merge或git cherry-pick而不是在Worktree之间直接复制文件。问题磁盘空间告急发现.ag-worktrees目录很大。分析每个Worktree都是项目代码的一份完整拷贝虽然通过硬链接共享了未修改的文件但修改过的文件会独立存储。如果你并行运行了10个大型项目任务磁盘占用确实可观。清理策略定期使用ag ls审查任务列表。对于已经完成且代码已合并的任务果断使用ag rm task-id进行清理。这会删除Worktree和分支。对于长期不用的实验性任务可以先ag kill停止它然后手动决定是否保留其Worktree以备后用。不用的Worktree不会占用CPU/内存只占磁盘空间。可以考虑将AG_WORKTREE_ROOT环境变量指向一个容量更大的磁盘分区。5.4 进阶技巧与自定义技巧一为不同的项目配置不同的AI代理你可能在项目A中使用Claude Code在项目B中使用Codeium。你可以在项目根目录创建一个.env.ag文件需要ag.sh支持读取或者你手动source或者更简单地在你的Shell配置文件如~/.bashrc或~/.zshrc中根据目录动态设置AG_AI_CMD。# 在 ~/.zshrc 中 function set_ai_agent_for_project() { local project_path$(pwd) if [[ $project_path *my-claude-project* ]]; then export AG_AI_CMDclaude -w . --model claude-3-opus elif [[ $project_path *my-codeium-project* ]]; then export AG_AI_CMDcodeium -w . else export AG_AI_CMDclaude -w . # 默认 fi } # 可选每次切换目录时自动触发对性能有轻微影响 # add-zsh-hook chpwd set_ai_agent_for_project # 进入项目后手动执行一次即可技巧二集成到IDE或编辑器虽然ag.sh是终端工具但你可以将其与VS Code等编辑器结合。例如你可以在VS Code中打开终端运行ag open xxx然后Tmux会话就会在当前终端打开。你甚至可以为常用任务创建VS Code的“任务”Tasks或快捷键绑定一键打开特定的ag.sh环境。技巧三使用ag.sh进行自动化测试或CI/CD的本地模拟这是一个更高级的用法。你可以编写一个脚本利用ag.sh快速创建纯净的测试环境。#!/bin/bash # 脚本test-feature-in-isolation.sh FEATURE_NAME$1 # 1. 从main分支创建一个干净的测试任务 ag spawn test-$FEATURE_NAME # 2. 获取任务的工作树路径可能需要解析ag ls的输出或ag.sh提供其他接口 TASK_IDag-test-$FEATURE_NAME # 假设我们通过某种方式获取到了路径这里简化表示 WORKTREE_PATH$HOME/.ag-worktrees/$TASK_ID # 3. 在该工作树中执行测试命令 # 注意这里需要在一个子shell中模拟进入该目录执行因为ag.sh的任务在tmux中。 # 更实际的做法可能是直接利用git worktree的路径而不是通过ag.sh的tmux会话。 cd $WORKTREE_PATH npm install npm run test:all # 4. 清理任务 ag kill $TASK_ID ag rm $TASK_ID这个脚本可以让你在合并代码前在一个完全隔离的、基于最新主分支的环境里运行完整的测试套件确保你的更改不会引入意外的回归。这比直接在特性分支上运行测试更接近CI/CD环境的真实状态。ag.sh的精妙之处在于它将复杂的并行开发环境管理抽象成了几个简单的命令。它不试图重新发明轮子而是将Git、Tmux这些历经考验的工具以一种新颖且实用的方式粘合起来精准地命中了AI时代开发者对隔离、持久和并行的核心需求。从最初的好奇尝试到如今成为我日常开发流程中不可或缺的一环它带来的效率提升和心智负担的减轻是实实在在的。如果你也厌倦了在终端标签页和分支之间混乱地切换不妨花上十分钟试试ag.sh这种“一个任务一个世界”的清爽感或许会让你再也回不去从前。