命令系统
86 个 Slash 命令的注册与执行
命令系统处理用户输入的 /command 指令。所有命令注册在 commands.ts 中,每个命令以独立目录存在于 commands/ 下,包含元数据、处理逻辑和权限配置。
核心要点
设计亮点
命令给人用,工具给 AI 用
这个分离设计解决了一个关键的 UX 问题:用户需要的交互方式和 AI 需要的接口是不同的。用户想要简洁的 /commit,AI 需要精确的 Bash(git add...) + Edit(commit-msg) 调用链。命令系统将用户意图翻译成 AI 可以理解和执行的工具调用序列。
复合命令像流水线
commit-push-pr 命令把 6 个步骤串联在一起:检查状态 → 分析差异 → 生成 commit message → 创建 commit → push → 创建 PR。每个步骤都可以独立执行,但组合在一起就是一个完整的工作流。失败时会在出错步骤停下来,不会继续执行后续步骤(比如 commit 失败就不会 push)。
模块架构图
commands.ts900 LOC命令注册中心,导入所有命令
commands/commit/300 LOCGit commit 命令
commands/review/400 LOC代码审查命令
commands/session/500 LOC会话管理命令
commands/config/300 LOC配置管理命令
commands/mcp/400 LOCMCP 服务器命令
commands/agents/500 LOCAgent 平台命令
commands/skills/300 LOC技能管理命令
关键代码
深入解析
命令和工具是两个独立的系统:命令面向用户(/commit),工具面向模型(Bash, Read 等)。用户通过 / 前缀触发命令,Claude 通过 tool_use API 调用工具。
部分命令如 commit-push-pr 是复合命令,串联多个操作为完整工作流:先运行 git status、git diff 分析变更,生成 commit message,创建 commit,推送到远程,最后创建 Pull Request。
命令支持自动补全,在 REPL 中按 Tab 可以看到可用命令列表。自动补全系统会根据上下文过滤命令(如未在 git 仓库中时隐藏 git 相关命令)。
每个命令以独立目录存在于 commands/ 下,包含元数据(名称、描述、参数定义)、处理函数、权限要求。这种组织方式让添加新命令就像添加新目录一样简单。
部分命令用 feature() 守卫,仅在内部构建中可见(ant-only)。外部用户看不到也无法调用这些命令,甚至不知道它们的存在。
命令的 handler 函数可以直接操作 AppState(修改消息、更新 UI),也可以向 REPL 注入新的用户消息让 Claude 处理。比如 /commit 命令实际上是向 Claude 发送了一条'帮我创建 commit'的消息。
命令系统和技能系统有明确分工:命令是'硬编码'的 TypeScript 函数,有完整的运行时访问权限;技能是'软编码'的提示词模板,通过 AI 间接执行。命令更强大但需要代码修改,技能更灵活但能力有限。