diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c54636..05177c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Roo Cline Changelog +## [2.1.18] + +- Diff editing bugfix to handle Windows line endings + ## [2.1.17] - Switch to search/replace diffs in experimental diff editing mode diff --git a/README.md b/README.md index 99eb561..28767e9 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ A fork of Cline, an autonomous coding agent, with some added experimental config - Unit test coverage (written almost entirely by Roo Cline!) - Support for playing sound effects - Support for OpenRouter compression -- Support for editing through diffs (very experimental) - Support for gemini-exp-1206 - Support for copying prompts from the history screen +- Support for editing through diffs / handling truncated full-file edits Here's an example of Roo-Cline autonomously creating a snake game with "Always approve write operations" and "Always approve browser actions" turned on: diff --git a/package-lock.json b/package-lock.json index e1825d7..ac4846b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "roo-cline", - "version": "2.1.17", + "version": "2.1.18", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "roo-cline", - "version": "2.1.17", + "version": "2.1.18", "dependencies": { "@anthropic-ai/bedrock-sdk": "^0.10.2", "@anthropic-ai/sdk": "^0.26.0", diff --git a/package.json b/package.json index 12b9696..9fc47ba 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "displayName": "Roo Cline", "description": "A fork of Cline, an autonomous coding agent, with some added experimental configuration and automation features.", "publisher": "RooVeterinaryInc", - "version": "2.1.17", + "version": "2.1.18", "icon": "assets/icons/rocket.png", "galleryBanner": { "color": "#617A91", diff --git a/src/core/diff/strategies/__tests__/search-replace.test.ts b/src/core/diff/strategies/__tests__/search-replace.test.ts index 644defc..1d86322 100644 --- a/src/core/diff/strategies/__tests__/search-replace.test.ts +++ b/src/core/diff/strategies/__tests__/search-replace.test.ts @@ -181,6 +181,23 @@ function test() { expect(result).toBe("\tfunction test() {\n\t\t// First comment\n\t\t// Second comment\n\t\treturn true;\n\t}") }) + it('should handle Windows-style CRLF line endings', () => { + const originalContent = "function test() {\r\n return true;\r\n}\r\n" + const diffContent = `test.ts +<<<<<<< SEARCH +function test() { + return true; +} +======= +function test() { + return false; +} +>>>>>>> REPLACE` + + const result = strategy.applyDiff(originalContent, diffContent) + expect(result).toBe("function test() {\r\n return false;\r\n}\r\n") + }) + it('should return false if search content does not match', () => { const originalContent = `function hello() { console.log("hello") diff --git a/src/core/diff/strategies/search-replace.ts b/src/core/diff/strategies/search-replace.ts index 37bc57a..d871a06 100644 --- a/src/core/diff/strategies/search-replace.ts +++ b/src/core/diff/strategies/search-replace.ts @@ -70,10 +70,13 @@ Your search/replace content here const [_, searchContent, replaceContent] = match; - // Split content into lines - const searchLines = searchContent.trim().split('\n'); - const replaceLines = replaceContent.trim().split('\n'); - const originalLines = originalContent.split('\n'); + // Detect line ending from original content + const lineEnding = originalContent.includes('\r\n') ? '\r\n' : '\n'; + + // Split content into lines, handling both \n and \r\n + const searchLines = searchContent.trim().split(/\r?\n/); + const replaceLines = replaceContent.trim().split(/\r?\n/); + const originalLines = originalContent.split(/\r?\n/); // Find the search content in the original let matchIndex = -1; @@ -166,6 +169,6 @@ Your search/replace content here const beforeMatch = originalLines.slice(0, matchIndex); const afterMatch = originalLines.slice(matchIndex + searchLines.length); - return [...beforeMatch, ...indentedReplace, ...afterMatch].join('\n'); + return [...beforeMatch, ...indentedReplace, ...afterMatch].join(lineEnding); } -} \ No newline at end of file +} diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 0aaae53..acff00c 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -296,7 +296,7 @@ const SettingsView = ({ onDone }: SettingsViewProps) => {
setDiffEnabled(e.target.checked)}> - Enable editing through diffs (very experimental!) + Enable editing through diffs