feat: 初始化 AI Code Diff Preview 插件项目

- 核心架构搭建:四层架构设计(触发层、隔离层、Diff引擎、UI层)
- 快照管理器:管理 Base/Suggest 双版本,隔离 AI 生成代码
- Diff 引擎:基于 Myers 算法计算差异,生成变更块
- 内联装饰器:红绿高亮显示删除/新增行
- CodeLens 提供器:提供 Accept/Reject 按钮
- 事务处理:Accept/Reject 原子化操作
- Claude Hooks 集成:支持 after_code_edit/after_write_file 事件
- 状态栏显示:实时显示变更状态
- 基础测试用例:7 个测试全部通过

技术栈:TypeScript + VSCode Extension API + diff 库 + esbuild
This commit is contained in:
2026-06-17 21:11:33 +08:00
commit 3168e81aa6
21 changed files with 6912 additions and 0 deletions
+108
View File
@@ -0,0 +1,108 @@
# AI Code Diff Preview
类 Cursor 的 AI 代码差异预览 VSCode 插件,支持 Accept/Reject 操作。
## 功能特性
- ✅ **临时变更隔离** - AI 生成的代码不直接覆盖文件
- ✅ **实时 Diff 预览** - 红绿高亮显示删除/新增内容
- ✅ **逐行 Accept/Reject** - 支持单块、整块操作
- ✅ **冲突检测** - 自动检测用户手动修改导致的冲突
- ✅ **Claude Hooks 集成** - 自动触发 Diff 预览
- ✅ **状态栏显示** - 实时显示变更状态
## 安装
```bash
# 克隆项目
git clone https://github.com/your-username/ai-diff-preview.git
# 安装依赖
cd ai-diff-preview
npm install
# 编译
npm run build
# 打包
npm run package
```
## 使用方法
### 1. 配置 Claude Hooks
在 Claude 配置文件中添加 Hook:
```json
{
"hooks": {
"after_code_edit": {
"command": "code",
"args": ["--command", "aiDiffPreview.handleHook"]
}
}
}
```
### 2. 快捷键
| 快捷键 | 功能 |
|--------|------|
| `Tab` / `Enter` | 接受当前块 |
| `Esc` | 拒绝所有变更 |
| `Ctrl+Shift+A` | Accept All |
| `Ctrl+Shift+R` | Reject All |
### 3. CodeLens 按钮
在代码上方会出现 Accept/Reject 按钮,点击即可操作。
## 开发
```bash
# 监听模式
npm run watch
# 运行测试
npm run test
# 代码检查
npm run lint
```
## 项目结构
```
src/
├── extension.ts # 插件入口
├── trigger/
│ └── hookHandler.ts # Claude Hook 处理器
├── snapshot/
│ └── snapshotManager.ts # 快照管理器
├── diff/
│ └── diffEngine.ts # Diff 计算引擎
├── render/
│ ├── inlineDecorator.ts # 内联装饰器
│ ├── codeLensProvider.ts # CodeLens 提供器
│ └── statusBar.ts # 状态栏
├── transaction/
│ ├── acceptHandler.ts # Accept 处理器
│ └── rejectHandler.ts # Reject 处理器
└── models/
├── types.ts # 类型定义
└── constants.ts # 常量定义
```
## 配置项
| 配置项 | 类型 | 默认值 | 说明 |
|--------|------|--------|------|
| `aiDiffPreview.enableAutoTrigger` | boolean | true | 启用自动触发 |
| `aiDiffPreview.showInlineButtons` | boolean | true | 显示内联按钮 |
| `aiDiffPreview.autoLint` | boolean | true | 自动运行 Lint |
| `aiDiffPreview.maxFileSize` | number | 100000 | 最大文件大小 |
## License
MIT