outreach.js
1 #!/usr/bin/env node 2 3 /** 4 * Outreach Stage CLI 5 */ 6 7 import '../utils/load-env.js'; 8 import { runOutreachStage, getOutreachStats, retryFailedOutreaches } from '../stages/outreach.js'; 9 import { parseFlags } from '../utils/flag-parser.js'; 10 import Logger from '../utils/logger.js'; 11 12 const logger = new Logger('OutreachCLI'); 13 14 async function main() { 15 const command = process.argv[2]; 16 17 try { 18 if (command === 'stats') { 19 const stats = getOutreachStats(); 20 console.log('\nOutreach Statistics:'); 21 console.log(`Total Outreaches: ${stats.total_outreaches}`); 22 console.log(`Pending: ${stats.pending}`); 23 console.log(`Sent: ${stats.sent}`); 24 console.log(`Delivered: ${stats.delivered}`); 25 console.log(`Failed: ${stats.failed}`); 26 console.log(`Opened: ${stats.opened}`); 27 console.log(`Clicked: ${stats.clicked}`); 28 console.log('\nBy Channel:'); 29 for (const [channel, count] of Object.entries(stats.byChannel)) { 30 console.log(` ${channel}: ${count}`); 31 } 32 } else if (command === 'retry') { 33 const limit = parseInt(process.argv[3] || '10', 10); 34 await retryFailedOutreaches(limit); 35 } else { 36 const { limit } = parseFlags(); 37 const channel = process.argv.find(arg => 38 ['sms', 'email', 'form', 'x', 'linkedin'].includes(arg) 39 ); 40 await runOutreachStage({ limit, channel: channel || 'auto' }); 41 } 42 } catch (err) { 43 logger.error(err.message); 44 process.exit(1); 45 } 46 } 47 48 main();