使用说明
克劳德·维格
一 模型上下文协议(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依赖关系
设计影响:
- 内容寻址存储 --相同内容=相同地址,自动重复数据删除
- 标记并清扫垃圾收集 --CAS清除的参考计数替代方案
- 最长公共子序列 --统一差分生成的基础
- Git对象模型 --哈希分片存储的灵感(Viking使用SHA-256+gzip而不是git的SHA-1+zlib)
替代方案
每个现有的检查点工具——内置的或第三方的——只跟踪通过编辑器自己的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协议 标准
从示例中学习:
- 官方MCP服务器 供参考实现
- TypeScript SDK 最佳实践
- 创建Node.js模块 用于npm包开发
许可证
克劳迪斯宣布成为皇帝 通过 查尔斯·勒贝勒 (1886).克劳迪斯将Vigiles Urbani从消防员扩展到罗马的守夜人——他们在城市巡逻,维护秩序,并确保没有任何东西在黑暗中丢失。