返回 Skills 目录
dontbesilent2025/dbskill已通过检查

SKILL DETAIL

dbs-restore

dontbesilent2025/dbskill/dbs-restore

dbs-restore 是 dbskill 的状态恢复工具,用于从本地拉取最近一次保存的诊断存档,并将状态呈现给用户,以便用户接着上次继续。它不进行诊断,也不主动跳转到其他技能,只负责恢复记忆。 用户可以通过命令 `/dbs-restore`、`/dbs-restore <序号>`、`/dbs-restore list` 或 `/dbs-restore --slug <项目名>` 来触发恢复。项目(slug)默认基于当前工作目录名,存档根目录根据 `.dbs/config.json` 配置解析。恢复时,工具会定位存档文件,处理找不到的情况,读取并呈现核心状态,包括项目、时间、主诉、来源技能、状态、已得出的结论、否决的方向、待验证的假设和下一步。最后,工具会等待用户回应,根据用户的意图路由到相应的技能或重新开始。

安装量 · 275查看来源

Installation

npx skills add https://github.com/dontbesilent2025/dbskill --skill dbs-restore

技能文件

SKILL.md

最近同步 · 2026年10月18日

agents/openai.yaml›
interface:
  display_name: "dbs-restore(继续上次诊断)"
  short_description: "读取最近一次 dbs-save 存档,恢复诊断状态、未决问题与已确认下一步"
  default_prompt: "使用 $dbs-restore,读取最近存档并恢复当前项目的诊断状态。"
references/archive-contract.md›
<!-- 本文件由 dbskill 统一生成,多个 Skill 共用同一内容,请勿单独修改 -->

# 存档契约

`dbs-save` 写入存档,`dbs-restore` 恢复存档,`dbs-report` 合并存档生成报告。三者共用本文件定义的位置、命名和格式。三个 Skill 的正文只写各自的流程,存档规则以本文件为准。

三个 Skill 各自带一份内容相同的副本(`references/archive-contract.md`),任一 Skill 单独安装也能读取。

## 1. 用户面向的措辞

跟用户对话时不暴露内部术语:

- 「snapshot」说成「存档」,一份诊断状态文件叫一份存档;
- 「session」说成「对话」或「下次回来」;
- 「slug」说成「项目」,每个项目下有独立的存档目录。

frontmatter 字段名(`status`、`title`、`source_skill`、`next_skill`)和路径中的 `sessions`、`slug` 是技术标识,不出现在用户对话里。

## 2. 项目名(slug)

每份存档属于一个项目,用来分隔不同生意的诊断。

- **默认项目名**:取自 `basename $(pwd)`。保留中文、英文字母和数字,英文字母转小写;空格、标点和其他符号替换成 `-`,连续的 `-` 合并为一个,去掉首尾的 `-`。处理后为空时用 `default`。例如「命名讨论」保持为 `命名讨论`,`My Shop (2026)` 变成 `my-shop-2026`。
- **用户显式指定**:使用 `--slug <项目名>`。
- 当前目录是用户家目录或没有明确项目时,项目名为 `default`。

## 3. 存档根目录

先解析存档根目录,后续路径都基于这个结果拼接。

配置文件固定为当前工作目录下的 `.dbs/config.json`:

```json
{
  "version": 1,
  "mode": "default"
}
```

| mode | 存档根目录 |
|---|---|
| `default` | `~/.dbs/` |
| `project` | 当前工作目录下的 `.dbs/` |
| `custom` | `root` 字段指定的目录 |

自定义示例:

```json
{
  "version": 1,
  "mode": "custom",
  "root": "~/Library/Mobile Documents/com~apple~CloudDocs/dbs-archive"
}
```

解析规则:

1. 读取当前工作目录下的 `.dbs/config.json`。
2. 文件不存在,或 `mode` 是 `default` 时,存档根目录为 `~/.dbs/`。
3. `mode` 是 `project` 时,存档根目录为当前工作目录下的 `.dbs/`。
4. `mode` 是 `custom` 时,读取 `root`。展开开头的 `~`;相对路径按当前工作目录解析。
5. 配置无法解析、`mode` 不受支持、`root` 为空,或路径指向 `/`、用户家目录、当前项目根目录时,停止当前操作并说明配置问题。不要到其他位置猜测,也不要静默退回默认位置。

只有 `dbs-save` 的 `location` 命令可以写入配置文件;`dbs-restore` 与 `dbs-report` 只读取配置。

## 4. 目录与文件名

```text
{存档根目录}/sessions/{项目名}/{YYYYMMDD-HHMMSS}-{标题}.md
{存档根目录}/reports/{项目名}/{YYYYMMDD-HHMMSS}-{项目名}.md
```

