Claude Code 最佳实践仓库拆解:一篇看懂 Agentic Engineering 落地方法

很多人开始用 Claude Code 时,第一反应都是优化 prompt。

但如果你已经在真实项目里用过一段时间,大概率会发现一个更棘手的问题:

不是 prompt 不够好,而是 Claude 每次进入项目时都像“重新认识你一次”。

你得反复解释这些东西:

  • 项目结构是什么
  • 哪些命令可以跑
  • 代码规范有哪些
  • 哪些目录是关键路径
  • 哪些模式必须遵守

这类信息如果一直靠会话里现讲,最终一定会出问题。上下文会越来越长,重要规则会被淹没,Claude 的行为也会越来越不稳定。

这也是我看完 shanraisshan/claude-code-best-practice 之后最强烈的一个感受:

如果你想把 Claude Code 用稳,最该先写好的不是一段万能 prompt,而是一份清晰、克制、长期有效的 CLAUDE.md

但只写好 CLAUDE.md 还不够。

真正把 Claude Code 从“聊天工具”升级成“工程系统”,至少还要再补四层:

  • Commands:把高频任务固定成统一入口
  • Subagents:把不同职责拆成独立角色
  • Skills:把知识做成按需加载的模块
  • .claude/settings.json:把权限、hooks 和行为边界固化到配置层

这篇我不只讲 CLAUDE.md,而是顺着这个仓库,把这 5 个模块一起拆开。

CLAUDE.md 到底是什么

可以把它理解成一句话:

它不是面向人的 README,也不是一次会话里的临时提示,而是项目级记忆入口。

这个仓库把 CLAUDE.md 放在非常核心的位置,原因很简单:

  • Claude Code 会读取它
  • 它会持续影响 Claude 的行为
  • 它能让项目上下文从“临时描述”变成“长期记忆”

很多人以为“项目背景讲一次就够了”,但工程实践里真正稳定的方式,往往不是讲一次,而是把该记住的事情写成系统的一部分

为什么 CLAUDE.md 比你想象中更重要

因为它解决的是 Claude Code 最常见的三个失控点。

1. 反复解释项目背景

如果没有 CLAUDE.md,每次开新会话都要重新说:

  • 这个仓库是干什么的
  • 目录怎么组织
  • 前后端分别在哪
  • 测试命令是什么

这不仅浪费时间,还会让每次说明的口径都不完全一样。

2. 规则越来越依赖会话上下文

很多团队会把重要约束写进一长串 prompt,比如:

  • 不要改某个目录
  • 必须按某种模式写组件
  • 某个接口一定要走统一封装

问题是,这些规则一旦只存在于会话里,就很容易在长上下文里被稀释掉。

3. Claude 知道得太多,反而不知道什么最重要

这是很多人容易忽略的一点。

Claude 不是“知道越多越好”,而是“越知道什么最重要越好”。

CLAUDE.md 的作用,本质上不是堆更多信息,而是帮 Claude 建立优先级。

一个好的 CLAUDE.md 应该写什么

根据这个仓库的最佳实践,CLAUDE.md 最适合放那些:

  • 稳定
  • 高频
  • 对决策有强影响

的信息。

最典型的内容包括下面几类。

1. 项目架构概览

Claude 第一次进项目时,最需要的是地图,而不是细节。

所以你应该先告诉它:

  • 这个项目是什么类型
  • 主要模块有哪些
  • 目录结构怎么分
  • 哪些目录分别承担什么职责

比如:

## Project

This is a monorepo with:
- `apps/web`: frontend app
- `apps/api`: backend service
- `packages/ui`: shared components
- `packages/config`: shared configs

这一段的意义不在于“介绍项目”,而在于让 Claude 后续读文件时能快速建立定位。

2. 常用命令

这是 CLAUDE.md 里非常实用的一部分。

你最好把下面这些命令明确写进去:

  • 安装依赖
  • 启动开发环境
  • 运行测试
  • 构建产物
  • 类型检查
  • lint

比如:

## Commands

- Install: `pnpm install`
- Dev: `pnpm dev`
- Test: `pnpm test`
- Typecheck: `pnpm typecheck`
- Lint: `pnpm lint`

