// ========================================== // PROJECT OVERVIEW VIEW // ========================================== function renderProjectOverview() { // Show stats grid and search (may be hidden by MCP view) if (typeof showStatsAndSearch === 'function') showStatsAndSearch(); const container = document.getElementById('mainContent'); const project = workflowData.projectOverview; if (!project) { container.innerHTML = `

No Project Overview

Run /workflow:init to initialize project analysis

`; if (typeof lucide !== 'undefined') lucide.createIcons(); return; } container.innerHTML = `

${escapeHtml(project.projectName)}

${escapeHtml(project.description || 'No description available')}

Initialized: ${formatDate(project.initializedAt)}
Mode: ${escapeHtml(project.metadata?.analysis_mode || 'unknown')}

Technology Stack

Languages

${project.technologyStack.languages.map(lang => `
${escapeHtml(lang.name)} ${lang.file_count} files ${lang.primary ? 'Primary' : ''}
`).join('') || 'No languages detected'}

Frameworks

${project.technologyStack.frameworks.map(fw => ` ${escapeHtml(fw)} `).join('') || 'No frameworks detected'}

Build Tools

${project.technologyStack.build_tools.map(tool => ` ${escapeHtml(tool)} `).join('') || 'No build tools detected'}

Test Frameworks

${project.technologyStack.test_frameworks.map(fw => ` ${escapeHtml(fw)} `).join('') || 'No test frameworks detected'}

Architecture

Style

${escapeHtml(project.architecture.style)}

Layers

${project.architecture.layers.map(layer => ` ${escapeHtml(layer)} `).join('') || 'None'}

Patterns

${project.architecture.patterns.map(pattern => ` ${escapeHtml(pattern)} `).join('') || 'None'}

Key Components

${project.keyComponents.length > 0 ? `
${project.keyComponents.map(comp => { const importanceColors = { high: 'border-l-4 border-l-destructive bg-destructive/5', medium: 'border-l-4 border-l-warning bg-warning/5', low: 'border-l-4 border-l-muted-foreground bg-muted' }; const importanceBadges = { high: 'High', medium: 'Medium', low: 'Low' }; return `

${escapeHtml(comp.name)}

${importanceBadges[comp.importance] || ''}

${escapeHtml(comp.description)}

${escapeHtml(comp.path)}
`; }).join('')}
` : '

No key components identified

'}

Development History

${renderDevelopmentIndex(project.developmentIndex)}

Statistics

${project.statistics.total_features || 0}
Total Features
${project.statistics.total_sessions || 0}
Total Sessions
Last Updated
${formatDate(project.statistics.last_updated)}
`; // Initialize Lucide icons if (typeof lucide !== 'undefined') lucide.createIcons(); } function renderDevelopmentIndex(devIndex) { if (!devIndex) return '

No development history available

'; const categories = [ { key: 'feature', label: 'Features', icon: '', badgeClass: 'bg-primary-light text-primary' }, { key: 'enhancement', label: 'Enhancements', icon: '', badgeClass: 'bg-success-light text-success' }, { key: 'bugfix', label: 'Bug Fixes', icon: '', badgeClass: 'bg-destructive/10 text-destructive' }, { key: 'refactor', label: 'Refactorings', icon: '', badgeClass: 'bg-warning-light text-warning' }, { key: 'docs', label: 'Documentation', icon: '', badgeClass: 'bg-muted text-muted-foreground' } ]; const totalEntries = categories.reduce((sum, cat) => sum + (devIndex[cat.key]?.length || 0), 0); if (totalEntries === 0) { return '

No development history entries

'; } return `
${categories.map(cat => { const entries = devIndex[cat.key] || []; if (entries.length === 0) return ''; return `

${cat.icon} ${cat.label} ${entries.length}

${entries.slice(0, 5).map(entry => `
${escapeHtml(entry.title)}
${formatDate(entry.date)}
${entry.description ? `

${escapeHtml(entry.description)}

` : ''}
${entry.sub_feature ? `${escapeHtml(entry.sub_feature)}` : ''} ${entry.status ? `${escapeHtml(entry.status)}` : ''}
`).join('')} ${entries.length > 5 ? `
... and ${entries.length - 5} more
` : ''}
`; }).join('')}
`; }