Add stringent search_replace tool for local agent (#2367)
## 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>
正在显示
| ... | @@ -100,7 +100,6 @@ | ... | @@ -100,7 +100,6 @@ |
| "electron-playwright-helpers": "^2.1.0", | "electron-playwright-helpers": "^2.1.0", | ||
| "electron-squirrel-startup": "^1.0.1", | "electron-squirrel-startup": "^1.0.1", | ||
| "esbuild-register": "^3.6.0", | "esbuild-register": "^3.6.0", | ||
| "fastest-levenshtein": "^1.0.16", | |||
| "fix-path": "^4.0.0", | "fix-path": "^4.0.0", | ||
| "framer-motion": "^12.6.3", | "framer-motion": "^12.6.3", | ||
| "geist": "^1.3.1", | "geist": "^1.3.1", | ||
| ... | ... |
请
注册
或者
登录
后发表评论