remove.ts•3.18 kB
/**
 * CLI command for removing servers from a group
 */
import { Command } from "commander";
import { getCompositeDatabaseService } from "../../../db/compositeDatabaseService.js";
import { theme, semantic } from "../../../utils/theme.js";
import { output } from "../../../utils/output.js";
import { createChildLogger } from "../../../utils/logging.js";
const logger = createChildLogger({ module: "mcp-manager/group/remove" });
export function createGroupRemoveCommand(): Command {
  const remove = new Command("remove");
  remove
    .description("Remove servers from a group")
    .argument("<group>", "Name of the group")
    .argument("<servers...>", "Names of servers to remove")
    .action(async (groupName, serverNames) => {
      try {
        // Initialize database
        const dbService = getCompositeDatabaseService();
        await dbService.init();
        // Find the group
        const group = await dbService.groups.findByName(groupName);
        if (!group) {
          console.error(
            semantic.messageError(`❌ Group "${groupName}" not found`)
          );
          process.exit(1);
        }
        // Process each server
        let removedCount = 0;
        const errors: string[] = [];
        for (const serverName of serverNames) {
          // Find the server
          const server = await dbService.servers.findByName(serverName);
          if (!server) {
            errors.push(`Server "${serverName}" not found`);
            continue;
          }
          // Check if server is in the group
          const index = group.serverIds.indexOf(server.id);
          if (index === -1) {
            errors.push(`Server "${serverName}" is not in the group`);
            continue;
          }
          // Remove server from group
          group.serverIds.splice(index, 1);
          removedCount++;
        }
        // Update the group if any servers were removed
        if (removedCount > 0) {
          await dbService.groups.update(group);
        }
        // Display results
        output.displaySeparator();
        if (removedCount > 0) {
          console.log(
            semantic.messageSuccess(
              `✅ Removed ${removedCount} server${removedCount === 1 ? "" : "s"} from group "${groupName}"`
            )
          );
        }
        if (errors.length > 0) {
          output.displaySpaceBuffer();
          console.log(theme.warning("⚠️  Warnings:"));
          errors.forEach((error) => {
            console.log(theme.warning(`   • ${error}`));
          });
        }
        // Show current group status
        output.displaySpaceBuffer();
        console.log(
          theme.info(
            `Group "${groupName}" now contains ${group.serverIds.length} server${group.serverIds.length === 1 ? "" : "s"}`
          )
        );
        await dbService.close();
      } catch (error) {
        logger.error("Failed to remove servers from group:", error);
        console.error(
          semantic.messageError(
            `❌ Failed to remove servers from group: ${(error as Error).message}`
          )
        );
        process.exit(1);
      }
    });
  return remove;
}