← back to Fix Live Board

run.mjs

22 lines

#!/usr/bin/env node
// Manual launcher: `node run.mjs <jobId>` spins (or re-attaches) that job's board and prints its URL.
// `node run.mjs --list` lists registered jobs + live boards.
import fs from 'fs';
import path from 'path';
import { spawnBoard, boardStatus, brokenCount, ROOT } from './boardctl.mjs';

const arg = process.argv[2];
if (!arg || arg === '--list') {
  const jobs = fs.readdirSync(path.join(ROOT, 'jobs')).filter(f => f.endsWith('.json')).map(f => f.replace(/\.json$/, ''));
  console.log('Registered jobs:');
  for (const j of jobs) { const s = boardStatus(j); console.log('  ' + j.padEnd(16) + (s.up ? 'LIVE  http://127.0.0.1:' + s.port + '/' : 'stopped')); }
  console.log('\nUsage: node run.mjs <jobId>   (admin / DW2024!)');
  process.exit(0);
}
if (!fs.existsSync(path.join(ROOT, 'jobs', arg + '.json'))) { console.error('No such job: ' + arg); process.exit(1); }
const bc = brokenCount(arg);
const r = spawnBoard(arg);
if (!r.url) { console.error('Board failed to start — see .runtime/' + arg + '.log'); process.exit(1); }
console.log((r.started ? 'Started' : 'Already live') + ' board [' + arg + '] → ' + r.url + '  (admin / DW2024!)');
if (bc.ok) console.log('  ' + bc.total + ' items · ' + bc.broken + ' still to follow');