
直接进入正题。Claude Code 这玩意儿刚接触的人最容易犯的错就是把它当成一个普通的命令行工具装完就开始对话然后发现问题一堆回答风格不像自己想要的、老在无关文件上浪费 token、甚至改错文件。实际上Claude Code 的水平高低很大程度上取决于你给它搭的“配置三件套”——settings.json、CLAUDE.md 和 memory。这三者定位完全不同配合好了就是个人形外脑配合不好就是个会写代码的聊天框。这篇就把三个体系的职责边界、配置方法、坑点和协同方式一次性讲透适合刚装好 Claude Code 想认真用起来的人也适合已经用了一段但总觉得“不够顺手”的开发者。先说结论settings.json 管的是“行为边界”CLAUDE.md 管的是“项目上下文”memory 管的是“跨项目的长期经验”。这三个缺一不可但绝大多数人只配了第一个甚至第一个都没配全。1. 三大配置体系的定位与关系1.1 别把三个文件混为一谈很多人第一次看到 Claude Code 的配置会下意识以为 settings.json 是唯一的配置文件CLAUDE.md 就是给 AI 看的 READMEmemory 是某种缓存。这个理解方向对了一半但完全不够。settings.json 的本质是“程序级配置”它控制的是 Claude Code 这个工具本身的行为——用哪个模型、哪些操作需要弹窗确认、hook 脚本什么时候触发、输出风格是详细还是简洁。它写在文件系统里作用范围可能是用户级别也可能是项目级别但它不参与“Claude 理解你的项目”这件事。CLAUDE.md 的本质是“项目级说明书”它写在你的项目目录里告诉 Claude 这个项目是什么、目录结构怎么组织、代码风格是什么、测试命令是什么、有哪些坑绝对不要踩。它直接影响对话质量因为你问 Claude 任何问题它都会先扫一遍 CLAUDE.md 来建立上下文。memory 的本质是“跨项目长期记忆”存在用户主目录下记录的是你个人的偏好、常用工作流、踩过的坑和通用的约定。比如你习惯用 pnpm 而不是 npm、你写 Python 时强制类型注解、你希望所有提交信息遵循 Conventional Commits——这些不该写进某个项目的 CLAUDE.md而应该放进全局 memory 里。一个容易理解的生活类比settings.json 是家用电器的设置面板CLAUDE.md 是放在客厅的《家庭使用手册》memory 是你脑子里长期积累的生活经验。设置面板调的是机器参数手册解决的是“这个东西怎么用”长期经验则让你在各种不同场景下都能快速做对决定。1.2 三者的优先级与覆盖关系先说优先级这是避免配置混乱的关键。Claude Code 在启动时会从多个位置读取配置越具体的配置优先级越高。以 settings.json 为例它有三个层级配置层级位置优先级作用范围用户级~/.claude/settings.jsonmacOS/Linux或%APPDATA%\Claude\Windows低所有项目项目级项目根目录的.claude/settings.json中当前项目本地级项目根目录的.claude/settings.local.json高当前项目且不提交到 Git这个覆盖逻辑很实用你可以在用户级配置里写通用的“危险操作需要确认”在项目级覆盖成“这个项目允许自动接受编辑”。而settings.local.json天生就是给个人差异准备的通常应该被.gitignore忽略。合作开发时团队共用的配置放.claude/settings.json你自己机器上的特殊配置放.claude/settings.local.json这样提交代码不会污染队友的环境。CLAUDE.md 的优先级相对简单越靠近当前工作目录的越优先。比如你在src/utils/目录下运行claude同目录下的 CLAUDE.md 优先级最高其次是父目录的最后是~/.claude/CLAUDE.md这个全局记忆文件。这个机制意味着你可以在子目录放专门说明比如docs/CLAUDE.md专门讲解文档规范src/api/CLAUDE.md专门讲接口设计约束。memory 这个说法在 Claude Code 里有两层含义一层是用户全局记忆文件~/.claude/CLAUDE.md另一层是会话内的/memory命令管理的短期记忆条目。前者持久化在磁盘上后者在会话结束后就没了需要手动存回全局记忆才能保留。2. settings.json 详解给 Claude Code 定行为边界2.1 找对配置文件和核心字段配置文件的位置因系统而异这里列一下最常见的路径macOS~/Library/Application Support/Claude/settings.jsonLinux~/.config/claude-code/settings.jsonWindows%APPDATA%\Claude\settings.json但不管哪个系统最简单的办法是在终端里运行claude进入交互模式然后用/config命令直接打开并编辑配置文件这个命令会自动定位到正确的目录不用自己记路径。一个比较实用的最小化配置长这样{ model: claude-sonnet-4-20250514, permissions: { defaultMode: acceptEdits, allow: [ Bash(npm run lint), Edit ], deny: [] }, env: { ANTHROPIC_MODEL: claude-sonnet-4-20250514 }, outputStyle: { codeBlocks: true, format: markdown } }model字段直接指定要用哪个模型。平时做代码生成用 Sonnet 性价比高跑长任务、复杂重构换 Opus预算有限用 Haiku 顶一顶。注意这里填的模型 ID 要和 API 侧支持的型号一致填错了启动就报错。permissions是 settings.json 里最核心也最容易被忽略的一块。它控制着 Claude 在执行操作时到底要不要询问你这是安全问题不能省。2.2 权限模式的取舍与实践defaultMode有四种取值default默认模式Claude 执行危险敏感操作前会弹窗问你安全但频繁打断。acceptEdits自动接受所有文件编辑操作但终端命令还是会问。日常写代码推荐这个。plan只读模式Claude 只能读文件和分析不能做任何修改适合让它先出方案。bypassPermissions跳过所有确认所有操作直接执行。只建议在可信项目里临时用。我的习惯是日常开发用acceptEdits刚开始接触一个新项目或者让 Claude 做自动化重构时切成plan跑一次性批处理任务时临时用bypassPermissions加--dangerously-bypass-permissions参数。永远不要默认全局使用bypassPermissions这个模式下的一个错误rm -rf会让你后悔。再往细看permissions支持更细粒度的控制通过allow和deny数组指定具体操作的放行与拒绝。比如{ permissions: { allow: [ Read, Glob, Bash(npm run build), Bash(git status) ], deny: [ Bash(rm -rf *), Edit(credentials.json) ] } }allow里列的是不需要确认的操作deny里是直接禁止的操作。deny 的优先级高于 allow所以即使你把Bash(*)放进 allow只要 deny 里写了Bash(rm -rf *)这条命令就绝对不会被执行。这个字段对“防止 Claude 误删文件”特别关键尤其是项目里有大文件目录或者临时目录时。2.3 env 和 hooks容易被低估的两个功能env字段除了指定模型还可以注入一些关键的环境变量。比如设置ANTHROPIC_API_KEY、ANTHROPIC_BASE_URL来对接第三方兼容 API很多人用 cc-switch 这类工具管理多套 API 配置核心原理就是改这个字段。还有一种常见玩法是设置ANTHROPIC_DEFAULT_SYSTEM_PROMPT给 Claude 注入一个全局默认的系统提示词相当于在系统层面预设它的角色和约束。不过我个人建议这个少用因为全局系统提示词的改动会影响所有项目的表现不如在 CLAUDE.md 里做项目级定制来得精准。hooks字段是一个事件回调机制支持在特定事件发生时执行指定命令。常见事件有PreToolUse、PostToolUse、UserPromptSubmit、Stop、Notification等。一个很实用的小例子是每次 Claude 停止输出时自动跑一遍项目的 lint 检查并记录结果。{ hooks: { Stop: [ { hooks: [ { type: command, command: npm run lint --silent || true } ] } ] } }这个配置的价值在于它把“人工检查代码”这件事变成了“自动检查”Claude 改完代码你不需要主动要求它跑 lint而是 hook 替你跑了。当然Stop 事件里跑重命令会增加每次对话的等待时间所以建议只放轻量指令。3. CLAUDE.md 详解把项目上下文喂给 Claude3.1 CLAUDE.md 为什么如此关键经常有人抱怨“Claude Code 写出来的代码不像我们团队的风格”大半原因不是模型不行而是你没有把项目规则告诉它。CLAUDE.md 就是干这个的。Claude 每次响应你的请求时会把与当前目录相关的 CLAUDE.md 内容注入到上下文中。它相当于你的“入职手册”决定了 Claude 对这个项目的理解程度。一个详细的 CLAUDE.md 能让它在回答时自动带上项目背景、文件结构和设计约束而不是空泛地写一堆能跑但不符合项目惯例的代码。我之前接手过一个遗留项目里面混着 Vue2 和 Vue3 的写法测试框架也有三套。我把这些情况全部写进 CLAUDE.md 后Claude 生成的代码立刻从“能用”变成了“直接贴合现有代码风格”提交前需要手动改的地方少了非常多。3.2 一份高效的 CLAUDE.md 应该长什么样不用追求篇幅长关键是结构化、可执行。我长期在用的模板长这样# 项目概览 这是一个xxx系统的后端服务负责xxx业务。 # 常用命令 - 开发启动npm run dev - 测试npm test - 类型检查npm run typecheck # 目录结构 - src/api # 接口路由层不写业务逻辑 - src/services # 业务逻辑层 - src/models # 数据模型定义 # 代码风格 - 优先使用 TypeScript 严格模式 - 文件名使用 kebab-case - 每个函数必须有 JSDoc 注释 - 遵循项目内的 eslint 规则提交前必须无 error # 约束与禁忌 - 不要修改 src/models 下的字段类型如需变更先讨论 - 不要直接写原生 SQL必须使用 ORM - 新增依赖前说明理由优先使用项目已有的库 # 测试要求 - 新增功能必须补测试 - 测试文件放在 src/**/__tests__ 目录下有几个细节值得强调第一回答风格约束也写在 CLAUDE.md 里。如果你希望 Claude 用中文回复直接在文件开头加“请使用简体中文回复所有消息”。这个比在系统提示词里设置更灵活因为它是项目级的不会影响其他项目。第二CLAUDE.md 支持通过路径引用其他文件。如果你有一个巨大的规范文档不想塞进 CLAUDE.md可以写docs/coding-standards.mdClaude 会自动去读取这个文件的内容。这个路径是相对于 CLAUDE.md 所在目录的引用时注意别写错。第三CLAUDE.md 可以放在子目录中。前面提到过Claude 会读取从当前目录到项目根目录之间的所有 CLAUDE.md 进行合并所以你可以把 API 文档规范放在docs/CLAUDE.md把前端组件规范放在src/components/CLAUDE.md实现分层控制。这里要特别提醒一点不要把所有内容都堆在根目录的 CLAUDE.md 里。文件太长会导致每次请求的上下文开销变大响应变慢而且重点被稀释。我见过一个项目的 CLAUDE.md 写了 300 多行Claude 每次都认真读完一大半无关内容最后生成的代码该错的还是错。好的 CLAUDE.md 应该是“精确制导”而不是“火力覆盖”。3.3 动态更新 CLAUDE.md 的机制Claude Code 本身提供了一个非常实用的能力它可以在对话过程中主动建议你更新 CLAUDE.md。比如你让 Claude 完成一个复杂的操作它会说“建议将以下内容追加到 CLAUDE.md 以便后续保持一致”。这种项目上下文的动态沉淀是记忆系统真正发挥价值的地方。另外/add-dir命令可以快速把新目录加入项目上下文/memory命令可以查看当前会话的记忆内容/compact可以压缩上下文。这些命令配合 CLAUDE.md 一起用会让对话质量提升非常明显。4. memory 详解让你的经验不再每次重新交代4.1 memory 的存储位置与工作机制记忆体系分两层先搞清楚结构再谈怎么维护。全局记忆文件位于~/.claude/CLAUDE.md。这个文件的内容在每次启动 Claude Code 时都会被读取所以适合放“跨越所有项目的个人偏好与工作流约定”。它和项目 CLAUDE.md 的区别在于项目 CLAUDE.md 关注“这个项目怎么做”全局 CLAUDE.md 关注“我这个人怎么做事情”。会话记忆则是通过/memory命令管理的可以把它理解成“短时记忆”。在对话过程中你可以用/memory 记住用户习惯使用 pnpm 管理依赖来新增一条记忆。这个操作会在当前会话中建立一个记忆条目Claude 在后续对话中会遵守这条约定。但会话结束后这条记忆不会自动写入全局 CLAUDE.md你需要通过/memory查看哪些条目值得沉淀再手动把它们写入~/.claude/CLAUDE.md。4.2 全局 CLAUDE.md 里到底该写什么写全局 CLAUDE.md 的通用原则是只写“在任何一个项目里都成立”的内容。下面是一个示例# 通用偏好 - 所有回复使用简体中文代码注释使用中文 - 代码提交使用 Conventional Commits 规范 - 使用 pnpm 作为默认包管理器 - 测试框架优先选择 Vitest - 代码中避免魔法数字必须提取为常量 # 工作流约定 - 开始任务前先列出实现计划确认后再动手 - 完成代码修改后必须运行测试不能跳过 - 提交前检查是否有调试日志残留 - 进行大规模重构前先创建 git 分支 # 避坑记录 - 不要使用已废弃的 Node.js 16 API - 使用 Docker 部署时时区必须设置为 Asia/Shanghai - 数据库迁移文件一旦执行禁止修改只能新写迁移这些条目看起来简单但它们解决了频繁重复交代的痛点。换一台电脑安装好 Claude Code 后只需拷贝这个文件到~/.claude/CLAUDE.md所有使用习惯立刻恢复这是跨设备迁移体验非常舒服的地方。4.3 记忆维护的常见问题记忆体系最大的敌人是“过期信息”。你可能在两个月前记了一条“使用 webpack 构建”但项目后来迁移到了 Vite。如果这条记忆一直留着Claude 每次都会给出过时的建议。我的解决方法是定期清理过时条目并把容易被误用的记忆加上时间标记比如“截至2025年项目使用 Vite 构建”这样 Claude 至少知道这是一条有时效性的信息。另一个常见问题是“记忆污染”。某些工具或模型的记忆体系曾出现过因为错误记忆不断累积导致后续行为越来越偏离预期的现象学术上叫记忆中毒攻击就是有人在共享记忆或文档中埋入恶意内容逐渐污染模型之后的判断。虽然 Claude Code 的本地记忆文件大多是自用的但如果你从网上下载别人分享的 CLAUDE.md 模板务必检查一遍内容再使用别把看似无害但实际与目标规则冲突的条目直接灌进去。维护记忆还有一个思路用“分类标签”组织内容。全局 CLAUDE.md 里用清晰的二级标题做分类每类下面用无序列表列出具体条目Claude 解析这种结构的能力很强尽量别用大段散文来写记忆宁可每一条短小、明确、可执行。5. 三套配置的实战协同从零搭建一个项目5.1 实战目标与初始环境前面讲理论讲了很多这一节用一个完整的例子把三套配置串起来。假设你要新起一个 Node.js TypeScript 的 API 服务项目目标是用 Claude Code 完成从初始化到写完第一个业务接口的全过程同时保证 Claude 全程行为可控、风格统一、命令不越界。先看初始环境全新目录没有配置任何文件全局环境下已经装好 Claude Code终端里能正常启动claude。5.2 分步配置与验证过程第一步配置全局记忆。在任意目录操作前先确认~/.claude/CLAUDE.md内容符合自己的通用习惯。假设我刚换电脑就把第 4.2 节那份模板写进去并用claude启动一个空会话验证是否能按中文回复。如果启动新的 Claude Code 版本后行为异常先怀疑全局记忆文件冲突再排查 settings.json。第二步初始化项目并写项目级 settings.json。在项目目录里创建.claude/settings.json{ permissions: { defaultMode: acceptEdits, allow: [ Bash(pnpm *, Bash(git *) ], deny: [ Bash(rm -rf *), Bash(pnpm dlx *) ] }, model: claude-sonnet-4-20250514 }这里 allow 放行了所有pnpm和git命令因为这是新项目允许 Claude 装依赖、跑脚本、做版本管理。deny 里禁止了rm -rf和pnpm dlx避免它顺手把本地临时环境清了或者执行某些一次性脚本来路不明。defaultMode用acceptEdits让 Claude 写代码时不需要每个文件都确认省掉大量弹窗。第三步让 Claude 生成项目结构并规划 CLAUDE.md。直接在对话里说“请帮我在当前目录初始化一个 TypeScript API 服务项目技术栈选择 Fastify Zod Vitest并用合适的结构创建一份 CLAUDE.md记录常用命令、目录约定、代码风格和测试要求。”这个提示词的关键在于“创建 CLAUDE.md”这句它会触发 Claude 在项目里生成文档。生成后手动打开检查一遍确保里面没有胡说八道比如目录结构与实际不符、命令拼写错误等。第四步写第一个业务接口并验证行为边界。继续对话“创建一个 GET /health 接口返回服务状态包含当前时间戳和数据库连接状态。不需要真实数据库先 mock 返回。按 CLAUDE.md 的要求补上单元测试。”此时 Claude 会读取项目 CLAUDE.md知道要用 Fastify 写路由、用 Vitest 写测试、代码必须带 JSDoc。由于设置了 acceptEdits它会静默写文件终端里的pnpm test才会弹窗确认。如果不想要弹窗可以把Bash(pnpm test)放进 allow 列表但我的建议是保留测试命令的确认因为频繁执行测试既是常态也容易掩盖错误信息。第五步把过程中的重要共识写入会话记忆。如果对话中 Claude 问“数据库 mock 是应该用静态对象还是用 mock 库”并给出了选择你可以在回复前用/memory记录“本项目当前阶段数据库使用静态 mock不引入额外 mock 库后续接入真实数据库时再重新评估。”这样后续对话中 Claude 就不会反复纠结这个问题。5.3 验证配置是否生效的几条命令很多人配置完了不知道到底生效没有这里给几个自查方法。在 Claude Code 交互模式下输入/status可以看到当前会话的模型、权限模式、工作目录和上下文来源。输入/memory可以看到已记住的记忆条目。输入/config可以直接查看和编辑配置文件。想验证某个命令是否被 deny可以直接在对话里让 Claude 执行那条命令——如果你在 deny 里写了Bash(rm -rf *)它会回复你“该操作不在允许列表中”而不执行。另外在项目目录里执行claude -p 请告诉我你读取了哪些配置文件以及当前权限模式是什么这段命令会以非交互模式启动 Claude并把结果输出到终端。这是快速排查配置问题的好办法不需要开交互会话。5.4 第三方模型接入的配置思路热词里提到了 cc-switch 接 DeepSeek、Qwen、GLM。这块的实际操作路径是通过环境变量切换模型的 base URL而不是修改 Claude Code 的代码。规范的做法是在用户级或项目级 settings.json 的env字段里设置{ env: { ANTHROPIC_BASE_URL: https://api.你的服务商地址.com, ANTHROPIC_API_KEY: 你的密钥, ANTHROPIC_MODEL: deepseek-chat } }用 cc-switch 这类工具本质就是帮你管理多套 env 配置并快速切换避免你反复编辑~/.claude/settings.json。切换后同样用claude -p 请输出当前使用的模型名验证如果模型名和配置一致说明生效了。这里要提醒一个坑不同服务商对模型 ID 的命名不完全一致同一个 deepseek-chat 在你的服务商 API 里可能要求填成 deepseek-chat-v3 之类的全名。配置前先查官方文档或者直接调一次 API 看返回的 model 字段。6. 常见问题与排查技巧实录6.1 高频问题速查表把平时被问得最多的几个问题整理成表格直接对着查。现象原因解决办法Claude 不遵守中文回复全局 CLAUDE.md 未写入中文回复约束在~/.claude/CLAUDE.md加“所有回复使用简体中文”频繁弹窗请求文件编辑defaultMode 设置成了 default改为 acceptEdits配置改了但行为没变化修改的是 local 文件但没重启会话重新启动 claude 或输入/reload刷新配置上下文太大导致响应慢CLAUDE.md 太长或引用文件过多精简 CLAUDE.md用路径按需加载模型切换后仍然用旧模型env 里 ANTHROPIC_MODEL 没更新检查 env 和服务商 API 的模型 ID 是否匹配会话间记不住约定只用了/memory没写入全局 CLAUDE.md把通用条目手动写入~/.claude/CLAUDE.md项目级配置不生效配置层级优先级理解错误确认 local 文件优先级最高且未被 gitignore6.2 我踩过的几个典型坑第一个坑是权限模式设置太松。刚开始用bypassPermissions时觉得特别爽Claude 什么都能干一个指令下去跑完整个重构。但有一次它自作主张跑了一个会改动数据库迁移文件的脚本我事后排查才发现。从那以后我给自己定了个死规矩默认永远是acceptEdits只有临时跑批处理才用bypassPermissions用完马上切回来。第二个坑是 CLAUDE.md 里的路径引用写错。用docs/coding-standards.md时如果这个文件不存在Claude 不会报错它会静默忽略。我曾经因为路径写错导致一段重要规范在项目里从未生效直到代码 review 时才被队友指出来。所以写完路径引用后我会专门让 Claude 复述一遍它从该文件读到了什么确认引用有效。第三个坑是全局记忆和项目约束冲突。有一次我在全局 CLAUDE.md 里写了“统一使用 pnpm”但某个项目因为公司内部网络原因只能用 npm。项目 CLAUDE.md 里写了“本项目使用 npm”按理说项目级优先但全局记忆的约束太强Claude 还是经常列出 pnpm 命令。最后我只能把全局那条改成“默认使用 pnpm除非项目 CLAUDE.md 明确指定其他包管理器”冲突才消失。这个教训值得记住全局记忆的措辞要留出“项目级覆盖”的余地不要写死。6.3 效率提升的几条心得第一善用路径引用而不是全文复制。大型规范文档动辄几百行塞进 CLAUDE.md 会导致每次请求的上下文成本激增。用引用按需加载速度明显更快。第二定期整理记忆。我习惯每两周翻一次~/.claude/CLAUDE.md删除已经过时的条目补充新踩坑的经验。这个维护成本不高但对长期使用体验的提升非常明显。第三把“提交前自检”做成 hook 而不是口头要求。让 Claude 每轮输出后自动跑类型检查和测试比依赖它自律可靠得多。配置好之后你会发现代码质量稳定了不少。第四多设备同步配置。我现在把settings.json和全局 CLAUDE.md 都放进一个 dotfiles 仓库里换机器后拉下来直接用。项目级的 CLAUDE.md 入库是必须的团队协作时每个人都受益。配置体系讲到这里其实核心就一句话settings.json 是护栏CLAUDE.md 是地图memory 是经验本。三个都配好Claude Code 才能从“聪明但不可控”变成“稳定且高效”。最后再分享一个实际体验很多人花了很多时间调模型、试提示词却没有花 20 分钟写一份项目 CLAUDE.md这是最不划算的选择。先配置、再使用才是这套工具的正确打开方式。