2026-06-17 21:11:33 +08:00
|
|
|
|
# AI Code Diff Preview
|
|
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
> 类 Cursor 的 AI 代码差异预览 VSCode 插件
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
[](https://github.com/YonHaoGuo/ai-diff-preview/blob/master/CHANGELOG.md)
|
|
|
|
|
|
[](https://code.visualstudio.com/)
|
|
|
|
|
|
[](LICENSE)
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
AI Code Diff Preview 为 VSCode 注入 Cursor 风格的 Accept/Reject 差异审查体验。AI 对话中的每一次代码编辑自动收集,对话结束后弹出完整的变更文件列表。点击任意文件即可在 **VSCode 内置 Diff 编辑器**中逐文件审查,状态栏实时显示 Accept/Reject 按钮,操作完成后自动推进到下一个待处理文件。
|
2026-06-18 08:05:24 +08:00
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
## 特性
|
2026-06-18 08:05:24 +08:00
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
- **VSCode 原生 Diff 编辑器** — 使用 `vscode.diff` 命令,100% 原生交互体验,无自定义 Webview
|
|
|
|
|
|
- **EditRecord 独立追踪** — 每次 `Edit`/`Write` 操作作为独立编辑记录,支持逐次编辑 Accept/Reject
|
|
|
|
|
|
- **QuickPick 总览** — 对话结束后弹出原生文件列表,含 Accept All / Reject All 一键操作
|
|
|
|
|
|
- **智能 Auto-Advance** — Accept/Reject 后自动推进到下一个待处理文件,同文件多编辑自动停留
|
|
|
|
|
|
- **状态栏常驻** — 插件激活后状态栏始终可见 `$(diff) AI Diff`,有变更时黄底高亮
|
|
|
|
|
|
- **零保存提示** — Diff 编辑器使用临时文件,关闭时自动删除,不会弹出"是否保存"对话框
|
|
|
|
|
|
- **多轮对话追踪** — 支持同一轮对话中对同文件的多次编辑合并、跨轮对话的独立追踪
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
|
|
|
|
|
## 安装
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-18 19:37:21 +08:00
|
|
|
|
# 克隆仓库
|
|
|
|
|
|
git clone https://github.com/YonHaoGuo/ai-diff-preview.git
|
2026-06-17 21:11:33 +08:00
|
|
|
|
cd ai-diff-preview
|
2026-06-18 19:37:21 +08:00
|
|
|
|
|
|
|
|
|
|
# 安装依赖
|
2026-06-17 21:11:33 +08:00
|
|
|
|
npm install
|
2026-06-18 19:37:21 +08:00
|
|
|
|
|
|
|
|
|
|
# 编译
|
2026-06-17 21:11:33 +08:00
|
|
|
|
npm run build
|
2026-06-18 19:37:21 +08:00
|
|
|
|
|
|
|
|
|
|
# 打包 vsix
|
|
|
|
|
|
npm run package
|
2026-06-17 21:11:33 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
或通过 VSCode 扩展市场安装(即将发布)。
|
|
|
|
|
|
|
2026-06-17 21:11:33 +08:00
|
|
|
|
## 使用方法
|
|
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
### 工作流程
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
```
|
|
|
|
|
|
┌─────────────────────────────────────────────────────────┐
|
|
|
|
|
|
│ AI 对话中(Claude Code / Cursor / Copilot) │
|
|
|
|
|
|
│ │
|
|
|
|
|
|
│ Edit/Write 工具调用 → .claude/hooks/pending.json │
|
|
|
|
|
|
│ → 插件自动收集变更 (静默) │
|
|
|
|
|
|
│ │
|
|
|
|
|
|
│ Stop/对话结束 → QuickPick 总览弹窗 │
|
|
|
|
|
|
│ ┌──────────────────────────────────────┐ │
|
|
|
|
|
|
│ │ AI Diff 总览 — 3 文件 5 编辑 │ │
|
|
|
|
|
|
│ │ │ │
|
|
|
|
|
|
│ │ 📄 src/utils.ts +3 -2 · 2次编辑 │ │
|
|
|
|
|
|
│ │ 📄 src/index.ts +9 -1 · 2次编辑 │ │
|
|
|
|
|
|
│ │ 📄 src/types.ts +5 -0 · 1次编辑 │ │
|
|
|
|
|
|
│ │ ──────────────────────────────── │ │
|
|
|
|
|
|
│ │ ✅ Accept All ❌ Reject All │ │
|
|
|
|
|
|
│ └──────────────────────────────────────┘ │
|
|
|
|
|
|
│ ↓ 点击文件 │
|
|
|
|
|
|
│ ┌──────────────────────────────────────┐ │
|
|
|
|
|
|
│ │ VSCode 内置 Diff 编辑器 │ │
|
|
|
|
|
|
│ │ ┌──── 原始代码 ──┬── 变更后 ────┐ │ │
|
|
|
|
|
|
│ │ │ ... │ ... │ │ │
|
|
|
|
|
|
│ │ └───────────────┴──────────────┘ │ │
|
|
|
|
|
|
│ │ │ │
|
|
|
|
|
|
│ │ 状态栏: [✓ Accept] [✗ Reject] │ │
|
|
|
|
|
|
│ │ [✓✓ 接受此文件全部] │ │
|
|
|
|
|
|
│ └──────────────────────────────────────┘ │
|
|
|
|
|
|
│ ↓ Accept/Reject │
|
|
|
|
|
|
│ → 自动推进到下一个文件/同文件剩余编辑 │
|
|
|
|
|
|
│ → 全部完成: 🎉 通知 │
|
|
|
|
|
|
└─────────────────────────────────────────────────────────┘
|
|
|
|
|
|
```
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
### 快捷键
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
| 快捷键 | 条件 | 功能 |
|
|
|
|
|
|
| ---------------- | -------------------------- | ----------------------- |
|
|
|
|
|
|
| `Alt+↓` | `aiDiffPreview.isActive` | 下一个变更文件 |
|
|
|
|
|
|
| `Alt+↑` | `aiDiffPreview.isActive` | 上一个变更文件 |
|
|
|
|
|
|
| `Ctrl+Shift+D` | `aiDiffPreview.isActive` | 显示 QuickPick 文件列表 |
|
|
|
|
|
|
| `Ctrl+Shift+F` | `aiDiffPreview.isActive` | 查看当前文件 Diff |
|
|
|
|
|
|
| `Ctrl+Shift+A` | `aiDiffPreview.isActive` | Accept All |
|
|
|
|
|
|
| `Ctrl+Shift+R` | `aiDiffPreview.isActive` | Reject All |
|
|
|
|
|
|
|
|
|
|
|
|
### 命令
|
|
|
|
|
|
|
|
|
|
|
|
| 命令 ID | 标题 |
|
|
|
|
|
|
| ------------------------------------- | ----------------------------- |
|
|
|
|
|
|
| `aiDiffPreview.showDiffPanel` | AI Diff: 显示所有变更文件列表 |
|
|
|
|
|
|
| `aiDiffPreview.showCurrentFileDiff` | AI Diff: 查看当前文件 Diff |
|
|
|
|
|
|
| `aiDiffPreview.acceptCurrentEdit` | AI Diff: 接受当前编辑 |
|
|
|
|
|
|
| `aiDiffPreview.rejectCurrentEdit` | AI Diff: 拒绝当前编辑 |
|
|
|
|
|
|
| `aiDiffPreview.acceptAll` | AI Diff: 接受所有变更 |
|
|
|
|
|
|
| `aiDiffPreview.rejectAll` | AI Diff: 拒绝所有变更 |
|
|
|
|
|
|
| `aiDiffPreview.nextDiff` | AI Diff: 下一个变更 |
|
|
|
|
|
|
| `aiDiffPreview.prevDiff` | AI Diff: 上一个变更 |
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
### 配置项
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
| 配置项 | 类型 | 默认值 | 说明 |
|
|
|
|
|
|
| ------------------------------------- | ------- | --------------- | ------------------------------------------------ |
|
|
|
|
|
|
| `aiDiffPreview.enableAutoTrigger` | boolean | `true` | 启用自动触发(监听 pending.json) |
|
|
|
|
|
|
| `aiDiffPreview.autoShowDiffPerEdit` | boolean | `false` | 每次 Edit/Write 后自动弹出 Diff |
|
|
|
|
|
|
| `aiDiffPreview.showAllDiffsOnStop` | boolean | `true` | Stop 后自动弹出 QuickPick 总览 |
|
|
|
|
|
|
| `aiDiffPreview.floatingLabelMode` | string | `"statusBar"` | 浮动标签位置(statusBar / inline / both / none) |
|
|
|
|
|
|
| `aiDiffPreview.maxFileSize` | number | `100000` | 最大处理文件大小(字符数) |
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
|
|
|
|
|
## 项目结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
src/
|
|
|
|
|
|
├── extension.ts # 插件入口
|
|
|
|
|
|
├── trigger/
|
2026-06-18 19:37:21 +08:00
|
|
|
|
│ └── hookHandler.ts # Hook 处理器 + QuickPick 总览
|
2026-06-17 21:11:33 +08:00
|
|
|
|
├── snapshot/
|
2026-06-18 08:05:24 +08:00
|
|
|
|
│ └── snapshotManager.ts # 变更集管理器 (ChangeSetManager)
|
2026-06-17 21:11:33 +08:00
|
|
|
|
├── diff/
|
|
|
|
|
|
│ └── diffEngine.ts # Diff 计算引擎
|
|
|
|
|
|
├── render/
|
2026-06-18 19:37:21 +08:00
|
|
|
|
│ ├── diffViewer.ts # VSCode 内置 Diff 查看器 + 自动推进
|
|
|
|
|
|
│ ├── reviewPanel.ts # Webview 面板 (实验性/备用)
|
|
|
|
|
|
│ ├── inlineDecorator.ts # 内联装饰器 (备用)
|
|
|
|
|
|
│ ├── codeLensProvider.ts # CodeLens 提供器 (备用)
|
|
|
|
|
|
│ └── statusBar.ts # 状态栏管理器 (常驻 + Diff 模式)
|
2026-06-17 21:11:33 +08:00
|
|
|
|
├── transaction/
|
2026-06-18 19:37:21 +08:00
|
|
|
|
│ ├── acceptHandler.ts # Accept 处理器 (旧版)
|
|
|
|
|
|
│ └── rejectHandler.ts # Reject 处理器 (旧版)
|
|
|
|
|
|
├── models/
|
|
|
|
|
|
│ ├── types.ts # 类型定义
|
|
|
|
|
|
│ └── constants.ts # 常量定义
|
|
|
|
|
|
└── __tests__/
|
|
|
|
|
|
├── diffEngine.test.ts # Diff 引擎测试
|
|
|
|
|
|
└── changeSetManager.test.ts # 变更集管理器回归测试
|
2026-06-17 21:11:33 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
## 开发
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npm run watch # esbuild 监听模式 + sourcemap
|
|
|
|
|
|
npm run build # 生产构建 (minify)
|
|
|
|
|
|
npm run test # 运行测试 (13 tests)
|
|
|
|
|
|
npm run test:watch # 测试监听模式
|
|
|
|
|
|
npm run lint # ESLint
|
|
|
|
|
|
npm run package # vsce package → .vsix
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 技术栈
|
|
|
|
|
|
|
|
|
|
|
|
| 领域 | 选型 |
|
|
|
|
|
|
| --------- | -------------------- |
|
|
|
|
|
|
| 框架 | VSCode Extension API |
|
|
|
|
|
|
| 语言 | TypeScript (ES2022) |
|
|
|
|
|
|
| Diff 算法 | `diff` (Myers) |
|
|
|
|
|
|
| 绑定 | esbuild |
|
|
|
|
|
|
| 测试 | Vitest |
|
|
|
|
|
|
| 规范 | ESLint + Prettier |
|
|
|
|
|
|
|
|
|
|
|
|
## 许可证
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
MIT © 2026 [Gmaker689](https://github.com/Gmaker689)
|