Config
Config 是 OpenCode 的配置系统,支持多层合并配置。
概述
Config 使用分层配置系统,允许从多个来源加载配置并合并。配置支持 JSONC(带注释的 JSON)格式,并按优先级合并:远程 < 全局 < 项目 < 环境变量/命令行标志。
配置加载顺序(从低到高优先级)
主要配置字段
command
定义自定义命令。
{
"command": {
"deploy": {
"description": "Deploy to production",
"agent": "build",
"template": "Deploy following changes: $1"
}
}
}
agent
定义自定义 Agent。
{
"agent": {
"my-agent": {
"description": "Custom agent",
"mode": "primary",
"permission": {
"*": "allow",
"write": "ask"
}
}
}
}
mode (已废弃)
旧版 Agent 定义,会自动迁移到 agent 字段。
plugin
插件列表(支持数组合并)。
{
"plugin": [
"plugin-package@1.0.0",
"file:///path/to/local/plugin.js"
]
}
permission
权限配置。
{
"permission": {
"*": "allow",
"write": "ask",
"bash": {
"rm -rf": "deny"
}
}
}
mcp
MCP 服务器配置。
{
"mcp": {
"filesystem": {
"type": "local",
"command": ["npx", "@modelcontextprotocol/server-filesystem"]
},
"remote-server": {
"type": "remote",
"url": "https://example.com/mcp"
}
}
}
instructions
全局指令(支持数组合并)。
{
"instructions": [
"Be concise",
"Use TypeScript"
]
}
compaction
消息压缩设置。
{
"compaction": {
"auto": true,
"prune": true,
"threshold": 50
}
}
share
会话分享设置。
{
"share": "auto" // "auto" | "disabled" | "manual"
}
snapshot
快照设置。
{
"snapshot": true // // true | false
}
username
用户名显示。
keybinds
键盘绑定配置。
配置文件位置
全局配置
~/.opencode/opencode.jsonc
~/.opencode/opencode.json
项目配置
./opencode.jsonc
./opencode.json
环境变量覆盖
OPENCODE_CONFIG=/path/to/config.jsonc
OPENCODE_CONFIG_CONTENT='{"key": "value"}'
OPENCODE_PERMISSION='{"write": "ask"}'
命令行标志
| 标志 | 说明 |
|---|---|
OPENCODE_CONFIG | 自定义配置文件路径 |
OPENCODE_CONFIG_CONTENT | 内联 JSON 配置 |
OPENCODE_PERMISSION | 权限配置(JSON 字符串) |
OPENCODE_CONFIG_DIR | 额外的配置目录 |
OPENCODE_DISABLE_AUTOCOMPACT | 禁用自动压缩 |
OPENCODE_DISABLE_PRUNE | 禁用快照修剪 |
OPENCODE_DISABLE_DEFAULT_PLUGINS | 禁用默认插件 |
典型使用场景
1. 获取当前配置
const config = await Config.get()
console.log(config.agent) // Agent 配置
console.log(config.permission) // 权限配置
console.log(config.mcp) // MCP 配置
2. 修改配置
在 opencode.jsonc 中编辑:
{
// 我的自定义配置
"agent": {
"my-custom-agent": {
"description": "Custom agent for my needs",
"mode": "primary",
},
},
"permission": {
"*": "allow",
"write": "ask",
},
}
3. 使用环境变量覆盖
# 设置权限
export OPENCODE_PERMISSION='{"write": "ask", "bash": "deny"}'
# 使用自定义配置文件
export OPENCODE_CONFIG=/path/to/custom.jsonc
# 运行 OpenCode
opencode
4. 配置 MCP 服务器
{
"mcp": {
"gitlab": {
"type": "local",
"command": ["npx", "-y", "@modelcontextusn-protocol/server-gitlab"],
},
"filesystem": {
"type": "local",
"command": ["npx", "-y", "@modelcontextprotocol/server-filesystem"],
},
"remote-mcp": {
"type": "remote",
"url": "https://api.example.com/sse",
},
},
}
5. 配置插件
{
"plugin": [
// 从 npm 安装
"my-plugin@1.0.0",
// 本地文件
"file:///home/user/my-plugin.js",
// 相对路径
"./my-plugin.js",
],
}
配置合并规则
数组字段合并
以下字段使用数组合并(去重):
plugininstructions
对象字段合并
以下字段使用深度合并:
agentcommandpermissionmcpkeybinds
配置验证
配置在加载时会进行验证,无效的配置会记录错误:
// 错误示例
{
"permission": "invalid" // 应该是对象,不是字符串
}
从 Well-known 加载配置
OpenCode 支持从 .well-known/opencode 端点加载远程配置:
// Auth 配置中的 well-known 类型
{
"type": "wellknown",
"url": "https://example.com",
"key": "OPENCODE_AUTH_TOKEN",
"token": "your-token"
}
这允许组织提供默认配置,用户可以覆盖。
配置目录扫描
OpenCode 扫描以下目录查找配置:
- 全局配置目录:
~/.opencode/ - 项目配置目录(向上搜索):
./.opencode/ - 自定义配置目录(通过
OPENCODE_CONFIG_DIR指定)
每个目录还扫描:
agent/或agents/- Agent 定义command/或commands/- 命令定义skill/或skills/- Skill 定义
配置示例
完整示例
{
// 用户配置
"username": "John Doe",
// Agent 配置
"agent": {
"reviewer": {
"description": "Code reviewer agent",
"mode": "primary",
"permission": {
"*": "allow",
"write": "ask",
},
},
},
// 权限配置
"permission": {
"*": "allow",
"write": "ask",
"bash": {
"rm -rf": "deny",
},
},
// 命令配置
"command": {
"deploy": {
"description": "Deploy to production",
"agent": "build",
"template": "Deploy changes: $1",
},
},
// MCP 配置
"mcp": {
"filesystem": {
"type": "local",
"command": ["npx", "@modelcontextprotocol/server-filesystem"],
},
},
// 插件
"plugin": ["my-plugin@1.0.0"],
// 压缩设置
"compaction": {
"auto": true,
"prune": true,
},
// 分享设置
"share": "auto",
// 快照设置
"snapshot": true,
// 键盘绑定
"keybinds": {
"quit": "ctrl+d",
"submit": "ctrl+enter",
},
}
配置迁移
autoshare → share
旧版 autoshare 配置自动迁移到 share:
if (result.autoshare === true && !result.share) {
result.share = "auto"
}
mode → agent
旧版 mode 字段自动迁移到 agent:
for (const [name, mode] of Object.entries(result.mode)) {
result.agent = mergeDeep(result.agent ?? {}, {
[name]: {
...mode,
mode: "primary" as const,
},
})
}
tools → permission
旧版 tools 配置自动迁移到 permission:
if (result.tools) {
const perms: Record<string, PermissionAction> = {}
for (const [tool, enabled] of Object.entries(result.tools)) {
const action: PermissionAction = enabled ? "allow" : "deny"
// 映射到新权限系统
if (tool === "write" || tool === "edit" || tool === "patch" || tool === "multiedit") {
perms.edit = action
continue
}
perms[tool] = action
}
result.permission = mergeDeep(perms, result.permission ?? {})
}
变更历史
| 版本 | 变更内容 | 日期 |
|---|---|---|
| v1 | 初始 Config 架构 | - |
| v1.1 | 添加 MCP 配置 | - |
| v1.2 | 添加 well-known 支持 | - |
| v1.3 | 添加数组字段合并逻辑 | - |
相关文档
- Agent - Agent 配置
- Command - 命令系统
- Plugin - 插件系统
- Permission - 权限系统