这能直接减少 Claude 在命令选择上的猜测成本。

3. 关键约定

这部分最有价值。

不是把所有代码规范都搬进来,而是只写那些“如果不遵守,后果会明显变差”的规则。

比如:

  • 所有 API 请求必须走统一客户端
  • 不允许直接访问数据库连接
  • 前端组件优先复用某个目录下的模式
  • 测试文件必须跟实现同层

如果规则只是“语法习惯”,优先交给 linter 或 formatter。
如果规则直接影响结构和行为,才适合写进 CLAUDE.md

4. 关键参考路径

如果项目里已经有“标准答案”,一定要告诉 Claude 去哪里看。

比如:

  • 组件参考实现在哪
  • 路由写法参考哪个文件
  • 状态管理参考哪个模块
  • 后端 handler 应该对齐哪种模式

这比抽象地说“请遵循现有风格”有效得多。

一个不好的 CLAUDE.md 通常长什么样

这个仓库反复强调一件事:CLAUDE.md 一定要克制。

推荐长度大致控制在 150 到 200 行以内。原因不是为了好看,而是因为太长之后,Claude 对它的遵循度会明显下降。

下面这些内容,通常都不适合直接塞进 CLAUDE.md

1. 整份 API 文档

这是最典型的误用。

API 文档适合放在独立文档里,被引用;不适合整个内嵌进 CLAUDE.md

2. 大段代码示例

除非某段代码是绝对关键模式,否则不要在这里贴很多实现细节。

因为 CLAUDE.md 最重要的是建立约束和路径,而不是充当知识库全文。

3. 经常变化的信息

比如:

  • 临时分支说明
  • 本周开发安排
  • 迭代中的细节任务

这些东西变化太快,不适合作为长期记忆。

4. 密钥、凭证和敏感信息

这一点不用多说,永远不要写进去。

CLAUDE.md 和 README、Rules、Skills 到底怎么分工

这是最容易混淆的地方。

我的理解是:

  • README 面向人
  • CLAUDE.md 面向 Claude 的长期项目记忆
  • Rules 面向路径或主题的局部约束
  • Skills 面向按需加载的知识模块

你可以用一个简单判断法:

什么该进 CLAUDE.md

  • 几乎每次都相关
  • 稳定存在
  • 对 Claude 判断影响很大

什么该进 Rules

  • 只在某个目录生效
  • 只对某种文件类型生效
  • 需要模块化拆分

什么该进 Skills

  • 不是每次都需要
  • 一旦需要,信息可能很多
  • 更像方法库、模式库、领域知识

这也是为什么这个仓库一直在强调“渐进式暴露知识”。
不是所有东西都该常驻上下文。

在 monorepo 里,CLAUDE.md 应该怎么放

这个仓库对 monorepo 的说明非常有价值,因为它把加载规律讲清楚了。

可以简单记成 3 句话:

  1. 向上找,会加载祖先目录的 CLAUDE.md
  2. 向下看,子目录的 CLAUDE.md 按需懒加载
  3. 兄弟目录不会互相污染

这意味着非常适合这样设计:

根目录 CLAUDE.md

写全局规则,比如:

  • 仓库结构
  • 通用命令
  • 提交和测试要求
  • 跨项目共享约定

子项目 CLAUDE.md

写局部规则,比如:

  • 前端组件模式
  • 后端接口规范
  • 特定框架约束
  • 本模块的测试习惯

这种分层的好处是:Claude 在前端目录工作时,不会被后端细节污染;在后端目录工作时,也不会一直带着前端上下文跑。

一个实用的 CLAUDE.md 模板

如果你准备开始写第一版,可以直接从下面这个骨架开始。

# Project Overview

This project is a monorepo for X.

## Structure

- `apps/web`: frontend app
- `apps/api`: backend service
- `packages/ui`: shared components

## Commands

- Install: `pnpm install`
- Dev: `pnpm dev`
- Test: `pnpm test`
- Lint: `pnpm lint`
- Typecheck: `pnpm typecheck`

## Conventions

- All API calls go through `lib/api.ts`
- Reuse components from `packages/ui` before creating new ones
- Follow route patterns in `apps/api/src/routes`
- Put tests next to implementation files

