v0-ui-reviewer
Version:
Next-gen UI/UX reviewer with multi-model AI support (OpenAI, Claude, v0), style extraction, and live preview sandbox
53 lines (52 loc) • 1.71 kB
JavaScript
import winston from 'winston';
import chalk from 'chalk';
import { configManager } from './config.js';
const { format } = winston;
// Custom format for CLI output
const cliFormat = format.printf(({ level, message, timestamp, ...metadata }) => {
let output = '';
// Skip timestamp for info level to keep output clean
if (level !== 'info') {
output += chalk.gray(`[${timestamp}] `);
}
// Colorize level
switch (level) {
case 'error':
output += chalk.red(`❌ ${message}`);
break;
case 'warn':
output += chalk.yellow(`⚠️ ${message}`);
break;
case 'info':
output += message; // Info messages are already formatted
break;
case 'debug':
output += chalk.gray(`🔍 ${message}`);
break;
default:
output += message;
}
// Add metadata if present
if (Object.keys(metadata).length > 0) {
output += '\n' + chalk.gray(JSON.stringify(metadata, null, 2));
}
return output;
});
// Create logger instance
const logger = winston.createLogger({
level: configManager.get('logLevel') || 'info',
format: format.combine(format.timestamp({ format: 'HH:mm:ss' }), format.errors({ stack: true }), format.splat(), cliFormat),
transports: [
new winston.transports.Console({
stderrLevels: ['error']
})
]
});
// Also save logs to file in debug mode
if (configManager.get('logLevel') === 'debug') {
logger.add(new winston.transports.File({
filename: 'v0-ui-reviewer-debug.log',
format: format.combine(format.timestamp(), format.json())
}));
}
export { logger };