• 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
名称
最后提交
最后更新
..
AgentConsentBanner.tsx 正在载入提交数据...
AttachmentsList.tsx 正在载入提交数据...
AuxiliaryActionsMenu.tsx 正在载入提交数据...
ChatActivity.tsx 正在载入提交数据...
ChatError.tsx 正在载入提交数据...
ChatErrorBox.tsx 正在载入提交数据...
ChatHeader.tsx 正在载入提交数据...
ChatInput.tsx 正在载入提交数据...
ChatMessage.tsx 正在载入提交数据...
CodeHighlight.tsx 正在载入提交数据...
ContextLimitBanner.tsx 正在载入提交数据...
DeleteChatDialog.tsx 正在载入提交数据...
DragDropOverlay.tsx 正在载入提交数据...
DyadAddDependency.tsx 正在载入提交数据...
DyadAddIntegration.tsx 正在载入提交数据...
DyadCodeSearch.tsx 正在载入提交数据...
DyadCodeSearchResult.tsx 正在载入提交数据...
DyadCodebaseContext.tsx 正在载入提交数据...
DyadDatabaseSchema.tsx 正在载入提交数据...
DyadDelete.tsx 正在载入提交数据...
DyadEdit.tsx 正在载入提交数据...
DyadExecuteSql.tsx 正在载入提交数据...
DyadGrep.tsx 正在载入提交数据...
DyadListFiles.tsx 正在载入提交数据...
DyadLogs.tsx 正在载入提交数据...
DyadMarkdownParser.tsx 正在载入提交数据...
DyadMcpToolCall.tsx 正在载入提交数据...
DyadMcpToolResult.tsx 正在载入提交数据...
DyadOutput.tsx 正在载入提交数据...
DyadProblemSummary.tsx 正在载入提交数据...
DyadRead.tsx 正在载入提交数据...
DyadRename.tsx 正在载入提交数据...
DyadSearchReplace.tsx 正在载入提交数据...
DyadStatus.tsx 正在载入提交数据...
DyadSupabaseProjectInfo.tsx 正在载入提交数据...
DyadSupabaseTableSchema.tsx 正在载入提交数据...
DyadThink.tsx 正在载入提交数据...
DyadTokenSavings.tsx 正在载入提交数据...
DyadWebCrawl.tsx 正在载入提交数据...
DyadWebSearch.tsx 正在载入提交数据...
DyadWebSearchResult.tsx 正在载入提交数据...
DyadWrite.tsx 正在载入提交数据...
FileAttachmentDropdown.tsx 正在载入提交数据...
FixAllErrorsButton.tsx 正在载入提交数据...
HomeChatInput.tsx 正在载入提交数据...
LexicalChatInput.tsx 正在载入提交数据...
MessagesList.tsx 正在载入提交数据...
PromoMessage.tsx 正在载入提交数据...
RenameChatDialog.tsx 正在载入提交数据...
SelectedComponentDisplay.tsx 正在载入提交数据...
SummarizeInNewChatButton.tsx 正在载入提交数据...
TodoList.tsx 正在载入提交数据...
TokenBar.tsx 正在载入提交数据...
UncommittedFilesBanner.tsx 正在载入提交数据...
VersionPane.tsx 正在载入提交数据...
monaco.ts 正在载入提交数据...
stateTypes.ts 正在载入提交数据...
types.d.ts 正在载入提交数据...