模型: claude-opus-4-6 (anthropic/claude-opus-4-6) 生成日期: 2025-02-17
在开始深入源码之前,先把根目录的关键文件梳理清楚:
opencode/
├── package.json # 工作区根配置
├── tsconfig.json # TypeScript 基础配置
├── turbo.json # Turborepo 任务编排
├── sst.config.ts # SST(云基础设施)配置
├── bunfig.toml # Bun 配置
├── flake.nix # Nix 开发环境
├── bun.lock # 依赖锁文件
├── packages/ # 所有子包
├── sdks/ # IDE SDK
├── infra/ # 基础设施代码
├── specs/ # 设计规范文档
├── script/ # 全局脚本
├── patches/ # 第三方包补丁
└── nix/ # Nix 相关配置
package.json 的关键信息:
workspaces 字段定义了 Monorepo 中各子包的位置。Bun 会扫描这些路径下的所有 package.json,将它们作为工作区的成员管理。
衍生概念:什么是 Monorepo?
Monorepo(Monolithic Repository)是将多个相关项目放在同一个 Git 仓库中管理的策略。与之相对的是 Polyrepo(每个项目一个仓库)。
Monorepo 的优势:
代码共享简单:子包之间可以直接引用,无需发布到 npm
原子提交:修改跨多个子包的功能可以在一次 commit 中完成
统一的构建流程:通过 Turborepo 统一管理所有子包的构建、测试
Turborepo 的工作原理: Turborepo 是 Vercel 开发的 Monorepo 构建系统。它的核心能力是:
智能缓存:基于源文件的 Hash 判断是否需要重新构建
例如,当你运行 bun turbo typecheck 时,Turborepo 会分析所有子包的依赖关系,按拓扑排序并行执行类型检查,并缓存结果。
tsconfig.json:
非常简洁——继承了 Bun 官方的 TypeScript 配置。各子包会有自己更详细的 tsconfig.json。
2.2.2 packages/ 目录总览——17 个子包的职责划分
packages/ 是整个项目的核心,包含 17 个子包。它们的职责与相互关系如下图:
各子包的详细说明:
核心引擎。包含 CLI、Server、所有业务逻辑(Session、Tool、Agent、Provider 等)
Web 前端应用。提供浏览器界面来使用 OpenCode
共享 UI 组件库。被 app 和其他前端项目使用
TypeScript 客户端 SDK。从 OpenAPI 规范自动生成
Plugin 接口的类型定义。Plugin 开发者依赖此包获得类型支持
云控制台(含 app、core、function、mail、resource 子模块)
给读者的建议:本书的源码分析主要集中在 packages/opencode/(核心引擎)。当涉及前端、插件接口、SDK 等话题时,才会进入其他子包。如果你只想理解 OpenCode 的核心架构,只需要关注 packages/opencode/src/ 即可。
2.2.3 sdks/vscode/ —— VSCode 扩展
在 packages/ 之外,还有一个独立的 sdks/vscode/ 目录,包含 OpenCode 的 VSCode 扩展:
VSCode 扩展通过与 OpenCode 的内嵌 HTTP Server 通信来提供编辑器内的 AI 功能。它不是 OpenCode 的运行必需品,而是一个可选的增强。
2.2.4 infra/ —— SST 基础设施即代码
衍生概念:SST(Serverless Stack)
SST 是一个用于在 AWS 上部署全栈应用的框架。它允许开发者用 TypeScript 代码定义云基础设施(Infrastructure as Code,IaC),而不是手动在 AWS 控制台中配置。
根目录的 sst.config.ts 就是 SST 的入口配置文件。这部分与 OpenCode CLI 的核心功能无关,主要用于部署 OpenCode 的 Web 版本和云端服务。
对于本书的读者来说,infra/ 目录不是重点。它的存在说明 OpenCode 不仅仅是一个 CLI 工具,还有完整的云端基础设施支撑其在线服务。