/ src / cli / proposals.js
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();