☰
claude-code-templates完全指南:从CLAUDE.md到钩子,固化AI行为基线
2026/10/17 5:53:55 网站建设 项目流程

我最早用Claude Code的时候,其实挺苦恼的。这个终端里的编程Agent确实能干活,但每次开一个新会话,你都得重新跟它解释一遍项目结构、技术栈、命令怎么写、代码风格是什么。解释得越多,它越听话;解释得少了,它就给你自由发挥,结果就是你得在代码审查环节花更多时间返工。后来我接触到claude-code-templates这个思路,才发现问题不在Agent本身,而在于我没给它一套稳定的“行为基线”。

所谓templates,说白了就是把Agent干活前需要知道的那些背景信息、规范、常用流程,全部固化成项目级别的模板文件。这样一来,不管会话开了多少次、团队换了多少人,Agent的行为都能保持在同一个基准线上。这篇文章我就把这套东西的完整玩法拆开讲清楚,从模板到底解决什么问题,到CLAUDE.md怎么写、斜杠命令怎么配、钩子怎么用,再到我自己踩过的坑,一次性聊透。

1. Claude Code模板到底解决什么问题

1.1 没有模板的时候,Agent开发有多痛

先还原一下没有模板的典型场景。你打开终端,敲一句“帮我看看这个项目的登录逻辑”,Claude Code确实能读懂代码,但它不知道你项目的构建命令是pnpm还是yarn,不知道你的代码风格是分号党还是无分号党,不知道你们约定提交信息要走Conventional Commits,更不知道哪些目录是生成出来的、绝对不能动。

这些信息它不是完全拿不到,而是每次都要靠对话去“挤”。我今天问一句、明天再问一句,同一个问题反复解释,效率低不说,最要命的是不一致。今天这个会话里解释得细一点,Agent的产出质量就高一些;明天那个会话里偷懒少说了两句,它就开始放飞自我。同一套代码库,两个会话跑出来的结果可能完全不一样,这对团队协作来说就是灾难。

我印象很深的一次是让Agent帮我重构一个API路由模块,第一次会话里我提到过项目用zod做参数校验,结果它老老实实用了zod;第二天新开会话我没提,它直接用TypeScript的interface定义类型,校验逻辑全丢了。问题不在Agent笨,而是你给它的“初始设定”变了。

1.2 模板的本质:把隐式上下文变成显式资产

Claude Code模板的核心价值,就是把这些每次都要重复口述的信息,变成实实在在的文件资产。它不再存在于某个开发者的脑子里,也不依赖于你每次会话的心情,而是存放在项目仓库里,Agent每次启动都会自动加载。

打个比方,这就像你新招了一个能力很强的工程师,但他性格比较随机。你不给他一份团队规范文档,他今天可能按你的偏好写代码,明天可能又按自己老东家的风格来。templates就是那份入职手册,里面写清楚了“我们这里怎么干活、用什么命令、有什么红线”,能力越强的工程师,越需要这种有效的约束。

在Claude Code的体系里,这份“入职手册”主要由几个层次组成:项目根目录的CLAUDE.md是总纲,负责全局的行为说明;.claude/commands/目录下的Markdown文件负责把高频Prompt固化成可调用的斜杠命令;.claude/settings.json负责权限和模型配置;hooks则负责在关键节点插入自动化逻辑。这一整套组合起来,才叫完整的templates。

1.3 一套模板库的适用人群与典型形态

那什么样的开发者适合搞一套自己的claude-code-templates?我粗粗分了三类。

第一类是重度使用者,每天都在用Claude Code写业务代码,高频操作已经固定下来了,比如“写提交信息”“做代码审查”“补单元测试”,把这类高频Prompt固化成模板,收益立竿见影。第二类是团队负责人,希望整个组的Agent行为保持一致,把工程规范、架构约定沉淀成模板,等于给团队新增了一位熟悉所有规矩的“AI同事”,新成员入职也不用手把手教AI用法了。第三类是模板收集癖患者,GitHub上这类项目仓库其实不少,把别人整理好的模板库拉下来,按需挑选,再改造成适合自己的版本。