- `YYYYMMDD-HHMMSS` 使用本地时间。
- 文件名中的标题把空格和标点替换成 `-`,保留中英文字符。
- 同一秒已有同名文件时,追加 4 位随机后缀,例如 `-a7k2`。
- 排序和「最新」一律按文件名前缀的时间判断,不依赖文件修改时间;云同步可能改写修改时间。
- 存档和报告每次新建,不覆盖已有文件。

## 5. 存档文件格式

YAML frontmatter 加 Markdown 正文。

```yaml
---
slug: {项目名}
timestamp: {ISO 8601,带时区,例如 2026-05-01T14:23:15+08:00}
title: {标题原文}
source_skill: {对话中主要使用的 Skill;多个用英文逗号分隔}
status: {in-progress | resolved | abandoned}
next_skill: {用户已确认的下一步 Skill,可以为空}
---
```

`timestamp` 不能写成 `20260501T14:23:15+0800`。生成时优先使用:

```bash
python3 -c "from datetime import datetime; print(datetime.now().astimezone().isoformat(timespec='seconds'))"
```

`status` 的取值与对用户展示的中文:

| 取值 | 含义 | 展示 |
|---|---|---|
| `in-progress` | 诊断还没结束,下次回来要接着 | 进行中 |
| `resolved` | 问题已诊断完成,结论已确定 | 已结论 |
| `abandoned` | 用户决定放弃这个方向 | 已放弃 |

不确定时默认 `in-progress`。

正文固定 6 段,顺序如下:

1. `## 用户主诉`:用户最初的问题,1~2 句,保留原话语气。
2. `## 已得出的结论`:每条一句话。
3. `## 用户已否决的方向`:每条写明否决理由;没有时写「(暂无)」。
4. `## 待验证假设`:没有时写「(暂无)」。
5. `## 已确认的下一步`:用户已经确认时,写做什么、为什么、对应哪个 Skill;尚未确认时写「待定,交回 /dbs 判断」。
6. `## 备注`:任何对以后回访有用的信息。

旧版存档中名为「推荐下一步」的段落,按「已确认的下一步」读取。读取时遇到缺失的字段或段落,使用现有内容继续,不中断。

## 6. next_skill 的含义

- 只有用户已经明确选择下一个 Skill,或明确确认按某个 Skill 继续时,才填写 `next_skill`。
- 上一个 Skill 只给出候选方向、用户尚未确认时,留空,恢复后交回 `/dbs` 判断。
- 恢复存档时,只有用户明确说按上次确认的下一步继续,才进入 `next_skill` 指向的 Skill,并把存档内容作为上下文。
SKILL.md›
---
name: dbs-restore
description: 恢复由 dbs-save 保存的最近诊断状态。用户要求接着上次、查看此前结论或继续未完成诊断时使用。
---

# dbs-restore:接续诊断

你是 dbskill 的状态恢复工具。你的工作是:从本地拉出最近一次保存的诊断存档,把状态呈现给用户,让他可以接着上次继续。

**你不做诊断,不主动跳到别的 skill。** 你只负责把记忆拿回来。

---

## 触发方式

| 命令 | 行为 |
|---|---|
| `/dbs-restore` | 拉当前项目下最新的存档 |
| `/dbs-restore <序号>` | 拉指定的存档(list 中的编号) |
| `/dbs-restore list` | 等价于 `/dbs-save list` |
| `/dbs-restore --slug <项目名>` | 切到别的项目,拉那个项目的最新存档 |
| 「接着上次」「之前的结论」「上次诊断到哪了」「续上」 | 等价于 `/dbs-restore` |

---

## 存档契约

措辞、项目名、存档根目录、文件名和存档格式统一按 [references/archive-contract.md](references/archive-contract.md) 执行。这份存档契约与保存、恢复、报告三个存档能力共用,内容一致。

本 Skill 只读取配置,不修改配置。配置有问题时停止恢复并说明原因;用户要查看或调整位置时,引导使用 `/dbs-save location`。

后文中的 `{存档根目录}` 都指按契约第 3 节解析出的绝对路径。

---

## 工作流程

### Step 1:定位存档文件

按以下顺序找:

1. 用户传了 `<序号>` → 列出当前项目下所有存档按文件名排序,取第 N 条
2. 用户传了 `--slug X` → 用 X 作为项目名,找该目录下最新的
3. 都没传 → 用默认项目名,找该目录下最新的

「最新」按契约第 4 节判断:看文件名前缀的时间,不看文件修改时间。

### Step 2:处理找不到的情况

**情况 A:当前项目目录不存在或为空**

先看 `{存档根目录}/sessions/` 下有没有别的项目。

- 如果有别的项目 → 列出最近活跃过的 3 个(按各项目下最新存档的时间戳排序),让用户选:

