summaryrefslogtreecommitdiffhomepage
path: root/lib/dispatch/tool/files/write_file.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/dispatch/tool/files/write_file.rb')
-rw-r--r--lib/dispatch/tool/files/write_file.rb43
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/dispatch/tool/files/write_file.rb b/lib/dispatch/tool/files/write_file.rb
new file mode 100644
index 0000000..218c310
--- /dev/null
+++ b/lib/dispatch/tool/files/write_file.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module Dispatch
+ module Tool
+ module Files
+ WRITE_FILE = Dispatch::Tools::Definition.new(
+ name: "write_file",
+ description: "Write or overwrite a file with the given content. Creates parent directories if needed.",
+ parameters: {
+ type: "object",
+ properties: {
+ path: {
+ type: "string",
+ description: "Path to the file to write, relative to the worktree root."
+ },
+ content: {
+ type: "string",
+ description: "The content to write to the file."
+ }
+ },
+ required: %w[path content],
+ additionalProperties: false
+ }
+ ) do |params, context|
+ worktree_path = context[:worktree_path]
+ path = params[:path]
+ content = params[:content]
+
+ resolved = begin
+ Sandbox.resolve_path(path, worktree_path:)
+ rescue SandboxError => e
+ next Dispatch::Tools::Result.failure(error: e.message)
+ end
+
+ FileUtils.mkdir_p(File.dirname(resolved))
+ File.write(resolved, content)
+
+ byte_count = content.bytesize
+ Dispatch::Tools::Result.success(output: "Wrote #{byte_count} bytes to #{path}")
+ end
+ end
+ end
+end