2026-06-17 21:11:33 +08:00
|
|
|
|
# AI Code Diff Preview
|
|
|
|
|
|
|
2026-06-18 21:00:17 +08:00
|
|
|
|
类 Cursor 风格的 AI 代码差异预览 VSCode 插件 — Accept/Reject 审查变更。
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
2026-06-18 21:00:17 +08:00
|
|
|
|
## 使用方法
|
2026-06-18 19:53:36 +08:00
|
|
|
|
|
2026-06-18 21:00:17 +08:00
|
|
|
|
1. 安装 `.vsix` 并重启 VSCode
|
|
|
|
|
|
2. 将下面配置复制到项目 `.claude/settings.json`(或 `~/.claude/settings.json` 全局生效)
|
|
|
|
|
|
3. 用 Claude Code 编辑项目 → Stop 后自动弹出 QuickPick 变更列表 → VSCode 内置 Diff 逐文件审查
|
2026-06-19 14:04:25 +08:00
|
|
|
|

|
|
|
|
|
|
触发AI Diff后快捷键`Ctrl+Shift+D`打开`QuickPick`预览,一键 `接受/拒绝` 变更
|
|
|
|
|
|

|
|
|
|
|
|
进入单个`diff`界面可在状态栏右下角选择单个文件`接受/拒绝`
|
|
|
|
|
|

|
2026-06-18 19:53:36 +08:00
|
|
|
|
|
2026-06-18 21:00:17 +08:00
|
|
|
|
## Claude Code Hooks 必须配置
|
2026-06-18 19:53:36 +08:00
|
|
|
|
|
2026-06-18 21:00:17 +08:00
|
|
|
|
将以下内容写入 `.claude/settings.json`:
|
2026-06-18 19:53:36 +08:00
|
|
|
|
|
2026-06-19 14:04:25 +08:00
|
|
|
|

|
|
|
|
|
|
|
2026-06-18 19:53:36 +08:00
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"hooks": {
|
|
|
|
|
|
"PostToolUse": [
|
|
|
|
|
|
{
|
2026-06-18 21:00:17 +08:00
|
|
|
|
"matcher": "Write|Edit",
|
2026-06-18 19:53:36 +08:00
|
|
|
|
"hooks": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"type": "command",
|
2026-06-18 21:00:17 +08:00
|
|
|
|
"command": "node -e \"const fs=require('fs'),p=require('path'),d=p.join(process.env.CLAUDE_PLUGIN_ROOT||'.','.claude','hooks');let b='';process.stdin.on('data',c=>b+=c);process.stdin.on('end',()=>{try{const j=JSON.parse(b);const e={type:'edit',filePath:j.tool_input?.file_path||j.tool_response?.filePath||'',content:j.tool_input?.content||'',oldString:j.tool_input?.old_string||'',newString:j.tool_input?.new_string||'',timestamp:Date.now(),toolName:j.tool_name};fs.mkdirSync(d,{recursive:true});const t=p.join(d,'pending.json'),tmp=t+'.tmp';fs.writeFileSync(tmp,JSON.stringify(e));fs.renameSync(tmp,t)}catch{}})\"",
|
|
|
|
|
|
"timeout": 5
|
2026-06-18 19:53:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
],
|
|
|
|
|
|
"Stop": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"hooks": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"type": "command",
|
2026-06-18 21:00:17 +08:00
|
|
|
|
"command": "node -e \"const fs=require('fs'),p=require('path'),d=p.join(process.env.CLAUDE_PLUGIN_ROOT||'.','.claude','hooks');try{fs.mkdirSync(d,{recursive:true});const t=p.join(d,'pending.json'),tmp=t+'.tmp';fs.writeFileSync(tmp,JSON.stringify({type:'stop',filePath:'',content:'',oldString:'',newString:'',timestamp:Date.now(),toolName:'Stop'}));fs.renameSync(tmp,t)}catch{}\"",
|
|
|
|
|
|
"timeout": 5
|
2026-06-18 19:53:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-06-17 21:11:33 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-18 21:00:17 +08:00
|
|
|
|
## 命令
|
2026-06-18 19:37:21 +08:00
|
|
|
|
|
2026-06-19 14:04:25 +08:00
|
|
|
|
| 命令 | 快捷键 | 功能 |
|
|
|
|
|
|
| --------------------------------- | ---------------- | ---------------------------------------- |
|
2026-06-18 21:00:17 +08:00
|
|
|
|
| `AI Diff: 显示所有变更文件列表` | `Ctrl+Shift+D` | QuickPick 总览 + Accept All / Reject All |
|
2026-06-19 14:04:25 +08:00
|
|
|
|
| `AI Diff: 下一个变更` | `Alt+↓` | 跳转下一个 pending 文件 |
|
|
|
|
|
|
| `AI Diff: 上一个变更` | `Alt+↑` | 跳转上一个 pending 文件 |
|
|
|
|
|
|
| `AI Diff: 接受所有变更` | `Ctrl+Shift+A` | Accept All |
|
|
|
|
|
|
| `AI Diff: 拒绝所有变更` | `Ctrl+Shift+R` | Reject All |
|
2026-06-18 19:37:21 +08:00
|
|
|
|
|
2026-06-18 21:00:17 +08:00
|
|
|
|
Diff 编辑器打开后,状态栏右侧自动出现 **Accept / Reject / 接受全部** 按钮。
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
2026-06-18 19:37:21 +08:00
|
|
|
|
## 开发
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-06-18 21:00:17 +08:00
|
|
|
|
npm install
|
|
|
|
|
|
npm run build # 编译
|
|
|
|
|
|
npm run test # 测试
|
|
|
|
|
|
npm run package # 生成 ai-diff-preview-*.vsix
|
2026-06-18 19:37:21 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 许可证
|
2026-06-17 21:11:33 +08:00
|
|
|
|
|
2026-06-19 14:04:25 +08:00
|
|
|
|
MIT © 2026 [Gmaker689](https://github.com/Gmaker689)
|