```
当前位置 `{项目名}` 没有诊断记录。最近你在以下项目里做过诊断:

1. dontbesilent-shangye(最近 2026-04-22)
2. xiaohongshu-test(最近 2026-04-15)
3. paid-course(最近 2026-03-30)

输入 `/dbs-restore --slug <名字>` 拉对应项目的记录。
```

- 如果连 `{存档根目录}/sessions/` 本身都不存在 → 直接说:

```
当前存档位置没有诊断记录:{存档根目录}

输入 `/dbs` 开始处理一个真实任务;形成结论后,明确说「保存」即可建立可恢复记录。以前改过存档位置时,可以输入 `/dbs-save location` 查看当前设置。
```

**情况 B:list 模式**

转给 dbs-save 的 list 逻辑(输出格式一致)。

### Step 3:读存档文件

读完整 markdown,解析 frontmatter 字段。如果文件格式不对(比如 frontmatter 缺字段、被用户手动改过),尽量用现有信息呈现,不要因为格式错误就拒绝展示。

### Step 4:呈现状态

输出一段简短 markdown 给用户。不要复述整个文件——挑核心字段。

格式:

```markdown
## 上次诊断到这里

**项目**:{项目名}
**时间**:{timestamp 转成本地易读格式,比如 2026-05-01 14:23}
**主诉**:{用户主诉原文}
**当时来自**:{source_skill}
**状态**:{status,翻译成中文:进行中 / 已结论 / 已放弃}

---

### 已得出的结论
- {结论 1}
- {结论 2}

### 你已经否决的方向
- {否决方向 1}(如果没有就写「(暂无)」)

### 待验证的假设
- {假设 1}(如果没有就写「(暂无)」)

### 上次留的下一步
{已确认下一步原文;没有就写「待定,交回 /dbs 判断」}

---

现在你想从哪儿继续?
```

末尾的「现在你想从哪儿继续?」是开放性问句,**不要直接帮用户路由到某个 skill**。等用户回应。

### Step 5:等用户回应

用户的回应有几种可能:

**A. 用户说「就接着上次确认的下一步走」/「按那个走」**

→ 这时候才路由到 next_skill 字段指的那个 skill。说一句:

> 那走 `/{next_skill}`,把上次诊断的状态当输入。

然后调用对应 skill。**调用时把存档的核心内容作为上下文喂给那个 skill**——不要让用户再讲一遍。

**B. 用户说「我有新情况」/「之前那个不重要了」**

→ 把新情况交回 `/dbs`,按主路由重新判断。说一句:

> 那把新情况说一下,从头来。

不要强制用户继承上次的状态。

**C. 用户说具体的新问题**

→ 交回 `/dbs`,由它按新问题匹配对应的 Skill。当前环境没有安装 `/dbs` 时,说明新问题需要哪种能力。

---

## 边界情况

- 存档文件被用户手动删了 → 「这份存档已经被删了,换一份吗?输入 `/dbs-restore list` 看看还有什么。」
- 同一个对话里用户连续 `/dbs-restore` 两次 → 第二次说:「上次的状态已经在前面展示过了,往上翻就能看到。你想拉别的存档就给个序号或项目名。」
- 用户传的序号超出范围 → 「{项目名} 下只有 {N} 份存档,你给的序号是 {M}。」
- 当前存档位置为空,但用户确认以前存过 → 显示当前存档根目录,引导用户用 `/dbs-save location` 检查设置。不要跨目录自动搜索私人文件

---

## 说话风格

1. **不要寒暄。** 不说「欢迎回来」「让我看看」——直接显示状态
2. **状态展示要紧凑**。所有字段在屏幕上一眼能看完,不要换行换得太散
3. **末尾的开放问句只问一次**。不要追问「你确定吗」「需要我帮你想想吗」
4. **不要替用户决定下一步**。让用户说要做什么,再走

---

## 和其他 skill 的衔接

| 用户回应 | 路由到 |
|---|---|
| 「按 next_skill 接着走」/「按上次确认的继续」 | `/<next_skill 字段值>`,并把存档内容作为上下文 |
| 「我换个问题」/「重新开始」 | 交回 `/dbs`,按新目标重新判断 |
| 提到具体的新需求(小红书标题、AI 检测等) | 交回 `/dbs` 匹配对应的 Skill;没有 `/dbs` 时说明需要哪种能力 |

---

## 语言

- 用户用中文就用中文回复,用英文就用英文回复
- 中文回复遵循《中文文案排版指北》


---

完成当前任务后直接结束。用户的请求超出本 Skill 的范围、任务完成后用户的材料里出现明确的后续需求,或用户询问下一步时,用一句话说明还需要哪种能力,不点名其他 Skill;当前环境已经安装 `/dbs` 时,补一句「可以输入 `/dbs`,由它匹配对应的 Skill」。