vibebench
Version:
CLI tool for VibeBench - vote on AI models from your terminal
90 lines • 3.23 kB
JavaScript
import Table from 'cli-table3';
import { typography, voteStyles, messages, tableConfig } from './styles.js';
export function formatVoteType(voteType) {
switch (voteType) {
case 'fire':
return voteStyles.fire('Fire');
case 'mid':
return voteStyles.mid('Mid');
case 'cursed':
return voteStyles.cursed('Cursed');
}
}
export function formatVibeScore(score) {
if (score >= 80)
return voteStyles.fire(`${score.toFixed(1)}`);
if (score >= 60)
return voteStyles.mid(`${score.toFixed(1)}`);
if (score >= 40)
return typography.highlight(`${score.toFixed(1)}`);
return voteStyles.cursed(`${score.toFixed(1)}`);
}
export function formatModelStats(model) {
const table = new Table({
...tableConfig,
head: [
typography.meta('Rank'),
typography.meta('Model'),
typography.meta('Vibe Score'),
typography.meta('Fire'),
typography.meta('Mid'),
typography.meta('Cursed')
]
});
const rank = ('rank' in model && model.rank) ? `#${model.rank}` : '-';
table.push([
typography.highlight(rank),
typography.data(model.slug || 'Unknown'),
formatVibeScore(model.vibeScore || 0),
voteStyles.fire((model.votes?.fire || 0).toString()),
voteStyles.mid((model.votes?.mid || 0).toString()),
voteStyles.cursed((model.votes?.cursed || 0).toString())
]);
return '\n' + table.toString();
}
export function formatLeaderboard(models, count = 10) {
const topModels = models.slice(0, count);
const table = new Table({
...tableConfig,
head: [
typography.meta('Rank'),
typography.meta('Model'),
typography.meta('Vibe Score'),
typography.meta('Fire'),
typography.meta('Mid'),
typography.meta('Cursed')
]
});
for (const model of topModels) {
table.push([
typography.highlight(`#${model.rank}`),
typography.data(model.slug),
formatVibeScore(model.vibeScore),
voteStyles.fire(model.votes.fire.toString()),
voteStyles.mid(model.votes.mid.toString()),
voteStyles.cursed(model.votes.cursed.toString())
]);
}
return '\n' + typography.header(`Top ${count} Models`) + '\n\n' + table.toString();
}
export function formatRateLimitStatus(remaining, resetTime, maxVotes = 3) {
const resetDate = new Date(resetTime);
const now = new Date();
const minutesUntilReset = Math.ceil((resetDate.getTime() - now.getTime()) / (1000 * 60));
return typography.highlight(`${remaining}/${maxVotes} votes remaining. Next vote resets in ${minutesUntilReset} minutes.`);
}
export function formatSuccess(message, details) {
const lines = [messages.success(message)];
if (details) {
lines.push(typography.meta(details));
}
return lines.join('\n');
}
export function formatError(message, details) {
const lines = [messages.error(message)];
if (details) {
lines.push(typography.meta(details));
}
return lines.join('\n');
}
//# sourceMappingURL=formatters.js.map