tianxincode 1.0.26 → 1.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,198 +1 @@
1
- # txcode
2
-
3
- AI Coding Assistant - 一个强大的 AI 编程助手命令行工具。
4
-
5
- ## 安装
6
-
7
- ### 全局安装(推荐)
8
-
9
- ```bash
10
- npm install -g tianxincode
11
- ```
12
-
13
- 安装完成后,您可以在任何目录下使用 `txcode` 命令。
14
-
15
-
16
- ## 快速开始
17
-
18
- 安装完成后,直接在终端中运行:
19
-
20
- ```bash
21
- txcode web
22
- ```
23
-
24
- 访问http://localhost:4000 页面 设置里配置模型提供商和模型,然后可以web端交互,也可以ctrl+c 关闭后启动命令行方式
25
- ![配置提供商和模型](https://github.com/joinz2015-boop/txcode/blob/2102880c0cbcaad909aae7f0a00b069538b00189/doc/001.png)
26
-
27
- ```bash
28
- txcode
29
- ```
30
-
31
- ## 基本用法
32
-
33
- ### 操作文档
34
-
35
- [https://joinz2015-boop.github.io/txcode/getting-started/index.html](https://joinz2015-boop.github.io/txcode/getting-started/index.html)
36
-
37
- ### 启动交互模式(默认)
38
-
39
- ```bash
40
- txcode
41
- ```
42
-
43
- ### 启动 Web 界面
44
-
45
- ```bash
46
- txcode web
47
- ```
48
-
49
- ### 指定 Web 服务端口
50
-
51
- ```bash
52
- txcode web --port 40001
53
- ```
54
-
55
- ### 获取帮助(在交互模式中)
56
-
57
- 启动交互模式后,输入 `/help` 查看可用命令。
58
-
59
- ## 功能特性
60
-
61
- - **交互式命令行界面**:直接在终端中与 AI 助手对话
62
- - **代码智能分析**:支持代码搜索、文件操作、Git 集成等功能
63
- - **项目记忆管理**:自动记录项目关键信息,快速定位代码
64
- - **多工具支持**:内置文件操作、代码搜索、网络搜索等工具
65
- - **Web 界面**:提供图形化操作界面(可选)
66
-
67
- ## 使用示例
68
-
69
- ### 1. 启动交互模式
70
-
71
- ```bash
72
- # 启动交互式命令行界面
73
- txcode
74
-
75
- # 启动后,您可以输入自然语言指令,例如:
76
- > 搜索所有包含 "function" 的 TypeScript 文件
77
- > 读取 src/index.ts 文件
78
- > 查看当前 Git 状态
79
- ```
80
-
81
- ### 2. 使用 Web 界面
82
-
83
- ```bash
84
- # 启动 Web 服务(默认端口 40000)
85
- txcode web
86
-
87
- # 指定端口启动
88
- txcode web --port 40001
89
- ```
90
-
91
- ### 3. 交互式命令
92
-
93
- 在交互模式中,可以使用以下命令:
94
-
95
- ```
96
- /help - 显示帮助信息
97
- /new [标题] - 创建新会话
98
- /sessions - 列出所有会话
99
- /switch <ID> - 切换到指定会话
100
- /models - 列出可用模型
101
- /model <ID> - 切换模型
102
- /skills - 列出可用技能
103
- /use <技能名> - 使用特定技能
104
- /token - 显示 Token 使用统计
105
- /exit - 退出程序
106
- ```
107
-
108
- ### 4. 常见任务示例
109
-
110
- ```
111
- # 代码搜索和分析
112
- > 查找所有使用 useState 的 React 组件
113
- > 分析项目的目录结构
114
- > 搜索包含特定错误信息的文件
115
-
116
- # 文件操作
117
- > 创建新的组件文件
118
- > 修改现有代码
119
- > 批量重命名文件
120
-
121
- # Git 操作
122
- > 查看最近的提交
123
- > 创建新的分支
124
- > 提交当前更改
125
- ```
126
-
127
- ## 配置说明
128
-
129
- ### 环境变量
130
-
131
- 工具支持以下环境变量:
132
-
133
- - `OPENAI_API_KEY`:OpenAI API 密钥(必需)
134
- - `TXCODE_WORKSPACE`:工作空间目录路径(可选)
135
-
136
- ### 配置文件
137
-
138
- 工具会在工作目录下创建 `.txcode` 文件夹,用于存储:
139
- - 项目记忆文件
140
- - 会话历史
141
- - 配置文件
142
-
143
- ## 项目结构
144
-
145
- ```
146
- ├── src/ # 源代码目录
147
- │ ├── index.ts # 主入口文件
148
- │ ├── modules/ # 功能模块
149
- │ └── types/ # 类型定义
150
- ├── dist/ # 构建输出目录
151
- ├── tests/ # 测试文件
152
- └── package.json # 项目配置
153
- ```
154
-
155
- ## 开发说明
156
-
157
- > **注意**:以下内容主要面向开发者,普通用户无需关注。
158
-
159
- ### 开发环境设置
160
-
161
- ```bash
162
- # 克隆项目
163
- git clone <repository-url>
164
- cd txcode
165
-
166
- # 安装依赖
167
- npm install
168
-
169
- # 开发模式运行
170
- npm run dev
171
-
172
- # 构建项目
173
- npm run build
174
- ```
175
-
176
- ### 运行测试
177
-
178
- ```bash
179
- # 运行测试
180
- npm test
181
-
182
- # 运行测试并生成覆盖率报告
183
- npm run test:coverage
184
- ```
185
-
186
- ### 发布新版本
187
-
188
- ```bash
189
- # 更新版本号
190
- npm version patch # 或 minor, major
191
-
192
- # 发布到 npm
193
- npm publish
194
- ```
195
-
196
- ## 许可证
197
-
198
- ISC
1
+ # Test overwrite
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { Box, Text } from 'ink';
3
- const VERSION = '1.0.26';
3
+ const VERSION = '1.0.27';
4
4
  export const Header = React.memo(function Header() {
5
5
  return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 2, paddingY: 1 },
6
6
  React.createElement(Text, { bold: true, cyan: true }, " "),
@@ -1 +1 @@
1
- {"version":3,"file":"edit_file.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/provider/edit_file.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAA2B,MAAM,kBAAkB,CAAA;AAKhE,eAAO,MAAM,YAAY,EAAE,IAoG1B,CAAA"}
1
+ {"version":3,"file":"edit_file.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/provider/edit_file.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAA2B,MAAM,kBAAkB,CAAA;AA8chE,eAAO,MAAM,YAAY,EAAE,IAuH1B,CAAA"}
@@ -1,8 +1,393 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { fileURLToPath } from 'url';
4
+ import { createTwoFilesPatch, diffLines } from 'diff';
4
5
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
6
  const edit_file_description = fs.readFileSync(path.join(__dirname, 'edit_file.txt'), 'utf-8');
7
+ const SINGLE_CANDIDATE_SIMILARITY_THRESHOLD = 0.0;
8
+ const MULTIPLE_CANDIDATES_SIMILARITY_THRESHOLD = 0.3;
9
+ function levenshtein(a, b) {
10
+ if (a === '' || b === '') {
11
+ return Math.max(a.length, b.length);
12
+ }
13
+ const matrix = Array.from({ length: a.length + 1 }, (_, i) => Array.from({ length: b.length + 1 }, (_, j) => (i === 0 ? j : j === 0 ? i : 0)));
14
+ for (let i = 1; i <= a.length; i++) {
15
+ for (let j = 1; j <= b.length; j++) {
16
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
17
+ matrix[i][j] = Math.min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + cost);
18
+ }
19
+ }
20
+ return matrix[a.length][b.length];
21
+ }
22
+ const SimpleReplacer = function* (_content, find) {
23
+ yield find;
24
+ };
25
+ const LineTrimmedReplacer = function* (content, find) {
26
+ const originalLines = content.split('\n');
27
+ const searchLines = find.split('\n');
28
+ if (searchLines[searchLines.length - 1] === '') {
29
+ searchLines.pop();
30
+ }
31
+ for (let i = 0; i <= originalLines.length - searchLines.length; i++) {
32
+ let matches = true;
33
+ for (let j = 0; j < searchLines.length; j++) {
34
+ const originalTrimmed = originalLines[i + j].trim();
35
+ const searchTrimmed = searchLines[j].trim();
36
+ if (originalTrimmed !== searchTrimmed) {
37
+ matches = false;
38
+ break;
39
+ }
40
+ }
41
+ if (matches) {
42
+ let matchStartIndex = 0;
43
+ for (let k = 0; k < i; k++) {
44
+ matchStartIndex += originalLines[k].length + 1;
45
+ }
46
+ let matchEndIndex = matchStartIndex;
47
+ for (let k = 0; k < searchLines.length; k++) {
48
+ matchEndIndex += originalLines[i + k].length;
49
+ if (k < searchLines.length - 1) {
50
+ matchEndIndex += 1;
51
+ }
52
+ }
53
+ yield content.substring(matchStartIndex, matchEndIndex);
54
+ }
55
+ }
56
+ };
57
+ const BlockAnchorReplacer = function* (content, find) {
58
+ const originalLines = content.split('\n');
59
+ const searchLines = find.split('\n');
60
+ if (searchLines.length < 3) {
61
+ return;
62
+ }
63
+ if (searchLines[searchLines.length - 1] === '') {
64
+ searchLines.pop();
65
+ }
66
+ const firstLineSearch = searchLines[0].trim();
67
+ const lastLineSearch = searchLines[searchLines.length - 1].trim();
68
+ const searchBlockSize = searchLines.length;
69
+ const candidates = [];
70
+ for (let i = 0; i < originalLines.length; i++) {
71
+ if (originalLines[i].trim() !== firstLineSearch) {
72
+ continue;
73
+ }
74
+ for (let j = i + 2; j < originalLines.length; j++) {
75
+ if (originalLines[j].trim() === lastLineSearch) {
76
+ candidates.push({ startLine: i, endLine: j });
77
+ break;
78
+ }
79
+ }
80
+ }
81
+ if (candidates.length === 0) {
82
+ return;
83
+ }
84
+ if (candidates.length === 1) {
85
+ const { startLine, endLine } = candidates[0];
86
+ const actualBlockSize = endLine - startLine + 1;
87
+ let similarity = 0;
88
+ let linesToCheck = Math.min(searchBlockSize - 2, actualBlockSize - 2);
89
+ if (linesToCheck > 0) {
90
+ for (let j = 1; j < searchBlockSize - 1 && j < actualBlockSize - 1; j++) {
91
+ const originalLine = originalLines[startLine + j].trim();
92
+ const searchLine = searchLines[j].trim();
93
+ const maxLen = Math.max(originalLine.length, searchLine.length);
94
+ if (maxLen === 0) {
95
+ continue;
96
+ }
97
+ const distance = levenshtein(originalLine, searchLine);
98
+ similarity += (1 - distance / maxLen) / linesToCheck;
99
+ if (similarity >= SINGLE_CANDIDATE_SIMILARITY_THRESHOLD) {
100
+ break;
101
+ }
102
+ }
103
+ }
104
+ else {
105
+ similarity = 1.0;
106
+ }
107
+ if (similarity >= SINGLE_CANDIDATE_SIMILARITY_THRESHOLD) {
108
+ let matchStartIndex = 0;
109
+ for (let k = 0; k < startLine; k++) {
110
+ matchStartIndex += originalLines[k].length + 1;
111
+ }
112
+ let matchEndIndex = matchStartIndex;
113
+ for (let k = startLine; k <= endLine; k++) {
114
+ matchEndIndex += originalLines[k].length;
115
+ if (k < endLine) {
116
+ matchEndIndex += 1;
117
+ }
118
+ }
119
+ yield content.substring(matchStartIndex, matchEndIndex);
120
+ }
121
+ return;
122
+ }
123
+ let bestMatch = null;
124
+ let maxSimilarity = -1;
125
+ for (const candidate of candidates) {
126
+ const { startLine, endLine } = candidate;
127
+ const actualBlockSize = endLine - startLine + 1;
128
+ let similarity = 0;
129
+ let linesToCheck = Math.min(searchBlockSize - 2, actualBlockSize - 2);
130
+ if (linesToCheck > 0) {
131
+ for (let j = 1; j < searchBlockSize - 1 && j < actualBlockSize - 1; j++) {
132
+ const originalLine = originalLines[startLine + j].trim();
133
+ const searchLine = searchLines[j].trim();
134
+ const maxLen = Math.max(originalLine.length, searchLine.length);
135
+ if (maxLen === 0) {
136
+ continue;
137
+ }
138
+ const distance = levenshtein(originalLine, searchLine);
139
+ similarity += 1 - distance / maxLen;
140
+ }
141
+ similarity /= linesToCheck;
142
+ }
143
+ else {
144
+ similarity = 1.0;
145
+ }
146
+ if (similarity > maxSimilarity) {
147
+ maxSimilarity = similarity;
148
+ bestMatch = candidate;
149
+ }
150
+ }
151
+ if (maxSimilarity >= MULTIPLE_CANDIDATES_SIMILARITY_THRESHOLD && bestMatch) {
152
+ const { startLine, endLine } = bestMatch;
153
+ let matchStartIndex = 0;
154
+ for (let k = 0; k < startLine; k++) {
155
+ matchStartIndex += originalLines[k].length + 1;
156
+ }
157
+ let matchEndIndex = matchStartIndex;
158
+ for (let k = startLine; k <= endLine; k++) {
159
+ matchEndIndex += originalLines[k].length;
160
+ if (k < endLine) {
161
+ matchEndIndex += 1;
162
+ }
163
+ }
164
+ yield content.substring(matchStartIndex, matchEndIndex);
165
+ }
166
+ };
167
+ const WhitespaceNormalizedReplacer = function* (content, find) {
168
+ const normalizeWhitespace = (text) => text.replace(/\s+/g, ' ').trim();
169
+ const normalizedFind = normalizeWhitespace(find);
170
+ const lines = content.split('\n');
171
+ for (let i = 0; i < lines.length; i++) {
172
+ const line = lines[i];
173
+ if (normalizeWhitespace(line) === normalizedFind) {
174
+ yield line;
175
+ }
176
+ else {
177
+ const normalizedLine = normalizeWhitespace(line);
178
+ if (normalizedLine.includes(normalizedFind)) {
179
+ const words = find.trim().split(/\s+/);
180
+ if (words.length > 0) {
181
+ const pattern = words.map((word) => word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('\\s+');
182
+ try {
183
+ const regex = new RegExp(pattern);
184
+ const match = line.match(regex);
185
+ if (match) {
186
+ yield match[0];
187
+ }
188
+ }
189
+ catch (e) {
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ const findLines = find.split('\n');
196
+ if (findLines.length > 1) {
197
+ for (let i = 0; i <= lines.length - findLines.length; i++) {
198
+ const block = lines.slice(i, i + findLines.length);
199
+ if (normalizeWhitespace(block.join('\n')) === normalizedFind) {
200
+ yield block.join('\n');
201
+ }
202
+ }
203
+ }
204
+ };
205
+ const IndentationFlexibleReplacer = function* (content, find) {
206
+ const removeIndentation = (text) => {
207
+ const lines = text.split('\n');
208
+ const nonEmptyLines = lines.filter((line) => line.trim().length > 0);
209
+ if (nonEmptyLines.length === 0)
210
+ return text;
211
+ const minIndent = Math.min(...nonEmptyLines.map((line) => {
212
+ const match = line.match(/^(\s*)/);
213
+ return match ? match[1].length : 0;
214
+ }));
215
+ return lines.map((line) => (line.trim().length === 0 ? line : line.slice(minIndent))).join('\n');
216
+ };
217
+ const normalizedFind = removeIndentation(find);
218
+ const contentLines = content.split('\n');
219
+ const findLines = find.split('\n');
220
+ for (let i = 0; i <= contentLines.length - findLines.length; i++) {
221
+ const block = contentLines.slice(i, i + findLines.length).join('\n');
222
+ if (removeIndentation(block) === normalizedFind) {
223
+ yield block;
224
+ }
225
+ }
226
+ };
227
+ const EscapeNormalizedReplacer = function* (content, find) {
228
+ const unescapeString = (str) => {
229
+ return str.replace(/\\(n|t|r|'|"|`|\\|\n|\$)/g, (match, capturedChar) => {
230
+ switch (capturedChar) {
231
+ case 'n': return '\n';
232
+ case 't': return '\t';
233
+ case 'r': return '\r';
234
+ case "'": return "'";
235
+ case '"': return '"';
236
+ case '`': return '`';
237
+ case '\\': return '\\';
238
+ case '\n': return '\n';
239
+ case '$': return '$';
240
+ default: return match;
241
+ }
242
+ });
243
+ };
244
+ const unescapedFind = unescapeString(find);
245
+ if (content.includes(unescapedFind)) {
246
+ yield unescapedFind;
247
+ }
248
+ const lines = content.split('\n');
249
+ const findLines = unescapedFind.split('\n');
250
+ for (let i = 0; i <= lines.length - findLines.length; i++) {
251
+ const block = lines.slice(i, i + findLines.length).join('\n');
252
+ const unescapedBlock = unescapeString(block);
253
+ if (unescapedBlock === unescapedFind) {
254
+ yield block;
255
+ }
256
+ }
257
+ };
258
+ const MultiOccurrenceReplacer = function* (content, find) {
259
+ let startIndex = 0;
260
+ while (true) {
261
+ const index = content.indexOf(find, startIndex);
262
+ if (index === -1)
263
+ break;
264
+ yield find;
265
+ startIndex = index + find.length;
266
+ }
267
+ };
268
+ const TrimmedBoundaryReplacer = function* (content, find) {
269
+ const trimmedFind = find.trim();
270
+ if (trimmedFind === find) {
271
+ return;
272
+ }
273
+ if (content.includes(trimmedFind)) {
274
+ yield trimmedFind;
275
+ }
276
+ const lines = content.split('\n');
277
+ const findLines = find.split('\n');
278
+ for (let i = 0; i <= lines.length - findLines.length; i++) {
279
+ const block = lines.slice(i, i + findLines.length).join('\n');
280
+ if (block.trim() === trimmedFind) {
281
+ yield block;
282
+ }
283
+ }
284
+ };
285
+ const ContextAwareReplacer = function* (content, find) {
286
+ const findLines = find.split('\n');
287
+ if (findLines.length < 3) {
288
+ return;
289
+ }
290
+ if (findLines[findLines.length - 1] === '') {
291
+ findLines.pop();
292
+ }
293
+ const contentLines = content.split('\n');
294
+ const firstLine = findLines[0].trim();
295
+ const lastLine = findLines[findLines.length - 1].trim();
296
+ for (let i = 0; i < contentLines.length; i++) {
297
+ if (contentLines[i].trim() !== firstLine)
298
+ continue;
299
+ for (let j = i + 2; j < contentLines.length; j++) {
300
+ if (contentLines[j].trim() === lastLine) {
301
+ const blockLines = contentLines.slice(i, j + 1);
302
+ const block = blockLines.join('\n');
303
+ if (blockLines.length === findLines.length) {
304
+ let matchingLines = 0;
305
+ let totalNonEmptyLines = 0;
306
+ for (let k = 1; k < blockLines.length - 1; k++) {
307
+ const blockLine = blockLines[k].trim();
308
+ const findLine = findLines[k].trim();
309
+ if (blockLine.length > 0 || findLine.length > 0) {
310
+ totalNonEmptyLines++;
311
+ if (blockLine === findLine) {
312
+ matchingLines++;
313
+ }
314
+ }
315
+ }
316
+ if (totalNonEmptyLines === 0 || matchingLines / totalNonEmptyLines >= 0.5) {
317
+ yield block;
318
+ break;
319
+ }
320
+ }
321
+ break;
322
+ }
323
+ }
324
+ }
325
+ };
326
+ function trimDiff(diff) {
327
+ const lines = diff.split('\n');
328
+ const contentLines = lines.filter((line) => (line.startsWith('+') || line.startsWith('-') || line.startsWith(' ')) &&
329
+ !line.startsWith('---') &&
330
+ !line.startsWith('+++'));
331
+ if (contentLines.length === 0)
332
+ return diff;
333
+ let min = Infinity;
334
+ for (const line of contentLines) {
335
+ const content = line.slice(1);
336
+ if (content.trim().length > 0) {
337
+ const match = content.match(/^(\s*)/);
338
+ if (match)
339
+ min = Math.min(min, match[1].length);
340
+ }
341
+ }
342
+ if (min === Infinity || min === 0)
343
+ return diff;
344
+ const trimmedLines = lines.map((line) => {
345
+ if ((line.startsWith('+') || line.startsWith('-') || line.startsWith(' ')) &&
346
+ !line.startsWith('---') &&
347
+ !line.startsWith('+++')) {
348
+ const prefix = line[0];
349
+ const content = line.slice(1);
350
+ return prefix + content.slice(min);
351
+ }
352
+ return line;
353
+ });
354
+ return trimmedLines.join('\n');
355
+ }
356
+ function replace(content, oldString, newString, replaceAll = false) {
357
+ if (oldString === newString) {
358
+ throw new Error('No changes to apply: oldString and newString are identical.');
359
+ }
360
+ let notFound = true;
361
+ for (const replacer of [
362
+ SimpleReplacer,
363
+ LineTrimmedReplacer,
364
+ BlockAnchorReplacer,
365
+ WhitespaceNormalizedReplacer,
366
+ IndentationFlexibleReplacer,
367
+ EscapeNormalizedReplacer,
368
+ TrimmedBoundaryReplacer,
369
+ ContextAwareReplacer,
370
+ MultiOccurrenceReplacer,
371
+ ]) {
372
+ for (const search of replacer(content, oldString)) {
373
+ const index = content.indexOf(search);
374
+ if (index === -1)
375
+ continue;
376
+ notFound = false;
377
+ if (replaceAll) {
378
+ return content.replaceAll(search, newString);
379
+ }
380
+ const lastIndex = content.lastIndexOf(search);
381
+ if (index !== lastIndex)
382
+ continue;
383
+ return content.substring(0, index) + newString + content.substring(index + search.length);
384
+ }
385
+ }
386
+ if (notFound) {
387
+ throw new Error('Could not find oldString in the file. It must match exactly, including whitespace, indentation, and line endings.');
388
+ }
389
+ throw new Error('Found multiple matches for oldString. Provide more surrounding context to make the match unique.');
390
+ }
6
391
  export const editFileTool = {
7
392
  name: 'edit_file',
8
393
  description: edit_file_description,
@@ -15,7 +400,7 @@ export const editFileTool = {
15
400
  },
16
401
  old_string: {
17
402
  type: 'string',
18
- description: '要被替换的内容(必须精确匹配)'
403
+ description: '要被替换的内容'
19
404
  },
20
405
  new_string: {
21
406
  type: 'string',
@@ -38,6 +423,14 @@ export const editFileTool = {
38
423
  const normalizeLineEndings = (str) => {
39
424
  return str.replace(/\r\n/g, '\n');
40
425
  };
426
+ const detectLineEnding = (text) => {
427
+ return text.includes('\r\n') ? '\r\n' : '\n';
428
+ };
429
+ const convertToLineEnding = (text, ending) => {
430
+ if (ending === '\n')
431
+ return text;
432
+ return text.replaceAll('\n', '\r\n');
433
+ };
41
434
  let { file_path, old_string, new_string, replace_all = false } = params;
42
435
  old_string = extractCDATA(old_string);
43
436
  new_string = extractCDATA(new_string);
@@ -61,34 +454,44 @@ export const editFileTool = {
61
454
  return { success: false, output: '', error: `File not found: ${file_path}` };
62
455
  }
63
456
  const content = await fs.promises.readFile(file_path, 'utf-8');
457
+ const ending = detectLineEnding(content);
64
458
  const normalizedContent = normalizeLineEndings(content);
65
459
  const normalizedOldString = normalizeLineEndings(old_string);
66
460
  const normalizedNewString = normalizeLineEndings(new_string);
67
- if (!normalizedContent.includes(normalizedOldString)) {
68
- return { success: false, output: '', error: 'old_string not found in content' };
69
- }
461
+ const oldConverted = convertToLineEnding(normalizedOldString, ending);
462
+ const newConverted = convertToLineEnding(normalizedNewString, ending);
70
463
  let newContent;
71
- if (replace_all) {
72
- newContent = normalizedContent.split(normalizedOldString).join(normalizedNewString);
464
+ try {
465
+ newContent = replace(normalizedContent, oldConverted, newConverted, replace_all);
73
466
  }
74
- else {
75
- const firstIndex = normalizedContent.indexOf(normalizedOldString);
76
- const secondIndex = normalizedContent.indexOf(normalizedOldString, firstIndex + normalizedOldString.length);
77
- if (secondIndex !== -1) {
78
- return {
79
- success: false,
80
- output: '',
81
- error: 'Found multiple matches. Use replace_all=true or provide more context to make old_string unique.'
82
- };
83
- }
84
- newContent = normalizedContent.replace(normalizedOldString, normalizedNewString);
467
+ catch (error) {
468
+ return { success: false, output: '', error: error.message || 'Failed to replace content' };
85
469
  }
86
470
  await fs.promises.writeFile(file_path, newContent, 'utf-8');
87
- const count = replace_all ? (normalizedContent.split(normalizedOldString).length - 1) : 1;
471
+ const diff = trimDiff(createTwoFilesPatch(file_path, file_path, normalizeLineEndings(content), normalizeLineEndings(newContent)));
472
+ let additions = 0;
473
+ let deletions = 0;
474
+ for (const change of diffLines(content, newContent)) {
475
+ if (change.added)
476
+ additions += change.count || 0;
477
+ if (change.removed)
478
+ deletions += change.count || 0;
479
+ }
88
480
  return {
89
481
  success: true,
90
- output: `成功: 文件已更新 ${file_path}${count > 1 ? ` (${count} 处替换)` : ''}`,
91
- metadata: { path: file_path, replacements: count }
482
+ output: `成功: 文件已更新 ${file_path}`,
483
+ metadata: {
484
+ path: file_path,
485
+ replacements: replace_all ? (normalizedContent.split(normalizedOldString).length - 1) : 1,
486
+ diff,
487
+ filediff: {
488
+ file: file_path,
489
+ before: content,
490
+ after: newContent,
491
+ additions,
492
+ deletions
493
+ }
494
+ }
92
495
  };
93
496
  }
94
497
  };
@@ -1 +1 @@
1
- {"version":3,"file":"edit_file.js","sourceRoot":"","sources":["../../../../src/modules/tools/provider/edit_file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edit_file.js","sourceRoot":"","sources":["../../../../src/modules/tools/provider/edit_file.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"write_file.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/provider/write_file.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAA2B,MAAM,kBAAkB,CAAA;AAKhE,eAAO,MAAM,aAAa,EAAE,IAgE3B,CAAA"}
1
+ {"version":3,"file":"write_file.d.ts","sourceRoot":"","sources":["../../../../src/modules/tools/provider/write_file.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAA2B,MAAM,kBAAkB,CAAA;AAKhE,eAAO,MAAM,aAAa,EAAE,IA2D3B,CAAA"}
@@ -43,19 +43,14 @@ export const writeFileTool = {
43
43
  file_path = path.resolve(context.workDir || process.cwd(), file_path);
44
44
  }
45
45
  const exists = await fs.promises.access(file_path).then(() => true).catch(() => false);
46
- if (exists) {
47
- return {
48
- success: false,
49
- output: '',
50
- error: `File already exists: ${file_path}\nUse edit_file to modify existing files.`
51
- };
52
- }
53
46
  const dir = path.dirname(file_path);
54
47
  await fs.promises.mkdir(dir, { recursive: true });
55
48
  await fs.promises.writeFile(file_path, content, 'utf-8');
56
49
  return {
57
50
  success: true,
58
- output: `成功: 新文件已创建 ${file_path} (${content.length} 字符)`,
51
+ output: exists
52
+ ? `成功: 文件已更新 ${file_path} (${content.length} 字符)`
53
+ : `成功: 新文件已创建 ${file_path} (${content.length} 字符)`,
59
54
  metadata: { path: file_path, size: content.length }
60
55
  };
61
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"write_file.js","sourceRoot":"","sources":["../../../../src/modules/tools/provider/write_file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAGnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAC9D,MAAM,sBAAsB,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAA;AAE/F,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,sBAAsB;IACnC,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,QAAQ;aACtB;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,UAAU;aACxB;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;KACnC;IACD,OAAO,EAAE,KAAK,EAAE,MAA8C,EAAE,OAAoB,EAAuB,EAAE;QAC3G,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;QAEnC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,uCAAuC;aAC/C,CAAA;QACH,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,qCAAqC;aAC7C,CAAA;QACH,CAAC;QAED,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACpC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAA;QACvE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;QACtF,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,wBAAwB,SAAS,2CAA2C;aACpF,CAAA;QACH,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACnC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEjD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QAExD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,cAAc,SAAS,KAAK,OAAO,CAAC,MAAM,MAAM;YACxD,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE;SACpD,CAAA;IACH,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"write_file.js","sourceRoot":"","sources":["../../../../src/modules/tools/provider/write_file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAGnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAC9D,MAAM,sBAAsB,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAA;AAE/F,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,sBAAsB;IACnC,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,QAAQ;aACtB;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,UAAU;aACxB;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;KACnC;IACD,OAAO,EAAE,KAAK,EAAE,MAA8C,EAAE,OAAoB,EAAuB,EAAE;QAC3G,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;QAEnC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,uCAAuC;aAC/C,CAAA;QACH,CAAC;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,qCAAqC;aAC7C,CAAA;QACH,CAAC;QAED,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACpC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAA;QACvE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;QAEtF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACnC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEjD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QAExD,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,MAAM;gBACZ,CAAC,CAAC,aAAa,SAAS,KAAK,OAAO,CAAC,MAAM,MAAM;gBACjD,CAAC,CAAC,cAAc,SAAS,KAAK,OAAO,CAAC,MAAM,MAAM;YACpD,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE;SACpD,CAAA;IACH,CAAC;CACF,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tianxincode",
3
- "version": "1.0.26",
3
+ "version": "1.0.27",
4
4
  "type": "module",
5
5
  "description": "AI Coding Assistant",
6
6
  "main": "dist/index.js",
@@ -28,8 +28,10 @@
28
28
  "author": "",
29
29
  "license": "ISC",
30
30
  "dependencies": {
31
+ "@types/diff": "^7.0.3",
31
32
  "@types/nodemailer": "^7.0.11",
32
33
  "cors": "^2.8.6",
34
+ "diff": "^7.0.0",
33
35
  "dingtalk-stream-sdk-nodejs": "^2.0.4",
34
36
  "express": "^5.2.1",
35
37
  "ink": "^6.8.0",