内容
<div align="center">
<img src="assets/icon.png" width="96" alt="StepWind icon"/>
# StepWind
**您的电脑一键撤销按钮。**
实时保护,防止意外移动、重命名、删除和错误保存 - 面向所有人,而不仅仅是使用git的人。
[](https://github.com/pwnapplehat/StepWind/actions)
[](LICENSE)
[](https://dotnet.microsoft.com/)
免费 · 开源 · 100%本地 · 无云 · 无账户 · 无遥测
**[stepwind.app](https://stepwind.app)** · [发布版本](https://github.com/pwnapplehat/StepWind/releases/latest) · [安全模型](SECURITY.md) · [企业版](enterprise/README.md)
<img src="docs/screenshots/app.png" width="820" alt="StepWind 时间线 - 一个实时的、按天分组的文件操作记录,支持一键撤销"/>
</div>
---
## 问题
你移动了一个文件夹,不小心按了太多次Ctrl+Z,它就...不见了 - 不在回收站里,没有警告,没有痕迹。Windows资源管理器的撤销操作是静默的,可能会永久删除文件,这个问题已经存在20年了。或者,你覆盖了一个好的草稿,新的版本很差劲,第二天才发现。`git`保护已提交的代码;但对未提交的工作或99%不使用git的人无能为力。
现有的工具只对文件**内容**进行版本控制,定时记录。而它们没有记录**操作** - 移动/重命名/删除操作本身,所以它们无法简单地**撤销**操作。StepWind可以做到。
## 两层保护
**1. 您整个电脑的飞行记录仪。** StepWind跟踪每个驱动器的NTFS更改日志,重建一个实时的、纯文本的时间线,记录了发生了什么 - “资源管理器在下午2点31分将 *论文* 移动到 *存档*”,由执行操作的应用程序标记。移动或重命名操作可以**一键**撤销,立即生效,不需要存储您的数据副本。
**2. 您关心的目录的时间机器。** 文档、桌面和您选择的文件夹会持续记录版本历史。每个保存操作都会被捕获为基于内容定义、重复数据删除、压缩的块(与restic/borg使用的相同技术),按块流式传输,一个2 GB的文件从不占用整个内存,因此滚动文件回到任何更早的版本 - 即使它被覆盖和删除 - 都是即时的,而一个轻微编辑的2 GB文件不会占用2 GB的存储空间。新创建的文件会在创建后一瞬间被捕获,因此即使文件被创建和删除,仍然可以恢复。当删除的文件有保存历史时,时间线提供一键**恢复**;当文件确实没有历史时,它会明确显示,而不是假装。
## AI编程代理的安全网
AI工具快速编辑文件 - 但有时会编辑错误。StepWind附带一个 **MCP服务器**,为Cursor和Claude等代理提供时间机器,保护您的文件夹:文件修改前进行检查,查看自上次修改以来的统一差异,如果修改失败,可以恢复。**只读 + 可加设计** - 代理可以查看、差异对比、检查和恢复(恢复操作从不覆盖),但它永远不能删除历史或触及设置。
**AI代理**选项卡检测PC上安装的工具 - Cursor,Claude Desktop,Claude Code,Antigravity,Windsurf,VS Code(Copilot),Cline,Gemini CLI,Codex CLI,Copilot CLI,LM Studio,Kiro - 并允许一键连接。StepWind将其条目合并到工具的MCP配置中,使用生产级严格解析或拒绝(带有注释的配置永远不会被重写或静默剥离),时间戳备份,并在写入后进行验证,如果出现问题会自动恢复备份。断开连接时,只会删除我们的条目,而不会影响其他内容。
工具赋予代理*能力*;习惯是保护文件安全的关键。因此,在支持**代理技能**的工具(Cursor,Claude Code)上连接还会安装StepWind的技能 - 一个`SKILL.md`文件,教导AI在进行高风险编辑前进行检查,在编辑后对比`latest:`和`current:`,在出现问题时恢复,而不是猜测。其他支持技能的工具可以直接复制相同的技能。
## 从第一天就构建正确
- **基于内容的分块 + 重复数据删除**,因此即使对于大文件,历史记录也非常节省空间,并且相同的保存不会添加冗余版本。
- **崩溃安全、内容验证存储**(原子写入;每个块在读取时都会重新哈希;GC与捕获序列化,以防止正在进行的块被扫描和删除)。
- **静止加密**是一个实时切换(AES-256-GCM,密钥由Windows DPAPI在机器范围内密封 - 无需通行短语,盗窃/离线驱动器无法在其他地方读取)。随时切换:存储在后台重新编码,同时每个版本仍然可恢复,崩溃过程中暂停的迁移在下次启动时恢复,切换关闭时解密恢复相同。文件内容加密;名称和日期索引不加密。(不是设计用于隐藏此机器上其他管理员的数据。)
- **保留 + 清理**(分层类似于Time Machine),因此它永远不会占用您的磁盘。
- **捕获时断开连接**:在启动时(和添加文件夹时),StepWind会协调发生或出现的变化;USN包装/溢出检测会重新同步,而不是默默丢失更改;溢出时重新构建观察器并协调。
- **还原永远不会覆盖** - 恢复的版本位于当前工作旁边,而不是其上。
- **撤销操作受到保护** - 它拒绝将某些内容移动到现在已占用的路径。
- **恐慌热键** - Ctrl+Shift+Z从任何地方一键打开StepWind。
- **您的数据,您的控制** - 删除文件夹时,会询问是否保留或删除其保存的版本;设置中有删除所有、清理未保护、立即运行清理(均需先确认);保留窗口可编辑;时间线范围可限定为仅保护的文件夹。
- **排除** - 在保护的文件夹中排除任何子文件夹或路径(构建输出、数据集、缓存),在“保护的文件夹”→“排除”下;添加一个排除项时会提供清除已保存的版本。除了自动跳过外,还支持此功能。
- **智能排除** - 构建垃圾(`node_modules`、`target`...)、缓存和OneDrive在线文件(版本记录占位文件会强制下载整个文件)被跳过。文件在独占锁(例如打开的Outlook PST)下被捕获,当应用程序释放它们/下次协调时,StepWind不会强制快照。
- **诚实架构,用户授权**:提升的后台**服务**执行特权工作(日志 + ETW);托盘**GUI**以非提升权限运行,并通过本地ACL管道与其通信。服务根据发出请求的Windows用户授权每个私有或破坏性请求 - 在共享PC上,一个帐户无法读取、恢复或清除另一个帐户的历史记录,撤销句柄无法伪造成任意文件移动,清除所有历史记录需要管理员权限。
- **从不填满磁盘,从不静默失败** - 如果保存历史记录的驱动器空间不足,捕获会暂停(状态会显示),压缩旧版本以恢复空间,当有空间时恢复。不会像Windows文件历史记录那样悄悄停止保护您。
- **关闭失败,验证更新** - SYSTEM服务检查GitHub的新版本,只有在通过SHA-256校验和和受信任的Authenticode代码签名验证后才安装更新;缺少其中任何一个的版本都会被拒绝而不是静默运行。安装程序备份当前版本,如果新版本无法启动,则自动回滚,因此更新永远不会让您失去保护。(直到版本具有代码签名,自动静默安装保持禁用 - 默认安全。)
## 为此设计的UI
StepWind的界面在**WebView2中渲染网页** - 与最精致的桌面应用程序(VS Code,Discord,Linear,1Password)相同的架构,无需附带Chromium:Windows内置的Evergreen WebView2运行时负责渲染,因此安装程序保持精简,每个像素都由可审计的依赖项免费的网页层绘制,该层作为纯文件与exe一起提供。薄的.NET主机拥有网页平台无法实现的功能:无边框窗口、托盘图标、全局恐慌热键和**允许列表JSON桥**到服务(网页层只能调用显式列出的内容,设置补丁仅携带显式允许的键)。
设计本身是围绕产品核心思想构建的高级身份:**时间河流**。操作按时间线流动,按天分组,每个操作都有颜色编码的轨道(创建/更改/移动/重命名/删除)、等宽时钟、执行操作的应用程序和悬停时的一键撤销按钮。筛选芯片缩小时间线范围;范围切换仅限于保护的文件夹。**文件版本**是文件夹浏览器,带有导航面包屑和递归搜索,配有完整的版本历史记录 - 以及因为网页堆栈在这方面更好而实现的**内联统一差异查看器**:单击任何版本以查看与当前磁盘文件(或版本自己的内容,如果文件已消失)的确切更改。**命令调色板(Ctrl+K)**搜索每个命令和版本存储中的每个文件。视图淡入淡出,行内联展开,导航指示器滑动,对话框缩放,“保护激活”点有轻柔的心跳。
**浅色和深色主题,均正确实现**。每个表面、叠加层、阴影和文本强调色都是主题令牌,因此浅色主题与深色主题一样经过深思熟虑 - 而不是倒置的临时方案。在设置→外观中选择**系统**(跟随Windows并实时切换)、**浅色**或**深色**。
| 深色 | 浅色 |
|---|---|
| <img src="docs/screenshots/app.png" width="410"/> | <img src="docs/screenshots/app-light.png" width="410"/> |
| 文件版本(文件夹浏览器) | AI代理 | 保护的文件夹 | 设置 |
|---|---|---|---|
| <img src="docs/screenshots/files.png" width="205"/> | <img src="docs/screenshots/ai.png" width="205"/> | <img src="docs/screenshots/folders.png" width="205"/> | <img src="docs/screenshots/settings.png" width="205"/> |
## 架构
```
src/StepWind.Core/ 引擎:FastCDC分块器,内容寻址存储(+AES-GCM),
保留/垃圾回收,USN日志读取器,操作重建和
撤销,ETW归属,飞行记录仪,监视引擎,IPC,
统一差异引擎,MCP客户端自动配置器
src/StepWind.Service/ 提升的Windows服务:托管引擎 + 命名管道API
src/StepWind.App/ 非提升的托盘应用程序:无边框WebView2主机 + 允许列表JSON
桥接器;UI本身位于./web(依赖项免费的HTML/CSS/JS)
src/StepWind.Mcp/ 用于AI代理的MCP服务器(stdio):检查/差异/恢复
src/StepWind.Cli/ 诊断 + 真实硬件E2E测试
tests/ 确定性核心测试
```
## 验证
- **294个单元测试** - 分块器确定性和移位抵抗、存储重复数据删除/崩溃安全性/
完整性、加密往返和篡改拒绝、DPAPI密钥稳定性、实时加密
切换(混合存储读取、后台重新编码收敛双向、
中断迁移恢复、存储字节跟踪、IPC切换端到端)、USN
操作重建(通过父FRN增量重命名与移动;POSIX-unlink删除
在标记-重命名瞬间检测,具有延迟FileDelete重复和十六进制命名
的用户文件从不被错误分类)、版本级重复的相同保存、
启动协调(基准 + 捕捉 + 等幂)、GC与捕获交织完整性、
撤销安全性、保留层级 + 垃圾回收(以及可配置的保留与限制)、
文件夹移除(停止捕获、不重新生成、清除所有/未保护/文件夹/文件)、
排除(包括云占位符)、监视捕获、完整的IPC捕获→历史记录→还原往返、
统一差异引擎(针对参考LCS进行模糊测试;标头正确性;大型
复合编辑)、AI/MCP接口(检查→编辑→差异→恢复代理工作流、二进制/
溢出诚实、选择器错误)、MCP客户端自动配置器(合并保留
现有密钥、JSONC/损坏文件拒绝不变、TOML块手术、备份、
BOM保留)、**预删除捕获**(在安静窗口内创建+删除仍然留下
可恢复版本)、**每用户授权**(一个帐户无法读取/恢复/清除另一个
帐户的历史记录,伪造的撤销句柄被拒绝,机器范围的
清除需要管理员)、**关闭失败的更新程序**(缺少/不匹配的校验和被拒绝、
文件名匹配的校验和、未签名的设置永远不会启动)、以及**磁盘满**
保护(捕获暂停并在自由空间地板和存储配额周围恢复)、
**USN间隙检测**(包装/截断的日志重新同步大声而不是丢弃操作)、
**存储验证/修复** + 索引备份(损坏的版本被找到并隔离,好的版本保留)、
**加密恢复密钥**导出/导入(在OS重新安装后存活)、**批量撤销**(每项
结果,从不停止到一半)、**长路径**捕获、**重新同步策略**、
**并发IPC**线程安全性、**MCP网关允许列表**、**git分支/提交注释** +
启用** `.gitignore` 匹配器、**引导存储重新定位**(复制→验证→切换,从不
删除旧存储)和**索引(元数据)加密**(读取始终/写入条件,因此切换
永远不会使历史记录孤立)。
- **真实硬件E2E**(提升):一个脚本的创建/重命名/删除/移动操作是从
实时日志中重建的,移动被逆转(文件夹一键恢复),并且在覆盖+删除后
版本被字节精确地恢复 - 所有操作都通过生产类。删除的日志形状(裸
十六进制标记重命名;FileDelete延迟直到最后一个句柄关闭)是在真实
硬件上测量的,并且是检测器构建的依据。
- **实时演示**:实时服务启用加密(密钥密封,blob中没有明文),
时间线用实际事件填充,撤销操作正常,UI自动化驱动最近的文件 →
历史记录 → 还原(参见上面的截图)。
## 安装
从
[发布版本](https://github.com/pwnapplehat/StepWind/releases)下载 **StepWind-x.y.z-setup.exe**并运行。安装程序设置后台服务(自动启动),立即开始保护并启动托盘
应用程序(它与Windows一起启动)。StepWind检查更新并仅在通过其校验和+代码签名验证时应用更新,如果新版本启动失败,则自动回滚。卸载
从设置→应用程序像任何程序一样;您的版本历史记录保持完整。
Windows 10(1809+)或Windows 11,需要NTFS驱动器。
> **“Windows保护了您的PC”?** 对新未签名安装程序的预期反应 - 不是
> 恶意软件检测。单击 **更多信息 → 运行任何方式**。每个版本都附带
> `SHA256SUMS.txt`;使用`(Get-FileHash .\StepWind-x.y.z-setup.exe -Algorithm SHA256).Hash`和
> 比较验证您的下载。[安全.md](SECURITY.md)中规划了代码签名(移除此提示)- [SECURITY.md](SECURITY.md)。
## 安全
StepWind运行LocalSystem服务,因此其信任边界在
**[SECURITY.md](SECURITY.md)**中明确写入:谁可以读取/恢复/清除哪些历史记录
通过管道(服务根据连接的Windows用户授权每个请求),撤销句柄
无法伪造,加密内容和更新如何验证(校验和+Authenticode,失败-关闭 -
未签名的版本会暂存一个一键确认的安装而不是静默运行)。发现问题?
在
[安全咨询](https://github.com/pwnapplehat/StepWind/security/advisories/new)中提出。
## 构建
```powershell
dotnet build StepWind.slnx # 构建所有内容
dotnet test # 核心测试套件
./build/publish.ps1 # 自包含服务 + GUI + CLI + MCP服务器 → dist/
iscc installer\stepwind.iss # 构建setup .exe → installer/Output/
```
需要.NET 10 SDK(和Inno Setup 6用于安装程序)。## 许可证
[MIT](LICENSE) - © 2026 StepWind Contributors. 由 iOS\_hAT 制作。