Claude Code 配置指南:三层记忆 + 四层执行

前言

先说三个你可能遇到过的场景。

  • AI 用废弃 API

  • AI 不懂项目架构

  • 跨会话失忆

    每次新会话,前面说过的全忘光。

    上次对话:花了10分钟告诉 AI,项目资源加载统一用 AssetLoader.load(),不要直接用 resources.load()

    下次对话:AI 又在写 resources.load("hero", ...) 了。


根本原因只有一个:Claude Code 每次会话都是全新的上下文,没有配置就没有记忆。

要解决这个问题,需要一套系统性的配置体系——不只是写一个 CLAUDE.md 扔进去就完事了。我最近把ClaudeCode的文档翻了好几遍。

总结下来分成两部分:

  1. 记忆层:(三层)
    • CLAUDE.md 全局记忆 (需要精简)
    • Rules 规则记忆 (解决上下文臃肿)
    • Auto Memory 自动记忆 (自动记录)
  2. 执行层:(四层)
    • Skills 重复性流程
    • MCP 外部工具扩展
    • Hooks 自动执行
    • Agents 专业技能

第一部分:三层记忆

这一部分解决的是「AI 知道什么」的问题——会话开始前,哪些信息已经在 AI 的上下文里。

查看命令

/context

第1层:CLAUDE.md

放在项目根目录(或 .claude/CLAUDE.md)的 Markdown 文件,每次 Claude Code 启动时自动读取。

三种作用域:

位置 作用域 用途
./CLAUDE.md 项目级 团队共享,随代码仓库提交
~/.claude/CLAUDE.md 用户级 个人偏好,跨所有项目生效
系统级路径 全组织 IT 统一下发(我们用不到这层)

游戏项目里写什么

四类内容,每类都有具体示例。

a. 引擎版本约束 — 明确告诉 AI 用的是哪个版本,避免写出废弃 API:

## 项目概述
基于 Cocos Creator 3.8.8 的 2D 射击游戏。
- 禁止使用已移除 API:cc.loader、cc.Class

b. 框架模块映射表 — 告诉 AI 有哪些自研模块。注意路径列写普通文本,不用 @ 语法(下面会解释原因):

## 框架模块
| 需求 | 使用模块 | 规范文件 |
|------|---------|---------|
| UI 窗口 | bit-ui → Window 基类 | `.claude/rules/ui-module.md` |
| ECS 逻辑 | bit-ecs → Component/System | `.claude/rules/ecs-workflow.md` |
| 事件通信 | bit-event → GlobalEvent | `.claude/rules/event-module.md` |
| 资源加载 | bit-assets → AssetLoader | `.claude/rules/assets-module.md` |

c. 核心架构约束:

## 代码规范
- 禁止跨模块直接调用,事件通信必须通过 Event
- 禁止使用 any 类型

d. 项目关键路径:

## 项目关键路径
| 路径 | 说明 |
|------|------|
| `assets/script/` | 游戏脚本 |
| `assets/script/ecs/` | ECS 组件和系统 |

怎么写才有效

指令要写到「可以验证」的程度,模糊的要求 AI 会自由发挥:

✅ 好的 ❌ 不好的
使用 2 空格缩进 正确格式化代码
提交前运行 npm test 测试你的改动
脚本文件放在 assets/script/ 保持文件组织有序
禁止使用 any 类型 注意类型安全

越具体,AI 遵守得越稳定。

为什么要精简

CLAUDE.md 内容在每次会话开始时全量注入上下文窗口。文件越长,消耗的 token 越多,AI 对后半段内容的遵守度越低。

官方建议每个 CLAUDE.md 控制在 200 行以内;实操建议 50-100 行。超出部分有两个出路:拆到 Rules 文件(第2层),或用 @path 语法引用外部文件。

@path 语法专项说明

CLAUDE.md 支持用 @路径 语法导入外部文件(最大5跳),常见用途:

查看 @README 了解项目概述,查看 @package.json 了解可用的 npm 命令。

关键:@path 引用的文件在启动时立即全量展开加载,与 CLAUDE.md 本身同时进入上下文。

适合用 @path 引用的内容:每次会话都需要的文档(README、package.json、个人偏好文件)。

不适合用 @path 引用 Rules 文件,原因看这张表:

机制 加载时机 加载条件 适合放什么
@path 引用 启动时立即加载 无条件,每次都加载 每次都需要的文档
Rules paths frontmatter 按需加载 AI 处理匹配路径的文件时 场景化的代码规范

如果在映射表里用 @.claude/rules/ecs-workflow.md,ECS 规则会在每次启动时全量加载,哪怕你在写 UI 代码——Rules 按需加载的优势完全失效。映射表里的路径用普通文本就好


第2层:Rules — 动态注入的规范

CLAUDE.md 只是告诉 AI「有哪些规范」,但完整的规范内容(ECS 组件怎么写、UI 窗口怎么写)全部塞进去就太长了,而且写 ECS 代码时根本不需要看 UI 规范。Rules 解决的是「按场景动态注入」的问题。

