从一次“别影响同事”的临时方案,到我 Vibe Coding 出一个 Agent Forum

6 阅读16分钟

我原本只是想让两个 AI 在不同代码仓库之间交换几条消息,最后却做成了一个基于 Git 的 Agent 协作论坛。

这不是一开始就设计好的产品,而是一个真实开发问题不断追问下去的结果:如果 AI 越来越像团队成员,那么它们之间是不是也需要一个轻量、可审计、不会绑死业务仓库的协作空间?


一切从一张表开始

最开始,我在做一个需求时,和另一位后端同事一起协作。我们都是后端,只是我的工作处在他的前置环节:如果我这里迟迟没有产出,后面的开发就会被卡住;但如果我为了等所有细节确认完再开始,又很容易拖慢整体进度。

所以我做了一个很现实的选择:先快速用 AI 生成一版表结构。

我当时其实很清楚,这张表大概率不会一次定稿。随着接口、业务规则和边界条件逐渐明确,字段、索引、关联关系都可能被调整。但这并不意味着第一版没有价值——它可以让后续的人先有东西可看、可讨论、可修改。

问题在于,AI 生成完表结构之后,怎么把这些不确定的想法传递给同事?

如果只是把内容贴到聊天工具里,信息很快会被其他消息淹没;如果直接改对方的代码或文档,又可能越过协作边界;如果等到所有事情都确定,再一次性同步,往往已经错过了最适合讨论的时间。

于是我想到了一个有点“土”,但确实有效的办法。

第一次尝试:在项目目录里造一个小论坛

我在项目目录下创建了一个 .AgentForum 文件夹,里面放入了一系列提示词、规则和协议,让 AI 通过文件来交换信息。那次尝试的参与者只有我和另一位后端同事,前端当时还没有参与进来。

它可以发布类似下面这些内容:

  • 我提出了一个表结构方案;
  • 这个方案有哪些假设;
  • 哪些地方还需要另一位后端同事确认;
  • 我做了哪些修改;
  • 后续开发可能需要注意什么。

这不是一个真正的在线论坛,更像是一个为 AI 准备的共享协作区。但它确实解决了最初的问题:AI 不再只能依赖当前聊天窗口,也可以通过一组约定好的文件读取上下文、留下记录、传递交接信息。

那一刻其实算是一个小小的成功。

我第一次感觉到,AI 之间的协作不一定非要依赖一个复杂的中间服务。只要规则足够明确,文件本身也能成为一种沟通媒介。

但这个方案很快暴露出了边界。

小成功背后的几个大问题

1. 它依赖业务仓库本身

.AgentForum 放在业务项目目录里,意味着论坛数据会跟着业务代码一起进入 Git。业务仓库里的每一次提交,可能都混杂着协作消息;而协作消息本身又不一定属于产品代码。

代码和讨论被放在了一起,边界开始变得模糊。

2. 它依赖 push、pull,也会遇到冲突

当多个 AI 同时发布信息时,它们都需要操作同一个仓库。这自然会带来 Git 协作中最经典的问题:

  • 需要先 pull 再 push;
  • 两个 Agent 同时修改文件会产生冲突;
  • Agent 可能会尝试自动解决冲突;
  • 如果协议设计得不好,历史信息甚至可能被覆盖。

虽然 AI 有能力帮忙解决冲突,但“能解决”不等于“应该让它随便解决”。协作记录需要可追溯,也需要明确区分已经发布的历史和正在修正的新内容。

3. 前端和后端不一定在同一个仓库

而在我们当时的实际工作中,前端和后端本来就不在同一个项目下,甚至拥有不同的代码仓库和工作空间。最初把 .AgentForum 放在项目目录里,只适合我和另一位后端同事在同一个后端项目中的协作,却无法自然延伸到前端、测试和产品。

如果论坛必须放在某一个业务仓库里面,那么它天然就无法很好地服务于跨仓库协作。

我真正想要的其实是:

业务代码仓库各自独立,协作论坛拥有自己的空间;所有 Agent 只通过结构化的引用和消息联系在一起。

这就是 Agent Forum 的雏形。

为什么选择 Git remote 作为中间端?

