From f685582ebe8b6ab79b6baa04f475eb5e0c5d26e1 Mon Sep 17 00:00:00 2001 From: Eneko Ruiz <196690101+eneekoruiz@users.noreply.github.com> Date: Sun, 18 Oct 2026 13:17:36 +0200 Subject: [PATCH] fix: normalize Windows backup filename suffixes --- scripts/lib/inspection.js | 2 +- tests/lib/inspection.test.js | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/scripts/lib/inspection.js b/scripts/lib/inspection.js index 798ff2ce7..8308c6b67 100644 --- a/scripts/lib/inspection.js +++ b/scripts/lib/inspection.js @@ -25,7 +25,7 @@ function normalizeFailureReason(reason) { .replace(/(["'])(?:[a-z]:[\\/]|\\\\)[^\r\n]*?\1/gu, '$1$1') // Directories may contain spaces, but trailing whitespace separates diagnostic prose. // Spaced leaves need an extension before a colon, or quotes; preserve extensionless diagnostics. - .replace(/(?:\b[a-z]:|\\)[\\/](?:[^\\/:*?"<>|\r\n]*[^\s\\/:*?"<>|][\\/])*[^\s\\/:*?"<>|(),;]+(?: [^\\/:*?"<>|\r\n]*\.[\p{L}\p{N}_-]+(?=:))?[\\/]*/gu, '') + .replace(/(?:\b[a-z]:|\\)[\\/](?:[^\\/:*?"<>|\r\n]*[^\s\\/:*?"<>|][\\/])*[^\s\\/:*?"<>|(),;]+(?: [^\\/:*?"<>|\r\n]*\.[^\s\\/:*?"<>|]+(?=:))?[\\/]*/gu, '') // Strip remaining file paths .replace(/(?:\b[a-z]:)?[\\/][\w./\\-]+/g, '') // Collapse whitespace diff --git a/tests/lib/inspection.test.js b/tests/lib/inspection.test.js index 7e92f72aa..d6c806c38 100644 --- a/tests/lib/inspection.test.js +++ b/tests/lib/inspection.test.js @@ -104,6 +104,9 @@ async function runTests() { String.raw`C:\Users\Alice Smith\my file.js`, 'D:/Users/Bob Jones/your script.js', String.raw`\\server\shared files\other task.js`, + String.raw`C:\work\my alpha.js~`, + 'D:/work/my beta.py#', + String.raw`E:\work\my gamma.c++`, ]) { assert.strictEqual(normalizeFailureReason(`${filePath}: permission denied`), ': permission denied'); } @@ -253,6 +256,15 @@ async function runTests() { assert.strictEqual(directoryPatterns.length, 1); assert.strictEqual(directoryPatterns[0].count, 3); assert.strictEqual(generateReport(directoryPatterns).status, 'attention_needed'); + const backupRuns = [ + String.raw`C:\work\my alpha.js~`, + 'D:/work/my beta.js~', + String.raw`\\server\share\my gamma.js~`, + ].map((filePath, index) => makeSkillRun({ id: `backup-${index}`, failureReason: `Cannot open ${filePath}: permission denied` })); + const backupPatterns = detectPatterns(backupRuns); + assert.strictEqual(backupPatterns.length, 1); + assert.strictEqual(backupPatterns[0].count, 3); + assert.strictEqual(generateReport(backupPatterns).status, 'attention_needed'); })) passed += 1; else failed += 1; if (await test('detectPatterns tracks unique session IDs and versions', async () => {