OpenCode源码学习 Day01
day01 项目概览与环境准备
具体任务
1. Fork 并克隆官方仓库:https://github.com/anomalyco/opencode
2. 阅读 README 和 CONTRIBUTING.md
3. 安装 Bun 1.3+、Go 1.22+、Turbo
4. 本地编译运行开发版本
预期成功
成功在本地启动 OpenCode 开发服务器和 TUI 客户端

1. Fork 并克隆官方仓库
https://github.com/anomalyco/opencode
既然学习项目,也看一下项目的背景。
OpenCode 是由 加拿大Anomaly 公司(全称 Anomaly Innovations,GitHub 组织名为 anomalyco)开发的开源 AI 编程智能体。
公司由 Jay V 和 Frank Wang 俩个华人在滑铁卢大学创立。现在总部位于美国旧金山。
2021 年通过 Y Combinator 孵化,获得 PayPal、LinkedIn 等创始人投资。
2025 年 6 月推出 OpenCode,截至 2026 年 4 月 GitHub 星标已超过 14 万。
商业模式:通过免费开源工具吸引用户,提供 OpenCode Zen 模型托管增值服务。
2. 阅读 README 和 CONTRIBUTING.md
README.md 就简单介绍了下项目情况,和cli和gui的安装使用。当前支持mac/windows/liunx。
CONTRIBUTING.md 是比较重要的。
主要内容:
-
贡献范围说明 – 明确哪些类型的贡献会被接受(bug修复、LSP/格式化器添加、性能改进等) -
开发环境设置 – 详细说明如何设置开发环境,使用 Bun 1.3+ 进行开发 -
项目结构说明 – 解释核心包的作用和相互关系 -
开发工作流 – 提供 bun dev 与生产版本的区别和使用方法 -
调试指南 – 详细的调试设置说明,包括 VSCode 配置 -
PR 规范 – 严格的代码提交要求和格式规范
LICENSE 是最宽松的MIT,保留版权声明 – 在副本中保留原始 MIT 许可证和版权声明。其他无要求。
SECURITY.md 主要声明了一些安全的前置条件,一些配置是需要用户去二次设置的,如果没设置不算项目的安全问题。比如:
-
没有配置密码就启动http服务 -
默认没有沙箱隔离,如果需要自己配置 -
LLM/MCP的恶意行为,用户自己修改造成的问题
都不在项目的安全考虑范围内
3. 安装 Bun 1.3+、Go 1.22+、Turbo
首先纠正一个错误,OpenCode不需要Go和Turbo。之前是有错误。
OpenCode 需要用到的技术:
运行时:Bun 1.3+(唯一必需的核心运行时,替代 Node.js)
编程语言:TypeScript 100% 核心业务逻辑
数据库:SQLite(本地会话、消息、配置持久化)
前端主框架:SolidJS 1.9+(高性能响应式框架,比 React 更快)
桌面框架:Tauri v2(原生桌面应用,同时支持 Electron 作为备选后端)
这边先说一下核心工具Bun。Bun 是由 Jarred Sumner 开发的,他是一个独立开发者。Jarred Sumner – 独立开发者,之前曾在 Google 工作,对 JavaScript 性能和开发工具有深入研究,对 Node.js 的性能和开发体验不满意,决定自己构建更好的运行时,完全开源,MIT许可证。
Bun 是一个全新的 JavaScript 运行时,旨在解决 Node.js 多年积累的痛点。从根本上说还是JavaScript 语言,最初的JavaScript 语言只能运行在浏览器,2009年Nodejs的出现,让JavaScript 可以运行在服务端。但是Nodejs有很大问题。2022年Bun的出现解决了很多问题,比如:
-
启动性能瓶颈 -
包管理速度慢 -
工具链碎片化 -
TypeScript 开发体验 -
Web 标准兼容性 -
内存使用效率
因为我是写Java的,做个简单的类比,相信写Java的就都明白了:
-
JavaScript = Java — 基础编程语言 -
Node.js = Struts2 — 早期的重量级框架,解决了核心问题但有些笨重 -
Bun = Spring – –现代的轻量级一体化解决方案,注重开发体验和性能
因为我本地有yarn,使用yarn安装
yarn global add bun
配置环境变量
# 1. 获取当前用户 PATH$currentPath = [Environment]::GetEnvironmentVariable("PATH", "User")# 2. 获取 Yarn 全局 bin 目录$yarnBinPath = yarn global bin# 3. 如果不在 PATH 中,则添加if ($currentPath -notlike "*$yarnBinPath*") {$newPath = "$yarnBinPath;$currentPath"[Environment]::SetEnvironmentVariable("PATH", $newPath, "User")Write-Host "已永久配置完成" -ForegroundColor Green}# 4. 重新加载环境变量$env:PATH = [Environment]::GetEnvironmentVariable("PATH", "User") + ";" + [Environment]::GetEnvironmentVariable("PATH", "Machine")# 5. 验证bun --version
今天就到这里,编译环境有点小问题,明天继续!!!
夜雨聆风