run method

  1. @override
Future<void> run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future<void> run() async {
  final createBackup = argResults!['backup'] as bool;
  final dryRun = argResults!['dry-run'] as bool;

  final projectDir = findNitroProjectRoot();
  if (projectDir == null) {
    stderr.writeln('❌ No Nitro project found in . or its subdirectories.');
    exit(1);
  }

  final originalCwd = Directory.current;
  Directory.current = projectDir;

  if (projectDir.path != originalCwd.path) {
    stdout.writeln('  \x1B[90m📂 Found project in: ${projectDir.path}\x1B[0m');
  }

  // Read plugin name from pubspec
  final pubspec = File(p.join(projectDir.path, 'pubspec.yaml'));
  String pluginName = 'unknown';
  for (final line in pubspec.readAsLinesSync()) {
    if (line.trim().startsWith('name: ')) {
      pluginName = line.replaceFirst('name: ', '').trim();
      break;
    }
  }

  // Detect current SPM status
  final spmStatus = detectSpmStatus(projectDir.path);

  if (dryRun) {
    _printDryRun(pluginName, spmStatus);
    exit(0);
  }

  final result = MigrationResult();
  await runApp(
    MigrateView(
      pluginName: pluginName,
      result: result,
      spmStatus: spmStatus,
      createBackup: createBackup,
    ),
  );

  if (result.success) {
    if (result.migratedPlatforms.isNotEmpty) {
      stdout.writeln('  \x1B[1;32m✨ Migration complete: ${result.migratedPlatforms.join(", ")}\x1B[0m');
    } else {
      stdout.writeln('  \x1B[1;32m✨ Already using SPM — no migration needed\x1B[0m');
    }
  } else {
    exit(1);
  }
}