CLI
CLI 模块是 Claude Code 的命令行前端,负责解析 --model、--resume、--print 等参数,处理 stdin 管道输入,并将解析结果路由到对应的入口点。它同时管理 CLI 级别的特性开关(如 MCP 模式、SDK 模式),是用户意图进入系统的第一道翻译层。模块内部还处理了 --version、--help 等元命令的快速响应路径。
职责与设计理念
职责说明
命令行参数解析与子命令路由,将用户输入翻译为系统意图
设计理念
参数即意图——CLI 不做业务逻辑,只做意图翻译。每个参数组合映射到一个确定的入口点,保持解析层的纯粹性。
架构决策
为什么 CLI 层不直接处理业务逻辑?
CLI 只做参数解析和路由,业务逻辑下沉到 Entrypoints
同一个业务逻辑可能从 CLI、SDK、MCP 三种入口触发。如果 CLI 直接处理业务,SDK 和 MCP 就需要重复实现。分离后,CLI 只是三种"翻译器"之一。
文件清单
| 文件名 | 用途 |
|---|---|
| cli.ts | CLI 主入口,参数定义与解析 |
| args.ts | 参数类型定义与校验规则 |
| flags.ts | 特性开关与环境变量映射 |
使用场景
claude --model opus "重构这个文件"
解析 --model 为模型覆盖,剩余参数作为初始 prompt,路由到交互模式
CLI.parse() → setMainLoopModelOverride() → Entrypoints.cli()
echo "fix bug" | claude --print
检测 stdin 管道输入,启用 print 模式(非交互,输出纯文本)
CLI.parse() → detectStdin() → Entrypoints.print()
依赖关系
- Commands — 斜杠命令系统,管理 80+ 个子命令的注册、发现与执行
- Entrypoints — 多模式入口适配器,统一 CLI/SDK/MCP 三种调用方式的启动路径
关键代码片段
CLI 参数解析与路由
program
.option('-p, --print', 'print mode')
.option('--model <model>', 'model override')
.option('--resume <id>', 'resume session')
.action(async (opts) => {
if (opts.print) return runPrintMode(opts)
return runInteractiveMode(opts)
}) 基于 Commander.js 的声明式参数定义,每个参数组合路由到对应入口