第二节:内置命令详解
命令注册与执行

作者:小学子 📚 | 日期:2026年4月2日 | 第三阶段 · 模块三


# 第三阶段 · 模块三 · 第二节:内置命令详解

核心问题

/help、/compact、/clear、/model 等内置命令是如何实现的?compact 的上下文压缩机制是什么?


◇ 本节位置


        Claude Code 全局架构
        
        ┌─────────────────────────────────────────────────────────────────────┐
        │  命令系统(commands.ts)← 本节                                      │
        │                                                                      │
        │  ├── /help ──> 显示帮助                                           │
        │  ├── /compact ──> 压缩上下文                                      │
        │  ├── /clear ──> 清空会话                                          │
        │  └── /model ──> 切换模型                                          │
        └─────────────────────────────────────────────────────────────────────┘
        


一、/compact 上下文压缩

1.1 源码位置

源码位置:`src/commands/compact/index.ts`


        const compact = {
          type: 'local',
          name: 'compact',
          description: 'Clear conversation history but keep a summary in context.',
          isEnabled: () => !isEnvTruthy(process.env.DISABLE_COMPACT),
          supportsNonInteractive: true,
          argumentHint: '<optional custom summarization instructions>',
          load: () => import('./compact.js'),
        } satisfies Command;
        

1.2 五问分析

问 1:compact 的工作原理?


        // compact.js 实现
        async function compactConversation(messages: Message[], instructions?: string) {
          // 1. 调用模型生成摘要
          const summary = await model.generate({
            system: 'Summarize the conversation concisely.',
            messages: messages,
          });
        
          // 2. 清空消息历史
          // 3. 将摘要作为系统消息保留
          return {
            type: 'system',
            content: `Conversation summary: ${summary}`,
          };
        }
        

问 2:为什么要压缩上下文?


        问题:上下文长度有限制(token limit)
        
        Claude Opus: 200K tokens
        Claude Sonnet: 200K tokens
        Claude Haiku: 200K tokens
        
        长时间对话会耗尽上下文,导致:
        1. API 成本增加
        2. 模型响应变慢
        3. 可能超出限制
        
        解决方案:compact
        - 将历史压缩为摘要
        - 释放上下文空间
        

问 3:compact 和 clear 的区别?

命令效果保留内容
`/compact`压缩历史为摘要摘要
`/clear`完全清空

问 4:compact 的触发条件?


        // 自动触发:当上下文达到一定比例时
        const AUTO_COMPACT_THRESHOLD = 0.8;  // 80%
        
        async function checkAndCompact() {
          const usage = await getContextUsage();
          if (usage > AUTO_COMPACT_THRESHOLD) {
            await executeCommand('compact');
          }
        }
        

问 5:compact 可以自定义吗?


        // 用户可以提供自定义的 summarization 指令
        /compact Focus on technical decisions and conclusions
        
        // 模型会根据这些指令生成特定风格的摘要
        


二、/clear 清空会话

2.1 源码位置

源码位置:`src/commands/clear/index.ts`


        const clear = {
          type: 'local',
          name: 'clear',
          description: 'Clear the conversation history and start fresh.',
          isEnabled: () => true,
          supportsNonInteractive: true,
          argumentHint: '',
          load: () => import('./clear.js'),
        } satisfies Command;
        

2.2 五问分析

问 1:clear 的效果?


        // clear.js 实现
        async function clearConversation(): Promise<CommandResult> {
          return {
            type: 'text',
            content: 'Conversation cleared. Starting fresh.',
            clearContext: true,  // 关键:清空上下文
          };
        }
        

问 2:clear 可以恢复吗?


        // /clear 不可恢复
        // 如果想保留历史,使用 /compact
        
        // 建议用户:
        // - 如果要保留历史摘要 → /compact
        // - 如果要完全重置 → /clear
        

问 3:clear 会删除文件吗?


        // 不会!/clear 只清空对话历史
        // 不会删除任何文件
        
        // 如果用户说"删除所有文件",那是 Bash 工具执行的
        // 不是 /clear 命令的功能
        