模板库的典型形态通常是一个独立仓库,里面不只有单份模板文件,而是按场景分好了类。比如claude-code-templates/这个根目录下,按“项目脚手架”分、按“命令模板”分、按“团队规范”分,再配一个初始化脚本,用一条命令把模板“铺”到目标项目里。这也是我这个项目名字的由来——它不是一份模板,而是一整套模板的集合与分发机制。

2. 模板的核心组成拆解:CLAUDE.md、斜杠命令与钩子

2.1 CLAUDE.md:项目级“行为基线”,优先搞定的第一个文件

CLAUDE.md是这套模板体系里优先级最高的文件。Claude Code启动时会自动读取项目根目录下的CLAUDE.md,把它作为系统级上下文注入到每次对话里。这意味着你不需要在每个会话开头说“我们的技术栈是什么,测试命令是什么”,它全知道。

那么这份文件到底该写什么?我自己的经验是分四个板块:项目概览、常用命令、工程规范、禁区说明。项目概览简单交代项目定位和技术栈,三四行就够;常用命令列清楚构建、测试、lint、格式化、启动开发服务器的准确命令,千万别写错,AI会严格按你给的命令去执行;工程规范是重点,包括目录结构约定、命名规范、错误处理方式、代码风格偏好;禁区说明则是那些“绝对不要做”的事,比如“不要修改generated目录下的代码”“不要绕过类型检查”。

这里我特别想提醒一个细节:CLAUDE.md不是越详细越好。它确实会被完整加载进上下文,而上下文窗口是有限的。如果你把几千行的规范全部塞进去,Agent的核心推理能力反而会被稀释,因为它每读一笔代码都要穿越这一大堆无关紧要的规则。我的衡量标准是,这份文件读下来不超过一分钟,信息密度要高,每句话都要能直接影响Agent的行为。详细的子规范放进斜杠命令里,用到的时候再加载,这才是合理分工。

CLAUDE.md本身也支持引用。你可以在里面写“详细命令见 .claude/commands/test.md”,让Agent在需要的时候去读取那个文件,而不是把所有内容平铺在主文件里,这也是控制上下文占用行之有效的手段。我自己就在主文件里只放最常用的构建测试命令,那些偶尔用一次的冷门操作全部下沉到子文件,需要时再让我自己用斜杠命令触发。

2.2 斜杠命令:把高频Prompt固化成“可复用指令”

斜杠命令是claude-code-templates里利用率最高的一部分。它的原理很简单:在.claude/commands/目录下放一个Markdown文件,文件名就是命令名,文件内容就是命令执行时的Prompt提示词。你在对话框里输入“/commit”,它就会自动读取这个文件,按里面写好的规则去执行。

举一个我每天都在用的例子。我想让Claude Code帮我生成提交信息,如果没有模板,我得在对话框里打一大段话:“帮我看看git status和git diff,然后按照Conventional Commits规范写一条提交信息,类型包括feat、fix、docs、refactor,scope要写模块名,正文要解释为什么这么改……”几十个字的Prompt,每天打十几次,想想都累。

而有了命令模板之后,我只需要在.claude/commands/commit.md里写好一段明确指令,之后每次输入“/commit”,Claude Code就会自动执行这一整套流程。这个例子里的懒,其实省的是每天重复的上下文注水,也让每次的产出格式高度统一。

斜杠命令文件本身还支持YAML格式的frontmatter配置。你可以在文件开头用三行代码指定参数:description是命令的功能描述,helper是命令的功能摘要。这些参数有什么用呢?最关键的是,当你在对话框里输入“/”时,Claude Code会列出所有可用命令,并按description字段展示简介。写清楚description,等于给自己做了一份可检索的AI工具库。高级用法还能配置allowed-tools,限制命令只能调用哪些工具,避免它乱翻文件,但这个属于进阶技巧,新手先掌握基本写法就够了。

还有一个实用的技巧:斜杠命令支持参数占位符。你可以在命令模板里定义变量,比如“/review $MODULE”,然后加上一段说明“MODULE是你要审查的模块路径”。这样一来一条命令可以服务不同模块,而不是每次改路径都要去改命令本身,灵活度大幅提升。

2.3 钩子与MCP配置:让模板具备自动化能力

