返回 Skill 列表
extension
分类: 效率与办公无需 API Key

长项目上下文的压缩与加载skill

适合长项目上下文的压缩skill,压缩为两个可以被观测的持久性文档(目前已支持子agent书写执行树)。支持凝练与加载,方便长期项目,减少AI幻觉行为,杜绝AI健忘行为。 注意: 1. 记得替换成你们自己的AI IDE的工具,因为像是不同AI IDE的工具其实名称不同,但是实际上功能一致。 2. 压缩与加载好像魔搭只加载了我一个skill,另外一个skill建议去github下载,魔搭我不懂怎么更新与额外上传。 3. 目前完全没有规避系统方面的强制压缩(需要自己去做适配长文使用该skill)

person作者: baishuipinghubgithub

上下文凝练

本 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的判断

判断优先级

  1. 先检查是否为"子agent模式"(阶段C)——若是,跳转子agent模式流程
  2. 否则检查是否为"任务开始"(阶段A)——若是,追加todo后返回
  3. 否则视为"任务结束"(阶段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
  • 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的条目前插入分隔符:
    ## 子agent归纳 - <子agent描述>(原临时文件夹:zi_agent_cjx_2/,从编号 <起始编号> 起)
    
    合并后的条目加入步骤3生成的本批次条目序列,统一在步骤4追加到主b文件。Trae 工具:无(AI内部生成)
  • 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冲突
  • 算法
    1. 用 Glob 检查 <工作目录>/zi_agent_cjx* 系列文件夹是否存在
    2. zi_agent_cjx/ 不存在:创建 zi_agent_cjx/,本子agent使用该文件夹
    3. zi_agent_cjx/ 已存在:查找已存在的最大后缀数字 N(如 zi_agent_cjx_3/ 中 N=3),创建 zi_agent_cjx_{N+1}/
    4. 冲突重试:若创建 zi_agent_cjx_{N+1}/ 时发现已被其他并行子agent抢先创建(Glob与创建之间存在窗口),则递增 N 重试,最多3次
  • 本子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)、无则省略
    • 目的:一句话说明意图
  • 偶数(结果):<编号>. <状态> - <摘要>
    • 状态:成功 / 失败 / 部分成功
    • 摘要:关键产出、错误信息、变更要点

核心原则

  1. 编号全局连续:跨多次压缩,编号持续递增,作为 b文件内的定位锚点。本批次起始编号 = 已有最大编号 N + 1(首次为 1)
  2. 凝练批次分隔符:b文件用 ## 凝练批次 - <日期>(从编号 <起始编号> 起) 分隔不同压缩批次,但编号不重置
  3. 禁止通读 b文件:b文件可能极长,所有操作只用 Grep 搜索 + Read 末尾几行
  4. 过滤规则:回顾式生成时跳过纯失败探索、重复操作、无信息量步骤,避免膨胀
  5. 文件编码: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批量归纳所有临时文件夹