12 个 Claude Code 功能:详细解析与实例

本文有一个短视频:TikTok

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。

Claude CodeAI AgentDevToolsSpring Boot效率