proposals.js
1 #!/usr/bin/env node 2 3 /** 4 * Proposals Stage CLI 5 */ 6 7 import '../utils/load-env.js'; 8 import { runProposalsStage, getProposalsStats, regenerateProposals } from '../stages/proposals.js'; 9 import { parseFlags } from '../utils/flag-parser.js'; 10 import Logger from '../utils/logger.js'; 11 12 const logger = new Logger('ProposalsCLI'); 13 const error = (...args) => logger.error(...args); 14 15 async function main() { 16 const command = process.argv[2]; 17 18 try { 19 if (command === 'stats') { 20 const stats = getProposalsStats(); 21 console.log('\nProposals Statistics:'); 22 console.log(`Sites with Proposals: ${stats.sites_with_proposals}`); 23 console.log(`Total Outreaches: ${stats.total_outreaches}`); 24 console.log(`Pending: ${stats.pending_outreaches}`); 25 console.log(`Sent: ${stats.sent_outreaches}`); 26 console.log('\nVariant Distribution:'); 27 for (const [variant, count] of Object.entries(stats.variantDistribution)) { 28 console.log(` ${variant}: ${count}`); 29 } 30 } else if (command === 'regenerate') { 31 const siteIds = process.argv.slice(3).map(id => parseInt(id, 10)); 32 if (siteIds.length === 0) { 33 throw new Error('Usage: npm run proposals regenerate <siteId1> [siteId2] ...'); 34 } 35 await regenerateProposals(siteIds); 36 } else { 37 const { limit } = parseFlags(); 38 await runProposalsStage({ limit }); 39 } 40 } catch (err) { 41 error(err.message); 42 process.exit(1); 43 } 44 } 45 46 main();