如果说CLAUDE.md是静态规范、斜杠命令是手动调用的工具,那hooks就是模板里的自动化引擎。Claude Code支持在多个事件节点挂载钩子脚本,比如PreToolUse在任何工具调用前触发、PostToolUse在工具执行完后触发、Stop在Agent停止生成时触发。

实际能拿来干什么呢?举个例子,我最开始接触过一次事故,Claude Code执行了一个危险的清理命令,把我不该删的临时目录直接清空了。后来我在模板库的hooks配置里加了一段逻辑:遇到rm命令先拦截,检查目标路径是不是在禁区名单里,是的话直接拒绝执行,并且给出提示。到了PostToolUse阶段,我让它每次跑完测试都自动整理一下输出,把不重要的堆栈信息过滤掉,只看关键结果。Stop阶段则可以用来做收尾校验,比如检查有没有忘更新的文件、自动格式化一下改过的代码。

很多人容易把hooks理解为“配置文件”,但它本质上就是一段可执行的脚本。Claude Code的hooks配置支持command字段,直接填bash命令或脚本路径,也支持timeout超时控制。我的建议是,hooks脚本不要写得太复杂,越简单越稳。毕竟它是在Agent执行的关键路径上运行的,一旦超时或报错,Agent的工作流就会被打断,这个坑我踩过不只一次。

MCP(模型上下文协议)配置同样属于模板库的“基础设施层”。你可以在.claude/settings.json里注册外部MCP服务器,让Claude Code调用额外的工具,比如查数据库Schema、查内部API文档、读取监控数据。这样一来,Agent就不再局限于读代码本身,而是能结合运行时数据给出更贴合的判断。不过MCP的配置和使用涉及面比较广,这次先把文件模板讲透,这一层大家知道它是模板体系的组成部分就行了,以后用到再展开。

3. 从零搭建一套可复用的模板库:完整实操

3.1 先定框架:模板库的目录结构设计

动手之前,先把目录设好。我的claude-code-templates项目仓库是这样组织的,你可以直接参考这个结构:

claude-code-templates/ ├── README.md ├── init.sh ├── templates/ │ ├── frontend-react/ │ │ ├── CLAUDE.md │ │ └── .claude/ │ │ ├── commands/ │ │ │ ├── commit.md │ │ │ └── review.md │ │ └── settings.json │ └── backend-node/ │ ├── CLAUDE.md │ └── .claude/ │ ├── commands/ │ │ ├── test.md │ │ └── db-migrate.md │ └── settings.json └── shared/ └── hooks/ ├── pre-tool-check.sh └── post-test-format.sh

这个结构的核心思路是“按场景分模板,按功能共享钩子”。templates目录下每个子目录对应一类项目,比如前端React项目、Node后端项目、Python数据项目,各自有独立的CLAUDE.md和命令集。这样当你新建一个项目时,只要找到对应的模板目录,把文件拷过去就行。

shared目录放的是跨项目复用的hooks脚本。之所以单独抽出来,是因为钩子脚本不像CLAUDE.md那样强依赖某个项目的背景信息,更多是通用的安全校验和输出整理,抽成公共层可以避免每个模板目录里都复制一份,每次要改只能到处改,维护成本高。

init.sh就是整个模板库的入口脚本。它的作用是接受一个目标目录路径作为参数,把对应模板的文件复制进去。这一段我先在结构里留个位置,后面的小节详细讲怎么实现它。

3.2 手写一份高质量的CLAUDE.md模板

我直接拿一个前端React项目的模板内容来演示,这份文件我实际在项目里用了很久,结构清晰、各段职责分明。

