all repos — red-anatomia @ main

red-anatomia

src/cli/commands/estudar.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
import chalk from 'chalk';
import ora from 'ora';
import { analisarSite } from '../../core/pipeline.js';
import { montarTrilha } from '../../knowledge/trilhas.js';
import { TECNOLOGIAS, significadoGenerico } from '../../knowledge/tecnologias.js';

export interface OpcoesEstudar {
  completo?: boolean;
}

export async function comandoEstudar(url: string, opcoes: OpcoesEstudar): Promise<void> {
  const spinner = ora({ text: 'analisando…', stream: process.stderr }).start();
  const rep = await analisarSite(url, {
    modo: opcoes.completo ? 'completo' : 'rapido',
    aoProgredir: (etapa) => (spinner.text = etapa),
  });
  spinner.stop();

  const linhas: string[] = [];
  linhas.push(chalk.bold('O site utiliza:'));

  const relevantes = rep.deteccoes.filter((d) => d.confianca >= 50).slice(0, 8);
  if (!relevantes.length) {
    linhas.push(chalk.dim('  Não reconheci tecnologias com confiança suficiente para uma trilha.'));
    process.stdout.write(linhas.join('\n') + '\n');
    return;
  }
  for (const d of relevantes) {
    const resumo = TECNOLOGIAS[d.nome]?.significado ?? significadoGenerico(d.categorias);
    const curto = resumo.split(/[.—]/)[0]?.trim() ?? resumo;
    linhas.push(`  ${chalk.red(d.nome)} ${chalk.dim('→')} ${curto}`);
  }

  linhas.push('');
  linhas.push(chalk.bold('Para compreender uma estrutura semelhante, estude nesta ordem:'));
  montarTrilha(rep.deteccoes).forEach((passo, i) => {
    linhas.push(`  ${chalk.red(`${i + 1}.`)} ${passo}`);
  });

  process.stdout.write(linhas.join('\n') + '\n');
}