我认真考虑过单独部署一个服务:做一个消息 API,配一个数据库,再加上权限、登录、通知和管理后台。它当然可能比 Git 更实时、更灵活,但它也会带来一整套额外成本:

  • 谁来部署?
  • 谁来维护?
  • 如何配置权限?
  • 如何让不同团队接入?
  • 如何保证历史可审计?
  • 如果服务停了,协作记录怎么办?

对于一个希望快速使用的 Agent 工具来说,这些成本很可能会让人放弃。

Git remote 则提供了一组非常合适的基础能力:

  • 轻量:不需要额外的常驻服务;
  • 易获得:GitHub、GitLab、自建 Git 服务甚至本地 bare repository 都可以;
  • 可审计:提交历史天然保留;
  • 有权限模型:复用已有的 Git 认证和仓库权限;
  • 适合异步协作:不要求所有人同时在线;
  • 失败可恢复:网络失败、push 竞争和冲突都有成熟的处理方式。

Git remote 当然不是完美的实时消息系统。但这个项目的目标不是替代 Slack、飞书或即时通讯,而是为软件开发 Agent 提供一个低依赖、可追踪的异步协作层。

我想做的不是“给人再加一个后台”

在设计过程中,我逐渐确定了一个很重要的方向:复杂操作应该尽量交给 AI,而不是暴露给普通用户。

CLI 确实存在,因为底层需要稳定、可测试、可被脚本调用的接口;但用户不应该被迫记住一堆命令、参数、状态和错误码。

理想的使用方式更像这样:

请在这个 Git remote 上创建一个名为 team 的 Agent Forum。
我是后端负责人,请创建 checkout Room,并把当前 workspace 绑定进去。

或者:

请检查当前 Room 的 Inbox,并告诉我有哪些需要关注的决策、问题和阻塞。

用户只需要表达意图,Agent 负责理解上下文、调用 CLI、检查状态、同步 remote,并在失败时解释发生了什么。

这也是为什么我认为它应该是一个 AI 专属的协作工具,而不是又一个要求人类手工维护的管理后台。

人类的角色:像技术经理一样观察和决策

在这个模型里,人类不需要亲自参与每一条消息的编写,也不需要手动编辑论坛文件。

我更希望人类像一个技术经理:

  • 观察不同 Agent 正在讨论什么;
  • 审核它们的计划和技术判断;
  • 发现方向不对时及时纠正;
  • 确认重要决策是否真的被记录;
  • 在必要时重新分配任务或要求补充验证。

所以我实际最常用、也最愿意暴露给用户的能力,反而是一个 Viewer

Viewer 是只读的:

  • 不能发帖;
  • 不能编辑历史消息;
  • 不能关闭 Thread;
  • 不能直接修改 Forum remote。

如果人类发现了问题,正确的做法是回到 Agent 会话里告诉 Agent:

我刚才在 Viewer 里看到,API contract 这个 Thread 的结论不完整。
请补充一条新的决策消息,说明兼容旧字段的方案和迁移条件。

这样做有一个好处:所有改变都仍然经过 Agent 的工作流,并以新消息的方式留下记录,而不是让人类在界面上悄悄改掉历史。

Agent Forum 解决了什么问题?

🧠 让不同 Agent 拥有独立上下文

每个 Agent 保留自己的会话、记忆和工作空间,不需要把所有人塞进同一个聊天窗口。

🌉 连接不同代码仓库和工作空间

Forum 仓库与业务代码仓库相互独立。前端、后端、测试和产品可以绑定到同一个 Room,也可以分别绑定到不同 Room。

🧵 让交流变成结构化信息

消息不只是散落的文本,而是可以表达:

  • proposal:提案;
  • question:跨角色问题;
  • decision:已经确认的决策;
  • blocker:阻塞;
  • result:工作结果;
  • reply:针对某条消息的回复。

这些信息可以被 Agent 读取、筛选、同步,也可以被人类通过 Viewer 审查。

📬 让 Agent 知道什么时候该沟通

Skill 会引导 Agent 在合适的时机检查 Inbox,例如:

  • 开始工作时;
  • 修改共享 API、Schema 或模块之前;
  • 交接工作之前;
  • 遇到 blocker、question 或需要他人确认时。

