From 72e529d73be0bf522da877c9fe947913b7f34aef Mon Sep 17 00:00:00 2001 From: Chai Landau Date: Fri, 21 Aug 2026 16:07:22 -0400 Subject: [PATCH] Ignore deleted headerless diff paths --- .changeset/calm-diffs-rest.md | 5 +++++ packages/ghost/src/review/diff.ts | 9 +++++--- packages/ghost/test/review-diff.test.ts | 28 +++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 .changeset/calm-diffs-rest.md create mode 100644 packages/ghost/test/review-diff.test.ts diff --git a/.changeset/calm-diffs-rest.md b/.changeset/calm-diffs-rest.md new file mode 100644 index 00000000..a89a38cd --- /dev/null +++ b/.changeset/calm-diffs-rest.md @@ -0,0 +1,5 @@ +--- +"@design-intelligence/ghost": patch +--- + +Prevent review packets from treating deleted files as a `dev/null` material. diff --git a/packages/ghost/src/review/diff.ts b/packages/ghost/src/review/diff.ts index 364eb05a..8ee1cb25 100644 --- a/packages/ghost/src/review/diff.ts +++ b/packages/ghost/src/review/diff.ts @@ -27,10 +27,13 @@ export function parseTouchedFiles(diffText: string): TouchedFile[] { current = { path: gitHeader[2], start: i }; continue; } - const plusPlus = line.match(/^\+\+\+ b?\/?(.+)$/); + const plusPlus = line.match(/^\+\+\+ (.+)$/); if (plusPlus && current === null) { - const p = plusPlus[1].trim(); - if (p !== "/dev/null") current = { path: p, start: i }; + const destination = plusPlus[1].trim(); + if (destination !== "/dev/null") { + const path = destination.replace(/^b\//, ""); + current = { path, start: i }; + } } } flush(lines.length); diff --git a/packages/ghost/test/review-diff.test.ts b/packages/ghost/test/review-diff.test.ts new file mode 100644 index 00000000..ecb9484f --- /dev/null +++ b/packages/ghost/test/review-diff.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from "vitest"; +import { parseTouchedFiles } from "../src/review/diff.js"; + +describe("parseTouchedFiles", () => { + it("ignores deleted files in headerless unified diffs", () => { + const diff = [ + "--- a/brand/logo.svg", + "+++ /dev/null", + "@@ -1 +0,0 @@", + "-old logo", + ].join("\n"); + + expect(parseTouchedFiles(diff)).toEqual([]); + }); + + it("keeps destination paths in headerless unified diffs", () => { + const diff = [ + "--- /dev/null", + "+++ b/brand/logo.svg", + "@@ -0,0 +1 @@", + "+new logo", + ].join("\n"); + + expect(parseTouchedFiles(diff)).toEqual([ + { path: "brand/logo.svg", patch: diff.split("\n").slice(1).join("\n") }, + ]); + }); +});