1. 从一次会话记录说起:Claude Code 的三层配置到底该怎么搭
Claude Code 用久了会遇到一个很具体的矛盾:项目规范越写越多,CLAUDE.md 越堆越厚,每次启动都要把整份规范全文塞进上下文,token 烧得快,真正跟当前任务相关的规则反而被淹没。我这次会话记录的核心,就是把 Claude Code 的配置架构拆成三层——入口层 CLAUDE.md、规则层 .claude/rules/、记忆层 memory/,再配一个统一 Key 通道把模型请求收口到 TaoToken,最后用 Skill 把整套架构的初始化流程自动化。
这套东西适合谁?适合已经在用 Claude Code 做真实项目、开始觉得 CLAUDE.md 维护成本变高的人;也适合想把「项目规范 + 会话记忆」做成可复用 Skill 的开发者。它解决的不是「怎么装 Claude Code」这种入门问题,而是配置架构怎么分层、记忆怎么管生命周期、Skill 怎么设计输入输出这三件事。
三层架构的核心思想是按「稳定性」分层:稳定的放入口层,半稳定的放规则层,易变的放记忆层。入口层是全局必读的 CLAUDE.md,规则层是 .claude/rules/ 下按编号拆分的规范文件,记忆层是 ~/.claude/projects/.../memory/ 下的会话持久化文件。下面这张表是我最终定下来的目录骨架:
enterprise-manage/ ├── CLAUDE.md ← 入口层(全局必读,只放索引和摘要) ├── .claude/ │ └── rules/ ← 规则层(执行规范,按 paths 懒加载) │ ├── 000-general.md # 通用规则(始终加载) │ ├── 100-frontend.md # 前端规则(paths: frontend/**) │ ├── 200-backend.md # 后端规则(paths: backend/**) │ ├── 300-build.md # 构建规则 │ └── 400-deploy.md # 部署规则 └── ~/.claude/projects/.../memory/ ← 记忆层(会话持久化) ├── MEMORY.md # 索引文件 └── ...这里有个关键发现值得单独说:@path/to/file导入机制和 rules 的paths懒加载是冲突的。CLAUDE.md 里写@.claude/rules/100-frontend.md,启动时会全文展开;而 rules 文件本身又带pathsfrontmatter 按路径懒加载。两者叠在一起,同一份内容会被加载两次,既浪费上下文又可能造成规则重复。解决办法是用 markdown 链接索引代替@导入,让 Claude 启动时只看到一份轻量清单,需要时再按链接主动 Read。
2. TaoToken 前置:统一 Key 与 API 通道准备
在动配置之前,先把模型请求的出口收口。Claude Code 默认走 Anthropic 官方通道,但如果你想让多个项目、多个 Skill 共用一套 Key 和配额管理,用 TaoToken 做统一接入会省很多事。它在这里的角色是「统一 Key + API 通道」:你只需要维护一份 Key,Claude Code 的 settings.json 里指向 TaoToken 的 API 地址即可。
先拿到 Key。打开控制台创建 API Key:
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=rewriteAPI 基础地址是https://taotoken.net/api,这个地址不加任何 UTM 参数,配置里直接写死。如果你要确认某个模型名是否可用、或者想先在网页里试一轮对话再写进配置,用模型对话页:
https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite注意:Key 不要提交进 git。个人项目里 memory/ 目录建议整体 gitignore,Key 走环境变量或本地 settings 文件,别混进仓库。
如果你打算长期用 Claude Code 跑编码任务、或者要挂 Agent 做自动化,Coding Plan 比按量更划算,配置方式一样,只是计费模型不同:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite3. 可复制配置:settings.json 骨架与 CLAUDE.md 索引写法
3.1 settings.json 骨架
Claude Code 的配置分全局和项目级。全局在~/.claude/settings.json,项目级在项目根.claude/settings.json。下面这份骨架把 API 通道指向 TaoToken,同时保留 Skill 和记忆目录的路径约定:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的TaoTokenKey", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" }, "permissions": { "allow": [ "Read", "Write", "Edit", "Bash(git status)", "Bash(git diff:*)", "Bash(npm run:*)" ], "deny": [ "Bash(rm -rf:*)", "Bash(curl:* | sh)" ] }, "includeCoAuthoredBy": false }几个参数说明一下。ANTHROPIC_BASE_URL指向 TaoToken 的 API 地址,这是统一通道的关键;ANTHROPIC_API_KEY填你在控制台创建的 Key;ANTHROPIC_MODEL按你实际可用的模型名填,不确定就先在模型对话页试。permissions.allow里我放开了 Read/Write/Edit 和几个只读 git 命令,deny里挡掉危险删除和管道执行远程脚本,这是防止 Skill 自动执行时误伤。
提示:项目级 settings.json 会覆盖全局同名配置。如果你有多个项目共用一套 Key,把 Key 放全局,项目级只写 permissions 和模型差异。
3.2 CLAUDE.md 用链接索引代替 @ 导入
这是解决「@ 导入与 paths 冲突」的核心写法。CLAUDE.md 里不要写@.claude/rules/xxx.md,改成 markdown 链接清单:
# 项目规范索引 ## 规范文件索引 - [000-general.md](.claude/rules/000-general.md) — 通用规范(语言、命令、文件操作) - [100-frontend.md](.claude/rules/100-frontend.md) — 前端规范(paths: frontend/**) - [200-backend.md](.claude/rules/200-backend.md) — 后端规范(paths: backend/**) - [300-build.md](.claude/rules/300-build.md) — 构建规范 - [400-deploy.md](.claude/rules/400-deploy.md) — 部署规范 > 上述文件仅列出位置和摘要,需要时按路径读取具体内容。效果是:Claude 启动时只看到索引清单,轻量;处理前端文件时 paths 匹配自动加载 100-frontend.md;Claude 主动需要时按链接 Read 具体文件。这跟 MEMORY.md 的模式一致——索引描述 + 按需读取。
3.3 规则文件的 paths frontmatter
每个 rules 文件头部用 frontmatter 声明加载条件,只有 000-general.md 不带 paths,始终加载:
--- paths: - "frontend/**" - "src/components/**" --- # 前端规范 - 组件文件用 PascalCase 命名 - 样式统一走 CSS Modules,禁止内联 style - 新增依赖前先确认 package.json 是否已有同类库3.4 记忆文件的生命周期字段
记忆层每个文件头部带生命周期元数据,这是后面 Skill 做审查的依据:
--- name: project-status description: 项目开发进度 metadata: type: project lastVerified: 2026-07-15 status: active --- # 项目进度 - 当前迭代:用户中心重构 - 已完成:登录、注册 - 进行中:权限模块判定规则我定成四档:lastVerified缺失视为未验证,需要补充或确认;超过 30 天标记为可能过期,检查内容;超过 90 天大概率过期,删除或更新;status: archived已归档,不主动引用;status: stale待清理,确认后删除。
4. 验证请求:启动 Claude Code 确认 Skill 加载与记忆读写
配置写完必须验证,不然你不知道 Skill 有没有被扫到、记忆有没有正常读写。分三步。
第一步,验证 API 通道通不通。在项目根目录启动 Claude Code,直接问一句让它读文件:
cd enterprise-manage claude进入交互后输入:
读取 CLAUDE.md,告诉我规范文件索引里列了哪几个文件如果 TaoToken 通道配置正确,Claude 会返回索引清单里的文件名。如果报 401 或连接错误,说明 Key 或 BASE_URL 有问题,回到第 5 节排查。
第二步,验证 Skill 是否被加载。Claude Code 启动时会扫描~/.claude/skills/目录。把 init-memory-rules 这个 Skill 放进去后,在会话里输入斜杠命令看是否出现:
/init-memory-rules如果命令能补全出来,说明 SKILL.md 被正确识别。Skill 的目录结构长这样:
~/.claude/skills/init-memory-rules/ ├── SKILL.md # 主文件(扫描→交互→生成流程) ├── checklist.md # 执行检查清单 └── templates/ ├── CLAUDE.md.template ├── 000-general.md.template ├── 100-frontend.md.template ├── 200-backend.md.template ├── 300-build.md.template ├── 400-deploy.md.template └── MEMORY.md.template第三步,验证记忆读写。让 Claude 写一条记忆再读回来:
把当前项目进度写入 memory/project-status.md,lastVerified 设为今天然后新开一个会话,问:
读取 memory/MEMORY.md,列出所有记忆文件及其 status能列出刚写的文件且 status 为 active,说明记忆层读写正常。这三步走完,配置架构就算跑通了。
5. 本篇常见错排查
5.1 启动报 401 或 invalid api key
最常见的原因是 Key 复制时带了空格,或者把ANTHROPIC_BASE_URL写成了带路径的完整 URL。BASE_URL 只写到https://taotoken.net/api,不要在后面拼/v1/messages。另外确认 settings.json 是合法 JSON,多一个逗号都会导致整个文件被忽略,Claude Code 会回退到默认配置,表现就是「配置好像没生效」。
5.2 Skill 斜杠命令不出现
先确认目录层级:必须是~/.claude/skills/<skill-name>/SKILL.md,SKILL.md 直接在 skill 目录下,不要再套一层。其次确认 SKILL.md 头部的 frontmatter 有name和description字段,缺了可能不被扫描。改完 Skill 后要重启 Claude Code 会话,热加载不一定生效。
5.3 规则被加载两次
如果你在 CLAUDE.md 里既写了@.claude/rules/100-frontend.md,又给这个文件配了pathsfrontmatter,就会重复加载。检查方法:启动后问 Claude「100-frontend.md 的内容你看到了几遍」。修复就是把 CLAUDE.md 里的@导入全部换成 markdown 链接索引。
5.4 记忆文件越积越多、上下文被撑爆
这是没做生命周期管理的典型症状。MEMORY.md 作为索引只放文件名、描述和 status,不要把每个记忆文件的全文塞进去。定期跑 review-memory-rules 把lastVerified超过 90 天的清理掉。我踩过的坑是早期把所有会话总结都堆进 MEMORY.md,结果索引文件本身就有几千字,反而成了新的上下文负担。
5.5 paths 匹配不生效
paths里的 glob 是相对项目根目录的。如果你写frontend/**但实际前端代码在src/frontend/,就匹配不上。用git ls-files确认实际路径前缀,再改 frontmatter。另外注意**和*的区别,frontend/*只匹配一层,frontend/**才递归。
6. 把三个 Skill 串成协作体系
单有配置架构还不够,得让 Skill 把「初始化 → 日常 → 维护」串起来。我设计了三个 Skill 各管一段生命周期:
新项目 ↓ /init-memory-rules ← 初始化三层架构,写入 lastVerified + status ↓ 日常开发 ↓ /check-or-reset ← 会话结束时总结状态,更新 lastVerified ↓ 定期维护 ↓ /review-memory-rules ← 审查过期、归档、清理init-memory-rules 的流程是:读取 args 获取项目路径 → 自动扫描项目结构(检测 package.json/pom.xml/docker-compose 推断技术栈)→ AskUserQuestion 确认补充(技术栈、模块、进度、部署四轮)→ 生成 CLAUDE.md → 生成 .claude/rules/ → 生成 memory/ 和 MEMORY.md → 输出创建摘要。关键设计点是按需生成:有前端代码才生成 100-frontend.md,没有就跳过;已存在文件询问覆盖/合并/跳过,不盲目覆盖。
check-or-reset 在会话结束时更新 lastVerified,保证记忆新鲜度。review-memory-rules 审查时检测过期、归档、清理,对应第 3.4 节的四档判定规则。
这套体系跑起来后,新项目初始化一条命令,日常开发结束自动更新记忆时间戳,定期维护一条命令清理过期记忆。配置架构、记忆生命周期、Skill 设计三件事就闭环了。
如果你在接入过程中遇到通道或 Key 的问题,直接看接入文档对照排查:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite需要重新生成或管理 Key 就回 API Keys 页:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite长期跑编码任务和 Agent 的话,Coding Plan 的配额模型更适合持续会话:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite最后留一个我实际用下来最省事的习惯:每次改完 CLAUDE.md 或 rules 文件,不要急着开新会话,先在当前会话里让 Claude 复述一遍它看到的索引清单,确认没有重复加载、没有漏文件,再继续干活。这个动作花不到十秒,但能挡掉大部分「配置改了却没生效」的困惑。