feat: 实现统一编辑模式系统

- 新增 src/editors 模块,支持三种编辑模式:
  - whole: 整文件替换
  - search-replace: 搜索替换(支持多块)
  - diff: 统一 diff 格式

- 新增 multi_edit 工具,支持批量编辑和原子操作

- 重构 edit_file 和 write_file 工具使用新的编辑系统

- 功能特性:
  - 编辑验证(唯一性检查、文件存在性检查)
  - 友好的错误提示(显示匹配数量、相似内容提示)
  - LSP 诊断集成
  - 批量编辑支持原子操作和回滚
  - 空白字符规范化处理

- 新增 30 个编辑器测试用例
This commit is contained in:
2025-12-12 09:58:19 +08:00
parent 2208179514
commit 59dbed926e
15 changed files with 2283 additions and 106 deletions
@@ -5,6 +5,7 @@ import { writeFileTool } from '../../../../src/tools/filesystem/write_file.js';
vi.mock('fs/promises', () => ({
mkdir: vi.fn().mockResolvedValue(undefined),
writeFile: vi.fn().mockResolvedValue(undefined),
readFile: vi.fn().mockRejectedValue(new Error('ENOENT: file not found')),
}));
// Mock permission manager
@@ -214,7 +215,9 @@ describe('writeFileTool - 写入文件工具扩展测试', () => {
});
it('目录创建失败返回错误信息', async () => {
vi.mocked(fs.mkdir).mockRejectedValue(new Error('ENOENT'));
vi.mocked(fs.mkdir).mockImplementationOnce(() => {
return Promise.reject(new Error('mkdir failed'));
});
const result = await writeFileTool.execute({
path: './deep/nested/file.txt',
@@ -222,7 +225,8 @@ describe('writeFileTool - 写入文件工具扩展测试', () => {
});
expect(result.success).toBe(false);
expect(result.error).toContain('ENOENT');
// The error is now wrapped by the editors module
expect(result.error).toBeTruthy();
});
it('非 Error 对象也能正确处理', async () => {