diff --git a/CHANGELOG.md b/CHANGELOG.md index abfd5fc34..a974f0f57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Docs: https://docs.clawd.bot Status: unreleased. ### Changes +- macOS: limit project-local `node_modules/.bin` PATH preference to debug builds (reduce PATH hijacking risk). - Agents: summarize dropped messages during compaction safeguard pruning. (#2509) Thanks @jogi47. - Skills: add multi-image input support to Nano Banana Pro skill. (#1958) Thanks @tyler6204. - Agents: honor tools.exec.safeBins in exec allowlist checks. (#2281) diff --git a/apps/macos/Sources/Clawdbot/CommandResolver.swift b/apps/macos/Sources/Clawdbot/CommandResolver.swift index f83638b10..ba5f96d75 100644 --- a/apps/macos/Sources/Clawdbot/CommandResolver.swift +++ b/apps/macos/Sources/Clawdbot/CommandResolver.swift @@ -83,7 +83,10 @@ enum CommandResolver { "/usr/bin", "/bin", ] + #if DEBUG + // Dev-only convenience. Avoid project-local PATH hijacking in release builds. extras.insert(projectRoot.appendingPathComponent("node_modules/.bin").path, at: 0) + #endif let clawdbotPaths = self.clawdbotManagedPaths(home: home) if !clawdbotPaths.isEmpty { extras.insert(contentsOf: clawdbotPaths, at: 1) @@ -189,9 +192,13 @@ enum CommandResolver { } static func projectClawdbotExecutable(projectRoot: URL? = nil) -> String? { + #if DEBUG let root = projectRoot ?? self.projectRoot() let candidate = root.appendingPathComponent("node_modules/.bin").appendingPathComponent(self.helperName).path return FileManager().isExecutableFile(atPath: candidate) ? candidate : nil + #else + return nil + #endif } static func nodeCliPath() -> String? {