From ff4f326341680c2dcf92610d7db4149eb13c781a Mon Sep 17 00:00:00 2001 From: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Date: Sat, 14 Mar 2026 09:05:51 -0700 Subject: [PATCH] fix(server): use realpathSync for .env path dedup to handle symlinks realpathSync resolves symlinks and normalizes case, preventing double-loading the same .env file when paths differ only by symlink indirection or filesystem case. Co-Authored-By: Claude Opus 4.6 (1M context) --- server/src/config.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server/src/config.ts b/server/src/config.ts index 0d25172c..6943af7a 100644 --- a/server/src/config.ts +++ b/server/src/config.ts @@ -1,5 +1,5 @@ import { readConfigFile } from "./config-file.js"; -import { existsSync } from "node:fs"; +import { existsSync, realpathSync } from "node:fs"; import { resolve } from "node:path"; import { config as loadDotenv } from "dotenv"; import { resolvePaperclipEnvPath } from "./paths.js"; @@ -29,7 +29,10 @@ if (existsSync(PAPERCLIP_ENV_FILE_PATH)) { } const CWD_ENV_PATH = resolve(process.cwd(), ".env"); -if (CWD_ENV_PATH !== PAPERCLIP_ENV_FILE_PATH && existsSync(CWD_ENV_PATH)) { +const isSameFile = existsSync(CWD_ENV_PATH) && existsSync(PAPERCLIP_ENV_FILE_PATH) + ? realpathSync(CWD_ENV_PATH) === realpathSync(PAPERCLIP_ENV_FILE_PATH) + : CWD_ENV_PATH === PAPERCLIP_ENV_FILE_PATH; +if (!isSameFile && existsSync(CWD_ENV_PATH)) { loadDotenv({ path: CWD_ENV_PATH, override: false, quiet: true }); }