最近一段时间,我把工作流里相当一部分代码任务交到了Claude Code手上。一开始只是图新鲜,随手问几个问题,后来慢慢发现:真正拉开效率差距的,根本不是模型本身,而是你有没有为它准备一套像样的templates。如果你每次打开终端,都要用工整的段落重新描述一遍项目背景、技术栈、代码风格、禁止事项,那你其实还在用最原始的方式和这个工具打交道,等于每次都在重新教一个失忆的新同事。
这篇文章想把 Claude Code 的模板体系拆开讲清楚:CLAUDE.md 应该怎么组织、自定义命令怎么写、团队级模板库怎么沉淀,以及我实际踩过的几个坑。整理出来的东西基本是我自己项目里正在用的方案,给正在用 Claude Code、或者准备把它引入团队的人做一个参考。模板这东西,你说它复杂,它不就是几个 Markdown 文件;你说它简单,用不好真能让整个工具的体验打对折。
1. 你缺的不是工具,是上下文管理
1.1 模板的本质是给模型固定“人设”
接手别人的代码库,第一件事是什么?找来项目文档、跑一遍构建、翻几个核心模块,搞清楚技术栈和约定。而 Claude Code 每次进入一个新项目,其实也处于同样的状态——它对你的代码一无所知,只知道自己是个能力很强的 AI。
templates 在这里干的事,就是把“入职培训”给固化下来。你不需要每次反复说“我们这个项目用 Python 3.11 和 FastAPI,代码风格遵循 Black,测试用 pytest,注意不要把业务逻辑写在路由层”,只要项目里有对应的模板文件,它启动时会自动读取这些上下文。这就相当于给模型固定了一个稳定、可预期的“人设”,它知道你期望它用什么方式说话、按什么标准写代码。
我自己最初用 Claude Code 时完全不重视模板,对话里反复交代背景,结果就是两个问题:一是上下文窗口被大量重复描述占据,真正留给分析和生成代码的空间变少;二是它很容易在前几次对话后“跑偏”,忘记你最开始定下的规则。后来我把所有项目约定写进模板,效果立竿见影。
1.2 模板体系的四个层级,别只盯着 CLAUDE.md
要说 Claude Code 的模板,很多人第一反应就是 CLAUDE.md,这没错,但它只是整个体系里的一层。我实际用下来,觉得应该把模板分成四层理解。
| 层级 | 位置 | 作用范围 | 典型用途 |
|---|---|---|---|
| 项目级 CLAUDE.md | 项目根目录或子目录 | 当前项目所有会话 | 项目概述、技术栈、代码规范、目录结构 |
| 用户级全局配置 | 用户目录下的 Claude 配置 | 所有项目 | 个人偏好、默认输出风格、通用禁止事项 |
| 自定义命令(Slash Commands) | .claude/commands/ 目录 | 按需手动触发 | 代码审查、生成提交信息、修复报错、模块生成 |
| Prompt 模板和代码骨架 | 项目中任意目录或独立模板库 | 通过命令与约定触发 | 固定格式的代码生成、新项目脚手架 |
很多教程只教你写 CLAUDE.md,忽略了命令模板。但实际上,CLAUDE.md 是“静态背景”,Slash Commands 才是“动态入口”。举个例子:你可以在 CLAUDE.md 里写清楚项目的测试规范和命令,但如果想快速让 AI 帮你按规范补一批测试,最好封装成一个/write-tests命令,里面预置了测试文件的骨架和断言风格。模型一执行命令,就知道你要什么格式,不用再当场商量。
这四层配合起来,才是一套完整的模板体系。只写一个文件,或者只配命令,都不算真正把模板用透了。
2. CLAUDE.md 是模板的核心,手把手拆解编写套路
2.1 文件放在哪里,加载顺序是怎样的
先说最基础的问题:CLAUDE.md 放哪。按官方设计,Claude Code 在进入项目时,会从当前目录往上层目录查找 CLAUDE.md,同时也会读取用户目录下的全局配置文件。具体的路径我不打算背文档,直接说实践结论:
- 项目根目录的 CLAUDE.md 是最常规的放法,它描述项目级约定,所有进入该仓库的会话都会加载。
- 子目录里也可以放 CLAUDE.md,比如
src/api/CLAUDE.md,用于描述该模块特有的约束。Claude Code 在读取时会把父级和子级文件合并,父级是基础,子级是补充。 - 用户目录下的全局配置影响所有项目,适合放个人化的东西,比如“你习惯用中文回答”“默认不解释代码,直接给出修改后的完整代码块”。
这里有个很容易踩的坑:文件名必须严格是CLAUDE.md,全大写。如果你写成Claude.md或者claude.md,文件会被直接忽略,而且不会有任何报错。我第一次就把文件名写成了Claude.md,结果折腾了半天以为模型没加载,最后才发现是大小写问题。另外,文件编码最好用 UTF-8,不然中文内容可能出现乱码,影响判断。
层级加载这块,我的经验是:不要把子目录的 CLAUDE.md 写得太过庞杂,否则多个子文件合并后,模型注意力会被稀释。你可以在根文件里统一管“全局约定”,子目录只管“本模块的特定逻辑和边界”,这样做,读取顺序和优先级都清晰可控。
2.2 内容怎么组织:结构、语气、信息密度
一个能用的 CLAUDE.md 不是把 README 抄一遍,而是要站在“如何指导 AI 正确干活”的角度来写。语法上它支持 Markdown,模型稳定复述能力强,段落清晰肯定比一堆堆砌的无序文字好。我写的项目级 CLAUDE.md 一般按这个骨架来:
- 项目一句话概述:让模型第一时间知道这是干什么的。
- 技术栈与版本:语言、框架、关键依赖、运行时版本。
- 常用命令:安装、测试、构建、lint 分别是什么(不要用抽象的词,给真实命令)。
- 代码结构与架构约定:目录职责、分层规则、模块边界。
- 代码风格:格式偏好、命名规范、注释要求。
- 常见陷阱与禁忌:哪些事千万别做,比如“不要修改生成的文件”“不要在迁移脚本里写业务逻辑”。
语气上,我强烈建议用祈使句,直接、明确。你写“项目基于 FastAPI”,模型只能知道一个事实;你写“所有 HTTP 接口必须定义在 routers/ 目录下,使用 Pydantic 模型做请求校验”,模型才知道你期望它干什么。模板是给模型看的行为准则,不是给自己看的项目介绍。
信息密度也要拿捏好。太抽象没用,太啰嗦同样没用。我见过有人把 CLAUDE.md 写成五千字的公司规章制度,结果模型面对具体问题时,确实把规则背出来了,但压根不知道该优先执行哪一条。这时候需要提炼优先级,把最关键的命令和约束放在最前面,用清晰的结构隔开次要信息。
下面是我一个 FastAPI 项目的 CLAUDE.md 精简版,可以直接参考:
# 项目概述 这是一个提供数据查询服务的 FastAPI 后端,核心业务是用户上传 CSV 并生成统计报表。 # 技术栈 - Python 3.11 - FastAPI + Uvicorn - SQLAlchemy 2.x + SQLite(开发环境) - Pydantic v2 做请求与响应校验 - pytest + httpx 做接口测试 # 常用命令 - 安装依赖:pip install -r requirements.txt - 启动服务:uvicorn app.main:app --reload - 运行测试:pytest - 代码规范:ruff check . # 架构约定 - app/main.py 只负责创建 FastAPI 实例和注册路由 - 所有路由定义在 app/routers/ 下,按业务域拆分 - 业务逻辑放在 app/services/,禁止在路由里写复杂逻辑 - 数据库查询统一走 app/repositories/,禁止直接在接口处拼接 SQL # 代码风格 - 变量命名使用 snake_case,类名使用 PascalCase - 函数必须包含 docstring,说明参数和返回值 - 所有新的接口必须附带 422 错误示例 - 对返回给前端的字段名,使用驼峰风格进行序列化 # 常见陷阱 - 不要把上传的 CSV 原样存库,必须先做格式校验 - 不要修改 migrations/ 目录下已执行过的迁移文件 - 测试中禁止访问真实外部 API,统一用 Mock这个模板看起来不长,但实际效果比我之前写几千字的大而全文档好得多。模型在生成代码时,会自动遵循“禁止拼接 SQL”“路由里不写业务逻辑”这些硬性约束,代码风格也稳定很多。
2.3 这里有三个坑,提前帮你踩了
坑一:CLAUDE.md 太长,直接把上下文窗口撑爆。我最早追求“详尽”,把历史决策、团队分工都放了进去。后果就是每次对话刚开始,模型就要消化一大段文字,可用的上下文余额直接少一大截。建议控制在 100 行以内,只保留“看了就能干活”的信息。更长、更细的背景资料放到 docs 里,需要时再让模型去翻。
坑二:全是“不要”,没有“要怎么做”。只写“不要使用全局变量”,模型可能还是会用,因为它在代码里没看到替代练习,正确做法是给出“必须通过依赖注入传递配置对象”。负面约束要配正面示范,杀伤力才会出来。
坑三:把 CLAUDE.md 写成了人类看的文档。模型和人类阅读习惯不同,人类喜欢铺垫、背景、结论,模型更需要命令式的、可直接执行的表述。尽量避免“本系统旨在……”“考虑到未来扩展性”这类修饰语,直接写“这个模块负责……遇到 X 时执行 Y”。
3. 自定义命令模板:把高频任务做成斜杠指令
3.1 命令的目录结构和参数机制
CLAUDE.md 解决的是“背景知识”,但很多重复性任务还需要一套固定的操作流程,这正是自定义命令(Slash Commands)的用武之地。比如“帮我审查一下这几个文件的代码”“按我们项目的规范写一个带测试的服务模块”“根据 git diff 生成提交信息”,这些任务流程高度相似,没必要每次都现场指挥。
自定义命令本质上是放在特定目录下的 Markdown 文件。通常在项目根目录下建.claude/commands/文件夹,每个.md文件对应一个命令,文件名就是命令名。比如创建.claude/commands/review.md,你在 Claude Code 里输入/review就会触发对应逻辑。
命令里最灵活的地方在于参数机制。基础写法是$ARGUMENTS,它会把/review 后面输入的所有内容原样传给命令;更精细的用法是用$1 $2这类位置参数,适合需要固定参数顺序的场景。你还可以在命令中写$1时指定描述,帮助模型理解每个参数该填什么。实际使用中,$ARGUMENTS` 最常见,因为场景化描述往往是自然语言,位置参数适合“文件名 + 检查项”这种固定结构。
3.2 三类高频命令的完整模板
我先放一个代码审查命令:.claude/commands/review.md
请对用户指定的代码进行审查。审查范围:$ARGUMENTS 审查要求如下: 1. 先定位改动涉及的核心逻辑,说清楚这段代码的业务用途。 2. 按顺序检查以下维度: - 可读性:命名是否清晰、函数是否过长、有没有明显重复代码 - 健壮性:边界条件、异常处理、空值判断是否完整 - 安全性:是否有 SQL 注入、路径穿越、敏感信息硬编码 - 性能:有没有不必要的循环、重复查询、大对象拷贝 - 并发:是否存在共享状态修改、资源竞争 3. 每发现一个问题,按严重程度分组输出:必须修复 / 建议优化 / 仅做提醒。 4. 对每个“必须修复”的问题,直接给出修改后的代码片段,不要只讲原理。 5. 最后用三句话总结本次审查的总体结论,方便我尽快决定是否合并。 注意:项目完整规范和架构约束见 CLAUDE.md,请结合其中的约定进行判断。这个命令模板看起来很长,但它完整定义了一个稳定的审查流程。好处是团队任何成员执行/review,得到的审查报告格式一致,不会出现“这个人让 AI 只查了语法,那个人让 AI 写了长篇小说”的混乱。实际用下来,代码审查的产出稳定多了。
再放一个生成提交信息的命令:.claude/commands/commit.md
请根据当前的 git diff 生成一条符合 Conventional Commits 规范的提交信息。 命令格式:/commit <scope> 需要生成的提交信息必须包含三部分: - type:fix / feat / refactor / docs / test / chore,根据改动内容判断。 - scope:使用 $1 参数提供的模块名,例如 api, cli, utils。 - subject:不超过 50 个字符,用祈使句简短描述主要变更。 额外要求: - 如果 diff 里同时出现 bug 修复和新功能,按优先级拆成多条提交信息。 - 说明正文(body)最多写三条,分别解释“为什么改”“影响范围”“潜在风险”。 - 不要写无意义的“update”或“fix bug”,要具体到行为。 $ARGUMENTS执行/commit api,AI 就会明白这次提交的范围限定在 api 模块,输出一个符合规范的提交信息模板,我只要看一眼把多余内容删掉就能提交。
还有一个排查问题的高频命令:.claude/commands/debug.md
请帮助定位并修复以下报错。 报错信息: $ARGUMENTS 排查步骤: 1. 根据报错堆栈,判断是运行时错误、类型错误还是依赖缺失。 2. 先检索相关代码:只定位出错的文件、函数和调用链,不要扩大到无关模块。 3. 给出出错原因分析,最多四条,按可能性排序。 4. 对每个可能原因,给出验证方式,优先选日志输出或最小复现脚本。 5. 确定根因后,给出完整修复代码,并指出修改涉及的文件和行号。 6. 最后提一句对应的测试用例应如何补充,防止回归。 如果信息不足以定位,直接告诉我需要补充哪些上下文,不要瞎猜。3.3 命令模板里怎么放上下文,才不会重复造轮子
命令文件里不需要重复写一遍项目背景和技术栈,这些信息在启动时就已经从 CLAUDE.md 加载了。命令只负责定义“当前这个任务怎么干”,背景知识让模型自己去查。如果你的命令模板里发现有大段和 CLAUDE.md 重复的内容,那说明背景文件和命令文件划分得不对,建议把公共约定收敛回 CLAUDE.md。
另一个容易忽略的点是:命令文件同样支持环境变量读取,比如项目本身的配置文件、API 地址等,可以在命令里说明“优先读取 .env 中的 DATABASE_URL”。这里有个实操经验,如果你在命令里要引用环境变量,尽量用描述性的方式,而不是把真实密钥写进去。模板是共享文件,仓库里一旦混入敏感信息,损失远比想象中的大。
还有一个小技巧:命令文件的开头可以用注释或说明块写上命令用途,因为某些情况下模型在读命令模板时会先判断“这是什么指令”,清晰的意图说明能降低误触发概率。对,模型确实会读这些说明,好的命令模板应该像一份小型任务简报。
4. 从零搭建一套可复用的模板库,附实操记录
4.1 规划目录结构:项目模板和命令模板分开
单一项目里放 CLAUDE.md 和 .claude/commands 只是第一步。如果你要在团队里推广 Claude Code,或者你手里同时维护多个项目,最好建立一个独立的模板库,用 Git 管理,然后在项目里引用。这样规范升级一次,所有项目都能同步受益。
我的模板库一般长这样:
claude-templates/ ├── README.md # 模板库的使用说明和目录导航 ├── project-templates/ │ ├── python-fastapi/ │ │ ├── CLAUDE.md # 适用于 FastAPI 项目的背景模板 │ │ └── .claude/commands/ │ │ ├── review.md │ │ ├── commit.md │ │ └── debug.md │ ├── node-nestjs/ │ │ ├── CLAUDE.md │ │ └── .claude/commands/ │ └── rust-cli/ │ ├── CLAUDE.md │ └── .claude/commands/ ├── shared-commands/ │ ├── review.md │ ├── commit.md │ └── write-tests.md └── scripts/ └── init-templates.sh # 一键把模板复制进目标项目的脚本这样组织有两个好处:一是每个技术栈有自己独立的技术栈模板,二是通用命令从技术栈模板里抽出来,在 shared-commands 里统一维护,一次修改,所有项目受益。
init 脚本的作用是自动化复制。我用了一段简单的 shell 脚本:
#!/usr/bin/env bash # 用法:./init-templates.sh python-fastapi /path/to/target-project TEMPLATE_DIR="$(cd "$(dirname "$0")/../project-templates/$1" && pwd)" TARGET_DIR="$2" if [ ! -d "$TARGET_DIR" ]; then echo "目标项目不存在:$TARGET_DIR" exit 1 fi cp "$TEMPLATE_DIR/CLAUDE.md" "$TARGET_DIR/CLAUDE.md" mkdir -p "$TARGET_DIR/.claude/commands" # 复制共享命令与项目特定命令 cp "$TEMPLATE_DIR"/.claude/commands/*.md "$TARGET_DIR/.claude/commands/" 2>/dev/null cp ../shared-commands/*.md "$TARGET_DIR/.claude/commands/" 2>/dev/null echo "模板初始化完成,请检查以下文件:" ls -la "$TARGET_DIR/CLAUDE.md" "$TARGET_DIR/.claude/commands/"脚本虽然简单,但解决了“手动Copy容易漏文件”的问题。团队新人拿到模板库,跑一条命令就能把整套规范注入自己的项目,不需要懂 Claude Code 的读取机制,降低了使用门槛。
4.2 从零到一个成熟模板库的关键决策
单独看模板文件都容易写,难的是定结构。我在搭这套模板库时,做过几个关键决策,可以分享一下。首先,是否让模板库保持“技术栈中立”?我的结论是分两类:纯通用的命令(比如 commit、review)放在 shared-commands,不依赖具体技术栈;而 CLAUDE.md 必须按技术栈拆分,因为 Python 项目和 Node 项目的架构约束完全不一样,一份通用背景文件到了具体项目里会产生大量无效信息,影响模型判断。
其次是版本管理策略。模板库本身是 Git 仓库,我用语义化版本号打 tag,项目里通过子目录引用模板文件,没有用 git submodule,因为会让普通开发者多一步操作。团队内部采用“复制不引用”的策略:初始化时把模板文件复制到项目里,后续模板升级时再按需同步。这样项目之间还是独立的,避免一个项目升级模板后影响另一个项目的稳定性。
最后是模板里的变量替换。比如每个项目有自己的服务端口、依赖包名,我直接用 init 脚本配合sed做占位符替换:
# 把 {{PROJECT_NAME}} 替换成真实项目名 sed -i "s/{{PROJECT_NAME}}/$PROJECT_NAME/g" "$TARGET_DIR/CLAUDE.md"这个细节很实用。模板文件里写的是抽象名,复制到具体项目里替换成真实信息,避免出现模板库里的占位符泄漏到项目里。
4.3 模板还能干一件事:生成新模块脚手架
CLAUDE.md 和命令模板解决的是“已有项目如何用好 AI”,但模板库还有一类特殊用途:生成新模块、新项目的脚手架。举个例子,我经常需要在新项目里快速生成带 API 路由、Service、Repository 三层的 Python 模块,手工敲一遍浪费大量时间。这时候单独写一个脚手架命令:
.claude/commands/new-module.md
请根据以下要求,为一个 FastAPI 项目生成一个完整的新业务模块。 模块名称:$1 模块职责(一句话描述):$2 目录结构如下: - app/routers/$1.py — 定义该模块的所有 HTTP 端点 - app/services/$1_service.py — 放置核心业务逻辑 - app/repositories/$1_repository.py — 封装数据库查询 - tests/test_$1_api.py — 针对该模块接口的 pytest 测试 要求: - 路由层只做参数解析和校验,调用 service 层接口 - service 层负责业务规则,禁止直接操作数据库会话 - repository 层使用 SQLAlchemy 的 Session 类型,并实现基础的增删改查 - 每个接口必须有 Pydantic 请求、响应模型,字段命名遵循现有风格 - 测试文件使用 FastAPI TestClient,覆盖正常流程和至少一个错误流程 - 生成完代码后,列出所有创建的文件和需要手动补充的 TODO 项执行/new-module user 用户注册与资料管理,它就能直接生成一套带测试的模块代码。相比每次手动描述目录结构和分层,模板把流程固定下来后,输出的代码稳定在一个可控的框架里,我只需要做业务逻辑部分的补充和调整。这个用法,本质上是把 AI 从一个“问答工具”提升为“带产线的编码工人”。
这对我个人来说是目前模板最大的价值:团队里新人上手新模块开发时,遵循模板生成的代码风格和大家手写的老代码保持一致,减少了大量代码 Review 时的风格争论。
5. 使用模板后踩过的坑:问题与排查清单
5.1 模板不生效,先从这四步查起
无论 CLAUDE.md 还是命令,最常见的坑就是“写了没效果”。我自己排查出四条路径,按顺序执行通常能解决问题。
第一,看文件名和路径。CLAUDE.md 必须是大写,放在项目根目录或者正确的子目录下。命令模板必须放在.claude/commands/目录下,后缀是.md,文件名不能有空格。目录名.claude前面有点,别漏了。
第二,重启会话。Claude Code 的模板加载发生在会话启动时,你编辑了文件但当前会话不会自动重新读取,必须重启会话或新开一个对话。很多“怎么改了没反应”的情况,其实就是没重启,浪费时间。
第三,确认文件是不是 UTF-8 编码。尤其是从 Windows 自带的记事本保存的文件,默认可能是带 BOM 的 UTF-8 或者 GBK,模型读取时可能出现解析异常。我的做法是统一用 VS Code 或命令行工具保存为 UTF-8 without BOM。
第四,检查命令是否真的被识别。直接在对话框输入/,看看下拉菜单里有没有你刚创建的命令名称。如果没有,大概率是文件路径错了。如果命令出现了但内容没生效,可以在命令文件第一行加一句明确指令,比如“执行此命令时,严格按照本文件所有规则执行,不要忽略任何一条”,能有效减少模型“选择性失明”的情况。
5.2 命令输出与预期严重不符,原因通常有两个
第一个原因是命令模板和其他模板冲突。比如 CLAUDE.md 里写着“所有接口都要在 routers/ 下定义”,但命令模板里恰好写了一个反例,模型在冲突规则前会蒙圈。排查方式是逐条对照,确保命令文件没有和背景模板产生规则冲突。
第二个原因是参数解析问题。$1和$2只按空格切分,如果参数本身包含空格,位置参数就会错位。比如/new-module user 用户注册 与 资料管理,$2只会取到“用户注册”,后面的“与”“资料管理”会被当作多余参数丢掉。解决办法是收紧参数定义,尽可能用$ARGUMENTS接收自然语言描述,或者要求用户把带空格的参数用引号包裹起来。
还有一个容易被忽略的问题:模板里写了命令,但你所在的系统是 Windows,路径分隔符和 shell 行为会不一样。比如我团队里有人在 Windows 上用 Git Bash 跑 init 脚本,cp命令和 Linux 有细微差别,脚本里最好统一用相对路径,并提前测试一遍跨平台行为。
5.3 上下文被模板撑爆,信息收不回来
这是我把模板写大之后付出的最惨痛代价。CLAUDE.md 越写越长,命令模板也越堆越多,最终结果是:一个会话刚建立,上下文已经被吃掉大半,后续代码生成的质量明显下降。模型会频繁“忘记”前面的指令,回答开始变得模棱两可。
要解决这个问题,我从三个方向入手。第一,给 CLAUDE.md 设置硬性长度上限,一般控制在 80 到 120 行之间,超过就拆冗余。第二,把低频使用的背景说明独立到 docs 目录,需要时让模型主动去翻,而不是启动就全量加载。第三,命令模板保持“短小锋利”,只放任务特定的流程,不放项目背景。能放进 CLAUDE.md 的公共信息,就不要在命令文件里重复一遍。
下面是我整理的常见问题速查表,直接照着做就好:
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| CLAUDE.md 内容不生效 | 文件名大小写不对,或目录层级错误 | 改为全大写 CLAUDE.md,放在项目根目录 |
| 改了模板但没变化 | 当前会话未重新加载 | 重启会话,或新开对话 |
| 中文内容乱码 | 文件编码不是 UTF-8 | 另存为 UTF-8 without BOM |
命令不显示在/列表里 | .claude/commands 路径错误 | 确认目录名和文件名拼写 |
| 命令执行时忽略部分要求 | 模板内规则冲突 | 检查 CLAUDE.md 和命令文件是否矛盾 |
| 上下文迅速耗尽,回答变差 | 模板文件过长 | 精简模板,拆出低频文档 |
| 位置参数和预期不符 | 参数包含空格 | 换用 $ARGUMENTS 或要求加引号 |
5.4 一个值得单独说说的经验:别让模板变成团队争论的战场
模板一旦成为团队共享文件,就会引发一个非常现实的问题:谁来维护、标准谁来定。早期我把模板库挂在团队仓库里,大家谁都可以改,结果一周之后,CLAUDE.md 被人加了一堆互相矛盾的规则,命令模板也五花八门。后来收紧了权限:模板库由核心维护者负责,普通成员只能提 PR,合并前必须有至少一个其他成员 Review。虽然流程重了一点,但模板库的稳定性明显改善。
另一个经验是:模板要定期“复盘”。我每个迭代结束后,会翻一遍最近和 Claude Code 的对话记录,把重复出现的问题和优秀答案提炼回模板里。比如测试命令总是被模型写成pytest tests/,但项目里部分测试需要先跑初始化脚本,我就把这个注意点写进 CLAUDE.md。这样下一次它就不会再犯同样的错误。模板不是一次性写好的文档,它是活的,跟着项目一起迭代。
最后,一个很容易被忽略的小技巧:你可以在命令模板里明确要求“如果本命令与项目实际情况不符,请先指出冲突点,再按你认为正确的方向执行,并说明理由”。这听起来像是给模型开后门,但实际效果是:当模板里某个规则已经过时,模型不会死板地遵循,而是会提示你。毕竟模板是固化的约定,代码库却一直在变,留一个“反馈机制”比让模型盲目服从更靠谱。
我个人实际用下来最深的体会是:模板真正带来的改变,不是单次任务的成功率,而是把团队里那些隐性的、散落在老员工脑子里的项目约定,顺顺当当搬到了显性的文件里。新来的同事也好,随时被召唤的 AI 助手也好,都能在同一套约定下工作,这种确定性非常值钱。如果你也打算上手 Claude Code,别急着追求花哨的命令,先从一份不超过 100 行的 CLAUDE.md 开始,把最关键的背景和规矩写清楚,跑两天之后再看对话质量的变化,你会回来感谢自己今天的这个决定。