From f2292d2d19a066b37f78e03fa97d3cd0792e5586 Mon Sep 17 00:00:00 2001 From: Yufeng He <40085740+he-yufeng@users.noreply.github.com> Date: Sat, 23 May 2026 23:54:26 +0800 Subject: [PATCH] fix: preserve literal dollars in filesystem edits --- src/filesystem/__tests__/lib.test.ts | 16 ++++++++++++++++ src/filesystem/lib.ts | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/filesystem/__tests__/lib.test.ts b/src/filesystem/__tests__/lib.test.ts index f7e585af22..a38a21fd8d 100644 --- a/src/filesystem/__tests__/lib.test.ts +++ b/src/filesystem/__tests__/lib.test.ts @@ -451,6 +451,22 @@ describe('Lib Functions', () => { expect(mockFs.writeFile).not.toHaveBeenCalled(); }); + it('treats dollar signs in replacement text literally', async () => { + const edits = [ + { oldText: 'line2', newText: '$$100 $& value' } + ]; + + mockFs.rename.mockResolvedValueOnce(undefined); + + await applyFileEdits('/test/file.txt', edits, false); + + expect(mockFs.writeFile).toHaveBeenCalledWith( + expect.stringMatching(/\/test\/file\.txt\.[a-f0-9]+\.tmp$/), + 'line1\n$$100 $& value\nline3\n', + 'utf-8' + ); + }); + it('applies multiple edits sequentially', async () => { const edits = [ { oldText: 'line1', newText: 'first line' }, diff --git a/src/filesystem/lib.ts b/src/filesystem/lib.ts index 17e4654cd5..ce4af9f38a 100644 --- a/src/filesystem/lib.ts +++ b/src/filesystem/lib.ts @@ -207,7 +207,7 @@ export async function applyFileEdits( // If exact match exists, use it if (modifiedContent.includes(normalizedOld)) { - modifiedContent = modifiedContent.replace(normalizedOld, normalizedNew); + modifiedContent = modifiedContent.replace(normalizedOld, () => normalizedNew); continue; }