From 30f35a6562478d4fb0e50860068d99e19554b5e9 Mon Sep 17 00:00:00 2001 From: kurihada Date: Tue, 16 Dec 2025 15:03:33 +0800 Subject: [PATCH] =?UTF-8?q?refactor(core):=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=20grep=5Fcontent=20=E5=B7=A5=E5=85=B7=E4=B8=BA=20grep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重命名 grep_content.ts 为 grep.ts - 更新工具名称从 grep_content 改为 grep - 更新所有引用该工具的代码和测试文件 - 更新描述文件名称 --- .../core/src/agent/presets/code-reviewer.ts | 2 +- packages/core/src/agent/presets/explore.ts | 2 +- packages/core/src/agent/presets/plan.ts | 4 +- .../src/agent/prompt-template/renderer.ts | 2 +- .../filesystem/{grep_content.txt => grep.txt} | 0 .../filesystem/{grep_content.ts => grep.ts} | 8 ++-- packages/core/src/tools/filesystem/index.ts | 2 +- packages/core/src/tools/index.ts | 4 +- packages/core/src/tools/load_description.ts | 2 +- .../core/src/tools/plan/enter_plan_mode.ts | 2 +- .../tests/unit/agent/prompt-template.test.ts | 6 +-- .../{grep_content.test.ts => grep.test.ts} | 40 +++++++++---------- .../tests/unit/tools/load_description.test.ts | 2 +- .../core/tests/unit/tools/tool-search.test.ts | 4 +- 14 files changed, 40 insertions(+), 40 deletions(-) rename packages/core/src/tools/descriptions/filesystem/{grep_content.txt => grep.txt} (100%) rename packages/core/src/tools/filesystem/{grep_content.ts => grep.ts} (96%) rename packages/core/tests/unit/tools/filesystem/{grep_content.test.ts => grep.test.ts} (83%) diff --git a/packages/core/src/agent/presets/code-reviewer.ts b/packages/core/src/agent/presets/code-reviewer.ts index 7295b62..a7783ad 100644 --- a/packages/core/src/agent/presets/code-reviewer.ts +++ b/packages/core/src/agent/presets/code-reviewer.ts @@ -49,7 +49,7 @@ export const codeReviewerAgent: Omit = { 'read_file', 'list_directory', 'search_files', - 'grep_content', + 'grep', 'git_status', 'git_diff', ], diff --git a/packages/core/src/agent/presets/explore.ts b/packages/core/src/agent/presets/explore.ts index 7822c7f..abc7781 100644 --- a/packages/core/src/agent/presets/explore.ts +++ b/packages/core/src/agent/presets/explore.ts @@ -46,7 +46,7 @@ export const exploreAgent: Omit = { ## 可用工具 - **glob**: 文件模式匹配 (*.ts, src/**/*.tsx) -- **grep_content**: 代码内容搜索 +- **grep**: 代码内容搜索 - **read_file**: 读取文件内容 - **search_files**: 文件名搜索 - **list_directory**: 目录列表 diff --git a/packages/core/src/agent/presets/plan.ts b/packages/core/src/agent/presets/plan.ts index a579977..6ba1b2b 100644 --- a/packages/core/src/agent/presets/plan.ts +++ b/packages/core/src/agent/presets/plan.ts @@ -5,7 +5,7 @@ import type { AgentInfo } from '../types.js'; * * 使用 ${variable} 语法支持动态变量替换: * - ${tools.glob} -> glob - * - ${tools.grep} -> grep_content + * - ${tools.grep} -> grep * - ${tools.read} -> read_file * - ${tools.bash} -> bash * - ${plan.planFilePath} -> 计划文件路径 @@ -92,7 +92,7 @@ export const planAgent: Omit = { 'list_directory', 'search_files', 'glob', - 'grep_content', + 'grep', 'get_file_info', // Git 只读 'git_status', diff --git a/packages/core/src/agent/prompt-template/renderer.ts b/packages/core/src/agent/prompt-template/renderer.ts index a7ec91a..96dd24c 100644 --- a/packages/core/src/agent/prompt-template/renderer.ts +++ b/packages/core/src/agent/prompt-template/renderer.ts @@ -242,7 +242,7 @@ export function render( */ export const DEFAULT_TOOL_NAMES: ToolNameMapping = { glob: 'glob', - grep: 'grep_content', + grep: 'grep', read: 'read_file', write: 'write_file', edit: 'edit_file', diff --git a/packages/core/src/tools/descriptions/filesystem/grep_content.txt b/packages/core/src/tools/descriptions/filesystem/grep.txt similarity index 100% rename from packages/core/src/tools/descriptions/filesystem/grep_content.txt rename to packages/core/src/tools/descriptions/filesystem/grep.txt diff --git a/packages/core/src/tools/filesystem/grep_content.ts b/packages/core/src/tools/filesystem/grep.ts similarity index 96% rename from packages/core/src/tools/filesystem/grep_content.ts rename to packages/core/src/tools/filesystem/grep.ts index 168522e..9eb32a9 100644 --- a/packages/core/src/tools/filesystem/grep_content.ts +++ b/packages/core/src/tools/filesystem/grep.ts @@ -11,11 +11,11 @@ interface GrepMatch { content: string; } -export const grepContentTool: ToolWithMetadata = { - name: 'grep_content', - description: loadDescription('grep_content'), +export const grepTool: ToolWithMetadata = { + name: 'grep', + description: loadDescription('grep'), metadata: { - name: 'grep_content', + name: 'grep', category: 'filesystem', description: '在文件内容中搜索文本', keywords: ['grep', 'search', 'content', 'text', 'find', 'regex', '搜索', '内容', '文本', '查找', '正则'], diff --git a/packages/core/src/tools/filesystem/index.ts b/packages/core/src/tools/filesystem/index.ts index 8719448..75a81a6 100644 --- a/packages/core/src/tools/filesystem/index.ts +++ b/packages/core/src/tools/filesystem/index.ts @@ -11,7 +11,7 @@ export { createDirectoryTool } from './create_directory.js'; // 搜索 export { searchFilesTool } from './search_files.js'; export { globTool } from './glob.js'; -export { grepContentTool } from './grep_content.js'; +export { grepTool } from './grep.js'; // 文件信息 export { getFileInfoTool } from './get_file_info.js'; diff --git a/packages/core/src/tools/index.ts b/packages/core/src/tools/index.ts index 23d6454..1407943 100644 --- a/packages/core/src/tools/index.ts +++ b/packages/core/src/tools/index.ts @@ -24,7 +24,7 @@ import { createDirectoryTool, searchFilesTool, globTool, - grepContentTool, + grepTool, getFileInfoTool, moveFileTool, copyFileTool, @@ -90,7 +90,7 @@ const allToolsWithMetadata: ToolWithMetadata[] = [ createDirectoryTool, searchFilesTool, globTool, - grepContentTool, + grepTool, getFileInfoTool, moveFileTool, copyFileTool, diff --git a/packages/core/src/tools/load_description.ts b/packages/core/src/tools/load_description.ts index c1fa5a4..f2aa3d3 100644 --- a/packages/core/src/tools/load_description.ts +++ b/packages/core/src/tools/load_description.ts @@ -18,7 +18,7 @@ const TOOL_CATEGORY_MAP: Record = { create_directory: 'filesystem', search_files: 'filesystem', glob: 'filesystem', - grep_content: 'filesystem', + grep: 'filesystem', get_file_info: 'filesystem', move_file: 'filesystem', copy_file: 'filesystem', diff --git a/packages/core/src/tools/plan/enter_plan_mode.ts b/packages/core/src/tools/plan/enter_plan_mode.ts index 43a0b22..be714bd 100644 --- a/packages/core/src/tools/plan/enter_plan_mode.ts +++ b/packages/core/src/tools/plan/enter_plan_mode.ts @@ -45,7 +45,7 @@ export const enterPlanModeTool: ToolWithMetadata = { 计划模式中的限制: 进入后只能使用只读工具: -✅ read_file, list_directory, search_files, grep_content +✅ read_file, list_directory, search_files, grep ✅ web_search, web_extract ✅ task(探索代理) ✅ ask_user_question diff --git a/packages/core/tests/unit/agent/prompt-template.test.ts b/packages/core/tests/unit/agent/prompt-template.test.ts index 2591194..8f64fdf 100644 --- a/packages/core/tests/unit/agent/prompt-template.test.ts +++ b/packages/core/tests/unit/agent/prompt-template.test.ts @@ -49,7 +49,7 @@ describe('Prompt Template System', () => { it('should handle multiple variables in one template', () => { const template = 'Use ${tools.glob}, ${tools.grep}, and ${tools.read}'; const result = renderTemplate(template, context); - expect(result).toBe('Use glob, grep_content, and read_file'); + expect(result).toBe('Use glob, grep, and read_file'); }); it('should handle ternary expressions - false condition', () => { @@ -103,7 +103,7 @@ describe('Prompt Template System', () => { it('should create context with default tool names', () => { const ctx = createDefaultContext(); expect(ctx.tools.glob).toBe('glob'); - expect(ctx.tools.grep).toBe('grep_content'); + expect(ctx.tools.grep).toBe('grep'); expect(ctx.tools.read).toBe('read_file'); expect(ctx.tools.write).toBe('write_file'); expect(ctx.tools.bash).toBe('bash'); @@ -117,7 +117,7 @@ describe('Prompt Template System', () => { }, }); expect(ctx.tools.glob).toBe('custom_glob'); - expect(ctx.tools.grep).toBe('grep_content'); // Others unchanged + expect(ctx.tools.grep).toBe('grep'); // Others unchanged }); it('should set default plan values', () => { diff --git a/packages/core/tests/unit/tools/filesystem/grep_content.test.ts b/packages/core/tests/unit/tools/filesystem/grep.test.ts similarity index 83% rename from packages/core/tests/unit/tools/filesystem/grep_content.test.ts rename to packages/core/tests/unit/tools/filesystem/grep.test.ts index 46a7d01..f489c7a 100644 --- a/packages/core/tests/unit/tools/filesystem/grep_content.test.ts +++ b/packages/core/tests/unit/tools/filesystem/grep.test.ts @@ -21,35 +21,35 @@ vi.mock('../../../../src/tools/load_description.js', () => ({ loadDescription: vi.fn(() => '在文件内容中搜索文本'), })); -import { grepContentTool } from '../../../../src/tools/filesystem/grep_content.js'; +import { grepTool } from '../../../../src/tools/filesystem/grep.js'; import * as fs from 'fs/promises'; import { getPermissionManager } from '../../../../src/permission/index.js'; -describe('grepContentTool - 内容搜索工具', () => { +describe('grepTool - 内容搜索工具', () => { beforeEach(() => { vi.clearAllMocks(); }); describe('工具定义', () => { it('有正确的名称', () => { - expect(grepContentTool.name).toBe('grep_content'); + expect(grepTool.name).toBe('grep'); }); it('有正确的元数据', () => { - expect(grepContentTool.metadata.category).toBe('filesystem'); - expect(grepContentTool.metadata.keywords).toContain('grep'); - expect(grepContentTool.metadata.keywords).toContain('search'); - expect(grepContentTool.metadata.keywords).toContain('content'); + expect(grepTool.metadata.category).toBe('filesystem'); + expect(grepTool.metadata.keywords).toContain('grep'); + expect(grepTool.metadata.keywords).toContain('search'); + expect(grepTool.metadata.keywords).toContain('content'); }); it('定义了必需参数', () => { - expect(grepContentTool.parameters.directory.required).toBe(true); - expect(grepContentTool.parameters.pattern.required).toBe(true); + expect(grepTool.parameters.directory.required).toBe(true); + expect(grepTool.parameters.pattern.required).toBe(true); }); it('定义了可选参数', () => { - expect(grepContentTool.parameters.file_pattern.required).toBe(false); - expect(grepContentTool.parameters.max_results.required).toBe(false); + expect(grepTool.parameters.file_pattern.required).toBe(false); + expect(grepTool.parameters.max_results.required).toBe(false); }); }); @@ -60,7 +60,7 @@ describe('grepContentTool - 内容搜索工具', () => { ] as any); vi.mocked(fs.readFile).mockResolvedValue('const hello = "world";\nconst foo = "bar";'); - const result = await grepContentTool.execute({ + const result = await grepTool.execute({ directory: '.', pattern: 'hello', }); @@ -76,7 +76,7 @@ describe('grepContentTool - 内容搜索工具', () => { ] as any); vi.mocked(fs.readFile).mockResolvedValue('const foo = "bar";'); - const result = await grepContentTool.execute({ + const result = await grepTool.execute({ directory: '.', pattern: 'notfound', }); @@ -92,7 +92,7 @@ describe('grepContentTool - 内容搜索工具', () => { ] as any); vi.mocked(fs.readFile).mockResolvedValue('const hello = "world";'); - const result = await grepContentTool.execute({ + const result = await grepTool.execute({ directory: '.', pattern: 'hello', file_pattern: '*.ts', @@ -112,7 +112,7 @@ describe('grepContentTool - 内容搜索工具', () => { 'hello1\nhello2\nhello3\nhello4\nhello5' ); - const result = await grepContentTool.execute({ + const result = await grepTool.execute({ directory: '.', pattern: 'hello', max_results: 2, @@ -135,7 +135,7 @@ describe('grepContentTool - 内容搜索工具', () => { ] as any); vi.mocked(fs.readFile).mockResolvedValue('const test = 1;'); - await grepContentTool.execute({ + await grepTool.execute({ directory: '.', pattern: 'test', }); @@ -153,7 +153,7 @@ describe('grepContentTool - 内容搜索工具', () => { }), } as any); - const result = await grepContentTool.execute({ + const result = await grepTool.execute({ directory: '/protected', pattern: 'test', }); @@ -171,7 +171,7 @@ describe('grepContentTool - 内容搜索工具', () => { }), } as any); - const result = await grepContentTool.execute({ + const result = await grepTool.execute({ directory: '.', pattern: 'test', }); @@ -194,7 +194,7 @@ describe('grepContentTool - 内容搜索工具', () => { ] as any); vi.mocked(fs.readFile).mockResolvedValue('const test = 1;'); - const result = await grepContentTool.execute({ + const result = await grepTool.execute({ directory: '.', pattern: 'test', }); @@ -210,7 +210,7 @@ describe('grepContentTool - 内容搜索工具', () => { } as any); vi.mocked(fs.readdir).mockResolvedValue([]); - await grepContentTool.execute({ + await grepTool.execute({ directory: 'src', pattern: 'test', }); diff --git a/packages/core/tests/unit/tools/load_description.test.ts b/packages/core/tests/unit/tools/load_description.test.ts index ed6d16b..1d2403d 100644 --- a/packages/core/tests/unit/tools/load_description.test.ts +++ b/packages/core/tests/unit/tools/load_description.test.ts @@ -167,7 +167,7 @@ describe('loadDescription', () => { { tool: 'list_directory', category: 'filesystem' }, { tool: 'create_directory', category: 'filesystem' }, { tool: 'search_files', category: 'filesystem' }, - { tool: 'grep_content', category: 'filesystem' }, + { tool: 'grep', category: 'filesystem' }, { tool: 'get_file_info', category: 'filesystem' }, { tool: 'move_file', category: 'filesystem' }, { tool: 'copy_file', category: 'filesystem' }, diff --git a/packages/core/tests/unit/tools/tool-search.test.ts b/packages/core/tests/unit/tools/tool-search.test.ts index b814ca3..41520e8 100644 --- a/packages/core/tests/unit/tools/tool-search.test.ts +++ b/packages/core/tests/unit/tools/tool-search.test.ts @@ -116,12 +116,12 @@ describe('toolSearchTool', () => { it('搜索结果格式化正确', async () => { vi.mocked(toolRegistry.search).mockReturnValue([ - { name: 'grep_content', description: '搜索文件内容', category: 'filesystem' }, + { name: 'grep', description: '搜索文件内容', category: 'filesystem' }, ] as any); const result = await toolSearchTool.execute({ query: 'grep' }); - expect(result.output).toContain('- grep_content: 搜索文件内容 [filesystem]'); + expect(result.output).toContain('- grep: 搜索文件内容 [filesystem]'); }); it('多个搜索结果正确排列', async () => {