mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-06-15 05:47:18 -07:00
fix(core): improve terminal heuristics
This commit is contained in:
@@ -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(
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user