polish-cli
Version:
AI-powered file organization for Obsidian with automatic markdown conversion
59 lines ⢠2.96 kB
JavaScript
import chalk from 'chalk';
import ora from 'ora';
import * as fs from 'fs/promises';
import { ConfigService } from '../../services/ConfigService.js';
import { FileScanner } from '../../modules/FileScanner.js';
import { formatBytes } from '../../utils/formatting.js';
export async function analyzeCommand(source, options) {
const spinner = ora('Loading configuration...').start();
try {
const configService = new ConfigService();
const config = await configService.load();
const fileScanner = new FileScanner(config);
spinner.text = 'Scanning for files...';
const sources = source ? [{ path: source, includeSubfolders: true }] : config.sources;
const files = await fileScanner.scan(sources, options.types?.split(','));
spinner.succeed(`Found ${files.length} files`);
const analysis = {
total: files.length,
totalSize: files.reduce((sum, f) => sum + f.size, 0),
byType: {},
byExtension: {},
oldestFile: files.reduce((oldest, f) => f.modifiedAt < oldest.modifiedAt ? f : oldest, files[0]),
newestFile: files.reduce((newest, f) => f.modifiedAt > newest.modifiedAt ? f : newest, files[0]),
};
files.forEach(file => {
if (!analysis.byType[file.type]) {
analysis.byType[file.type] = { count: 0, size: 0 };
}
analysis.byType[file.type].count++;
analysis.byType[file.type].size += file.size;
analysis.byExtension[file.extension] = (analysis.byExtension[file.extension] || 0) + 1;
});
console.log(chalk.bold('\nš File Analysis Report\n'));
console.log(chalk.cyan('Total files:'), analysis.total);
console.log(chalk.cyan('Total size:'), formatBytes(analysis.totalSize));
console.log(chalk.cyan('Date range:'), `${analysis.oldestFile?.modifiedAt.toLocaleDateString()} - ${analysis.newestFile?.modifiedAt.toLocaleDateString()}`);
console.log(chalk.bold('\nš By Type:'));
Object.entries(analysis.byType).forEach(([type, data]) => {
console.log(` ${type}: ${data.count} files (${formatBytes(data.size)})`);
});
console.log(chalk.bold('\nš Top Extensions:'));
const topExtensions = Object.entries(analysis.byExtension)
.sort(([, a], [, b]) => b - a)
.slice(0, 10);
topExtensions.forEach(([ext, count]) => {
console.log(` .${ext}: ${count} files`);
});
if (options.report) {
await fs.writeFile(options.report, JSON.stringify(analysis, null, 2));
console.log(chalk.green(`\nā Report saved to ${options.report}`));
}
}
catch (error) {
spinner.fail('Analysis failed');
console.error(chalk.red('\nError:'), error instanceof Error ? error.message : error);
process.exit(1);
}
}
//# sourceMappingURL=analyze.js.map