## Key References

- Frontend example: `apps/web/src/components/TodoList.tsx`
- API example: `apps/api/src/routes/todos.ts`
- Shared UI example: `packages/ui/src/Button.tsx`

## Do / Don't

- Do follow existing file patterns before introducing new abstractions
- Do run tests for changed modules
- Don't introduce new state management without checking existing patterns

这份模板的重点不是“完整”,而是“足够稳定、足够明确、足够短”。

CLAUDE.md 时,我建议你遵守 4 个原则

1. 只写会长期成立的信息

如果一条信息过两周就会过期,它大概率不该进 CLAUDE.md

2. 只写真正会改变 Claude 行为的信息

不要把“可有可无的说明”塞进去。优先保留那些会直接影响判断和执行路径的内容。

3. 少讲抽象原则,多给路径和参照物

“遵循现有风格”这种话帮助有限。
“参考 apps/web/src/components/TodoList.tsx 的模式”才是真正可执行的指令。

4. 超出长度就拆分,不要硬塞

当你发现 CLAUDE.md 已经越来越长时,不要继续加。应该开始拆:

  • 公共记忆留在 CLAUDE.md
  • 目录差异放进 Rules
  • 大块知识移到 Skills

这才是长期可维护的结构。

只有 CLAUDE.md 还不够,后面四层也得补上

到这里你会发现,CLAUDE.md 解决的是“Claude 进入项目后先知道什么”。

但真实工程里还会继续遇到另外四个问题:

  • 高重复流程,能不能不要每次都手写 prompt?
  • 不同类型的任务,要不要交给不同角色处理?
  • 哪些知识应该按需加载,而不是常驻上下文?
  • 哪些权限和自动化,不该靠 prompt 临时约束?

这四个问题,分别对应:

  • Commands
  • Subagents
  • Skills
  • .claude/settings.json

这也是这个仓库最值得继续往下拆的地方。

第二层:Commands 应该怎么设计

如果说 CLAUDE.md 解决的是“Claude 先知道什么”,那 Commands 解决的就是:

哪些高频任务,应该从临时 prompt 升级成固定工作流入口。

为什么很多团队明明在重复做同一件事,却还是一直手写 prompt

这是非常常见的低效点。

比如下面这些事,你可能已经让 Claude 做了很多次:

  • review 一个 PR
  • 写 release note
  • 生成某类技术文档
  • 按固定流程调试问题

但很多团队的做法还是:

  • 每次重新组织一遍提示词
  • 每次重新解释目标和顺序
  • 每次重新提醒 Claude 要遵循哪些步骤

这不仅浪费时间,也会导致执行口径越来越不一致。

Command 到底是什么

按这个仓库的设计,Command 不是普通 prompt 别名,而是:

