最近,我们在三个人的开发团队里调整了几处 coding workflow。
团队共用一台开发服务器。每个人有自己的 Linux user,也各自维护一份 repo clone。团队共享数据可以由成员共同访问;个人 workspace、未提交代码和 credential 仍然保留在各自的 user space 里。
下文把 workspace 作为工作目录的统称:个人 workspace 是开发者自己的 repo clone,qbot workspace 是单独 clone 出来的目录;worktree 指实际被修改的那份工作目录。user space 则指各自 Linux user 拥有的个人空间。
在此基础上,我们又接入了一个通过 IM 使用的 coding agent。
现在的结构是:
Developer A ─→ own workspace
Developer B ─→ own workspace
Developer C ─→ own workspace
Feishu
↓
cc-connect
↓
OpenCode qbot
↓
dedicated workspaceqbot 不属于任何一个人的日常开发环境,是团队共享的 coding agent。
这套结构把三件事分开:哪个 workspace 可以动、Agent 能做什么、结果如何回到 Git workflow。
给 Agent 单独准备一个 workspace
起初,我们直接让 IM bot 使用某个开发者已经存在的 repo。
后来,我们给它额外 clone 了一份。
真正麻烦的地方在 worktree 状态。
开发者自己的 repo 里可能同时存在:
- 当前正在开发的 branch;
- 没有 commit 的修改;
- 临时实验;
- 本地配置;
- 一个尚未结束的 Agent session。
如果 IM bot 直接在这里工作,每次操作前都要先判断哪些文件可以动、branch 能不能切,以及现有修改属于谁。
qbot 的执行会依赖某个开发者当前的工作状态。异步任务启动前,worktree 越复杂,需要判断的内容越多。
单独 clone 后,qbot 只需要面对自己的 worktree:
/home/a/projects/repo
/home/b/projects/repo
/home/c/projects/repo
/home/x/projects/repo-qbot这个 worktree 只属于 qbot。
每次开始写任务前,先确认 worktree clean,并从 origin/main 更新。开始修改后,新建:
qbot/<topic>分支。
完成后依次跑测试、commit、push,再创建 PR。
遇到未知的 dirty state、rebase conflict、测试失败或者 push rejected 时,就停下来报告;这些状态不由它自行恢复。
流程沿用开发者的 workflow,执行者换成了 Agent。
IM 入口需要更高的 Agent 自主权
qbot 使用专门的 OpenCode agent。
它的权限比普通交互式 Agent 更宽。
正常的 repository work,例如:
- 读取和修改代码;
- 创建、删除项目内文件;
- 运行 shell command;
- 使用
uv修改依赖; - 运行有限范围的测试;
- commit;
- push task branch;
- 创建或更新 PR;
这些操作通常都可以自行完成。
风险更高的操作仍然禁止或需要停下来确认:
- 不 force push;
- 不 rewrite 已发布 commit;
- 不暴露或复制 credential;
- 不自行处理未知的 dirty worktree;
- 不启动明显重型的数据、训练或 backtest 任务;
- destructive operation 不在默认允许范围内;
- 默认不直接修改
main。
qbot 的主要入口是 IM,确认次数会直接变成消息往返。
如果每一个正常步骤都需要:
Can I edit this file?
Can I run this command?
Can I commit?
Can I push?在 IM 里,这种交互很快会变得笨重。
权限按风险分成三类:
normal in-scope work
→ allow
missing important decision
→ ask
high-risk operation
→ deny / stopask 只用于补足重要决策,不承担主要的权限控制。
在 terminal 里,频繁确认的成本较低;换成 IM 后,每次确认都会增加一次消息往返。
配置的重点是先划定 Agent 可以活动的范围,再让它在范围内完成任务。
Agent 仍然通过 Git 与其他人协作
qbot 的执行权限比较宽,协作流程仍沿用现有的 Git workflow。
正常写任务仍然是:
request
↓
qbot/<topic>
↓
implementation
↓
tests
↓
commit
↓
push
↓
pull requestmain 默认保持保护状态。
Agent workspace 和个人 workspace 各自独立,大家也不需要直接读取或修改 qbot 的 worktree。
需要共享的结果最终通过 Git 交付。
在团队协作里,Agent 承担的是 contributor 的角色:独立创建 branch 和 PR,结果通过 Git 回到团队流程。
在 PR 上增加独立的 review
我们还在 GitHub 上接入了 OpenCode App。
review 改为按需触发:
/oc一个 PR 在开发过程中可能连续 push 很多次,中间状态未必值得重新做完整 review。有时只是刚修复了一个小问题,或者 PR 还没有准备好接受 review。
什么时候触发 review,仍然由人决定。
流程如下:
human / qbot
↓
implementation
↓
PR
↓
/oc
↓
OpenCode review
↓
human decision
↓
mergereview agent 和负责实现的 Agent 也不共享工作上下文。
review agent 看到的是 PR 和代码变化,不会看到实现过程中累积的整段 conversation。
它负责独立检查 PR,不承接原实现 Agent 的后续工作。
一个 shared bot 带来的问题
目前 qbot 只有一个 workspace。
三个人的团队暂时可以靠一个简单约定维持:
同一时间只允许一个 write-producing task 使用 qbot workspace。
其他 conversation 可以查询、解释或 review,但不能同时修改这个 worktree。
这个限制已经写进了 qbot 的 agent instruction:
Keep one write-producing task active in the qbot clone.
Concurrent conversations may inspect or review,
but must not mutate the same worktree.团队只有三个人;每个人也有自己的 user space 和 coding agent,很多工作可以直接在个人环境里完成。这个限制还没有造成明显问题。
使用频率上升后,这个结构的边界会变得明显。
当前关系是:
Developer A ─┐
Developer B ─┼─→ qbot → one workspace
Developer C ─┘查询和讨论可以并发;同一个 worktree 上的写操作不能安全并发。
最直接的处理方式是给每个人准备一个 bot 和一个独立 workspace:
Developer A → qbot-a → workspace-a
Developer B → qbot-b → workspace-b
Developer C → qbot-c → workspace-c问题会从“接一个 IM bot”扩展到任务调度和执行环境管理:
- bot 应该怎么路由;
- task 和 workspace 如何绑定;
- 一个用户能不能同时启动多个任务;
- workspace 是长期存在还是按 task 创建;
- conversation 和执行环境是什么关系;
- 谁负责回收 branch 和 worktree。
cc-connect 作为 communication bridge 足够简单,适合从单个 bot 开始。
当需求从:
IM → one coding agent扩展到:
users
↓
task routing
↓
multiple agent workers
↓
isolated workspaces这时,系统的重点也从消息转发转向任务调度和环境隔离。
目前的结构
当前结构如下:
shared Git repository
├── Developer A → personal workspace
├── Developer B → personal workspace
├── Developer C → personal workspace
└── qbot/<topic> → PR → optional /oc → merge
Feishu → cc-connect → qbot → dedicated clone服务器、共享数据、Git repository 和 qbot 可以共用;个人 workspace、Agent worktree、task branch 和 credentials 分开管理。mutable state 不跨越这些边界。
当前保留的边界很简单:
personal workspace → separate
credentials → separate
agent worktree → separate
task branch → separate
main → protected
merge → explicit在这些边界内,Agent 可以相对自由地完成一次正常的 coding task。
接下来要验证两件事:多个 Agent workspace 如何管理,以及 task、conversation 和 workspace 如何关联。先把这几个关系厘清,再决定是否继续增加 permission rule。