第 2 讲:CLI 入口与命令路由

OpenCode 源码解析 · 第 2 讲

OpenCode 源码解析 第 2 讲:CLI 入口与命令路由 基于 dev 分支源码 · 2026-07-07 一、CLI 入口:index.ts OpenCode 的 CLI 入口是 packages/opencode/src/index.ts (142 行),使用 yargs 构建命令行框架。整个文件结构清晰:导入命令 → 配置 yargs → 注册命令 → 解析执行。 📦 源码仓库 https://github.com/opencode-ai/opencode 本讲核心文件: packages/opencode/src/index.ts (142 行) 二、入口代码逐行拆解 1. 命令导入 文件开头导入 20+ 个命令模块,每个命令对应一个独立文件: 📄 packages/opencode/src/index.ts(第 1-30 行) import yargs from "yargs" import { hideBin } from "yargs/helpers" import { RunCommand } from "./cli/cmd/run" import { GenerateCommand } from "./cli/cmd/generate" import { ServeCommand } from "./cli/cmd/serve" import { DebugCommand } from "./cli/cmd/debug" import { StatsCommand } from "./cli/cmd/stats" import { McpCommand } from "./cli/cmd/mcp" import { GithubCommand } from "./cli/cmd/github" import { ExportCommand } from "./cli/cmd/export" import { ImportCommand } from "./cli/cmd/import" import { AttachCommand } from "./cli/cmd/attach" import { TuiThreadCommand } from "./cli/cmd/tui" import { AcpCommand } from "./cli/cmd/acp" import { WebCommand } from "./cli/cmd/web" import { PrCommand } from "./cli/cmd/pr" import { SessionCommand } from "./cli/cmd/session" import { DbCommand } from "./cli/cmd/db" import { PluginCommand } from "./cli/cmd/plug" // ... 共 20+ 个命令模块 2. yargs 配置与全局中间件 yargs 实例配置了帮助、版本、全局选项,并通过 .middleware() 在每个命令执行前设置环境变量: 📄 packages/opencode/src/index.ts(第 32-70 行) const cli = yargs(args) .parserConfiguration({ "populate--": true }) .scriptName("opencode") .wrap(100) .help("help", "show help") .alias("help", "h") .version("version", "show version", InstallationVersion) .alias("version", "v") .option("print-logs", { describe: "print logs to stderr", type: "boolean", }) .option("log-level", { describe: "log level", type: "string", choices: ["DEBUG", "INFO", "WARN", "ERROR"], }) .option("p…

阅读全文:OpenCode 源码解析 第 2 讲