runCommand static method

Future<int> runCommand({
  1. required CliInvocation invocation,
  2. required Logger logger,
  3. required WorkspaceConfig workspaceConfig,
  4. required PackageScanner packageScanner,
  5. required Prompter prompter,
  6. required PluginResolver plugins,
  7. required GroupStore groupStore,
})

Implementation

static Future<int> runCommand({
  required CliInvocation invocation,
  required Logger logger,
  required WorkspaceConfig workspaceConfig,
  required PackageScanner packageScanner,
  required Prompter prompter,
  required PluginResolver plugins,
  required GroupStore groupStore,
}) async {
  final inv = invocation;

  if (inv.positionals.isEmpty) {
    logger.log('Usage: mono group <group_name>', level: 'error');
    return 2;
  }
  final groupName = inv.positionals.first.trim();
  if (groupName.isEmpty || groupName.startsWith(':')) {
    logger.log('Invalid group name: "$groupName"', level: 'error');
    return 2;
  }

  final loaded = await workspaceConfig.loadRootConfig();
  final store = groupStore;

  // Load packages from cache or fallback scanner
  final projects =
      await workspaceConfig.readMonocfgProjects(loaded.monocfgPath);
  List<String> packageNames;
  if (projects.isEmpty) {
    final pkgs = await packageScanner.scan(
      rootPath: Directory.current.path,
      includeGlobs: loaded.config.include,
      excludeGlobs: loaded.config.exclude,
    );
    packageNames = [for (final p in pkgs) p.name.value];
  } else {
    packageNames = [for (final p in projects) p.name];
  }
  packageNames.sort();

  // Conflict checks (file-based)
  if (await store.exists(groupName)) {
    final ok = await prompter.confirm(
        'Group "$groupName" already exists. Overwrite?',
        defaultValue: false);
    if (!ok) {
      logger.log('Aborted.', level: 'error');
      return 1;
    }
  }
  if (packageNames.contains(groupName)) {
    logger.log(
        'Cannot create group with same name as a package: "$groupName"',
        level: 'error');
    return 2;
  }

  // Interactive checklist
  List<int> indices;
  try {
    indices = await prompter.checklist(
      title: 'Select packages for group "$groupName"',
      items: packageNames,
    );
  } on SelectionError {
    logger.log('Aborted.', level: 'error');
    return 1;
  }
  if (indices.isEmpty) {
    final ok = await prompter.confirm(
        'No packages selected. Create empty group "$groupName"?',
        defaultValue: false);
    if (!ok) {
      logger.log('Aborted.', level: 'error');
      return 1;
    }
  }
  final members = [for (final i in indices) packageNames[i]];
  await store.writeGroup(groupName, members);
  logger.log('Group "$groupName" saved with ${members.length} member(s).');
  return 0;
}