-
由 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:Claude Opus 4.5 <noreply@anthropic.com>