all repos — red-anatomia @ 43cc40161c75c7c9bb5bef2c1ce2d551b7f24484

red-anatomia

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;
  });
}