第 11 章:扩展与发布 —— Config、Agent、Plugin、Skill 组成产品表面¶
1. OpenCode 的可扩展性不是一个 plugin hook¶
扩展面至少包括:
| 扩展点 | 载荷 | 典型用途 |
|---|---|---|
| Config | JSON / JSONC / markdown / environment | 修改 agent、provider、permission、MCP |
| Agent | system、model、steps、permission、mode | build / plan / subagent |
| Command | prompt template / file references | 团队工作流命令 |
| Skill | 按需加载的能力说明和脚本 | 专门领域指导 |
| Plugin | provider、tool、event、auth、hook | 外部服务和运行时扩展 |
| MCP | remote / local tools、OAuth、catalog | 外部工具生态 |
| LSP | language server、diagnostics、symbol | 代码理解和导航 |
这些扩展最终都要进入 Context、Tool Registry、Provider 或 API,而不是平行于核心 loop 运行。
2. Config 和 Agent 是策略层¶
packages/opencode/src/config/* 把用户级、项目级、managed config、环境变量、markdown instruction 和 plugin resolution 分开。配置作用域必须和 Location 对齐:同一 server 里不同 project / directory 的 agent、provider、MCP 和规则可能不同。
一个 agent 也不只是 system prompt。它组合 model / variant、mode、permission ruleset、step limit、prompt、可见工具与子 agent。因此 plan 的只读语义是跨 prompt、tool materialization 和 permission 的策略。
3. Plugin、MCP、LSP 的安全边界¶
插件通过明确的 plugin context 扩展 provider、tool、hook 或认证;ToolRegistry 对 plugin tool 做参数解码、输出截断和 metadata 归一化。MCP 提供外部 tool catalog、client 生命周期和 OAuth;LSP 提供 diagnostics、definition、references 等代码语义能力。
它们都不应该绕过 Permission、Tool Registry 和 bounded output,直接把任意数据塞进 system prompt。
4. 构建和发布也是架构¶
source packages
→ typecheck / tests / format
→ generated SDK / assets / bundles
→ platform binaries / npm package / desktop artifacts
→ release / install script / package managers
根 package.json、Bun workspace、script/、nix/、packages/desktop、GitHub Actions 和 publish scripts 共同形成交付层。AGENTS.md 要求在 package directory 中执行 bun typecheck,说明 monorepo 的验证边界和 package ownership 是同一件事。
5. 给贡献者的落点判断¶
- 新数据形状:Schema;
- 新领域能力:Core service;
- 新公共调用:Protocol / HttpApi / generated SDK;
- 新产品入口:OpenCode / CLI / host;
- 新显示:TUI / App / session-ui;
- 新模型能力:LLM route / Provider transform;
- 新外部能力:Plugin / MCP / LSP。
如果一个 PR 同时修改所有层,应该先拆成契约、实现、宿主和 UI 几个可验证阶段。
本章小结¶
OpenCode 的扩展性来自稳定边界叠加,而不是把核心函数暴露成任意 hook。Config 决定发现和作用域,Agent 决定策略,Plugin / MCP / LSP 提供外部能力,Tool / Context / Provider 将这些能力纳入可控的 provider turn。