# 项目:前端Web应用 ## 项目概览 这是一个基于React 18 + TypeScript + Vite的面向用户的前端应用。状态管理使用Zustand,路由使用React Router v6,UI组件库使用Ant Design。后端API地址在 .env 文件中配置,默认指向本地开发服务器。 ## 常用命令 - 安装依赖:pnpm install - 启动开发服务器:pnpm dev - 生产构建:pnpm build - 运行单元测试:pnpm test -- --run - 运行lint检查:pnpm lint - 代码格式化:pnpm format ## 目录结构约定 - src/pages:路由页面组件,一个文件对应一个路由 - src/components:可复用的业务组件 - src/stores:Zustand状态定义 - src/api:所有后端接口调用集中在此,禁止在组件内直接发请求 - src/types:全局TypeScript类型定义 ## 工程规范 - 组件使用函数组件和Hooks,禁止使用class组件 - 新样式优先使用CSS Modules,避免全局样式污染 - 接口入参出参必须定义类型,禁止使用 any - 路由页面组件命名以 Page 结尾 - 所有异步请求必须有 loading 状态和错误提示 ## 禁区 - 禁止修改 src/generated 目录下的文件,该目录由代码生成器产出 - 禁止在action creator里调用setState,必须通过store方法 - 禁止提交dist目录到版本库

就像这样一段话,Agent看过之后就会知道:这个项目用的是pnpm而不是npm,组件要写成函数组件,接口调用要放在api目录里,generated目录碰都别碰。它做出来的代码,从一开始就更贴合项目的实际约束。

这里有一个很容易被忽视的点:命令一定写准确。比如构建命令到底是pnpm build还是npm run build,测试命令带不带额外的参数,都要照实抄。Agent第一次执行没把握的命令之前,往往会先读一遍package.json自己判断,虽然一般也能判断对,但判断错了就会浪费时间,直接给准命令是效率最高的做法。

每份CLAUDE.md模板的开头,按我的习惯,至少要有项目概览、命令、规范、禁区四段。不同的项目类型再按需扩展,后端项目可以加数据库约定和迁移规则,数据项目可以加Python版本和依赖管理方式。核心思路是“宁缺毋滥”,每加一条,都要能问自己一句:这条信息真的能改变Agent的行为吗?能,才放进去。

3.3 编写斜杠命令模板,附可直接抄的示例

斜杠命令要解决的是“高频操作固定化”。我分享三个我自己项目里每天都在用的命令模板,你直接复制改一改就能上手。

第一个是commit.md,负责生成符合规范的提交信息:

--- description: 按Conventional Commits规范生成提交信息 --- 先执行 git status 查看当前变更文件,再执行 git diff --stat 查看变更概览, 然后查看 git diff(如果变更文件过多,重点关注非锁文件的改动)理清这次的改动内容。 根据改动内容,用以下格式生成一条提交信息: <type>(<scope>): <subject> type取值:feat(新功能)、fix(修复)、docs(文档)、style(格式)、refactor(重构)、test(测试)、chore(构建/工具) scope写改动模块名,subject用简洁的一句话概括改动,不超过50个字符。 提交信息正文(可选)补充说明改动的背景和影响,按需添加。生成后不要自动执行提交,等确认。

第二个是review.md,用来对指定模块做代码审查:

--- description: 审查指定模块的代码质量 --- 请审查 $MODULE 目录下的代码,重点检查以下方面: 1. TypeScript类型是否完整,是否存在 any 漏洞 2. 边界情况是否处理(空值、异常、异步竞态) 3. 组件是否有明显的渲染性能问题 4. 是否遵循项目CLAUDE.md里的目录约定和命名规范 5. 是否有明显的安全隐患 输出格式: - 按严重程度列出问题列表(严重 / 建议 / 可选) - 每个问题附上代码位置和修改建议 - 最后给一个总体评价

第三个是test.md,补单测。我测试命令模板的重点是给出了“测什么”的指导:

--- description: 为指定模块补充单元测试 --- 为 $MODULE 目录下没有测试覆盖的代码文件补充单元测试。 要求: - 使用Vitest,测试文件与被测文件放在同一目录,后缀为.test.ts - 优先覆盖核心逻辑分支和边界条件 - 组件测试使用 @testing-library/react,尽量从用户行为角度断言 - 测试用例命名用中文,描述清楚场景和预期 - 补齐测试后执行 pnpm test -- --run 确认全部通过

注意一个细节:命令模板里的指令是给Agent看的自然语言,不是给机器执行的脚本。所以写的时候要像跟一个程序员交代任务一样,说得具体、讲清要求、明确输出格式。Agent在执行斜杠命令时,会先把这段Markdown当作指令系统的一部分来理解,再结合当前代码库的实际情况去做。因此不要写死操作路径,留出推理空间,比如让它“先看git status”、“根据改动内容判断”,效果会好很多。