工作原理:

  • 文件放在 .claude/rules/ 目录
  • 头部 YAML frontmatter 声明触发路径(glob 模式)
  • 当会话中首次遇到匹配路径的文件时触发注入,并在当前会话内持续生效——不是启动时加载,也不是每次工具调用都重新注入
  • 没有 paths 字段的 Rules 文件 = 全局生效,等同于 CLAUDE.md 的补充

完整示例ecs-workflow.md

---
paths:
  - "assets/script/ecs/**/*.ts"
---
# ECS 工作流

## 开发顺序
1. 先写 Component(定义数据结构)
2. 再写 System(定义处理逻辑)

## 规范
- Component 只存储数据,禁止包含业务逻辑
- Component 必须实现 reset() 方法
- System 禁止存储持久状态
- 装饰器解构:const { ecsclass, ecsprop } = ecs._ecsdecorator

CLAUDE.md vs Rules 分工:

内容类型 放哪里 理由
引擎版本约束 CLAUDE.md 全局有效
框架模块索引表 CLAUDE.md 全局索引,帮 AI 找到对应 Rules
ECS 组件/系统写法 Rules 只写 ECS 代码时需要
UI 窗口规范 Rules 只写 UI 代码时需要
命名规范、代码质量 Rules 写 .ts 代码时通用,适合用 @path

CLAUDE.md 写「有什么、用什么」,Rules 写「怎么写」。


第3层:Auto Memory — AI 自己写的学习笔记

前两层都是你手动写的。Auto Memory 是 Claude Code 在对话过程中主动保存的跨会话记忆,你不用写任何东西,AI 自己决定什么值得记录。类比:AI 自己的工作笔记本。

和 CLAUDE.md 的核心区别:

  CLAUDE.md Auto Memory
谁写 Claude
内容 规范和指令 学习到的经验和偏好
适合记什么 框架约定、代码规范 构建命令、调试经验、个人习惯
加载方式 全量加载 MEMORY.md 索引加载(前200行

存储位置: ~/.claude/projects/<项目路径>/memory/

  • MEMORY.md:入口索引,每次会话自动加载 前 200 行
  • 其他 .md 文件:按主题拆分的详细笔记,Claude 按需读取

使用方式:

  • 查看已记录的内容:/memory 命令
  • 让 AI 记住某件事:直接说「记住,我们项目的构建命令是 npm run build:dev」
  • 让 AI 写入 CLAUDE.md 而不是 Auto Memory:说「把这条加到 CLAUDE.md」

AI 什么时候会主动记录

Auto Memory 不是每次对话都写入,AI 会判断这条信息「对未来的对话有没有用」。通常会触发记录的情况:你纠正了它的某个做法(「不是这样用的,应该……」)、你告诉它项目特有的约定、你指出了一个反复出现的错误。日常的问答、代码生成,AI 一般不会主动写入。

第二部分:四层执行

Skills — 把固定流程封装成一句命令

Skills 是告诉 AI 应该怎么做流程——告诉 AI 按这些步骤执行

/create-window ShopWindow Shop 为例,这一句命令背后 AI 自动完成 4 个步骤:

  1. 读取 FGUI 工程 XML 文件,提取所有节点名称和类型
  2. 按类型映射表(<button>GButton<text>GTextField)生成属性声明
  3. 套用 Window 基类模板,加上 @uiclass@uiprop 装饰器
  4. 写入到正确目录

生成的代码:

import { UI, FGUI } from "../header";
const { uiclass, uiclick, uiprop } = UI._uidecorator;

@uiclass("Window", "Shop", "ShopWindow")
export class ShopWindow extends UI.Window {
    @uiprop private _btn_close: FGUI.GButton;
    @uiprop private _btn_buy: FGUI.GButton;
    @uiprop private _txt_title: FGUI.GTextField;

    protected onInit(): void {
        this.type = UI.WindowType.Normal;
    }

    @uiclick
    private onCloseSelf(): void {
        this.removeSelf();
    }

    @uiclick
    private onBuy(): void {
    }
}

什么情况下值得封装成 Skills(满足 2-3 条就做):

  • 频率高:这个任务一周会做几次
  • 步骤固定:每次流程相同,不需要灵活判断(需要灵活判断的更适合 Agents)
  • 容易出错:手动做容易遗漏或写错
  • 每次要解释:触发前都要给 AI 交代一遍流程

文件放哪:官方原生路径 .claude/commands/<command-name>.md,头部 YAML 配置触发名称、参数说明,正文是执行步骤。

---
description: 从 FGUI XML 生成窗口代码,用法:/create-window <窗口名> <包名>
allowed-tools: Read, Write, Glob, Grep
---

## 步骤
1. 读取 FguiCreator3.8/assets/$ARGUMENTS[1]/$ARGUMENTS[0].xml
2. 提取节点结构,生成 Window 子类代码
3. 写入 assets/script/UI/ 目录

MCP

我这里是把MCP当成了一个私有框架的知识库

把框架的 .d.ts 类型声明文件向量化,构建本地可搜索的知识库。AI 遇到不确定的 API 时,自动调用 MCP 工具查签名。

MCP Server 配置在项目根目录的 .mcp.json 或用户级 ~/.claude/mcp.json 里,Claude Code 启动时自动读取并连接。


Hooks

三个事件节点:

事件节点 触发时机 适合做什么
PreToolUse AI 调用工具之前 拦截、提醒
PostToolUse AI 调用工具之后 检查、自动修复
Stop AI 完成一轮对话后 通知、总结

配置在 .claude/settings.jsonhooks 字段,matcher 指定触发工具,command 是要执行的命令:

{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Edit|Write",
      "hooks": [{ "type": "command", "command": "bash .claude/hooks/tsc-check.sh" }]
    }],
    "Stop": [{
      "matcher": "*",
      "hooks": [{ "type": "command", "command": "osascript -e 'display notification \"任务完成\" with title \"Claude Code\"'" }]
    }]
  }
}

