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 的声明式参数定义,每个参数组合路由到对应入口