# DSH Time Machine

[![npm](https://img.shields.io/npm/v/dsh-time-machine)](https://www.npmjs.com/package/dsh-time-machine)
[![GitHub stars](https://img.shields.io/github/stars/zjukop/dsh-time-machine?style=flat)](https://github.com/zjukop/dsh-time-machine)
[![DeepSeek Harness](https://img.shields.io/badge/DeepSeek_Harness-plugin-4D6BFE)](https://github.com/deepseek-ai/deepseek-harness)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)

> 给 DeepSeek Harness 装上一台工作区时光机：改之前存档，改崩后安全回去。

`dsh-time-machine` 是一个本地优先的 DeepSeek Harness 插件。它把工作区保存为内容寻址快照，展示当前文件与存档之间的差异，并通过“两阶段确认”恢复文件。

## 为什么可能爆火

- **一句话能演示**：“鲸鱼，重构前存个档。”
- **解决真痛点**：Agent 的上下文能撤销，不代表已经写入磁盘的文件能撤销。
- **安全感可视化**：恢复前明确展示新增、修改、删除文件数量。
- **本地优先**：文件内容不会上传到额外服务。
- **不要求 Git**：草稿、未初始化仓库、被忽略文件同样能保护。

## 安装

```bash
npx @deepseek-ai/dsh plugin --profile web add dsh-time-machine
```

重启 `dsh web`。本地开发时也可以传入当前目录：

```bash
npx @deepseek-ai/dsh plugin --profile web add .
```

DSH 的插件管理会调用 `pnpm`，请确保 `pnpm --version` 能正常运行。

## 对话示例

```text
重构登录模块前，先给工作区存个档，叫“登录重构前”。
看看当前工作区和“登录重构前”相比变了什么。
预览回到“登录重构前”，先不要真的恢复。
```

只有在用户看过预览并明确同意后，Agent 才应调用真正的恢复工具。

## 工具

| 工具 | 作用 |
| --- | --- |
| `time_machine_checkpoint` | 创建存档 |
| `time_machine_list` | 查看存档 |
| `time_machine_diff` | 只读比较 |
| `time_machine_restore_preview` | 预览恢复并签发短时一次性令牌 |
| `time_machine_restore` | 使用令牌执行恢复 |

恢复默认使用 `merge`：恢复旧文件，但保留存档后新增的文件。`exact` 会删除这些新增文件，必须在预览时明确选择，并使用与该模式绑定的确认令牌。

## 存储与边界

- 数据默认存储在工作区的 `.dsh-time-machine/`。
- 默认忽略 `.git`、`node_modules`、`.DS_Store`、存储目录和符号链接。
- 单文件默认上限 10 MiB，单次存档默认上限 200 MiB。
- 当前版本不是 Git 替代品：没有分支、远端同步或垃圾回收。
- Developer Preview 阶段的 DSH API 可能发生破坏性变化。本插件按官方源码当前的工具注册契约开发，并以 npm 已发布的 `@deepseek-ai/dsh-tools@0.0.1-rc.1` 做独立构建验证。

## 开发

```bash
npm install
npm run check
```

## License

MIT
