feat: implement fuzzy search and replace functionality with Levenshtein distance

- Added `applySearchReplace` function to handle search and replace operations with fuzzy matching capabilities.
- Introduced tests for various scenarios including fuzzy matching with typos, exact matches, and handling whitespace differences.
- Created a parser for search/replace blocks to facilitate the new functionality.
- Updated prompts for search-replace operations to clarify usage and examples.
- Added utility functions for text normalization and language detection based on file extensions.
- Implemented a minimal stdio MCP server for local testing with tools for adding numbers and printing environment variables.
This commit is contained in:
Kunthawat Greethong
2025-12-05 11:28:57 +07:00
parent 11986a0196
commit d22227bb13
312 changed files with 30787 additions and 2829 deletions

View File

@@ -0,0 +1,49 @@
import { testSkipIfWindows } from "./helpers/test_helper";
testSkipIfWindows("turbo edits v2 - search-replace dump", async ({ po }) => {
await po.setUpDyadPro();
const proModesDialog = await po.openProModesDialog({
location: "home-chat-input-container",
});
await proModesDialog.setTurboEditsMode("search-replace");
await proModesDialog.close();
await po.sendPrompt("[dump]");
await po.snapshotServerDump("request");
await po.snapshotServerDump("all-messages");
});
testSkipIfWindows("turbo edits v2 - search-replace approve", async ({ po }) => {
await po.setUpDyadPro();
const proModesDialog = await po.openProModesDialog({
location: "home-chat-input-container",
});
await proModesDialog.setTurboEditsMode("search-replace");
await proModesDialog.close();
await po.sendPrompt("tc=turbo-edits-v2");
await po.snapshotMessages();
await po.approveProposal();
await po.snapshotAppFiles({
name: "after-search-replace",
files: ["src/pages/Index.tsx"],
});
});
testSkipIfWindows(
"turbo edits v2 - search-replace fallback",
async ({ po }) => {
await po.setUpDyadPro();
const proModesDialog = await po.openProModesDialog({
location: "home-chat-input-container",
});
await proModesDialog.setTurboEditsMode("search-replace");
await proModesDialog.close();
await po.sendPrompt("tc=turbo-edits-v2-trigger-fallback");
await po.snapshotServerDump("request");
await po.snapshotMessages({ replaceDumpPath: true });
await po.approveProposal();
await po.snapshotAppFiles({
name: "after-search-replace-fallback",
files: ["src/pages/Index.tsx"],
});
},
);