@claude-vector/cli
Version:
CLI for Claude-integrated vector search
244 lines (205 loc) β’ 7.41 kB
JavaScript
/**
* 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] || 'π‘';
}