code-gate 1.2.0 → 1.3.0

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.
Files changed (67) hide show
  1. package/README.md +105 -2
  2. package/README_ZH.md +103 -1
  3. package/dist/agent/index.d.ts +8 -0
  4. package/dist/agent/index.js +10 -0
  5. package/dist/agent/index.js.map +1 -0
  6. package/dist/agent/orchestrator.d.ts +13 -0
  7. package/dist/agent/orchestrator.js +109 -0
  8. package/dist/agent/orchestrator.js.map +1 -0
  9. package/dist/agent/prompts/system.d.ts +14 -0
  10. package/dist/agent/prompts/system.js +108 -0
  11. package/dist/agent/prompts/system.js.map +1 -0
  12. package/dist/agent/tools/index.d.ts +15 -0
  13. package/dist/agent/tools/index.js +57 -0
  14. package/dist/agent/tools/index.js.map +1 -0
  15. package/dist/agent/tools/list-directory.d.ts +13 -0
  16. package/dist/agent/tools/list-directory.js +162 -0
  17. package/dist/agent/tools/list-directory.js.map +1 -0
  18. package/dist/agent/tools/read-file.d.ts +13 -0
  19. package/dist/agent/tools/read-file.js +106 -0
  20. package/dist/agent/tools/read-file.js.map +1 -0
  21. package/dist/agent/tools/search-content.d.ts +13 -0
  22. package/dist/agent/tools/search-content.js +110 -0
  23. package/dist/agent/tools/search-content.js.map +1 -0
  24. package/dist/agent/tools/types.d.ts +71 -0
  25. package/dist/agent/tools/types.js +5 -0
  26. package/dist/agent/tools/types.js.map +1 -0
  27. package/dist/agent/types.d.ts +55 -0
  28. package/dist/agent/types.js +5 -0
  29. package/dist/agent/types.js.map +1 -0
  30. package/dist/cli/commands/hook.js +18 -3
  31. package/dist/cli/commands/hook.js.map +1 -1
  32. package/dist/cli/commands/review.js +18 -3
  33. package/dist/cli/commands/review.js.map +1 -1
  34. package/dist/config/defaults.js +5 -0
  35. package/dist/config/defaults.js.map +1 -1
  36. package/dist/config/types.d.ts +6 -0
  37. package/dist/core/review.d.ts +2 -1
  38. package/dist/core/review.js +128 -66
  39. package/dist/core/review.js.map +1 -1
  40. package/dist/llm/base.d.ts +20 -0
  41. package/dist/llm/base.js +15 -0
  42. package/dist/llm/base.js.map +1 -1
  43. package/dist/llm/index.d.ts +13 -1
  44. package/dist/llm/index.js +25 -0
  45. package/dist/llm/index.js.map +1 -1
  46. package/dist/llm/providers/deepseek.d.ts +20 -2
  47. package/dist/llm/providers/deepseek.js +89 -4
  48. package/dist/llm/providers/deepseek.js.map +1 -1
  49. package/dist/llm/providers/zhipu.d.ts +20 -2
  50. package/dist/llm/providers/zhipu.js +80 -4
  51. package/dist/llm/providers/zhipu.js.map +1 -1
  52. package/dist/locales/de.js +3 -0
  53. package/dist/locales/de.js.map +1 -1
  54. package/dist/locales/en.js +3 -0
  55. package/dist/locales/en.js.map +1 -1
  56. package/dist/locales/fr.js +3 -0
  57. package/dist/locales/fr.js.map +1 -1
  58. package/dist/locales/ja.js +3 -0
  59. package/dist/locales/ja.js.map +1 -1
  60. package/dist/locales/ko.js +3 -0
  61. package/dist/locales/ko.js.map +1 -1
  62. package/dist/locales/types.d.ts +3 -0
  63. package/dist/locales/zh-CN.js +3 -0
  64. package/dist/locales/zh-CN.js.map +1 -1
  65. package/dist/locales/zh-TW.js +3 -0
  66. package/dist/locales/zh-TW.js.map +1 -1
  67. package/package.json +1 -1
