tulz
Version:
A lightweight CLI tool for codebase analysis and aggregation - perfect for slow machines and text editor workflows
125 lines (106 loc) • 5.79 kB
JavaScript
const fs = require('fs');
const path = require('path');
// Get the directory where the CLI is installed
const CLI_ROOT = __dirname;
// Update all your require paths to use absolute paths
const { generateStructureReport } = require(path.join(CLI_ROOT, 'tulz_core/reporting/generateStructureReport.js'));
const { generateLineCountReport } = require(path.join(CLI_ROOT, 'tulz_core/reporting/generateLineCountReport.js'));
const { findDryOpportunities } = require(path.join(CLI_ROOT, 'tulz_core/analysis/findDry.js'));
const { findInvalidImports } = require(path.join(CLI_ROOT, 'tulz_core/analysis/findInvalidImports.js'));
const { generateAggregatedTxt } = require(path.join(CLI_ROOT, 'tulz_core/aggregation/generateAggregatedTxt.js'));
const { formatDryReport, formatImportsReport } = require(path.join(CLI_ROOT, 'tulz_core/utils/formatters.js'));
const args = process.argv.slice(2);
const command = args[0];
const targetPath = args[1] || '.';
const absoluteTargetPath = path.resolve(targetPath);
const projectName = path.basename(absoluteTargetPath);
console.log(`\n🛠️ tulz CLI - Analisando: "${absoluteTargetPath}"\n`);
function saveReport(content, suffix) {
const filename = `${projectName}__${suffix}.txt`;
const outputPath = path.join(process.cwd(), filename);
try {
fs.writeFileSync(outputPath, content);
console.log(`✅ [${suffix}] Relatório salvo em: ${outputPath}`);
} catch (error) {
console.error(`❌ [${suffix}] Erro ao salvar arquivo: ${error.message}`);
}
}
// Funções wrapper para cada comando
function runStructure() { /* ...código existente sem alteração... */ }
function runLines() { /* ...código existente sem alteração... */ }
function runDry() { /* ...código existente sem alteração... */ }
function runImports() { /* ...código existente sem alteração... */ }
// <-- CÓDIGO EXISTENTE DAS FUNÇÕES WRAPPER (copiado para não quebrar)
function runStructure() { console.log('⏳ Gerando relatório de estrutura...'); const report = generateStructureReport(targetPath); saveReport(report, 'structure'); }
function runLines() { console.log('⏳ Gerando relatório de contagem de linhas...'); const report = generateLineCountReport(targetPath); saveReport(report, 'lines'); }
function runDry() { console.log('⏳ Analisando oportunidades DRY...'); const results = findDryOpportunities(targetPath); const report = formatDryReport(results); saveReport(report, 'dry'); }
function runImports() { console.log('⏳ Verificando imports inválidos...'); const results = findInvalidImports(targetPath); const report = formatImportsReport(results); saveReport(report, 'imports'); }
function runAggregate() {
console.log('⏳ Agregando código-fonte...');
const configPath = path.join(process.cwd(), 'tulz.config.json');
const globalConfigPath = '/etc/tulz/default-config.json';
let config;
if (fs.existsSync(configPath)) {
// Use local config if exists
try {
config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
} catch (error) {
console.error(`❌ [aggregate] Erro ao processar o arquivo de configuração local: ${error.message}`);
return;
}
} else if (fs.existsSync(globalConfigPath)) {
// Fall back to global config
try {
config = JSON.parse(fs.readFileSync(globalConfigPath, 'utf-8'));
console.log('ℹ️ Usando configuração global padrão');
} catch (error) {
console.error(`❌ [aggregate] Erro ao processar a configuração global: ${error.message}`);
return;
}
} else {
console.error('❌ [aggregate] Erro: Nenhum arquivo de configuração encontrado.');
console.error(' Crie "tulz.config.json" no diretório atual ou configure o arquivo global em /etc/tulz/default-config.json');
return;
}
if (!config.aggregatePaths || !Array.isArray(config.aggregatePaths)) {
console.error('❌ [aggregate] Erro: A chave "aggregatePaths" está faltando ou não é um array na configuração.');
return;
}
const report = generateAggregatedTxt(targetPath, config.aggregatePaths);
saveReport(report, 'aggregate');
}
// Roteador principal de comandos
function run() {
switch (command) {
case 'structure': { runStructure(); break; }
case 'lines': { runLines(); break; }
case 'dry': { runDry(); break; }
case 'imports': { runImports(); break; }
case 'aggregate': { runAggregate(); break; } // <-- NOVO COMANDO
case 'all': {
console.log('🚀 Executando todos os relatórios e a agregação...\n');
runStructure(); console.log('---');
runLines(); console.log('---');
runDry(); console.log('---');
runImports(); console.log('---');
runAggregate(); // <-- ADICIONADO AO 'all'
console.log('\n✨ Concluído! Todas as tarefas foram executadas.');
break;
}
case 'help':
default: {
console.log('Uso: node cli.js <comando> [caminho]');
console.log('\nComandos disponíveis:');
console.log(' all - Executa TODAS as tarefas (gera 4 relatórios e 1 agregado).');
console.log(' structure - Gera o relatório de estrutura.');
console.log(' lines - Gera o relatório de contagem de linhas.');
console.log(' dry - Analisa o código em busca de duplicatas.');
console.log(' imports - Verifica se há imports quebrados no código.');
console.log(' aggregate - Agrega os arquivos/pastas definidos em tulz.config.json.'); // <-- NOVA AJUDA
console.log(' help - Mostra esta mensagem de ajuda.');
break;
}
}
}
run();