UNPKG

claude-arcade

Version:

Add classic arcade games to your Claude Code workflow with Ctrl+G

117 lines (116 loc) 4.21 kB
#!/usr/bin/env node "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const child_process_1 = require("child_process"); const terminal_kit_1 = __importDefault(require("terminal-kit")); const term = terminal_kit_1.default.terminal; let claudeProcess = null; let gameProcess = null; function startClaude() { console.clear(); console.log('\x1b[36m╔════════════════════════════════════════════════╗\x1b[0m'); console.log('\x1b[36m║ Claude Code with Game Hotkey (Press G) ║\x1b[0m'); console.log('\x1b[36m╚════════════════════════════════════════════════╝\x1b[0m'); console.log(''); console.log('\x1b[32mStarting Claude Code...\x1b[0m'); console.log('\x1b[35m→ Press G at any time to launch the game!\x1b[0m'); console.log(''); // Start Claude Code claudeProcess = (0, child_process_1.spawn)('claude', process.argv.slice(2), { stdio: ['pipe', 'inherit', 'inherit'], shell: true }); claudeProcess.on('error', (err) => { console.log(''); console.log('\x1b[31m✗ Error launching Claude Code:\x1b[0m', err.message); console.log('\x1b[33m Make sure "claude" is installed and in your PATH\x1b[0m'); process.exit(1); }); claudeProcess.on('close', () => { term.grabInput(false); console.log(''); console.log('\x1b[32m✓ Claude Code exited.\x1b[0m'); process.exit(0); }); // Enable raw mode to intercept keypresses term.grabInput(true); term.on('key', (name, matches, data) => { // Check for game hotkey if (name === 'g' && !gameProcess) { launchGame(); return; } // Pass all other input to Claude if (claudeProcess && claudeProcess.stdin) { if (name === 'CTRL_C') { claudeProcess.stdin.write('\x03'); // Send Ctrl+C } else if (name === 'ENTER') { claudeProcess.stdin.write('\n'); } else if (name === 'BACKSPACE') { claudeProcess.stdin.write('\x7f'); } else if (name === 'TAB') { claudeProcess.stdin.write('\t'); } else if (name === 'ESCAPE') { claudeProcess.stdin.write('\x1b'); } else if (matches && matches[0]) { claudeProcess.stdin.write(matches[0]); } else if (data && data.isCharacter) { claudeProcess.stdin.write(data.code); } } }); } function launchGame() { if (gameProcess) return; // Game already running // Pause Claude input processing term.grabInput(false); console.log(''); console.log('\x1b[32m→ Launching game in alternate screen...\x1b[0m'); console.log(''); gameProcess = (0, child_process_1.spawn)('npm', ['run', 'game'], { stdio: 'inherit', shell: true, cwd: __dirname + '/..' }); gameProcess.on('close', () => { gameProcess = null; console.log(''); console.log('\x1b[32m✓ Game exited! Resuming Claude Code...\x1b[0m'); console.log('\x1b[35m→ Press G again to play more!\x1b[0m'); console.log(''); // Resume Claude input processing term.grabInput(true); }); gameProcess.on('error', (err) => { gameProcess = null; console.log(''); console.log('\x1b[31m✗ Error launching game:\x1b[0m', err.message); term.grabInput(true); }); } // Handle exit process.on('SIGINT', () => { if (claudeProcess) { claudeProcess.kill('SIGINT'); } if (gameProcess) { gameProcess.kill('SIGINT'); } term.grabInput(false); process.exit(0); }); process.on('exit', () => { term.grabInput(false); }); // Start startClaude();