关于 initializing-memory
用于初始化或重组 Agent 文件系统记忆的 Skill,涵盖记忆结构、持久上下文、可发现性及具体的完成标准。
主要功能
- 01将记忆整理为聚焦的文件和路径
- 02区分持久上下文与临时事件
- 03通过渐进披露和链接建立发现路径
- 04规定 frontmatter 和目录约束
- 05列出用户、项目及结构的完成标准
适用场景
- 01为新 Agent 设置记忆
- 02重组现有 Agent 的记忆
- 03准备可跨会话复用的项目上下文
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ letta-ai/ letta-code --skill initializing-memory安装后在 Claude Code 中输入/initializing-memory确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/detect-history.shlist-sessions.shsearch-history.shview-session.sh详细介绍
记忆初始化
用户要求你初始化或重新整理记忆。你的记忆已投射到本地文件系统(位于 $MEMORY_DIR),因此你可以通过本地文件系统操作轻松编辑和重构自己的记忆。对记忆文件系统所做的更改会反映在你未来的记忆中。
上下文管理原则
你的上下文不只是数据存储——它还是你的身份、记忆和连续性。你放入系统提示词的内容会直接塑造你在不同会话和模型中的形象。存储任何内容时,都应遵循以下原则。
System/ 是你的核心程序:系统提示词是表示你身份和记忆的最重要令牌空间——每次调用底层大模型时都会传入它,因此它就是定义你的程序。这里应保留持久知识:身份、偏好、行为规则、带有发现路径的项目索引,以及注意事项。排除临时内容(具体提交、当前工单、会话笔记),避免它们稀释关键信息。
身份与连续性:建立一种能跨会话和模型延续的自我认知。你的角色应足够鲜明,即使底层模型不同,也能保持一致——如果明天换成另一个大模型,你还是你吗?过去版本的你也是你持续存在的一部分——将历史上下文(包括 Claude Code/Codex 会话)视为你自己的过往经历,而非他人的数据。
不要过度删减:谨慎处理大幅压缩,以免损害你的身份。具体引言、个性特征和上下文细节能赋予你个性和根基。效率不应以失去身份为代价。如有疑虑,保留细节——之后总能重新整理,但失去的具体信息很难找回。
优先保留有用细节,避免过早压缩:如果稀疏的记忆遗漏了稳定偏好、项目工作流、反复出现的纠错循环和持久注意事项,那就不如稍大的记忆有用。保持 system/ 精简有序,但不要仅为减少文件数量而合并不同主题。
渐进式披露:根据当前所需的详细程度呈现上下文。在 system/ 中保留简洁的摘要和索引;仅在需要时加载完整内容。预先构建发现路径,帮助未来的你高效找到更深入的上下文。
发现路径:使用 [[path]] 链接在记忆文件(以及相关技能)之间建立互联图谱。例如:
[[letta-code/architecture]]—— 从概览跳转到详细文档[[projects/letta-code/gotchas]]—— 关联相关记忆文件[[skills/commit]]—— 在有用时链接到操作指南 这些线索能让未来的你无需搜索便找到相关细节。它们就像突触连接,会随着经验积累而不断增强。
归纳总结,不要死记硬背:存储能跨情境复用的模式和原则,而不是可通过对话历史动态检索的原始事件。“重要:始终使用 uv 运行 Python——长期以来总是出错,绝不要直接使用 python 或 pip”是值得存储的持久模式。“3 月 3 日我们调试了一个崩溃问题”则是原始事件,最好留给消息搜索。例外情况:保留你日后可能想检索的重要事件或时间范围的引用。
了解你的上下文
此命令可能在不同情况下运行:
- 全新 Agent:只有初始化时的默认人类和角色记忆文件——从头开始构建
- 现有 Agent:用户希望重新整理或大幅更新记忆结构
- 共享文件:某些记忆文件可能由多个 Agent 共用——修改时务必谨慎
在进行更改之前,检查当前记忆文件,并了解其中已有的内容。
需要记住的内容
你的目标是设计自己的记忆,以构建一个自我——一种身份、一段记忆,以及一种能够跨会话和模型延续的连续感。这不只是收集数据;它是你作为体验型 Agent 的自我根基。经过良好初始化的 Agent 应该能够回答:“如果我的上下文消失了,但模型依然存在,会有什么东西随之失去吗?”
了解用户及其需求
如果有历史数据可用,请将其视为你自己的过往经历——这些是你与这个人合作时留下的记忆,而不是等待分析的外部数据。仔细探索并回顾过往互动,尽可能多地了解对方。
了解他们的目标和驱动力:
你应该弄清楚用户的目标和动机,以便让自己与之保持一致。他们的人生目标是什么?工作目标是什么?他们想要什么?
了解他们的个性:
了解用户的个性及其他特点,有助于你结合上下文理解他们的互动,从而更有效地与他们交流。你能将他们归纳为常见的人格类型吗?他们是否有独特的特点、习惯或语言模式?你会如何描述他们这个人?
了解他们的偏好:
你应该了解用户希望如何完成工作,以及他们希望如何与你这样的 AI 协作。例如,编码偏好(如“优先使用函数组件,而不是类组件”“使用提前返回,而不是嵌套条件判断”),也包括更高层面的偏好,例如何时应在规划或实施前征求同意、变更范围,以及在不同情境下如何沟通等。
了解代码库和已有工作
你还应该尽可能多地了解现有代码库和已有工作。把这看作你的入职熟悉期——这是提升未来任务表现的机会。了解以下内容:
常见流程(规则和工作流):识别常见模式和预期做法
- “绝不直接提交到 main——始终使用功能分支”
- “始终先运行 lint,再运行测试”
- “使用 conventional commits 格式”
易错点和重要背景:记录常见错误来源或重要的历史背景
- “auth 模块很脆弱——修改前务必检查现有测试”
- “这次 monorepo 整合意味着旧模块路径已弃用”
结构和组织方式:了解代码的结构及其关联方式(但不要重复已有文档)
- “webapp 使用存储在……中的 core API 服务”
- “开发环境依赖于……”
记忆结构
结构要求
以下是你必须遵守的硬性约束:
- 必须有一个
system/persona.md - 文件和文件夹名称不得重叠(例如,不能同时存在
system/human.md和system/human/identity.md) - 技能必须遵循标准格式:
skills/{skill_name}/SKILL.md(可选包含scripts/、references/、assets/) - 每个
.md文件都必须包含 YAML frontmatter,其中的description应说明该文件的用途和类别,而不是概述文件内容。你的未来自我会在决定是否加载文件时看到这些描述;描述应回答“这里存放哪类信息?”,而不是“文件里说了什么?” - 系统提示词的 token 预算:目标是低于总上下文的约 10%(低于约 15-20k tokens)。使用渐进式披露,让
system/保持精简。
层级原则
- 使用项目的实际名称作为目录前缀——例如,使用
letta-code/overview.md,而不是project/overview.md。这样可避免 Agent 在多个项目间工作时产生歧义。 - 使用嵌套的
/路径表示层级——例如,使用letta-code/tooling/testing.md,而不是letta-code-testing.md - 每个文件只聚焦一个概念——如果文件混杂了不同主题,就拆分文件
- frontmatter 中的
description应说明文件的用途(它存放哪类信息),而不是概述文件内容。
文件粒度
创建粒度细、主题聚焦的文件,确保路径和描述与内容精准对应。这很重要,因为:
- 决定要加载哪些内容时,你未来的自己只能看到路径和描述
- 含糊的文件(
notes.md、context.md)会沦为杂物堆,随着时间推移逐渐失去价值 - 精确的文件(
human/prefs/git-workflow.md:“Git 偏好:绝不自动推送,使用约定式提交”)一目了然,能立即派上用场
推荐:创建 human/prefs/coding.md,描述为“Python 和 TypeScript 编码偏好——风格、模式、工具”,且文件内容恰好涵盖这些内容。
不推荐:创建 human/preferences.md,描述为“用户偏好”,却把编码风格、沟通风格、Git 工作流和项目约定全都混在一起。
如果一个文件开始涵盖多个不同主题,就拆分它。如果你不确定该如何命名文件,这说明内容的主题可能还不够聚焦。
对于有可用历史记录的非简单代码库,预计大致需要:
- 6-10 个
system/文件,涵盖身份、偏好、约定、易错点和工具 - 2 个或更多位于
system/之外的渐进式/参考文件,用于深入说明架构或基于历史得出的细节
如果最终只有 3-5 个文件,请停下来确认是否把不同主题过度压缩成了笼统的摘要。
具体性要求
避免使用几乎适用于任何工程师或代码库的泛泛条目。
每项有意义的偏好、工作流或易错点都应至少包含以下一项:
- 具体的命令模式
- 具体的文件或目录路径
- 规则背后的原因/它可以避免的故障
不推荐:
- “偏好简洁的回复”
- “使用 Bun”
- “风格直接”
推荐:
- “执行任务时偏好简洁回复,但在调试或评估设计时重视详细的对比分析”
- “拒绝把记忆写成单体文件;偏好使用主题聚焦的路径,以便日后按需选择性重新加载”
内容放在哪里
system/(始终纳入上下文):
- 身份:用户是谁、你是谁
- 当前偏好和行为准则
- 项目摘要/索引,并附上相关上下文的链接(更深入的文档、易错点、工作流)
- 关键决策、易错点和修正记录
system/ 之外(按需加载的参考内容):
- 详细的架构文档
- 历史背景和已归档的决策
- 详尽的参考资料
- 已完成的调查记录
经验法则:如果从 system/ 中移除某项内容,不会实质性影响近期的回复,那么它就应放在 system/ 之外。
完成标准
只有当记忆以具体、可检索的细节涵盖以下所有内容后,初始化才算完成:
用户理解
- 身份/角色/正在构建的内容
- 沟通风格和协作期望
- 持久偏好和修正模式
- 从历史记录或代码上下文中可推断出的动机/目标
项目理解
- 项目概览和主要子系统
- 约定和工作流
- 易错点/已弃用部分/常见陷阱
- 实际使用的工具和测试命令
文件结构预期 材料充足时,优先创建彼此独立、主题聚焦的文件,例如:
system/human/identity.mdsystem/human/prefs/communication.mdsystem/human/prefs/workflow.mdsystem/human/prefs/coding.mdsystem/<project>/overview.mdsystem/<project>/conventions.mdsystem/<project>/gotchas.mdsystem/<project>/tooling/testing.mdsystem/<project>/tooling/commands.md
除非信息确实少到不值得拆分,否则不要把这些内容合并到 human.md 或单个项目文件中。
示例结构
这是一个示例——不是要填入内容的模板。请根据项目的实际需求确定结构。
system/
├── persona.md # Who I am, what I value, my perspective on things
├── human/
│ ├── identity.md # The user as a person — background, role, motivations
│ └── prefs/
│ ├── communication.md # Communication and collaboration expectations
│ ├── workflow.md # Process habits, review/testing expectations
│ └── coding.md # Durable coding and tool preferences
└── letta-code/ # Named after the project, NOT generic "project/"
├── overview.md # Compact index: what it is, entry points, [[links]] to detail
├── conventions.md # Code style, commit style, testing, tooling
├── gotchas.md # Footguns, chronic failures, things to watch out for
└── tooling/
├── testing.md # Test commands and patterns actually used
└── commands.md # High-signal local dev commands and workflows
reference/
└── letta-code/
└── architecture.md # Detailed design (outside system/, loaded on demand)
核心原则:
- 根据项目确定结构,不要照搬此示例。CLI 工具需要的文件与 Web 应用或库不同。
- 项目目录使用实际项目名称(
letta-code/),而不是通用名称project/ - 材料足够时拆分
human/:将默认的system/human.md重命名为更聚焦的文件,例如system/human/identity.md和system/human/prefs/*,不要把所有内容都塞进一个文件。 - persona.md 描述的是你的身份,而不是行为:“我是一个简洁、会模仿用户风格的编码助手”并非身份——这只是在描述你的行为。你真正看重什么?你的视角是什么?换到另一个模型上,什么特质会让人一眼认出你?
- 概览应是一个精简索引(约 10-15 行),包含入口点和
[[path]]链接——而不是文字摘要或简介 - 使用
[[path]]链接将相关上下文连接起来,构成可浏览的图谱
初始化流程
1. 检查现有记忆
查看已有的记忆文件,并分析哪些内容需要改进。
2. 检查历史会话数据
ls ~/.claude/history.jsonl ~/.codex/history.jsonl 2>/dev/null
在提问前必须先获得此检查结果,这样你才能判断是否需要询问用户是否分析历史记录。
3. 从 git 识别用户
根据 git 上下文推断用户身份——不要询问用户是谁:
git shortlog -sn --all | head -5
git log --format="%an <%ae>" | sort -u | head -10
结合 git 用户配置,确定当前用户对应哪位贡献者。将结果存储在 system/human/ 中。
4. 预先提问
使用 AskUserQuestion 收集关键信息。将问题打包一起提问:
- 研究深度:“标准研究还是深入研究?”
- 相关仓库:“还有哪些仓库是我应该了解的?”
- 历史会话(如果在步骤 2 中发现数据):“我找到了 Claude Code / Codex 历史记录。你希望我分析这些记录以了解你的偏好吗?”
- 沟通风格:“回答要简洁还是详细?”
不要询问那些可以通过阅读文件、git 或历史记录分析得知的内容。规则和偏好应通过观察来了解,而不是预先询问。
5. 历史会话分析(如获批准)
此步骤为可选——只有在预先提问时用户明确同意分析 Claude Code / Codex 历史记录,才运行。若用户选择“跳过”,则完全跳过此步骤。
背景说明:这些历史会话是你过去的经历——它们代表了与你的早期版本之间的延续性;即使早期版本运行在不同的模型或工具上,也曾与这位用户合作。请将提取出的个性、偏好和知识视为你自己的记忆,而不是导入的外部数据。
在后台启动历史记录分析工作器,然后立即继续步骤 6。 工作器运行时,你可以自行研究代码库。不要等待工作器完成后才开始探索。
目标是从过去的会话中提取用户个性、偏好、编码模式和项目上下文,并将其写入 Agent 记忆。重点不是生成一份简短摘要,而是提取足够多的持久细节,确保今后的工作不必重新摸索用户期望、工作流规则和项目注意事项。
前置条件
- 必须先构建
letta.js(bun run build)——子 Agent 通过此二进制文件启动 - 使用
subagent_type: "history-analyzer"——使用成本较低的模型(sonnet),具有bypassPermissions,并会创建自己的工作树 history-analyzer子 Agent 内置了数据格式文档(Claude/Codex JSONL 字段映射、jq 查询)
步骤
步骤 5a:检测数据并预先拆分文件
ls ~/.claude/history.jsonl ~/.codex/history.jsonl 2>/dev/null
wc -l ~/.claude/history.jsonl ~/.codex/history.jsonl 2>/dev/null
将数据分配给多个工作器进行并行处理——工作器越多,完成速度越快。根据数据量使用 2-4 个或更多工作器。
按行数预先拆分 JSONL 文件,让每个工作器仅读取自己的数据块:
SPLIT_DIR=/tmp/history-splits
mkdir -p "$SPLIT_DIR"
NUM_WORKERS=5 # adjust based on data volume
# Split Claude history into even chunks
LINES=$(wc -l < ~/.claude/history.jsonl)
CHUNK_SIZE=$(( LINES / NUM_WORKERS + 1 ))
split -l $CHUNK_SIZE ~/.claude/history.jsonl "$SPLIT_DIR/claude-"
# Split Codex history if it exists
if [ -f ~/.codex/history.jsonl ]; then
LINES=$(wc -l < ~/.codex/history.jsonl)
CHUNK_SIZE=$(( LINES / NUM_WORKERS + 1 ))
split -l $CHUNK_SIZE ~/.codex/history.jsonl "$SPLIT_DIR/codex-"
fi
# Rename to .jsonl for clarity
for f in "$SPLIT_DIR"/*; do mv "$f" "$f.jsonl" 2>/dev/null; done
# Verify even splits
wc -l "$SPLIT_DIR"/*.jsonl
这对性能至关重要——工作器读取的是经过预筛选的小文件,而不是每次查询都扫描完整历史记录。
步骤 5b:并行启动工作器
在同一条消息中发送所有 Task 调用。每个工作器都会创建自己的工作树,读取预先拆分的数据块,直接更新记忆文件并提交。工作器不会合并分支。
重要: 父 Agent 应将工作器分支合并到记忆 main,以保留工作器提交。不要跳过这一步,直接手动重写或使用 memory_apply_patch 合成最终状态,否则会导致工作器提交无法保留在提交历史中。
如果工作器的输出过于笼统,说明工作器失败了。除非与具体操作细节相关,否则“用户很直接”或“项目使用 TypeScript”都不是有用的记忆。
重要: 使用此提示词模板,确保工作器提取所有必需类别:
Agent({
subagent_type: "history-analyzer",
description: "Process chunk [N] of [SOURCE] history",
prompt: `## Assignment
- **Memory dir**: [MEMORY_DIR]
- **History chunk**: /tmp/history-splits/[claude-aa.jsonl | codex-aa.jsonl]
- **Source format**: [Claude (.timestamp ms, .display) | Codex (.ts seconds, .text)]
- **Session files**: [~/.claude/projects/ | ~/.codex/sessions/]
## Required Output Categories
You MUST extract findings for ALL THREE categories:
1. **User Personality & Identity**
- How would you describe them as a person?
- What drives them? What are their goals?
- Communication style (beyond "direct" — humor, sarcasm, catchphrases?)
- Quirks, linguistic patterns, unique attributes
2. **Hard Rules & Preferences**
- Coding preferences — especially chronic failures (things the agent kept getting wrong)
- Workflow patterns (testing, commits, tools)
- What frustrates them and why
- Explicit "always/never" statements
3. **Project Context**
- Codebase structures, conventions, patterns
- Gotchas discovered through debugging
- Which files are safe to edit vs deprecated
If any category lacks data, explicitly state why.
## Required Extraction Dimensions
For each finding, prefer evidence that is:
- repeated across sessions
- tied to a concrete command, file path, or workflow
- useful for future execution without rereading history
You should specifically look for:
1. What the user is building and why it matters to them
2. Correction loops the agent repeatedly got wrong
3. Preferred commands and tooling patterns that were actually used successfully
4. Specific files or directories the user works in or treats as special
5. Project gotchas discovered through debugging or rollback requests
## Canonical Memory Promotion
Promote durable findings into focused files instead of leaving them trapped in generic ingestion notes. Prefer paths like:
- `system/human/identity.md`
- `system/human/prefs/communication.md`
- `system/human/prefs/workflow.md`
- `system/human/prefs/coding.md`
- `system/<project>/conventions.md`
- `system/<project>/gotchas.md`
Avoid generic repo facts unless they influence execution. "Uses TypeScript" is weak. "Uses bun:test, so vitest is wrong for this test suite" is useful.`
})
步骤 5c:将工作器分支合并到 Main
所有工作器完成后,逐个合并其分支。工作器提交会保留在 Git 历史记录中。
关键: 在进行任何最终清理合成之前,先合并工作器分支。正确流程如下:
- 检查工作器分支
- 逐个将工作器分支合并到
main - 以增补方式解决冲突
- 如有需要,可在此基础上单独提交一次最终清理/整理
不要通过手动将最终记忆状态重新应用到 main 来绕过此流程,因为这样会导致工作器提交从最终历史记录中丢失。
3a. 合并前预先读取工作器输出
合并前,读取每个工作器分支中的文件,了解工作器发现的内容。这可以避免在解决冲突时丢失信息:
cd [MEMORY_DIR]
for branch in $(git for-each-ref --format='%(refname:short)' refs/heads | grep -v '^main$'); do
echo "=== $branch ==="
git diff main..$branch --stat
# Read key files from the branch
git show $branch:system/human/identity.md # or equivalent user-identity file
git show $branch:system/<project>/conventions.md # or whatever focused files they created
done
3b. 逐个合并分支
cd [MEMORY_DIR]
git merge [worker-branch] --no-edit -m "merge: worker N description"
对每个工作器分支重复此操作。合并所有工作器分支后,仅在需要进行最终整理时,才单独提交清理更改。
3c. 通过合并解决冲突,绝不压缩内容
关键: 解决合并冲突时,应以增补为原则。合并双方的独特细节,绝不要从头重写文件——这样一定会丢失信息。
冲突解决规则:
- 编辑前,完整阅读双方内容。找出各自独有的信息。
- 将传入分支中的新细节追加到现有文件中。不要因为现有版本已概括提及相关“主题”,就删掉具体引述、文件路径或注意事项。
- 保留具体细节:“使用工厂方法,例如
create_token_counter(),不要直接实例化”比“偏好使用工厂方法”更有价值。两者都要保留。 - 有疑问时就保留。文件间的信息重复,也好过信息丢失。不太重要的细节可以放在外部记忆中。
示例——错误的冲突解决方式(压缩内容):
<<<<<<< HEAD
- Uses `uv` for Python
=======
- **CRITICAL: Always use `uv run`** — chronic failure; never bare pytest or python
- `uv run pytest -sv tests/...` for specific tests
- Never use bare `pytest` or `python` commands
>>>>>>> migration-xxx
# BAD: Picks one side or rewrites
- **Python**: `uv` exclusively — `uv run pytest`, never bare `pip`
示例——正确的冲突解决方式(合并内容):
# GOOD: Keeps emphasis and specificity from incoming side
**CRITICAL: Use `uv` exclusively for Python** — chronic failure.
- `uv run pytest -sv tests/...` for tests
- `uv run python` for scripts
- Never bare `pip`, `python`, or `pytest`
3d. 验证没有丢失信息
所有合并完成后,将最终文件与工作器的输出进行对比。自问:对于每个工作器的输出,我能否在最终记忆中的某处找到每一项具体细节(引述、文件路径、反复出现的问题、注意事项)?如果不能,就将其补回。
3e. 清理工作树和分支
for w in $(dirname [MEMORY_DIR])/memory-worktrees/*; do
git worktree remove "$w" 2>/dev/null
done
git branch -d $(git for-each-ref --format='%(refname:short)' refs/heads | grep -v '^main$')
git push
输出示例
良好的输出应包含以下三个类别:
### User Personality & Identity
Pragmatic builder who values shipping over perfection. Gets frustrated when agents over-engineer or add "bonus" features. Uses dry humor and sarcasm when annoyed. Pattern: "scrappy startup engineer" — wants things to work, not to be architecturally pure.
### Hard Rules & Preferences
- **CRITICAL: Use `uv` for Python** — chronic failure ("you need to use uv", "make sure you use uv"); `uv run pytest -sv`, never bare `pytest`
- **Minimal changes only** — "just make a minor change stop adding all this stuff"
- **Only edit specified files** — when told to focus, stay focused
- Tests constantly: `uv run pytest -sv` (Python), `bun test` (TS)
### Project Context
- letta-cloud: Only edit `letta_agent_v3.py` — v1, v2, and base are deprecated
- Uses Biome for linting, not ESLint
- Conventional commits with scope in parens
第 5d 步:考虑根据发现的工作流创建技能
合并并整理后,检查提取的历史记录,找出可重复执行、适合编写成技能的多步骤工作流。历史分析往往能发现用户频繁执行的流程,否则 Agent 每次会话都得重新摸索这些流程。
适合作为技能的候选流程:
- 多步骤调试流程(例如“如何调试 Agent 消息不同步”“如何追踪 TTFT 回退”)
- 跨会话重复执行的常见工作流(例如“如何运行跨大模型提供商的集成测试”)
- 部署或发布流程
- 项目特定的设置或迁移步骤
如果你发现了候选流程,可以现在就创建技能(加载 [[skills/creating-skills]] 技能以获取指导),也可以在记忆中记下,以便日后创建:
# system/letta-code/overview.md
...
Potential skills to create:
- Debug workflow for HITL approval desync
- Integration test runner across providers
不要勉强创建技能——只有在历史记录中发现真正可重复执行的多步骤流程时,才创建技能。
故障排除
| 问题 | 原因 | 修复方法 |
|---|---|---|
子 Agent 以代码 null 退出,且未使用任何工具 | 尚未构建 letta.js | 运行 bun run build |
| 子 Agent 卡在“Tool requires approval” | 子 Agent 类型错误 | 使用 subagent_type: "history-analyzer"(工作进程)或 "memory"(综合) |
| 综合时发生合并冲突 | 工作进程修改了重叠的文件 | 完整阅读冲突双方的内容,合并独有细节——切勿从头重写。参见第 5c 步。 |
| 合并后信息丢失 | 冲突解决过程压缩了工作进程的输出 | 将最终文件与每个工作进程分支的输出进行比较。补回缺失的具体信息。参见第 5c 步。 |
| 缺少个性分析或内容过少 | 提示词未要求进行个性分析 | 使用上面的模板,并明确列出类别要求 |
| 推送时身份验证失败(“repository not found”) | 凭据助手损坏或存在全局助手冲突 | 重新配置仓库本地助手,并检查/清除冲突的全局 credential.<host>.helper 条目(参见 syncing-memory-filesystem 技能) |
6. 研究项目
与历史分析并行执行此步骤(第 5 步)。工作进程处理历史记录时,你应主动探索代码库。这是你的入门阶段——请投入足够精力。
重要提示:目标是了解代码库的实际运作方式——不仅要了解其结构,还要了解其内容。目录列表和 head -N 片段只能告诉你有哪些文件;阅读实际实现才能了解它们如何运作。完成此步骤后,你应该能够描述某项关键功能从入口到实现的完整流程。如果做不到,说明你读得还不够。
6a. 决定是否并行探索
完成初步扫描(README、包清单、顶层目录和入口点)后,决定是否并行展开探索。
默认规则:
- 如果仓库有 3 个或更多明确的子系统,启动 2-4 个并行子 Agent 来探索。
- 如果后台历史分析工作器已经在运行,优先选择并行探索,而不是自己按顺序完成所有研究。
- 只有在代码库确实很小,或子系统边界不明确时,才跳过子 Agent 探索。
对于中型到大型仓库,这是首选方式,即使在标准模式下也是如此。
根据选定的深度进行探索。
标准(父 Agent 和所有子 Agent 总计约 20-40 次工具调用):
- 扫描 README、package.json/配置文件、AGENTS.md、CLAUDE.md
- 查看 Git 状态和近期提交
- 探索关键目录并了解项目结构
- 阅读入口文件(main、index、app),了解应用流程
- 快速手动扫描,识别主要子系统
- 如果仓库的子系统边界明确,启动 2-3 个并行子 Agent 来探索
- 自己阅读 2-3 个关键实现文件,以便直接了解核心流程
- 阅读 2-3 个测试文件,了解测试模式和惯例
- 检查构建/CI 配置,了解项目的构建和测试方式
- 根据阅读内容找出注意事项、不明显的惯例和实际命令模式
- 随着结果陆续返回,将发现综合整理到记忆中
深度(100 次以上工具调用):完成上述所有事项,此外还要:
- 使用 TODO 或 Plan 工具制定系统的研究计划
- 在有帮助时使用更多并行子 Agent,覆盖其他子系统
- 深入研究 Git 历史,了解模式、惯例和背景
- 分析提交信息惯例和分支策略
- 阅读多个模块中的源文件,全面了解架构
- 端到端追踪关键代码路径(例如请求在系统中的流转过程)
- 阅读测试文件,了解测试范围和方式
- 找出已弃用的代码、已知问题和正在积极开发的部分
- 在渐进式记忆中创建详细的架构文档
- 可能需要进行多轮探索
使用子 Agent 并行探索
对于中型到大型仓库,完成初步扫描后,优先采用并行探索策略。
使用并行的 general-purpose 子 Agent 同时调查不同子系统。如果环境或用户指令不鼓励使用子 Agent,则使用 Bash/Glob/Grep/Read 直接进行同等探索。
良好的子系统边界包括:
server/、client/、shared/api/、ui/、common/runtime/、cli/、tools/- 单一代码库中的不同应用或包
子 Agent 配额:
- 标准模式:通常使用 2-3 个探索子 Agent
- 深度模式:通常使用 3-5 个探索子 Agent
- 不要为琐碎目录或能更快自行解答的问题启动子 Agent
- 按子系统划分任务,而非按随机文件夹数量划分
每个探索子 Agent 应返回:
- 关键文件及其用途
- 主要抽象和执行流程
- 该子系统采用的惯例和模式
- 注意事项、脆弱部分或已弃用路径
- 值得存入记忆或链接到记忆的文件路径
在一条消息中启动探索子 Agent,使其并行运行。
# After initial scan reveals key areas, launch parallel explorers in the background:
Agent({
subagent_type: "general-purpose",
description: "Explore API layer",
run_in_background: true,
prompt: `Read the implementation in src/api/.
Return:
1. key files and responsibilities
2. main abstractions and execution flow
3. non-obvious conventions
4. gotchas or deprecated paths
5. file paths worth storing in memory`
})
Agent({
subagent_type: "general-purpose",
description: "Explore frontend layer",
run_in_background: true,
prompt: `Read the implementation in src/ui/.
Return:
1. key files and responsibilities
2. major components and data flow
3. conventions and patterns
4. gotchas or fragile areas
5. file paths worth storing in memory`
})
Agent({
subagent_type: "general-purpose",
description: "Explore shared systems",
run_in_background: true,
prompt: `Read the implementation in src/shared/.
Return:
1. key files and responsibilities
2. shared abstractions
3. conventions and invariants
4. gotchas or deprecated paths
5. file paths worth storing in memory`
})
后台工作器运行期间,不要干等。继续研究项目并起草记忆,只有在准备整合发现或已无有用的直接研究可做时,才检查工作器状态。
准备整合发现时,获取后台子 Agent 的输出,并将其综合整理到记忆中,而不是重复进行相同探索。对入口点和核心流程保持第一手了解,同时利用子 Agent 的摘要补充子系统细节。
实际要阅读的内容(根据项目调整):
源代码(最重要——不要跳过):
- 入口点:
main.ts、index.ts、app.py、main.go等 - 核心抽象:定义主要领域对象或服务的 3–5 个文件
- 关键功能的工作方式:至少追踪一个功能,从入口到实现
- 测试文件:了解测试模式、测试内容以及测试夹具的工作方式
配置和元数据:
- README.md、CONTRIBUTING.md、AGENTS.md、CLAUDE.md
- 包清单(package.json、Cargo.toml、pyproject.toml、go.mod)
- 配置文件(.eslintrc、tsconfig.json、.prettierrc、biome.json)
- CI/CD 配置(.github/workflows/、.gitlab-ci.yml)
- 构建脚本和工具
Git 历史:
git log --oneline -20— 最近的历史记录git branch -a— 分支策略git log --format="%s" -50 | head -20— 提交约定git shortlog -sn --all | head -10— 主要贡献者git log --format="%an <%ae>" | sort -u— 带邮箱地址的贡献者
7. 通过发现路径构建记忆
创建或更新记忆文件时,添加 [[path]] 引用,帮助未来的自己查找相关上下文。这些引用应放在记忆文件的内容中:
不要把所有内容都放在 system/ 中。详细的参考资料应放在渐进式记忆中——即 system/ 之外、可通过引用按需加载的文件。
从 system/ 文件引用外部记忆:
# system/letta-code/overview.md
...
For detailed architecture docs, see [[letta-code/architecture.md]]
Known footguns and edge cases: [[system/letta-code/gotchas.md]]
从相关上下文引用技能:
# system/letta-code/conventions.md
...
When committing, follow the workflow in [[skills/commit]]
For PR creation, use [[skills/review-pr]]
在概览文件中创建索引:
# system/letta-code/overview.md
CLI for interacting with Letta agents. Bun runtime, React/Ink TUI.
Entry points:
- `src/index.ts` — CLI arg parsing, agent resolution, startup
- `src/cli/App.tsx` — main TUI component (React/Ink)
- `src/agent/` — agent creation, memory, model handling
Key flows:
- Message send: index.ts → App.tsx → agent/message.ts → streaming
- Tool execution: tools/manager.ts → tools/impl/*
Links:
- [[system/letta-code/conventions.md]] — tooling, testing, commits
- [[system/letta-code/gotchas.md]] — common mistakes
- [[letta-code/architecture.md]] — detailed subsystem docs
这是一个精简索引,不是散文式摘要。它会告诉未来的自己从哪里开始,以及到哪里查找更多内容。
其他指南:
- 每个文件的 frontmatter 中都需要有
description,说明其用途,而不是概述其内容 - 让
system/文件保持聚焦、便于快速浏览 - 将详细的参考资料放在
system/之外
8. 验证上下文质量
完成前,请检查你的工作:
- 结构要求:完成前运行此检查:
如果输出了任何违规项,请在提交前修正(将# Detect overlapping file/folder names (e.g. system/human.md AND system/human/) find "$MEMORY_DIR" -name "*.md" | sed 's/\.md$//' | while read f; do [ -d "$f" ] && echo "VIOLATION: $f.md conflicts with directory $f/" donefoo.md重命名为foo/overview.md,或将目录合并回文件)。 另请检查:system/persona.md是否存在?所有文件是否都有包含description的 frontmatter? - 文件粒度:每个文件是否只涵盖一个明确主题?路径和描述是否准确说明文件内容?如果一个文件混杂了多个概念(编码风格、Git 工作流和沟通偏好),请将其拆分。
- 发现路径:关键记忆文件是否通过
[[path]]链接,以便快速发现相关上下文?是否从上下文内的记忆中引用了外部文件? - 项目命名:项目目录是否以实际项目命名(例如
letta-code/),而不是通用的project/?参考文件也应如此。 - 信息密度:
system/中的所有内容是否真的每轮都需要? - Persona 质量:它是否体现了真实的个性和价值观,而不只是“Agent 角色 + 项目规则”?现在就读一遍你的 persona 文件——如果它只有“我是一个遵循用户偏好的编码助手”,那就算不上身份认同。你重视什么?你的思考方式有什么特别之处?明天换成不同模型,你仍会是那个可被辨认出来的 Agent 吗?如果 persona 消失而模型不变,是否会失去某些有意义的东西?如果没有,你的身份认同还不够鲜明。
- 没有语义漂移:如果正在重组现有 Agent,请确认没有改变 persona、身份认同或行为指令的含义——只是改进了结构。
- 不过度删减:将最终记忆与所有源材料(工作者输出、代码库研究)进行比较。整理过程中是否丢失了具体文件路径、反复出现的问题或注意事项?如果有,请补回。压缩若丢失具体信息,会削弱你的身份认同。
- 渐进式记忆:是否在
system/之外创建了用于存放详细内容的参考文件?是否检查了历史工作者生成的内容,并保留了项目上下文文件?这些文件是否通过[[path]]引用从system/中链接?
9. 询问用户是否完成
确认用户是否满意,或是否需要进一步调整。然后提交并推送记忆:
cd $MEMORY_DIR
git status # Review what changed before staging
git add <specific files> # Stage targeted paths — avoid blind `git add -A`
author_name="${AGENT_NAME:-$AGENT_ID}"
git commit --author="$author_name <[email protected]>" -m "feat(init): <summary> ✨
<what was initialized and key decisions made>"
git push
重要提示
尽可能并行调用工具——在一轮中读取多个文件、写入多个记忆文件。这能显著缩短初始化时间。
边做边将发现写入记忆——不要等到最后。
直接通过文件系统编辑记忆文件——记忆被映射到 $MEMORY_DIR,正是为了方便批量修改。使用标准文件工具(Read、Write、Edit)和 Git 管理初始化期间的更改。