detectRunningIDEs method

Future<List<IdeType>> detectRunningIDEs()

Detects running IDEs by process inspection.

Implementation

Future<List<IdeType>> detectRunningIDEs() async {
  final runningIDEs = <IdeType>[];

  try {
    if (Platform.isMacOS) {
      final result = await Process.run('bash', [
        '-c',
        'ps aux | grep -E "Visual Studio Code|Code Helper|Cursor Helper|Windsurf Helper|IntelliJ IDEA|PyCharm|WebStorm|PhpStorm|RubyMine|CLion|GoLand|Rider|DataGrip|AppCode|DataSpell|Android Studio" | grep -v grep',
      ]);
      final stdout = result.stdout as String? ?? '';

      for (final entry in supportedIdeConfigs.entries) {
        for (final keyword in entry.value.processKeywordsMac) {
          if (stdout.contains(keyword)) {
            runningIDEs.add(entry.key);
            break;
          }
        }
      }
    } else if (Platform.isLinux) {
      final result = await Process.run('bash', [
        '-c',
        'ps aux | grep -E "code|cursor|windsurf|idea|pycharm|webstorm|phpstorm|rubymine|clion|goland|rider|datagrip|dataspell|android-studio" | grep -v grep',
      ]);
      final stdout = (result.stdout as String? ?? '').toLowerCase();

      for (final entry in supportedIdeConfigs.entries) {
        for (final keyword in entry.value.processKeywordsLinux) {
          if (stdout.contains(keyword)) {
            if (entry.key != IdeType.vscode) {
              runningIDEs.add(entry.key);
              break;
            } else if (!stdout.contains('cursor') &&
                !stdout.contains('appcode')) {
              runningIDEs.add(entry.key);
              break;
            }
          }
        }
      }
    }
  } catch (e) {
    _logError(e);
  }

  cachedRunningIDEs.value = runningIDEs;
  hasCachedResults.value = true;
  return runningIDEs;
}