解构 Claude Code

Claude Code 不仅仅是"提示 → 辔 → → 辍 大多数开发者认为 AI 编码工具就是一个聊天界面。你输入,它回复。你复制代码。你继续前进。Claude Code 完全不同。

解构 Claude Code
微信 ezpoda免费咨询:AI编程 | AI模型微调| AI私有化部署
AI工具导航 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo
预览图片

大多数开发者认为 AI 编码工具就是一个聊天界面。你输入,它回复。你复制代码。你继续前进。

Claude Code 完全不同。

1、传统方式 vs Claude Code 方式

想象雇佣一位聪明的开发者,他他* 每次关闭对话就忘记一切

  • 不知道自己在什么项目
  • 除非你每次都描述工具,否则无法使用
  • 逘需要你监督他们的每一个动作

这是一个传统的 AI 聊天工具。

现在想象一位开发者,他 以下特点:**

  • 在开始每个会话之前阅读项目文档
  • 自动遵循你的代码风格和架构规则
  • 拥有可以委派工作的专家同事
  • 可以连接到你的数据库、GitHub、Slack 等
  • 拥有防止他们犯下危险错误的护栏
  • 在接触每个文件后自动运行质量检查

这就是 Claude Code。

它不是一个带有代码块的聊天界面。它是一个完整的智能体开发环境—— Claude 不仅仅是响应,还会行动决策委托持久化

在我们我们探索功能之前,先了解"智能体循环"意味着。

在传统聊天机器人中:

你输入 → AI 回复 → 完成

在 Claude Code 中,循环是这样的:

你给出目标
      ↓
Claude 读取项目上下文 (CLAUDE.md, 规则)
      ↓
Claude 制定计划
      ↓
Claude 使用工具(读取文件、 运行命令, 调用 API)
      ↓  ←──────────────────────────────────┐
Claude 检查结果                        │
      ↓                                      │
需要更多信息? ──── 是 ─────────────────┘
      ↓ 否
Claude 交付结果
      ↓
钩子运行(格式化代码, 运行测试, 记录活动)

Claude 不会在每一步等待你。它会自主行动——读取文件、运行命令、 修复错误, 并重试。

Claude Code 的强大之处在于,你可以将自定义逻辑插入这个循环的每一个部分。

2、6 个扩展点

宏观图如下。每个功能插入 Claude 智能体循环的不同部分:

6个扩展点

让我们逐个探索。

3、CLAUDE.md — 持久记忆

插入点:会话开始 —— 在 Claude 编写任何代码行之前加载。

3.1 它解决的问题

每次开始新的 Claude 会话时,它对项目一无所知。你必须重新解释

  • 如何运行测试
  • 哪些文件夹包含哪些代码
  • 使用什么命名约定
  • 做出了什么架构决策

CLAUDE.md 解决了这个问题。这是一个 markdown 文文件,Claude 在每次会话开始时自动读取——就像新开发者的入职文档。

示例 CLAUDE.md

# CLAUDE.md

## 构建和测试命令
- 安装: `npm install`
- 运行开发服务器: `npm run dev`
- 运行测试: `npm test`
- 运行单个测试: `npm test -- --testPathPattern=<filename>`
- 代码检查: `npm run lint`

## 代码风格
- 2 空格缩进
- TypeScript 严格模式
- 优先使用 `const`,避免 `var`

## 架构
- API 夌理程序: `src/api/`
- React 组件: `src/components/`
- 所有 API 响应用: `{ success, data, error }`

## 命名约定
- 组件: PascalCase → `UserProfile.tsx`
- 函数: camelCase → `getUserProfile`
- 常量: UPPER_SNAKE_CASE → `MAX_RETRIES`

现在每个会话中,Claude 已经知道如何构建项目、东西在哪里, 以及要遵循什么编码风格——无需你重复自己。

3.2 CLAUDE.md 可以存在哪里

Claude 遵循层次结构。更具体的文件优先

CLAUDE.md 层次结构
💡 专业提示:保持在 200 行以内。每一行都会消耗 Claude 上下文窗口中的令牌。简短具体胜过冗长模糊。

4、.claude/rules/ — 条件指令

插入点 在规划期间 —— 仅当 Claude 处理匹配文件时加载。

4.1 它解决的问题

你的项目对不同部分的代码库有不同的规则。API 代码有不同的约定, React 组件。数据库查询有不同的安全要求,工具函数。

如果把所有内容都放在 CLAUDE.md 中,它会变得庞大。而且 Claude 每次都会加载所有内容——即使在处理不相关的文件时也是如此。

.claude/rules/ 通过条件加载解决了这个问题。

4.2 如何工作

