Skip to content

04 · 项目初始化与 CLAUDE.md

📚 系列导航:上一篇 03 工作原理与 API 配置 讲清了 Claude Code 怎么干活。这一篇解决一个最高频的问题:每次开新会话它都不记得上次的事,怎么让项目规矩「一次写入,长期生效」?


01 问题:Claude 的「失忆」

每个 Claude Code 会话都从全新的上下文窗口开始。你上次交代的「用 pnpm 不用 npm」「测试在 tests/ 目录」「提交前跑 lint」,这次它一概不记得。

CLAUDE.md 就是解决这个问题的——它是 Claude 每次开工必读的「入职手册」,把项目的规矩一次性写进去,之后每次会话都自动遵守。

02 /init:一键生成 CLAUDE.md 草稿

/init 是 Claude Code 内置的斜杠命令,作用:让 Claude 自己扫描项目,把客观事实(技术栈、目录结构、常用命令)整理成 CLAUDE.md 草稿。

操作:

bash
cd /path/to/your-project
claude

在输入框敲 /init,回车。Claude 自动扫描项目结构、识别技术栈、落盘 CLAUDE.md。

NOTE

重要

  1. 一定要在项目根目录启动 claude 再敲 /init
  2. 项目里已有 CLAUDE.md 时,/init 不会覆盖,只建议改进。
  3. /init 生成的是草稿,不是终稿——团队约定、部署流程这些它扫不到的硬约束,必须你人工补。

03 CLAUDE.md 三层级

层级放哪管多大范围进不进 git
用户级~/.claude/CLAUDE.md你这台机器上所有项目❌ 不进
项目级./CLAUDE.md./.claude/CLAUDE.md当前项目✅ 进
子目录级任意子目录/CLAUDE.mdClaude 读到那个目录时才加载✅ 进
本地级(变体)./CLAUDE.local.md当前项目,仅你自己❌ 加进 .gitignore

加载顺序:从最广到最具体依次加载,拼接不覆盖。越靠近工作目录的指令越晚读,冲突时越占优。

实际分工:个人习惯(如「回复用中文」「改代码前先说思路」)放用户级,团队规矩(技术栈、命令、禁改清单)放项目级,大仓库多模块时用子目录级拆。

04 该写什么 vs 不该写什么

✅ 该写

类别说明例子
项目概述一句话说清项目是干嘛的「基于 FastAPI 的订单管理后端」
技术栈语言、框架、数据库、关键工具「Python 3.11 / PostgreSQL / pytest」
常用命令测试、构建、检查怎么跑uv run pytestuv run ruff check .
代码约定风格、命名、必须遵守的写法「函数必须有类型注解」「字符串用双引号」
明确的「不要做」雷区、禁改文件、必须先问的操作「禁改 migrations/ 已有文件」

❌ 不该写

  • 长篇背景(公司介绍、产品愿景、技术选型历史)
  • 过时信息(换了包管理器没更新 CLAUDE.md)
  • Claude 看代码能自己推出来的东西(目录结构、ESLint 已定义的代码风格)
  • 正确的废话(「写干净的代码」)

好规矩长得像「规则」不是「散文」

❌ 模糊散文(没用)✅ 具体规则(管用)
代码应该比较整洁函数不超过 50 行,超了必须拆
尽量写测试每个新增函数必须有对应单元测试
注意安全用户输入必须先过 sanitize() 再进数据库查询

NOTE

200 行红线:全文目标 ≤ 200 行。CLAUDE.md 跟你的对话抢同一个上下文窗口,塞太多废话,重要规矩被淹在噪音里,遵守度反而下降。

05 引用其他文件:@ 语法

text
有关项目概述,请参阅 @README,可用命令见 @package.json。
git 工作流 @docs/git-instructions.md

WARNING

@ 引用不省上下文@ 引用在启动时展开并加载到上下文中,被引用的文件照样全量进上下文@ 是用来让结构更清爽,不是用来省 token 的。想省得真删内容。

06 维护:随手补 + 定期精简

会话里想补一条规矩:

text
把「数据库操作必须走 Service 层,别在路由里直接写 SQL」这条加进 CLAUDE.md

或敲 /memory 列出所有已加载的记忆文件,自己编辑。

触发精简的时机: 换了包管理器/构建工具、加了或去了重要依赖、发现 CLAUDE.md 又悄悄涨过 200 行。


07 动手:最小项目跑通 /init

bash
mkdir init-demo && cd init-demo
echo '{"name": "init-demo", "scripts": {"test": "echo test ok"}}' > package.json
echo 'console.log("hello from init-demo");' > index.js
claude

在输入框敲 /init,等待生成。退出后 cat CLAUDE.md 确认内容。再进 claude 问「这个项目的测试命令是什么?」——它应该直接回答,不用再去翻 package.json


08 小结

知识点关键结论
/init进新项目第一件事,让 Claude 自动生成 CLAUDE.md 草稿
三层级用户级(个人) → 项目级(团队) → 子目录级(模块),拼接加载
该写什么概述/技术栈/命令/约定/禁区
不该写什么Claude 自己能推出来的、长篇背景、过时信息
维护会话里直接让 Claude 加,定期精简到 ≤ 200 行

NOTE

下一篇05 界面操作与快捷键:项目规矩写好了,接下来把手放对地方——界面认哪几块、快捷键怎么按才能快一倍。

Claude Code 实战手册