UNPKG

@felixallistar/coolify-mcp

Version:

Model Context Protocol server for Coolify API integration

179 lines (178 loc) 6.64 kB
import chalk from 'chalk'; import { projectsHandler } from '../../mcp/tools/projects.js'; export function registerProjectsCommands(program) { const projects = program.command('projects') .description('Manage projects'); // List projects projects.command('list') .description('List all projects') .action(async () => { try { const result = await projectsHandler({ operation: 'list' }); console.log(chalk.green('Projects:')); if (Array.isArray(result.data)) { console.table(result.data.map((project) => ({ id: project.uuid, name: project.name, description: project.description || 'No description', created: project.created_at ? new Date(project.created_at).toLocaleDateString() : 'N/A' }))); } else { console.log(result.data); } } catch (error) { console.error(chalk.red('Error:'), error.message); process.exit(1); } }); // Get project details projects.command('get <id>') .description('Get project details') .action(async (id) => { try { const result = await projectsHandler({ operation: 'get', id }); console.log(chalk.green('Project Details:')); console.log(JSON.stringify(result.data, null, 2)); } catch (error) { console.error(chalk.red('Error:'), error.message); process.exit(1); } }); // Create project projects.command('create') .description('Create a new project') .requiredOption('--name <name>', 'Project name') .option('--description <description>', 'Project description') .action(async (options) => { try { const body = JSON.stringify({ name: options.name, description: options.description || '' }); const result = await projectsHandler({ operation: 'create', body }); console.log(chalk.green('Project created:')); console.log(JSON.stringify(result.data, null, 2)); } catch (error) { console.error(chalk.red('Error:'), error.message); process.exit(1); } }); // Update project projects.command('update <id>') .description('Update a project') .option('--name <name>', 'Project name') .option('--description <description>', 'Project description') .action(async (id, options) => { try { const updateData = {}; if (options.name) updateData.name = options.name; if (options.description) updateData.description = options.description; const body = JSON.stringify(updateData); const result = await projectsHandler({ operation: 'update', id, body }); console.log(chalk.green('Project updated:')); console.log(JSON.stringify(result.data, null, 2)); } catch (error) { console.error(chalk.red('Error:'), error.message); process.exit(1); } }); // Delete project projects.command('delete <id>') .description('Delete a project') .option('--force', 'Force deletion without confirmation') .action(async (id, options) => { try { if (!options.force) { const inquirer = await import('inquirer'); const { confirm } = await inquirer.default.prompt([ { type: 'confirm', name: 'confirm', message: `Are you sure you want to delete project ${id}?`, default: false } ]); if (!confirm) { console.log(chalk.yellow('Deletion cancelled.')); return; } } await projectsHandler({ operation: 'delete', id }); console.log(chalk.green(`Project ${id} deleted successfully.`)); } catch (error) { console.error(chalk.red('Error:'), error.message); process.exit(1); } }); // Get environment details projects.command('environment <id> <environmentName>') .description('Get environment details for a project') .action(async (id, environmentName) => { try { const result = await projectsHandler({ operation: 'environment', id, environmentNameOrUuid: environmentName }); console.log(chalk.green(`Environment details for ${environmentName} in project ${id}:`)); console.log(JSON.stringify(result.data, null, 2)); } catch (error) { console.error(chalk.red('Error:'), error.message); process.exit(1); } }); // List all resources projects.command('resources') .description('List all resources across all projects') .action(async () => { try { const result = await projectsHandler({ operation: 'resources' }); console.log(chalk.green('All Resources:')); if (Array.isArray(result.data)) { const groupedResources = {}; result.data.forEach((resource) => { const type = resource.type || 'Unknown'; if (!groupedResources[type]) { groupedResources[type] = []; } groupedResources[type].push({ id: resource.uuid || resource.id, name: resource.name, status: resource.status || 'Unknown', project: resource.project?.name || 'N/A' }); }); Object.entries(groupedResources).forEach(([type, resources]) => { console.log(chalk.blue(`\n${type}s:`)); console.table(resources); }); } else { console.log(JSON.stringify(result.data, null, 2)); } } catch (error) { console.error(chalk.red('Error:'), error.message); process.exit(1); } }); }