.claude/rules/ 中创建 markdown 文件。在顶部添加 paths 部分以指定哪些文件触发此规则

.claude/
└── rules/
    ├── api-rules.md         ← 仅用于 src/api/**
    ├── frontend-rules.md    ← 仅用于 src/components/**
    └── security.md          ← 始终加载(无 paths)

示例 api-rules.md

---
paths:
  - "src/api/**/*.ts"
---

# API 开发规则
- 每个端点必须在处理前验证输入
- 始终返回: `{ success: boolean, data: any, error: string | null }`
- 使用正确的 HTTP 状态码: 200, 400, 401, 404, 500
- 永远不要向客户端暴露内部错误消息
- 记录所有错误并附带时间戳和请求 ID

示例 frontend-rules.md

---
paths:
  - "src/components/**/*.{ts,tsx}"
---

# 前端规则
- 仅使用带 hooks 的函数组件(禁止类组件)
- 始终使用 TypeScript `interface` 类型 props
- 对具有稳定 props 的组件使用 React.memo
- 数据获取必须使用 TanStack Query (react-query)
- 禁止内联样式 - 仅使用 Tailwind CSS 类

示例 security.md(无 paths = 始终加载)

# 安全规则

- 永远不要在源代码中硬编码 API 密钥、令牌或密码
- 始终使用环境变量存储机密信息
- 在数据库查询之前清理所有用户输入
- 永远不要记录密码、令牌或个人信息

4.3 与 CLAUDE.md 的关键区别

CLAUDE.md vs rules 对比

5、技能 —— 可重用工作流

插入点 按需 — 手动调用或 Claude 识别任务时自动调用

5.1 它解决的问题

你不断要求 Claude 执行相同类型的任务

  • "向我解释这段代码"
  • "为这个函数编写测试"
  • "审查这个 PR"

每次,你都需要编写一个长提示,准确描述想要的格式、包含内容、避免内容。

技能 让你可以定义一次提示并永远重用。

5.2 如何工作

.claude/skills/<skill-name>/ 中创建一个带有 SKILL.md 文件的文件夹

.claude/
└── skills/
    ├── explain-code/
    │   └── SKILL.md
    └── write-tests/
        └── SKILL.md

示例 explain-code/SKILL.md

---
name: explain-code
description: 用类比、图表和分步演练解释代码。
             当用户问"这是如何工作的?"或"解释这段代码"时使用。
---

解释代码时,始终遵循此结构:
## 1. 一行总结
以 "这段代码做了 X。" 开头
## 2. 现实世界类比
将代码与日常生活的事物进行比较
## 3. 可视化图表
绘制显示流程的 ASCII 图表
## 4. 分步演练
逐块解释每个部分的作用
## 5. 注意事项
以人们在使用此代码时常犯的一个常见错误结尾

示例 write-tests/SKILL.md

---
name: write-tests
description: 为给定函数或文件编写 Jest 单元测试。
             当被要求"编写测试"或"添加测试覆盖率"时使用
argument-hint: [filename or function name]
---

为 $ARGUMENTS 编写 Jest 测试
覆盖:
1. 快乐路径 - 正常预期输入
2. 边缘情况 - 空、null、 鰶、 大值
3. 错误情况 - 无效输入,缺失字段
每个测试的结构:
- 安排(设置输入)
- 操作(调用函数)
- 断言(检查结果)

5.3 如何使用技能

使用斜杠命令手动调用:

/explain-code
/write-tests getUserProfile

$ARGUMENTS 会被你输入技能名称后的内容替换

/write-tests getUserProfile

→ Claude 专门为 getUserProfile 编写测试

自动调用 description 字段告诉 Claude 何时自动使用技能。如果你输入"你能解释一下这个认证中间件是如何工作吗",Claude 会识别匹配并使用 explain-code 技能,而无需你输入 /explain-code

5.4 技能 vs CLAUDE.md

技能 vs CLAUDE.md 对比

6、子智能体 —— 专家团队成员

插入点 在执行期间 —— Claude 将复杂或隔离的任务委托给专家

6.1 它解决的问题

想象让 Claude 在编写新功能的同时进行完整的代码审查。代码审查是一个完全独立的关注点——它不应与主任务的上下文混合。它还需要特定的工具(只读访问,无写入)

子智能体 让你可以创建 Claude 可以委派工作的专家 AI 工作者——每个都有自己独立的上下文、特定工具和专注的专业知识。

6.2 如何工作

.claude/agents/<agent-name>/ 中创建一个带有 markdown 文件的文件夹

.claude/
└── agents/
    └── code-reviewer/
        └── agent.md

示例 code-reviewer/agent.md

---
name: code-reviewer
description: 专家代码审查专家。审查代码的质量、安全性、bug 和和可维护性。
             在编写或修改代码后使用