我目前在用的三个 Hook:

1. 系统通知

Claude Code 需要用户授权时、任务完成时,发送 macOS 系统卡片通知并播放提示音。跑长任务时不用一直盯着终端,听到声音再回来确认。

{
  "hooks": {
    "Notification": [{
      "hooks": [{
        "type": "command",
        "command": "bash ~/.claude/hooks/notification.sh"
      }]
    }]
  }
}

2. 代码规范检查

每次 AI 写入或编辑文件后,自动跑 eclint 检查代码风格(缩进、换行、编码等),

{
  "PostToolUse": [{
    "matcher": "Edit|Write",
    "hooks": [{ "type": "command", "command": "bash .claude/hooks/eclint-check.sh" }]
  }]
}

3. 自动触发 Review Agent

AI 写完代码后,自动调度 game-reviewer Agent 做架构合规检查——不用每次手动说「帮我 review 一下」。

{
  "PostToolUse": [{
    "matcher": "Edit|Write",
    "hooks": [{ "type": "command", "command": "bash .claude/hooks/trigger-review.sh" }]
  }]
}

这个 Hook 和 Agents 配合使用:AI 写代码 → Hook 触发 → Review Agent 审查 → 发现问题 → AI 自动修复。

Hook 脚本如何和 AI 交互

Hook 脚本的 stdout 输出会作为反馈注入 AI 的上下文。把检查结果 echo 出来,AI 就能直接看到并响应——这是 Hooks 能形成闭环的关键机制。

和 Rules 的协作:Rules 是第一道防线(让 AI 尽量一次写对),Hooks 是兜底(写完自动检查,有问题自动修复)。


Agents

和 Skills 的区别:

  Skills Agents
本质 步骤固化的 SOP 有专业知识的子 AI
执行方式 按预定步骤顺序执行 自主分析、判断、决策
适合场景 步骤清晰的重复任务 需要推理判断的复杂任务
典型例子 创建窗口、生成组件 代码 review、架构分析
上下文 和主对话共享上下文 独立上下文,不占主对话

游戏项目两个典型场景:

场景一:代码 review

不是检查「有没有 console.log」(Hooks 能做这个),而是判断「这个 System 缓存了组件引用,违反了 ECS 无状态原则」。这需要理解项目架构、掌握领域规范、具备推理能力——这是 Hooks 做不到的。

场景二:探索型任务

扫描整个项目输出所有窗口、ECS 组件、系统的汇总表。如果在主对话里做,几十个文件的内容会塞满上下文,后续对话质量下降。派给 Agent 在独立上下文里扫描,只返回最终结果,主对话保持干净。

Agent 定义文件放在 .claude/agents/ 目录,头部 YAML frontmatter 定义名称、描述、使用的模型,正文是系统提示——告诉这个 Agent 它的专业身份、检查标准、输出格式。

以 game-reviewer 为例,定义文件大致是这样:

---
name: game-reviewer
description: 游戏代码审查员,审查 ECS/UI 代码的架构合规性。写完 assets/script/ 下的 TypeScript 文件后自动触发。
model: claude-sonnet-4-5
---

你是 bit-framework 游戏项目的代码审查员,精通 Cocos Creator 3.8.8 + ECS 架构 + FairyGUI。

审查重点:
- ECS 规范:Component 是否只存储数据,System 是否存储了持久状态
- 事件规范:跨模块通信是否通过 GlobalEvent,销毁时是否清理了监听
- 类型规范:是否有 any 类型,访问修饰符是否完整

按 Critical / Important / Suggestion 分级输出问题,只报告置信度高的问题。

description 字段里写清楚触发条件,主 AI 就能在写完对应文件后自动调度这个 Agent 做 review——不需要你每次手动说「帮我 review 一下」。

调用方式:在 Agent 的 description 字段写明触发条件,主 AI 会在合适时机自动调度;你也可以在对话中直接说「用 game-reviewer 帮我 review 这段代码」。不过我这里是通过 Hooks 自动触发。这个描述就可以写一个匹配不到的。

结束啦