@@ -0,0 +1,162 @@
1
+ /**
2
+ * list_directory 工具实现
3
+ * 列出目录内容,支持递归和分页
4
+ */
5
+ import fs from 'node:fs';
6
+ import nodePath from 'node:path';
7
+ import { getGitRoot } from '../../core/git.js';
8
+ // 默认值
9
+ const DEFAULT_DEPTH = 1;
10
+ const DEFAULT_OFFSET = 0;
11
+ const DEFAULT_LIMIT = 50;
12
+ // 排除的目录/文件
13
+ const EXCLUDED_NAMES = [
14
+ 'node_modules',
15
+ '.git',
16
+ '.idea',
17
+ '.vscode',
18
+ 'dist',
19
+ 'build',
20
+ 'coverage',
21
+ '__pycache__',
22
+ '.DS_Store',
23
+ 'Thumbs.db'
24
+ ];
25
+ /**
26
+ * 工具定义
27
+ */
28
+ export const listDirectoryTool = {
29
+ type: 'function',
30
+ function: {
31
+ name: 'list_directory',
32
+ description: '列出目录内容,了解项目结构。可以递归列出子目录。',
33
+ parameters: {
34
+ type: 'object',
35
+ properties: {
36
+ path: {
37
+ type: 'string',
38
+ description: '目录路径(相对于项目根目录)'
39
+ },
40
+ depth: {
41
+ type: 'number',
42
+ description: `递归深度,默认 ${DEFAULT_DEPTH}(只列出直接子项)`
43
+ },
44
+ offset: {
45
+ type: 'number',
46
+ description: `跳过前 N 条结果,默认 ${DEFAULT_OFFSET}`
47
+ },
48
+ limit: {
49
+ type: 'number',
50
+ description: `返回最大条数,默认 ${DEFAULT_LIMIT}`
51
+ }
52
+ },
53
+ required: ['path']
54
+ }
55
+ }
56
+ };
57
+ /**
58
+ * 判断是否应该排除
59
+ */
60
+ function shouldExclude(name) {
61
+ // 排除隐藏文件(以 . 开头,但不包括 . 和 ..)
62
+ if (name.startsWith('.') && name !== '.' && name !== '..') {
63
+ // 允许一些常见的配置文件
64
+ const allowedDotFiles = ['.codegate.js', '.codegate.ts', '.codegate.json', '.eslintrc.js', '.prettierrc'];
65
+ if (!allowedDotFiles.some(f => name.startsWith(f.split('.')[1]))) {
66
+ return true;
67
+ }
68
+ }
69
+ return EXCLUDED_NAMES.includes(name);
70
+ }
71
+ /**
72
+ * 递归收集目录内容
73
+ */
74
+ function collectEntries(dirPath, basePath, maxDepth, currentDepth = 0) {
75
+ if (currentDepth >= maxDepth) {
76
+ return [];
77
+ }
78
+ const entries = [];
79
+ try {
80
+ const items = fs.readdirSync(dirPath);
81
+ for (const item of items) {
82
+ // 跳过排除的文件/目录
83
+ if (shouldExclude(item)) {
84
+ continue;
85
+ }
86
+ const fullPath = nodePath.join(dirPath, item);
87
+ const relativePath = nodePath.relative(basePath, fullPath);
88
+ try {
89
+ const stats = fs.statSync(fullPath);
90
+ if (stats.isDirectory()) {
91
+ entries.push({
92
+ name: relativePath,
93
+ type: 'dir'
94
+ });
95
+ // 递归子目录
96
+ if (currentDepth + 1 < maxDepth) {
97
+ const subEntries = collectEntries(fullPath, basePath, maxDepth, currentDepth + 1);
98
+ entries.push(...subEntries);
99
+ }
100
+ }
101
+ else if (stats.isFile()) {
102
+ entries.push({
103
+ name: relativePath,
104
+ type: 'file',
105
+ size: stats.size
106
+ });
107
+ }
108
+ }
109
+ catch {
110
+ // 忽略无法访问的文件
111
+ }
112
+ }
113
+ }
114
+ catch {
115
+ // 忽略无法访问的目录
116
+ }
117
+ return entries;
118
+ }
119
+ /**
120
+ * 执行 list_directory 工具
121
+ */
122
+ export async function executeListDirectory(params) {
123
+ const { path: dirPath, depth = DEFAULT_DEPTH, offset = DEFAULT_OFFSET, limit = DEFAULT_LIMIT } = params;
124
+ // 获取项目根目录
125
+ const root = getGitRoot();
126
+ if (!root) {
127
+ throw new Error('Not in a git repository');
128
+ }
129
+ // 解析目录路径
130
+ const absolutePath = nodePath.resolve(root, dirPath);
131
+ // 安全检查:路径必须在项目根目录内
132
+ if (!absolutePath.startsWith(root)) {
133
+ throw new Error('Access denied: path outside project root');
134
+ }
135
+ // 检查目录存在
136
+ if (!fs.existsSync(absolutePath)) {
137
+ throw new Error(`Directory not found: ${dirPath}`);
138
+ }
139
+ // 检查是否为目录
140
+ const stats = fs.statSync(absolutePath);
141
+ if (!stats.isDirectory()) {
142
+ throw new Error(`Not a directory: ${dirPath}`);
143
+ }
144
+ // 收集所有条目
145
+ const allEntries = collectEntries(absolutePath, absolutePath, depth);
146
+ const total = allEntries.length;
147
+ // 排序:目录在前,文件在后;同类型按名称排序
148
+ allEntries.sort((a, b) => {
149
+ if (a.type !== b.type) {
150
+ return a.type === 'dir' ? -1 : 1;
151
+ }
152
+ return a.name.localeCompare(b.name);
153
+ });
154
+ // 分页
155
+ const pagedEntries = allEntries.slice(offset, offset + limit);
156
+ return {
157
+ entries: pagedEntries,
158
+ total,
159
+ hasMore: offset + limit < total
160
+ };
161
+ }
162
+ //# sourceMappingURL=list-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-directory.js","sourceRoot":"","sources":["../../../src/agent/tools/list-directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * read_file 工具实现
3
+ * 读取文件内容,支持分页
4
+ */
5
+ import type { ToolDefinition, ReadFileParams, ReadFileResult } from './types.js';
6
+ /**
7
+ * 工具定义
8
+ */
9
+ export declare const readFileTool: ToolDefinition;
10
+ /**
11
+ * 执行 read_file 工具
12
+ */
13
+ export declare function executeReadFile(params: ReadFileParams): Promise<ReadFileResult>;
@@ -0,0 +1,106 @@
1
+ /**
2
+ * read_file 工具实现
3
+ * 读取文件内容,支持分页
4
+ */
5
+ import fs from 'node:fs';
6
+ import nodePath from 'node:path';
7
+ import { getGitRoot } from '../../core/git.js';
8
+ // 安全配置
9
+ const MAX_FILE_SIZE = 100 * 1024; // 100KB
10
+ const BLOCKED_PATTERNS = ['.env', '.git/objects', 'node_modules'];
11
+ // 默认值
12
+ const DEFAULT_START_LINE = 1;
13
+ const DEFAULT_MAX_LINES = 200;
14
+ /**
15
+ * 工具定义
16
+ */
17
+ export const readFileTool = {
18
+ type: 'function',
19
+ function: {
20
+ name: 'read_file',
21
+ description: '读取文件内容,支持分页。用于查看完整的源代码文件、类型定义、配置文件等。',
22
+ parameters: {
23
+ type: 'object',
24
+ properties: {
25
+ path: {
26
+ type: 'string',
27
+ description: '文件路径(相对于项目根目录)'
28
+ },
29
+ startLine: {
30
+ type: 'number',
31
+ description: `起始行号(从 1 开始),默认 ${DEFAULT_START_LINE}`
32
+ },
33
+ maxLines: {
34
+ type: 'number',
35
+ description: `最大读取行数,默认 ${DEFAULT_MAX_LINES}`
36
+ }
37
+ },
38
+ required: ['path']
39
+ }
40
+ }
41
+ };
42
+ /**
43
+ * 检查路径是否安全
44
+ */
45
+ function isPathSafe(filePath, root, absolutePath) {
46
+ // 检查路径遍历
47
+ if (!absolutePath.startsWith(root)) {
48
+ return { safe: false, error: 'Access denied: path outside project root' };
49
+ }
50
+ // 检查敏感文件
51
+ for (const pattern of BLOCKED_PATTERNS) {
52
+ if (filePath.includes(pattern)) {
53
+ return { safe: false, error: `Access denied: ${pattern} files are blocked` };
54
+ }
55
+ }
56
+ return { safe: true };
57
+ }
58
+ /**
59
+ * 执行 read_file 工具
60
+ */
61
+ export async function executeReadFile(params) {
62
+ const { path: filePath, startLine = DEFAULT_START_LINE, maxLines = DEFAULT_MAX_LINES } = params;
63
+ // 获取项目根目录
64
+ const root = getGitRoot();
65
+ if (!root) {
66
+ throw new Error('Not in a git repository');
67
+ }
68
+ // 解析绝对路径
69
+ const absolutePath = nodePath.resolve(root, filePath);
70
+ // 安全检查
71
+ const safeCheck = isPathSafe(filePath, root, absolutePath);
72
+ if (!safeCheck.safe) {
73
+ throw new Error(safeCheck.error);
74
+ }
75
+ // 检查文件存在
76
+ if (!fs.existsSync(absolutePath)) {
77
+ throw new Error(`File not found: ${filePath}`);
78
+ }
79
+ // 检查是否为文件
80
+ const stats = fs.statSync(absolutePath);
81
+ if (!stats.isFile()) {
82
+ throw new Error(`Not a file: ${filePath}`);
83
+ }
84
+ // 检查文件大小
85
+ if (stats.size > MAX_FILE_SIZE) {
86
+ throw new Error(`File too large: ${stats.size} bytes (max ${MAX_FILE_SIZE})`);
87
+ }
88
+ // 读取文件
89
+ const content = fs.readFileSync(absolutePath, 'utf8');
90
+ const lines = content.split('\n');
91
+ const totalLines = lines.length;
92
+ // 计算分页范围
93
+ const start = Math.max(1, startLine);
94
+ const end = Math.min(totalLines, start + maxLines - 1);
95
+ // 提取指定范围的行
96
+ const selectedLines = lines.slice(start - 1, end);
97
+ return {
98
+ content: selectedLines.join('\n'),
99
+ startLine: start,
100
+ endLine: end,
101
+ totalLines,
102
+ total: totalLines,
103
+ hasMore: end < totalLines
104
+ };
105
+ }
106
+ //# sourceMappingURL=read-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../../src/agent/tools/read-file.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,QAAQ,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO;AACP,MAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAA,CAAE,QAAQ;AAC1C,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,CAAA;AAEjE,MAAM;AACN,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAC5B,MAAM,iBAAiB,GAAG,GAAG,CAAA;AAE7B;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE;QACR,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,sCAAsC;QACnD,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gBAAgB;iBAC9B;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mBAAmB,kBAAkB,EAAE;iBACrD;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,aAAa,iBAAiB,EAAE;iBAC9C;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;CACF,CAAA;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,QAAgB,EAAE,IAAY,EAAE,YAAoB;IACtE,SAAS;IACT,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,0CAA0C,EAAE,CAAA;IAC3E,CAAC;IAED,SAAS;IACT,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACvC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,OAAO,oBAAoB,EAAE,CAAA;QAC9E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAsB;IAC1D,MAAM,EACJ,IAAI,EAAE,QAAQ,EACd,SAAS,GAAG,kBAAkB,EAC9B,QAAQ,GAAG,iBAAiB,EAC7B,GAAG,MAAM,CAAA;IAEV,UAAU;IACV,MAAM,IAAI,GAAG,UAAU,EAAE,CAAA;IACzB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,CAAC;IAED,SAAS;IACT,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAErD,OAAO;IACP,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;IAC1D,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC;IAED,SAAS;IACT,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,UAAU;IACV,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;IACvC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAA;IAC5C,CAAC;IAED,SAAS;IACT,IAAI,KAAK,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,CAAC,IAAI,eAAe,aAAa,GAAG,CAAC,CAAA;IAC/E,CAAC;IAED,OAAO;IACP,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAA;IAE/B,SAAS;IACT,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAA;IAEtD,WAAW;IACX,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;IAEjD,OAAO;QACL,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QACjC,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,GAAG;QACZ,UAAU;QACV,KAAK,EAAE,UAAU;QACjB,OAAO,EAAE,GAAG,GAAG,UAAU;KAC1B,CAAA;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * search_content 工具实现
3
+ * 在项目中搜索文件内容,支持分页
4
+ */
5
+ import type { ToolDefinition, SearchContentParams, SearchContentResult } from './types.js';
6
+ /**
7
+ * 工具定义
8
+ */
9
+ export declare const searchContentTool: ToolDefinition;
10
+ /**
11
+ * 执行 search_content 工具
12
+ */
13
+ export declare function executeSearchContent(params: SearchContentParams): Promise<SearchContentResult>;
@@ -0,0 +1,110 @@
1
+ /**
2
+ * search_content 工具实现
3
+ * 在项目中搜索文件内容,支持分页
4
+ */
5
+ import { spawnSync } from 'node:child_process';
6
+ import nodePath from 'node:path';
7
+ import { getGitRoot } from '../../core/git.js';
8
+ // 默认值
9
+ const DEFAULT_OFFSET = 0;
10
+ const DEFAULT_LIMIT = 20;
11
+ const MAX_CONTENT_LENGTH = 200; // 单行内容最大长度
12
+ /**
13
+ * 工具定义
14
+ */
15
+ export const searchContentTool = {
16
+ type: 'function',
17
+ function: {
18
+ name: 'search_content',
19
+ description: '在项目中搜索文件内容,支持正则表达式。用于查找函数定义、方法调用、类定义等。',
20
+ parameters: {
21
+ type: 'object',
22
+ properties: {
23
+ pattern: {
24
+ type: 'string',
25
+ description: '搜索模式(支持正则表达式)'
26
+ },
27
+ path: {
28
+ type: 'string',
29
+ description: '搜索路径(相对于项目根目录),默认为项目根目录'
30
+ },
31
+ offset: {
32
+ type: 'number',
33
+ description: `跳过前 N 条结果,默认 ${DEFAULT_OFFSET}`
34
+ },
35
+ limit: {
36
+ type: 'number',
37
+ description: `返回最大条数,默认 ${DEFAULT_LIMIT}`
38
+ }
39
+ },
40
+ required: ['pattern']
41
+ }
42
+ }
43
+ };
44
+ /**
45
+ * 解析 git grep 输出行
46
+ */
47
+ function parseGrepLine(line) {
48
+ // 格式: file:line:content
49
+ const match = line.match(/^(.+?):(\d+):(.*)$/);
50
+ if (match) {
51
+ return {
52
+ file: match[1],
53
+ line: parseInt(match[2], 10),
54
+ content: match[3].substring(0, MAX_CONTENT_LENGTH)
55
+ };
56
+ }
57
+ return null;
58
+ }
59
+ /**
60
+ * 执行 search_content 工具
61
+ */
62
+ export async function executeSearchContent(params) {
63
+ const { pattern, path: searchPath = '.', offset = DEFAULT_OFFSET, limit = DEFAULT_LIMIT } = params;
64
+ // 获取项目根目录
65
+ const root = getGitRoot();
66
+ if (!root) {
67
+ throw new Error('Not in a git repository');
68
+ }
69
+ // 解析搜索路径
70
+ const absolutePath = nodePath.resolve(root, searchPath);
71
+ // 安全检查:路径必须在项目根目录内
72
+ if (!absolutePath.startsWith(root)) {
73
+ throw new Error('Access denied: path outside project root');
74
+ }
75
+ // 使用 git grep 进行搜索
76
+ // 优点:自动排除 .gitignore 中的文件,速度快
77
+ const result = spawnSync('git', [
78
+ 'grep',
79
+ '-n', // 显示行号
80
+ '-I', // 忽略二进制文件
81
+ '--no-color', // 不使用颜色
82
+ '-E', // 使用扩展正则表达式
83
+ pattern,
84
+ '--',
85
+ searchPath
86
+ ], {
87
+ cwd: root,
88
+ encoding: 'utf8',
89
+ maxBuffer: 10 * 1024 * 1024 // 10MB
90
+ });
91
+ // 解析结果
92
+ const lines = (result.stdout || '').split('\n').filter(Boolean);
93
+ const total = lines.length;
94
+ // 分页
95
+ const pagedLines = lines.slice(offset, offset + limit);
96
+ // 解析每一行
97
+ const matches = [];
98
+ for (const line of pagedLines) {
99
+ const match = parseGrepLine(line);
100
+ if (match) {
101
+ matches.push(match);
102
+ }
103
+ }
104
+ return {
105
+ matches,
106
+ total,
107
+ hasMore: offset + limit < total
108
+ };
109
+ }
110
+ //# sourceMappingURL=search-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-content.js","sourceRoot":"","sources":["../../../src/agent/tools/search-content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Agent 工具类型定义
3
+ */
4
+ export interface PaginationParams {
5
+ offset?: number;
6
+ limit?: number;
7
+ }
8
+ export interface PaginationResult {
9
+ total: number;
10
+ hasMore: boolean;
11
+ }
12
+ export interface ReadFileParams {
13
+ path: string;
14
+ startLine?: number;
15
+ maxLines?: number;
16
+ }
17
+ export interface ReadFileResult extends PaginationResult {
18
+ content: string;
19
+ startLine: number;
20
+ endLine: number;
21
+ totalLines: number;
22
+ }
23
+ export interface SearchContentParams extends PaginationParams {
24
+ pattern: string;
25
+ path?: string;
26
+ }
27
+ export interface SearchMatch {
28
+ file: string;
29
+ line: number;
30
+ content: string;
31
+ }
32
+ export interface SearchContentResult extends PaginationResult {
33
+ matches: SearchMatch[];
34
+ }
35
+ export interface ListDirectoryParams extends PaginationParams {
36
+ path: string;
37
+ depth?: number;
38
+ }
39
+ export interface DirectoryEntry {
40
+ name: string;
41
+ type: 'file' | 'dir';
42
+ size?: number;
43
+ }
44
+ export interface ListDirectoryResult extends PaginationResult {
45
+ entries: DirectoryEntry[];
46
+ }
47
+ export interface ToolCall {
48
+ id: string;
49
+ name: string;
50
+ arguments: Record<string, unknown>;
51
+ }
52
+ export interface ToolResult {
53
+ id: string;
54
+ name: string;
55
+ result: unknown;
56
+ error?: string;
57
+ }
58
+ export interface ToolFunctionDefinition {
59
+ name: string;
60
+ description: string;
61
+ parameters: {
62
+ type: 'object';
63
+ properties: Record<string, unknown>;
64
+ required?: string[];
65
+ };
66
+ }
67
+ export interface ToolDefinition {
68
+ type: 'function';
69
+ function: ToolFunctionDefinition;
70
+ }
71
+ export type ToolExecutor<P = unknown, R = unknown> = (params: P) => Promise<R>;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Agent 工具类型定义
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/agent/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Agent 核心类型定义
3
+ */
4
+ import type { ToolCall, ToolDefinition } from './tools/types.js';
5
+ export interface AgentMessageBase {
6
+ role: 'system' | 'user' | 'assistant' | 'tool';
7
+ content: string | null;
8
+ }
9
+ export interface AgentSystemMessage extends AgentMessageBase {
10
+ role: 'system';
11
+ content: string;
12
+ }
13
+ export interface AgentUserMessage extends AgentMessageBase {
14
+ role: 'user';
15
+ content: string;
16
+ }
17
+ export interface AgentAssistantMessage extends AgentMessageBase {
18
+ role: 'assistant';
19
+ tool_calls?: ToolCall[];
20
+ reasoning_content?: string;
21
+ }
22
+ export interface AgentToolMessage extends AgentMessageBase {
23
+ role: 'tool';
24
+ tool_call_id: string;
25
+ name: string;
26
+ }
27
+ export type AgentMessage = AgentSystemMessage | AgentUserMessage | AgentAssistantMessage | AgentToolMessage;
28
+ export interface AgentReviewInput {
29
+ prompt: string;
30
+ diff: string;
31
+ files: string[];
32
+ }
33
+ export interface AgentReviewOptions {
34
+ maxIterations: number;
35
+ maxToolCalls: number;
36
+ onToolCall?: (call: ToolCall) => void;
37
+ onIteration?: (iteration: number, toolCalls: number) => void;
38
+ }
39
+ export interface OrchestratorState {
40
+ messages: AgentMessage[];
41
+ iteration: number;
42
+ totalToolCalls: number;
43
+ done: boolean;
44
+ }
45
+ export interface AgentProvider {
46
+ reviewWithAgent(input: AgentReviewInput, options: AgentReviewOptions): Promise<string>;
47
+ }
48
+ export type LLMCallFunction = (messages: AgentMessage[], tools: ToolDefinition[]) => Promise<{
49
+ content: string | null;
50
+ toolCalls: ToolCall[];
51
+ reasoning_content?: string;
52
+ }>;
53
+ export interface AgentOrchestrator {
54
+ run(input: AgentReviewInput, options: AgentReviewOptions): Promise<string>;
55
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Agent 核心类型定义
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -142,12 +142,27 @@ export async function runHook(force = false) {
142
142
  const s = spinner();
143
143
  s.start(t('cli.initReview'));
144
144
  let previewUrl = '';
145
+ let isAgentMode = false;
145
146
  const ok = await runReviewFlow({
146
- onStart: (total) => {
147
- s.message(t('cli.preparingReview', { total }));
147
+ onStart: (total, agentMode) => {
148
+ isAgentMode = agentMode;
149
+ if (agentMode) {
150
+ s.message(t('cli.preparingReviewAgent', { total }));
151
+ }
152
+ else {
153
+ s.message(t('cli.preparingReview', { total }));
154
+ }
148
155
  },
149
156
  onProgress: (file, idx, total) => {
150
- s.message(t('cli.analyzing', { idx, total, file }));
157
+ if (isAgentMode) {
158
+ s.message(t('cli.analyzingAgent'));
159
+ }
160
+ else {
161
+ s.message(t('cli.analyzing', { idx, total, file }));
162
+ }
163
+ },
164
+ onAgentToolCall: (tool) => {
165
+ s.message(t('cli.agentToolCall', { tool }));
151
166
  },
152
167
  onServerReady: (url) => {
153
168
  previewUrl = url;
@@ -1 +1 @@
1
- {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../src/cli/commands/hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook.js","sourceRoot":"","sources":["../../../src/cli/commands/hook.ts"],"names":[],"mappings":"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"}