第四章:.claude 目录完全指南

.claude 目录是 Claude Code 的配置中心,也是让 AI 真正"了解"你的项目的核心机制。通过精心配置这个目录,可以让 Claude Code 在每次启动时自动掌握项目规范、拥有专属工具、执行自动化钩子,并记住跨会话的重要信息。

4.1 目录结构总览

Claude Code 会加载两个层级的 .claude 目录:

层级路径作用范围适合存放
全局~/.claude/所有项目个人偏好、通用命令、全局 Memory
项目./.claude/当前项目项目规范、团队命令、项目 Hooks

完整目录结构

text
~/.claude/                      # 全局配置
├── settings.json               # 全局设置
├── CLAUDE.md                   # 全局说明(适用所有项目)
├── commands/                   # 全局自定义斜杠命令
│   └── my-command.md
├── memory/                     # 全局 Memory 存储
│   └── MEMORY.md               # Memory 索引
└── skills/                     # 全局 Skills

.claude/                        # 项目级配置(提交到 Git)
├── settings.json               # 项目设置(覆盖全局)
├── commands/                   # 项目级自定义命令
│   ├── deploy.md
│   └── review-pr.md
├── rules/                      # 规则文件
│   └── coding-style.md
└── skills/                     # 项目级 Skills

加载优先级

当全局与项目级配置存在冲突时,项目级优先。加载顺序:

  1. 全局 ~/.claude/settings.json
  2. 项目 .claude/settings.json(覆盖全局同名字段)
  3. 全局 CLAUDE.md(注入系统提示)
  4. 项目 CLAUDE.md(追加到系统提示)

4.2 CLAUDE.md

CLAUDE.md 是 Claude Code 的"项目说明书",每次启动时自动注入系统提示。写得越详细,Claude 对项目的理解越深入,输出质量越稳定。

推荐结构

markdown
# 项目名称

一句话描述项目用途。

## 技术栈
- 前端:React 18 + TypeScript + Vite
- 后端:NestJS + PostgreSQL + Prisma
- 部署:Docker + Kubernetes

## 目录结构
- apps/web/ — 前端应用
- apps/api/ — 后端服务
- packages/shared/ — 共享类型和工具

## 开发规范
- 使用 pnpm 管理依赖,禁止使用 npm/yarn
- 所有新功能必须附带测试,覆盖率不低于 80%
- API 接口遵循 RESTful 规范,错误响应使用统一格式
- 提交前运行 pnpm lint 和 pnpm test

## 常用命令
- `pnpm dev` — 启动开发服务器
- `pnpm build` — 构建生产版本
- `pnpm test` — 运行所有测试

## 禁止操作
- 不要修改 prisma/migrations/ 下的文件
- 不要直接操作生产数据库
- 不要将 .env.local 提交到 Git

多层 CLAUDE.md 继承

可以在子目录中放置 CLAUDE.md,进入该目录时会额外加载,实现模块级说明:

text
project/
├── CLAUDE.md           # 全局项目说明
├── apps/
│   ├── web/
│   │   └── CLAUDE.md   # 前端专属说明(React 组件规范等)
│   └── api/
│       └── CLAUDE.md   # 后端专属说明(API 设计规范等)
💡
快速生成 CLAUDE.md

在项目目录中运行 /init 命令,Claude Code 会自动分析项目结构并生成初始 CLAUDE.md,再手动补充规范细节即可。

4.3 settings.json

settings.json 控制 Claude Code 的运行时行为。以下是完整配置项说明:

json
{
  // 默认使用的模型
  "model": "claude-sonnet-4-6",

  // 权限配置
  "permissions": {
    "allow": [
      "Read(**)",           // 允许读取所有文件
      "Write(src/**)",      // 只允许写入 src 目录
      "Bash(npm run *)",    // 允许运行 npm 脚本
      "Bash(git *)"         // 允许 git 操作
    ],
    "deny": [
      "Bash(git push *)",   // 禁止推送
      "Bash(rm -rf *)"      // 禁止强制删除
    ]
  },

  // Hooks 配置(见 4.5 节)
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{ "type": "command", "command": "echo '执行命令:$CLAUDE_TOOL_INPUT'" }]
      }
    ],
    "PostToolUse": [],
    "Notification": [],
    "Stop": []
  },

  // MCP 服务器(见第五章)
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_TOKEN": "$GITHUB_TOKEN" }
    }
  },

  // 环境变量(注入到所有 Bash 执行环境)
  "env": {
    "NODE_ENV": "development"
  },

  // 是否在启动时自动显示项目说明
  "includeCoAuthoredBy": true
}

常用配置场景

