claude code 学习页

claude code 把跨会话文件型 memory、单会话摘要、历史记录和压缩边界拆成多条链路,最后组合成模型每轮真正看到的上下文。

它最重要的不是“有没有 memory”,而是把 runtime context、文件型 memory、SessionMemory、history 和 compact boundary 分开管理,再在每一轮重算模型可见视图。

源码事实终端型 Agent Runtime
这页怎么读
  • 先看“这一轮模型看到了什么”,建立模型视角。
  • 再看 context 和 memory 两张图,抓主链。
  • 最后看源码锚点和证据页,确认细节。
01

这一轮模型到底看到了什么

这一段只讲模型真正可见的材料,不把所有底层状态都算进 context。

context 组成图

它把“运行时状态”“文件记忆”“会话摘要”“最终可见消息”拆成独立层,再在每轮重算。

bootstrap/state
先确定当前项目、会话和运行状态。
getSystemContext
生成系统侧骨架。
getUserContext
收集 CLAUDE.md 与用户侧材料。
loadMemoryPrompt
把文件记忆按轮注入。
compact boundary
裁掉当前模型看不见的旧消息。
/context 视图
重新统计 token 与 memory 占用。
  • 模型看到的不是 UI 原始消息,而是 compact boundary 之后的可见上下文。
  • 系统侧上下文来自 getSystemContext(),主要承载 git 状态和系统提示骨架。
  • 用户侧上下文来自 getUserContext(),包含 CLAUDE.md 系列、memory 文件和日期信息。
  • loadMemoryPrompt() 会把 memory 作为动态系统提示片段注入,不是静态常量。
  • /context 的输出是重新计算出来的 API 视图,不是界面消息回放。
  • SessionMemory 的 summary.md 可能进入压缩链路,但它只代表当前 session 的结构化摘要。
02

context 是怎么拼起来的

先看组成块,再看顺序。这里最容易帮助普通读者分清“哪些东西会真的进模型”。

系统上下文

系统侧骨架,承载 git 状态、缓存失效标记和基础系统提示。

runtime-context

用户上下文

用户侧材料,包含 CLAUDE.md、memory 文件和日期信息。

user-context

动态 memory prompt

通过 loadMemoryPrompt() 按轮重算,把 memory 注入系统提示。

dynamic-prompt

文件型 memory

memdir / claudemd 负责跨会话的项目记忆文件发现、拼接和过滤。

file-memory

SessionMemory 摘要

当前 session 的结构化摘要文件 session-memory/summary.md。

session-summary

上下文分析视图

/context 会在 boundary 之后再做微压缩和 token 统计。

analysis-view
  1. bootstrap/state 先锁定 cwd、project root、session id 和持久化状态。
  2. getSystemContext() 与 getUserContext() 分别 memoize,形成系统侧和用户侧缓存。
  3. loadMemoryPrompt() 从 memdir / claudemd 读取 memory,并作为动态系统提示片段注入。
  4. getMessagesAfterCompactBoundary() 先裁掉 boundary 之前的不可见消息。
  5. 之后再做 projectView / microcompactMessages(),并由 analyzeContextUsage() 重算 memory 和 token。
  6. /compact 会先尝试 SessionMemory compaction,再走 microcompact 或传统压缩,最后清缓存并标记 post-compaction。
03

memory 是怎么形成、保存、再被取回的

不要把记忆想成一个抽象黑盒。这里直接按时间顺序讲“它什么时候生成、存哪、怎么再回来”。

memory 流程时间线

跨会话文件记忆和单会话摘要是两条不同链路,只会在压缩点相互接触。

路径解析
先找到项目级 memory 目录。
文件发现
选择 MEMORY.md、daily log、team memory。
include/去重
按顺序拼装并过滤。
SessionMemory 抽取
把当前会话压成 summary.md。
compact 截断
先动 session 摘要,再改可见消息。
缓存重建
下一轮重新计算 context 视图。
  1. memdir/paths.ts 先解析长期 memory 的目录,默认落在 ~/.claude/projects/<repo>/memory/ 一类路径下。
  2. memdir 选择 MEMORY.md、按日期分层的 daily log 和 team memory 作为候选来源。
  3. claudemd 按 Managed -> User -> Project -> Local -> AutoMem -> TeamMem 的顺序收集文件,并做去重和 include 约束。
  4. filterInjectedMemoryFiles() 可能把 AutoMem 或 TeamMem 从本轮注入集合里剔除。
  5. SessionMemory 在当前 session 目录下维护 session-memory/summary.md,只代表单 session 摘要。
  6. 抽取器在阈值满足时自动更新,/compact 还可能截断并复用这份摘要。
04

存储分层图

很多误解都来自把 transcript、summary、文件、数据库和向量库混成一层看。

存储分层图

历史、摘要、文件型 memory 和运行时状态分别落在不同地方。

运行时状态
bootstrap/state 维护 cwd、project root、session id。
session transcript
sessionStorage 把当前会话落成 jsonl。
命令历史 / 远端历史
history.ts 和 sessionHistory.ts 负责记录与分页。
SessionMemory summary.md
只服务当前 session 的结构化摘要。
项目级 memory 文件
memdir / claudemd 管理跨会话文件记忆。
team memory
可选的团队共享文件记忆。
  • bootstrap/state:运行时状态层,管理 cwd、project root、session id、持久化开关等。
  • utils/sessionStorage.ts:session transcript 落盘层,保存 {projectDir}/{sessionId}.jsonl 一类数据。
  • history.ts:命令历史层,只记录命令,不等于语义记忆。
  • assistant/sessionHistory.ts:远端 session event 历史分页层。
  • memdir:跨会话项目记忆层,负责文件型 memory 的发现与拼接。
  • SessionMemory:当前 session 摘要层,承载 summary.md。
05

哪些东西最容易被误认为 memory

这部分是防误解,不是额外功能清单。

常见误解

把 SessionMemory 当成跨会话长期 memory。

  • 把 history.ts 当成对话语义记忆。
  • 把 /context 当成 UI 原始消息,而不是 API 视图。
  • 把“文件存在”误认为“本轮一定被注入”。
  • 只把压缩理解成删字,忽略 boundary 重写和缓存失效。

读完应记住的 3 件事

先把 runtime context、文件型 memory、SessionMemory、history、boundary 这五层分开,再看实现会更清楚。

  • context 是计算出来的视图,任何压缩、注入或缓存失效都会重写它。
  • 真正要记的是生命周期:memdir 跨会话,SessionMemory 仅当前 session,sessionStorage/history 只负责记录与恢复。
06

关键源码位置

每个结论都要能往下追。这里列的都是站内证据入口,不是营销材料。

07

回到原始 docs 深挖

如果你想继续看原文、行号和分专题分析,可以直接跳到证据页。

原始文档清单

你也可以直接从总览、仓库入口页和 5 篇专题页继续追。

  • 仓库入口页
  • 01-架构与范围
  • 02-context管理
  • 03-memory实现
  • 04-存储与状态
  • 05-调用链、压缩与边界