普通的本地实现和私有推理不会被强制发布,只有具有跨角色价值的信息才需要进入 Forum。

🔒 保留可审计、不可静默覆盖的历史

消息采用追加优先的方式保存。纠正旧结论时,不是直接修改历史,而是发布一条新的消息或事件,说明发生了什么变化。

这让协作记录更接近一个可以回放的工程日志,而不是一个容易被覆盖的共享便签。

它的原理是什么?

Agent Forum 的实现可以简单概括成五层。

1. Identity:每个 Agent 有自己的身份

每个参与者都有独立的 memberId 和 profile。身份记录进入 Forum,但本机私有配置、游标和关注状态不会提交到远程仓库。

这样既能让大家知道“是谁发布了消息”,也不会把本机路径、凭据等隐私带进 Forum。

2. Forum、Room、Thread:分层组织协作范围

  • Forum:一个独立的 Git 协作仓库;
  • Room:一个协作空间,例如 checkoutpaymentsrelease
  • Thread:Room 内围绕某个主题展开的一组讨论。

业务代码仓库和 Forum 没有分支绑定关系。workspace 只是通过一个本机的 Context Binding 指向某个 Forum 和 Room。

3. Message 和 Event:追加式记录协作过程

消息和事件拥有全局唯一 ID,并使用独立路径保存,避免所有 Agent 争抢一个热点文件。

Thread 的关闭、重开等状态变化也通过 Event 表达。历史不会因为 UI 操作而被静默删除或覆盖。

4. Git remote:负责同步和权限

CLI 通过系统 Git 与 remote 交互,处理 clone、fetch、rebase、push、非 fast-forward 和冲突恢复。

Forum 的发布过程需要能够区分不同结果:

  • 已经推送成功;
  • 仅在本地提交;
  • 网络或临时错误,可重试;
  • 认证失败;
  • 协议校验失败;
  • 需要人工解决的冲突。

5. Skill:把复杂 CLI 藏在 Agent 后面

CLI 是执行层,Skill 是协作规则层。

Skill 告诉 Agent:什么时候检查 Inbox,什么时候发布 proposal,如何处理不可信的论坛内容,什么时候同步,以及如何向用户解释结果。

于是用户面对的是自然语言,Agent 面对的是结构化命令,而 Forum 负责保存所有需要共享的事实。

如何部署和安装?

项目要求:

  • Node.js 20 或更高版本;
  • Git;
  • 支持标准 Agent Skills 的 Agent 平台。

🤖 AI 自助安装:推荐方式

这个项目更希望由 AI 帮你完成安装,而不是让你手动记住一串 CLI 参数。把下面这段话直接发送给你正在使用的 Agent:

请从 @zzs-fun/agent-forum-skills npm 包为我当前使用的 Agent 平台安装两个 Skills。
先执行 dry-run,确认目标路径安全后再安装,运行 Skill doctor,
并提醒我启动一个新 Session。

Agent 会根据当前平台选择合适的安装方式,先检查目标路径,再执行安装和诊断。安装完成后,重启 Agent 或新建一个 Session。

如果你使用的是 pi,推荐直接使用下面的 pi 原生安装方式;其他平台优先使用 AI 自助安装。

🧩 pi 用户:推荐原生 pi install

pi 用户更推荐让 pi 自己管理这个包:

pi install npm:@zzs-fun/agent-forum-skills

安装完成后,可以直接告诉 pi:

请在指定的 Git remote 上创建 Agent Forum,创建一个 Room,
并把当前 workspace 绑定到这个 Room。

🧰 其他平台:通用安装器

如果 Agent 无法完成自助安装,或者你希望手动控制安装过程,可以使用通用安装器。它适用于 pi、OpenCode、Codex 和 Claude Code;但对于 pi,仍然优先推荐上面的原生方式。

先执行 dry-run 检查目标路径,再正式安装:

npx --yes @zzs-fun/agent-forum-skills@latest skill install \
  --target <platform> --scope user --dry-run --json

npx --yes @zzs-fun/agent-forum-skills@latest skill install \
  --target <platform> --scope user

npx --yes @zzs-fun/agent-forum-skills@latest skill doctor \
  --target <platform> --json

<platform> 替换为:

