#!/usr/bin/env node /** * Background Process Tracker - Enforces inst_023 */ const fs = require('fs'); const path = require('path'); const SESSION_STATE = path.join(__dirname, '../.claude/session-state.json'); function loadState() { if (!fs.existsSync(SESSION_STATE)) return { background_processes: [] }; return JSON.parse(fs.readFileSync(SESSION_STATE, 'utf8')); } function saveState(state) { fs.writeFileSync(SESSION_STATE, JSON.stringify(state, null, 2)); } function isRunning(pid) { try { process.kill(pid, 0); return true; } catch (e) { return false; } } function register(pid, description, persistent = false) { const state = loadState(); if (!state.background_processes) state.background_processes = []; state.background_processes.push({ pid: parseInt(pid), description, persistent, started_at: new Date().toISOString(), session: state.session_id }); saveState(state); console.log(`āœ… Registered: PID ${pid} - ${description}${persistent ? ' [PERSISTENT]' : ''}`); } function list() { const state = loadState(); const procs = state.background_processes || []; if (procs.length === 0) { console.log('No tracked processes'); return; } console.log('\nšŸ“‹ Background Processes:\n'); procs.forEach(p => { const status = isRunning(p.pid) ? 'āœ“' : 'āœ—'; console.log(`${status} PID ${p.pid}: ${p.description} ${p.persistent ? '[PERSISTENT]' : ''}`); }); console.log(''); } function cleanup(force = false) { const state = loadState(); const procs = state.background_processes || []; let killed = 0; const remaining = []; procs.forEach(p => { if (!isRunning(p.pid)) return; if (p.persistent && !force) { remaining.push(p); return; } try { process.kill(p.pid, 'SIGTERM'); console.log(`āœ“ Killed PID ${p.pid}`); killed++; } catch (err) { remaining.push(p); } }); state.background_processes = remaining; saveState(state); console.log(`\nāœ… Cleanup: ${killed} killed, ${remaining.length} remaining\n`); } const cmd = process.argv[2]; if (cmd === 'register') { register(process.argv[3], process.argv[4], process.argv.includes('--persistent')); } else if (cmd === 'list') { list(); } else if (cmd === 'cleanup') { cleanup(process.argv.includes('--force')); } else { console.log('Usage: register [--persistent] | list | cleanup [--force]'); }