我们希望让你能轻松地为 OpenCode 贡献代码。以下是最常见的会被合并的变更类型:
- Bug 修复
- 新增 LSP / Formatters 支持
- LLM 性能优化
- 新 Provider 支持
- 修复特定环境的兼容性问题
- 补全缺失的标准行为
- 文档改进
但是,任何 UI 或核心产品功能都必须经过核心团队的设计审查后才能实施。
如果你不确定 PR 是否会被接受,可以随时询问维护者,或查找带有以下标签的 Issue:
Note
忽略这些规范的 PR 可能会被关闭。
想认领一个 Issue?留言评论,维护者可能会将其分配给你(除非这是我们已经在处理的工作)。
新的 Provider 应该不需要(或只需要很少的)代码修改,但如果你想添加新 Provider 的支持,请先向以下仓库提交 PR: https://github.com/anomalyco/models.dev
- 环境要求:Bun 1.3+
- 从仓库根目录安装依赖并启动开发服务器:
bun install
bun dev默认情况下,bun dev 在 packages/opencode 目录运行 OpenCode。如果你想在不同的目录或仓库运行:
bun dev <目录>在 opencode 仓库根目录运行 OpenCode:
bun dev .编译独立的可执行文件:
./packages/opencode/script/build.ts --single然后运行:
./packages/opencode/dist/opencode-<平台>/bin/opencode将 <平台> 替换为你的平台(例如 darwin-arm64、linux-x64)。
核心模块说明:
packages/opencode:OpenCode 核心业务逻辑和服务器packages/opencode/src/cli/cmd/tui/:TUI 代码,使用 SolidJS 和 opentui 编写packages/app:共享的 Web UI 组件,使用 SolidJS 编写packages/desktop:原生桌面应用,使用 Tauri 构建(封装packages/app)packages/plugin:@opencode-ai/plugin的源码
在开发过程中,bun dev 是构建后的 opencode 命令的本地等价物。两者运行相同的 CLI 接口:
# 开发环境(从项目根目录)
bun dev --help # 显示所有可用命令
bun dev serve # 启动无头 API 服务器
bun dev web # 启动服务器并打开 Web 界面
bun dev <目录> # 在指定目录启动 TUI
# 生产环境
opencode --help # 显示所有可用命令
opencode serve # 启动无头 API 服务器
opencode web # 启动服务器并打开 Web 界面
opencode <目录> # 在指定目录启动 TUI启动 OpenCode 无头 API 服务器:
bun dev serve默认在端口 4096 启动无头服务器。你可以指定不同的端口:
bun dev serve --port 8080在开发过程中测试 UI 变更:
- 首先,启动 OpenCode 服务器(参见上文的 运行 API 服务器)
- 然后运行 Web 应用:
bun run --cwd packages/app dev这会在 http://localhost:5173 启动本地开发服务器(或输出中显示的类似端口)。大多数 UI 变更可以在这里测试,但服务器必须运行才能获得完整功能。
桌面应用是一个封装 Web UI 的原生 Tauri 应用。
运行原生桌面应用:
bun run --cwd packages/desktop tauri dev这会在 http://localhost:1420 启动 Web 开发服务器并打开原生窗口。
如果只需要 Web 开发服务器(不带原生外壳):
bun run --cwd packages/desktop dev创建生产 dist/ 并构建原生应用包:
bun run --cwd packages/desktop tauri build这会通过 Tauri 的 beforeBuildCommand 自动运行 bun run --cwd packages/desktop build。
Note
运行桌面应用需要额外的 Tauri 依赖(Rust 工具链、特定平台的库)。请参阅 Tauri 前提条件 了解设置说明。
Note
如果你对 API 或 SDK 进行了修改(例如 packages/opencode/src/server/server.ts),请运行 ./script/generate.ts 重新生成 SDK 和相关文件。
请尽量遵循 代码风格指南。
Bun 的调试功能目前还不够完善。我们希望这份指南能帮助你完成配置并避免一些痛点。
调试 OpenCode 最可靠的方法是通过 bun run --inspect=<url> dev ... 在终端手动运行,然后通过该 URL 附加调试器。其他方法可能导致断点映射不正确,至少在 VSCode 中是这样(YMMV)。
注意事项:
- 如果你想运行 OpenCode TUI 并在服务器代码中触发断点,可能需要使用
bun dev spawn而不是常规的bun dev。这是因为bun dev在工作线程中运行服务器,断点可能无法工作。 - 如果
spawn不适合你,可以分别调试服务器:- 调试服务器:
bun run --inspect=ws://localhost:6499/ --cwd packages/opencode ./src/index.ts serve --port 4096,然后用opencode attach http://localhost:4096附加 TUI - 调试 TUI:
bun run --inspect=ws://localhost:6499/ --cwd packages/opencode --conditions=browser ./src/index.ts
- 调试服务器:
其他技巧:
- 你可能想根据工作流程使用
--inspect-wait或--inspect-brk而不是--inspect - 在每次调用时指定
--inspect=ws://localhost:6499/可能很繁琐,你可以改为export BUN_OPTIONS=--inspect=ws://localhost:6499/
如果你使用 VSCode,可以使用我们的示例配置 .vscode/settings.example.json 和 .vscode/launch.example.json。
一些可能有问题的调试方法:
- 使用
"request": "launch"的调试配置可能导致断点映射不正确,从而无法使用 - 在 VSCode 的
JavaScript Debug Terminal中运行 OpenCode 也会出现同样的问题
尽管如此,你也可以尝试这些方法,因为它们可能对你有效。
所有 PR 必须关联一个已存在的 Issue。 在提交 PR 之前,请先创建一个描述 Bug 或功能的 Issue。这有助于维护者分类并防止重复工作。没有关联 Issue 的 PR 可能会在不审查的情况下被关闭。
- 在 PR 描述中使用
Fixes #123或Closes #123来关联 Issue - 对于小型修复,简短的 Issue 即可 — 只需提供足够的上下文让维护者理解问题
- 保持 Pull Request 小而专注
- 解释 Issue 是什么以及你的修改如何解决它
- 在添加新功能之前,确保代码库中不存在类似功能
如果你的 PR 包含 UI 变更,请附上变更前后的截图或视频。这有助于维护者更快地审查,也能让你更快得到反馈。
对于非 UI 变更(Bug 修复、新功能、重构),请解释你如何验证它是否工作:
- 你测试了什么?
- 审查者如何复现/确认修复?
冗长的 AI 生成 PR 描述和 Issue 是不可接受的,可能会被忽略。请尊重维护者的时间:
- 写简短、专注的描述
- 用你自己的话解释发生了什么变化以及为什么
- 如果你无法简短地解释,你的 PR 可能太大了
PR 标题应遵循 conventional commit 标准:
feat:新功能或功能fix:Bug 修复docs:文档或 README 变更chore:维护任务、依赖更新等refactor:不改变行为的代码重构test:添加或更新测试
你可以选择性地包含范围来指示受影响的包:
feat(app):app 包中的功能fix(desktop):desktop 包中的 Bug 修复chore(opencode):opencode 包中的维护工作
示例:
docs: update contributing guidelinesfix: resolve crash on startupfeat: add dark mode supportfeat(app): add dark mode supportfix(desktop): resolve crash on startupchore: bump dependency versions
这些不是严格强制执行的,只是一般性指导原则:
- 函数: 除非拆分成独立函数能带来明显的复用或组合好处,否则保持逻辑在单个函数中
- 解构: 不要对变量进行不必要的解构
- 控制流: 避免
else语句 - 错误处理: 尽可能使用
.catch(...)而不是try/catch - 类型: 使用精确的类型,避免
any - 变量: 坚持不可变模式,避免
let - 命名: 在保持描述性的前提下,选择简洁的单词标识符
- 运行时 API: 在适用时使用 Bun 辅助函数,如
Bun.file()
对于全新的功能,请先进行设计讨论。创建一个 Issue,描述问题、你提出的方法(可选),以及为什么它属于 OpenCode。核心团队会帮助决定是否应该继续;请等待该批准,而不是直接提交功能 PR。
本项目使用 vouch 来管理贡献者信任。担保列表保存在 .github/VOUCHED.td 中。
- 担保用户 是被明确信任的贡献者
- 被谴责用户 是被明确屏蔽的。被谴责用户的 Issue 和 Pull Request 会自动关闭。如果你被谴责了,可以通过 Discord 联系维护者请求取消担保
- 其他所有人 可以正常参与 — 你不需要被担保就可以提交 Issue 或 PR
具有写权限的协作者可以通过在任何 Issue 上评论来管理担保列表:
vouch— 为 Issue 作者担保vouch @用户名— 为特定用户担保denounce— 谴责 Issue 作者denounce @用户名— 谴责特定用户denounce @用户名 <原因>— 带原因谴责unvouch/unvouch @用户名— 从列表中移除
变更会自动提交到 .github/VOUCHED.td。
谴责仅适用于反复提交低质量 AI 生成内容、垃圾信息或以其他恶意方式行为的用户。不用于意见分歧或无心之失。
所有 Issue 必须 使用我们的 Issue 模板之一:
- Bug report — 报告 Bug(需要描述)
- Feature request — 建议增强功能(需要验证复选框和描述)
- Question — 提问(需要问题)
不允许空白 Issue。当新 Issue 打开时,自动检查会验证它是否符合模板并满足我们的贡献指南。如果 Issue 不符合要求,你会收到一条评论解释需要修复什么,你有 2 小时 的时间编辑 Issue。之后它会自动关闭。
Issue 可能被标记为:
- 未使用模板
- 必填字段留空或填写占位文本
- AI 生成的长篇文本
- 缺少有意义的内容
如果你认为你的 Issue 被错误标记,请告知维护者。