File: src/utils.ts L15: export function myFunction() { L22: myFunction.call();
Gemini CLI 文件系统工具
Gemini CLI 提供了一套完整的工具集,用于与本地文件系统进行交互。这些工具允许 Gemini 模型在您的控制下读取、写入、列出、搜索和修改文件及目录,通常在执行敏感操作时会请求确认。
注意: 出于安全考虑,所有文件系统工具都在 rootDirectory(通常是您启动 CLI 时的当前工作目录)内运行。您提供给这些工具的路径通常应为绝对路径,或相对于此根目录解析的相对路径。
1. list_directory (读取文件夹)
list_directory 用于列出指定目录路径下的文件和子目录名称。可选择性地忽略符合特定 glob 模式的条目。
- 工具名称:
list_directory - 显示名称: ReadFolder
- 文件:
ls.ts - 参数:
path(字符串, 必需): 要列出的目录绝对路径。ignore(字符串数组, 可选): 要排除的 glob 模式列表(例如["*.log", ".git"])。respect_git_ignore(布尔值, 可选): 是否在列出文件时遵循.gitignore规则。默认为true。- 行为:
- 返回文件和目录名称列表。
- 标明每个条目是否为目录。
- 排序时目录优先,然后按字母顺序排列。
- 输出 (
llmContent): 类似这样的字符串:Directory listing for /path/to/your/folder:\n[DIR] subfolder1\nfile1.txt\nfile2.png - 确认: 不需要。
- 工具名称:
list_directory - 显示名称: ReadFolder
- 文件:
ls.ts - 参数:
path(字符串, 必需): 要列出的目录绝对路径。ignore(字符串数组, 可选): 要排除的 glob 模式列表(例如["*.log", ".git"])。respect_git_ignore(布尔值, 可选): 是否在列出文件时遵循.gitignore规则。默认为true。- 行为:
- 返回文件和目录名称列表。
- 标明每个条目是否为目录。
- 排序时目录优先,然后按字母顺序排列。
- 输出 (
llmContent): 类似这样的字符串:Directory listing for /path/to/your/folder:\n[DIR] subfolder1\nfile1.txt\nfile2.png - 确认: 不需要。
2. read_file (读取文件)
read_file 用于读取并返回指定文件的内容。该工具支持处理文本文件、图片文件(PNG、JPG、GIF、WEBP、SVG、BMP)以及PDF文件。对于文本文件,可以读取特定的行范围。其他二进制文件类型通常会被跳过。
- 工具名称:
read_file - 显示名称: ReadFile
- 文件:
read-file.ts - 参数:
path(字符串, 必需): 要读取文件的绝对路径offset(数字, 可选): 对于文本文件,指定从0开始的行号作为读取起点。需要同时设置limit参数limit(数字, 可选): 对于文本文件,指定要读取的最大行数。如果省略,则读取默认最大值(如2000行)或在可行情况下读取整个文件- 行为:
- 对于文本文件: 返回文件内容。如果使用了
offset和limit,则只返回该行范围的内容。会标明内容是否因行数限制或行长度限制而被截断 - 对于图片和PDF文件: 返回文件内容的base64编码数据结构,适合模型使用
- 对于其他二进制文件: 尝试识别并跳过它们,返回表明这是通用二进制文件的消息
- 输出: (
llmContent): - 对于文本文件: 文件内容,可能带有截断信息前缀(例如
[文件内容截断: 显示500行中的1-100行...]\n实际文件内容...) - 对于图片/PDF文件: 包含
inlineData的对象,其中有mimeType和base64编码的data(例如{ inlineData: { mimeType: 'image/png', data: 'base64encodedstring' } }) - 对于其他二进制文件: 类似
无法显示二进制文件内容: /path/to/data.bin的消息 - 确认: 不需要
- 工具名称:
read_file - 显示名称: ReadFile
- 文件:
read-file.ts - 参数:
path(字符串, 必需): 要读取文件的绝对路径offset(数字, 可选): 对于文本文件,指定从0开始的行号作为读取起点。需要同时设置limit参数limit(数字, 可选): 对于文本文件,指定要读取的最大行数。如果省略,则读取默认最大值(如2000行)或在可行情况下读取整个文件- 行为:
- 对于文本文件: 返回文件内容。如果使用了
offset和limit,则只返回该行范围的内容。会标明内容是否因行数限制或行长度限制而被截断 - 对于图片和PDF文件: 返回文件内容的base64编码数据结构,适合模型使用
- 对于其他二进制文件: 尝试识别并跳过它们,返回表明这是通用二进制文件的消息
- 输出: (
llmContent): - 对于文本文件: 文件内容,可能带有截断信息前缀(例如
[文件内容截断: 显示500行中的1-100行...]\n实际文件内容...) - 对于图片/PDF文件: 包含
inlineData的对象,其中有mimeType和base64编码的data(例如{ inlineData: { mimeType: 'image/png', data: 'base64encodedstring' } }) - 对于其他二进制文件: 类似
无法显示二进制文件内容: /path/to/data.bin的消息 - 确认: 不需要
3. write_file (写入文件)
write_file 将内容写入指定文件。如果文件已存在,将会被覆盖;如果文件不存在,则会创建该文件(以及所有必要的父目录)。
- 工具名称:
write_file - 显示名称: WriteFile
- 文件:
write-file.ts - 参数:
file_path(字符串, 必需): 要写入文件的绝对路径。content(字符串, 必需): 要写入文件的内容。- 行为:
- 将提供的
content写入file_path。 - 如果父目录不存在,会自动创建。
- 输出 (
llmContent): 成功消息,例如成功覆盖文件: /path/to/your/file.txt或成功创建并写入新文件: /path/to/new/file.txt。 - 确认: 需要。在写入前会显示变更差异并请求用户确认。
- 工具名称:
write_file - 显示名称: WriteFile
- 文件:
write-file.ts - 参数:
file_path(字符串, 必需): 要写入文件的绝对路径。content(字符串, 必需): 要写入文件的内容。- 行为:
- 将提供的
content写入file_path。 - 如果父目录不存在,会自动创建。
- 输出 (
llmContent): 成功消息,例如成功覆盖文件: /path/to/your/file.txt或成功创建并写入新文件: /path/to/new/file.txt。 - 确认: 需要。在写入前会显示变更差异并请求用户确认。
4. glob (文件查找工具)
glob 用于查找匹配特定 glob 模式的文件(例如 src/**/*.ts、*.md),返回按修改时间排序的绝对路径(最新修改的文件在前)。
- 工具名称:
glob - 显示名称: FindFiles
- 文件:
glob.ts - 参数:
pattern(字符串, 必填): 用于匹配的 glob 模式(如"*.py"、"src/**/*.js")。path(字符串, 可选): 要搜索的目录绝对路径。如果省略,则搜索工具的根目录。case_sensitive(布尔值, 可选): 搜索是否区分大小写。默认为false。respect_git_ignore(布尔值, 可选): 查找文件时是否遵循 .gitignore 规则。默认为true。- 行为:
- 在指定目录中搜索匹配 glob 模式的文件。
- 返回按修改时间排序的绝对路径列表(最新修改的文件在前)。
- 默认忽略常见干扰目录如
node_modules和.git。 - 输出 (
llmContent): 类似这样的消息:在 src 目录下找到 5 个匹配 "*.ts" 的文件,按修改时间排序(最新在前):\nsrc/file1.ts\nsrc/subdir/file2.ts... - 确认: 不需要。
- 工具名称:
glob - 显示名称: FindFiles
- 文件:
glob.ts - 参数:
pattern(字符串, 必填): 用于匹配的 glob 模式(如"*.py"、"src/**/*.js")。path(字符串, 可选): 要搜索的目录绝对路径。如果省略,则搜索工具的根目录。case_sensitive(布尔值, 可选): 搜索是否区分大小写。默认为false。respect_git_ignore(布尔值, 可选): 查找文件时是否遵循 .gitignore 规则。默认为true。- 行为:
- 在指定目录中搜索匹配 glob 模式的文件。
- 返回按修改时间排序的绝对路径列表(最新修改的文件在前)。
- 默认忽略常见干扰目录如
node_modules和.git。 - 输出 (
llmContent): 类似这样的消息:在 src 目录下找到 5 个匹配 "*.ts" 的文件,按修改时间排序(最新在前):\nsrc/file1.ts\nsrc/subdir/file2.ts... - 确认: 不需要。
5. search_file_content (搜索文本)
search_file_content 用于在指定目录的文件内容中搜索正则表达式模式。可以通过 glob 模式过滤文件。返回包含匹配项的行及其文件路径和行号。
- 工具名称:
search_file_content - 显示名称: SearchText
- 文件:
grep.ts - 参数:
pattern(string, 必填): 要搜索的正则表达式 (例如"function\s+myFunction")path(string, 可选): 要搜索的目录绝对路径。默认为当前工作目录include(string, 可选): 用于过滤搜索文件的 glob 模式 (例如"*.js","src/**/*.{ts,tsx}")。如果省略,则搜索大多数文件 (遵循常见的忽略规则)- 行为:
- 在 Git 仓库中优先使用
git grep以提高速度,否则回退到系统grep或基于 JavaScript 的搜索 - 返回匹配行的列表,每行前缀包含其文件路径 (相对于搜索目录) 和行号
- 输出 (
llmContent): 格式化的匹配结果字符串,例如: - 确认: 不需要
- 确认: 不需要
6. replace (编辑)
replace 用于替换文件中的文本。默认情况下只替换单个匹配项,但可以通过指定 expected_replacements 参数来替换多个匹配项。该工具专为精确、有针对性的修改设计,需要围绕 old_string 提供充分的上下文以确保修改位置正确。
- 工具名称:
replace - 显示名称: 编辑
- 文件:
edit.ts -
参数:
-
file_path(字符串, 必填): 要修改文件的绝对路径。 -
old_string(字符串, 必填): 需要替换的精确文本。关键要求: 该字符串必须能唯一标识要修改的单个实例。应至少包含目标文本前后各3行的上下文,且需精确匹配空白字符和缩进。如果
old_string为空,工具将尝试在file_path创建新文件并将new_string作为内容。 -
new_string(字符串, 必填): 用于替换old_string的精确文本。 -
expected_replacements(数字, 可选): 需要替换的匹配项数量。默认为1。 -
行为:
- 如果
old_string为空且file_path不存在,则创建新文件并将new_string作为内容。 - 如果提供了
old_string,工具会读取file_path并尝试找到恰好一个匹配项。 - 如果找到一个匹配项,则用
new_string替换它。 - 增强可靠性(多阶段编辑校正): 为了显著提高编辑成功率,特别是当模型提供的
old_string可能不够精确时,工具采用了多阶段编辑校正机制。- 如果初始
old_string未找到或匹配多个位置,工具可以利用 Gemini 模型迭代优化old_string(可能还包括new_string)。 - 这个自我校正过程会尝试识别模型真正想要修改的唯一片段,使得
replace操作即使在初始上下文略有瑕疵时也能更稳健。
- 如果初始
- 失败条件: 即使有校正机制,工具仍会在以下情况失败:
file_path不是绝对路径或超出根目录范围。old_string非空但file_path不存在。old_string为空但file_path已存在。- 尝试校正后仍未在文件中找到
old_string。 - 找到多个
old_string匹配项且自我校正机制无法确定唯一匹配。 - 输出 (
llmContent): - 成功时:
成功修改文件: /path/to/file.txt (替换了1处)。或已创建新文件: /path/to/new_file.txt 并写入内容。 - 失败时: 解释原因的报错信息 (如
编辑失败,未找到匹配项...,编辑失败,预期1处匹配但找到2处...)。 - 确认: 需要。在写入文件前会显示变更差异并请求用户确认。
这些文件系统工具为 Gemini CLI 提供了理解和交互本地项目环境的基础能力。