import { Command } from 'commander'; import { comandoAnalisar } from './commands/analisar.js'; import { comandoComparar } from './commands/comparar.js'; import { comandoExplicar } from './commands/explicar.js'; import { comandoEstudar } from './commands/estudar.js'; import { mostrarAjuda } from './ajuda.js'; const SUBCOMANDOS = new Set(['analisar', 'comparar', 'explicar', 'estudar', 'help', 'ajuda']); function aplicarAtalho(argv: string[]): string[] { const args = argv.slice(2); const primeiro = args[0]; if (primeiro && !primeiro.startsWith('-') && !SUBCOMANDOS.has(primeiro)) { return [...argv.slice(0, 2), 'analisar', ...args]; } return argv; } const programa = new Command(); programa .name('red') .description('Anatomista de sites via terminal, em português.') .version('0.0.1', '-v, --version', 'mostra a versão') .addHelpText('after', '\nCriado por Pablo Murad · 2026 · pablomurad@pm.me'); programa .command('analisar') .description('analisa uma URL e produz o relatório completo') .argument('', 'endereço do site (ex.: example.com)') .option('--completo', 'abre o site em navegador headless (executa JavaScript)') .option('--lighthouse', 'inclui auditoria de qualidade (performance, a11y, SEO, boas práticas)') .option('--json', 'imprime o relatório em JSON, sem formatação') .action(comandoAnalisar); programa .command('comparar') .description('compara as stacks de dois sites lado a lado') .argument('', 'primeiro site') .argument('', 'segundo site') .option('--completo', 'usa o modo completo (navegador) nos dois') .action((a, b, opts) => comandoComparar(a, b, opts)); programa .command('explicar') .description('explica uma tecnologia (sem analisar site nenhum)') .argument('', 'nome da tecnologia (ex.: nextjs)') .action(comandoExplicar); programa .command('estudar') .description('analisa o site e gera uma trilha didática a partir da stack') .argument('', 'endereço do site') .option('--completo', 'abre o site em navegador headless') .action((url, opts) => comandoEstudar(url, opts)); programa .command('help') .alias('ajuda') .description('mostra um guia rápido de uso') .action(mostrarAjuda); if (process.argv.slice(2).length === 0) { mostrarAjuda(); } else { programa.parseAsync(aplicarAtalho(process.argv)).catch((erro) => { process.stderr.write(`Erro inesperado: ${(erro as Error).message}\n`); process.exitCode = 1; }); }