1. 为什么每次启动 Claude Code 都像第一次见面
如果你用 Claude Code 写过稍大一点的项目,大概率经历过这种循环:昨天刚跟它讲清楚「这个仓库用 pnpm 不用 npm」「提交前必须跑pnpm test」「src/billing/下的改动要走 Plan Mode」,今天新开一个会话,它又一脸茫然地问你「请问这个项目用什么包管理器」。这不是它记性差,而是 Claude Code 的每个会话默认都从一个全新的上下文窗口开始——上一次会话里你敲过的命令、纠正过的风格、解释过的架构,全都不会自动带过来。
Claude Code 的 CLAUDE.md 自动记忆机制,就是专门解决这个问题的。它本质上是一套「跨会话知识传递」方案:你手动维护的CLAUDE.md负责写死项目规范,Claude 自动维护的自动记忆负责从日常交互里积累经验,两者都会在每次会话启动时自动加载。搞清楚这套机制,你就不用再当复读机。
这篇文章面向三类人:一是刚接触 Claude Code、还在手动重复交代项目习惯的新手;二是团队里想让多个成员共享同一套编码规范的开发者;三是想把 Claude Code 的配置和 API 通道统一管理、避免每台机器各配一套的人。我会先讲清楚两套记忆系统的分工,再给出可直接复制的CLAUDE.md模板和settings.json配置片段,最后演示怎么通过统一 Key/API 通道把配置持久化,并附一次重启验证记忆是否生效的检查步骤。
需要先明确一个概念:CLAUDE.md 的内容是作为上下文加载的,不是系统级强制配置。也就是说 Claude 会「尽量遵循」,但如果你写的是「正确格式化代码」这种模糊指令,它照样可能跑偏。所以下面所有模板都遵循一个原则——具体、可验证、每条都能对照检查。
2. TaoToken 前置:把 Key 和 API 通道统一起来
在讲记忆机制之前,得先解决一个前置问题:Claude Code 每次启动要读配置、要连模型,如果你的 Key 和 Base URL 散落在多个地方,换台机器、换个项目就得重配一遍,这本身就违背了「持久化」的初衷。我试过把配置集中到一处管理,配合 TaoToken 的统一 API 通道,跨会话、跨项目的配置一致性会好很多。
TaoToken 在这里扮演的角色是统一的 API 接入层。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api (这个不加 UTM)。你需要在控制台创建一个 API Key,然后把它写进 Claude Code 的配置里。控制台地址:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,API Keys 管理页:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
为什么要在记忆机制的文章里先讲这个?因为 CLAUDE.md 管的是「项目习惯」,而 Key/Base URL 管的是「怎么连上模型」。两者都属于「每次会话都要用到的持久化配置」。如果你只把 CLAUDE.md 写得很漂亮,但每次换环境都要重新填 Key,那体验依然是割裂的。把这两层都持久化,才算真正让 Claude Code「记住你的所有习惯」。
具体来说,Claude Code 读取配置的优先级大致是:环境变量 > 项目级.claude/settings.json> 用户级~/.claude/settings.json。我建议把 API 相关的配置放在用户级,这样所有项目共享;把项目特有的规范放在项目级 CLAUDE.md。下面第三节会给出完整的可复制片段。
这里有个容易踩的坑:很多人把 Key 直接写进项目里的settings.json然后提交到 git,这是不安全的。正确做法是把 Key 放在用户级配置或环境变量里,项目级只放不含密钥的规范。如果你用 Claude Code 的 coding-plan 模式做长期编码,建议先到 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 了解套餐,再决定 Key 的分配方式。
另外,如果你用的是 Claude Code 的 Anthropic 兼容接入方式,可以参考文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 里的说明,把 Base URL 指向https://taotoken.net/api。ClaudeCodeAnthropic 相关的接入细节也在同一份文档里。配置好之后,无论你开多少个会话,模型通道都是稳定的,剩下的精力就可以全部放在 CLAUDE.md 的打磨上。
3. 可复制配置:CLAUDE.md 模板 + settings 片段
这一节是全文的核心,给出可以直接抄走的东西。先讲 CLAUDE.md 的存放位置和优先级,再给模板,最后给 settings 配置。
CLAUDE.md 可以放在多个位置,越具体的位置优先级越高。项目级放在./CLAUDE.md或./.claude/CLAUDE.md,用户级放在~/.claude/CLAUDE.md,本地个人偏好放在./CLAUDE.local.md(记得加进.gitignore)。工作目录上方的 CLAUDE.md 会在启动时完整加载,子目录里的则按需加载。如果你想让 Claude 自动生成初始文件,可以在项目根目录运行/init,它会分析代码库并生成包含构建命令、测试指令的基础文件;文件已存在时它会建议改进而不是覆盖。
下面是一份我实测下来比较通用的项目级 CLAUDE.md 模板,你可以直接复制后按项目改:
# 项目规范 ## 构建与测试 - 包管理器统一使用 pnpm,禁止使用 npm 或 yarn - 安装依赖:`pnpm install` - 运行测试:`pnpm test` - 提交前必须执行 `pnpm lint && pnpm test`,两者都通过才允许提交 ## 代码风格 - 使用 2 空格缩进,不使用 Tab - TypeScript 严格模式,禁止使用 `any`,必要时用 `unknown` 加类型守卫 - 组件文件使用 PascalCase,工具函数使用 camelCase - 所有导出函数必须有 JSDoc 注释 ## 目录约定 - `src/api/` 存放接口层,所有请求必须经过 `src/api/client.ts` - `src/components/` 存放通用组件,业务组件放在对应 feature 目录 - 测试文件与被测文件同目录,命名 `*.test.ts` ## 工作流 - `src/billing/` 下的任何改动,先进入 Plan Mode 再动手 - 提交信息使用 Conventional Commits 格式 - 不要自动执行 `git push`,推送前必须人工确认 ## 导入 有关项目概述请参阅 @README.md 有关可用脚本请参阅 @package.json注意最后两行的@README.md和@package.json,这是 CLAUDE.md 的导入语法,支持相对路径、绝对路径和递归导入,最大深度 5 层。这样你就不用把 README 里的内容再抄一遍。
对于不想提交到版本控制的个人偏好,创建CLAUDE.local.md,它会和主文件一起加载,同层级下后加载所以能覆盖共享指令。如果你的项目已经用了AGENTS.md,可以写一个简单的 CLAUDE.md 导入它:@AGENTS.md,实现两个工具的指令复用。
接下来是 settings 配置。用户级~/.claude/settings.json放 API 通道和全局偏好:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "你的_TaoToken_Key" }, "autoMemoryEnabled": true, "autoMemoryDirectory": "~/.claude/projects/memory" }项目级.claude/settings.json放项目特有配置,注意不要放 Key:
{ "autoMemoryEnabled": true, "claudeMdExcludes": [ "**/monorepo/other-team/CLAUDE.md" ] }如果你在大型 monorepo 里,claudeMdExcludes能帮你跳过其他团队的指令文件,避免加载无关内容。自动记忆默认开启,想关掉可以在会话里运行/memory切换,或者设CLAUDE_CODE_DISABLE_AUTO_MEMORY=1。
对于规则较多的项目,建议用.claude/rules/目录拆分。没有配置路径的规则启动时加载,配置了paths的按需加载。比如:
--- paths: - "src/api/**/*.ts" --- # API 开发规则 - 所有 API 端点必须包含输入验证 - 使用标准错误响应格式 - 包含 OpenAPI 文档注释这样只有 Claude 处理src/api/下的文件时才会加载这些规则,节省上下文。.claude/rules/支持符号链接,你可以维护一套通用规则然后链接到多个项目:ln -s ~/shared-claude-rules .claude/rules/shared。
4. 验证请求:重启后检查记忆是否生效
配置写完不算完,得验证。这一节给出一次完整的重启验证流程,确保 CLAUDE.md 和自动记忆真的被加载了。
第一步,确认版本。自动记忆需要 Claude Code v2.1.59 或更高版本,运行:
claude --version如果版本过低,先升级。版本不够的话自动记忆相关功能不会生效,这是很多人「配了没反应」的第一个原因。
第二步,在项目根目录启动一个新会话,运行/memory命令。这个命令会列出当前会话加载的所有 CLAUDE.md、本地指令和规则文件。你要检查的是:项目级 CLAUDE.md 是否在列表里、用户级~/.claude/CLAUDE.md是否在列表里、.claude/rules/下的规则是否按预期出现。如果某个文件没列出,说明 Claude 没找到它,优先检查路径和文件名拼写。
第三步,做一次行为验证。在会话里直接问一个只有 CLAUDE.md 里才有的规则,比如:
这个项目用什么包管理器?提交前要跑什么命令?如果它回答「pnpm」和「pnpm lint && pnpm test」,说明项目级 CLAUDE.md 生效了。如果它反问或者答成 npm,说明文件没被加载,回到第二步排查。
第四步,验证自动记忆。自动记忆的存储位置默认是~/.claude/projects/<project>/memory/,其中<project>来自 git 仓库标识,所以同一个仓库的所有 worktree 和子目录共享一套记忆。目录结构大致是:
~/.claude/projects/<project>/memory/ ├── MEMORY.md # 简洁索引,每个会话加载核心内容 ├── debugging.md # 调试相关笔记 └── api-conventions.md # API 设计决策MEMORY.md的前 200 行或前 25KB(以先到者为准)会在每次会话启动时加载。你可以在会话里对 Claude 说「记住:这个项目总是用 pnpm」,然后观察是否出现 "Writing memory" 提示。下次新开会话时,如果它主动提到这条偏好,说明自动记忆生效了。想手动查看,直接打开记忆目录里的MEMORY.md即可。
第五步,验证 API 通道。运行一个简单请求,确认模型能正常响应:
claude -p "用一句话说明当前项目的包管理器"如果返回正常内容,说明 Base URL 和 Key 配置正确。如果报错,看下一节的排查。
这里有个细节:自动记忆是机器本地的,不会在不同机器或云环境之间共享。所以如果你在多台机器上开发,CLAUDE.md 可以通过 git 同步,但自动记忆需要各自积累。这也是为什么项目规范要写进 CLAUDE.md 而不是只依赖自动记忆——前者可版本控制,后者是本地的。
5. 本篇常见错排查:401、local proxy failed、reading choices
配置过程中最容易卡在几个具体报错上,这一节逐个对照排查。
报错一:401 Unauthorized。这通常意味着 Key 无效或没被正确读取。先确认ANTHROPIC_API_KEY是否写对,注意不要有多余空格或换行。如果你把 Key 放在项目级settings.json里但项目被 git 忽略规则影响,也可能读不到。建议把 Key 放在用户级~/.claude/settings.json的env字段,或者直接用环境变量导出:
export ANTHROPIC_API_KEY="你的_TaoToken_Key" export ANTHROPIC_BASE_URL="https://taotoken.net/api"如果你用的是 Claude Code 的 OAuth 登录方式而不是 API Key,401 也可能是 token 过期,重新走一次登录流程即可。注意区分:API Key 方式和 OAuth 方式是两套认证,不要混用。
报错二:local proxy failed。这个报错一般出现在 Base URL 配置指向了本地地址但本地没有对应服务在跑。检查你的ANTHROPIC_BASE_URL是不是被某个旧配置覆盖成了http://localhost:xxxx。排查顺序是:先看环境变量echo $ANTHROPIC_BASE_URL,再看用户级 settings,最后看项目级 settings。优先级是环境变量最高,所以如果环境变量里残留了旧值,会覆盖文件配置。把它改成https://taotoken.net/api再重启会话。
报错三:reading choices 相关错误。这类报错通常和响应格式解析有关,常见原因是 Base URL 指向的端点不兼容 Anthropic 的消息格式,或者模型 ID 写错。检查你的配置里模型 ID 是否和通道支持的模型一致。如果你在 Cline MCP 或 CC Switch 里配置,需要写全三件套:Base URL、Key、Model ID,缺一个都可能报格式错误。Model ID 建议直接对照文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 里的列表填写,不要凭记忆写。
报错四:CLAUDE.md 不生效。如果/memory里没列出你的文件,先确认文件名大小写——必须是CLAUDE.md全大写。再确认位置:项目级要在项目根目录或.claude/下。如果你在子目录启动 Claude Code,它会向上遍历目录树,但子目录里的 CLAUDE.md 是按需加载的,不会在启动时出现。另外检查是否有冲突指令,比如用户级说用 npm、项目级说用 pnpm,Claude 可能随机选一条,建议定期清理冲突。
报错五:自动记忆没写入。先确认版本 ≥ v2.1.59,再确认autoMemoryEnabled没被设成 false。如果记忆目录路径被autoMemoryDirectory改过,去新路径找。还有一种情况是 Claude 判断这条信息「未来没用」所以没存,你可以明确说「记住这个」来强制写入。
排查时有个通用技巧:用/memory命令看当前加载了哪些文件,这是最直接的诊断入口。它同时提供自动记忆开关和打开记忆文件夹的快捷入口,能省很多事。
6. 把配置沉淀成习惯,让 Claude Code 真正记住你
走到这里,你应该已经有一套能跑的 CLAUDE.md 和 settings 配置了。最后说几个我踩过坑之后总结的实用技巧,帮你把这套机制用得更顺。
第一,CLAUDE.md 每个文件控制在 200 行以内。过长的文件不仅占上下文,还会降低 Claude 对指令的遵守度。内容多就拆到.claude/rules/里,用paths做按需加载。第二,指令要具体可验证,写「使用 2 空格缩进」而不是「正确格式化代码」,写「提交前运行 pnpm test」而不是「测试你的更改」。第三,定期审查所有指令文件,删掉过时和冲突的内容,冲突指令会让 Claude 随机选一条执行。
第四,把 API 通道和项目规范分层管理。Key 和 Base URL 放用户级,项目规范放项目级,个人偏好放CLAUDE.local.md并加进.gitignore。这样换项目不用重配 Key,换机器同步 CLAUDE.md 就能带走项目习惯。如果你需要长期做编码和 Agent 任务,可以到 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 看看套餐;想先验证模型响应,用模型对话入口 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 试一次;接入细节和报错对照都在文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 里。
最后一步,也是最容易被忽略的一步:每次你发现 Claude 第二次犯同样的错,就立刻把这条规则写进 CLAUDE.md。这个动作坚持一两周,你的 CLAUDE.md 就会长成一份真正贴合你项目习惯的规范,新会话启动时它自动加载,你再也不用从头教一遍。