UNPKG

virtue-cli

Version:

Personal character development CLI tool for tracking virtues and philosophical alignment

151 lines 5 kB
#!/usr/bin/env node import { Command } from 'commander'; import { intro, outro, confirm } from '@clack/prompts'; import picocolors from 'picocolors'; import { VirtueTracker } from './core/VirtueTracker.js'; import { ASCII_LOGO } from './utils/ascii-art.js'; const program = new Command(); async function main() { console.clear(); // Claude Code style intro intro(picocolors.inverse(' Virtue Tracker ')); // Check for Claude AI configuration const isClaudeConfigured = !!(process.env.CLAUDE_CODE_SESSION || process.env.CLAUDE_API_URL || process.env.ANTHROPIC_API_KEY || global.claudeCode); if (isClaudeConfigured) { const configSource = process.env.ANTHROPIC_API_KEY ? 'API key' : 'Claude Code'; console.log(picocolors.green(`✓ Claude AI integration enabled via ${configSource}`)); } else { console.log(picocolors.yellow('⚠ Claude AI disabled (set ANTHROPIC_API_KEY environment variable to enable)')); } const tracker = VirtueTracker.getInstance(); await tracker.initialize(); // Check if this is first run const hasProfiles = await tracker.hasExistingProfiles(); if (!hasProfiles) { console.log(picocolors.cyan(ASCII_LOGO)); const shouldSetup = await confirm({ message: 'No profiles found. Create your first virtue framework?', initialValue: true }); if (shouldSetup) { await tracker.createFirstProfile(); } else { outro(picocolors.gray('Run `virtue init` when ready to start')); return; } } // Show main menu await tracker.showMainMenu(); } // Command line interface program .name('virtue') .description('Personal virtue development tool') .version('1.0.0'); program .command('daily') .description('Daily virtue check-in') .action(async () => { const tracker = VirtueTracker.getInstance(); await tracker.initialize(); if (!await tracker.hasExistingProfiles()) { console.log(picocolors.red('No profiles found. Run `virtue init` first.')); return; } await tracker.dailyCheckin(); }); program .command('monthly') .description('Monthly deep-dive assessment') .action(async () => { const tracker = VirtueTracker.getInstance(); await tracker.initialize(); if (!await tracker.hasExistingProfiles()) { console.log(picocolors.red('No profiles found. Run `virtue init` first.')); return; } await tracker.monthlyDeepDive(); }); program .command('quick') .description('Quick 30-second check-in') .action(async () => { const tracker = VirtueTracker.getInstance(); await tracker.initialize(); if (!await tracker.hasExistingProfiles()) { console.log(picocolors.red('No profiles found. Run `virtue init` first.')); return; } await tracker.quickCheckin(); }); program .command('analytics') .description('View trends and patterns') .option('-d, --days <number>', 'Number of days to analyze', '30') .action(async (options) => { const tracker = VirtueTracker.getInstance(); await tracker.initialize(); if (!await tracker.hasExistingProfiles()) { console.log(picocolors.red('No profiles found. Run `virtue init` first.')); return; } await tracker.viewAnalytics(); }); program .command('insights') .description('Get AI-powered insights') .action(async () => { const tracker = VirtueTracker.getInstance(); await tracker.initialize(); if (!await tracker.hasExistingProfiles()) { console.log(picocolors.red('No profiles found. Run `virtue init` first.')); return; } await tracker.getAIInsights(); }); program .command('export') .description('Export data as markdown') .action(async () => { const tracker = VirtueTracker.getInstance(); await tracker.initialize(); if (!await tracker.hasExistingProfiles()) { console.log(picocolors.red('No profiles found. Run `virtue init` first.')); return; } await tracker.exportData(); }); program .command('init') .description('Create your first profile') .action(async () => { const tracker = VirtueTracker.getInstance(); await tracker.initialize(); await tracker.createFirstProfile(); outro(picocolors.green('Profile created successfully!')); }); program .command('drift') .description('Philosophical drift assessment') .action(async () => { const tracker = VirtueTracker.getInstance(); await tracker.initialize(); if (!await tracker.hasExistingProfiles()) { console.log(picocolors.red('No profiles found. Run `virtue init` first.')); return; } await tracker.assessPhilosophicalDrift(); }); // If no command provided, run interactive mode if (process.argv.length === 2) { main().catch(console.error); } else { program.parse(); } //# sourceMappingURL=index.js.map