# 第三阶段 · 模块三 · 第二节:内置命令详解
/help、/compact、/clear、/model 等内置命令是如何实现的?compact 的上下文压缩机制是什么?
Claude Code 全局架构
┌─────────────────────────────────────────────────────────────────────┐
│ 命令系统(commands.ts)← 本节 │
│ │
│ ├── /help ──> 显示帮助 │
│ ├── /compact ──> 压缩上下文 │
│ ├── /clear ──> 清空会话 │
│ └── /model ──> 切换模型 │
└─────────────────────────────────────────────────────────────────────┘
源码位置:`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: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
// 模型会根据这些指令生成特定风格的摘要
源码位置:`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;
问 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 命令的功能
源码位置:`src/commands/model/index.ts`
问 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 | 基础 | 最快 | 最低 |
源码位置:`src/commands/help/index.ts`
问 1:help 显示什么内容?
// 返回命令列表和使用说明
function formatHelp(commands: Command[]): string {
return commands
.map(cmd => `/${cmd.name} - ${cmd.description}`)
.join('\n');
}
问 2:help 支持搜索吗?
// /help compact
// 只显示匹配的命令
源码位置:`src/commands/session/index.ts`
问 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 恢复完整上下文
type CommandType = 'local' | 'remote' | 'mcp';
// local: 本地命令(/help, /clear)
// remote: 远程命令(需要网络)
// mcp: MCP 协议命令
问 1:为什么区分命令类型?
// local 命令始终可用
// remote 命令需要网络连接
// mcp 命令需要 MCP Server
问 2:命令可以组合吗?
// 不支持管道操作
// 每个命令独立执行
问题:compact 什么时候自动触发?用户能控制吗?
答案:
// 自动触发条件
const AUTO_COMPACT_THRESHOLD = 0.8;
// 触发时机
if (contextUsage > AUTO_COMPACT_THRESHOLD) {
await executeCommand('compact');
}
// 用户控制
/DISABLE_COMPACT // 环境变量禁用
/compact never // 手动禁用
问题:某些命令是否需要特殊权限?
答案:
// 敏感命令需要权限
const SENSITIVE_COMMANDS = [
'exit', // 退出程序
'config', // 修改配置
'session delete', // 删除会话
];
// 权限检查
if (SENSITIVE_COMMANDS.includes(command.name)) {
if (!hasPermission(user, command)) {
return { error: 'Permission denied' };
}
}
问题:命令执行是否被记录?
答案:
// 命令执行日志
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 命令 |
下一节我们将深入 命令处理流程:
- 命令解析的详细流程
- 命令执行器
- 命令结果处理
*- 第一轮:□ 事实准确性*
*- 第二轮:□ 深度与洞见*
*- 第三轮:□ 可读性与价值*