From ca5f28f4b393620dc7cad1fc55f1a11137626bd0 Mon Sep 17 00:00:00 2001 From: AI Christianson Date: Tue, 17 Dec 2024 07:32:37 -0500 Subject: [PATCH] initial file_str_replace implementation --- ra_aid/__main__.py | 6 +++-- ra_aid/tools/__init__.py | 4 ++- ra_aid/tools/file_str_replace.py | 46 ++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 ra_aid/tools/file_str_replace.py diff --git a/ra_aid/__main__.py b/ra_aid/__main__.py index 2a1dcfc..9c8da85 100644 --- a/ra_aid/__main__.py +++ b/ra_aid/__main__.py @@ -15,7 +15,8 @@ from ra_aid.tools import ( emit_research_notes, emit_plan, emit_related_files, emit_task, emit_expert_context, get_memory_value, emit_key_facts, delete_key_facts, emit_key_snippets, delete_key_snippets, - emit_research_subtask, request_implementation, read_file_tool, fuzzy_find_project_files, ripgrep_search, list_directory_tree + emit_research_subtask, request_implementation, read_file_tool, fuzzy_find_project_files, ripgrep_search, list_directory_tree, + file_str_replace ) from ra_aid.tools.memory import _global_memory, get_related_files from ra_aid import print_agent_output, print_stage_header, print_task_header, print_error @@ -38,7 +39,8 @@ COMMON_TOOLS = [ delete_key_snippets, read_file_tool, fuzzy_find_project_files, - ripgrep_search + ripgrep_search, + file_str_replace ] # Expert-specific tools diff --git a/ra_aid/tools/__init__.py b/ra_aid/tools/__init__.py index 62b00b3..a5c9385 100644 --- a/ra_aid/tools/__init__.py +++ b/ra_aid/tools/__init__.py @@ -2,6 +2,7 @@ from .shell import run_shell_command from .programmer import run_programming_task from .expert import ask_expert, emit_expert_context from .read_file import read_file_tool +from .file_str_replace import file_str_replace from .fuzzy_find import fuzzy_find_project_files from .list_directory import list_directory_tree from .ripgrep import ripgrep_search @@ -31,5 +32,6 @@ __all__ = [ 'run_shell_command', 'skip_implementation', 'emit_research_subtask', - 'ripgrep_search' + 'ripgrep_search', + 'file_str_replace' ] diff --git a/ra_aid/tools/file_str_replace.py b/ra_aid/tools/file_str_replace.py new file mode 100644 index 0000000..debe583 --- /dev/null +++ b/ra_aid/tools/file_str_replace.py @@ -0,0 +1,46 @@ +from langchain_core.tools import tool +from typing import Dict +from pathlib import Path + +@tool +def file_str_replace( + filepath: str, + old_str: str, + new_str: str +) -> Dict[str, any]: + """Replace an exact string match in a file with a new string. + Only performs replacement if the old string appears exactly once. + + Args: + filepath: Path to the file to modify + old_str: Exact string to replace + new_str: String to replace with + + Returns: + Dict containing: + - success: Whether the operation succeeded + - message: Success confirmation or error details + """ + try: + path = Path(filepath) + if not path.exists(): + return {"success": False, "message": f"File not found: {filepath}"} + + content = path.read_text() + count = content.count(old_str) + + if count == 0: + return {"success": False, "message": f"String not found: {old_str}"} + elif count > 1: + return {"success": False, "message": f"String appears {count} times - must be unique"} + + new_content = content.replace(old_str, new_str) + path.write_text(new_content) + + return { + "success": True, + "message": f"Successfully replaced '{old_str}' with '{new_str}' in {filepath}" + } + + except Exception as e: + return {"success": False, "message": f"Error: {str(e)}"}