用 Claude Code 写代码这件事,我前后折腾了两个多月。最开始就是把它当成一个附赠上下文能力的终端助手:打开项目目录,把问题往对话框里一贴,让它生成函数、补测试、修修 bug。后来慢慢发现,同样一个工具,裸用和带着模板用,产出的质量差距相当大。这也就是 claude-code-templates 这个项目的由来——我把日常开发里反复要用到的 Claude Code 指令,沉淀成一套可复用的模板文件,让它换到哪个仓库、哪个语言,都能输出稳定水准的代码结果。这篇文章我会把模板的设计思路、目录结构、几个可以直接抄走的模板示例,以及我在真实项目中踩过的坑,完整过一遍。想认真用 Claude Code 而不是随手玩玩的开发者,应该都能从中拿到一些能落地的经验。
1. 为什么需要给 Claude Code 准备模板
1.1 裸用 Claude Code 时最疼的几个点
先说裸用。这里说的"裸用",指的是不建模板、不固化任何自定义指令,每次打开终端就在默认对话里直接输入需求。这种方式胜在灵活,但用得久了,会遇到几个非常现实的问题。
第一个问题是上下文重置。Claude Code 虽然能识别当前目录,但它并不天然知道你项目的技术栈、目录约定、测试框架、命名风格,每次都得重新告诉它:"这是一个 TypeScript 的 monorepo,前端是 React,后端是 Fastify,测试用 Vitest,别碰 generator 目录下的代码。"刚开始你还有耐心打,时间一长,要么啰嗦,要么漏了关键信息,模型就只能靠猜,猜错就是返工。我印象很深的一次,忘了告诉它项目里用了 pnpm 而不是 npm,它给我生成的 CI 步骤全是 npm 命令,整个流水线直接红了大半天。
第二个问题是输出格式不稳定。同样让它做代码审查,今天它给你一段流畅的总结,明天分条列出问题,后天直接改好了代码只附一句"已修复"。如果你需要的是规范化的审查清单,这种随机性会很折磨人。模型非常擅长模仿格式,但它默认会自己选一个最顺手的格式,而这个"顺手"不一定是你要的。我在团队里拉过一次测试,三个人用同一个仓库同一个问题去问,得到的三份答案结构完全不一样,开会复盘时根本没法对照。
第三个问题是能力漂移。没有约束的时候,Claude Code 会表现得过于激进。我说"把这个模块重构一下",它能顺手把不相关的文件也格式化一遍,或者自作主张把测试里的断言改掉。这种能力对老手来说还能接受,但对需要谨慎的代码库就是安全隐患。我在一个支付项目里,它一次重构顺手给我把日志脱敏逻辑删了一半,原因只是它觉得那段代码"冗余"。没有模板里的护栏,这类事情防不胜防。
最后还有一个容易被忽略的点:不可复用。你在 A 项目里好不容易用一大段话调教出一个最佳实践,到了 B 项目里一切从零开始。这种隐性成本久了会让大家觉得"AI 助手只是个玩具"。其实不是玩具,是没把它变成资产。
1.2 模板到底解决了什么问题
模板就是把这些每次都重复的"开场白"和"行为准则"固化下来,让 Claude Code 每次开工前先读一遍自己的纪律。
我自己的理解是:Claude Code 本身就像一个能力很强但记性不好的外包工程师。每次新开一个项目,他完全不记得上次你是怎么跟他配合的。模板就相当于一份员工手册,把该做什么、不该做什么、按规定交付什么写得清清楚楚,这样哪怕换了个新工程师,交接成本也能控制住。你不需要每次都手把手教他"你是个什么人、项目什么情况、完成标准是什么",手册替他记住了。
所以模板至少解决四个问题。一是稳定输出,格式、深度、语气在模板里约定好,结果可控;二是知识沉淀,团队里最好的用法可以沉淀成文件,而不是留在某个离职同事的终端里;三是一致协作,所有人用同一套模板,审查的标准、生成代码的风格、补测试的粒度都能对齐;四是低成本复用,换仓库、换项目,模板一拷过去就能用,不用每次重新措辞。这几条我每个都切身体会过,尤其是团队协作那一项,有了统一模板之后,大家互相 review 的代码风格明显一致了不少。
2. 模板的核心结构与设计要点
2.1 一段模板的骨架:角色、背景、约束、交付物
我后来把自己所有模板整理了一遍,发现它们骨子里都是同一个结构,四个部分:角色、背景、约束、交付物。不管你是让 Claude Code 写测试、做审查、重构代码,还是生成 commit message,这四个部分都能套。
角色是最容易被忽略的。同样是"帮忙审查代码","你是一名严格的代码审查员"和"你是一名有十年后端经验的资深工程师,正在做上线前的最后审查",产出的严格程度完全不一样。角色定义了模型模仿的对象和语气,相当于给它一个行为锚点。我自己试过,把审查模板里的角色从"专业代码审查员"改成"安全敏感的支付系统优化专家"之后,它发现数据校验问题的敏感度明显上了一个台阶。
背景是让模型不至于瞎猜的信息。项目类型、主要语言、测试命令、重点关注的目录、是否有 CI,这些都应该给到。不需要每次写模板时都填全,模板里可以留变量,运行时再注入。背景信息不一定要写进模板文件本身,可以让模板里注明"先阅读 README 和 package.json",让模型自己去拿,效果反而更好。Claude Code 本身具备文件读取能力,这个机制我后面会细说。
约束是最关键的护栏。明确写清楚"只读,不要修改任何文件""不要执行破坏性命令""不要改动测试断言""不要重排 import 顺序""不要删注释"等等。约束写得越具体,模型越不会发挥。我以前总觉得约束写太多会限制模型的能力,后来才发现绝大部分偏离预期的问题都不是能力不够,而是没有规则。规则就是模型的安全带。
交付物则规定了最终产物长什么样。要一份 Markdown 报告,还是要一个 diff 文件,还是直接改代码并运行测试?如果交付物不明确,模型会自己选一种方式,这也是输出不稳定的根源。我在模板里几乎都会指定交付物格式,比如"输出一份 Markdown 审查报告,包含问题清单、风险等级、修改建议"。
2.2 动态变量与上下文注入
模板如果写死,复用价值就大打折扣。所以我会在模板里用占位符,实际使用的时候再填充。比如{{项目类型}}、{{测试命令}}、{{目标文件}}。用的时候有两种常见方式:一种是把模板内容复制出来,手动替换占位符再粘贴到 Claude Code 里;另一种是用 shell 拼 prompt,直接通过 Claude Code 的命令行参数把模板内容和任务描述一起喂进去。
我一直用的是后一种,把模板当作 prompt 的骨架,动态拼进目标文件路径和具体任务。举个例子,执行claude -p "$(cat templates/review.md)" -- "目标是 src/payment/service.ts,测试命令是 npm test",模板内容就自动变成了这次任务的完整指令。这样模板本身不用存储任何具体仓库信息,保持通用,具体任务交给命令行参数去填充。
一个更聪明的做法是让模板告诉 Claude Code 自己先去读项目里的关键文件。例如模板里写"开始之前,请先阅读 README.md、package.json、tsconfig.json,了解项目结构和依赖,再开始工作"。这样就不用把背景全部塞进模板,模型读完文件之后能自己整理上下文。实测下来,让模型自己读书面材料比你在模板里用几百字描述项目背景要准确得多,因为文件里的信息不会因为你的转述而失真。
下面是几种常见模板的定位对比,我按自己的使用频率排了个序:
| 模板类型 | 核心目标 | 最关键的一条约束 | 典型交付物 |
|---|---|---|---|
| 代码审查 | 发现潜在 bug、安全问题、可维护性隐患 | 只读,禁止直接修改代码 | Markdown 审查报告 |
| 测试补全 | 补齐缺失的单元测试和边界用例 | 不要为了覆盖率造无意义断言 | 测试代码文件 |
| 重构辅助 | 在保持行为不变的前提下优化结构 | 禁止同时调整无关代码 | 变更后的代码和变更说明 |
| Commit 信息 | 生成符合约定的提交信息 | 严格按 Conventional Commits 格式 | 一段 commit message |
| 文档生成 | 从代码生成 API 文档/注释 | 不要编造不存在的参数 | Markdown 文档文件 |
这张表的核心意思是一句话:每类模板的目标越单一,约束越明确,效果越稳。我见过有人想写一个"万能模板",什么都能干,结果是什么都干不好。
3. 从零搭建一套能直接复用的 Claude Code 模板
3.1 目录结构与命名规范
我先说目录结构。我的模板仓库长这样:
claude-code-templates/ ├── README.md ├── review.md ├── test.md ├── refactor.md ├── commit.md └── docs.md命名用动词开头,让人一眼看出是干什么的。避免template1.md、111.txt这种名字,三个月后你自己都认不出来。每个模板的文件名就是它的使用场景:review 是代码审查,test 是测试补全,refactor 是重构,commit 是生成提交信息,docs 是生成文档。如果模板多了,再按二级目录分类,比如review/safety.md、review/performance.md。
每个模板文件头部,我会放一小段注释,写清楚这个模板的适用场景和必须提供的变量。这个习惯特别重要,因为模板迟早会被团队其他人拿去用,没有注释的话,对方根本不知道这个模板需要填什么。
# review.md # 用途:对指定文件做代码审查,重点关注安全和边界条件 # 输入变量:目标文件路径,测试命令3.2 能直接抄的代码审查模板
下面这份是我目前每天都在用的代码审查模板,直接抄走就能用。
你是一名有十年后端开发经验的资深工程师,擅长 Web 服务、支付系统和高并发场景。 现在需要对指定文件做一次上线前的代码审查。 背景信息: - 目标文件:{{FILE_PATH}} - 项目测试命令:{{TEST_COMMAND}} - 请先阅读 README.md 和 package.json,了解项目背景后再开始 审查时必须关注: 1. 安全问题:注入风险、敏感信息泄漏、越权访问、数据校验缺失 2. 边界条件:空值、溢出、超时、并发、重复请求 3. 异常处理:错误是否被捕获,是否暴露了内部信息 4. 可维护性:命名、函数复杂度、重复代码、过深嵌套 5. 性能隐患:大循环、不必要 IO、内存泄漏 约束: - 只允许阅读代码,禁止修改任何文件 - 禁止执行破坏性命令,禁止运行副作用较大的测试 - 不要重新格式化代码,不要提与目标文件无关的问题 交付物: 输出一份 Markdown 审查报告,结构如下: - 总体评价(100 字以内) - 问题清单:风险等级(高/中/低)、文件位置、问题描述、修改建议 - 值得肯定的设计(如果存在)使用方式是把模板内容存成文件,命令行里拼上具体参数:
claude -p "$(cat templates/review.md)" -- "目标文件是 src/payment/service.ts,测试命令是 npm test"这份模板里有几个关键设计。第一,角色定义成"资深工程师"而不是"审查员",产出的建议更容易落地而非泛泛而谈;第二,给了明确的风险等级分类,方便我们按优先级处理问题;第三,禁止修改文件,因为审查和修改是两件事,混在一起很容易让模型边审边改,结果报告没写好,代码还动了。
3.3 测试补全模板示例
第二个能直接用的模板是测试补全。代码审查是只读任务,测试补全则是写代码任务,所以约束部分完全不同。
你是一名熟悉 Vitest/Jest 的测试工程师。现在的任务是为指定代码文件补齐单元测试。 背景信息: - 目标文件:{{FILE_PATH}} - 测试命令:{{TEST_COMMAND}} - 请先阅读现有测试文件和目标文件,保持测试风格一致 编写测试时的要求: 1. 覆盖核心业务逻辑的正常路径 2. 重点补充边界条件:空输入、非法参数、超限值、异常抛出 3. 关注副作用:外部调用是否被 mock,数据库连接是否正确隔离 4. 每个测试用例必须有清晰的描述,说明在验证什么行为 约束: - 只修改测试文件,禁止改动被测源码 - 不要为了覆盖率硬编无意义断言 - 不要删除现有测试用例 - 断言必须真实有效,禁止写永远为真的空断言 交付物: 直接输出新增测试代码,并说明每个用例对应的业务场景。实际使用效果比我预期的好很多。原因是模板里强制它"先读现有测试文件",这让它模仿现有测试风格,而不是自创一套风格。补出来的测试放在项目里,第一感官就和原有测试非常协调,review 的人也不会觉得突兀。
使用方式和审查模板一样,把具体文件路径和测试命令拼进去。我一般会追加一句"请先运行现有测试,确认通过后再补充",这样它更清楚当前基线状态。
3.4 把模板挂到 CLAUDE.md 和斜杠指令里
每次敲一大串命令虽然比裸用好,但还是有点烦。所以我更喜欢的方式是,把最常用的模板做成 Claude Code 的自定义斜杠指令,这样在交互式对话里输入/review就能直接触发模板。
做法是建一个/project_dir/.claude/commands/目录,把模板文件放进去。以代码审查为例,我建.claude/commands/review.md,内容基本就是上面的审查模板,只是把变量部分改成"用户会在对话中提供目标文件路径和测试命令"。配置好之后,在 Claude Code 输入框中直接敲/review,它就会加载这个模板,然后再追加上你要审查的文件路径。不需要再记忆模板内容,也不用拼命令行参数,完全回到对话式交互,非常自然。
CLAUDE.md 是另一个关键文件。它相当于项目级的长期记忆,Claude Code 每次启动都会自动读取。我会把项目层面的稳定信息放在这里,比如技术栈、代码风格、常用命令,而不是把大段任务模板塞进去。CLAUDE.md 管的是"这个项目长期是什么样",模板管的是"这次任务具体要做什么",两者分工明确。常规的 REPL 流程里,这两者配合好之后,Claude Code 的行为会非常稳定。
4. 踩坑记录:模板不是写完就能用
4.1 模板越长,模型越容易摆烂
我最早写过一份八百字的"超级模板",试图把代码审查、测试、重构、安全规范全部塞进去。结果很惨:Claude Code 经常只执行后半部分,或者挑它最熟悉的部分执行,开头一大半角色和背景说明直接被忽略。长指令会导致注意力被稀释,模型会优先处理它最适应的任务类型,而不是完全按照你的顺序来。
复盘之后我把模板压缩到三百字以内,原则是:核心指令必须出现在显眼位置,长篇论述拆到单独文档里,让模板用一句话引导模型自行去读细节。比如"背景见 CLAUDE.md"和"详细规范见 docs/security-checklist.md",模型需要详细内容时会主动去读。压缩后的模板执行力明显回升,输出质量和稳定性都有肉眼可见的提升。
4.2 输出格式忽好忽坏怎么解决
格式不稳定的问题,大部分都出在交付物描述不够具体。之前我在测试补全模板里只写了"输出测试代码",模型有时直接修改文件,有时只给建议,有时输出测试代码的同时还把源码也改了。后来我改成明确指定"直接输出新增测试代码,不要修改源码",并规定好代码组织顺序,问题基本消失。
另一个技巧是给模型看一个"格式样本"。比如在审查模板开头放一句"参考格式:问题清单必须包含风险等级、文件位置、描述和建议"。有时候哪怕你写了很多说明,它还是不知道你想要什么样式,给一个具体示例比抽象描述有效得多。我现在在 commit 信息模板里就直接附上两个优秀示例,生成结果几乎没有再来回的。
4.3 权限和安全边界怎么捏死
Claude Code 具备执行终端命令的能力,这既是优势也是风险。模板里如果没有安全约束,它可能在你只想审查代码的时候,顺手跑一个格式化命令或者安装依赖。我踩过一次坑:让模型"优化测试性能",它直接改了 CI 脚本里的一段 shell 命令,差点把发布流程搞坏。
所以我在所有模板的约束区都写死了几条铁律:禁止执行破坏性命令,禁止修改 CI 配置,禁止删除历史记录,禁止自动 push,禁止改动锁文件。如果任务确实需要这些操作,我会在对话里单独授权,而不是让它自行决定。另外,Claude Code 自己的权限配置也要配合收紧,不要让 AI 助手拿到比日常工作所需更大的权限。安全边界这件事,宁严勿松。
4.4 模板在团队里的版本管理
模板一旦在团队里用起来,就不再是个人小工具,会变成团队资产。这个时候版本管理必须跟上。我的实践是模板跟随仓库一起放进 Git,每一个模板文件的改动都走普通的 PR 流程,让改动可追溯。命名上不要用review_final.md、review_newest.md这种东西,直接叫review.md,迭代靠语义化版本和历史记录来体现。
遇到最典型的问题就是有人改了模板之后,其他人还在用旧版本,结果两个人给出来的输出标准不一致。所以我会在 README 里写清每个模板的版本号和最近变更内容,谁改了模板,要在 PR 描述里说明影响范围。模板本身也被纳入代码审查流程,因为它直接影响 AI 助手的行为,反过来说,它就是团队工程质量的一部分。
最后再说一点个人体会。模板不是一次写好的,我的 review 模板到现在已经改了十几版,每次遇到一个好用的用法,就往里加一句;每次遇到模型跑偏,就往约束区加一条。关键是先跑起来,再迭代。这套 claude-code-templates 我现在每天打开终端都在用,你也可以先抄几个回去试试,用不舒服的地方按自己的习惯改,改着改着,它就变成你的了。