它通常放在 .claude/commands/*.md,用 Markdown 文件定义。

比较关键的字段包括:

  • name
  • description
  • model
  • argument-hint
  • allowed-tools
  • context
  • agent
  • hooks

从职责上看,command 最核心的价值不是“自己做完所有事”,而是“把正确的事按正确顺序串起来”。

CommandSubagentSkill 的区别到底是什么

这是最容易混淆的地方。

我的建议是直接记成一句话:

  • Command 负责流程入口
  • Subagent 负责角色执行
  • Skill 负责知识加载

也就是说:

  • command 决定“这件事怎么走”
  • subagent 决定“谁来做这件事”
  • skill 决定“做的时候要加载什么方法和规则”

只要这个边界没分清,后面所有设计都会开始打架。

什么场景最适合做成 command

我觉得最典型的是下面这三类:

1. 固定步骤的流程任务

比如:

  • 先收集输入
  • 再调用 agent
  • 最后生成产物
2. 团队里会反复执行的标准动作

比如:

  • 发布前检查
  • 标准化 review
  • 固定格式的总结
3. 希望统一入口的复杂任务

比如你不希望每个人都用不同 prompt 去做同一件事,那就应该抽成 command。

这个仓库里的 /weather-orchestrator 为什么是个好示例

这个 command 很适合入门,因为它特别清楚地展示了编排职责。

它做的事情大致是:

  1. 先问用户温度单位
  2. 再通过 Task / Agent 工具调用 weather-agent
  3. 最后调用 weather-svg-creator 生成 SVG 和 markdown 输出

这里最值得学的不是天气本身,而是它的职责边界:

  • command 不直接去抓天气
  • command 不自己负责天气知识
  • command 负责组织整个工作流顺序

这正是一个好 command 的样子。

什么时候该把一个 prompt 升级成 command

我很建议用一个很简单的标准:

同类 prompt 重复出现 3 次以上,就该考虑抽成 command。

因为这通常说明:

  • 这个任务已经高频
  • 这个流程已经相对稳定
  • 继续临时手写的收益越来越低

一个可直接照着写的 command 骨架

---
description: Review a pull request and summarize risks, regressions, and follow-up actions
model: sonnet
---

1. Ask the user for the PR link or changed files if not provided.
2. Inspect the changed files and identify behavioral risks.
3. Use the appropriate agent if the task needs specialized review.
4. Summarize findings in priority order.

Constraints:
- Focus on bugs, regressions, and missing tests.
- Do not rewrite unrelated code.
- Keep the final summary concise and actionable.

这类 command 最大的价值,不是省几行字,而是把工作流固化成团队资产。

command 最容易写坏的地方

我觉得最常见的是这 4 个:

1. 把 command 写成超长 prompt

如果一个 command 只是把原来临时 prompt 原封不动存起来,它的价值其实不大。

2. command 自己承担了太多执行细节

command 应该更多负责编排,而不是吞掉所有执行职责。

3. 没有明确输入输出

好的 command 通常很清楚:

  • 它需要用户提供什么
  • 它会调用什么角色
  • 最终输出什么结果
4. 和 agent、skill 边界不清

这几层一旦混了,后面维护成本会非常高。

第三层:Subagents 应该怎么设计

很多人一听到 agent,就会本能地多拆几个。

但真实情况通常是:agent 不是越多越好,职责越清晰越好。

为什么很多人拆了 agent 反而更乱

常见问题基本就这几种:

  • 把 agent 当成“更长一点的 prompt”
  • command 和 agent 不分层,谁都在做流程编排
  • 一个 agent 同时负责调研、改代码、写文档、跑测试
  • 给 agent 开了太多工具,结果行为边界非常模糊

这会导致一个很典型的问题:

你以为自己在做模块化,实际上只是在复制一堆职责不清的提示词。

Subagent 到底是什么

按这个仓库的思路,Subagent 更像一句话:

它和 command、skill 的区别一定要分清:

  • Command 是流程入口
  • Subagent 是执行角色
  • Skill 是知识模块

也就是说:

  • command 决定流程怎么走
  • subagent 决定谁来做这件事
  • skill 决定做事时加载什么知识

这个边界一旦清楚,Claude Code 的结构就会稳定很多。

什么时候该拆一个 subagent

我建议至少满足下面两个条件再拆:

  1. 任务本身有稳定职责边界
  2. 这个职责需要独立的工具、模型、权限或记忆

典型适合拆 agent 的场景包括:

  • 安全审查
  • 测试生成
  • 数据库分析
  • 文档整理
  • 前端实现
  • 只读调研

如果一个任务只是偶尔出现,或者没有稳定边界,那大概率还不值得拆 agent。

这个仓库里的 weather-agent 为什么写得干净

它是一个很好的例子,因为它只做一件事:

  • 使用自己允许的工具
  • 读取预加载的 weather-fetcher
  • 获取迪拜温度
  • 把结果返回给 command

它没有做这些事:

  • 不负责跟用户来回对话
  • 不负责编排完整流程
  • 不负责最终 SVG 输出

这正是好的 subagent 该有的样子:边界小、职责清、输出明确。

设计 subagent 时,frontmatter 里最值得关注哪些字段

这个仓库里的 subagent 配置里,有几个字段特别关键:

  • name
  • description
  • tools
  • model
  • permissionMode
  • maxTurns
  • skills
  • memory
  • isolation

如果只说最重要的几个,我会优先看这 5 个:

1. description

这不是介绍文案,而是调用条件说明。

它应该告诉 Claude:

  • 这个 agent 在什么情况下被调用
  • 它擅长处理什么问题
  • 它不处理什么问题
2. tools

这是 agent 的能力边界。

经验上非常实用的一条是:

  • 只读 agent 就只给 ReadGrepGlob
  • 需要改文件再加 WriteEdit
  • 需要查外部资料再给 WebFetchWebSearch

不要因为省事就全部放开。工具越多,漂移空间越大。

3. permissionMode

这个字段决定 agent 执行操作时的安全模式。

常见模式包括:

  • default
  • acceptEdits
  • dontAsk
  • bypassPermissions
  • plan

如果你还在起步阶段,优先考虑:

  • 改代码 agent 用 acceptEdits
  • 调研 agent 用 plan

直接上 bypassPermissions 风险很高,不建议当默认方案。

4. skills

这里决定 agent 启动时预加载哪些知识。

这个设计很重要,因为它直接决定:

  • agent 是不是带着领域知识启动
  • 主会话是不是需要为这些知识额外占上下文
5. memory

这个字段决定记忆范围:

  • user
  • project
  • local

最实用的理解方式是:

  • 跨项目可复用的知识,用 user
  • 团队共享的项目知识,用 project
  • 你自己本地偏好,用 local

一个我建议照着抄的 subagent 骨架

---
name: api-review-agent
description: Review backend API changes for route patterns, validation, and error handling
tools: Read, Grep, Glob, Edit, Write
model: sonnet
permissionMode: acceptEdits
maxTurns: 12
skills:
  - backend-api-rules
memory: project
---

Review API-related changes only.

Focus on:
- route consistency
- validation
- error handling
- existing project patterns

Do not redesign unrelated modules.
Return a concise summary of findings and edits.

这个骨架里最重要的不是字段齐全,而是你能看出它的职责边界。

设计 subagent 时最容易犯的错

我觉得最常见的是这 4 个:

1. 让 agent 同时承担流程和执行

流程应该交给 command,执行交给 agent。两者一混,后面会越来越难维护。

2. 一个 agent 做太多不相关事情

“全能 agent” 听起来方便,但长期看最不稳定。

3. 工具给太多

每多一个工具,就多一层不必要的自由度。

4. 没有明确 memory 范围

如果你自己都不知道这份知识应该存在用户级、项目级还是本地级,那 agent 的行为大概率也会混乱。

第四层:Skills 到底适合存什么内容

如果说 CLAUDE.md 是长期记忆,Subagents 是角色,那么 Skills 就是按需加载的知识包。

这一层特别容易被写坏。

为什么很多 skill 最后都变成了杂物间

因为大家太容易把 skill 当成“能存很多内容的地方”。

于是结果往往是:

  • 什么都往里塞
  • CLAUDE.md、rules 职责重叠
  • skill 太大,调用一次就塞爆上下文
  • 内容过于死板,只剩 checklist,没有真正的知识结构

这个仓库里最有价值的一点,是它强调了一个核心原则:

Skill 到底是什么

我更愿意把它理解成:

它适合做的事情,不是替代所有记忆,而是补充主上下文里不该常驻的知识。

什么内容适合放进 skill

按这个仓库的思路,比较适合放进 skill 的通常有 4 类:

1. 领域知识

比如:

  • 前端约定
  • 数据库审查规则
  • 接口设计规范
  • 发布说明模板
2. 可复用工作流

不是那种死板到每一步都锁死的流程,而是有明确目标和约束的工作方式。

3. Gotchas

这类内容特别有价值,因为它正好是 Claude 默认知识里最容易缺的部分。

比如:

  • 这个项目里哪些坑最常见
  • 哪种做法在这里会出问题
  • 哪个目录必须先参考现有模式
4. 模板和规则库

只要这些模板不是所有会话都必须带着,就很适合做成 skill。

什么内容不适合放进 skill

这个判断更重要。

下面这些东西,通常不该放 skill:

1. 所有会话都必须知道的信息

这种内容应该放 CLAUDE.md,而不是 skill。

2. 过于显然的通用常识

skill 最应该存的是“Claude 默认不知道,或者在这个项目里需要特殊处理”的东西。

3. 经常变化的信息

skill 不应该承担临时通知板的职责。

4. 纯粹僵硬的一步一步命令

如果它只是死板操作说明,没有知识结构,那往往更像脚本说明,而不是 skill。

这个仓库为什么要拆 weather-fetcherweather-svg-creator

这是理解 skill 设计最好的例子之一。

这两个 skill 虽然都属于同一个天气案例,但它们承担的是完全不同的职责:

weather-fetcher

它更像领域知识。

它告诉 agent:

  • 去哪里获取天气
  • 应该怎么理解这个数据
  • 返回结果的方式是什么

它适合作为 agent 预加载 skill。

weather-svg-creator

它更像输出生成模块。

它负责:

  • 把温度结果转成 SVG 卡片
  • 生成 markdown 输出
  • 写入最终产物文件

它更适合作为被单独调用的 skill。

这两个 skill 一拆开,职责就非常清楚了:

  • 前者负责“知道怎么拿数据”
  • 后者负责“知道怎么生成结果”

user-invocable 和预加载 skill 怎么选

这是 skill 设计里最容易忽略的点。

适合直接给用户调用的 skill

通常满足这些特征:

  • 它本身就是一个完整动作
  • 用户明确知道自己要调用它
  • 输出相对独立

比如:

  • 生成文档模板
  • 输出报告格式
  • 生成某类总结
适合只给 agent 预加载的 skill

通常满足这些特征:

  • 它更像背景知识
  • 用户不需要直接接触
  • 它主要是给 agent 执行任务时提供方法和约束

这时候就可以像这个仓库一样,把它设为 user-invocable: false

一个实用的 skill 模板

---
name: backend-api-rules
description: Backend API review rules and implementation conventions
user-invocable: false
---

# Backend API Rules

Use this skill when reviewing or writing backend API handlers.

## Focus Areas

- route consistency
- request validation
- error handling
- response shape

## Gotchas

- Do not bypass the shared validation layer
- Reuse existing error helpers
- Follow the route patterns in `src/routes`

## Reference Files

- `src/routes/todos.ts`
- `src/lib/validation.ts`

这类模板比“塞一大堆说明”更有用,因为它本身就是围绕职责组织的。

skill 的本质到底是什么

如果只用一句话总结,我会这么说:

Skill 不是知识仓库,而是按需加载的知识模块。

一旦你按这个思路设计,skill 就不会再变成杂物间。

第五层:.claude/settings.json 应该怎么配

如果前面三层解决的是“Claude 知道什么、谁来做什么”,那么 settings.json 解决的就是:

Claude 能做什么,以及它应该在什么边界里做。

这一层非常关键,因为很多团队真正缺的不是 prompt,而是行为边界。

为什么很多团队会把 Claude 用得越来越不稳定

因为他们只在会话里约束 Claude,却没有把这些约束沉淀成配置。

于是就会出现:

  • 哪些命令能跑,全靠临时确认
  • 哪些文件能改,每个人理解都不一样
  • hooks 有没有开,全凭个人环境
  • 外部工具能不能用,没有统一规则

这就是为什么 .claude/settings.json 这么重要。

先分清配置优先级

这个仓库把优先级讲得很清楚,从高到低大致是:

  1. managed settings
  2. 命令行参数
  3. .claude/settings.local.json
  4. .claude/settings.json
  5. ~/.claude/settings.json

这套层级对团队特别重要,因为它允许你同时拥有:

  • 团队共享的统一行为边界
  • 每个人本地的个性化覆盖

最常见的实践就是:

  • 共享规则放 .claude/settings.json
  • 个人偏好放 .claude/settings.local.json

permissions 到底该怎么设计

这是 settings.json 的核心。

最常见的三类规则是:

  • allow
  • ask
  • deny

很实用的一条设计原则是:

1. 高频、低风险的操作放 allow

比如:

  • 常规读写
  • 明确范围内的编辑
  • 团队认可的常用命令
2. 高风险操作放 ask

比如:

  • rm
  • git
  • npm
  • curl

这个仓库就很强调:危险动作要显式收紧,而不是默认放开。

3. 明确不该碰的内容放 deny

比如:

  • .env
  • secrets 目录
  • 某些生成产物或私密路径

这能让安全边界真正落到配置里,而不是落在“希望 Claude 自己别碰”的幻想里。

一个适合起步的 settings.json 骨架

{
  "permissions": {
    "allow": [
      "Read(*)",
      "Edit(*)",
      "Write(*)",
      "Agent(*)",
      "mcp__*"
    ],
    "ask": [
      "Bash(git *)",
      "Bash(rm *)",
      "Bash(curl *)",
      "Bash(npm *)"
    ],
    "deny": [
      "Read(.env)",
      "Read(./secrets/**)"
    ],
    "defaultMode": "acceptEdits"
  }
}

真正的关键不是字段本身,而是你有没有把“什么能做、什么不能做、什么必须确认”说清楚。

hooks 应该怎么接进来

这个仓库把 hooks 也放进了 settings 体系里,这是非常对的做法。

因为 hooks 本质上是生命周期自动化,比如:

  • SessionStart
  • PreToolUse
  • PostToolUse
  • PreCompact

你可以把它理解成:那些不想每次手动提醒 Claude 的动作,就应该考虑交给 hooks。

适合上 hooks 的事情包括:

  • 会话开始时做初始化提示
  • 工具执行前做简单校验
  • 操作结束后发通知
  • 压缩上下文前做收尾

但也别一开始就把 hooks 铺满。
最稳的策略永远是:先自动化确定性最高的动作。

env 和 auto-compaction 为什么也值得重视

这个仓库提到一个很重要的点:上下文预算要前置管理。

其中一个实用配置就是:

  • CLAUDE_AUTOCOMPACT_PCT_OVERRIDE

它控制自动压缩上下文的触发阈值。

这件事很容易被忽略,但真实使用里非常重要。因为很多人不是不会用 Claude,而是总在上下文已经过载之后,才发现结果开始变差。

团队里最推荐怎么分工

我认为这个仓库给出的思路非常稳:

团队共享

放进 .claude/settings.json

  • 权限边界
  • hooks 配置
  • MCP 启用规则
  • 团队一致的默认行为
个人差异

放进 .claude/settings.local.json

  • 个人偏好
  • 临时实验
  • 本地通知方式
  • 不想影响团队的自定义设置

这个分层很重要,因为它能避免“每个人都在自己电脑上养一套不同的 Claude”。

settings.json 的本质是什么

如果说 CLAUDE.md 是长期记忆,Subagents 是角色边界,Skills 是知识模块,那 settings.json 的本质就是:

把 Claude 的行为边界从口头约束变成显式配置。

这是工程化里非常关键的一步。

最后总结

如果把这个仓库真正有价值的内容压缩成 5 层,我会这么总结:

第一层:CLAUDE.md

解决的是:

  • Claude 进入项目时先知道什么
  • 哪些长期规则应该常驻

第二层:Commands

解决的是:

  • 哪些高频任务应该固定成统一入口
  • 哪些流程不该继续靠临时 prompt 维持

第三层:Subagents

解决的是:

  • 哪些任务应该拆成独立角色
  • 谁负责执行,而不是谁负责流程

第四层:Skills

解决的是:

  • 哪些知识应该按需加载
  • 哪些规则适合沉淀成复用模块

第五层:.claude/settings.json

解决的是:

  • 哪些行为默认允许
  • 哪些操作必须确认
  • hooks、MCP 和环境变量怎么系统化接入

如果你现在的 Claude Code 使用状态是:

  • prompt 越写越长
  • 项目一复杂就开始飘
  • 团队里每个人的使用方式都不同

那最值得补的通常不是“更会问问题”,而是把这 4 层结构慢慢搭起来。

我的建议顺序仍然是:

  1. 先写短小稳定的 CLAUDE.md
  2. 再把高频流程收束成 Commands
  3. 再拆高价值的 Subagents
  4. 再把知识模块化成 Skills
  5. 最后用 .claude/settings.json 固化行为边界

当这 4 层开始协同之后,Claude Code 才会真正从“一个很好用的对话工具”变成“一个能长期协作的工程系统”。

参考链接

  • 仓库地址:shanraisshan/claude-code-best-practice
  • README:README.md
  • 项目记忆说明:CLAUDE.md
  • 工作流示例:orchestration-workflow.md
  • 配置参考:settings.json 相关文档
本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com