#!/usr/bin/env node // 1.1 ==================================== // CLI Dependencies and Imports Setup // Natural pattern: Import what you need before using it import { Command } from 'commander'; import { PACKAGE_NAME, PACKAGE_VERSION, PACKAGE_DESCRIPTION } from '../shared/config.js'; // Import command handlers import { compress } from '../commands/compress.js'; import { install } from '../commands/install.js'; import { uninstall } from '../commands/uninstall.js'; import { status } from '../commands/status.js'; import { logs } from '../commands/logs.js'; import { loadContext } from '../commands/load-context.js'; import { trash } from '../commands/trash.js'; import { restore } from '../commands/restore.js'; import { save } from '../commands/save.js'; import { changelog } from '../commands/changelog.js'; // Cloud functionality disabled - incomplete setup // import { cloudCommand } from '../commands/cloud.js'; import { importHistory } from '../commands/import-history.js'; import { TranscriptCompressor } from '../core/compression/TranscriptCompressor.js'; const program = new Command(); // ======================================= // 1.2 ==================================== // Program Configuration // Natural pattern: Configure program metadata first program .name(PACKAGE_NAME) .description(PACKAGE_DESCRIPTION) .version(PACKAGE_VERSION); // ======================================= // 1.3 ==================================== // Compress Command Definition // Natural pattern: Define command with its options and handler // Compress command program .command('compress [transcript]') .description('Compress a Claude Code transcript into memory') .option('--output ', 'Output directory for compressed files') .option('--dry-run', 'Show what would be compressed without doing it') .option('-v, --verbose', 'Show detailed output') .action(compress); // ======================================= // 1.4 ==================================== // Install Command Definition // Natural pattern: Define command with its options and handler // Install command program .command('install') .description('Install Claude Code hooks for automatic compression') .option('--user', 'Install for current user (default)') .option('--project', 'Install for current project only') .option('--local', 'Install to custom local directory') .option('--path ', 'Custom installation path (with --local)') .option('--timeout ', 'Hook execution timeout in milliseconds', '180000') .option('--skip-mcp', 'Skip Chroma MCP server installation') .option('--force', 'Force installation even if already installed') .action(install); // ======================================= // 1.5 ==================================== // Uninstall Command Definition // Natural pattern: Define command with its options and handler // Uninstall command program .command('uninstall') .description('Remove Claude Code hooks') .option('--user', 'Remove from user settings (default)') .option('--project', 'Remove from project settings') .option('--all', 'Remove from both user and project settings') .action(uninstall); // ======================================= // 1.6 ==================================== // Status Command Definition // Natural pattern: Define command with its handler // Status command program .command('status') .description('Check installation status of Claude Memory System') .action(status); // ======================================= // 1.7 ==================================== // Logs Command Definition // Natural pattern: Define command with its options and handler // Logs command program .command('logs') .description('View claude-mem operation logs') .option('--debug', 'Show debug logs only') .option('--error', 'Show error logs only') .option('--tail [n]', 'Show last n lines', '50') .option('--follow', 'Follow log output') .action(logs); // ======================================= // 1.8 ==================================== // Load-Context Command Definition // Natural pattern: Define command with its options and handler // Load-context command program .command('load-context') .description('Load compressed memories for current session') .option('--project ', 'Filter by project name') .option('--count ', 'Number of memories to load', '10') .option('--raw', 'Output raw JSON instead of formatted text') .option('--format ', 'Output format: json, session-start, or default') .action(loadContext); // ======================================= // 1.9 ==================================== // Trash and Restore Commands Definition // Natural pattern: Define commands for safe file operations // Trash command with subcommands const trashCmd = program .command('trash') .description('Manage trash bin for safe file deletion') .argument('[files...]', 'Files to move to trash') .option('-r, --recursive', 'Remove directories recursively') .option('-R', 'Remove directories recursively (same as -r)') .option('-f, --force', 'Suppress errors for nonexistent files') .action(async (files: string[] | undefined, options: any) => { // If no files provided, show help if (!files || files.length === 0) { trashCmd.outputHelp(); return; } // Map -R to recursive if (options.R) options.recursive = true; await trash(files, { force: options.force, recursive: options.recursive }); }); // Trash view subcommand trashCmd .command('view') .description('View contents of trash bin') .action(async () => { const { viewTrash } = await import('../commands/trash-view.js'); await viewTrash(); }); // Trash empty subcommand trashCmd .command('empty') .description('Permanently delete all files in trash') .option('-f, --force', 'Skip confirmation prompt') .action(async (options: any) => { const { emptyTrash } = await import('../commands/trash-empty.js'); await emptyTrash(options); }); // Restore command program .command('restore') .description('Restore files from trash interactively') .action(restore); // ======================================= // Cloud command // Cloud functionality disabled - incomplete setup // program.addCommand(cloudCommand); // Save command program .command('save ') .description('Save a message to the memory system') .action(save); // Changelog command program .command('changelog') .description('Generate CHANGELOG.md from claude-mem memories') .option('--historical ', 'Number of versions to search (default: current version only)') .option('--generate ', 'Generate changelog for a specific version') .option('--start