UNPKG

@simonecoelhosfo/optimizely-mcp-server

Version:

Optimizely MCP Server for AI assistants with integrated CLI tools

181 lines (152 loc) 5.98 kB
#!/usr/bin/env node /** * Documentation Registry Viewer * * USAGE: * node scripts/view-registry.js # Show last 10 entries * node scripts/view-registry.js --limit 20 # Show last 20 entries * node scripts/view-registry.js --category fixes # Show only fixes * node scripts/view-registry.js --search "cache" # Search entries * node scripts/view-registry.js --stats # Show statistics only */ import fs from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const REGISTRY_FILE = path.join(__dirname, '..', 'DOCUMENTATION-REGISTRY.json'); // Parse command line arguments function parseArgs() { const args = process.argv.slice(2); const parsed = { limit: 10, category: null, search: null, stats: false }; for (let i = 0; i < args.length; i++) { const arg = args[i]; if (arg === '--stats') { parsed.stats = true; } else if (arg.startsWith('--')) { const key = arg.replace('--', ''); const value = args[i + 1]; if (key === 'limit') parsed.limit = parseInt(value); else parsed[key] = value; i++; // Skip next argument as it's the value } } return parsed; } // Load registry function loadRegistry() { if (!fs.existsSync(REGISTRY_FILE)) { console.error('❌ Registry file not found. Run update-documentation-registry.js first.'); process.exit(1); } try { return JSON.parse(fs.readFileSync(REGISTRY_FILE, 'utf8')); } catch (error) { console.error('❌ Error reading registry file:', error.message); process.exit(1); } } // Filter entries based on criteria function filterEntries(entries, args) { let filtered = entries; if (args.category) { filtered = filtered.filter(e => e.category === args.category); } if (args.search) { const searchTerm = args.search.toLowerCase(); filtered = filtered.filter(e => e.task.toLowerCase().includes(searchTerm) || e.files.some(f => f.toLowerCase().includes(searchTerm)) || e.impact.toLowerCase().includes(searchTerm) ); } return filtered.slice(0, args.limit); } // Display statistics function displayStats(registry) { console.log('📊 DOCUMENTATION REGISTRY STATISTICS'); console.log('═══════════════════════════════════════'); console.log(`📋 Total Entries: ${registry.totalEntries}`); console.log(`📅 Created: ${new Date(registry.created).toLocaleDateString()}`); console.log(`🔄 Last Updated: ${new Date(registry.lastUpdated).toLocaleDateString()}`); console.log(''); console.log('📈 BREAKDOWN BY CATEGORY:'); Object.entries(registry.categories).forEach(([category, count]) => { const percentage = ((count / registry.totalEntries) * 100).toFixed(1); console.log(` ${category.padEnd(15)} ${count.toString().padStart(3)} (${percentage}%)`); }); console.log(''); // Recent activity const recent = registry.entries.slice(0, 3); console.log('🕒 RECENT ACTIVITY:'); recent.forEach(entry => { const date = new Date(entry.timestamp).toLocaleDateString(); console.log(` ${date} - ${entry.action.toUpperCase()}: ${entry.task.substring(0, 60)}...`); }); } // Display entries function displayEntries(entries, args) { if (entries.length === 0) { console.log('📭 No entries found matching your criteria.'); return; } console.log(`📋 SHOWING ${entries.length} ENTRIES`); console.log('═'.repeat(80)); entries.forEach((entry, index) => { const date = new Date(entry.timestamp).toLocaleDateString(); const time = new Date(entry.timestamp).toLocaleTimeString(); console.log(`${(index + 1).toString().padStart(2)}. ${entry.action.toUpperCase()} - ${date} ${time}`); console.log(` 📝 ${entry.task}`); console.log(` 📁 Files: ${entry.files.join(', ')}`); console.log(` 🎯 Impact: ${entry.impact}`); console.log(` 🏷️ Category: ${entry.category}`); console.log(` 🆔 ID: ${entry.id}`); console.log(''); }); } // Display help function displayHelp() { console.log('📚 DOCUMENTATION REGISTRY VIEWER'); console.log('═══════════════════════════════════'); console.log(''); console.log('USAGE:'); console.log(' node scripts/view-registry.js # Show last 10 entries'); console.log(' node scripts/view-registry.js --limit 20 # Show last 20 entries'); console.log(' node scripts/view-registry.js --category fixes # Show only fixes'); console.log(' node scripts/view-registry.js --search "cache" # Search entries'); console.log(' node scripts/view-registry.js --stats # Show statistics only'); console.log(''); console.log('CATEGORIES:'); console.log(' documentation, implementation, testing, fixes, architecture'); console.log(''); console.log('EXAMPLES:'); console.log(' node scripts/view-registry.js --category documentation --limit 5'); console.log(' node scripts/view-registry.js --search "phase 4" --limit 15'); } // Main execution function main() { const args = parseArgs(); if (args.help) { displayHelp(); return; } const registry = loadRegistry(); if (args.stats) { displayStats(registry); return; } displayStats(registry); console.log(''); const filteredEntries = filterEntries(registry.entries, args); displayEntries(filteredEntries, args); console.log('💡 TIP: Use --help for more options'); } // Run if called directly if (import.meta.url === `file://${process.argv[1]}`) { main(); } export { loadRegistry, filterEntries };