fix(core): improve terminal heuristics

This commit is contained in:
Spencer
2026-03-12 21:37:17 +00:00
parent bd530829a2
commit b08f9821d8
2 changed files with 15 additions and 65 deletions
+14 -44
View File
@@ -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(
+1 -21
View File
@@ -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.
*/