claude-arcade
Version:
Add classic arcade games to your Claude Code workflow with Ctrl+G
117 lines (116 loc) • 4.21 kB
JavaScript
;
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();