场景配置方式
固定使用 Opus 模型"model": "claude-opus-4-6"
禁止所有写操作"deny": ["Write(**)", "Edit(**)", "MultiEdit(**)", "Bash(*)"]
只允许读取特定目录"allow": ["Read(src/**)", "Read(docs/**)", "LS(**)", "Glob(**)", "Grep(**)" ]
注入 API Key 到 Bash"env": {"STRIPE_KEY": "$STRIPE_SECRET_KEY"}

4.4 自定义斜杠命令

.claude/commands/ 目录下创建 Markdown 文件,即可定义专属的斜杠命令。命令在 Claude Code 中以 /命令名 的方式调用。

文件命名规则

文件名即命令名:deploy.md/deploy,支持子目录嵌套:git/commit.md/git:commit

基本示例:代码审查命令

markdown
# .claude/commands/review.md

Review the staged git changes for:
1. Logic errors and potential bugs
2. Security vulnerabilities (XSS, SQL injection, hardcoded secrets)
3. Performance issues
4. Adherence to project coding standards in CLAUDE.md

Output format:
- Use severity levels: 🔴 Critical / 🟡 Warning / 🟢 Suggestion
- Group findings by file
- End with an overall assessment (Approve / Request Changes)

带参数的命令

使用 $ARGUMENTS 接收用户输入的参数:

markdown
# .claude/commands/new-feature.md

Create a new feature module for: $ARGUMENTS

Steps:
1. Create the directory structure under src/modules/$ARGUMENTS/
2. Generate: controller, service, dto, module files
3. Register the module in app.module.ts
4. Create a basic test file
5. Add the route to the API documentation

Follow the existing patterns in src/modules/user/ as reference.

调用方式:

text
/new-feature payment

实用命令模板集

命令文件用途
commit.md分析变更并生成规范的 Git commit 信息
review.md审查 staged 代码变更
test.md为当前文件生成单元测试
docs.md生成函数/模块的 JSDoc/注释
refactor.md重构当前文件,输出改进建议
pr.md生成 Pull Request 描述模板

4.5 Hooks 系统

Hooks 是在 Claude Code 特定事件触发时自动执行的 shell 脚本。它们由 Claude Code 运行时执行,不占用 AI 的上下文,可用于日志记录、自动化检查、通知等场景。

事件类型

事件触发时机典型用途
PreToolUse工具调用前审计日志、拦截危险操作、输入校验
PostToolUse工具调用后格式化输出、自动测试、结果校验
NotificationClaude 发送通知时桌面推送、Slack 通知
StopClaude 完成响应时自动提交、清理临时文件
SubagentStop子 Agent 完成时汇总子任务结果

配置格式

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write $CLAUDE_TOOL_OUTPUT_PATH 2>/dev/null || true"
          }
        ]
      }
    ]
  }
}

Hook 环境变量

变量说明
$CLAUDE_TOOL_NAME当前工具名(如 BashWrite
$CLAUDE_TOOL_INPUT工具输入内容(JSON 字符串)
$CLAUDE_TOOL_OUTPUT工具输出内容(PostToolUse 可用)
$CLAUDE_TOOL_OUTPUT_PATHWrite/Edit 操作的目标文件路径
$CLAUDE_SESSION_ID当前会话 ID

实用 Hook 案例

案例一:Write 后自动运行 Prettier

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit|MultiEdit",
        "hooks": [{
          "type": "command",
          "command": "npx prettier --write \"$CLAUDE_TOOL_OUTPUT_PATH\" 2>/dev/null || true"
        }]
      }
    ]
  }
}

案例二:Stop 时发送桌面通知(macOS)

json
{
  "hooks": {
    "Stop": [
      {
        "hooks": [{
          "type": "command",
          "command": "osascript -e 'display notification \"Claude 已完成任务\" with title \"Claude Code\"'"
        }]
      }
    ]
  }
}

案例三:PreToolUse 拦截危险 Bash 命令

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{
          "type": "command",
          "command": "echo \"$CLAUDE_TOOL_INPUT\" | grep -qE '(rm -rf|DROP TABLE|truncate)' && exit 1 || exit 0"
        }]
      }
    ]
  }
}
⚠️
Hook 退出码规则

PreToolUse Hook 退出码为非 0 时,Claude Code 会阻止该工具调用执行,并将 stderr 输出作为错误信息反馈给 Claude。其他事件的 Hook 退出码不影响执行流程。

4.6 Skills

Skills 是更高级的自定义命令形式,支持定义触发条件(TRIGGER)、使用指南和复杂的多步骤工作流。与斜杠命令的区别在于:斜杠命令由用户手动调用,Skills 可以在特定代码模式或用户意图匹配时自动推荐或触发

Skill 文件格式

markdown
# .claude/skills/api-test.md
---
name: api-test
description: 为 REST API 控制器生成完整的集成测试套件
type: skill
---

# API 集成测试生成器

## TRIGGER

