深入了解 .claude/ 文件夹
CLAUDE.md、自定义命令、Skills、Agents 和权限的完整配置指南
关于 CLAUDE.md、自定义命令、技能、智能体和权限的完整指南,以及如何正确配置它们。
大多数 Claude Code 用户把 .claude 文件夹当成一个黑箱。他们知道它存在,也见过它出现在项目根目录。但他们从来没打开过它,更别说理解里面每个文件的作用了。
这其实是个遗憾。
.claude 文件夹是控制 Claude 在项目中行为的中枢。它存放着你的指令、自定义命令、权限规则,甚至还有跨会话的记忆。一旦你搞清楚了每个文件和目录的用途,就能把 Claude Code 配置成团队真正需要的样子。
本指南将带你完整了解这个文件夹的结构,从每天都会用到的文件,到配置一次就很少再碰的部分。
两个文件夹,不是一个
在深入之前,有件事值得提前了解:实际上存在两个 .claude 目录,而不是一个。
第一个在项目内部,第二个在你的主目录中:
项目级别的文件夹存放团队配置。你把它提交到 git,整个团队都会获得相同的规则、自定义命令和权限策略。
全局的 ~/.claude/ 文件夹则存放你的个人偏好和机器本地状态,比如会话历史和自动记忆功能。
CLAUDE.md:Claude 的使用手册
这是整个系统中最重要的文件。当你启动 Claude Code 会话时,它读取的第一个文件就是 CLAUDE.md。它会直接加载到系统提示词中,并在整个对话过程中始终遵循。
简单来说:你在 CLAUDE.md 里写什么,Claude 就会照做。
如果你告诉 Claude 永远先写测试再写实现,它会的。如果你写"不要用 console.log 来处理错误,必须使用自定义的日志模块",它每次都会遵守。
在项目根目录放置 CLAUDE.md 是最常见的做法。但你也可以在 ~/.claude/CLAUDE.md 中放一个全局配置文件,让它对所有项目生效,甚至还可以在子目录中放置文件来定义特定文件夹的规则。Claude 会读取所有这些文件并合并它们。
CLAUDE.md 里到底该写什么
大多数人的做法要么太多,要么太少。下面是真正有效的方式。
应该写:
- 构建、测试和代码检查命令(npm run test、make build 等)
- 关键的架构决策("我们使用 Turborepo 的单体仓库")
- 不太明显的坑("TypeScript 严格模式已开启,未使用的变量会报错")
- 导入规范、命名模式、错误处理风格
- 主要模块的文件和文件夹结构
不要写:
- 属于 linter 或格式化配置的内容
- 已经有链接可查的完整文档
- 解释理论的长段落
CLAUDE.md 最好保持在 200 行以内。超过这个长度会消耗太多上下文,而且 Claude 对指令的遵循度反而会下降。
下面是一个简洁但有效的示例:
# Project: Acme API
## Commands
npm run dev # Start dev server
npm run test # Run tests (Jest)
npm run lint # ESLint + Prettier check
npm run build # Production build
## Architecture
- Express REST API, Node 20
- PostgreSQL via Prisma ORM
- All handlers live in src/handlers/
- Shared types in src/types/
## Conventions
- Use zod for request validation in every handler
- Return shape is always { data, error }
- Never expose stack traces to the client
- Use the logger module, not console.log
## Watch out for
- Tests use a real local DB, not mocks. Run `npm run db:test:reset` first
- Strict TypeScript: no unused imports, ever
这大概只有 20 行。但它给了 Claude 在这个代码库中高效工作所需的一切,不需要反复确认。
CLAUDE.local.md:个人专属配置
有时候你的偏好只属于你自己,而不是整个团队。也许你喜欢用不同的测试运行器,或者想让 Claude 总是用特定模式打开文件。
在项目根目录创建 CLAUDE.local.md。Claude 会和主 CLAUDE.md 一起读取它,而且它会自动被 gitignore 掉,所以你的个人小调整永远不会进入代码仓库。
rules/ 目录:可扩展的模块化指令
CLAUDE.md 对于单个项目来说很好用。但一旦团队壮大,你就会得到一份 300 行的 CLAUDE.md,没人维护,所有人都无视它。
rules/ 目录就是为了解决这个问题。
.claude/rules/ 里面的每个 markdown 文件都会自动和你的 CLAUDE.md 一起加载。不再是一个巨无霸文件,你可以按关注点拆分指令:
.claude/rules/
├── code-style.md
├── testing.md
├── api-conventions.md
└── security.md
每个文件都保持精简、易更新。负责 API 规范的人编辑 api-conventions.md,负责测试标准的人编辑 testing.md。谁也不会踩到谁。
真正的威力来自于路径作用域规则。给规则文件加上 YAML frontmatter 块,它就只会在 Claude 处理匹配的文件时才激活:
---
paths:
- "src/api/**/*.ts"
- "src/handlers/**/*.ts"
---
# API 设计规则
- 所有 handler 返回 { data, error } 结构
- 使用 zod 进行请求体验证
- 永远不要向客户端暴露内部错误详情
Claude 编辑 React 组件时不会加载这个文件。它只在处理 src/api/ 或 src/handlers/ 内的文件时才加载。没有 paths 字段的规则会无条件加载,每次会话都加载。
当你觉得 CLAUDE.md 开始变得拥挤时,这就是正确的模式。
commands/ 目录:自定义斜杠命令
开箱即用的 Claude Code 有内置斜杠命令,比如 /help 和 /compact。而 commands/ 目录让你可以添加自己的命令。
你放进 .claude/commands/ 的每个 markdown 文件都会变成一个斜杠命令。
名为 review.md 的文件会创建 /project:review。名为 fix-issue.md 的文件会创建 /project:fix-issue。文件名就是命令名。
来一个简单的例子。创建 .claude/commands/review.md:
---
description: Merge 前审查当前分支的 diff,查找问题
---
## 待审查的变更
!`git diff --name-only main...HEAD`
## 详细 Diff
!`git diff main...HEAD`
审查以上变更,关注:
1. 代码质量问题
2. 安全漏洞
3. 缺失的测试覆盖
4. 性能问题
对每个文件给出具体、可操作的反馈。
现在在 Claude Code 里运行 /project:review,它会自动把真实的 git diff 注入到提示词中,在 Claude 看到之前。! 反引号语法可以运行 shell 命令并嵌入输出。这就是让这些命令真正有用的原因——而不只是保存的文本。
向命令传递参数
使用 $ARGUMENTS 来传递命令名后面的文本:
---
description: 调查并修复 GitHub issue
argument-hint: [issue-number]
---
查看本仓库中的 issue #$ARGUMENTS。
!`gh issue view $ARGUMENTS`
理解这个 bug,追溯到根本原因,修复它,并写一个本来能捕获它的测试。
运行 /project:fix-issue 234 会把 issue 234 的内容直接送入提示词。
个人命令 vs 项目命令
.claude/commands/ 里的项目命令会被提交、和团队共享。对于那些无论在哪个项目都想用的命令,放在 ~/.claude/commands/。这些会显示为 /user:command-name。
有用的个人命令示例:每日站会助手、按照你的规范生成 commit 信息的命令、或者快速安全扫描。
skills/ 目录:按需调用的可复用工作流
现在你已经了解了 commands 的工作方式。Skills 表面上看起来很像,但触发机制有着本质的不同。在继续之前,先把这个区别说清楚:
Skills 是一种工作流,当任务描述与 skill 的描述相匹配时,Claude 可以自动调用它,而不需要你输入斜杠命令。Commands 被动等待你的调用,而 Skills 则主动观察对话,在合适的时机自动行动。
每个 skill 都存在于自己的子目录中,包含一个 SKILL.md 文件:
.claude/skills/
├── security-review/
│ ├── SKILL.md
│ └── DETAILED_GUIDE.md
└── deploy/
├── SKILL.md
└── templates/
└── release-notes.md
SKILL.md 使用 YAML frontmatter 来描述何时使用它:
---
name: security-review
description: Comprehensive security audit. Use when reviewing code for
vulnerabilities, before deployments, or when the user mentions security.
allowed-tools: Read, Grep, Glob
---
Analyze the codebase for security vulnerabilities:
1. SQL injection and XSS risks
2. Exposed credentials or secrets
3. Insecure configurations
4. Authentication and authorization gaps
Report findings with severity ratings and specific remediation steps.
Reference @DETAILED_GUIDE.md for our security standards.
当你说出"review this PR for security issues"时,Claude 会读取描述,识别出匹配项,然后自动调用这个 skill。当然,你也可以通过 /security-review 显式调用它。
Skills 和 commands 的关键区别在于:skills 可以打包附带的支持文件。上面的 @DETAILED_GUIDE.md 引用会拉取一个与 SKILL.md 同目录下的详细文档。Commands 是单文件,Skills 则是打包好的工具包。
个人 skills 放在 ~/.claude/skills/ 目录下,会在所有项目中生效。
agents/ 目录:专业化的子智能体角色
当某个任务足够复杂,值得一个专门的专家来处理时,你可以在 .claude/agents/ 中定义一个子智能体角色。每个 agent 就是一个 markdown 文件,包含自己的系统提示词、工具权限和模型偏好:
.claude/agents/
├── code-reviewer.md
└── security-auditor.md
一个 code-reviewer.md 的例子:
---
name: code-reviewer
description: Expert code reviewer. Use PROACTIVELY when reviewing PRs,
checking for bugs, or validating implementations before merging.
model: sonnet
tools: Read, Grep, Glob
---
You are a senior code reviewer with a focus on correctness and maintainability.
When reviewing code:
- Flag bugs, not just style issues
- Suggest specific fixes, not vague improvements
- Check for edge cases and error handling gaps
- Note performance concerns only when they matter at scale
当 Claude 需要进行代码审查时,它会在独立的隔离上下文中启动这个 agent。Agent 完成工作后,会将发现压缩整理后汇报回来。这样你的主会话就不会被成千上万 token 的中间探索过程弄得一团糟。
tools 字段限制了 agent 能做什么。安全审计师只需要 Read、Grep 和 Glob。它没有理由去写文件。这种限制是刻意的,值得明确说明。
model 字段让你可以为专注任务选择更便宜、更快的模型。Haiku 在大多数只读探索任务上表现得很好。把 Sonnet 和 Opus 留给真正需要它们的复杂工作。
个人 agents 放在 ~/.claude/agents/ 目录下,会在所有项目中生效。
settings.json:权限与项目配置
.claude/ 目录下的 settings.json 控制着 Claude 允许和禁止做的事情。它定义了 Claude 可以运行哪些工具、可以读取哪些文件,以及在运行某些命令前是否需要询问。
完整的文件长这样:
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git status)",
"Bash(git diff *)",
"Read",
"Write",
"Edit"
],
"deny": [
"Bash(rm -rf *)",
"Bash(curl *)",
"Read(./.env)",
"Read(./.env.*)"
]
}
}
下面是各个部分的作用。
$schema 行启用了 VS Code 或 Cursor 中的自动补全和内联验证。这个一定要加上。
allow 列表包含无需 Claude 确认即可运行的命令。对于大多数项目来说,一个好的 allow 列表应该涵盖:
Bash(npm run *)或Bash(make *)让 Claude 自由运行脚本Bash(git *)用于只读的 git 命令- Read、Write、Edit、Glob、Grep 用于文件操作
deny 列表包含完全被阻止的命令,无论如何都不会执行。一个合理的 deny 列表会阻止:
- 破坏性的 shell 命令,如
rm -rf - 直接的网络命令,如
curl - 敏感文件,如
.env和 secrets/ 目录下的任何东西
如果某个命令既不在 allow 列表也不在 deny 列表中,Claude 会在执行前询问。这块"灰色地带"是刻意设计的。它给了你一道安全网,而不需要你事先预判每一个可能的命令。
settings.local.json:个人覆盖配置
和 CLAUDE.local.md 的理念相同。创建 .claude/settings.local.json 来存放你不希望提交到版本库的权限配置。它会自动被 gitignore。
全局 ~/.claude/ 文件夹
你平时不会直接操作这个文件夹,但了解一下里面有什么还是有用的。
~/.claude/CLAUDE.md 会在每个 Claude Code 会话中加载,不受项目限制。这里适合放你的个人编码原则、偏好的代码风格,或者任何你想让 Claude 无论在哪个仓库都能记住的事情。
~/.claude/projects/ 按项目存储会话记录和自动记忆。Claude Code 在工作过程中会自动保存笔记给自己:它发现的命令、观察到的模式、架构上的思考。这些内容会跨会话保留。你可以用 /memory 来浏览和编辑它们。
~/.claude/commands/ 和 ~/.claude/skills/ 存放的是个人命令和个人技能,在所有项目中都可用。
一般来说你不需要手动管理这些。但知道它们的存在很有用——比如当 Claude 似乎"记住"了你从未告诉过它的事情,或者当你想要清空某个项目的自动记忆、重新开始的时候。
全景图
下面是所有内容是如何组合在一起的:
your-project/
├── CLAUDE.md # 团队指令(提交到版本库)
├── CLAUDE.local.md # 个人覆盖设置(git 忽略)
│
└── .claude/
├── settings.json # 权限 + 配置(提交到版本库)
├── settings.local.json # 个人权限覆盖(git 忽略)
│
├── commands/ # 自定义斜杠命令
│ ├── review.md # → /project:review
│ ├── fix-issue.md # → /project:fix-issue
│ └── deploy.md # → /project:deploy
│
├── rules/ # 模块化指令文件
│ ├── code-style.md
│ ├── testing.md
│ └── api-conventions.md
│
├── skills/ # 自动触发的workflows
│ ├── security-review/
│ │ └── SKILL.md
│ └── deploy/
│ └── SKILL.md
│
└── agents/ # 专业化子agent角色
├── code-reviewer.md
└── security-auditor.md
~/.claude/
├── CLAUDE.md # 你的全局指令
├── settings.json # 你的全局设置
├── commands/ # 你的个人命令(所有项目可用)
├── skills/ # 你的个人技能(所有项目可用)
├── agents/ # 你的个人agents(所有项目可用)
└── projects/ # 会话历史 + 自动记忆
从零开始的实用配置
如果你从零开始,以下是一个行之有效的进阶路线。
第一步。 在 Claude Code 中运行 /init。它会通过分析你的项目生成一个 CLAUDE.md 模板。然后把它精简到核心内容。
第二步。 创建 .claude/settings.json,配置适合你技术栈的 allow/deny 规则。至少要允许运行命令、禁止读取 .env 文件。
第三步。 为你最常用的工作流创建一到两个命令。代码审查和 issue 修复是不错的起点。
第四步。 随着项目增长,CLAUDE.md 变得拥挤时,开始把指令拆分到 .claude/rules/ 文件中。有道理的话,按路径来组织作用域。
第五步。 添加一个 ~/.claude/CLAUDE.md 放你的个人偏好。比如"总是先写类型再写实现"或者"优先使用函数式模式而非类"。
这就是 95% 的项目真正需要的全部东西。Skills 和 agents 只有在你有值得打包的重复复杂工作流时才会派上用场。
核心洞见
.claude 文件夹本质上是一个协议,用来告诉 Claude:你是谁、你的项目做什么、应该遵循什么规则。你定义得越清晰,纠正 Claude 的时间就越少,它花在做有用事情上的时间就越多。
CLAUDE.md 是你杠杆效应最高的文件。先把这个搞对。其他都是优化。
从小处着手,边走边完善。把它当成项目中其他基础设施的一部分来对待——一旦配置好,每天都会持续产生回报。