12 个 Claude Code 功能:详细解析与实例
1. 概览
Claude Code 是一个在 terminal 中运行的 coding agent,可以读取、修改、执行命令和自动检查项目中的代码。问题是:agent 虽然强大,但默认使用时容易“迷路” — 修改错误的文件、消耗完整个 context window,或执行危险命令。本文解释 12 个功能,帮助你有目的地控制这个 agent。读完后,你将了解如何配置 CLAUDE.md、permissions、hooks、MCP 等,使 Claude Code 按照团队约定工作,以包含 Order、Customer、PaymentService 的 Spring Boot 示例项目为例。
2. CLAUDE.md
CLAUDE.md 是一个内存文件,Claude Code 在每个 session 开始时自动读取。这是你声明代码约定、目录结构、构建命令、风格指南的地方 — 这样 agent 就不需要每次都重新询问。
# CLAUDE.md
## 架构
- Package `com.nonladev.order`:domain Order、Customer
- Package `com.nonladev.payment`:PaymentService、PaymentGateway(interface)
## 约定
- 始终为新的 public 方法编写 JUnit 5 + AssertJ 测试
- 不使用 `@Autowired` 字段注入,仅使用 constructor 注入
- 声称"完成"前运行 `mvn verify`
## 常用命令
- Build: `mvn -q clean verify`
- 本地运行: `mvn spring-boot:run`
Claude 在 session 中执行任何任务前都会读取这个文件。如果你要求“为 PaymentService 添加退款方法”,agent 会自动知道使用 constructor 注入并编写相应的测试 — 不需要重复提醒。
注意: 不要往 CLAUDE.md 中塞入过多细节。过长的文件会在 session 开始时就消耗 context window,而大部分内容对当前任务无关。
3. Permissions
Permissions 控制 Claude 可以使用哪些工具以及哪些工具被禁止 — 这很重要,因为 agent 有权运行真实的 shell 命令。
{
"permissions": {
"allow": [
"Bash(mvn *)",
"Edit(src/main/java/**)"
],
"deny": [
"Bash(rm -rf *)",
"Edit(src/main/resources/application-prod.properties)"
]
}
}
这个 settings.json 文件位于 .claude/ 目录中。allow 行允许 agent 运行 mvn 和修改 src/main/java 中的文件,但 deny 行绝对禁止递归删除命令,并禁止修改 production 配置文件。当 Claude 想突破权限限制时,它会要求你确认后再执行。
常见错误: 设置过于宽松的权限(
allow: ["*"])会让 agent 可以运行任何命令而无需询问 — 对敏感的配置文件或 secret 非常危险。
4. Plan Mode
Plan Mode 强制 Claude 在修改代码前阐述计划。你审查计划,必要时进行编辑,然后才允许执行。
> 为 PaymentService 添加部分退款功能
[PLAN MODE]
1. 为 PaymentService 添加 refundPartial(Order order, BigDecimal amount) 方法
2. 验证 amount <= order.getTotalPaid()
3. 调用 PaymentGateway.refund(...)
4. 为 2 个场景编写 PaymentServiceTest:有效的、amount 超出范围的
你想让我执行这个计划吗?[y/n/edit]
当你回答 edit 时,Claude 会根据建议修改计划(例如添加审计日志步骤),然后再接触真实源代码。这种方式对于修改多个文件的任务特别有用,因为你在计划阶段就能发现错误方向,而不是在代码已经改得一团糟之后。
5. Checkpoints
Checkpoints 是 project 在 session 中关键时刻的自动快照,让你能在 agent 搞砸事情时“回退”。
# 查看 session 中的 checkpoint 历史
/rewind
# 输出
Checkpoint 1 - 10:02 - 修改 PaymentService 前
Checkpoint 2 - 10:05 - 添加 refundPartial 后
Checkpoint 3 - 10:09 - 修改测试后(出错)
# 回退到 checkpoint 2
/rewind 2
不同于 git commit,checkpoint 不需要你手动创建 — Claude Code 会在每次大改前自动保存。如果 agent 以错误的方向修改测试(例如注释掉断言使测试“通过”),你可以回退到之前的状态,无需手动 git reset。
注意: checkpoint 仅存在于当前 session 范围内,不能替代 git。达到一个 milestone 时仍应进行真实的 commit。
6. Skills
Skills 是可重复使用的指南文件,Claude 在检测到合适的任务时自动应用 — 不需要你每次都手动调用。
---
name: spring-boot-test-writer
description: 当需要为 Spring Boot 项目中的 service layer 编写测试时使用
---
为 Service 类编写测试时:
1. 使用 JUnit 5 + AssertJ,不使用 Hamcrest
2. 使用 Mockito mock 依赖,变量命名为 `mock<Dependency>`
3. 测试方法命名为 `should_<expected>_when_<condition>` 的形式
这个文件位于 .claude/skills/spring-boot-test-writer.md。当你要求“为 PaymentService 编写测试”时,Claude 自动识别合适的 skill 并应用其中的约定,结果如下:
class PaymentServiceTest {
private final PaymentGateway mockGateway = mock(PaymentGateway.class);
private final PaymentService paymentService = new PaymentService(mockGateway);
@Test
void should_refundAmount_when_amountIsWithinPaidTotal() {
Order order = new Order("ORD-1", BigDecimal.valueOf(200));
paymentService.refundPartial(order, BigDecimal.valueOf(50));
verify(mockGateway).refund(order.getId(), BigDecimal.valueOf(50));
}
@Test
void should_throwException_when_amountExceedsPaidTotal() {
Order order = new Order("ORD-2", BigDecimal.valueOf(100));
assertThatThrownBy(() -> paymentService.refundPartial(order, BigDecimal.valueOf(150)))
.isInstanceOf(IllegalArgumentException.class);
}
}
Skills 与 CLAUDE.md 的不同之处在于:CLAUDE.md 总是被加载,而 skill 只在上下文需要时加载 — 为有许多专门约定的项目节省 context window。
7. Hooks
Hooks 在 agent 生命周期的特定点运行你的 shell 脚本,例如 PreToolUse(调用工具前)或 PostToolUse(调用工具后)。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit",
"command": "mvn -q -pl . checkstyle:check"
}
]
}
}
这个 settings.json 文件位于 .claude/ 目录中。每次 Claude 完成文件修改(Edit 工具)时,hook 自动运行 checkstyle:check。如果命令失败,输出返回给 Claude,agent 在报告任务完成前自动根据风格错误修复代码 — 你不需要手动运行检查。
[PostToolUse] mvn checkstyle:check
ERROR: PaymentService.java:42: Line is longer than 120 characters
→ Claude 自动缩短第 42 行并重新运行检查
何时不应使用: hook 在每次调用工具时运行,所以如果脚本很重(构建完整项目),session 会明显变慢。只 hook 到需要快速检查的生命周期事件。
8. MCP
MCP(Model Context Protocol)将 Claude 连接到外部系统 — 数据库、内部 API、issue tracker — 作为一个标准化工具。
{
"mcpServers": {
"postgres-orders": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres",
"postgresql://localhost:5432/orders_db"]
}
}
}
在 .claude/settings.json 中注册这个 server 后,你可以直接提问:
> 表 orders 中有多少个 PENDING 状态的 Order?
[MCP: postgres-orders] SELECT COUNT(*) FROM orders WHERE status = 'PENDING';
→ 37 个订单处于 PENDING 状态
Claude 自动生成 SQL 查询,通过 MCP server 调用,并从数据库返回真实结果 — 你无需手动将查询复制到其他 terminal。
9. Plugins
Plugin 是一个预先打包的 skills、MCP server 和相关 hooks 的集合,让你只需安装一次,而不用逐个配置。
/plugin install spring-boot-toolkit
这个命令安装一个假设包含以下内容的 plugin:Spring Boot 测试编写 skill、在每次编辑后运行 mvn verify 的 hook,以及连接到 Spring Boot Actuator 端点的 MCP server,使 agent 能自动检查健康状态。与其说你必须编写 3 个单独的配置文件(skill、hook、mcp),如第 6-8 项所示,不如说 plugin 将它们打包成一个可通过一行命令与整个团队共享的包。
10. Context
Context 是当前 session 的 context window — 所有已读文件、对话历史、命令输出。/context 命令让你看到它正在使用多少。
/context
Context usage: 48,200 / 200,000 tokens (24%)
- CLAUDE.md: 1,200 tokens
- Files read: PaymentService.java, Order.java, PaymentServiceTest.java (6,400 tokens)
- Conversation history: 38,000 tokens
- Tool outputs: 2,600 tokens
当你看到对话历史占大部分时,你知道应该进行 compact 或开始新 session,避免因为 context 满了而让 Claude “遗忘”在 session 开始时提到的重要细节。
11. Slash Commands
Slash command 是你反复运行的任务的快捷方式 — 输入 / 然后调用名称,不需要每次都重写长 prompt。
---
name: review-pr
description: 根据标准 checklist 审查当前 diff
---
使用以下 checklist 审查当前代码 diff:
1. 新逻辑有测试吗?
2. 日志中有敏感信息(卡号、密码)吗?
3. 有违反 constructor 注入约定吗?
按照格式回答:每项使用 PASS/FAIL,附加原因。
将这个文件保存到 .claude/commands/review-pr.md,然后调用:
/review-pr
1. PASS - 有 refundPartial 的 PaymentServiceTest
2. FAIL - log.info 在第 58 行包含 order.getCardNumber()
3. PASS - 使用 constructor 注入
Slash command 与 skill 的不同之处在于:skill 根据上下文自动触发,而 slash command 需要你明确调用 — 适合固定的 checklist,如 PR 审查、发布说明。
12. Compaction
Compaction 将长的对话历史压缩为摘要,释放 token 而不丧失重要信息。
/compact
压缩前:182,000 / 200,000 tokens
压缩后:24,000 / 200,000 tokens
保留的摘要:
- 正在做:为 PaymentService 添加 refundPartial
- 已完成:PaymentServiceTest(2 个测试用例通过)
- 剩余:为 /refund 端点更新 OpenAPI spec
与其在 context 满时让 agent 彻底遗忘历史,compaction 保留重要的里程碑(正在进行的任务、已完成的、缺失的),形成简短摘要,然后以大部分 context 为空的状态继续 session。你应该在完成一个大的子任务后主动调用 /compact,然后再转到下一个任务。
13. Subagents
Subagents 允许 Claude Code 生成多个 agent 并行运行,每个 agent 负责大工作流中的一个独立部分。
---
name: test-writer
description: 专门为指定的 class 编写单元测试
tools: Read, Edit, Bash
---
你只编写测试,不修改业务逻辑。使用 JUnit 5 + AssertJ。
使用 .claude/agents/test-writer.md 中的这个 subagent 文件,你可以将大任务分配给主 agent,然后主 agent 自动分配工作:
> 完善 refund 模块:添加逻辑、编写测试、更新文档
[Main agent] 分配工作给 3 个并行 subagent:
→ subagent "code-writer":为 PaymentService 添加 refundPartial
→ subagent "test-writer":编写 PaymentServiceTest
→ subagent "doc-writer":更新 README.md
[3 个 subagent 并行运行] ... 42 秒后完成
与其让主 agent 顺序处理每一步(代码 → 测试 → 文档,可能耗时 3 倍),subagents 并发处理独立的部分 — 对于彼此不紧密依赖的多步骤工作流很有用。
何时不应使用: 如果步骤有顺序依赖(例如编写测试需要代码已完成才能知道接口),并行运行会导致错误,因为测试 subagent 会在代码存在之前运行。只对能真正独立分割的任务使用 subagents。
14. 总结
上述 12 个功能分为三个明确的组:agent 定向组(CLAUDE.md、Skills、Plan Mode)、安全控制组(Permissions、Checkpoints、Hooks)和能力扩展组(MCP、Plugins、Subagents)。Context、Slash Commands 和 Compaction 是帮助 agent 在长 session 中高效运行的基础层。你不需要一次使用全部 12 个功能 — 从你当前项目的 CLAUDE.md 和 Permissions 开始,然后在工作流真正需要时添加 Hooks 或 MCP。