文件恢复协议服务器

一个为Claude Code设计的检查点、快照和文件恢复的Model Context Protocol (MCP)服务器,支持完美快照、选择性恢复、bash安全网和诚实的磁盘管理。

  • by Vvkmnn
  • TypeScript
  • 本地部署
  • 6 星标
  • 更新于
在 GitHub 查看 Vvkmnn/claude-vigil-mcp

使用说明

克劳德·维格

一 模型上下文协议(MCP) 服务器 检查点、快照和文件恢复 在 克劳德代码完美的快照、选择性还原、bash安全网和诚实的磁盘管理。



每个AI编码工具都会跟踪通过自己的编辑器进行的文件编辑,但它们都不会跟踪外部进行的文件更改:bash命令(rm, mv, sed -i)、Python脚本、构建工具或修改编辑器API外部文件的任何进程。当这些更改出错时,没有什么可倒退的。Claude Code的内置 /rewind 有额外的差距——外部变化是看不见的(#6413, #10077),倒带是全有或全无,没有选择性的文件还原,只有时间戳,没有命名的检查点,以及可靠性错误(#21608, #18516).

安装

要求:

来自shell:

claude mcp add claude-vigil-mcp -- npx claude-vigil-mcp

从内部克劳德 (需要重新启动):

Add this to our global mcp config: npx claude-vigil-mcp

Install this mcp: https://github.com/Vvkmnn/claude-vigil-mcp

从任何手动配置 mcp.json:(光标、风帆等)

{
  "mcpServers": {
    "claude-vigil-mcp": {
      "command": "npx",
      "args": ["claude-vigil-mcp"],
      "env": {}
    }
  }
}

有 不 npm install 必需的 --没有外部数据库,没有索引,只有用于加密、压缩和文件系统的Node.js内置。

然而,如果 npx 解决错误的包,您可以使用以下命令强制解决:

npm install -g claude-vigil-mcp

技能

可选地,安装技能来教克劳德在危险工作之前何时主动检查:

npx skills add Vvkmnn/claude-vigil-mcp --skill claude-vigil --global
# Optional: add --yes to skip interactive prompt and install to all agents

这使得Claude在破坏性bash命令、风险重构或上下文压缩之前自动保存检查点。MCP在没有技能的情况下工作,但技能提高了可发现性。

插件

对于使用钩子和命令的自动检查点,请从安装 克劳德商场 市场:

/plugin marketplace add Vvkmnn/claude-emporium
/plugin install claude-vigil@claude-emporium

这 克劳德守夜 插件提供:

钩子 (背景,零延迟):

  • PreToolUse (Bash) -在执行破坏性命令之前自动快速保存(rm, mv, sed -i, git checkout, git reset)
  • PreCompact -上下文压缩前的自动检查点,均为手动(/compact)和自动
  • Stop -Claude完成包含文件编辑的响应后的自动检查点
  • PostToolUse (Write|Edit) -文件修改后的检查点
  • SessionEnd -会话终止时的最后机会检查点

命令: /checkpoint <save|list|diff|restore|delete>

需要先安装MCP服务器。请参阅商场了解其他Claude Code插件和MCP。

特性

5个工具。完美的快照。内容差异。通过文物保护进行安全恢复。

守夜_保存

为整个项目创建一个命名检查点。可选的 description 用于注释。如果插槽已满,Claude会询问用户是删除现有检查点还是增加容量。

🏺 ┏━ saved "before-refactor" ━━ 47 files · 4.2 MB ━━ vigil: 2/3 | quicksave: 8m ago | 4.2 MB
   ┗ skipped: node_modules, dist, .next

首次保存自动检测派生目录 .gitignore 并创建 .vigilignore:

🏺 ┏━ saved "v1.0" ━━ 47 files · 4.1 MB ━━ vigil: 1/3 | quicksave: none | 4.1 MB
   ┃ skipped: node_modules, dist, .next
   ┃ first save -- confirm these exclusions look correct
   ┗ edit .claude/vigil/.vigilignore to adjust

当插槽已满时:

🏺 ┏━ 3/3 full -- ask the user before proceeding ━━ vigil: 3/3 | quicksave: 2m ago | 8.7 MB
   ┃ v1.0 (2h ago) · before-refactor (45m ago) · experiment (5m ago)
   ┗ ASK the user: delete one with vigil_delete, or increase capacity with max_checkpoints?

守夜列表

浏览带有描述的检查点。随着 name:深入检查点的文件。随着 glob:按模式过滤文件。

🏺 ┏━ 2 checkpoints ━━ vigil: 2/3 | quicksave: 3m ago | 8.7 MB
   ┃ v1.0                2h ago    47 files
   ┃   Initial stable release
   ┃ before-refactor     45m ago   47 files
   ┃   Snapshot before risky auth changes
   ┗ ~quicksave          3m ago

使用glob过滤深入检查点:

vigil_list name="v1.0" glob="src/auth/**"
🏺 ┏━ v1.0 ━━ 3 of 47 files matching src/auth/** ━━ vigil: 2/3 | quicksave: 3m ago | 8.7 MB
   ┃ src/auth/index.ts
   ┃ src/auth/middleware.ts
   ┗ src/auth/types.ts

守夜_ off

搜索并调查代码库的以前版本。使用完整的统一差异将检查点与当前工作目录进行比较,将两个检查点相互比较,从任何检查点检索任何文件的内容,或在所有检查点中搜索字符串。

变更摘要:

vigil_diff name="before-refactor" summary=true
🏺 ┏━ 3 changes vs before-refactor ━━ vigil: 2/3 | quicksave: 3m ago | 8.7 MB
   ┃ modified  src/auth.ts (+8 -2)
   ┃ modified  src/middleware/validate.ts (+3 -1)
   ┗ added     src/services/oauth.ts

完全统一的差异:

vigil_diff name="before-refactor"
🏺 ┏━ 3 changes vs before-refactor ━━ vigil: 2/3 | quicksave: 3m ago | 8.7 MB
   ┃ modified  src/auth.ts (+8 -2)
   ┃ modified  src/middleware/validate.ts (+3 -1)
   ┗ added     src/services/oauth.ts

━━ src/auth.ts ━━
--- a/src/auth.ts
+++ b/src/auth.ts
@@ -12,6 +12,8 @@
 import { validateToken } from './utils';
-function authenticate(req: Request) {
+function authenticate(req: Request, options?: AuthOptions) {
+  if (options?.skipValidation) return true;
   const token = req.headers.authorization;

从检查点检索单个文件:

vigil_diff name="v1.0" file="src/auth.ts"
🏺 ━━ src/auth.ts from v1.0 ━━
import { validateToken } from './utils';
function authenticate(req: Request) {
  const token = req.headers.authorization;
  ...

━━ diff vs current ━━
--- a/src/auth.ts
+++ b/src/auth.ts
@@ -12,6 +12,8 @@
-function authenticate(req: Request) {
+function authenticate(req: Request, options?: AuthOptions) {

比较两个检查点:

vigil_diff name="v1.0" against="before-refactor"

显示两个检查点状态之间的统一差异——不涉及工作目录。

在所有检查点中搜索:

vigil_diff name="*" file="src/auth.ts" search="validateToken"
🏺 ┏━ "validateToken" in src/auth.ts ━━ 2 checkpoints ━━ vigil: 2/3 | quicksave: 3m ago | 8.7 MB
   ┃ v1.0 (2h ago)
   ┃   import { validateToken } from './utils';
   ┃ before-refactor (45m ago)
   ┗   import { validateToken } from './utils';

守夜商店

将项目还原到检查点状态。首先快速保存当前状态(使用撤消 vigil_restore name="~quicksave").替换的文件(包括自检查点以来修改的和新创建的文件)都保存在 .claude/vigil/artifacts/ 所以什么都不会丢失。对于单个文件还原,请使用 vigil_diff 要检索文件内容,请使用“编辑”应用。

vigil_restore name="v1.0"
🏺 ┏━ restored from "v1.0" ━━ 47 files ━━ vigil: 2/3 | quicksave: just now | 8.7 MB
   ┃ preserved 3 displaced files in .claude/vigil/artifacts/restored_v1.0_20260219_143022/
   ┃   modified: src/auth.ts (current version saved)
   ┃   modified: src/middleware/validate.ts (current version saved)
   ┃   new: src/services/oauth.ts (moved, not in checkpoint)
   ┃ review .claude/vigil/artifacts/restored_v1.0_20260219_143022/ -- delete when no longer needed
   ┃ previous state also quicksaved (use ~quicksave to undo)
   ┃ not restored (derived): node_modules, dist
   ┗ rebuild these before running the project

守夜_结束

删除检查点并回收磁盘空间。GC删除未引用的对象。使用 all=true 删除所有内容。

vigil_delete name="v1.0"
🏺 ━━ deleted v1.0 ━━ reclaimed 241 MB (3,412 objects) ━━ vigil: 1/3 | quicksave: 3m ago | 4.5 MB

方法论

如何 克劳德·维格 商店 检查点:

                    🏺 claude-vigil-mcp
                    ━━━━━━━━━━━━━━━━━━━

              Claude calls tool
                vigil_save
                    │
                    ▼
              ┌─────────────────┐
              │  spawn worker   │  <5ms, returns immediately
              │  (detached)     │
              └────────┬────────┘
                       │
            ┌──────────┴──────────┐
            │   background worker │
            │                     │
            │  ┌───────────────┐  │
            │  │ walk project  │  │  source files only (skips derived dirs)
            │  └───────┬───────┘  │
            │          │          │
            │  ┌───────▼───────┐  │
            │  │ hash (SHA-256)│  │  same content = same hash
            │  └───────┬───────┘  │
            │          │          │
            │  ┌───────▼───────┐  │
            │  │ gzip + store  │  │  dedup: skip if exists
            │  └───────┬───────┘  │
            │          │          │
            │  ┌───────▼───────┐  │
            │  │update manifest│  │  {path → hash} per checkpoint
            │  └───────────────┘  │
            └─────────────────────┘

     ┌─────────────────────────────────────────┐
     │  .claude/vigil/                         │
     │  ├── manifest.json    checkpoints + meta│
     │  ├── objects/                           │
     │  │   ├── ab/cdef01...gz   gzipped file  │
     │  │   ├── f3/981a02...gz   gzipped file  │
     │  │   └── ...              (deduped)     │
     │  └── artifacts/                         │
     │      └── restored_v1.0_20260219_.../    │
     │          ├── src/auth.ts   (modified)   │
     │          └── src/new.ts    (new file)   │
     └─────────────────────────────────────────┘

     3 named slots + 1 rotating quicksave
     Every response: "vigil: 2/3 | quicksave: 3m ago | 287 MB"


     RESTORE (only sync operation):

     vigil_restore("v1.0")
            │
            ├── quicksave current state (overwrite previous)
            │
            ├── preserve displaced files in artifacts/
            │   ├── modified files → copied to artifacts
            │   └── new files → moved to artifacts
            │
            ├── read manifest → get {path → hash}
            │
            ├── for each file: gunzip object → write to project
            │
            └── done: bit-identical working directory

储存: 内容可寻址存储(SHA-256+gzip)。跨检查点的相同文件=存储一次。包含二进制文件——恢复的检查点与原始检查点有点相同。

演出 后台工作人员通过 spawn(detached).MCP工具在<5ms内返回。工人独立运行。仅 vigil_restore 是同步的(必须在Claude继续之前写入文件)。

磁盘诚实度: 每个工具响应都显示 vigil: 2/3 | quicksave: 3m ago | 273 MB。没有隐藏成本。默认情况下有3个检查点插槽。 .vigilignore 用于排除不需要的路径。

文物保护: 还原时,将被覆盖或丢失(自检查点以来修改或新创建)的文件将保留在 .claude/vigil/artifacts/什么都不会被删除——你总是可以恢复被取代的工作。

                  v1.0        v1.1        v1.2      objects/
                  ━━━━        ━━━━        ━━━━      ━━━━━━━━━━━━━━━━

  src/index.ts    ab3f ══════ ab3f ══════ ab3f  →   ab/3f01a2...gz
  src/auth.ts     f981        e904 ══════ e904  →   f9/81b3c4...gz
                                                    e9/04f7a8...gz
  src/server.ts   2bc4 ══════ 2bc4 ══════ 2bc4  →   2b/c4d5e6...gz
  src/utils.ts    7de1 ══════ 7de1 ══════ 7de1  →   7d/e1f2a0...gz
  src/config.ts   4aa2 ══════ 4aa2        d71c  →   4a/a2b1c3...gz
                                                    d7/1c45e8...gz
                  ────        ────        ────
  new objects:    5           1           1     =   7 (not 15)

  ══════ same SHA-256 across checkpoints -- stored once, referenced many
  save v1.0       ██████████████████████████████████████████████████  100 new
  save v1.1       ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░████    8 new
  save v1.2       ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██    3 new
                  ──────────────────────────────────────────────────
                  111 objects store 300 file-versions     2.7× dedup

  delete v1.0     gc sweep → 62 orphans freed, 49 shared retained
                  ░░░░░░░░░░░░░░░░░░░░░░░░░               4.1× dedup

  ████ new object stored    ░░░░ deduped (hash exists, write skipped)

核心技术:

  • 内容寻址存储 (storeObject):SHA-256哈希→ existsSync 检查→ 跳过或gzip+write。相同的内容=相同的地址=自动数据删除。
  • 标记并清除GC (gcObjects):联盟引用了所有检查点的哈希值,删除孤儿,回收空间。
  • LCS统一差异 (generateUnifiedDiff):O(n×m)最长公共子序列,具有3行上下文块。
  • 交叉检查点搜索 (diffCheckpoint 搜索模式):迭代检查点→ 解析文件哈希→ 解压缩→ ±2上下文行扫描。
  • 背景快照 (worker.ts): spawn(detached) 随着 .in-progress 锁文件,<5ms返回克劳德。

磁盘使用情况: Vigil自动跳过派生目录(node_modules/, dist/, target/, venv/等)检测到 .gitignore 以及常见的模式。只有源文件被选中。

项目类型 原始大小 仅源 第一个快照 增量
Next.js应用程序 750 MB ~2 MB ~1 MB ~50 KB
Rust项目 2.5 GB ~5 MB ~3 MB ~100 KB
Python项目 350 MB ~3 MB ~2 MB ~50 KB

恢复后,衍生dirs的守夜报告存在但未恢复——克劳德重建了它们(npm install, cargo build等等)。编辑 .claude/vigil/.vigilignore 调整跳过的内容。

架构:

claude-vigil-mcp/
├── package.json
├── tsconfig.json
├── src/
│   ├── index.ts       # MCP server, 5 tools
│   ├── types.ts       # TypeScript interfaces and discriminated unions
│   ├── store.ts       # CAS: hash, store, read, gc, disk usage
│   ├── snapshot.ts    # create, restore, diff, list, delete
│   └── worker.ts      # background snapshot process
├── .claude/
│   └── skills/
│       └── claude-vigil/
│           └── SKILL.md   # optional skill for proactive checkpointing
└── test/
    └── index.test.ts  # 73 tests

设计原则:

  • 无git依赖 --纯Node.js内置(加密、zlib、fs)
  • 完美的快照 --捕获的每个文件,无大小/二进制过滤
  • CAS+gzip --比硬链接精简3.5倍,自动去重
  • 后台执行 --Claude从不阻止快照创建
  • 3标段限制 --保守的默认设置可防止存储失控
  • 无状态服务器 --每次调用都从磁盘读取清单,不会丢失内存中的状态
  • 文物保护 --恢复时保存的替换文件,从未丢失
  • 跨平台 --macOS、Linux、Windows。没有shell依赖关系

设计影响:

替代方案

每个现有的检查点工具——内置的或第三方的——只跟踪通过编辑器自己的API进行的文件编辑。当克劳德奔跑时 sed -iPython脚本会覆盖配置,或者构建工具会损坏输出,这些更改是不可见且不可恢复的。

特点 守夜 /倒退 倒退MCP 克劳德代码倒退 检查点应用程序 光标
跟踪外部更改 是(bash、脚本、构建) 否 否 否
命名检查点 是 否(时间戳) 是 是 否
内容差异 是(统一差异) 否 否 是(视觉) 否 否
跨检查点搜索 是 否 否 否
文物保护 是(没有丢失任何东西) N/A 否 否 不 否
除尘存储 CAS+gzip 无 未知 SQLite+差异 完整副本 每次编辑压缩
后台保存 是(返回时间<5ms) 屏蔽 屏蔽 屏蔽 Background 屏蔽
无头/程序化 是(MCP) 没有(#16976) 是(MCP) CLI 否 否
跨平台 Node.js 内置 Node.js Python 仅限macOS 内置
依赖项 0(内置节点) N/A Node.js Python+SQLite 桌面应用程序 N/A
磁盘可见性 每一个回应 隐藏 手动 手动 手工 隐藏

克劳德代码/倒带 --内置检查点系统。仅跟踪通过Claude自己的工具进行的文件编辑-- sed -i,构建脚本和外部进程是不可见的。没有命名检查点,没有内容差异,没有搜索。阻止会使会话暂停。尚未通过MCP提供(#16976).

倒带MCP --具有基于堆栈撤消功能的第三方MCP服务器。提供MCP访问,但不跟踪外部更改(bash、脚本、构建)。没有内容差异,没有跨检查点的搜索,没有数据消除存储。阻止保存。

克劳德码倒带 --基于Python的快照工具,具有SQLite元数据和可视化差异。需要Python+SQLite。不跟踪外部变化。没有跨检查点搜索,没有工件保存,没有背景保存。仅CLI(无MCP集成)。

检查点应用程序 --监控项目文件更改的macOS桌面应用程序。后台保存,但仅限于macOS,没有内容差异,没有搜索,没有MCP集成。存储每个检查点的完整副本(无数据消除),因此磁盘使用率呈线性增长。

光标检查点 --内置于Cursor中。在每次AI编辑之前压缩项目状态。没有命名检查点,没有内容差异,没有搜索,没有外部更改跟踪。隐藏在磁盘中,阻止保存,不可编程。

在确定内容可寻址存储之前,评估了三种实施方法:

  • 影子git仓库 (git --git-dir=.claude/vigil/.git --work-tree=.)--将git打包用于数据消除、差异和还原。6种故障模式:自跟踪递归、无限二进制膨胀、并发 index.lock 冲突、恢复时的叠加(不删除检查点后添加的文件), git clean 销毁项目文件,以及 GIT_DIR/GIT_WORK_TREE 来自父进程的env-var干扰。
  • 硬链接时间机器模式 --硬链接文件不变的目录树(每个文件成本为零)。macOS Time Machine进行了战斗测试,但1000个文件的20个检查点=20000个目录条目。CAS+gzip精简3.5倍,可免费跨检查点消除重复内容。
  • rsync--链接dest --同样的硬链接想法,大约30行。没有内置的差异功能,失去了统一的差异和跨检查点搜索 vigil_diff 有用的。

发展

git clone https://github.com/Vvkmnn/claude-vigil-mcp && cd claude-vigil-mcp
npm install && npm run build
npm test

脚本:

命令 描述
npm run build TypeScript编译(tsc && chmod +x dist/index.js)
npm run dev 观看模式(tsc --watch)
npm start 运行MCP服务器(node dist/index.js)
npm run clean 删除构建工件(rm -rf dist)
npm run lint ESLint代码质量检查
npm run lint:fix 自动修复掉毛问题
npm run format 预处理格式
npm run format:check 检查格式而不进行更改
npm run typecheck 无需发射的TypeScript验证
npm test 类型检查+棉绒
npm run prepublishOnly 预发布验证(构建+lint+格式检查)

预提交钩子通过 哈士奇 跑 lint-staged (更漂亮+eslint)上演 .ts 文件夹。

贡献:

  • 分叉存储库并创建功能分支
  • 遵循TypeScript严格模式 MCP协议 标准

从示例中学习:

许可证

麻省理工学院


克劳迪斯宣布成为皇帝 通过 查尔斯·勒贝勒 (1886).克劳迪斯将Vigiles Urbani从消防员扩展到罗马的守夜人——他们在城市巡逻,维护秩序,并确保没有任何东西在黑暗中丢失。