From b08f9821d8f61ea8f66e974d7ce95591c603b543 Mon Sep 17 00:00:00 2001 From: Spencer Date: Thu, 12 Mar 2026 21:37:17 +0000 Subject: [PATCH] fix(core): improve terminal heuristics --- packages/core/src/utils/compatibility.test.ts | 58 +++++-------------- packages/core/src/utils/compatibility.ts | 22 +------ 2 files changed, 15 insertions(+), 65 deletions(-) diff --git a/packages/core/src/utils/compatibility.test.ts b/packages/core/src/utils/compatibility.test.ts index 45c81bc9a1..372401537f 100644 --- a/packages/core/src/utils/compatibility.test.ts +++ b/packages/core/src/utils/compatibility.test.ts @@ -13,7 +13,6 @@ import { isGnuScreen, isLowColorTmux, isDumbTerminal, - getTerminalNameFromEnv, supports256Colors, supportsTrueColor, getCompatibilityWarnings, @@ -128,21 +127,31 @@ describe('compatibility', () => { }); describe('isLowColorTmux', () => { - it('should return true when TERM=screen and COLORTERM is not set', () => { + it('should return true when TERM=screen, COLORTERM is not set, and TMUX is set', () => { vi.stubEnv('TERM', 'screen'); vi.stubEnv('COLORTERM', ''); + vi.stubEnv('TMUX', 'dummy'); expect(isLowColorTmux()).toBe(true); }); - it('should return false when TERM=screen and COLORTERM is set', () => { + it('should return false when TERM=screen, COLORTERM is set, and TMUX is set', () => { vi.stubEnv('TERM', 'screen'); vi.stubEnv('COLORTERM', 'truecolor'); + vi.stubEnv('TMUX', 'dummy'); expect(isLowColorTmux()).toBe(false); }); - it('should return false when TERM=xterm-256color', () => { + it('should return false when TERM=xterm-256color and TMUX is set', () => { vi.stubEnv('TERM', 'xterm-256color'); vi.stubEnv('COLORTERM', ''); + vi.stubEnv('TMUX', 'dummy'); + expect(isLowColorTmux()).toBe(false); + }); + + it('should return false when TMUX is not set', () => { + vi.stubEnv('TERM', 'screen'); + vi.stubEnv('COLORTERM', ''); + vi.stubEnv('TMUX', ''); expect(isLowColorTmux()).toBe(false); }); }); @@ -164,46 +173,6 @@ describe('compatibility', () => { }); }); - describe('getTerminalNameFromEnv', () => { - it('should prioritize TERM_PROGRAM', () => { - vi.stubEnv('TERM_PROGRAM', 'iTerm.app'); - expect(getTerminalNameFromEnv()).toBe('iTerm.app'); - }); - - it('should use JETBRAINS_IDE if TERM_PROGRAM is missing', () => { - vi.stubEnv('TERM_PROGRAM', ''); - vi.stubEnv('TERMINAL_EMULATOR', 'JetBrains-JediTerm'); - vi.stubEnv('JETBRAINS_IDE', 'PyCharm'); - expect(getTerminalNameFromEnv()).toBe('PyCharm'); - }); - - it('should use TMUX if other vars are missing', () => { - vi.stubEnv('TERM_PROGRAM', ''); - vi.stubEnv('TERMINAL_EMULATOR', ''); - vi.stubEnv('JETBRAINS_IDE', ''); - vi.stubEnv('TMUX', 'some-socket'); - expect(getTerminalNameFromEnv()).toBe('tmux'); - }); - - it('should use STY if other vars are missing', () => { - vi.stubEnv('TERM_PROGRAM', ''); - vi.stubEnv('TERMINAL_EMULATOR', ''); - vi.stubEnv('JETBRAINS_IDE', ''); - vi.stubEnv('TMUX', ''); - vi.stubEnv('STY', 'some-session'); - expect(getTerminalNameFromEnv()).toBe('GNU screen'); - }); - - it('should return Unknown if no vars are set', () => { - vi.stubEnv('TERM_PROGRAM', ''); - vi.stubEnv('TERMINAL_EMULATOR', ''); - vi.stubEnv('JETBRAINS_IDE', ''); - vi.stubEnv('TMUX', ''); - vi.stubEnv('STY', ''); - expect(getTerminalNameFromEnv()).toBe('Unknown'); - }); - }); - describe('supports256Colors', () => { it.each<{ depth: number; @@ -340,6 +309,7 @@ describe('compatibility', () => { it('should return low-color tmux warning when detected', () => { vi.stubEnv('TERM', 'screen'); vi.stubEnv('COLORTERM', ''); + vi.stubEnv('TMUX', 'dummy'); const warnings = getCompatibilityWarnings(); expect(warnings).toContainEqual( diff --git a/packages/core/src/utils/compatibility.ts b/packages/core/src/utils/compatibility.ts index d19b07dc75..aacabd3546 100644 --- a/packages/core/src/utils/compatibility.ts +++ b/packages/core/src/utils/compatibility.ts @@ -52,7 +52,7 @@ export function isGnuScreen(): boolean { */ export function isLowColorTmux(): boolean { const term = process.env['TERM'] || ''; - return term.startsWith('screen') && !process.env['COLORTERM']; + return isTmux() && term.startsWith('screen') && !process.env['COLORTERM']; } /** @@ -63,26 +63,6 @@ export function isDumbTerminal(): boolean { return term === 'dumb' || term === 'vt100'; } -/** - * Detects the terminal name from environment variables. - */ -export function getTerminalNameFromEnv(): string { - const env = process.env; - if (env['TERM_PROGRAM'] && env['TERM_PROGRAM'] !== 'Unknown') { - return env['TERM_PROGRAM']; - } - if (isJetBrainsTerminal()) { - return env['JETBRAINS_IDE'] || 'JetBrains IDE'; - } - if (isTmux()) { - return 'tmux'; - } - if (isGnuScreen()) { - return 'GNU screen'; - } - return env['TERM_PROGRAM'] || 'Unknown'; -} - /** * Detects if the current terminal is the default Apple Terminal.app. */