From aa81ee7ece91ab58b511ea49edb64e28164e6a2c Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 9 Aug 2026 15:46:05 +0000 Subject: [PATCH 1/2] fix: exclude git-ignored files from staged snapshot divergence check Co-authored-by: Skosh --- .../parse-staged-snapshot-divergences.ts | 2 +- .../find-staged-snapshot-divergences.test.ts | 24 +++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/react-doctor/src/cli/utils/parse-staged-snapshot-divergences.ts b/packages/react-doctor/src/cli/utils/parse-staged-snapshot-divergences.ts index 830185dd80..5403044afb 100644 --- a/packages/react-doctor/src/cli/utils/parse-staged-snapshot-divergences.ts +++ b/packages/react-doctor/src/cli/utils/parse-staged-snapshot-divergences.ts @@ -22,7 +22,7 @@ export const parseStagedSnapshotDivergences = (statusOutput: string): ReadonlyAr const sourcePath = hasRenameOrCopySource ? statusEntries[entryIndex + 1] : undefined; const worktreePaths = worktreeStatus === "R" || worktreeStatus === "C" ? [filePath, sourcePath] : [filePath]; - if (worktreeStatus !== " ") { + if (worktreeStatus !== " " && worktreeStatus !== "!") { for (const worktreePath of worktreePaths) { if (worktreePath && SNAPSHOT_CONFIG_FILENAMES.has(path.basename(worktreePath))) { divergentConfigFiles.add(worktreePath); diff --git a/packages/react-doctor/tests/find-staged-snapshot-divergences.test.ts b/packages/react-doctor/tests/find-staged-snapshot-divergences.test.ts index f832e71e5b..c8c1aa3c72 100644 --- a/packages/react-doctor/tests/find-staged-snapshot-divergences.test.ts +++ b/packages/react-doctor/tests/find-staged-snapshot-divergences.test.ts @@ -74,18 +74,24 @@ describe("findStagedSnapshotDivergences", () => { ]); }); - it("reports ordinary and ignored untracked configuration", () => { + it("reports ordinary untracked configuration", () => { const directory = createRepository(); - fs.writeFileSync(path.join(directory, ".gitignore"), "next.config.mjs\n"); + fs.writeFileSync(path.join(directory, "eslint.config.mjs"), "export default [];\n"); + + expect(findStagedSnapshotDivergences(directory)).toEqual(["eslint.config.mjs"]); + }); + + it("accepts git-ignored configuration that can never be staged", () => { + const directory = createRepository(); + fs.writeFileSync(path.join(directory, ".gitignore"), "next.config.mjs\n.opencode/\n"); execFileSync("git", ["add", ".gitignore"], { cwd: directory }); execFileSync("git", ["commit", "-q", "-m", "ignore config"], { cwd: directory }); - fs.writeFileSync(path.join(directory, "eslint.config.mjs"), "export default [];\n"); fs.writeFileSync(path.join(directory, "next.config.mjs"), "export default {};\n"); + fs.mkdirSync(path.join(directory, ".opencode"), { recursive: true }); + fs.writeFileSync(path.join(directory, ".opencode/package.json"), '{"name":"local-plugin"}\n'); + execFileSync("git", ["add", "src/app.tsx"], { cwd: directory }); - expect(findStagedSnapshotDivergences(directory)).toEqual([ - "eslint.config.mjs", - "next.config.mjs", - ]); + expect(findStagedSnapshotDivergences(directory)).toEqual([]); }); it("returns null outside a Git worktree", () => { @@ -115,6 +121,10 @@ describe("findStagedSnapshotDivergences", () => { expect(parseStagedSnapshotDivergences("R archive.txt\0a/b/doctor.config.json\0")).toEqual([]); }); + it("accepts git-ignored configuration with worktree status !", () => { + expect(parseStagedSnapshotDivergences("!! package.json\0")).toEqual([]); + }); + it("ignores unstaged lockfile and .gitignore edits that cannot shape a staged scan", () => { const directory = createRepository(); fs.writeFileSync(path.join(directory, "pnpm-lock.yaml"), "lockfileVersion: '9.0'\n"); From aa1fb8033a20053535032598c1c2fb4947543e5c Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 9 Aug 2026 15:48:02 +0000 Subject: [PATCH 2/2] chore: add changeset for staged ignore fix Co-authored-by: Skosh --- .changeset/fix-staged-ignore-divergence.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fix-staged-ignore-divergence.md diff --git a/.changeset/fix-staged-ignore-divergence.md b/.changeset/fix-staged-ignore-divergence.md new file mode 100644 index 0000000000..91eac5746e --- /dev/null +++ b/.changeset/fix-staged-ignore-divergence.md @@ -0,0 +1,5 @@ +--- +"react-doctor": patch +--- + +Fix `--staged` false positive on git-ignored config files. Git-ignored config files (e.g. `.opencode/package.json`) can never be staged, so they should not block staged scans with divergence errors.