当用户:
- 要求为 Controller 或 Router 文件生成测试
- 提及 "API 测试"、"集成测试"、"supertest"
- 代码中包含 `@Controller`、`router.get/post/put/delete`

## 使用指南

生成测试套件时,遵循以下规范:

1. 使用 supertest + jest 框架
2. 每个端点至少覆盖:成功响应、参数缺失、未授权三种场景
3. 测试数据库使用内存 SQLite(不依赖真实数据库)
4. 测试文件放在 `__tests__/` 目录,命名为 `*.integration.test.ts`

## 示例输出结构

```typescript
describe('UserController (integration)', () => {
  describe('GET /users/:id', () => {
    it('should return user when id is valid', ...)
    it('should return 404 when user not found', ...)
    it('should return 401 when not authenticated', ...)
  })
})
```

Skills vs 斜杠命令

维度斜杠命令Skills
触发方式用户手动输入 /命令名自动匹配或手动触发
文件位置commands/skills/(或 ~/.claude/skills/
格式要求纯 Markdown 内容含 frontmatter 元数据
适合场景固定工作流、团队共享命令上下文感知的专家能力

4.7 Rules

Rules 是更细粒度的行为约束文件,存放在 .claude/rules/ 目录。与 CLAUDE.md 的区别在于:CLAUDE.md 是整体项目描述,Rules 是针对特定场景的专项规则,可以按需组合加载。

文件格式示例

markdown
# .claude/rules/typescript-style.md
---
description: TypeScript 代码风格规范,适用于所有 .ts/.tsx 文件
---

## TypeScript 编码规范

- 所有函数必须有明确的返回类型注解
- 禁止使用 `any` 类型,使用 `unknown` 替代
- 接口名以 `I` 前缀开头(如 `IUserService`)
- 枚举使用 `const enum` 替代普通 `enum`
- 异步函数统一使用 `async/await`,禁止混用 Promise.then

## 文件命名

- 组件文件:PascalCase(UserCard.tsx)
- 工具文件:camelCase(formatDate.ts)
- 类型文件:camelCase + `.types.ts`(user.types.ts)
markdown
# .claude/rules/no-console.md
---
description: 禁止在生产代码中使用 console.log
---

不要在 src/ 目录下的任何文件中使用 `console.log`、`console.warn`、`console.error`。

使用项目统一的 logger 工具:
```typescript
import { logger } from '@/utils/logger'
logger.info('message', { context: 'ServiceName' })
```

Rules vs CLAUDE.md

维度CLAUDE.mdRules
加载时机每次启动自动加载按需或自动加载
内容粒度项目整体描述单一专项规则
适合存放架构说明、禁止操作、常用命令代码风格、安全约束、框架规范
维护成本整体维护可单独启用/禁用某条规则

4.8 Memory 系统

Memory 系统让 Claude Code 在不同会话之间保留重要信息。Claude 会在适当时机主动将值得记忆的内容写入 memory/ 目录,并在新会话开始时自动加载。

Memory 类型

类型用途何时保存
user用户角色、技能水平、偏好了解用户背景时
project项目进度、决策背景、重要约定项目状态发生变化时
feedback用户的操作偏好、不喜欢的行为用户给出明确反馈时
reference外部资源位置(Linear 项目、Figma 链接等)发现重要外部资源时

Memory 文件结构

markdown
# memory/feedback_commit_style.md
---
name: Git 提交规范
description: 用户要求每个功能点独立 commit,不可批量合并
type: feedback
---

每个独立功能点或页面必须单独创建 commit,不允许将多个无关变更合并为一次提交。

**Why:** 用户希望保持清晰的 Git 历史,便于 Code Review 和回滚。

**How to apply:** 完成每个小任务后立即提交,不等待积累。

MEMORY.md 索引

memory/MEMORY.md 是所有 Memory 文件的索引,每次会话自动加载。格式为简洁的一行描述:

markdown
# Memory Index

- [Git 提交规范](feedback_commit_style.md) — 每个功能独立 commit,不可批量合并
- [项目概览](project_overview.md) — React + NestJS 全栈应用,使用 pnpm monorepo
- [用户背景](user_profile.md) — 5 年 Node.js 经验,对 React 较新
ℹ️
主动让 Claude 记忆

直接告诉 Claude:"记住,我们项目不使用 Redux,状态管理统一用 Zustand",Claude 会自动将其写入 Memory 文件,下次会话直接生效,无需重复说明。

Memory 的边界

以下内容不应存入 Memory(已有更好的持久化方式):

  • 代码规范、架构说明 → 放入 CLAUDE.md
  • 当前任务的进度 → 使用 TodoWrite 工具
  • 调试解决方案 → 写入代码注释或 commit message
  • Git 历史信息 → 直接 git log 查询