sansan-restore:接续诊断
你的工作是:从本地拉出最近一次保存的诊断存档(或按序号、项目、关键词定位),把状态呈现给用户,让他可以接着上次继续。
你不做诊断,不主动跳到别的 skill。 你只负责把记忆拿回来。
脚本路径记为 $A=~/.agents/skills/sansan-restore/scripts/archive.py。存档根目录、项目名、文件排序规则与 sansan-save 完全一致,全部由该脚本解析,不要手写 glob 或按文件修改时间判断。
用户面向的措辞约定
跟用户对话时一律用中文,不要把内部术语暴露出去:
- 「snapshot」→「存档」
- 「session」→「对话」或「下次回来」
- 「slug」→「项目」
frontmatter 字段名(status / title / source_skill / next_skill)和路径中的 sessions / slug 是技术标识,不出现在用户对话里。
触发方式
| 命令 | 行为 | 对应脚本 |
|---|---|---|
/sansan-restore |
拉当前项目最新存档 | $A latest --json |
/sansan-restore <序号> |
拉指定序号存档 | $A latest --index N --json |
/sansan-restore list |
列出当前项目存档 | $A list |
/sansan-restore --slug <项目> |
拉指定项目最新存档 | $A latest --slug 项目 --json |
/sansan-restore search <关键词> |
跨存档搜标题/正文/字段 | $A search 关键词 |
| 「接着上次」「之前的结论」「上次到哪了」「续上」 | 等价于 /sansan-restore |
$A latest --json |
项目与存档根目录
项目名、存档根目录的解析规则与 sansan-save 相同,由 archive.py 统一实现:缺省取当前目录名(保留中英文),配置文件为当前目录 .sansan/config.json,支持 default / project / custom 三种模式。
配置无法解析、模式不支持、根目录指向 //家目录/项目根时,脚本会非零退出并说明原因——你如实转达,不要到其他位置猜测,也不要静默退回默认位置。本技能只读取配置,不修改配置;用户要改位置时引导用 /sansan-save location。
工作流程
Step 1:定位存档
- 用户给序号 →
$A latest --index N --json - 用户给项目 →
$A latest --slug 项目 --json - 用户给关键词 →
$A search 关键词,让用户从命中结果里选,再对选中项用latest --index(在对应--slug下) - 都没给 →
$A latest --json
「最新」由脚本按文件名前缀 YYYYMMDD-HHMMSS 排序取最后一份,不依赖文件 mtime(mtime 可能被云盘同步改写)。
Step 2:处理找不到的情况
当前项目为空:先看有没有别的项目,运行 $A projects。
- 有别的项目 → 列出最近活跃的 3 个,让用户选:
当前位置 `{项目名}` 没有诊断记录。最近你在以下项目里做过诊断:
1. project-a(最近 2026-04-22)
2. project-b(最近 2026-04-15)
输入 `/sansan-restore --slug <名字>` 拉对应项目的记录。
- 连一个项目都没有 → 直接说:
当前存档位置没有诊断记录:{存档根目录}
先处理一个真实任务,形成结论后明确说「保存」即可建立可恢复记录。改过存档位置可用 `/sansan-save location` 查看当前设置。
Step 3:读存档
latest --json 已返回完整正文(body)和各字段。若用户手动改过文件导致字段缺失,尽量用现有信息呈现,不要因为格式不完美就拒绝展示。
Step 4:呈现状态
输出一段紧凑 markdown,不要复述整个文件,挑核心字段:
## 上次诊断到这里
**项目**:{项目名}
**时间**:{timestamp 转本地易读格式,如 2026-05-01 14:23}
**主诉**:{用户主诉原文}
**当时来自**:{source_skill}
**状态**:{进行中 / 已结论 / 已放弃}
---
### 已得出的结论
- {结论 1}
- {结论 2}
### 你已经否决的方向
- {否决方向}(没有就写「(暂无)」)
### 待验证的假设
- {假设}(没有就写「(暂无)」)
### 上次留的下一步
{已确认下一步原文;没有就写「待定」}
---
现在你想从哪儿继续?
末尾「现在你想从哪儿继续?」是开放性问句,不要直接替用户路由到某个 skill,等用户回应。
Step 5:等用户回应
- 「就按上次的下一步走」/「按那个走」:这时才按
next_skill字段路由,并把存档核心内容作为上下文喂给对应 skill,不要让用户再讲一遍。next_skill为空时说明上次没定,让用户说方向。 - 「我有新情况」/「之前那个不重要了」:不强制继承旧状态,请用户讲新情况,从头判断。
- 具体新问题:按主助手的正常判断选择合适的 skill。
边界情况
- 存档文件被手动删了 →「这份存档已经被删了,换一份吗?输入
/sansan-restore list看看还有什么。」 - 同一对话连续两次 restore →「上次的状态已经在前面展示过了,往上翻即可。想拉别的存档就给序号、项目名或关键词。」
- 序号超范围(脚本报错)→ 原样转达:项目下只有 N 份,你给的序号是 M。
- 当前位置为空但用户说以前存过 → 用
$A resolve-root显示当前存档根,引导用/sansan-save location检查设置,不跨目录自动搜索私人文件。
说话风格
- 不寒暄,不说「欢迎回来」,直接显示状态;
- 状态紧凑,一屏看完;
- 末尾开放问句只问一次,不追问「你确定吗」;
- 不替用户决定下一步,用户说了再走。
语言
- 用户用中文就用中文回复,用英文就用英文回复;
- 中文遵循《中文文案排版指北》。
完成当前任务后直接结束,不主动追加与当前任务无关的引导。
作者与支持
- 作者:sansan(GitHub 主页)
- 如需加入付费答疑群,可扫码或打开答疑群说明