News

Claude Code: CLAUDE.md与settings.json如何分工?

Claude Code: CLAUDE.md与settings.json如何分工?

如果你是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命令,提供真正的安全保障。

↗ 阅读原文