UNPKG

@claude-vector/cli

Version:

CLI for Claude-integrated vector search

244 lines (205 loc) β€’ 7.41 kB
/** * Context command - Show and manage current context */ import chalk from 'chalk'; import { SessionManager, ContextManager } from '@claude-vector/claude-tools'; export async function contextCommand(options) { console.log(chalk.bold('\nπŸ“„ Current Context\n')); try { // Get current session const sessionManager = new SessionManager(); const session = await sessionManager.getCurrentSessionStatus(); if (!session) { console.log(chalk.yellow('No active session')); console.log(chalk.gray('Start a session with:'), chalk.cyan('claude-search start "your task"')); process.exit(0); } // Show session info console.log(chalk.bold('πŸ”„ Active Session:')); console.log(chalk.gray('Session ID:'), session.sessionId); console.log(chalk.gray('Task:'), session.task); console.log(chalk.gray('Type:'), getTaskTypeEmoji(session.taskType), session.taskType); console.log(chalk.gray('Duration:'), formatDuration(session.duration)); console.log(); // Show context statistics if (session.contextStats) { const stats = session.contextStats; console.log(chalk.bold('πŸ“Š Context Statistics:')); console.log(chalk.gray('Total items:'), stats.totalItems); console.log(chalk.gray('Token usage:'), `${stats.usedTokens}/${stats.availableTokens} (${stats.utilizationRate}%)`); console.log(chalk.gray('Remaining tokens:'), stats.remainingTokens); if (stats.sessionInfo) { console.log(chalk.gray('Session load:'), `${stats.sessionInfo.currentLoad}%`); } console.log(); } // Show detailed context if requested if (options.detailed || options.full) { await showDetailedContext(sessionManager); } // Show context items summary if (!options.summary) { await showContextItems(sessionManager, options); } // Show session activities if (options.activities) { await showRecentActivities(sessionManager); } // Show suggestions if (!options.quiet) { await showContextSuggestions(sessionManager); } // ζ­£εΈΈη΅‚δΊ† process.exit(0); } catch (error) { console.error(chalk.red(`Error: ${error.message}`)); if (options.debug) { console.error(error.stack); } process.exit(1); } } async function showDetailedContext(sessionManager) { console.log(chalk.bold('πŸ“ Detailed Context:')); try { const context = await sessionManager.getContext(); if (context && context.length > 0) { // Parse the formatted context to extract sections const sections = parseFormattedContext(context); for (const [sectionName, items] of Object.entries(sections)) { if (items.length > 0) { console.log(chalk.bold(`\n${sectionName}:`)); items.forEach((item, index) => { console.log(chalk.gray(`${index + 1}.`), item.substring(0, 100) + (item.length > 100 ? '...' : '')); }); } } } else { console.log(chalk.yellow('No detailed context available')); } } catch (error) { console.log(chalk.yellow('Could not retrieve detailed context')); } console.log(); } async function showContextItems(sessionManager, options) { console.log(chalk.bold('πŸ“‹ Context Items:')); try { // This would need to be implemented in SessionManager const session = await sessionManager.getCurrentSessionStatus(); if (session.contextStats?.totalItems > 0) { console.log(chalk.gray(`Showing summary of ${session.contextStats.totalItems} items`)); console.log(chalk.gray('Use'), chalk.cyan('--detailed'), chalk.gray('for full content')); } else { console.log(chalk.yellow('No context items')); } } catch (error) { console.log(chalk.yellow('Context items unavailable')); } console.log(); } async function showRecentActivities(sessionManager) { console.log(chalk.bold('πŸ“ˆ Recent Activities:')); try { const session = await sessionManager.getCurrentSessionStatus(); if (session && session.activities > 0) { console.log(chalk.gray(`${session.activities} activities recorded`)); console.log(chalk.gray(`${session.searches} searches performed`)); } else { console.log(chalk.yellow('No activities recorded')); } } catch (error) { console.log(chalk.yellow('Activities unavailable')); } console.log(); } async function showContextSuggestions(sessionManager) { console.log(chalk.bold('πŸ’‘ Suggestions:')); try { const recommendations = await sessionManager.getRecommendations(); if (recommendations && recommendations.length > 0) { recommendations.forEach((rec, index) => { const emoji = getRecommendationEmoji(rec.type); console.log(chalk.cyan(`${index + 1}. ${emoji}`), rec.suggestion); if (rec.query) { console.log(chalk.gray(' Command:'), chalk.cyan(`claude-search search "${rec.query}"`)); } }); } else { // Default suggestions console.log(chalk.cyan('1. πŸ”'), 'Search for relevant code:', chalk.cyan('claude-search search "query"')); console.log(chalk.cyan('2. πŸ“Š'), 'Check detailed status:', chalk.cyan('claude-search status')); console.log(chalk.cyan('3. πŸ“'), 'Take context snapshot:', chalk.cyan('claude-search context --snapshot')); } } catch (error) { // Show default suggestions console.log(chalk.cyan('1. πŸ”'), 'Search for relevant code:', chalk.cyan('claude-search search "query"')); console.log(chalk.cyan('2. πŸ“Š'), 'Check detailed status:', chalk.cyan('claude-search status')); } } function parseFormattedContext(contextText) { const sections = {}; const lines = contextText.split('\n'); let currentSection = 'General'; let currentContent = []; for (const line of lines) { if (line.startsWith('## ')) { // Save previous section if (currentContent.length > 0) { sections[currentSection] = currentContent; } // Start new section currentSection = line.substring(3).trim(); currentContent = []; } else if (line.trim() && !line.startsWith('#') && !line.startsWith('---')) { currentContent.push(line.trim()); } } // Save last section if (currentContent.length > 0) { sections[currentSection] = currentContent; } return sections; } function formatDuration(milliseconds) { const seconds = Math.floor(milliseconds / 1000); const minutes = Math.floor(seconds / 60); const hours = Math.floor(minutes / 60); if (hours > 0) { return `${hours}h ${minutes % 60}m`; } else if (minutes > 0) { return `${minutes}m ${seconds % 60}s`; } else { return `${seconds}s`; } } function getTaskTypeEmoji(taskType) { const emojis = { 'bug-fix': 'πŸ›', 'debug': 'πŸ”', 'refactor': '♻️', 'feature': '✨', 'explore': 'πŸ—ΊοΈ' }; return emojis[taskType] || 'πŸ“'; } function getActivityEmoji(activityType) { const emojis = { search: 'πŸ”', solution: 'βœ…', error: '❌', fix: 'πŸ”§', implementation: 'πŸ’»', context_snapshot: 'πŸ“Έ' }; return emojis[activityType] || 'πŸ“'; } function getRecommendationEmoji(type) { const emojis = { search: 'πŸ”', explore: 'πŸ—ΊοΈ', action: '⚑', context: 'πŸ“' }; return emojis[type] || 'πŸ’‘'; }