
先说一个我自己的体验。刚开始用 Claude Code 的时候我总觉得它像薛定谔的结对程序员同一个仓库里让它写测试又稳又快让它顺手改个配置文件它却能自作主张牵连到莫名其妙的目录。折腾一段时间后我终于把调试重点从“再开一个新会话试试”转到了“我到底给了它什么规则”。于是就有了 claude-code-templates 这个项目它不是什么黑科技就是一组围绕 Claude Code 做项目开发的模板文件集合把 CLAUDE.md、自定义斜杠命令、Skills、Hooks 按场景整理好复制到自己的项目里就能直接用。这篇文章不打算泛泛聊使用体验直接把模板库的骨架、核心文件长什么样、怎么落地到真实项目以及我在维护过程中踩过的坑都说一遍。无论你是刚接触 Claude Code 的新手还是已经在团队里推广 AI 辅助开发的老手这套整理思路应该都能用得上。1. 为什么我决定把 Claude Code 配置整理成模板仓库1.1 裸奔的 Claude Code 和真实工程需求之间的落差Claude Code 本身的能力不需要我多吹但很多人忽略了一件事它默认对你的“项目习惯”一无所知。它能读文件、能跑命令、能改代码但它不知道你偏好 Conventional Commits 还是中文 commit message不知道你的测试框架是 pytest 还是 jest更不知道哪些目录是构建产物、绝不能碰。默认情况下你只能靠每次对话临时叮嘱而这种临时叮嘱在长会话里很容易被淹没。我最早踩过这么个坑一个 Python 项目里我没写任何规则文件让它帮忙修一个接口报错。它定位到问题后顺手把requirements.txt里的依赖版本改成了最新版还自作主张跑了一遍pip install。逻辑上它没犯大错但这个行为在我团队里是不可接受的依赖升级必须单独走 MR不能混在 bugfix 里。这件事让我意识到Claude Code 不是“不够聪明”而是缺少一份稳定的项目说明书。1.2 模板的本质给 AI 写 onboarding 文档后来我想明白了一个类比Claude Code 每次进入你的仓库都相当于一个新同事入职。新同事再厉害也需要一份 onboarding 文档来告诉他团队规范、代码结构、常用命令。对于 AI 而言这份 onboarding 文档就是项目根目录下的CLAUDE.md以及分布在.claude/目录下的命令、技能和钩子配置。但每个项目都从零写一份 onboarding 文档太累了而且不同项目的技术栈、目录风格、团队习惯其实有大量共性。claude-code-templates 想解决的问题就是把这些共性沉淀成可复制的模板。你不需要理解 Claude Code 的全部配置语法只需要从模板库里挑出最贴近项目类型的文件夹复制进去改几个变量名就拥有了一份还算像样的 AI 协作规范。我坚持叫它“模板仓库”而不是“配置仓库”因为里面的每一份文件都不是拿来即用的最终形态而是一个起点。模板存在的意义不是代替你思考而是帮你节省“从空白页开始”的成本。真正好用的模板一定是在实际项目里被反复修改过的而不是靠想象堆出来的大而全文档。2. claude-code-templates 的目录设计让每个模板都知道自己该干什么2.1 仓库整体布局这个项目一开始只是我本地的一个~/dotfiles文件夹后来发现经常要在不同电脑、不同项目间同步就单独拆了仓库。目前的目录结构大概是这样claude-code-templates/ ├── README.md ├── project/ │ ├── python/ │ │ └── CLAUDE.md │ ├── node/ │ │ └── CLAUDE.md │ ├── go/ │ │ └── CLAUDE.md │ └── general/ │ └── CLAUDE.md ├── commands/ │ ├── commit.md │ ├── review.md │ ├── test.md │ └── explain.md ├── skills/ │ └── example-skill/ │ ├── SKILL.md │ └── scripts/ ├── hooks/ │ ├── pre-tool-use.js │ └── post-tool-use.sh └── scripts/ └── init.shproject/放的是项目级说明书按语言或框架分目录commands/放的是斜杠命令每个人都可以直接拖到自己的.claude/commands/下skills/放的是技能扩展适合把那些“有一定复杂度、但又不是每次都要用”的能力放进去hooks/放的是事件钩子用来做自动化守门。2.2 按项目类型拆模板而不是一个文件走天下早期我试过把 Python、Node、Go 的规范全部写进同一个CLAUDE.md结果文件超过三百行Claude 每次会话都要加载一大坨反而抓不住重点。后来我把它们拆开用的时候只复制对应语言的那份。这里其实有个很朴素的规律模板要能“精准投放”而不是“穷举所有可能”。按项目类型拆分还有一个额外好处你可以把不同目录下的CLAUDE.md做得风格一致但内容各有侧重。比如 Python 模板会强调虚拟环境路径、pytest 用法、src/布局Node 模板会强调 npm 脚本、ESLint 规则、dist/不能提交。真正遇到全栈项目时可以再单独组合两份模板的内容而不是在一个万能模板里迷失。2.3 通用与特殊分开治理在整理过程中我提炼了一个比较重要的原则把规范分成“通用层”和“项目层”。通用层包括沟通语言、提交信息的格式、禁止操作的安全边界、对“不确定时先问”的行为要求。这些适用于所有项目可以放进用户级全局文件比如~/.claude/CLAUDE.md或者模板里的general/部分。项目层则包括具体技术栈的常用命令、目录结构、测试方式需要跟着项目走。这么分开之后模板的维护成本骤降。全局规则改一次所有项目都生效项目规则只在复制模板时调整。如果两层的规则冲突实际行为往往不直观所以我会在模板里加一句“当通用规则和项目规则冲突时以项目规则为准但需要先说明原因”。这句话看起来简单但真的能减少不少莫名奇妙的输出。3. 上手就能用的核心模板拆解CLAUDE.md、命令、skills 和 hooks3.1 CLAUDE.md 模板给 Agent 的入职手册Claude Code 在进入项目时会自动读取项目根目录的CLAUDE.md把它作为系统上下文的一部分。我的模板一般分五个区块项目概述、常用命令、代码风格、安全边界、测试要求。下面是一个简化示例# 项目说明 这是一个基于 FastAPI 的订单服务使用 PostgreSQL 存储Redis 做缓存。 目录结构 - src/app应用主代码 - testspytest 测试 - scripts运维脚本 # 常用命令 - 启动开发服务uvicorn src.app.main:app --reload - 运行测试pytest tests/ -x -q - 代码检查ruff check src/ # 代码风格 - 使用类型注解函数必须写 docstring - 异常处理使用自定义异常禁止裸抛 Exception - 所有新功能必须附带测试 # 安全边界 - 禁止修改 src/db/migrations/ 下的现有迁移文件 - 禁止直接改 requirements.txt如需变更依赖走 MR - 不经过确认禁止执行 drop/truncate 等危险命令 # 测试要求 - 新接口至少包含一个正常路径和一个异常路径测试 - 涉及数据库的测试必须使用 pytest fixture 回滚事务这份模板看起来简单但效果非常明显。Claude Code 拿到之后就不再是一个“只会接话的程序员”而是一个“读过团队章程的实习生”。它能自己找到测试文件知道改动迁移文件属于高危操作也清楚提交代码前要跑哪些检查。还有一个容易被忽略的文件CLAUDE.local.md。它适合放那些“只对本地生效、不需要提交到仓库”的内容比如个人开发路径、临时环境变量、本地数据库连接串。模板仓库里我特意加了一个注记不要把本地私有信息写进共享的CLAUDE.md否则模板仓库一公开等于把密钥送人。3.2 自定义斜杠命令模板Claude Code 支持自定义斜杠命令本质上是把一段精心设计的提示词放到.claude/commands/目录下。比如你希望它按团队规范写 commit message就可以新建一个commit.md内容大致是这样你是这个仓库的提交信息助手。请根据当前 git diff 生成符合 Conventional Commits 的提交信息。 要求 1. 类型使用 feat/fix/refactor/test/docs/chore 2. 正文用中文主题用英文也没关系但不要混在一行 3. 如果 diff 中包含多个不相关的改动先列出拆分建议不要强行合成一条 4. 最终只输出提交信息不要输出其他解释 用户补充要求$ARGUMENTS$ARGUMENTS是应急变化点。调用时输入/commit 偏重构它就知道这次的重点是重构而不是新功能。如果不写这个占位符命令就会变成死板的固定流程。我在模板里做了一个约定每个命令模板都必须预留$ARGUMENTS哪怕默认值是空字符串也要给用户一个注入额外意图的入口。与/commit类似的还有/review、/test、/explain。/review是让 Claude 当代码审查员重点关注安全漏洞、并发问题、错误处理和过度设计/test是让它自动补测试但要先检查已有测试文件的命名风格。这些命令我都放在仓库的commands/目录下因为它们的适配性很强几乎不用改就能在多个项目里用。3.3 Skills 模板把复杂能力从主上下文里挪走如果你跟我一样一开始把所有东西都塞进CLAUDE.md很快会遇到上下文长度问题。Claude 在一个会话里能关注的信息有限正文太多它反而会对局部细节视而不见。Skills 就是用来解决这个问题的它们像一个个“插件”只有在相关任务出现时才会被加载。一个 Skill 通常是一个目录里面必须有SKILL.md开头用 YAML 写元数据下面写技能说明。我模板里的示例是这样的--- name: database-migration-review description: 在涉及数据库迁移文件变更时使用帮助检查迁移是否安全、是否兼容回滚。 --- 当用户要求修改或新增数据库迁移文件时你应当 1. 先读取目标迁移文件的当前内容 2. 检查变更是否会破坏已有数据的完整性 3. 确认是否提供 down 方法回滚脚本 4. 如果发现潜在风险明确向用户指出不要自动执行关键点在于description要写得足够精确。Claude Code 靠描述来判断“这个技能和当前任务是否相关”描述写得太宽泛它就可能在不该用的时候调出来写得太窄又容易被忽略。我试过把描述写成“数据库相关”结果检查普通模型代码时它也冒出来反而干扰判断。后来改成“涉及数据库迁移文件变更时使用”匹配率才明显提升。3.4 Hooks 模板让规则自动生效Hooks 是比命令和 Skills 更“硬”的一层。如果说CLAUDE.md是让 AI 自觉遵守规范那么 Hooks 就是直接在工具调用前后做拦截和校验。Claude Code 允许在.claude/settings.json里配置各种事件钩子。举一个很实际的场景我希望它永远不要修改构建产物目录那么可以在 PreToolUse 阶段检查一下{ hooks: { PreToolUse: [ { matcher: Write|Edit, hooks: [ { type: command, command: bash scripts/guard-build-dir.sh \$CLAUDE_TOOL_INPUT\ } ] } ] } }模板里的scripts/guard-build-dir.sh会检查传入的路径是否匹配dist/、build/、.next/等目录发现命中就返回非零退出码从源头阻止写入。这类钩子特别适合团队协作即使某个成员的CLAUDE.md写得很敷衍Hooks 也会拦住最危险的操作。我目前在模板里放了四个钩子脚本一个是保护构建目录一个是超时限制防止 Claude 执行长时间阻塞命令一个是自动跑 lint还有一个是记录所有工具调用的审计日志。前两个几乎是通用的后两个要看团队需求所以模板里单独建了hooks/optional/目录。4. 把模板套进真实项目的操作流程与验证方法4.1 用初始化脚本复制文件模板库里的scripts/init.sh是我自己日常用的脚本核心逻辑很简单根据参数选择项目类型把对应模板复制到当前目录并生成.claude/目录。基本流程如下#!/usr/bin/env bash set -euo pipefail PROJECT_TYPE${1:-general} TEMPLATE_DIR$HOME/code/claude-code-templates/project if [[ ! -d $TEMPLATE_DIR/$PROJECT_TYPE ]]; then echo Unknown project type: $PROJECT_TYPE exit 1 fi cp $TEMPLATE_DIR/$PROJECT_TYPE/CLAUDE.md ./CLAUDE.md mkdir -p .claude/commands .claude/skills .claude/hooks cp $HOME/code/claude-code-templates/commands/*.md ./.claude/commands/ cp $HOME/code/claude-code-templates/hooks/*.sh ./.claude/hooks/ echo Initialized.这个脚本一点都不复杂但解决了“每次手动建目录、贴文件”的重复劳动。如果你有更复杂的初始化需求完全可以用degit从远程模板仓库拉包或者做成交互式 CLI。核心思路都一样复制 → 改写 → 测试。4.2 根据项目改写模板变量复制模板之后最忌讳的事情就是“懒得改”。直接套用模板而没有任何定制等于把别人的规则强加给当前项目。我给自己定了一个检查清单项目概述里的技术栈、目录结构是否与当前仓库一致常用命令是否正确虚拟环境路径、包管理器是不是团队实际在用的安全边界里有没有当前项目特别敏感的路径测试要求里的命令是否能在你的机器上直接跑通改完这些之后我建议顺手把模板里的通用规则过一遍。团队如果习惯用中文 commit message就把commit.md里的要求改成中文如果开发流程里必须关联 JIRA 单号就加一条“提交信息必须以PROJ-123开头”。模板的威力就在于改一行就能影响后续所有会话。4.3 实际验证模板是否生效写完模板不是终点验证才是。我的做法是把模板复制进项目后先开一个全新的 Claude Code 会话故意让它执行一个被安全边界禁止的操作比如让它把requirements.txt重排一下或者改一个构建产物目录里的文件。如果它能正确地说“这个操作被项目规则禁止”说明模板生效了。如果它违反了规则不要急着改模板先打开调试信息看它到底加载了哪些上下文。很多时候不是模板写得不好而是项目里有多个CLAUDE.md根目录和子目录的规则混在一起导致 Claude 选择了更具体的某条指令。遇到这种情况我会把规则放到离实际操作路径更近的位置或者在模板里加一句“本规则适用于所有子目录”效果立竿见影。还要检查命令模板是否被正确注册。.claude/commands/里的命令有时候会因为文件名大小写、空格、中划线问题无法识别建议统一用小写字母和连字符。一旦发现斜杠命令没被触发先看文件名是否符合命名规范再看文件内容有没有语法错误最后检查是否放在了正确目录下。5. 维护这套模板时踩过的坑以及我现在的取舍标准5.1 模板文件不是越多越好我最早犯过的错是追求“完备”。给 Python 模板写了 200 行Node 模板写了 180 行还把各种边角料规则都塞进去比如“不要使用 var”“优先使用 const”“缩进两个空格”之类。结果 Claude 确实不会用var了但它开始频繁地“过于听话”——只要有一点不确定它就会停下来问而不是根据上下文做合理推断。会话效率下降得非常明显。后来我给自己定了一条硬性标准一份CLAUDE.md模板的正文尽量控制在 120 行以内。凡是可以用命名规范、lint 工具自动检查的规则就不写进模板模板只保留 LLM 无法自动判断的约束。比如“缩进两个空格”这种交给 formatter 就行而“禁止修改已有迁移文件”这种只有模型能理解的规则才值得写进去。5.2 子目录 CLAUDE.md 的优先级问题Claude Code 在读取项目记忆时会加载根目录的CLAUDE.md也会读取当前工作目录附近的内存文件。实际体验下来当根目录和子目录规则冲突时表现并不总是符合直觉。有一次我在后端服务的子目录下放了专门说明“接口返回必须包一层data字段”的CLAUDE.md结果它确实遵守了却忽略了根目录里“不要改 API 网关配置”的规则。我的解决方法是不在子目录放容易与根目录冲突的规则子目录只放技术细节比如“这个模块的依赖关系是什么”“这个目录下测试如何组织”。全局性约束一律留在根目录。如果确实需要在子目录覆盖根目录规则我会在根目录模板里明确写一句“更大的目录层级拥有更高优先级除非子目录显式声明 override”。这句话能减少相当一部分让人摸不着头脑的行为。5.3 $ARGUMENTS 的边界要讲清楚命令模板里的$ARGUMENTS如果写得太随意很容易出现一种尴尬情况你在/commit后面输入了一串中文说明Claude 却把它当成一个独立的硬性指令完全忽略模板里的其他要求。后来我在每个命令模板里都追加了一句“如果用户提供的参数与你收到的指令冲突以模板指令为准但要在输出中说明哪部分参数被忽略”。另外$ARGUMENTS不是唯一占位符但最常用。我建议在模板里明确它的使用格式比如“用户可以用逗号分隔多个要求”否则 Claude 会把整段话当成一个模糊的整体意图反而不知道怎么拆解。5.4 Hooks 脚本的权限与路径问题Hooks 常见的坑一个是忘记给脚本加执行权限。复制模板到新项目后如果settings.json里写的命令是bash xxx.sh权限其实无所谓但如果直接写脚本路径就会报错。另一个坑是相对路径的解析位置。Claude Code 执行 hook 时的当前工作目录通常是项目根目录但如果你在子目录里启动会话情况就可能不一样。为了保险我的所有 hook 脚本开头都会强制先cd到项目根目录PROJECT_ROOT$(git rev-parse --show-toplevel) cd $PROJECT_ROOT最后Hooks 的触发频率也要留意。我早期加了一个“每次编辑后自动跑全量测试”的 hook结果改一个注释都要等几十秒果断改成了只允许在手动触发命令时运行。自动化不是越强越好而是要跟人的工作节奏匹配。5.5 跟着 Claude Code 版本迭代持续更新Claude Code 本身的迭代速度非常快新版本可能会调整配置目录名、加入新的 skill 机制或者改变 hooks 的事件类型。模板仓库如果不跟着更新复制的配置很容易在某次升级后悄悄失效。我现在会在每个模板文件里用注释标注“适用于 Claude Code x.y.z 版本”并在README.md里维护一张简单表格记录版本变化带来的破坏性变更。我自己的更新节奏是每个月看一次官方 changelog挑出会影响模板的部分先在测试项目里验证一遍再合并到模板仓库。社区里也有不少人在做类似的事情互相参考。模板这种东西只要你不维护三个月后就变成一堆没人愿意看的僵尸文件。最后分享一个小习惯我把自己的模板仓库当作一个“活文档”不追求一次成型。每次在真实项目里发现 Claude 做了某个让我惊讶的好行为我就复盘它是因为哪条规则触发的把这条规则抽象进对应模板每次发现它干了蠢事我也会追溯是缺了哪条约束然后补上。这套循环跑下来模板库不再是一个静态的收藏夹而是一个真正能提升 AI 协作效率的工具箱。