| 30 | // the suite runs from inside a Claude Code / Cursor session, #590), then the |
| 31 | // `patch` values are applied; everything is restored afterwards. |
| 32 | function withEnv(patch, fn) { |
| 33 | const keys = [ |
| 34 | 'CLAUDECODE', |
| 35 | 'CLAUDE_CODE_ENTRYPOINT', |
| 36 | 'CLAUDE_PROJECT_DIR', |
| 37 | 'CURSOR_TRACE_ID', |
| 38 | 'CURSOR_SESSION_ID', |
| 39 | 'CURSOR_PROJECT_DIR', |
| 40 | 'CURSOR_AGENT', |
| 41 | 'CODEX_THREAD_ID', |
| 42 | 'CODEX_SHELL', |
| 43 | 'CODEX_CI', |
| 44 | 'CODEX_INTERNAL_ORIGINATOR_OVERRIDE', |
| 45 | 'TERM_PROGRAM', |
| 46 | ...Object.keys(patch), |
| 47 | ]; |
| 48 | const oldEnv = {}; |
| 49 | for (const key of keys) { |
| 50 | oldEnv[key] = process.env[key]; |
| 51 | delete process.env[key]; |
| 52 | } |
| 53 | for (const [key, value] of Object.entries(patch)) { |
| 54 | if (value !== undefined) process.env[key] = value; |
| 55 | } |
| 56 | |
| 57 | try { |
| 58 | return fn(); |
| 59 | } finally { |
| 60 | for (const key of keys) { |
| 61 | if (oldEnv[key] === undefined) { |
| 62 | delete process.env[key]; |
| 63 | } else { |
| 64 | process.env[key] = oldEnv[key]; |
| 65 | } |
| 66 | } |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | function withHome(home, fn) { |
| 71 | const originalHome = os.homedir; |