很多人以为自己在“配置 Claude Code”,其实只是写了一个
CLAUDE.md。这在早期够用,但到了真正的工程实战阶段,已经远远不够了。
最近重新梳理 Claude Code 官方文档后,我对它的配置体系有了一个更明确的判断:
Claude Code 的重点已经不是“某一个配置文件怎么写”,而是“不同层级的配置应该各放在哪”。
如果这个边界没想清楚,就会反复出现几类问题:
- 项目规范写进个人配置,切项目就互相污染;
- 团队规则写进本地配置,别人根本复现不了;
- 明明只是想复用一个工作流,却还在用过时的 alias 思路;
- 安全底线没放到高优先级作用域,结果谁都能覆盖;
CLAUDE.md越写越长,最后既不稳定,也不好维护。
所以这篇文章不再把重点放在“单独讲 CLAUDE.md”,而是从工程角度讲透 5 个问题:
- Claude Code 现在到底有哪些配置层
CLAUDE.md、settings.json、Skills、MCP 各自负责什么- 团队共享规则和个人偏好应该如何分层
- 哪些旧习惯已经不适合现在的 Claude Code
- Java 后端团队落地时,一套更稳的目录结构该怎么设计
如果你现在还把 Claude Code 的配置理解成“写个项目说明 + 配几个命令”,这篇文章会帮你把整个模型重新理顺。
一、先纠正一个最常见的误区:Claude Code 已经不是 .clauderc 时代了
先讲结论:
现在 Claude Code 的官方配置主轴,是
settings.json + scoped config + skills + MCP,而不是一个包打天下的.clauderc。
这点非常重要,因为很多中文资料还停留在“项目里放一个 .clauderc,再写个 CLAUDE.md”的阶段。这样讲并不是完全错误,但已经不能准确反映今天 Claude Code 的配置体系。
按照现在更清晰的官方模型,配置至少分成下面几类:
CLAUDE.md:给 Claude 的长期项目说明、约束和工作方式settings.json:权限、默认模式、环境变量、Hooks 等系统行为skills/:可复用的工作流与能力封装agents/:可委派的专职子 Agent- MCP 配置:让 Claude 能接入外部系统
也就是说,现在真正有价值的问题已经从:
- “配置文件怎么写?”
变成了:
- “什么东西应该写进哪一层?”
这就是配置工程化的起点。
二、先理解作用域:Claude Code 不是只有“全局”和“项目”两层
很多人配置总出问题,不是因为不会写 JSON,而是因为对 scope 没概念。
Claude Code 现在的配置作用域,可以概括成四层:
| 作用域 | 典型位置 | 谁会受到影响 | 是否共享 |
|---|---|---|---|
| Managed | 系统托管 / MDM / 受管控配置 | 机器上的所有用户 | 是 |
| User | ~/.claude/ |
你自己,跨所有项目 | 否 |
| Project | .claude/ / 项目根配置 |
这个仓库的所有协作者 | 是 |
| Local | .claude/settings.local.json |
你自己在这个仓库里 | 否 |
这四层不是摆设,它直接决定一条配置该放哪里。
1)Managed:安全底线和企业级强制策略
这一层最像“组织规则”。
适合放:
- 绝对不能访问的敏感路径
- 绝对不能放开的危险命令
- 组织级合规要求
- 必须统一的策略约束
如果某条规则是“任何人在任何项目里都不能绕过”,那它就不该放在 User,更不该放在 Local。
2)User:你的个人长期偏好
适合放:
- 你希望在所有项目里都保持一致的偏好
- 你自己的工具链习惯
- 你个人常用的全局技能
- 与你机器相关、但不适合共享给团队的设置
这一层的关键词是:长期、个人、跨项目。
3)Project:团队共同遵守的工程规则
这是最容易产生价值的一层。
适合放:
- 团队共享的 permissions / hooks / MCP servers
- 项目级共享技能
- 团队统一工作流
- 仓库特有的工程约束
凡是“只要在这个仓库里工作,大家都应该遵守”的东西,优先考虑 Project。
4)Local:个人在某个项目里的实验和覆盖
适合放:
- 你的本机特有路径和临时实验配置
- 还没准备共享给团队的试验性规则
- 某个仓库里的个人覆盖设置
Local 的意义不是“随便乱改”,而是让“我的临时需要”和“团队共享规则”解耦。
三、理解优先级,比理解文件路径更重要
配置分层之后,还要理解它们怎么相互覆盖。
Claude Code 当前可以概括为这样的优先级顺序:
- Managed(最高,不能被覆盖)
- 命令行参数
- Local
- Project
- User
这个顺序非常有工程意义。
一个典型例子
假设:
- 你在 User 层允许某个 Bash 命令;
- 但项目在 Project 层把它禁掉了;
- 那最终结果就是:项目规则生效,命令被禁用。
再比如:
- 你在 Project 层希望默认走 normal mode;
- 但你这次用命令行显式指定了 plan mode;
- 那这次 session 里,命令行覆盖项目默认值。
这意味着一个非常重要的实践原则:
安全底线放高优先级,团队协作规则放 Project,个人习惯放 User,实验性调整放 Local。
只要这个原则不乱,配置体系通常就不会太乱。
四、CLAUDE.md 的职责:它不是“万能配置文件”,而是长期行为说明书
很多人把 CLAUDE.md 写成两种极端:
- 要么像 README,写了一堆给人看的项目介绍;
- 要么像垃圾场,把所有想法都往里堆。
这两种都不对。
CLAUDE.md 最适合放什么
我更推荐把它理解成:
Claude 在这个项目里工作的长期说明书。
它最适合承载的是:
- 项目目标和上下文
- 技术栈与基础架构约束
- 代码规范和团队共识
- 验收标准
- 禁止事项
- 常见工作流原则
这些内容有个共同点:
- 相对稳定
- 与具体一次会话无关
- 需要 Claude 在每次进入项目时都知道
CLAUDE.md 不适合放什么
不适合放:
- 你的个人 API key
- 本机路径差异
- 会频繁变化的实验性规则
- 复杂权限白名单
- 需要结构化校验的系统配置
- 临时任务清单
这些东西更应该进 settings.json、Local 配置或其他系统文件,而不是把 CLAUDE.md 变成一个万能收纳箱。
一个更准确的判断方法
如果某条信息回答的是:
- “这个项目是什么、该遵守什么原则” → 大概率写进
CLAUDE.md - “Claude 运行时该怎么表现、允许做什么” → 大概率写进 settings
这两个问题分清楚,CLAUDE.md 的边界就清楚了。
五、settings.json 的职责:系统行为、权限和默认模式
如果说 CLAUDE.md 解决的是“认知边界”,那 settings.json 解决的就是“运行边界”。
它更像 Claude Code 的系统控制面。
适合放在 settings.json 里的内容
典型包括:
- permissions allow / deny
- 默认 permission mode
- 环境变量
- hooks
- 一些系统级行为设置
- 团队共享或本地覆盖的运行策略
举个最常见的例子:
- “所有 public API 必须有幂等设计” → 这是项目原则,写
CLAUDE.md - “禁止读取
.env,禁止 Bash 执行curl *” → 这是运行权限,写 settings
为什么这层特别重要
因为很多团队会犯一个错误:
把“应该由系统控制的行为”,写成“提示词里的原则”。
例如你在 CLAUDE.md 里写:
- 不要读 secrets
- 不要执行危险命令
这当然有帮助,但这仍然偏“软约束”。
如果这件事真的重要,更稳的做法应该是:
- 原则写进
CLAUDE.md - 真正的边界写进
permissions.deny
也就是:
认知上提醒一次,系统上再拦一次。
这才是工程化,而不是只靠模型“自觉”。
六、Skills 的职责:别再把“复用工作流”理解成 alias 了
这几年一个很容易过时的认知是:
“我给 Claude 配几个快捷命令 / aliases,不就等于工作流复用了?”
现在这个理解已经明显不够了。
根据官方最新方向,自定义命令已经逐步并入 Skills 体系。旧的命令方式可能仍然兼容,但真正更有扩展性的路径,是 Skill。
Skill 比“命令别名”强在哪
一个 Skill 不只是把一句 prompt 起个名字,它可以有:
SKILL.md主说明- supporting files
- 示例输出
- 脚本
- 更清晰的适用场景描述
- 被 Claude 自动发现和自动调用的能力
换句话说:
Skill 更像“可复用能力模块”,而不是“命令缩写”。
哪些东西适合写成 Skill
例如:
/review-pr/write-java-test/analyze-slow-sql/summarize-module/prepare-release-note
这些都不只是“一句 prompt”,而是一个相对稳定、可多次复用、最好还能携带模板与参考资料的工作流。
Skill 最适合解决什么问题
它解决的是:
- 团队如何共享高质量提示工作流
- 一个复杂流程如何重复调用
- Claude 如何在合适的时候自动加载特定能力
所以今天更推荐的思路,不是:
- “我在配置里做几个 alias”
而是:
- “我把可复用工作流沉淀成 Skill”
这两者在工程可维护性上差很多。
七、MCP 的职责:连接外部世界,而不是替代项目规范
MCP 也经常被误放位置。
有的人把 MCP 配得很热闹,结果 Claude 还是总做错事;有的人把所有项目上下文都想塞给 MCP,结果配置复杂度越来越高。
原因通常是:没有把 MCP 的职责想清楚。
MCP 更适合回答的问题是:
- Claude 可以访问哪些外部系统?
- 如何读取 Jira / GitHub / 文档系统 / 内部平台?
- 如何把结果回写到外部系统?
它不适合替代的是:
- 项目规范
- 团队编码共识
- 运行权限边界
所以我更推荐这样理解:
CLAUDE.md:项目原则与上下文- settings:运行策略与权限边界
- Skills:可复用工作流
- MCP:外部系统连接层
这四层各司其职,系统才稳定。
八、一个最实用的分层原则:四类信息,分别放到四个地方
如果你觉得前面还是抽象,我给你一个非常落地的分法。
第一类:长期规则 → CLAUDE.md
例如:
- 代码风格
- 架构边界
- 事务规范
- API 约定
- 测试要求
- 禁止事项
第二类:运行行为 → settings.json
例如:
- 权限 allow / deny
- 默认进入 plan mode
- hooks
- 环境变量
- 运行时限制
第三类:复用流程 → Skills
例如:
- PR 审查流程
- 故障分析流程
- 单测生成流程
- 发布说明整理流程
第四类:外部接入 → MCP
例如:
- GitHub
- Jira
- Confluence / Notion
- 日志平台
- 监控平台
这套分法最大的优点是:
- 以后团队知道该往哪里加东西
- 你不会把所有需求都堆到同一个文件
- 配置可以持续增长,但不会迅速失控
九、Java 后端团队的一套推荐目录结构
如果你是 Java 后端团队,我更推荐从下面这样的结构开始:
project-root/
├── CLAUDE.md
├── .claude/
│ ├── settings.json
│ ├── settings.local.json # 本地覆盖,不提交
│ ├── skills/
│ │ ├── review-java-pr/
│ │ │ └── SKILL.md
│ │ ├── write-service-tests/
│ │ │ └── SKILL.md
│ │ └── trace-transaction/
│ │ └── SKILL.md
│ └── agents/
│ ├── code-reviewer.md
│ └── debugger.md
├── .mcp.json
├── docs/
│ ├── api-standards.md
│ ├── error-codes.md
│ └── database-conventions.md
└── src/
这个结构为什么更稳
CLAUDE.md
放核心规则:
- 本项目使用 Java 17 / Spring Boot 3
- 事务在 Service 层管理
- Controller 禁止承载业务逻辑
- 日志禁止打印敏感字段
- 核心链路必须补单测
.claude/settings.json
放仓库级运行规则:
- 禁止读取
.env - 禁止危险 Bash 模式
- 默认 plan mode
- 文件改动后触发轻量检查
.claude/skills/
放团队高频可复用工作流:
- 审查 Java PR
- 生成 Service 层单元测试
- 排查慢 SQL
- 检查异常处理是否规范
.mcp.json
放项目级外部连接:
- GitHub / issue 系统 / 文档系统
- 团队内共享的工具接入
这样以后团队里有人加一条新规则,不会再陷入“这条到底该写到哪”的混乱。
十、最容易犯的 6 个错误
错误一:把 CLAUDE.md 写成 README
README 是给人快速理解项目的,CLAUDE.md 是给 Claude 执行工作时长期遵守的。
两者可以相关,但不应该混为一谈。
错误二:把项目规范写进 User 层
结果就是你切项目以后,Claude 还带着上一个仓库的习惯。
项目规范应该尽量沉淀在仓库里,而不是个人全局配置里。
错误三:把安全底线只写在 prompt 里
“不要读 secrets”如果真的重要,就应该进入 permissions deny,而不是只靠提醒。
错误四:把 Skill 当成 alias
这样你会低估它的能力,也会让工作流沉淀始终停留在低水平复用阶段。
错误五:所有东西都往 CLAUDE.md 里堆
结果通常是:
- 越来越长
- 越来越难维护
- 重要规则淹没在细节里
错误六:团队共享规则和个人实验不分层
本来只是你本机的一个试验性 Hook,结果直接进了项目配置;或者反过来,本该全团队遵守的规则,却只放在你自己的 Local。
这两种都很常见,也都很伤协作效率。
十一、一个简单但高价值的配置审计清单
如果你准备整理团队的 Claude Code 配置,可以按下面这个顺序审一次:
1)CLAUDE.md 审什么
- 项目目标是否清楚
- 技术栈是否准确
- 核心编码规范是否可执行
- 验收标准是否明确
- 禁止事项是否具体
2)Project settings 审什么
- 是否有真正该共享的权限规则
- 是否把团队工作流接成了 hooks / 默认模式
- 是否有不该共享的个人路径、个人习惯混进来
3)Local settings 审什么
- 是否只是个人覆盖与实验性配置
- 是否不小心承担了团队应共享的规则
4)Skills 审什么
- 哪些高频动作已经值得沉淀成 skill
- skill 的说明是否足够具体
- 是否能被团队理解和复用
5)MCP 审什么
- 接入的外部系统是否真的高频有用
- 权限是否合理
- 是否把不该放在 MCP 的项目规则错误塞进去
只要能把这 5 步跑一遍,很多配置混乱问题都会明显减少。
十二、结语:真正成熟的配置,不是文件更多,而是边界更清楚
很多人一听“配置工程化”,第一反应是:
- 会不会更复杂?
- 会不会又多出很多文件?
但真正成熟的配置工程化,从来不是“文件数量变多”,而是:
每种信息终于被放到了它该在的位置。
这会带来几个非常实际的好处:
- Claude 在不同项目间不再串味
- 团队规则终于能稳定共享
- 安全边界不再只靠提示词维持
- 高价值工作流可以沉淀成 Skills
- 外部系统接入和项目规范不再混在一起
这也是我这轮重新学习后最明确的一个结论:
今天真正值得花时间优化的,不只是
CLAUDE.md本身,而是整个 Claude Code 配置架构。
如果你现在要开始整理自己的配置,我建议按这个顺序来:
- 先收敛
CLAUDE.md,只保留长期有效的项目规则 - 再把权限和运行行为迁到
settings.json - 把重复使用的 prompt 升级成 Skills
- 最后再接入真正高频有价值的 MCP 系统
这样搭出来的,不是一堆零散配置,而是一套能长期演进的 Claude Code 工程底座。
这比单纯“写一个更长的 CLAUDE.md”,重要得多。