• Will Chen's avatar
    Add stringent search_replace tool for local agent (#2367) · 477015ef
    Will Chen 提交于
    ## Summary
    - Add new `search_replace` tool with strict matching requirements:
      - Requires minimum 3 lines of context for unambiguous matching
      - Enforces exact-only matching (no fuzzy/lenient fallback)
      - Rejects ambiguous matches and identical old/new strings
    - Extend `applySearchReplace` processor with `SearchReplaceOptions`
    interface
    - Update system prompt with file editing tool selection guidelines
    - Add comprehensive unit tests (43 tests) and E2E test
    
    ## Test plan
    - Unit tests: `npm run test -- search_replace` (43 tests passing)
    - E2E tests: `npm run e2e -- --grep "local-agent"` (19 tests passing)
    - Verify lint passes: `npm run fmt && npm run lint && npm run ts`
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    <!-- devin-review-badge-begin -->
    
    ---
    
    <a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2367">
      <picture>
    <source media="(prefers-color-scheme: dark)"
    srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
    <img
    src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
    alt="Open with Devin">
      </picture>
    </a>
    <!-- devin-review-badge-end -->
    
    <!-- CURSOR_SUMMARY -->
    ---
    
    > [!NOTE]
    > Introduces a precise, single-instance `search_replace` tool for local
    agent edits and wires it across stack.
    > 
    > - New `search_replace` tool: strict schema (`file_path`, `old_string`,
    `new_string`), rejects identical/ambiguous matches, streams XML, deploys
    Supabase functions when applicable; registered in `tool_definitions`
    > - Processor overhaul: replace Levenshtein with cascading matching
    (exact → whitespace-tolerant → unicode-normalized), detailed failure
    diagnostics, marker escaping helper, async fs usage
    > - Update `edit_file` schema/usage from `description` → `instructions`
    (tool schema, XML builder, examples)
    > - Prompt: add file-editing tool selection guidance and post-edit
    verification
    > - UI: `DyadSearchReplace` gains `data-testid="dyad-search-replace"`
    for E2E visibility
    > - Tests: comprehensive unit tests for processor and tool, DSL runner
    with pass/fail suites, plus new Playwright E2E and fixtures; snapshots
    updated
    > - Chore: remove `fastest-levenshtein` dependency from
    `package.json`/lockfile
    > 
    > <sup>Written by [Cursor
    Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
    dfa9b9e172e89f135fc71cd1f35f7f3c614b9af4. This will update automatically
    on new commits. Configure
    [here](https://cursor.com/dashboard?tab=bugbot).</sup>
    <!-- /CURSOR_SUMMARY -->
    
    <!-- This is an auto-generated description by cubic. -->
    ---
    ## Summary by cubic
    Adds a strict search_replace tool for precise, single-instance file
    edits by the local agent. Enforces exact matches with ≥3 non-empty lines
    of context and auto-deploys Supabase functions when server functions are
    edited.
    
    - New search_replace tool: exact-only matching, requires ≥3 non-empty
    lines of context, rejects ambiguous matches, and disallows identical
    old/new strings
    - Processor: implement cascading matching passes; add
    SearchReplaceOptions (exactMatchOnly, rejectIdentical) and wire into
    applySearchReplace
    - Prompt: add clear edit-tool selection guidance, post-edit
    verification, and write_file fallback
    - Tests: comprehensive unit tests plus an E2E covering the new tool;
    snapshots updated
    - UI: add data-testid to surface search-replace actions and register the
    tool in definitions
    - Dependencies: remove fastest-levenshtein
    - Edit tool: rename description → instructions in the schema and XML;
    examples and prompt updated
    
    <sup>Written for commit dfa9b9e172e89f135fc71cd1f35f7f3c614b9af4.
    Summary will update on new commits.</sup>
    
    <!-- End of auto-generated description by cubic. -->
    
    ---------
    Co-authored-by: 's avatarClaude Opus 4.5 <noreply@anthropic.com>
    477015ef