如果你是Claude Code的用户,可能曾疑惑CLAUDE.md和.claude/settings.json这两个文件到底该放什么配置。它们看起来相似,都用于配置Claude的行为,但实际上控制着截然不同的功能。混淆它们会导致令人沮丧的结果。以下是它们的完整解析。
心智模型
CLAUDE.md = Claude的大脑
settings.json = Claude的权限
CLAUDE.md是自然语言文件,你可以在其中编写指令、提供上下文、设定限制和偏好。Claude会像同事阅读简报文档一样理解它。
settings.json是机器配置文件,它控制Claude被允许使用哪些工具、可以运行哪些命令,以及被阻止执行哪些操作。
CLAUDE.md控制什么
CLAUDE.md中应包含以下内容:
- 项目上下文:例如,“这是一个使用Prisma + PostgreSQL的Next.js 14应用。”
- 架构决策:例如,“所有API路由都在/app/api/中;数据库模型在/prisma/schema.prisma中;永远不要创建新的/pages/路由,我们使用App Router。”
- 代码风格:例如,“TypeScript严格模式始终开启;优先使用async/await而非.then()链;所有输入验证使用Zod。”
- 响应格式:例如,“先给出代码,后解释;跳过明显的注释;建议修复时显示修改前和修改后。”
- 技术栈和架构细节
- 编码约定和风格偏好
- 业务领域上下文(应用功能、用户群体)
- 响应格式偏好
- “总是/从不”执行的指令
- 常见任务的运行命令
settings.json控制什么
settings.json的结构通常如下,用于定义权限:
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git add:*)",
"Bash(git commit:*)",
"Bash(cat:*)",
"Bash(grep:*)",
"Bash(find:*)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(git push:*)",
"Bash(curl:*)",
"WebFetch"
]
}
}settings.json中应包含以下内容:
- Claude无需询问即可运行的Bash命令
- 完全阻止的工具
- 可信操作的自动批准设置
- 模型偏好(如果你是Pro用户)
关键区别:CLAUDE.md是读取,settings.json是强制执行
Claude可能会选择忽略CLAUDE.md中的某些内容,如果它认为自己更懂(虽然不应该,但理论上可以)。而settings.json则是一道“硬性围栏”——Claude根本无法执行deny列表中禁止的命令。
这就是为什么:
- 风格偏好放在CLAUDE.md中——你希望Claude理解并应用它们,而不是被机械地阻止。
- 安全限制放在settings.json中——你希望得到实际的强制执行,而不是建议。
实际案例:防止意外部署
错误做法——将其放入CLAUDE.md:
# 重要git push
永远不要运行
这种方法,Claude可能会在某些情况下“忘记”或“决定”忽略这条指令。
正确做法——将其放入settings.json:
"deny": ["Bash(git push:*)"]
这会确保Claude在任何情况下都无法执行git push命令,提供真正的安全保障。