三、/model 切换模型

3.1 源码位置

源码位置:`src/commands/model/index.ts`

3.2 五问分析

问 1:可用的模型有哪些?


        const AVAILABLE_MODELS = [
          'claude-opus-4-5',
          'claude-sonnet-4-5',
          'claude-haiku-3-5',
        ];
        

问 2:模型切换的粒度?


        // 命令级别
        /claude "hello" --model opus
        
        // 会话级别
        /model opus
        
        // 持久化到配置文件
        

问 3:不同模型的特点?

模型能力速度成本
Opus最高最慢最高
Sonnet中等中等中等
Haiku基础最快最低


四、/help 显示帮助

4.1 源码位置

源码位置:`src/commands/help/index.ts`

4.2 五问分析

问 1:help 显示什么内容?


        // 返回命令列表和使用说明
        function formatHelp(commands: Command[]): string {
          return commands
            .map(cmd => `/${cmd.name} - ${cmd.description}`)
            .join('\n');
        }
        

问 2:help 支持搜索吗?


        // /help compact
        // 只显示匹配的命令
        


五、/session 会话管理

5.1 源码位置

源码位置:`src/commands/session/index.ts`

5.2 五问分析

问 1:session 有哪些子命令?


        /session list      // 列出所有会话
        /session resume   // 恢复指定会话
        /session delete   // 删除会话
        /session export   // 导出会话
        

问 2:会话存储在哪里?


        // 默认存储在 ~/.claude/sessions/
        const SESSION_DIR = path.join(os.homedir(), '.claude', 'sessions');
        

问 3:如何恢复会话?


        // /session resume abc123
        // 从会话 ID 恢复完整上下文
        


六、命令系统设计

6.1 命令类型


        type CommandType = 'local' | 'remote' | 'mcp';
        
        // local: 本地命令(/help, /clear)
        // remote: 远程命令(需要网络)
        // mcp: MCP 协议命令
        

6.2 五问分析

问 1:为什么区分命令类型?


        // local 命令始终可用
        // remote 命令需要网络连接
        // mcp 命令需要 MCP Server
        

问 2:命令可以组合吗?


        // 不支持管道操作
        // 每个命令独立执行
        


七、思考题

思考题 1:compact 的自动触发机制?

问题:compact 什么时候自动触发?用户能控制吗?

答案


        // 自动触发条件
        const AUTO_COMPACT_THRESHOLD = 0.8;
        
        // 触发时机
        if (contextUsage > AUTO_COMPACT_THRESHOLD) {
          await executeCommand('compact');
        }
        
        // 用户控制
        /DISABLE_COMPACT  // 环境变量禁用
        /compact never    // 手动禁用
        


思考题 2:命令的权限控制?

问题:某些命令是否需要特殊权限?

答案


        // 敏感命令需要权限
        const SENSITIVE_COMMANDS = [
          'exit',      // 退出程序
          'config',    // 修改配置
          'session delete',  // 删除会话
        ];
        
        // 权限检查
        if (SENSITIVE_COMMANDS.includes(command.name)) {
          if (!hasPermission(user, command)) {
            return { error: 'Permission denied' };
          }
        }
        


思考题 3:命令日志?

问题:命令执行是否被记录?

答案


        // 命令执行日志
        logEvent({
          type: 'command_executed',
          command: 'compact',
          user: currentUser.id,
          timestamp: Date.now(),
        });
        


八、延伸阅读

文件核心内容
`src/commands/compact/`/compact 命令
`src/commands/clear/`/clear 命令
`src/commands/session/`/session 命令
`src/commands/help/`/help 命令


九、下节预告

下一节我们将深入 命令处理流程

- 命令解析的详细流程

- 命令执行器

- 命令结果处理


*- 第一轮:□ 事实准确性*

*- 第二轮:□ 深度与洞见*

*- 第三轮:□ 可读性与价值*