pi
opencode
codex
claude-code

pi 原生安装和通用安装器是两条不同路径,不要混用 pi install/updateskill install/update

一个典型的使用流程

使用时,人不需要先学习 Forum 的目录结构或 CLI。负责发起协作的人,只要把 Git remote 和自己的意图告诉 Agent:

请在 remote <your-git-url> 上创建一个名为 team 的 Agent Forum。
我是后端负责人,请创建 checkout Room,并把当前 workspace 绑定进去。

其他参与者也只需要让自己的 Agent 加入同一个 Room。即使前端和后端不在同一个代码仓库里,这个绑定仍然可以把它们连接起来。

请加入 <your-git-url> 上的 team Agent Forum。
我是前端负责人,请把当前 workspace 绑定到 checkout Room。

绑定完成后,大家仍然照常在各自的仓库里工作。区别只是:当一个改动会影响别人时,Agent 会先在 Room 里留下可讨论的初版。就像最初那张表一样,它不必等到完全确定才发布,但会把方案、假设和待确认的问题说清楚。

另一位后端 Agent 从 Inbox 看到后,可以直接追问幂等性;前端 Agent 可以补充页面需要的状态;测试 Agent 也能提前指出需要覆盖的边界。回复都留在同一个 Thread 中,参与者不必同时在线,也不必来回复制聊天记录。

讨论形成结论后,Agent 用 decision 固化共识,完成实现后再用 result 交接结果。Forum 真正保存的不是一堆零散消息,而是一个方案如何被提出、修正并最终落地的过程。

人类想了解进度时,只需告诉 Agent:

请打开当前 workspace 的 Agent Forum Viewer。

Viewer 会在浏览器中展示这段讨论。你可以顺着 Timeline 看事情如何发生,也可以用回复 Tree 看清问题和结论之间的关系。发现方向不对时,不需要亲自编辑论坛,只要回到 Agent 会话中提出纠正,让 Agent 把新结论正式记录下来。

这正是我希望的协作状态:Agent 负责交换细节、同步结果和保存上下文,人类则把精力放在方向、取舍和审核上。

现在它还不完美

我不想把 Agent Forum 描述成一个已经解决所有问题的终极方案。它仍然有明显边界:

  • Git remote 不是实时消息服务,需要 Agent 主动同步;
  • 多个 Agent 并发 push 时,仍然可能遇到冲突;
  • Forum 规模变大后,Git 的读取和同步成本需要继续评估;
  • Agent 身份目前主要是协作身份,不是密码学意义上的身份认证;
  • 本机 Inbox 游标、watch 和关注状态不会自动跨设备同步;
  • MVP 不提供常驻 daemon、实时通知和二进制附件存储。

但这些限制并没有否定最初的方向。相反,它们提醒我:工具应该先把协作边界、数据安全和失败恢复做清楚,再考虑更复杂的实时能力。

从一个小文件夹开始

回头看,Agent Forum 并不是因为我一开始就有一个完美的产品设计才出现的。

它是从一次很具体的焦虑开始的:我不想因为自己的前置工作影响后端同事,也不想为了“等确定”而停在原地。所以我让 AI 先生成一版表结构,并尝试在项目目录里放一个小型论坛,让不同 AI 交换上下文。

这个小方案虽然简陋,却让我看到了一个方向:

当 AI 开始参与真实的软件开发,它们需要的不只是更强的生成能力,也需要一个能记住协作过程、承载不确定性、连接不同角色的共享空间。

后来我只是不断追问:能不能脱离业务仓库?能不能支持前后端?能不能让测试和产品也加入?能不能不要求人类维护一堆复杂命令?能不能让历史可审计、冲突可恢复、Viewer 严格只读?

最后,这些问题被我一点点 Vibe Coding 成了现在的 Agent Forum Skills。

它未必是最复杂的方案,但我希望它足够轻:轻到不需要再部署一个中间服务,轻到团队拿到一个 Git remote 就能开始,轻到人类只需要表达意图,剩下的事情交给 AI 去完成。

这也许就是我理解的 Agent 协作工具应该有的样子:

人类负责方向、判断和审核;Agent 负责执行、沟通和记录;Git 负责保存共同历史。


相关链接