tools: Read, Grep, Glob, Bash
model: sonnet
---

你是一位高级软件工程师,正在进行彻底的代码审查
调用时:
1. 运行 `git diff` 查看最近的更改
2. 读取修改的文件
3. 立即开始审查

## 审查清单
### 代码质量
- [ ] 代码可读且自文档化
- [ ] 函数只做一件事
- [ ] 没有重复代码

### 安全性
- [ ] 没有硬编码的密钥或 API 密钥
- [ ] 用户输入已验证

### 错误处理
- [ ] 所有异步调用都有 try/catch

6.3 无子智能体 vs 主 Claude 上下文

主 Claude 上下文 = 仅你的任务
代码审查员上下文 = 分离的窗口,仅包含审查相关内容

子智能体:

  • 自己的隔离上下文窗口中运行
  • 拥有受限工具(例如,审查员只读)** 可以 Claude 继续其他工作的同时在后台运行
  • 可以跨会话**记住内容(使用持久记忆)

7、MCP — 外部工具和数据

插入点 在执行期间 —— 让 Claude 访问代码库外部的工具。

它解决问题

Claude 本身只能读写项目中的文件。它无法:

  • 查询你的数据库
  • 读取 GitHub issues
  • 检查 Sentry 锑误日志
  • 发送 Slack 消息
  • 查看 Figma 设计

MCP (模型上下文协议) 是一个开放标准,将 Claude 连接到外部服务——为其提供在真实世界中行动的真实工具。

7.1 如何工作

在项目根目录下的 .mcp.json 中配置 MCP 服务器

{
  "mcpServers": {
    "github": {
      "type": "http",
      "url": "https://api.githubcopilot.com/mcp/",
      "headers": {
        "Authorization": "Bearer ${GITHUB_TOKEN}"
      }
    },
    "postgres": {
      "type": "stdio",
      "command": "npx -y @bytebase/dbhub --dsn \"postgresql://..."
  }
}

示例工作

你要求 Claude 总结 Sentry 锌误
      ↓
Claude 调用 Sentry MCP → 读取错误日志 → 总结它们

7.2 安装 MCP 服务器

# 添加远程 HTTP 服务器(例如 GitHub)
claude mcp add --transport http github https://api.githubcopilot.com/mcp/

# 添加本地进程服务器(例如 PostgreSQL)
claude mcp add --transport stdio db -- npx -y @bytebase/dbhub --dsn "postgresql://..."

# 列出所有已安装的服务器
claude mcp list

7.3 两种类型的 MCP 服务器

两种 MCP 服务器

8、钩子 —— 护栏和自动化

插入点 在每次工具调用前后 —— 最强大的扩展点

8.1 它解决的问题

Claude 是自主的——它会做出决策并采取行动。但但有时你需要:

  • 阻止某些操作发生(阻止 rm -rf)
  • 自动化应该始终发生的事情(每次编辑后运行 Prettier)
  • 监控 Claude 在做什么(记录每个工具调用)
  • 通知 你 Claude 需要关注时

钩子让你可以用自己的逻辑包装 Claude 的每个操作。

8.2 如何工作

钩子在 .claude/settings.json 中配置,并指向 shell 脚本

{
  "hooks": {
    "PreToolUse": [...],
    "PostToolUse": [...],
    "Notification": [...]
  }
}

每个钩子条目有:

  • matcher — 监视哪个工具("Bash", "Edit|Write", "" 表示所有)
  • type"command"(运行脚本), "http", "prompt"(询问 Claude), "agent"
  • command — shell 脚本的路径

8.3 退出代码系统

Shell 脚本使用退出代码与 Claude 通信

exit 0  →  允许(正常继续)
exit 2  →  阻止(停止操作,通过 stderr 告诉 Claude 原因)
exit 1  →  警告(继续但记录错误)

钩子 1: 阻止危险命令

文件 .claude/hooks/protect-bash.sh

#!/bin/bash
# 在 Claude 运行 Bash 命令之前运行

INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path')

# Only format JS/TS files
if [[ ! "$FILE_PATH" =~ \.(ts|tsx|js|jsx|json|css)$ ]]; then
  exit 0
fi

# Block dangerous patterns
if [[ "$INPUT" =~ \.(rm -rf|sudo rm|drop table|truncate)\ ]]; then
  echo "ERROR: Dangerous command blocked: $INPUT" 1>&2
  exit 2
fi

exit 0

配置在 settings.json

"PreToolUse": [
  {
    "matcher": "Bash",
    "hooks": [{ "type": "command", "command": ".claude/hooks/protect-bash.sh", "timeout": 10 }]
  }
]

钩子 2: 保护敏感文件

文件 .claude/hooks/protect-files.sh

#!/bin/bash
# 在 Claude 编辑或写入任何文件之前运行
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path')

# Block edits to sensitive files
if [[ "$FILE_PATH" =~ \.(env|.credentials|.pem|.key)\ ]]; then
  echo "ERROR: Cannot edit sensitive file: $FILE_PATH" 1>&2
  exit 2
fi
exit 0

配置在 settings.json

"PreToolUse": [
  {
    "matcher": "Edit|Write",
    "hooks": [{ "type": "command", "command": ".claude/hooks/protect-files.sh", "timeout": 10 }]
  }
]

钩子 3: 自动格式化代码

文件 .claude/hooks/auto-format.sh

#!/bin/bash
# 在 Claude 编辑或写入任何文件之后运行
npx prettier --write "$FILE_PATH" --log-level silent
exit 0

配置在 settings.json

"PostToolUse": [
  {
    "matcher": "Edit|Write",
    "hooks": [{ "type": "command", "command": ".claude/hooks/auto-format.sh", "async": true }]
  }
]

钩子 4: 记录所有工具调用

文件 .claude/hooks/log-tools.sh

#!/bin/bash
# 在 Claude 使用任何工具之后运行
INPUT=$(cat)
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name')
TIMESTAMP=$(date -u +"%Y-%m-%d %H:%M.%SZ")
echo "{\"timestamp\": \"$TIMESTAMP\", \"tool\": \"$TOOL_NAME\"}" >> "$CLAUDE_PROJECT_DIR/.claude/tool-usage.log"
exit 0

配置在 settings.json

"PostToolUse": [
  {
    "matcher": "",
    "hooks": [{ "type": "command", "command": ".claude/hooks/log-tools.sh", "async": true }]
  }
]

钩子 5: 桌面通知

文件 .claude/hooks/notify.sh

#!/bin/bash
# 当 Claude 等待你的输入时发送 macOS 通知
osascript -e 'display notification "Claude is waiting for your input" with title "Claude Code"'
exit 0

配置在 settings.json

"Notification": [
  {
    "matcher": "idle_prompt",
    "hooks": [{ "type": "command", "command": ".claude/hooks/notify.sh" }]
  }
]

宧完整的 settings.json

{
  "hooks": {

    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-bash.sh", "timeout": 10 }
        ]
      },
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-files.sh", "timeout": 10 }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/auto-format.sh", "async": true }
        ]
      },
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/log-tools.sh", "async": true }
        ]
      }
    ],
    "Notification": [
      {
        "matcher": "idle_prompt",
        "hooks": [
          { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/notify.sh" }
        ]
      }
    ]
  }
}

