第四章:.claude 目录完全指南
.claude 目录是 Claude Code 的配置中心,也是让 AI 真正"了解"你的项目的核心机制。通过精心配置这个目录,可以让 Claude Code 在每次启动时自动掌握项目规范、拥有专属工具、执行自动化钩子,并记住跨会话的重要信息。
4.1 目录结构总览
Claude Code 会加载两个层级的 .claude 目录:
| 层级 | 路径 | 作用范围 | 适合存放 |
|---|---|---|---|
| 全局 | ~/.claude/ | 所有项目 | 个人偏好、通用命令、全局 Memory |
| 项目 | ./.claude/ | 当前项目 | 项目规范、团队命令、项目 Hooks |
完整目录结构
~/.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
加载优先级
当全局与项目级配置存在冲突时,项目级优先。加载顺序:
- 全局
~/.claude/settings.json - 项目
.claude/settings.json(覆盖全局同名字段) - 全局
CLAUDE.md(注入系统提示) - 项目
CLAUDE.md(追加到系统提示)
4.2 CLAUDE.md
CLAUDE.md 是 Claude Code 的"项目说明书",每次启动时自动注入系统提示。写得越详细,Claude 对项目的理解越深入,输出质量越稳定。
推荐结构
# 项目名称
一句话描述项目用途。
## 技术栈
- 前端: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,进入该目录时会额外加载,实现模块级说明:
project/
├── CLAUDE.md # 全局项目说明
├── apps/
│ ├── web/
│ │ └── CLAUDE.md # 前端专属说明(React 组件规范等)
│ └── api/
│ └── CLAUDE.md # 后端专属说明(API 设计规范等)
在项目目录中运行 /init 命令,Claude Code 会自动分析项目结构并生成初始 CLAUDE.md,再手动补充规范细节即可。
4.3 settings.json
settings.json 控制 Claude Code 的运行时行为。以下是完整配置项说明:
{
// 默认使用的模型
"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。
基本示例:代码审查命令
# .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 接收用户输入的参数:
# .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.
调用方式:
/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 | 工具调用后 | 格式化输出、自动测试、结果校验 |
Notification | Claude 发送通知时 | 桌面推送、Slack 通知 |
Stop | Claude 完成响应时 | 自动提交、清理临时文件 |
SubagentStop | 子 Agent 完成时 | 汇总子任务结果 |
配置格式
{
"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 | 当前工具名(如 Bash、Write) |
$CLAUDE_TOOL_INPUT | 工具输入内容(JSON 字符串) |
$CLAUDE_TOOL_OUTPUT | 工具输出内容(PostToolUse 可用) |
$CLAUDE_TOOL_OUTPUT_PATH | Write/Edit 操作的目标文件路径 |
$CLAUDE_SESSION_ID | 当前会话 ID |
实用 Hook 案例
案例一:Write 后自动运行 Prettier
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit|MultiEdit",
"hooks": [{
"type": "command",
"command": "npx prettier --write \"$CLAUDE_TOOL_OUTPUT_PATH\" 2>/dev/null || true"
}]
}
]
}
}
案例二:Stop 时发送桌面通知(macOS)
{
"hooks": {
"Stop": [
{
"hooks": [{
"type": "command",
"command": "osascript -e 'display notification \"Claude 已完成任务\" with title \"Claude Code\"'"
}]
}
]
}
}
案例三:PreToolUse 拦截危险 Bash 命令
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [{
"type": "command",
"command": "echo \"$CLAUDE_TOOL_INPUT\" | grep -qE '(rm -rf|DROP TABLE|truncate)' && exit 1 || exit 0"
}]
}
]
}
}
PreToolUse Hook 退出码为非 0 时,Claude Code 会阻止该工具调用执行,并将 stderr 输出作为错误信息反馈给 Claude。其他事件的 Hook 退出码不影响执行流程。
4.6 Skills
Skills 是更高级的自定义命令形式,支持定义触发条件(TRIGGER)、使用指南和复杂的多步骤工作流。与斜杠命令的区别在于:斜杠命令由用户手动调用,Skills 可以在特定代码模式或用户意图匹配时自动推荐或触发。
Skill 文件格式
# .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 是针对特定场景的专项规则,可以按需组合加载。
文件格式示例
# .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)
# .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.md | Rules |
|---|---|---|
| 加载时机 | 每次启动自动加载 | 按需或自动加载 |
| 内容粒度 | 项目整体描述 | 单一专项规则 |
| 适合存放 | 架构说明、禁止操作、常用命令 | 代码风格、安全约束、框架规范 |
| 维护成本 | 整体维护 | 可单独启用/禁用某条规则 |
4.8 Memory 系统
Memory 系统让 Claude Code 在不同会话之间保留重要信息。Claude 会在适当时机主动将值得记忆的内容写入 memory/ 目录,并在新会话开始时自动加载。
Memory 类型
| 类型 | 用途 | 何时保存 |
|---|---|---|
user | 用户角色、技能水平、偏好 | 了解用户背景时 |
project | 项目进度、决策背景、重要约定 | 项目状态发生变化时 |
feedback | 用户的操作偏好、不喜欢的行为 | 用户给出明确反馈时 |
reference | 外部资源位置(Linear 项目、Figma 链接等) | 发现重要外部资源时 |
Memory 文件结构
# 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 文件的索引,每次会话自动加载。格式为简洁的一行描述:
# Memory Index
- [Git 提交规范](feedback_commit_style.md) — 每个功能独立 commit,不可批量合并
- [项目概览](project_overview.md) — React + NestJS 全栈应用,使用 pnpm monorepo
- [用户背景](user_profile.md) — 5 年 Node.js 经验,对 React 较新
直接告诉 Claude:"记住,我们项目不使用 Redux,状态管理统一用 Zustand",Claude 会自动将其写入 Memory 文件,下次会话直接生效,无需重复说明。
Memory 的边界
以下内容不应存入 Memory(已有更好的持久化方式):
- 代码规范、架构说明 → 放入
CLAUDE.md - 当前任务的进度 → 使用
TodoWrite工具 - 调试解决方案 → 写入代码注释或 commit message
- Git 历史信息 → 直接
git log查询