这篇文章原来是一篇很长的 OpenCode 配置介绍。我保留这个 permalink,但现在它的作用变了。

OpenCode 是我最早把 AI tooling 当成系统来看的地方之一,而不是只把它当作一个 chat window。我当时有不同的 agent role、不同权限、共享 prompt、MCP tools,以及一条用 Nix 在 NixOS 和 macOS 之间同步配置的路径。很多具体细节现在已经没有那么重要了。真正留下来的,是它让我更早意识到 boundary 的重要性。

当时的配置是什么样

原来的配置里有三个核心角色:

  • ask 负责只读解释和检查
  • plan 负责架构判断和任务拆解
  • build 负责编辑、测试和实现

在这之外,我还放了 frontend、backend、ops、testing、debugging、code review、security、refactoring、documentation、migration、exploration 等 specialist agents。这个列表经常变化,这本身就是第一条教训:一个 multi-agent setup 并不会因为有很多名字就稳定。

这些角色只有在权限真的不同的时候才有意义。只读 reviewer 不应该能改文件。Planning agent 不应该悄悄跑破坏性命令。Builder 需要写入权限,但也必须有验证习惯。没有这些边界,所谓 multi-agent 只是把 failure mode 变得更混乱。

跨平台同步才是真正的约束

我当时在 NixOS 和 macOS 之间切换,所以配置必须能跨环境生存。OpenCode 的配置文件放在我的 Nix repo 里,再同步到每台机器的 ~/.config/opencode

这听起来很普通,但很关键。如果一个工具只能在某台电脑上工作,因为 prompt、model setting 或 agent definition 都是手动改出来的,那它就不算真正属于我的 workflow。它只是把本地状态伪装成系统。

Nix 的价值在这里很直接:我能看到哪些文件定义了 agent system,能 diff,也能在机器之间迁移,而不是每次都靠记忆重建环境。

协议的重要性在于降低耦合

MCP 对我有用,是因为它让外部工具不再像一堆临时拼接。与其让每个 agent 都有自己的集成方式,不如让工具和 context 通过一个更统一的接口暴露出来。

我当时也关注 editor-agent protocol,原因类似。如果 agent 和某一个 editor、chat UI 或 provider 绑得太死,每次迁移都会很贵。协议不能解决 agency 里最难的问题,但它能让接口更容易推理。

这后来变成我看 AI tooling 的一个固定习惯:我不太关心一个工具单独看起来有多酷,我更关心它和系统其他部分之间有没有清楚的边界。

后来发生了什么

现在我的 workbench 已经不再把 OpenCode 当成完整答案。所有权划分更清楚了:

  • Codex 负责交互式工程。
  • Hermes 负责周期性 orchestration。
  • Obsidian 保存人类可读的 second brain。
  • CC Switch 负责共享 tooling 和 provider plumbing。

从这个后来的架构看,OpenCode 更像是同一方向上的早期实验。它让我意识到,“one AI workspace” 往往太模糊。更好的问题是:哪个组件拥有哪一类 state,它被允许写什么?

我会保留下来的东西

真正耐用的经验其实很小:

  • Agent 名字没有权限边界重要。
  • 跨平台配置应该被版本管理,而不是靠记忆。
  • Tool protocol 的价值在于减少耦合。
  • Orchestration 需要可观察状态,而不只是更多 prompt。
  • 个人 AI 系统失败时,应该能被审计。

所以这篇文章现在更适合放在新的 personal AI workbench 旁边。OpenCode 不是最终架构,但它是让我看清架构的一段实验。