src/cli/index.ts (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
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('<url>', '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('<url-a>', 'primeiro site')
.argument('<url-b>', '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('<tecnologia>', '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('<url>', '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;
});
}
|