detectTerminal function
Detect the terminal / editor hosting the CLI.
Implementation
String? detectTerminal() {
final env = Platform.environment;
if (env['CURSOR_TRACE_ID'] != null) return 'cursor';
final askpass = env['VSCODE_GIT_ASKPASS_MAIN'];
if (askpass != null) {
if (askpass.contains('cursor')) return 'cursor';
if (askpass.contains('windsurf')) return 'windsurf';
if (askpass.contains('antigravity')) return 'antigravity';
}
final bundleId = env['__CFBundleIdentifier']?.toLowerCase();
if (bundleId != null) {
if (bundleId.contains('vscodium')) return 'codium';
if (bundleId.contains('windsurf')) return 'windsurf';
if (bundleId.contains('com.google.android.studio')) return 'androidstudio';
for (final ide in jetbrainsIdes) {
if (bundleId.contains(ide)) return ide;
}
}
if (env['VisualStudioVersion'] != null) return 'visualstudio';
if (env['TERMINAL_EMULATOR'] == 'JetBrains-JediTerm') {
return 'pycharm';
}
if (env['TERM'] == 'xterm-ghostty') return 'ghostty';
if (env['TERM'] != null && env['TERM']!.contains('kitty')) return 'kitty';
if (env['TERM_PROGRAM'] != null) return env['TERM_PROGRAM'];
if (env['TMUX'] != null) return 'tmux';
if (env['STY'] != null) return 'screen';
if (env['KONSOLE_VERSION'] != null) return 'konsole';
if (env['GNOME_TERMINAL_SERVICE'] != null) return 'gnome-terminal';
if (env['XTERM_VERSION'] != null) return 'xterm';
if (env['VTE_VERSION'] != null) return 'vte-based';
if (env['TERMINATOR_UUID'] != null) return 'terminator';
if (env['KITTY_WINDOW_ID'] != null) return 'kitty';
if (env['ALACRITTY_LOG'] != null) return 'alacritty';
if (env['TILIX_ID'] != null) return 'tilix';
if (env['WT_SESSION'] != null) return 'windows-terminal';
if (env['SESSIONNAME'] != null && env['TERM'] == 'cygwin') return 'cygwin';
if (env['MSYSTEM'] != null) return env['MSYSTEM']!.toLowerCase();
if (env['ConEmuANSI'] != null ||
env['ConEmuPID'] != null ||
env['ConEmuTask'] != null) {
return 'conemu';
}
if (env['WSL_DISTRO_NAME'] != null) return 'wsl-${env["WSL_DISTRO_NAME"]}';
if (_isSSHSession()) return 'ssh-session';
if (env['TERM'] != null) {
final term = env['TERM']!;
if (term.contains('alacritty')) return 'alacritty';
if (term.contains('rxvt')) return 'rxvt';
if (term.contains('termite')) return 'termite';
return term;
}
if (!stdout.hasTerminal) return 'non-interactive';
return null;
}