frontmatter那段以三个短横线包裹的内容是关键约束:description是用来在命令列表里展示的,写得好不好直接关系到你在输入“/”时能不能一眼找到想用的命令。建议都用动词开头的短语,比如“生成提交信息”“审查模块代码”“补充单元测试”,千万别写“关于提交信息的一点点想法”这种含糊描述。

3.4 用初始化脚本把模板“发”到项目里

模板文件设计得再好,如果每次都要手动复制粘贴,那这套体系的效率就打了折扣。我的选择是写一个极简的init.sh脚本,一条命令把整个模板目录部署到目标项目。

核心逻辑大概是这样的:

#!/usr/bin/env bash set -euo pipefail TEMPLATE_NAME="${1:?用法: ./init.sh <template-name> <target-dir>}" TARGET_DIR="${2:?请指定目标项目目录}" if [ ! -d "$TARGET_DIR" ]; then echo "错误: 目标目录不存在" exit 1 fi TEMPLATE_DIR="$(dirname "$0")/templates/$TEMPLATE_NAME" if [ ! -d "$TEMPLATE_DIR" ]; then echo "错误: 未找到模板 $TEMPLATE_NAME,可用模板:" ls "$(dirname "$0")/templates" exit 1 fi cp -r "$TEMPLATE_DIR/." "$TARGET_DIR/" echo "已应用模板 $TEMPLATE_NAME 到 $TARGET_DIR" echo "下一步:打开 $TARGET_DIR/CLAUDE.md 并按项目实际修改"

这个脚本本身没什么高深的,但有个细节值得注意:我用了cp -r "$TEMPLATE_DIR/.",这样做的好处是把目录内的所有内容包括隐藏的.claude目录都复制过去,不会漏掉点文件。如果你用cp -r "$TEMPLATE_DIR" "$TARGET_DIR/",得到的就会是目标目录下一个嵌套的子目录,Agent找不到配置,模板等于没装。

脚本最后那句提示,很多人觉得多余,其实很关键。模板里的CLAUDE.md写的是通用规范,复制到具体项目后,一定会有些项目特有的信息需要补充。如果你缺了这一步,直接用通用规范去框所有项目,那一开始提到的“模板和项目脱节”问题就会很快暴露。脚本的输出实际上是在提醒你:模板是起点,自定义才是终点。

init.sh跑通之后,维护模板库就变成了一件顺理成章的事。每次在项目里发现Agent行为不对劲,或者规范有了新的调整,优先去改模板目录里的源文件,而不是直接在项目里改副本。这样模板库才能越来越接近你团队的真实最佳实践。

4. 模板落地中的常见问题与排查实录

4.1 CLAUDE.md太长,上下文被占满了怎么办

我自己踩得最深的坑,就是CLAUDE.md越写越长。最初觉得信息多多益善,把团队Wiki里能搬的都搬了进去,结果Agent的行为反而变“钝”了。它处理简单任务时也要在线程里塞一长串背景资料,响应变慢,而且它有时候会在不相关的细节里迷失重点。

排查的思路挺简单的。你先用一条明确的指令比如“请总结一下当前会话中CLAUDE.md提到的所有配置项”,让Agent盘点一下它实际记住了哪些内容,列出来之后你会发现不少其实压根用不上,而常用信息混在里面反而被淹没。

我的解决办法是分级。CLAUDE.md只放“每次干活都需要”的信息,包括命令、目录约定、通用规范、禁止事项。偶尔用到的细节拆出去,放.claude/commands/里的子命令或者独立文档,用“MySQL连接方式见scripts/db-guide.md”这种引用,让Agent需要的时候再去读。这样主文件瘦身到100行以内,属于必用的核心规范,子文档承载长尾信息,上下文占用和信息的完整性就平衡了。

4.2 模板和项目脱节,AI还在用旧命令

这个问题非常隐蔽。你的项目可能已经用模块联邦替代了单体构建,或者测试框架从Jest切到了Vitest,但CLAUDE.md里还写着旧的pnpm build命令和jest测试命令。Agent按模板执行,执行失败后自己去看package.json才能发现新命令,这中间浪费的既是时间也是上下文。

