首页 / 课程 / D04 深挖
Part 1: 核心架构 · 第 8 讲

24 讲路线 · 与 S04 配对

D04: Command Interface 深挖 · 命令接口

本讲在 S04 主线之上,聚焦实现细节、边界条件与自测;导图与主线相同模块,便于对照。

建议:先读完 S04,再按下方顺序走读源码与练习。

模块导图(与 S04 同源,便于对照):入口分流、管道模式与配置优先级

🔬 深挖目标

CLI 是「入口路由器」:同一行输入可能是自然语言、斜杠命令、子命令或管道;本讲理清分词优先级配置覆盖顺序

🧭 分流模型

  1. REPL 主循环读一行 → 判断是否以 / 开头 → 命中则走命令注册表。
  2. 未命中则作为「用户 turn」进入 QueryEngine(回到 D01)。
  3. 非交互模式(-p / pipe)往往跳过 TTY 特性,注意stdin 关闭退出码约定

⚙️ 配置优先级(通用模式)

层级典型来源备注
进程参数 / 环境变量argvENV最高优先级,适合 CI
项目级.claude、项目 settings多人协作差异最大
用户级全局 config与机器绑定

走读时请标出:哪一段代码合并这些层?后写覆盖先写还是深度合并?

🔗 耦合点

  • 命令层常直接操作 AppState(模型、MCP、权限模式),改动命令时要回归 D01/D07。
  • 与 D10:部分行为由 hooks 触发,命令是否是 hook 的唯一起点?

📖 走读顺序

  1. 找到 main / cli 入口,列出前 20 行内在做的初始化。
  2. 列出所有斜杠命令的注册表,标注哪些会改权限模式(高危)。
  3. 用 pipe 输入一段多行提示,观察是否与 TTY 路径行为一致。

✏️ 自测 1 · 参考答案:「打印当前有效配置」读什么?

题干

设计命令只打印当前有效配置,应读取合并后的哪一数据结构?

结论

应读取宿主内存里「合并完成」的单一真相对象(例如初始化管线在启动末尾构造的 AppState / EffectiveSettings),而不是只读磁盘上某一个 JSON 文件。

  • 输出里可分区展示:来源层(默认 / 用户 / 项目 / 环境变量覆盖)与最终字段值,便于对照「谁覆盖了谁」。
  • 若合并是深度合并,命令应调用与运行时同一套 merge 函数,避免「打印所见」与「实际所用」不一致。

✏️ 自测 2 · 参考答案:/command 与自然语言冲突?

题干

/command 与用户消息解析冲突,如何在词法层消除歧义?

结论

  • 第一 token 规则:仅当行首(trim 后)以 / 开头且紧跟已注册命令名时走命令表;否则整行进模型。
  • 转义:支持 \/ 或约定前缀(如 // 表示字面斜杠)避免用户想讨论路径时被当命令。
  • 多行与粘贴:命令解析只在「提交的一行」或「第一行」上做,避免块粘贴误触。

✏️ 自测(题干回顾)