跳转至

第 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. 给贡献者的落点判断

  1. 新数据形状:Schema;
  2. 新领域能力:Core service;
  3. 新公共调用:Protocol / HttpApi / generated SDK;
  4. 新产品入口:OpenCode / CLI / host;
  5. 新显示:TUI / App / session-ui;
  6. 新模型能力:LLM route / Provider transform;
  7. 新外部能力:Plugin / MCP / LSP。

如果一个 PR 同时修改所有层,应该先拆成契约、实现、宿主和 UI 几个可验证阶段。

本章小结

OpenCode 的扩展性来自稳定边界叠加,而不是把核心函数暴露成任意 hook。Config 决定发现和作用域,Agent 决定策略,Plugin / MCP / LSP 提供外部能力,Tool / Context / Provider 将这些能力纳入可控的 provider turn。

源码锚点