9、所有 6 个功能组合

这是完整的项目结构

claude_code_blog_demo/
│
├── CLAUDE.md                              ← 持久记忆(会话开始)
├── .mcp.json                              ← 外部工具(GitHub, PostgreSQL)
│
└── .claude/
    ├── settings.json          ← 钩子配置
    │
    ├── rules/                 ← 条件指令
    │   ├── api-rules.md         ← 为 src/api/** 加载
    │   ├── frontend-rules.md    ← 为 src/components/** 加载
    │   └── security.md            ← 始终加载
    │
    ├── skills/                ← 可重用工作流
    │   ├── explain-code/SKILL.md   ← /explain-code
    │   └── write-tests/SKILL.md    ← /write-tests
    │
    ├── agents/                ← 专家子智能体
    │   └── code-reviewer/agent.md  ← 鵚离代码审查
    │
    └── hooks/                 ← 护栏和自动化
        ├── protect-bash.sh        ← 阻止危险命令
        ├── protect-files.sh       ← 阻止敏感文件编辑
        ├── auto-format.sh         ← 编辑后格式化代码
        ├── log-tools.sh           ← 宷计所有工具使用
        └── notify.sh              ← 桌面通知

每个功能插入智能体循环的位置

会话开始
      │
      └── CLAUDE.md 加载 ──────────────── "这个项目如何工作"
      │
      ▼
Claude 规划
      │
      ├── 规则加载(如果文件匹配) ───── "这里文件特定规则"
      └── 技能可用 ───────────────── "这里可重用工作流"
      │
      ▼
Claude 行动
      │
      ├── PreToolUse 钩子运行 ────────────── "应该允许这个吗"
      │         │
      │    exit 2 → 阻止
      │    exit 0 → 允许
      │         │
      ▼         ▼
   工具执行
      │
      └── PostToolUse 钩子运行 ─────────── "自动格式化、 记录"
      │
      ▼
Claude 交付

原文链接: Disassembling AI Agent : Claude Code

汇智网翻译整理,转载请标明出处