要解决这个问题,得让模板库跑在版本管理里。我的做法是模板源文件在Git仓库里单独管理,每次项目里发生了影响Agent行为的技术变更,顺手同步更新模板源文件。这样模板始终跟着团队实际演进,而不是固化在某一个时间点上的快照。

另外,我还会定期做一次“模板新鲜度检查”。挑一天下午,新建一个临时目录,用init.sh把模板铺进去,然后让Agent执行几条核心命令,看看是否顺利,行为是否符合预期。如果模板已经过时了,这个检查很快就能暴露问题。它比我预想的更好用,因为它排除掉了现有代码库的干扰,专门只测模板本身。

4.3 权限策略、钩子故障与信息泄露

权限策略如果有问题,最典型的状态是Agent频繁卡壳。明明只让它读代码,它却因为settings.json里配的permissions太严格,连读文件的请求都被拦下来,对话框里全是权限确认提示。这时候别急着给Agent全放行,先看一下你settings.json里的permissions配置。工具类级的allow规则够用就行,目录级别的读写限制别设太死,要给正常的工具调用留出空间。

钩子故障则是另一类问题。我之前写过一段PreToolUse的拦截脚本,因为路径判断写错了,导致正常的pnpm install也被拦下来。这个事的教训是要给hooks脚本加日志输出,Claude Code执行钩子时的日志能告诉你它到底在哪个环节被阻断。排查步骤是先看日志确认钩子有没有被触发、退出码是多少,再决定是改脚本还是直接删掉这段钩子。

还有一点我不能不提醒:模板文件里可能会埋着敏感信息。因为你把CLAUDE.md写进了通用模板库,如果里面包含了内网数据库地址、内部服务域名或者访问密钥,这些内容会随着init.sh被复制到每一个新项目里。而模板仓库如果推送到了公开平台,那信息就等于直接公开了。所以模板源文件里只能写不敏感的通识信息,项目特有的敏感配置永远留在项目自己的.env或者本地文件里,靠引用方式接入,而不是写进模板。

4.4 让Claude自己维护模板的进阶玩法

这个玩法算是我用得比较顺手的一个进阶技巧:让Claude Code自己来维护模板库。

原理很简单,把模板仓库本身当作一个项目来对话。你打开终端,cd到claude-code-templates目录,然后跟Claude Code说“帮我看看模板里缺少对错误边界处理的规范,参考我们最近几个项目的实际做法,把这条规范加到frontend-react的CLAUDE.md里”。它会自己分析现有模板结构、读懂项目规范的行文风格,然后生成修改建议,你确认后它直接帮你改文件、甚至提交变更。

这个方式改动了我维护模板的心智模式:模板库不是一次性产出以后就不管的静态文件,它完全可以变成一套“活的资产”——由团队里每个成员在项目实践里不断发现新需求,再由Claude Code按统一风格把它们沉淀成新的模板条目。当然这要求模板本身的结构足够清晰、各文件职责边界足够明确,否则Agent改着改着也可能把事情搞乱。前面建立的目录结构和命名规范,在这里就是Agent能顺畅维护模板的基础。

我在实际项目中体会最深的,往往不是模板本身帮我写了多少代码,而是它把Agent从“每次都要重新解释的临时工”变成了“熟悉团队规矩的稳定协作者”。如果你刚开始接触Claude Code,我建议你第一步不必搞复杂,先写一个200行的CLAUDE.md,再把常用的提交信息、代码审查、补测试做成三个斜杠命令,跑上一周,你自然能感受到哪些环节应该继续模板化、哪些环节配置过度了。之后在此基础上迭代,这套体系会越用越顺手。

最后再分享一个小技巧:给模板源文件加上版本注释,比如“v2.1 - 2025.06:新增Vitest配置说明,去除Jest相关命令”,这行字不参与Agent决策,但每次用init.sh部署模板到新项目时,你一眼就能看出这套模板的新旧程度,避免把过时规范带进新项目。这个习惯花不了几秒钟,长期下来省掉的是排查模板与项目不一致的宝贵时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询