做 CLI 工具的人大概都有过这种经历:代码写完了,换台机器、隔一周再打开终端,一切都要从零开始。AI 编程助手也一样——我最早用 Claude Code 的时候,每一个新会话都在重复解释同一个项目的背景、技术栈、代码规范、测试命令,说得口干舌燥,输出质量却还是看运气。后来我把这套经验整理成了一个叫claude-code-templates的模板库,把那些重复的上下文、任务流程和约束条件全部固化成文件,效果可以说是天壤之别。
这篇文章就是把我的整套模板库设计思路、文件写法、踩坑经历,以及实测对比完整地拆开讲给你。不管你是刚接触 Claude Code 的新手,还是已经被"每次会话都要重新描述项目"折磨过一段时间的重度用户,这里面都有可以直接抄作业的内容。
1. claude-code-templates 到底在解决什么问题
1.1 每次会话都在"失忆"的痛
Claude Code 默认是无状态的。它不像一个常驻后台的编辑器插件,不会自动记住你上周说过"这个模块线上跑的是 Java 17,测试必须用 JUnit 5"这类信息。每次打开新会话,它都是白纸一张。
我在维护一个多模块的 Maven 项目时体会特别深。这个项目有五个子模块,核心业务逻辑在core模块,web模块只是薄薄一层接口壳。每个新会话开头,我都要花两三百个 token 把这句话重新说一遍。说少了不行——有一次我忘提core模块的循环依赖约束,Claude Code 兴致勃勃地帮我重构了一个类,结果把service和repository之间的依赖方向写反了,整个模块编不过去。
所谓的模板,本质上就是把项目知识外置成文件。你不需要每次都用自然语言回忆和复述,Claude Code 会在启动时自动读取工作区里的模板文件,把项目记忆、技术约束、命令规范一次性注入到上下文里。人脑记不住的东西,文件能记住;人每次复述会漏的东西,文件不会漏。
1.2 模板不是"提示词"那么简单
很多人的第一反应是:模板?不就是写好一段提示词复制粘贴吗?
只对了一半。提示词确实是最基础的一层,但一个完整的模板体系远超提示词的范畴。我把它拆成四个层面,各管一段:
| 模板类型 | 作用范围 | 典型载体 | 注入时机 |
|---|---|---|---|
| 项目记忆模板 | 整个仓库 | CLAUDE.md | 会话启动自动加载 |
| 任务流程模板 | 单个任务 | prompts 目录下的 markdown | 按需调用 |
| 可复用技能模板 | 跨项目能力 | SKILL.md + 示例代码 | 按需调用 |
| 快捷命令模板 | 高频操作 | 别名与斜杠命令 | 手动触发 |
这四个层面互补。CLAUDE.md 管的是"这个项目是什么、有什么规矩",任务流程模板管的是"这类活应该怎么干",技能模板管的是"这个能力包怎么用",快捷命令则是把前三种里最高频的动作变成一句话触发。
1.3 什么时候值得开始建模板
模板不是银弹,也不是所有项目都需要。我自己的判断标准是三条:
- 同一个项目的会话频次超过 5 次,说明你会反复和 Claude Code 打交道;
- 项目生命周期超过一个月,知识会积累、约束会增多,值得固化;
- 有团队成员一起用,模板是团队知识的载体,而不是个人备忘。
临时 demo、一次性脚本,不值得花时间建模板。长线项目、核心业务仓库、多人协作的代码库,模板的价值会随着会话次数呈指数级增长。
2. 核心模板逐个拆解:从 CLAUDE.md 到 Agent Skills
2.1 CLAUDE.md:项目的"长期记忆"主文件
CLAUDE.md 是 Claude Code 的主配置文件,放在工作区根目录下。会话启动时,它会自动读取这个文件,把里面的内容注入上下文。这是整个模板体系的入口,也是最重要的一个文件。
但注意,CLAUDE.md 不是让你把项目文档抄一遍。它应该是一份给 AI 的简报,重点写那些模型靠代码本身猜不到、或者容易猜错的信息。我常用的结构是这样:
# 项目概述 支付网关服务,负责交易路由与对账。 模块关系:api 模块负责入站 HTTP,core 模块包含全部业务逻辑,dal 模块只允许被 core 依赖。 # 技术栈 - Java 17 + Maven 多模块 - Spring Boot 3.2 - 数据库 MySQL 8,禁止使用存储过程 # 常用命令 - 全量构建:mvn clean package -DskipTests - 单测:mvn test -pl core -Dtest=TransactionServiceTest - 启动本地环境:mvn spring-boot:run -pl api -Dspring-boot.run.profiles=local # 代码规范 - Service 层不允许直接持有 DataSource - 所有金额字段使用 BigDecimal,禁止 double - 新方法必须带 @Transactional 语义说明,不加隐式事务 # 架构约束(高频踩坑点) - dal 模块不得向上依赖 core - 异常必须转成 BizException 抛给上层,不裸抛 RuntimeException - 对账模块的幂等键统一用 outTradeNo + channel 拼接这里每个条目都有目的。技术栈部分是为了防止模型生成与项目无关的依赖或语法;命令部分是让它频繁操作时不用问你;规范和架构约束则是把那些最容易踩的坑直接前置,省得它踩进去再被 CI 弹回来。
2.2 提示词模板:把任务流程固化下来
CLAUDE.md 解决"项目是什么",但"活怎么干"还要靠任务层模板。这一层我放在prompts/目录下,按任务类型拆文件,例如code-review.md、tests-generation.md、refactor.md。
以代码审查模板为例,它解决的一个核心痛点是:代码审查的输出质量极其依赖你给的审查维度。只说一句"帮我看看这段代码",模型通常只挑明显的语法错误和风格问题,发现不了业务漏洞。我的审查模板长这样:
你是一位资深代码审查者。针对我提供的 diff,按以下维度逐项审查: 1. 正确性:是否存在并发竞态、空指针、资源泄漏、事务边界错误。 2. 幂等性:接口是否幂等,重复调用会有什么后果。 3. 可测试性:核心逻辑是否与 IO 解耦,是否能单元测试。 4. 安全性:是否有注入、越权、敏感信息泄露。 5. 性能:是否存在 N+1 查询、重复计算、不必要的全表加载。 输出格式: - 按严重程度分级列出问题 - 每个问题给出文件位置、问题描述、最小修复示例 - 如果没有问题,明确说"未发现问题",不要含糊带过这套模板用了几十次之后,我的体感是审查质量至少提升了一个档。原因很简单:你给模型规定了审查的透视镜角度,它就不会在细节里迷路。
2.3 Agent Skills:把复杂操作封装成可复用的能力包
Claude Code 的 Skills 机制(Agent Skills)是后期版本的一个重要能力,我觉得它是模板体系里最容易被低估的一层。它的本质是:把一个带上下文的操作流程封装成一个独立技能包,按需加载。
一个 Skill 通常是一个目录,里面包含SKILL.md、示例代码、参考文档等。以我写的一个"升级依赖"技能为例:
# SKILL.md ## 名称 dependency-upgrade ## 描述 安全升级指定 Maven 依赖到目标版本,处理 API 变更与破坏性影响。 ## 使用场景 当用户提到"升级某个依赖"或"更新 guava 版本"时使用。 ## 执行流程 1. 定位 pom.xml 中当前版本与目标版本。 2. 检查目标版本的 release notes 和 breaking changes。 3. 升级后执行 mvn dependency:tree 核对传递依赖。 4. 运行核心模块测试,重点关注 API 变更点。 5. 输出变更摘要,标注不兼容的 API 位置。这个 Skill 目录下还有example/文件夹,放了两个真实的升级 diff 示例,模型在调用技能时可以参照。相比在对话里临时描述"帮我升级一下 guava",Skills 的好处是执行路径固定、判断标准明确、结果格式可预期。尤其适合那些你不想每次重复叮嘱的操作。
2.4 斜杠命令:把高频操作变成一触即发
最后一个层次是命令别名。Claude Code 支持用配置文件注册斜杠命令,本质上是把常驻在 CLAUDE.md 里的规范或 prompts 目录里的任务模板包装成一个快捷入口。
我最常用的两个命令:
# .claude/commands/commit.md 运行 git diff,根据 CLAUDE.md 中的提交规范生成符合 Conventional Commits 格式的提交信息。 要求: 1. type 必须选自 feat / fix / refactor / docs / test / chore 2. scope 填写模块名 3. 正文描述变更动机,不超过五行 4. 不要直接执行提交,把信息展示给我确认# .claude/commands/explain.md 针对我提问的符号或模块,用三步解释法回答: 1. 一句话说明它是什么,类比生活场景。 2. 拆解它的工作原理,逐行说明关键代码。 3. 指出它可能的设计边界与替代方案。斜杠命令的价值在于把模型的行为模式固化成可预期的入口。团队里每个人都用/commit,生成出来的提交信息风格就统一;每个人都用/explain学习新代码,知识传递的节奏也一样。
3. 手把手搭建自己的模板库:目录设计、写法与版本管理
3.1 先从目录设计开始
模板库不是把几个 markdown 文件随便扔进仓库。我推荐放到项目根目录下的.claude/文件夹里,和源码一起走版本控制。目录结构大致如下:
.claude/ ├── CLAUDE.md # 项目记忆,会话自动加载 ├── commands/ # 斜杠命令集合 │ ├── commit.md │ └── explain.md ├── prompts/ # 任务模板集合 │ ├── code-review.md │ ├── tests-generation.md │ └── refactor.md ├── skills/ # 技能包目录 │ └── dependency-upgrade/ │ ├── SKILL.md │ └── examples/ └── scripts/ └── render-template.sh # 变量替换脚本放在.claude/里有两个好处:一是和项目源码同仓,模板跟着代码走,分支切换时模板不会错乱;二是团队协作时不用额外同步,Pull Request 会自然地把模板变更也提交上来。
3.2 CLAUDE.md 的写法:信息密度决定上下文质量
CLAUDE.md 不是越长越好。上下文窗口是有限的资源,你塞进去 3000 行的废话,模型反而抓不住重点。我的原则是只写那些"不写会出错"的东西。
写之前先问自己三个问题:这个项目最常被搞错的依赖方向是什么?哪个测试命令新人不查文档绝对猜不到?哪个业务规则反直觉到连老手都会踩坑?把这三个问题的答案写进去,就够用了。
还有一个值得刻意练习的写法:命令区用可复制的一行命令,而不是描述性的说明。比如写mvn test -pl core -Dtest=TransactionServiceTest,不要写"运行 core 模块下 TransactionServiceTest 的测试"。前者模型可以直接执行,后者它还需要自己猜测具体命令,猜错了就是一轮多余的试错。
3.3 模板参数化:让一份模板适配多个场景
任务层模板最容易犯的毛病是写死场景。比如代码审查模板,如果每个项目都有一份 copy,维护成本会非常高。我后来在模板里引入了变量占位符,用脚本统一渲染:
# prompts/code-review.md.tpl 你是一位资深 {{tech_stack}} 开发者,请审查 {{module_name}} 模块的代码变更。 重点检查: - {{business_rule_1}} - {{business_rule_2}}配合一个简单的 bash 脚本做替换:
#!/bin/bash # render-template.sh # 用法:./render-template.sh prompts/code-review.md.tpl "tech_stack=Java 17" "module_name=core" TEMPLATE_FILE="$1" shift content=$(cat "$TEMPLATE_FILE") for kv in "$@"; do key="${kv%%=*}" value="${kv#*=}" content=$(echo "$content" | sed "s|{{${key}}}|${value}|g") done echo "$content"这样一份模板可以通过参数适配不同的模块和业务规则。当然,参数别搞太多,超过五六个占位符的模板本身就该拆分了。
3.4 模板的评审与版本管理
我把模板当成一等公民来维护。每次修改模板,都要像改代码一样走评审。评审关注三个点:
- 模板里写的约束是否仍然成立?项目升级了框架,旧的架构约束可能已经失效;
- 是否有新的高频踩坑点值得补充?
- 模板是否过度膨胀?上一版加的某条规范,实际使用中从没触发过,就该删掉。
版本管理方面,我习惯在模板文件头部加一小段变更记录:
# 变更记录 ## 2025-06-10 - 补充 dal 模块禁止向上依赖的架构约束 - 移除了过时的 Hadoop 相关命令这段记录不占多少 token,但对排查问题很有帮助。当模型行为突然变得怪怪的,先翻一下 CLAUDE.md 最近改了什么,通常能快速定位。
4. 实战验证:用一套模板把旧项目重新"跑通"
4.1 场景:接手一个遗留 Spring Boot 项目
为了验证模板库的真实价值,我做了一次对照实验。场景是接手一个自己两个月没碰过的 Spring Boot 项目,里面有一些不常见的约束:定时任务必须走独立的schedule模块,不能乱塞进core;所有外部接口调用必须通过feign包的 wrapper,禁止直接用RestTemplate。
第一轮,我完全不用模板,直接新开会话,说"帮我看看这个项目的结构,然后修一下测试"。结果是灾难性的:模型把RestTemplate加进了新代码里,还把一个定时任务塞进了core模块,两次都是踩了项目里本来就写好的雷。
第二轮,我在工作区里放了一份精心维护的 CLAUDE.md,把上述两条约束写得明明白白。然后开新会话,说同样的话。这次模型在生成代码前特意停下来确认:"根据 CLAUDE.md 的约束,外部调用需要通过 feign wrapper,请问你的新代码走的是哪个接口?"——这就是模板注入上下文的价值。
4.2 三次实测的量化对比
我连续测了三次,统计了几个指标:
| 指标 | 无模板 | 有 CLAUDE.md | 有完整模板库(含 prompts 和 skills) |
|---|---|---|---|
| 达到预期结果的平均对话轮次 | 7.3 | 4.0 | 2.7 |
| 因架构约束被 CI 弹回的次数 | 2.0 | 0.3 | 0 |
| 平均 token 消耗(估) | 基准 | 约 70% | 约 55% |
轮次的减少很明显。没有模板时,模型经常做错方向,你要花额外轮次去纠正;有模板时,它在第一轮就把项目约束内化了。
token 消耗降低的原因也很有意思:虽然模板本身占用了上下文,但它省掉了大量重复纠错和重试的开销。一次错误的代码生成消耗的 token,往往比一份 CLAUDE.md 还多。
4.3 从工具使用到工作流重塑
量化数据之外,我更在意的是工作流层面的改变。以前打开 Claude Code,我的心态是"这次能不能碰到靠谱的 AI";现在打开,我的心态是"我有一份配套齐全的模板,这次它基本不会乱来"。
这种确定性带来的价值很难量化,但对日常开发的幸福感影响是巨大的。模板库让 AI 编程助手从一个"偶尔惊艳的实习生"变成了"稳定可预期的协作者"。这也让我开始重新审视:AI 编程的上限由模型决定,但下限由你的上下文工程决定。模板就是在给这个下限兜底。
5. 模板工程的边界与反模式:我踩过的坑
5.1 模板臃肿:把上下文撑爆的教训
我第一次建模板库时犯过一个典型错误:把项目 wiki 里的技术选型文档、接口设计草案、历史决策记录全部复制进 CLAUDE.md。结果上下文被撑得很大,模型每次读完模板要花很多精力,反而抓不住重点。
后来我学会了一个原则:模板里只放"决策",不放"讨论"。技术选型的结论("用 PostgreSQL 不用 MySQL")要放,但选型时的对比分析不用放。接口设计的当前方案要放,但历史草案删掉。这样 CLAUDE.md 从 400 行降到了 60 行,效果反而更好。
5.2 过度抽象:为模板而模板的自我感动
还有一个陷阱是追求模板的"完备性"和"通用性"。我一度想把 prompts 做成一个适配所有项目的万能模板集合,结果做出来的模板每个项目都能用,但每个项目都觉得不够贴合。
正确做法是按项目沉淀,而不是按幻想沉淀。让模板从真实的项目痛点里长出来——你在这个项目里踩了三次 N+1 查询的坑,那就在 CLAUDE.md 里加一条约束;你在那个项目里从来没有被并发问题困扰过,就完全没必要加并发检查项。模板库的核心价值是解决真实问题,不是证明模板工程能力。
5.3 模板腐化:不维护的模板就是定时炸弹
模板和代码一样有腐化问题。项目升级了 Spring Boot 3.2,但 CLAUDE.md 里还留着 Spring Boot 2 的限制性规范,模型每次都会按旧规范办事,你还要额外解释"这条不算了"。
我建议把模板维护纳入日常开发流程。每次升级依赖、每次重构重大模块、每次踩到一个值得记录的新坑,顺手更新一下模板。不用专门安排时间,但要养成习惯。我在实践中养成了一个自查问题:"如果现在重新开一个会话,这个模板能不能让我少踩一个坑?"能,就说明值得更新;不能,说明加了也是凑数。
5.4 进阶方向:分层注入与自动化校验
模板体系的下一步优化,我目前在做两件事。
一是多层模板注入。CLAUDE.md 是全局记忆,但不同任务需要不同视角。我尝试在prompts/下按领域分目录,比如prompts/backend/、prompts/frontend/,在任务开始时只注入相关的子模板,而不是全部灌进去。
二是模板有效性校验。我正在写一个脚本,定期检查 CLAUDE.md 里的命令是否还能跑、约束是否已经被项目代码覆盖,避免模板无效规则残留。这个脚本还可以接入 CI,模板一变更就自动几项烟雾测试,确保模板本身是可用的。
最后的一点实在体会
我花在 claude-code-templates 上的时间,最终都从节省的试错轮次里加倍赚回来了。最开始我以为自己在给 AI 写说明书,后来才意识到,我其实是在给项目建一座"外部记忆仓库"——让每一次新会话都不必重新发明一遍轮子。如果你也经常和 Claude Code 打交道,我真心建议从最小的 CLAUDE.md 开始,先记录三个最容易踩坑的点,用起来再慢慢加;别等模板完美了才用,而要让它跟着你的项目一起生长。对你来说最有用的问题只有一个:下一次新开会话时,你希望它别忘了哪件事?写下来,那就是你的第一个模板。