结束会话(Wrap-up)
用户即将存档此聊天。仅存在于对话中的内容即将丢失:达成的决策、磁盘上的更改、下一个会话应承接的内容。多个已安装的技能各自保存其中一部分。此技能的任务是找到它们,按正确顺序运行,并在一次确认后停止。
技能集合不是固定的:插件来来去去,用户会编写新技能。绝不要硬编码名称;每次从已安装的内容中发现它们,然后与 references/close-out-catalogue.md 中的类别进行匹配。目录说明了每个类别的定义、顺序和成本;此文件说明了在每个环境中如何运行它们。如果两者似乎不一致,请按照目录确定内容和顺序,按照此文件确定方式,并在报告中说明不一致之处,以便用户修复目录。
0. 确定你所在的位置以及会话的年龄
后续大部分内容随环境和会话年龄而变化,因此先确定这两点,并在计划顶部用一行说明。三种环境:
- 用户机器上的 Claude Code。 该机器上的 Shell,技能位于
~/.claude/skills,钩子可运行(包括,如果设置了,一个记录每个会话的SessionEnd钩子;本地映射或settings.json说明了是否设置了该钩子),仓库和存储库在磁盘上。以下所有内容按原样适用。 - 带设备 Shell 的 claude.ai 或云会话。 聊天在 Linux 容器中运行,但列出了用户计算机的 Shell 工具,因此命令在用户连接的文件夹内运行。存储库和存储在已连接文件夹中的任何脚本均可访问。此技能自身的文件(目录、
scripts/)位于容器中,而非该机器上。钩子不运行。记忆通过记忆工具进行,后台会在每次轮次后归档持久事实。 - 不带该 Shell 的 claude.ai 或云会话。 用户计算机上的文件只能通过将文件暂存到容器并提交回来的工具访问,并且仅在桌面应用已链接时才能访问。否则,其磁盘上的任何内容都不可访问。钩子和记忆同上。
信号:平台和工作目录,列出了哪些工具(设备 Shell、设备文件工具、记忆工具),系统提示中关于记忆和项目的内容。如果您无法确定,请说明并询问,因为错误的猜测会写入错误的位置。
然后是年龄。关闭通常在工作结束时要求,但聊天记录可能打开数天,并在后续会话已处理相同文件、笔记和技能后关闭。当会话接触的任何内容在其最后一次实际工作后发生更改时,会话即为过期:将该工作的日期(对话的时间戳或带日期的笔记)与它接触的文件和存储条目的修改时间、后续提交、日期更晚的存储条目或它使用的技能(现在列表显示已重命名或不再显示)进行比较。一次更改就足够了。年龄本身只是一个查看的理由,而不是定论:一个无人构建的、一周前的聊天记录并不算过期。在顶部行中说明年龄差距(“上次活动于 11 月 4 日;它接触的文件此后已更改”)。
在过期会话中,磁盘和存储比对话更新,因此它们优先:
- 在规划任何写入之前,读取该步骤将接触的每个文件和存储条目的当前版本,并根据现在存在的版本进行规划,而不是根据对话记忆的内容。
- 该会话做出的、后续会话已记录的一个决策已完成:指出它,不要再次写入。后续会话更改或撤销的决策,不是本次关闭要恢复的:将其标记为已取代并放弃。当后续记录仅涵盖决策的一部分,或不清楚涵盖多少时,仅放弃它明确涵盖的部分,并将剩余部分标记为可能已被取代;以单个问题的方式处理。
- 该会话使用的路径、名称和技能可能已移动或重命名。再次使用前需重新解析。仅当后续有书面内容(记忆、笔记、提交、技能自身的描述说明其以前叫什么)表明时,才使用新形式;使用该形式并说明。当没有任何内容表明时,说明旧形式不再解析,而不是猜测,并且不要将其作为当前数据写入存储。
- 要提出的剩余内容是会话已决定且尚未被记录、更改或矛盾的内容。这可能非常少;一个只写入一行或什么都不写的过期关闭计划,也是正确的关闭。
同一个聊天可能已经包含一个更早的关闭,在用户继续工作之前运行过。那么本次关闭是在此基础上构建,而不是重新开始:获取其计划,并将每个步骤标记为已完成(其报告如此说明,且磁盘一致)、已取代或仍待处理,并仅检查其之后发生的情况。早期关闭提出的但用户从未回答的计划未被批准:将其中待处理的步骤带入当前计划,再次根据磁盘和上述规则检查,而不是运行它们或默默丢弃它们,并在顶部行说明存在更早的关闭。
1. 发现
在发现任何内容之前,检查环境的常设指令(在 Claude Code 中是 CLAUDE.md 文件和自动记忆(此处视为常设指令);在 claude.ai 中是项目指令、用户偏好和记忆,以及此 SKILL.md 的打包副本可能携带的“此安装的本地映射”部分)以查找此流程的本地映射:一个简短的章节,说明哪个已安装的技能涵盖每个类别、存储库、已退役内容、测量成本。存在时,它取代发现;验证它命名的每个技能是否仍已安装(并找到一个命名的命令或路径,以及一个廉价的只读检查位置),并将它退役的内容视为已解决。部分映射(命名了存储库或退役内容,但未说明每个类别的技能)为发现提供信息,而不是取代它:尊重它命名的内容,发现其余内容,并且第 5 节的目标变为完成该部分,而不是添加第二个。当不存在时,按如下方式发现,并在最后提供写入一个的选项(第 5 节)。在 Claude Code 中,从磁盘读取 CLAUDE.md 文件,而不仅仅是从上下文中读取:注入的副本可能早于编辑,而过时的副本会让您进入完全发现并提供一个已存在的映射的第二个版本。
候选列表是上下文中已有的“可用技能”列表(名称 + 描述)。它涵盖本地技能、插件技能和 gstack 等;没有更好的来源。列表的两个特殊情况:一个技能同时显示带有和不带插件前缀,描述相同,则是一个技能,因此在计划中称其为裸名称,但使用列表显示的确切名称调用它;并且当命令接触到携带其自身技能的文件夹时,列表可能在运行中途增长,这些后来的技能仅当匹配类别时才改变计划。
阅读 references/close-out-catalogue.md。对于它定义的每个类别,选择其描述与其目的匹配的已安装技能。已知成员是提示,而非最终答案:未列出的已安装技能如果描述适合则符合条件,列出的但不再安装的技能则跳过。注意目录标记的接近匹配项。当列表仅按名称显示技能时(两种环境都有此情况),按名称和目录的“通过以下内容识别”词语进行匹配,并在计划中标记为“(无描述)”,以便用户知道匹配较弱。
没有已安装技能的类别在计划中列为“跳过,未安装”;不要自行编造替代品,除非环境有其自身的机制来完成该工作(第 2 节)。某些类别不是技能(在 Claude Code 中,自动记忆通过 Write 工具写入,图刷新是一个命令);它们是同一计划中的步骤,仅在环境拥有它们时才存在。
然后检查本次会话实际值得做的事情:
- 图。 在机器上的 Claude Code 中,运行
python scripts/find_graphs.py <workspace-root>(路径相对于此技能目录;任何 Python 都可以)。工作区根目录是会话的工作文件夹,或者当项目指令描述为包含所有仓库的更宽文件夹时,即为该更宽文件夹。该脚本列出每个graphify-out/,其项目文件夹位于其下最多五层,以及自其清单以来文件是否已更改:每个图一行,CURRENT、STALE(包含更改和删除计数)、或 UNKNOWN(无清单,或 graphify 无法导入),或一行说明未找到。计数不说明更改是笔记(每个约 85k 需要重新提取)还是代码(无需 LLM);根据会话接触的内容说明。即使您记得编辑过已绘制的文件,CURRENT 也不是一个步骤:清单知道图是否在编辑后重建。如果机器上没有 Python,则图未检查;请说明。在其他任何地方,脚本都无法看到工作区(它在容器中运行,图在用户磁盘上):将每个图报告为未检查,这并非“无需更新”。 - 会话。 决策、更正、关于用户或项目的新事实、创建或移动的文件?这决定了记忆和学习步骤是否有任何内容可写入。纯阅读的会话可能除了上下文保存外不需要任何内容。
- Git。 在会话接触的每个仓库中运行
git status。未提交的工作不是此技能要提交的;它进入计划的“留给用户”行。当会话的故事与 git 不一致时(会话中更改的文件,但工作树干净),指出不一致之处,而不是默默调和。 - 声称的写入。 列出会话声称已写入、创建、安装或更改的内容(文件、笔记、提交、设置、已安装的包),并通过只读检查每个内容:它存在,并且其内容与会话写入的内容一致(一个独特的行或大小,而不仅仅是存在,因为失败的覆盖会留下旧文件)。报告成功的工具不是证据。当内容不同时,修改时间决定:在会话最后一次工作之后更改,意味着后续会话更改了它(第 0 节,过期);在之后未更改,意味着写入从未成功。应该存在但不存在的文件也从未成功,除非后续提交或笔记记录了删除。从未成功的写入,或会话留下半途而废的工作(在某些地方安装而未在其他地方安装,承诺但未运行的步骤),进入计划的“遗留问题”行(第 3 节)。声称无写入的会话跳过此步骤。
- 进行中的工作,由另一个技能跨多个会话进行(目录,“进行中的工作”)。不是其自身的步骤:它进入交接备注和上下文保存。
- 状态已存在于何处。 项目指令可能命名用户视为来源的存储:一个存储库、一个项目数据库、一个保存下一个操作字段。在规划任何写入之前阅读指令(存储本身由写入它们的步骤读取);它们决定类别 3 和 5 如何运行。当两个命名的存储可能包含相同的事实(例如,决策笔记和项目笔记)时,计划命名写入目标的是哪一个;如果指令未解决,则在单个问题中解决,绝不要默默解决。
2. 随环境变化的内容
在 Claude Code 中,按目录描述运行每个类别;以下内容中,只有说明如此约束的规则才约束该环境。在第 0 节的另外两种情况下,按如下方式调整。
1 记忆:检查,不写入。 后台已在每次轮次后归档持久事实。阅读它可能使用的记忆文件(列表显示路径),并在计划中说明本次会话的决策是否存在。后台在每次轮次后运行,因此关闭轮次本身中决定的内容尚未存在,并将在其后归档;这正常,不是缺口。平台仅允许在用户明确请求时写入记忆,因此如果他们说的某些内容缺失,请在计划中说明,并让他们说“保存它”;该句子就是请求。在项目中,写入进入项目自身的子树,采用记忆指令要求的格式。
1b 交接备注, 2 学习:未安装时跳过。 没有替代品;项目文档、新笔记或聊天摘要不会成为替代品(见单地规则)。
3 存储同步:取决于可达性。 使用设备 Shell 且存储文件夹已连接时,如果已安装,则运行同步技能;如果它需要此环境缺少的内容,它会说明,然后手动执行同步。无 Shell 时,且仅在计算机链接时,使用文件工具手动执行。无论哪种方式,首先阅读存储自身的约定说明(无 Shell 时暂存它),并将每个提议的更改放入计划中,说明保留什么、更改什么、消失什么,以便单次确认涵盖写入。会话日志钩子写入的内容在此处不存在;请说明。
4 图:未检查,如第 1 节所述。不是“无事可做”。
5 上下文保存:写入项目指定的位置。 这在 Claude Code 中也适用:项目指令命名的位置胜过通用的快照技能,如果没有,则已安装的快照技能是步骤。如果项目指令命名了一个位置(例如,项目数据库中的一个字段),该位置就是上下文保存。如果已安装的技能拥有该位置(例如每日关闭例程),则该技能是步骤;如果它已在此会话中运行,则跳过。否则,您自己写入那里。计划携带为该位置提议的确切文本,以便一个答案涵盖它;当您自己写入该位置时适用该规则,而拥有写入的技能则自行组成其内容,无论是在 Claude Code 还是其他任何地方。如果项目条目未涵盖会话处理的内容,请说明并提议…
…[已截断以进行翻译]