// tools/write.rs — Write file contents use anyhow::{Context, Result}; use serde_json::json; use std::path::Path; use crate::types::ToolDef; pub fn definition() -> ToolDef { ToolDef::new( "write_file", "Write content to a file. Creates the file if it doesn't exist, \ overwrites if it does. Creates parent directories as needed.", json!({ "type": "object", "properties": { "file_path": { "type": "string", "description": "Absolute path to the file to write" }, "content": { "type": "string", "description": "The content to write to the file" } }, "required": ["file_path", "content"] }), ) } pub fn write_file(args: &serde_json::Value) -> Result { let path = args["file_path"] .as_str() .context("file_path is required")?; let content = args["content"].as_str().context("content is required")?; // Create parent directories if needed if let Some(parent) = Path::new(path).parent() { std::fs::create_dir_all(parent) .with_context(|| format!("Failed to create directories for {}", path))?; } std::fs::write(path, content).with_context(|| format!("Failed to write {}", path))?; let line_count = content.lines().count(); Ok(format!("Wrote {} lines to {}", line_count, path)) }