session-harvest 用于在会话被压缩或结束之前,审查对话内容中哪些值得持久化,并确认每个候选项被放到合适的位置,而不是默认全部塞进 memory。其主要调用方式是显式命令 /session-harvest;描述中给出的自然语言匹配方式虽也被提及,但显式调用才是可依赖的方式。
用途与定位 该技能按需运行。安装钩子、配置 settings.json 或按任何计划运行均不在其范围内,那属于另一个更重的工具。
读取、运行与写入范围 读取内容包括:~/.claude 下 Claude Code 的 transcript 与后台任务状态(只读,其他 harness 在该位置没有内容);会话触及的每个仓库的 git 状态;通过 gh 获取的 CI 运行;进程与监听套接字表;docker 镜像;两处 plans 存储;已安装的 skills hub 以及 skills-state 解析的源码检出。套接字步骤会检查监听者所服务目录下是否存在以凭据命名的文件(.env、.netrc 等),仅检查名称,从不读取内容。 运行内容包括:git(除非使用 --no-fetch,否则会对每个触及仓库的自身 upstream 执行 fetch)、gh 和 docker(如果已安装)、Linux 上的 ps/ss 或 Windows 上的 PowerShell/netstat,以及 plans.py absorb(只读)。不通过 shell 执行任何命令。它绝不安装、重装或移除技能:skills-state 比较已安装副本与其来源并报告差异,部署修复属于 skill-authoring-taudelta 的流程。 写入范围:脚本本身不写入任何内容;过程通过 agent 只在规定范围内写入——会话所在仓库、其 plans/,以及通过 plan-conveyor 的 plans 存储。它绝不编辑、移动或删除他人为其他仓库提交的 plan;针对某仓库的证据会作为新 plan 归档并指名它。绝不写入已部署的 instructions 文件、已安装的技能副本或其他仓库的目录树。终止扫描发现的孤儿进程是唯一的非文件副作用,且是提议而非直接执行。 网络:仅 git fetch 和 gh,且只指向仓库自身的远端。不向任何地方发送数据,所有报告输出到 stdout。
脚本 scripts/harvest.py 承载了所有机械步骤:边界、已安装与检出的比较、解析本次会话的 transcript、提取轮次与答案、实时状态扫描、绿色声明计数,以及本会话中先前 harvest 已归档的内容。建议运行脚本而非手工组合命令。
安装路径与用法示例: H=~/.agents/skills/session-harvest/scripts/harvest.py # 或 <checkout>/skills/session-harvest/scripts/harvest.py python3 $H boundary # 步骤 0,运行的第一条命令 python3 $H transcript --expect '<a command this session ran>' python3 $H turns # 步骤 4 python3 $H skills-state # 步骤 0 — 需要 checkout python3 $H sweep --boundary <instant> # 步骤 5 python3 $H claims --until <instant> # 步骤 5 python3 $H filed --until <instant> # 步骤 8
其中 turns、sweep 和 claims 若不指定路径,会从 $CLAUDE_CODE_SESSION_ID 解析 transcript,该变量由 Claude Code 导出到每次 Bash 调用中,也是 transcript 自身文件名的主干;后台任务的 state.json 仍然优先,--session <id|path> 用于未导出 id 的 harness。
skills-state 会自行解析 --since 并打印其使用的值;该标志保留作为覆盖手段,用于未导出 id 的 harness 或审计非本次会话的窗口。transcript 会打印会话最长空闲间隔,超过一天意味着会话被恢复。moved-since 检查以每个技能自身进入上下文的时间为基线,而非会话开始时间。skills-state 会比较安装副本与检出,并自行查找检出,顺序为:--checkout <path>、$SESSION_HARVEST_CHECKOUT、脚本所在仓库之上、plan-conveyor 配置的 projects_root 下唯一包含 skills/session-harvest/SKILL.md 的 git 检出。机器上无检出时退出码为 1 并说明,此时正确的报告行是比较不可用,而非没有变动。 每个子命令都是只读并接受 --json。有意不包含两项:门禁重跑(属于仓库自身的命令)以及任何写入操作。
过程与写入边界 harvest 可写入的位置只有三处:会话运行所在的仓库(普通编辑与提交)、该仓库的 plans/(通过 plan-conveyor)、以及 plans 存储(通过 plan-conveyor,包括 --for 其他仓库的新 plan 和对本会话所写 plan 的更正)。他人为不同仓库提交的 plan 只读取、引用,绝不编辑。允许范围之外包括:已部署的 instructions 文件、已安装的技能副本、任何其他仓库的工作树,以及位于会话所在仓库之外的 ~/.agents/AGENTS.md 生成源。上述任一候选项都作为其所属仓库的 plan 归档。
步骤 0:检查正在运行的是否为当前副本 python3 $H boundary 是 harvest 的第一条命令,应在此之前不做其他操作,保留该值供步骤 5 的 --until 使用。由于运行中的技能是安装时落下的文件副本,harvest 可能执行旧版本而报告干净。python3 $H skills-state 会比较已安装副本与检出,以及本次会话写入过的技能;差异有四种原因:检出干净且与远端齐平(安装过时)、干净但领先若干提交(技能工作未推送)、脏(进行中的工作)、已链接的工作树(分支上的编辑)。后三种不是安装问题。dirty 检出不阻塞运行,但需确认本次运行所需命令不在未提交的 diff 中。干净的 diff 无法覆盖一种情况:installer 已运行但本会话上下文在加载时冻结的副本仍是旧的;此时应依据 --since 列表,如果 SKILL.md 在会话开始后变动,应从磁盘重新读取,优先从领先的检出读取。当整条分支变为 no-op 的一种情况是,移动技能的提交来自本会话本身。
适用场景与限制 适用于在会话压缩或结束前整理值得保存的内容、判断技能安装是否落后、核对本次会话写入的技能与 plan 归档情况。限制包括:仅按需运行,不调度、不安装钩子;脚本不写入;仅限规定范围内的写入;网络仅限 git fetch 与 gh;skills-state 在没有检出时返回 1;context 冻结副本导致的过时无法通过文件系统比较发现。
具体价格、平台支持细节与更多参考资料暂未提供。