Skip to main content

write_to_file

write_to_file 工具用于创建新文件或完全替换现有文件内容,并提供交互式审批流程。在应用更改之前,它会提供差异视图供用户审查。


参数

该工具接受以下参数:

  • path(必需):要写入的文件的路径,相对于当前工作目录
  • content(必需):要写入文件的完整内容
  • line_count(必需):文件中的行数,包括空行

功能说明

此工具将内容写入指定文件,如果文件不存在则创建新文件,如果文件已存在则完全覆盖。所有更改都需要通过差异视图界面进行显式用户审批,用户可以在应用更改之前审查和编辑建议的更改。


使用场景

  • 当 Roo 需要从头开始创建新文件时
  • 当 Roo 需要完全重写现有文件时
  • 当为新项目创建多个文件时
  • 当生成配置文件、文档或源代码时
  • 当您需要在应用更改之前审查更改时

主要特性

  • 交互式审批:在差异视图中显示更改,需要显式审批才能应用
  • 用户编辑支持:允许在最终审批前编辑建议的内容
  • 安全措施:检测代码遗漏、验证路径并防止内容截断
  • 编辑器集成:打开差异视图并自动滚动到第一个差异处
  • 内容预处理:处理不同 AI 模型生成的内容,确保内容清洁
  • 访问控制:在更改前根据 .rooignore 限制进行验证
  • 父目录处理:可能通过系统依赖处理目录创建
  • 完全替换:在单个操作中提供完全转换的文件

局限性

  • 不适用于现有文件:对于修改现有文件,比 apply_diff 慢得多且效率更低
  • 大文件性能:随着文件变大,操作速度显著变慢
  • 完全覆盖:替换整个文件内容,无法保留原始内容
  • 需要行数:需要准确的行数来检测潜在的内容截断
  • 审查开销:审批流程比直接编辑增加了额外步骤
  • 仅限交互:不能用于需要非交互式执行的自动化工作流

工作原理

当调用 write_to_file 工具时,它会遵循以下流程:

  1. 参数验证:验证必需参数和权限

    • 检查是否提供了 pathcontentline_count
    • 如果 line_count 缺失/无效,则还原任何差异视图更改并返回错误,建议替代工具(如修改现有文件时使用 apply_diff 等)
    • 验证文件是否被允许(不受 .rooignore 限制)
    • 确保路径在工作空间边界内
    • 跟踪连续错误计数(针对缺失参数)
    • 为每个验证失败显示特定错误消息
  2. 内容预处理

    • 移除 AI 模型可能添加的代码块标记
    • 处理转义的 HTML 实体(特别是非 Claude 模型)
    • 如果内容中意外包含行号则去除
    • 对不同 AI 提供商执行特定于模型的处理
  3. 差异视图生成

    • 在编辑器中打开显示建议更改的差异视图
    • 添加 300ms 延迟以确保 UI 响应性
    • 自动滚动到第一个差异处
    • 高亮显示更改以便于审查
  4. 用户审批流程

    • 等待显式用户审批才能继续
    • 允许用户在差异视图中编辑内容
    • 捕获任何用户编辑作为最终内容
    • 提供完全拒绝更改的选项
    • 检测并将用户修改纳入最终结果
  5. 安全验证

    • 通过比较提供的行数检测潜在的内容截断
    • 如果内容似乎不完整则显示警告
    • 验证文件路径和访问权限
    • 特别检查工作空间外的文件(使用 isOutsideWorkspace 标志)
  6. 文件写入

    • 将审批的内容(包含任何用户编辑)写入文件
    • 提供写入成功的确认
    • 成功时重置连续错误计数器

使用示例场景

  • 创建新项目时,Roo 会生成多个文件,但允许您在提交更改前审查每个文件。
  • 设置配置文件时,Roo 会在差异视图中显示建议的配置以供审批。
  • 生成文档时,Roo 会创建 markdown 文件,但允许您在差异视图中进行最终调整。
  • 开发原型时,Roo 会在差异视图中显示完整的源文件,您可以在保存前进行微调。

使用示例

创建新的 JSON 配置文件:

<write_to_file>
<path>config/settings.json</path>
<content>
{
"apiEndpoint": "https://api.example.com",
"theme": {
"primaryColor": "#007bff",
"secondaryColor": "#6c757d",
"fontFamily": "Arial, sans-serif"
},
"features": {
"darkMode": true,
"notifications": true,
"analytics": false
},
"version": "1.0.0"
}
</content>
<line_count>14</line_count>
</write_to_file>

创建简单的 HTML 文件:

<write_to_file>
<path>src/index.html</path>
<content>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Application</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div id="app"></div>
<script src="app.js"></script>
</body>
</html>
</content>
<line_count>13</line_count>
</write_to_file>

创建 JavaScript 模块:

<write_to_file>
<path>src/utils/helpers.js</path>
<content>
/**
* Utility functions for the application
*/

export function formatDate(date) {
return new Date(date).toLocaleDateString();
}

export function calculateTotal(items) {
return items.reduce((sum, item) => sum + item.price, 0);
}

export function debounce(func, delay) {
let timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), delay);
};
}
</content>
<line_count>18</line_count>
</write_to_file>