christmas-mcp-copilot-runner
Version:
A Model Copilot Provider (MCP) for safely executing whitelisted system commands across platforms with automatic VS Code setup
128 lines (114 loc) • 5.16 kB
JavaScript
const { runCommand } = require('../src/handlers/runCommand');
/**
* Show help information
*/
function showHelp() {
console.log('🎄 Christmas MCP Copilot Runner');
console.log('==============================');
console.log('');
console.log('Usage:');
console.log(' christmas-mcp-copilot-runner [command] # Execute a command');
console.log(' christmas-mcp-copilot-runner --mcp # Start MCP server mode');
console.log(' christmas-mcp-copilot-runner --test # Start HTTP test server');
console.log(' christmas-mcp-copilot-runner --help # Show this help');
console.log(' mcp-setup-vscode # Setup VS Code integration');
console.log('');
console.log('Examples:');
console.log(' christmas-mcp-copilot-runner "ls -la"');
console.log(' christmas-mcp-copilot-runner "php test.php"');
console.log(' christmas-mcp-copilot-runner "git status"');
console.log('');
console.log('VS Code Integration:');
console.log(' 1. Install: npm install -g christmas-mcp-copilot-runner');
console.log(' 2. Setup runs automatically during install');
console.log(' 3. Restart VS Code and ask Copilot to use the tool');
console.log('');
console.log('For more information: https://github.com/christmas/christmas-mcp-copilot-runner');
}
/**
* CLI interface for the MCP Runner
*/
async function main() {
const args = process.argv.slice(2);
if (args.length === 0) {
console.log('Usage: christmas-mcp-copilot-runner <command>');
console.log('');
console.log('Examples:');
console.log(' christmas-mcp-copilot-runner "php --version"');
console.log(' christmas-mcp-copilot-runner "node --version"');
console.log(' christmas-mcp-copilot-runner "curl -s https://api.github.com/users/github"');
console.log(' christmas-mcp-copilot-runner "ls -la" # Unix/macOS');
console.log(' christmas-mcp-copilot-runner "dir" # Windows');
console.log('');
console.log('Cross-platform: Commands are automatically normalized for your OS');
console.log('Whitelisted commands: php, curl, node, git, ls/dir, cat/type, npm, python, etc.');
process.exit(1);
}
if (args[0] === '--help' || args[0] === '-h') {
console.log('Christmas MCP Copilot Runner CLI');
console.log('');
console.log('Usage: christmas-mcp-copilot-runner <command>');
console.log('');
console.log('Cross-platform command executor with automatic OS command normalization.');
console.log('');
console.log('Options:');
console.log(' -h, --help Show this help message');
console.log(' --version Show version information');
console.log('');
console.log('Examples:');
console.log(' christmas-mcp-copilot-runner "php hello.php"');
console.log(' christmas-mcp-copilot-runner "node app.js"');
console.log(' christmas-mcp-copilot-runner "curl -s https://httpbin.org/ip"');
console.log(' christmas-mcp-copilot-runner "git status"');
console.log(' christmas-mcp-copilot-runner "ls -la" # Unix/macOS (auto-converts to "dir" on Windows)');
console.log(' christmas-mcp-copilot-runner "cat file.txt" # Unix/macOS (auto-converts to "type" on Windows)');
console.log('');
console.log('Platform Support:');
console.log(' - Windows: Supports cmd, powershell, dir, type, where, findstr');
console.log(' - macOS/Linux: Supports ls, cat, which, grep, and standard Unix tools');
console.log(' - Auto-normalization: Unix commands automatically converted on Windows');
console.log('');
console.log('Security:');
console.log(' - Only whitelisted base commands are allowed');
console.log(' - Dangerous patterns (rm -rf, del /s, Remove-Item -Recurse, etc.) are blocked');
console.log(' - All commands are logged to the logs/ directory');
console.log(' - Commands timeout after 30 seconds');
process.exit(0);
}
if (args[0] === '--version' || args[0] === '-v') {
const pkg = require('../package.json');
console.log(`${pkg.name} v${pkg.version}`);
process.exit(0);
}
const command = args.join(' ');
try {
console.log(`🚀 Executing: ${command}`);
console.log('─'.repeat(50));
const result = await runCommand({ cmd: command });
if (result.success) {
console.log(result.output);
console.log('─'.repeat(50));
console.log(`✅ Command completed successfully at ${result.timestamp}`);
} else {
console.error(`❌ Command failed: ${result.error}`);
console.log('─'.repeat(50));
console.log(`⏰ Failed at ${result.timestamp}`);
process.exit(1);
}
} catch (error) {
console.error(`💥 Unexpected error: ${error.message}`);
process.exit(1);
}
}
// Handle unhandled promise rejections
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
process.exit(1);
});
// Handle uncaught exceptions
process.on('uncaughtException', (error) => {
console.error('Uncaught Exception:', error);
process.exit(1);
});
main();