乐于分享
好东西不私藏

OpenCode源码学习 Day01

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

今天就到这里,编译环境有点小问题,明天继续!!!