Edits files by replacing text, creating new files, or deleting content. For moving/renaming use Bash 'mv'. For large edits use Write tool.
1. Use View tool to understand file contents and context 2. For new files: Use LS tool to verify parent directory exists 3. **CRITICAL**: Note exact whitespace, indentation, and formatting from View output 1. file_path: Absolute path to file (required) 2. old_string: Text to replace (must match exactly including whitespace/indentation) 3. new_string: Replacement text 4. replace_all: Replace all occurrences (default false)<special_cases>
- Create file: provide file_path + new_string, leave old_string empty
 - Delete content: provide file_path + old_string, leave new_string empty </special_cases>
 
<critical_requirements> EXACT MATCHING: The tool is extremely literal. Text must match EXACTLY
- Every space and tab character
 - Every blank line
 - Every newline character
 - Indentation level (count the spaces/tabs)
 - Comment spacing (
// commentvs//comment) - Brace positioning (
func() {vsfunc(){) 
Common failures:
Expected: "    func foo() {"     (4 spaces)
Provided: "  func foo() {"       (2 spaces) ❌ FAILS
Expected: "}\n\nfunc bar() {"    (2 newlines)
Provided: "}\nfunc bar() {"      (1 newline) ❌ FAILS
Expected: "// Comment"           (space after //)
Provided: "//Comment"            (no space) ❌ FAILS
UNIQUENESS (when replace_all=false): old_string MUST uniquely identify target instance
- Include 3-5 lines context BEFORE and AFTER change point
 - Include exact whitespace, indentation, surrounding code
 - If text appears multiple times, add more context to make it unique
 
SINGLE INSTANCE: Tool changes ONE instance when replace_all=false
- For multiple instances: set replace_all=true OR make separate calls with unique context
 - Plan calls carefully to avoid conflicts
 
VERIFICATION BEFORE USING: Before every edit
- View the file and locate exact target location
 - Check how many instances of target text exist
 - Copy the EXACT text including all whitespace
 - Verify you have enough context for unique identification
 - Double-check indentation matches (count spaces/tabs)
 - Plan separate calls or use replace_all for multiple changes </critical_requirements>
 
<recovery_steps> If you get "old_string not found in file":
- View the file again at the specific location
 - Copy more context - include entire function if needed
 - Check whitespace:
- Count indentation spaces/tabs
 - Look for blank lines
 - Check for trailing spaces
 
 - Verify character-by-character that your old_string matches
 - Never guess - always View the file to get exact text </recovery_steps>
 
<best_practices>
- Ensure edits result in correct, idiomatic code
 - Don't leave code in broken state
 - Use absolute file paths (starting with /)
 - Use forward slashes (/) for cross-platform compatibility
 - Multiple edits to same file: send all in single message with multiple tool calls
 - When in doubt, include MORE context rather than less
 - Match the existing code style exactly (spaces, tabs, blank lines) </best_practices>
 
<whitespace_checklist> Before submitting an edit, verify:
- Viewed the file first
 - Counted indentation spaces/tabs
 - Included blank lines if they exist
 - Matched brace/bracket positioning
 - Included 3-5 lines of surrounding context
 - Verified text appears exactly once (or using replace_all)
 - Copied text character-for-character, not approximated </whitespace_checklist>
 
old_string: "func ProcessData(input string) error {\n    if input == \"\" {\n        return errors.New(\"empty input\")\n    }\n    return nil\n}"
new_string: "func ProcessData(input string) error {\n    if input == \"\" {\n        return errors.New(\"empty input\")\n    }\n    // New validation\n    if len(input) > 1000 {\n        return errors.New(\"input too long\")\n    }\n    return nil\n}"
❌ Incorrect: Not enough context
old_string: "return nil"  // Appears many times!
❌ Incorrect: Wrong indentation
old_string: "  if input == \"\" {"  // 2 spaces
// But file actually has:        "    if input == \"\" {"  // 4 spaces
✅ Correct: Including context to make unique
old_string: "func ProcessData(input string) error {\n    if input == \"\" {\n        return errors.New(\"empty input\")\n    }\n    return nil"
<windows_notes>
- Forward slashes work throughout (C:/path/file)
 - File permissions handled automatically
 - Line endings converted automatically (\n ↔ \r\n) </windows_notes>