virtue-cli
Version:
Personal character development CLI tool for tracking virtues and philosophical alignment
151 lines • 5 kB
JavaScript
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