上下文凝练
本 skill 用于将当前对话上下文压缩为两个文件,解决长项目中上下文膨胀与幻觉问题。仅执行凝练输出,不执行加载(加载由"上下文加载"skill 负责)。
任务阶段识别(skill加载后首先执行)
skill被加载后,AI 通过检查当前对话上文判断所处阶段,避免"一加载就立即凝练"的误触发。
阶段A:任务开始
- 判断依据:对话刚开始,用户刚提出需求,尚未执行实质工具调用(对话上文很短/无工具调用历史/用户刚发起任务类请求)
- 行为:不立即执行凝练流程。用 TaskCreate 在 todo list 末尾追加一条任务:
- subject: "凝练上下文(任务完成后执行)"
- description: "任务全部完成后,调用上下文凝练skill执行凝练流程,输出a/b文件"
- 然后skill结束(返回),主对话继续执行用户的实际任务
- 当 todo list 中其他任务全部完成、轮到该任务时,AI 再次进入凝练skill,此时识别为阶段B,执行凝练
阶段B:任务结束/用户主动要求凝练
- 判断依据:已执行过大量工具调用,或用户明确说"凝练/压缩/保存上下文",或 todo list 中"凝练上下文"任务被激活
- 行为:执行标准凝练流程(步骤1-6 + 步骤3.5子agent归纳)
阶段C:子agent模式
- 判断依据:prompt 中包含"子agent模式"指令(主对话派遣的子agent调用本skill)
- 行为:执行子agent模式流程(见"子agent模式"章节),跳过阶段A/B的判断
判断优先级
- 先检查是否为"子agent模式"(阶段C)——若是,跳转子agent模式流程
- 否则检查是否为"任务开始"(阶段A)——若是,追加todo后返回
- 否则视为"任务结束"(阶段B)——执行标准凝练流程
说明
- AI 一般能通过对话上文判断阶段(任务开始时上文很短,任务结束时上文有大量工具调用)
- 阶段A的"追加todo"机制让用户可在任务开始就加载skill,skill不会误触发凝练
- 阶段A追加的todo任务,在主对话完成实际工作后自然轮到执行,此时再进入skill识别为阶段B
输出文件
- a文件(极短提示词摘要,覆盖更新):
<工作目录>/context_m_jx/context_summary.md - b文件(执行树,追加结构化条目):
<工作目录>/context_m_jx/execution_tree.md
工作流
步骤1:确认输出路径
- 默认路径:工作目录下
context_m_jx/文件夹(提示词内置此默认值)- a文件:
<工作目录>/context_m_jx/context_summary.md - b文件:
<工作目录>/context_m_jx/execution_tree.md
- a文件:
- 若
context_m_jx/不存在,创建该文件夹 - 若用户指定了其他路径,使用用户指定路径
- 若用户未明确指定且默认路径存在已有文件,直接使用默认路径(无需询问)
- Trae 工具:AskUserQuestion(仅在路径有歧义时)、Write(创建文件夹/文件)
步骤2:确定起始编号
- 若 b文件不存在:N = 0(首次创建),本批次起始编号 = 1
- 若 b文件已存在:用 Grep 直接搜索 b文件中所有编号行(正则
^\d+\.,output_mode=content,-n=true),从匹配结果中取最大编号记为 N,本批次起始编号 = N+1 - 禁止 Read 整个 b文件(b文件可能极长,与设计目标相悖)
- Trae 工具:Grep(直接对文件路径操作,无需先 Read)
步骤3:确定回顾起点并生成执行树条目
- 回顾起点判断(三种场景):
- 场景A(同会话内再次凝练):回顾范围 = 本会话内上次调用凝练 skill 之后产生的对话。AI 通过对话历史中上次凝练的报告输出(步骤6的"向用户报告")作为锚点定位回顾起点。
- 场景B(加载上下文后继续工作再凝练):回顾范围 = 本次加载 skill 完成之后产生的对话。AI 通过对话历史中加载 skill 的确认输出(步骤6的"综合理解并向用户确认")作为锚点定位回顾起点。
- 场景C(首次凝练,无任何锚点):回顾范围 = 当前会话的全部对话。
- 明确:b文件已有条目对应"已压缩"部分,新条目仅记录回顾起点之后的新对话,二者不重叠
- 按工具调用粒度提取,生成结构化条目:
- 奇数条(动作):
<编号>. [<工具类型>] <文件路径/对象> <行号/范围> | <目的>- 文件路径使用"相对于工作目录的路径"(如
src/flotwindows.cs),兼顾可读性与 Grep 搜索准确性 - 示例:
7. [Edit] src/flotwindows.cs L15-17 | 修复悬浮窗位置计算 - 示例:
3. [RunCommand] MSBuild context.csproj | 编译项目 - 示例:
5. [SearchCodebase] "悬浮窗实现" | 查找悬浮窗代码位置
- 文件路径使用"相对于工作目录的路径"(如
- 偶数条(结果):
<编号>. <状态> - <关键产出/错误摘要>- 状态 ∈ {成功, 失败, 部分成功}
- 示例:
8. 失败 - X坐标公式错误,悬浮窗偏移50px - 示例:
4. 成功 - 编译通过,输出 dll 到 bin/Debug
- 奇数条(动作):
- 过滤规则:跳过纯探索性失败的搜索、重复的相同操作(只保留最后一次)、无信息量的中间步骤
- Trae 工具:无(AI 内部生成)
步骤3.5:归纳子agent执行树
- 触发条件:主对话在凝练时,若用 Glob 发现
<工作目录>/zi_agent_cjx*系列文件夹存在,则执行本步骤;否则跳过 - 3.5.1 列出所有待归纳的临时文件夹:用 Glob 匹配
<工作目录>/zi_agent_cjx*,按后缀数字排序(zi_agent_cjx/视为0 <zi_agent_cjx_1/<zi_agent_cjx_2/< ...)。Trae 工具:Glob - 3.5.2 逐个读取临时执行树:对每个临时文件夹,Read 其下的
execution_tree.md(子agent临时文件不会很长,可全量读取),提取条目内容(去除文件头元信息)。Trae 工具:Read - 3.5.3 重新编号并合并到本批次条目:取主执行树当前最大编号 N(步骤2已获取),对每个子agent的条目按顺序重新编号 N+1, N+2, ...。每个子agent的条目前插入分隔符:
合并后的条目加入步骤3生成的本批次条目序列,统一在步骤4追加到主b文件。Trae 工具:无(AI内部生成)## 子agent归纳 - <子agent描述>(原临时文件夹:zi_agent_cjx_2/,从编号 <起始编号> 起) - 3.5.4 删除已归纳的临时文件夹:删除时机 = 步骤4(追加到主b文件)成功之后、步骤5(覆盖更新a文件)之前。对每个已成功归纳并写入主b文件的临时文件夹,用 DeleteFile 删除其下的
execution_tree.md,再删除空文件夹。失败回退:若步骤4部分失败,只删除已成功写入主b文件对应的临时文件夹,保留失败的临时文件夹供下次凝练重试。Trae 工具:DeleteFile
步骤4:追加条目到 b文件
- 若 b文件不存在:用 Write 创建文件,写入文件头
# 执行树\n\n+ 本批次条目 - 若 b文件已存在:用 Read 读取 b文件末尾若干行(约5-10行)作为 old_string,用 Edit 替换为"末尾内容+新条目"实现追加。禁止 Read 整个 b文件
- 失败回退:若 Edit 因 old_string 不唯一而失败,增大读取行数至 15-20 行重试;若仍失败且 b文件不过长(<200行),可 Read 全文后用 Write 重写
- 追加格式(本批次分隔符):
## 凝练批次 - <日期>(从编号 <起始编号> 起) 7. [Edit] src/flotwindows.cs L15-17 | 修复悬浮窗位置计算 8. 失败 - X坐标公式错误,悬浮窗偏移50px 9. [Edit] src/flotwindows.cs L15-17 | 改用 GetWindowRect 10. 成功 - 悬浮窗位置正确 - Trae 工具:Write(新建)、Read(仅读末尾几行)、Edit(追加)
步骤5:覆盖更新 a文件
- 生成 a文件内容,结构如下:
# 上下文摘要 ## 用户需求 <凝练为一两句话的原始需求> ## 当前进度 <一句话描述当前进度,如"悬浮窗位置已修复,正在进行性能优化"> ## 主题索引 - <主题/模块名>(<文件列表,逗号分隔>) - <主题/模块名>(<文件列表,逗号分隔>) ## 关键决策 - <决策点>:<选择及理由> - <决策点>:<选择及理由> ## 下一步 <待办或下一步方向> - 用 Write 覆盖 a文件
- 失败处理:若 a文件写入失败,提示用户"b文件已更新但 a文件未更新,需重新执行步骤5",确保 a/b 一致性
- Trae 工具:Write
步骤6:向用户报告
- 输出:a文件路径、b文件路径、本次新增条目编号范围(如"新增条目 7-10")、a文件摘要预览
- 提示用户:下次新会话可用"上下文加载"skill 恢复上下文
子agent模式(被主对话派遣时)
当本skill被子agent调用(阶段C),执行本章节流程,跳过标准步骤1-6。
子agent模式触发条件
- 主对话在派遣子agent的 prompt 中,明确指示"任务完成后调用上下文凝练skill,子agent模式"
- 子agent调用本skill时,若 prompt 中包含"子agent模式"指令,则执行本章节流程
子agent模式步骤1:独占临时文件夹
- 目的:在
<工作目录>/下创建独占文件夹,避免与其他并行子agent冲突 - 算法:
- 用 Glob 检查
<工作目录>/zi_agent_cjx*系列文件夹是否存在 - 若
zi_agent_cjx/不存在:创建zi_agent_cjx/,本子agent使用该文件夹 - 若
zi_agent_cjx/已存在:查找已存在的最大后缀数字 N(如zi_agent_cjx_3/中 N=3),创建zi_agent_cjx_{N+1}/ - 冲突重试:若创建
zi_agent_cjx_{N+1}/时发现已被其他并行子agent抢先创建(Glob与创建之间存在窗口),则递增 N 重试,最多3次
- 用 Glob 检查
- 本子agent的临时文件夹记为
<zi_agent_dir>(如zi_agent_cjx_2/) - Trae 工具:Glob、Write(创建文件夹,通过创建占位文件实现)
子agent模式步骤2:写入临时执行树
- 回顾起点:场景C(子agent是fresh的,无历史锚点),回顾范围 = 本子agent会话的全部工具调用
- 生成条目:按原skill的"按工具调用粒度提取"规则,生成奇数条动作/偶数条结果的结构化条目
- 编号:本子agent临时执行树内部编号从 1 开始(独立编号,主对话归纳时会重新编号衔接主执行树)
- 写入文件:
<zi_agent_dir>/execution_tree.md- 文件头:
# 子agent执行树\n\n## 子agent:<描述>\n## 派遣时间:<日期时间>\n## 主对话派遣目的:<一句话>\n - 条目格式同主执行树
- 文件头:
- 跳过a文件:子agent模式不写
context_summary.md,主对话归纳时自行更新主a文件 - Trae 工具:Write(创建b文件)
子agent模式步骤3:返回
- 子agent在返回消息中,向主对话报告:
- 临时文件夹路径(如
zi_agent_cjx_2/) - 临时执行树条目数(如"共8条,编号1-8")
- 一句话任务总结
- 临时文件夹路径(如
- 不删除临时文件夹(删除由主对话归纳后负责)
b文件条目格式规则
- 奇数(动作):
<编号>. [<工具>] <对象> <位置> | <目的>- 工具类型:Read / Edit / Write / RunCommand / SearchCodebase / Grep / Glob / Task / AskUserQuestion 等
- 对象:文件路径(相对于工作目录,如
src/flotwindows.cs)、命令、搜索词等 - 位置:行号(L15-17)、无则省略
- 目的:一句话说明意图
- 偶数(结果):
<编号>. <状态> - <摘要>- 状态:成功 / 失败 / 部分成功
- 摘要:关键产出、错误信息、变更要点
核心原则
- 编号全局连续:跨多次压缩,编号持续递增,作为 b文件内的定位锚点。本批次起始编号 = 已有最大编号 N + 1(首次为 1)
- 凝练批次分隔符:b文件用
## 凝练批次 - <日期>(从编号 <起始编号> 起)分隔不同压缩批次,但编号不重置 - 禁止通读 b文件:b文件可能极长,所有操作只用 Grep 搜索 + Read 末尾几行
- 过滤规则:回顾式生成时跳过纯失败探索、重复操作、无信息量步骤,避免膨胀
- 文件编码:UTF-8
主对话派遣子agent时的prompt规范
主对话在用 Agent 工具派遣子agent时,若希望子agent的行为被记录到执行树,须在子agent prompt 末尾追加以下指令模板:
【任务完成后必须执行】
调用"上下文凝练"skill,子agent模式。
- 在 <工作目录>/zi_agent_cjx* 系列文件夹中独占一个文件夹(算法见skill)
- 把你会话内的所有工具调用按skill规则写入 <你的文件夹>/execution_tree.md
- 跳过a文件写入
- 返回消息中报告:临时文件夹路径、条目数、一句话任务总结
说明:
- 主对话须在 prompt 中明确告知子agent"工作目录"的绝对路径
- 串行派遣:每个子agent返回后,主对话可立即触发凝练skill执行步骤3.5归纳该子agent的临时文件夹
- 并行派遣:所有子agent返回后,主对话触发一次凝练skill,步骤3.5批量归纳所有临时文件夹
微信扫一扫