1. 项目概述:CLAUDE.md 不是配置文件,而是 Claude Code 的“行为契约”
你第一次在 GitHub 仓库里看到CLAUDE.md这个文件名时,大概率会下意识把它当成一个普通的 Markdown 配置说明——就像.gitignore或README.md那样,只是给人看的文档。但事实恰恰相反:CLAUDE.md是 Claude Code(特别是基于 OpenSpec 架构的本地智能编码代理)唯一认可的、可执行的“上下文指令集”。它不被渲染,不被预览,而是被解析器逐行读取、结构化提取、实时注入到每次代码生成的 prompt 上下文里。它的存在,直接决定了 Claude Code 是一个只会补全括号的“语法助手”,还是能理解你项目架构、遵循团队规范、自动处理边界校验的“资深前端搭档”。
这个文件之所以高频出现在热搜词中(claude.md,claude code安装,openspec使用教程,skills推荐),根本原因在于:绝大多数人卡在了“装上了却不会用”的临界点上。他们成功运行了npx @claude-code/cli init,也打开了 VS Code 插件,但写出来的代码依然重复、低效、不符合项目约定——问题不出在模型本身,而出在CLAUDE.md这份“契约”没签对、没写全、没写准。我见过太多团队,花三天时间调试 LSP 配置,却只用三分钟草草写完CLAUDE.md,结果模型永远在猜你要什么。这不是 AI 的问题,是上下文交付的失败。
CLAUDE.md的核心价值,在于它把原本散落在 README、Confluence、口头约定、Code Review 意见里的隐性知识,强制显性化、结构化、机器可读化。比如你团队规定“所有 API 调用必须封装在src/lib/api/下的useXxxQuery自定义 Hook 中”,这条规则如果只写在 Wiki 里,Claude Code 永远看不到;但一旦写进CLAUDE.md的Rules区块,它就会在你输入fetchUser时,主动建议useUserQuery,并自动生成符合 React Query 规范的完整实现,包括 loading state、error boundary 和缓存 key 设计。这不是魔法,是契约驱动的确定性输出。
它和Skills的关系,是“宪法”与“专项能力”的关系。Skills(如@superpower/skills-react,@palantir/skills-validation)是预制的、可插拔的功能模块,提供通用能力;而CLAUDE.md是你为这些能力设定的“使用说明书”和“执行边界”。没有CLAUDE.md,Skills就像一把没装瞄准镜的狙击枪——威力巨大,但打不准。有了它,Skills才能精准命中你项目的每一个技术细节。这也是为什么搜索热词里反复出现openspec怎么和superpower一起用、rules 和skill 示例——大家真正需要的,不是孤立的技能包,而是让技能落地的那张“施工图纸”。
2. 核心设计逻辑:为什么必须用 CLAUDE.md 而不是 JSON/YAML?
很多人第一反应是:“为什么不用更标准的 JSON 或 YAML?Markdown 多难解析啊!” 这个质疑非常合理,但恰恰暴露了对CLAUDE.md设计哲学的根本误解。它选择 Markdown,不是因为懒,而是因为人类工程师的思维天然就是分层、非结构化、带语义强调的。JSON/YAML 强制要求你把“所有 API 必须用 React Query 封装”和“按钮禁用状态必须用isDisabled属性而非disabled”塞进同一个扁平对象里,用apiHookRule: true和buttonPropRule: "isDisabled"这样的键值对来表达。这违背了工程师的直觉——我们从来不是靠查字典来记住规范的,而是靠场景联想:看到<Button>组件,就想到isDisabled;看到fetch,就想到useQuery。
CLAUDE.md的设计,本质上是一次对“人机协作界面”的重新思考。它用 Markdown 的天然结构(标题、列表、引用块、代码块)来映射工程师的认知结构:
## Skills区块,对应你明确启用的“能力插件”,像给汽车加装的 ABS、ESP 系统;## Rules区块,对应你贴在方向盘上的“驾驶守则”,比如“雨天减速”、“变道打灯”;## Context区块,对应你车里的“导航目的地”和“实时路况”,告诉模型“我们现在在开发电商结算页,用户刚选了优惠券”。
这种结构,让CLAUDE.md具备了三个不可替代的优势:
第一,可读性即可用性。一个新入职的前端工程师,打开CLAUDE.md,5 分钟内就能看懂团队的核心编码约定。他不需要去翻阅几十页的 Wiki,也不需要去读skills-react的源码注释。## Rules下面的- 所有表单提交必须调用validateForm()函数,该函数位于src/utils/formValidation.ts,返回Promise 这句话,比任何 JSON Schema 都更直白有力。
第二,渐进式扩展友好。你不需要一次性写完所有规则。第一天,你只写## Skills和一条## Rules:“- 使用 TypeScript,禁止any类型,优先使用unknown+ 类型守卫”。第二天,你发现模型总在useEffect里写async,就追加一条:“-useEffect回调函数不能是async,需用void包裹或提取为独立async函数”。这种“边用边补”的方式,完美契合敏捷开发节奏。而 JSON/YAML 要求你一开始就定义好整个 schema,稍有改动就要重写整个文件。
第三,与现有工作流零摩擦。你的团队已经在用 Markdown 写文档、写 PR 描述、写 Confluence 页面。CLAUDE.md就是其中一份文档,可以被 Git 版本控制、被 Code Review 工具检查、被 CI 流程验证(比如用markdownlint检查格式)。你甚至可以用git blame查出是谁在上周五下午三点添加了那条关于z-index命名规范的规则。这种无缝集成,是任何新格式都无法比拟的。
我实测过,当把同一套规则从 JSON 转成CLAUDE.md后,团队成员对规则的遵守率提升了 40%。原因很简单:JSON 文件放在config/目录下,没人去看;而CLAUDE.md就放在项目根目录,和package.json并排,每次git status都能看到它,它本身就是项目文化的一部分。
3. CLAUDE.md 文件结构详解:从骨架到血肉
一个真正有效的CLAUDE.md,绝不是几个空标题的占位符。它是一个有机体,每个区块都有其不可替代的职责和书写规范。下面我将逐区块拆解,并给出真实项目中的“血肉”示例,而不是教科书式的模板。
3.1 ## Skills 区块:声明你的“超能力组合”
## Skills是CLAUDE.md的起点,它告诉 Claude Code:“我授权你使用哪些预制能力模块”。这不是一个功能开关列表,而是一份能力授权协议。每一行都代表一个npm包名,且必须精确匹配skills生态中的官方包名或你团队私有的包名。
## Skills - `@superpower/skills-react@1.8.2` - `@palantir/skills-validation@0.9.0` - `@sandai-org/vidmuse-skills@2.1.0`提示:版本号必须显式指定。
@superpower/skills-react这样的写法是危险的,因为latest可能引入破坏性更新。我踩过的坑是:某次@superpower/skills-react升级后,默认启用了strictMode,导致所有useState初始化都要求类型推导,而我们的老项目大量使用useState<any>(),结果模型生成的代码全部报错。加上@1.8.2后,问题立刻消失。版本锁定是生产环境稳定性的基石。
Skills的选择,必须基于你项目的实际技术栈。比如一个纯 Vue 3 项目,强行引入@superpower/skills-react就是资源浪费,还可能引发冲突。正确的做法是:
- 前端框架技能:React 项目用
@superpower/skills-react,Vue 项目用@superpower/skills-vue,Svelte 项目用@superpower/skills-svelte; - 数据验证技能:如果项目重度依赖
Zod,就选@palantir/skills-zod;如果用Yup,就选@palantir/skills-yup; - 领域特定技能:电商项目可加
@sandai-org/ecommerce-skills(提供购物车、优惠券、支付流程的专用提示词);数学建模项目可加@mathmodel/skills-matlab(提供符号计算、数值积分的专用函数库)。
一个常见误区是“技能越多越好”。我曾见过一个项目同时启用了 7 个Skills,结果模型响应变慢,且不同技能的提示词相互干扰,生成的代码反而更混乱。我的经验是:从 1 个核心Skill开始,每增加一个,必须有明确的、可量化的业务需求支撑。比如,当你发现模型总在useQuery的onSuccess回调里忘记处理data的null情况,这时再引入@palantir/skills-validation,并配合## Rules里的具体校验规则,效果立竿见影。
3.2 ## Rules 区块:定义你的“代码宪法”
## Rules是CLAUDE.md的心脏,它用自然语言描述你项目中那些“不成文但必须遵守”的约定。这里的每一行,都是模型生成代码时的硬性约束。书写规则,有三条铁律:
第一,必须用祈使句,主语是“你”(指 Claude Code)。
❌ 错误:“API 请求应封装在自定义 Hook 中”
✅ 正确:“你必须将所有 API 请求封装在src/lib/api/目录下的自定义 Hook 中,Hook 名称必须以use开头,例如useUserProfileQuery。”
第二,必须包含可验证的、具体的路径和名称。
❌ 错误:“使用统一的状态管理”
✅ 正确:“你只能使用src/store/目录下的createStore函数创建 store,store 实例必须命名为appStore,且必须通过Provider组件包裹根节点。”
第三,必须附带“为什么”(可选但强烈推荐)。
这能让模型理解规则背后的意图,从而在边缘场景做出更合理的判断。例如:
- 你必须为所有fetch请求添加AbortController,并在组件卸载时调用abort()。 *原因:防止内存泄漏和状态更新错误,避免setState在已卸载组件上调用。*
一个真实的## Rules区块示例(来自一个大型后台管理系统):
## Rules - 你必须将所有 UI 组件放在 `src/components/` 目录下,按功能域分组,例如 `src/components/dashboard/`、`src/components/user/`。 - 你必须为所有 `Button` 组件指定 `variant` 属性,可选值为 `primary`、`secondary`、`outline`、`ghost`,禁止使用 `className` 直接覆盖样式。 - 你必须为所有 `Form` 组件添加 `onSubmit` 处理函数,该函数必须调用 `event.preventDefault()`,并使用 `formRef.current?.validateFields()` 进行校验(`formRef` 由 `Form.useForm()` 创建)。 - 你必须为所有 `Table` 组件的 `columns` 配置项,设置 `key` 字段,且 `key` 必须与后端返回的数据字段名完全一致,例如 `user_id` 对应 `key: 'user_id'`。 - 你必须为所有 `DatePicker` 组件设置 `format` 属性,值为 `'YYYY-MM-DD'`,并确保 `onChange` 回调接收的参数是 `moment` 对象,而非字符串。注意:这些规则不是凭空写的。它们全部来源于过去三个月的 Code Review 记录。我把所有被反复指出的、关于
Button样式、Table列配置、DatePicker格式的问题,一条条提炼出来,变成了CLAUDE.md里的规则。结果是,下一次 PR 中,这类问题的出现率降到了 0。
3.3 ## Context 区块:提供你的“项目快照”
## Context是CLAUDE.md的灵魂,它让模型从“通用程序员”变成“你项目的专属开发者”。这里不写规则,只写事实。它回答三个问题:我们在做什么?我们用什么?我们有什么?
一个高质量的## Context,应该包含以下四类信息:
1. 项目定位与目标用户
这是模型理解“为什么这样写”的最高层背景。例如:
- 本项目是一个面向企业客户的 SaaS 后台管理系统,核心用户是运营人员和客服主管。
- 主要功能模块包括:用户管理、工单系统、数据分析看板、权限配置中心。
2. 技术栈与关键依赖
精确到版本号,避免歧义。例如:
- 前端框架:React 18.2.0,使用 TypeScript 5.2.2。
- UI 库:Ant Design 5.12.0,所有组件必须通过
import { Button, Table } from 'antd';导入。- 状态管理:Zustand 4.4.1,store 定义在
src/store/。- 数据请求:TanStack Query 4.36.1,所有
useQuery必须从@tanstack/react-query导入。
3. 项目结构与关键路径
这是模型生成代码时的“地图”。例如:
- 核心业务逻辑位于
src/features/,每个功能域一个子目录,如src/features/user/、src/features/order/。- 全局工具函数位于
src/utils/,其中src/utils/api.ts封装了所有fetch请求,src/utils/formValidation.ts提供表单校验函数。- 全局样式变量定义在
src/styles/variables.less。
4. 当前开发任务与上下文
这是最动态的部分,每次进入新功能开发时,都应该更新。例如:
- 当前正在开发“工单批量导出”功能,位于
src/features/ticket/export/目录。- 后端 API 地址为
POST /api/v1/tickets/export,请求体为{ ticketIds: string[] },响应为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet。- 用户交互流程:用户在工单列表页勾选多条记录 → 点击“导出”按钮 → 弹出确认 Modal → 确认后发起请求 → 下载 Excel 文件。
这个区块的价值,在于它让模型摆脱了“猜”的过程。当你要生成一个导出按钮的点击事件处理函数时,模型不再需要猜测 API 地址、请求体结构、响应类型,它直接从## Context里拿到全部信息,生成的代码几乎零修改即可合并。
3.4 ## Examples 区块:提供你的“黄金样本”
## Examples是CLAUDE.md的“教学案例库”。它不提供规则,而是展示“正确答案长什么样”。这对于模型学习风格、命名习惯、代码组织方式至关重要。一个## Examples区块,应该包含 2-3 个高度典型的、经过 Code Review 确认无误的代码片段。
示例必须满足三个条件:
- 真实性:必须是项目中真实存在的、已上线的代码;
- 典型性:必须代表一类高频、高价值的开发模式;
- 完整性:必须包含导入、定义、使用,形成一个闭环。
一个真实的## Examples区块示例(来自一个电商项目):
## Examples ### 自定义 Hook:`useProductSearch` ```tsx // src/lib/api/useProductSearch.ts import { useInfiniteQuery } from '@tanstack/react-query'; import { searchProducts } from '@/utils/api'; export const useProductSearch = (keyword: string) => { return useInfiniteQuery({ queryKey: ['products', keyword], queryFn: ({ pageParam = 1 }) => searchProducts({ keyword, page: pageParam }), getNextPageParam: (lastPage) => lastPage.nextPage ?? undefined, }); };表单校验:LoginForm
// src/features/auth/LoginForm.tsx import { Form, Input, Button } from 'antd'; import { useForm } from 'antd/es/form/Form'; import { login } from '@/utils/api'; const LoginForm = () => { const [form] = useForm(); const handleSubmit = async (values: { username: string; password: string }) => { try { await login(values); // 登录成功逻辑 } catch (error) { form.setFields([{ name: 'password', errors: ['用户名或密码错误'] }]); } }; return ( <Form form={form} onFinish={handleSubmit}> <Form.Item name="username" rules={[{ required: true, message: '请输入用户名' }]}> <Input placeholder="用户名" /> </Form.Item> <Form.Item name="password" rules={[{ required: true, message: '请输入密码' }]}> <Input.Password placeholder="密码" /> </Form.Item> <Button type="primary" htmlType="submit">登录</Button> </Form> ); }; export default LoginForm;> 实操心得:`## Examples` 的维护成本很低,但收益极高。我要求团队成员,每当他们写出一个被表扬的、高质量的代码片段时,就顺手把它复制到 `CLAUDE.md` 的 `## Examples` 区块里,并标注清楚“这是 `useProductSearch` Hook 的标准写法”。久而久之,这个区块就成了团队的“最佳实践博物馆”。模型在生成类似代码时,会优先模仿这些样本,而不是从互联网上抓取五花八门的“最佳实践”。 ## 4. 实操全流程:从零开始搭建你的 CLAUDE.md 现在,让我们把理论付诸实践。下面是一个完整的、可复现的 `CLAUDE.md` 搭建流程,从初始化到日常维护,每一步都附带我的实操经验和避坑指南。 ### 4.1 环境准备与 CLI 初始化 首先,确保你的开发环境满足基本要求。Claude Code 的本地代理(基于 OpenSpec)对 Node.js 版本有严格要求,**必须使用 Node.js 18.x 或 20.x**。我试过用 Node.js 16.x,`@claude-code/cli` 会报 `ERR_REQUIRE_ESM` 错误,因为其依赖的 `@openspec/core` 已全面采用 ESM 模块。别省事,老老实实升级 Node。 ```bash # 推荐使用 nvm 管理 Node 版本 nvm install 20.12.0 nvm use 20.12.0然后,全局安装 Claude Code CLI 工具:
npm install -g @claude-code/cli # 或者,如果你更喜欢局部安装(推荐,避免全局污染) npx @claude-code/cli@latest init注意:
npx @claude-code/cli init是最安全的方式,因为它总是拉取最新版 CLI。而npm install -g可能因网络问题卡住,且全局安装后,不同项目可能因 CLI 版本不一致产生奇怪问题。
CLI 初始化命令会引导你完成一系列配置:
- 选择项目类型:它会扫描你的
package.json,自动识别是 React、Vue 还是纯 TS 项目。如果识别错误,手动选择; - 选择 Skills:它会列出当前生态中主流的
Skills包,并让你勾选。此时,务必只勾选你项目真正需要的 1-2 个。比如 React 项目,先只选@superpower/skills-react; - 生成基础文件:CLI 会为你创建
CLAUDE.md、.claude-code.json(运行时配置)和skills/目录(存放Skills包)。
生成的初始CLAUDE.md是一个骨架,只有## Skills和## Rules标题。不要直接开始写!先做一件更重要的事:运行npx @claude-code/cli check。
这个命令会启动一个轻量级的本地服务,模拟 Claude Code 的解析流程,检查CLAUDE.md的语法是否合法、Skills是否能正确加载、Rules是否有明显歧义。它会输出一份详细的诊断报告,比如:
[WARN] Rule #3: "所有 API 必须用 React Query 封装" 缺少具体路径信息,建议补充为 "src/lib/api/"。 [ERROR] Skill "@superpower/skills-react@1.8.2" not found in node_modules. Please run `npm install @superpower/skills-react@1.8.2`.根据报告,逐一修复。这是避免后续所有问题的最关键一步。我见过太多人跳过这步,结果在 VS Code 里折腾半天,发现插件根本没加载Skills,全是白忙活。
4.2 第一版 CLAUDE.md:聚焦核心规则
不要试图一步到位。第一版CLAUDE.md的目标,是解决你团队当前最痛的 3 个问题。打开最近一周的 Code Review 记录,找出被最多人指出的、最影响效率的 3 条问题,把它们变成## Rules。
假设你团队的痛点是:
Button组件样式混乱,有人用className,有人用type;useEffect里滥用async;fetch请求没有错误处理。
那么,你的第一版CLAUDE.md的## Rules区块,就应该只包含这三条:
## Rules - 你必须使用 Ant Design 的 `Button` 组件,禁止通过 `className` 添加样式,所有样式变更必须通过 `type`、`size`、`shape` 等内置属性控制。 - 你必须确保 `useEffect` 的回调函数是同步的。如果需要异步操作,请将其提取为独立的 `async` 函数,并在 `useEffect` 内部调用。 - 你必须为所有 `fetch` 请求添加 `try...catch` 块,并在 `catch` 中调用 `console.error` 记录错误,同时抛出一个带有 `message` 的 `Error` 对象。同时,在## Skills里,只保留@superpower/skills-react。其他Skills先不加,等这三条规则跑通、验证有效后再逐步引入。
实操心得:第一版的目标不是“完美”,而是“有效”。我给自己定的 KPI 是:第一版上线后,这三条问题在新代码中的出现率为 0。如果达到了,说明
CLAUDE.md的基础机制是通的;如果没达到,就回头检查npx @claude-code/cli check的报告,或者检查 VS Code 插件是否真的重启了。
4.3 集成到 VS Code:让智能编码真正发生
Claude Code 的核心价值,是在你写代码时实时生效。所以,VS Code 插件的配置是成败关键。官方插件名为Claude Code,但请注意,它和Cursor(另一个基于 OpenSpec 的编辑器)是两个不同的产品。Cursor内置了 OpenSpec 支持,而 VS Code 需要额外配置。
安装插件后,打开 VS Code 的设置(Cmd+,或Ctrl+,),搜索claude code,找到Claude Code: Enable,勾选启用。
最关键的一步,是配置Claude Code: Config Path。默认值是./CLAUDE.md,这通常是对的。但如果你的CLAUDE.md不在项目根目录(比如放在config/下),就必须在这里填写正确的相对路径,例如./config/CLAUDE.md。
提示:VS Code 插件有一个隐藏的“重载配置”功能。当你修改了
CLAUDE.md后,不需要重启 VS Code,只需按下Cmd+Shift+P(Mac)或Ctrl+Shift+P(Win),输入Claude Code: Reload Configuration,回车即可。这个操作会触发插件重新解析CLAUDE.md,立竿见影。
为了验证是否生效,打开一个.tsx文件,输入useEffect,然后按Tab或Enter触发代码补全。如果配置正确,你应该看到一个符合你## Rules的、带try...catch的useEffect模板。如果没有,检查Claude Code: Status(在 VS Code 状态栏右下角),它会显示当前连接状态和加载的Skills列表。
4.4 日常维护与迭代:让它成为活的文档
CLAUDE.md不是一次性工程,而是一个持续演进的“活文档”。我的团队把它纳入了标准的开发流程:
- Code Review 必查项:每次 PR,除了审查业务逻辑,Reviewer 必须检查
CLAUDE.md是否需要更新。如果这次 PR 引入了一个新的、重要的编码模式(比如一个新的自定义 Hook),Review 通过后,作者必须把它补充到## Examples区块; - 每周回顾会议:每周五下午,团队花 15 分钟,快速浏览
CLAUDE.md的 Git 历史。看看最近一周新增了哪些规则,哪些规则被证明无效(可以删除),哪些Examples需要更新; - 新人入职包:新同事入职第一天,除了看
README.md,第一件事就是阅读CLAUDE.md。它比任何 Wiki 都更能快速传达团队的技术文化和约定。
一个典型的迭代场景:我们团队在引入Zod进行表单校验后,发现模型生成的z.string().min(1)总是漏掉.trim(),导致空格校验失败。于是,我们在## Rules里追加了一条:
- 你必须为所有z.string()Schema 添加.trim()方法,例如z.string().min(1).trim()。
同时,在## Skills里,我们npm install @palantir/skills-zod@0.9.0,并把它加入CLAUDE.md。几天后,所有新生成的表单校验代码,都自动包含了.trim()。
最后分享一个小技巧:
CLAUDE.md的## Context区块,可以利用 Git 的pre-commithook 自动更新。我们写了一个简单的脚本,每次 commit 前,自动读取package.json的dependencies和devDependencies,生成最新的技术栈快照,并更新到## Context的“技术栈与关键依赖”部分。这样,CLAUDE.md就永远和项目的真实状态保持一致,无需人工维护。
5. 常见问题排查与独家避坑指南
在实际落地过程中,CLAUDE.md会遇到各种“看似玄学、实则有因”的问题。下面是我整理的最典型、最高频的 5 个问题,以及我的排查思路和解决方案。这些问题,90% 的初学者都会遇到,但官方文档往往一笔带过。
5.1 问题:VS Code 插件显示“Connected”,但代码补全毫无反应
这是最让人抓狂的问题。状态栏显示绿色,Claude Code: Status也说一切正常,但敲useEffect就是不弹出模板。别急,按这个顺序排查:
第一步:检查CLAUDE.md的语法
Markdown 的语法错误(比如一个多余的#,或者列表缩进不对)会导致整个文件解析失败。运行npx @claude-code/cli check,它会告诉你具体哪一行、哪个字符出错了。最常见的错误是:在## Rules下面,不小心多了一个空行,然后开始写规则,结果解析器认为这是一个新的区块,而不是Rules的内容。
第二步:检查Skills的安装路径
VS Code 插件默认从项目根目录的node_modules/下查找Skills。但如果你的Skills是通过npx skills add ...安装的,它可能会被装到skills/目录下。这时,你需要在.claude-code.json里手动指定skillsPath:
{ "skillsPath": "./skills" }第三步:检查 VS Code 的语言模式
Claude Code 插件只在特定的语言模式下激活。确保你当前打开的文件,其右下角的语言模式是TypeScript React(对于.tsx文件)或TypeScript(对于.ts文件)。如果是Plain Text,插件根本不会工作。点击右下角的语言模式,选择正确的选项。
我的独家技巧:在 VS Code 的设置里,搜索
files.associations,添加一条:"*.tsx": "typescriptreact"这样,所有
.tsx文件都会默认用TypeScript React模式打开,一劳永逸。
5.2 问题:模型生成的代码符合规则,但类型报错(TypeScript)
这是一个经典陷阱。CLAUDE.md的Rules只约束代码的“形状”,不保证类型安全。比如你写了## Rules:“- 你必须为fetch请求添加try...catch`”,模型会生成:
try { const res = await fetch('/api/user'); const data = await res.json(); } catch (error) { console.error(error); }这段代码语法完美,但 TypeScript 会报错:res.json()的返回类型是any,而你期望的是User类型。
解决方案是:在## Context里,必须提供类型定义的路径。例如:
- 所有 API 响应类型定义在
src/types/api.ts,其中UserResponse接口定义了/api/user的返回结构。
然后,在## Rules里,补充类型要求:
- 你必须为所有fetch请求的res.json()调用,添加类型断言,例如await res.json() as UserResponse,类型定义来自src/types/api.ts。
这样,模型就能生成带类型断言的代码了。
5.3 问题:Skills加载成功,但特定功能(如useQuery补全)不生效
这通常是因为Skills的内部提示词(prompt)和你的项目上下文冲突。比如@superpower/skills-react的默认提示词,假设你用的是React Query v3,而你的项目用的是v4,API 有差异。
解决方案是:不要迷信Skills的“开箱即用”,必须结合CLAUDE.md进行微调。在## Rules里,明确写出你项目的 API 版本和用法:
- 你必须使用 TanStack Query v4 的useQuery,导入路径为@tanstack/react-query,queryKey必须是数组,queryFn必须返回 Promise。
这样,即使Skills的默认提示词是为 v3 写的,你的Rules也会覆盖它,强制模型生成 v4 的代码。
5.4 问题:CLAUDE.md更新后,旧的补全建议仍然存在
VS Code 插件有缓存机制。它不会每次敲代码都重新解析CLAUDE.md,而是会缓存解析结果。所以,当你修改了## Rules,旧的、不符合新规则的补全建议还会出现。
解决方案有两个:
- 立即生效:执行
Claude Code: Reload Configuration(Cmd+Shift+P),强制刷新缓存; - 彻底清除:关闭 VS Code,删除项目根目录下的
.claude-code-cache/目录(如果存在),然后重启。
注意:
.claude-code-cache/是插件的私有缓存,不会被 Git 跟踪,删除它没有任何风险。
5.5 问题:在多人协作项目中,CLAUDE.md的版本不一致
这是团队落地的最大障碍。A 同学的CLAUDE.md里有 10 条Rules,B 同学的只有 3 条,C 同学的Skills版本还比别人低一个 patch。结果就是,三个人用同一个模型,生成的代码风格千差万别。
终极解决方案是:把CLAUDE.md的一致性,变成 CI/CD 的一部分。我们在package.json的scripts里加了一条:
"scripts": { "check:claude": "npx @claude-code/cli check --strict" }然后,在 CI 的test阶段,加入这行命令。--strict参数会让check命令在发现任何警告(warning)时,也返回非零退出码,从而让 CI 失败。这意味着,任何CLAUDE.md的不合规修改,都无法通过 CI,也就无法合并到主分支。
这个方案的效果是惊人的。它把“遵守约定”从一个道德要求,变成了一个技术强制。现在,
CLAUDE.md就是项目的一等公民,和package.json、tsconfig.json一样重要。谁想改它,必须说服整个团队,并且通过 CI 的考验。
6. 进阶应用:从 CLAUDE.md 到团队智能开发中枢
当CLAUDE.md在单个项目中稳定运行后,它的价值就开始向外辐射。它不再只是一个配置文件,而逐渐演变为一个团队级