sickbay 1.14.2 → 1.14.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":["CATEGORY_WEIGHTS","security","dependencies","performance","git","CATEGORY_COLORS","CHECK_DESCRIPTIONS","knip","depcheck","outdated","madge","coverage","jscpd","eslint","typescript","complexity","secrets","ScoreRing","t0","$","score","t1","t2","StatusBadge","status","Symbol","for","pass","warning","fail","skipped","styles","t3","About","report","checksByCategory","checks","reduce","acc","c","category","push","Object","entries","sort","a","b","map","cat","weight","replace","width","length","check","name","toolsUsed","join","id","parseStructuredSummary","text","sections","lines","split","filter","line","trim","currentSection","headingMatch","match","title","content","markdownComponents","code","children","props","strong","em","p","SectionIcon","icons","t4","t5","AISummary","isOpen","onToggle","packageName","summary","setSummary","loading","setLoading","regenerating","setRegenerating","summaryUrl","encodeURIComponent","cacheKeySuffix","timestamp","fetchSummary","cacheKey","cached","localStorage","getItem","response","fetch","ok","data","json","setItem","useEffect","handleRegenerate","removeItem","section","i","severityBadge","recommend","suggest","groupByFramework","recs","groups","rec","key","framework","BestPracticesDrawer","recommendations","grouped","_temp","t6","t7","t8","t9","_temp3","_temp2","severity","message","learnMoreUrl","order","DependencyGraph","then","m","default","getMeta","find","metadata","StatCard","label","value","sub","SectionHeader","extra","collapsed","CoverageBar","pct","color","toFixed","Math","min","CodebaseStats","codebaseCollapsed","setCodebaseCollapsed","gitCollapsed","setGitCollapsed","coverageCollapsed","setCoverageCollapsed","graphCollapsed","setGraphCollapsed","depGraph","hasComplexity","hasCoverage","hasGit","hasGraph","topFiles","maxLines","graph","keys","totalFiles","commitCount","totalLines","toLocaleString","avgLines","oversizedCount","slice","f","warn","critical","barColor","path","max","contributorCount","remoteBranches","lastCommit","branches","failed","functions","passed","statements","totalTests","circularCount","_temp4","v_2","v","v_1","v_0","Badge","red","blue","yellow","purple","isCheckConfig","entry","isDisabled","enabled","formatThresholdValue","String","Array","isArray","k","ConfigTab","config","setConfig","checksCollapsed","setChecksCollapsed","weightsCollapsed","setWeightsCollapsed","excludesCollapsed","setExcludesCollapsed","catch","finally","fetchConfig","hasCustomConfig","disabledCount","disabledChecks","overriddenCount","overriddenChecks","t10","t11","_temp7","t12","weights","_temp8","_temp9","t13","exclude","_temp0","_temp1","t14","pattern_0","pattern","value_0","defaultValue","DEFAULT_WEIGHTS","checkId","disabled","cfg","hasThresholds","thresholds","hasSuppress","suppress","hasExclude","_temp5","_temp6","rule","reason","r","CriticalIssues","onCheckClick","isCollapsed","setIsCollapsed","bb0","checksWithCriticals","totalCriticals","check_2","criticalIssues","issue_0","issue","sum","check_1","check_0","issues","buildDependencyStatuses","devDependencies","projectInfo","unused","Set","missing","Map","msg","unusedMatch","add","missingMatch","ncuMatch","pkgName","to","type","updateType","set","statuses","version","od","get","dev","has","outdatedTo","aScore","bScore","localeCompare","UpdateTotalsBanner","deps","counts","major","minor","patch","dep","OverridesSection","overrides","expanded","setExpanded","visible","pkg","DependencyList","issueCount","d","StatusBadges","badges","PAD","top","right","bottom","left","VIEW_W","VIEW_H","CHART_W","CHART_H","scoreToY","entryToX","total","formatDate","iso","Date","getMonth","getDate","scoreColor","HistoryChart","history","allCategories","from","flatMap","hiddenCategories","setHiddenCategories","toggleCategory","prev","next","delete","n","labelStep","ceil","overallPoints","points","i_0","xLabels","yLabels","values","i_1","i_2","cat_0","values_0","e_2","e","categoryScores","e_3","i_3","overallScore","t15","cat_1","backgroundColor","t16","t17","latest","prev_0","delta","cat_2","y","undefined","e_1","e_0","buildSuppressSnippet","suppressMatch","file","escapedFile","IssuesList","setFilter","showSuppressInfo","setShowSuppressInfo","allIssues","filtered","info","checkName","IssueRow","copied","setCopied","fix","command","navigator","clipboard","writeText","setTimeout","copy","suppressCopied","setSuppressCopied","snippet","copySuppress","codeChange","before","CATEGORY_ICONS","ScoreCard","onClick","active","ring","circumference","PI","offset","getScoreColor","fmt","ChatDrawer","isMonorepoReport","packageReportToSickbayReport","parentReport","projectPath","hasTypeScript","hasESLint","hasPrettier","packageManager","totalDependencies","Dashboard","monorepo","selectedPackageIdx","setSelectedPackageIdx","activeReport","packages","view","setView","selectedCheck","setSelectedCheck","isAIDrawerOpen","setIsAIDrawerOpen","isBestPracticesOpen","setIsBestPracticesOpen","setHistory","historyFetched","mainContentRef","current","scrollTo","behavior","fetchHistory","complexityMeta","gitMeta","coverageMeta","filteredChecks","handleCriticalCheckClick","monorepoType","warnings","quote","source","round","color_0","some","t18","t19","c_2","c_3","c_1","c_0","MonorepoOverviewWrapper","onSelectPackage","MonorepoOverview","loadReport","reportParam","URLSearchParams","window","location","search","JSON","parse","atob","res","ct","headers","includes","stored","App","setReport","document","getElementById","render"],"ignoreList":[],"sources":["../../src/lib/constants.ts","../../src/components/About.tsx","../../src/components/AISummary.tsx","../../src/components/BestPracticesDrawer.tsx","../../src/components/CodebaseStats.tsx","../../src/components/ConfigTab.tsx","../../src/components/CriticalIssues.tsx","../../src/components/DependencyList.tsx","../../src/components/HistoryChart.tsx","../../src/lib/suppress-snippet.ts","../../src/components/IssuesList.tsx","../../src/components/ScoreCard.tsx","../../src/components/Dashboard.tsx","../../src/lib/load-report.ts","../../src/App.tsx","../../src/main.tsx"],"sourcesContent":["// Duplicated from @nebulord/sickbay-core/constants to avoid pulling Node.js\n// dependencies into the browser bundle. Keep in sync with core.\n\n// File complexity thresholds\nexport const WARN_LINES = 400;\nexport const CRITICAL_LINES = 600;\n\n// Score thresholds\nexport const SCORE_GOOD = 80;\nexport const SCORE_FAIR = 60;\n\n// Default category weights — duplicated from core to avoid Node.js imports\nexport const DEFAULT_WEIGHTS: Record<string, number> = {\n security: 0.3,\n dependencies: 0.25,\n 'code-quality': 0.25,\n performance: 0.15,\n git: 0.05,\n};\n","import { SCORE_GOOD, SCORE_FAIR } from '../lib/constants.js';\n\nimport type { SickbayReport } from '@nebulord/sickbay-core';\n\ninterface AboutProps {\n report: SickbayReport;\n}\n\nconst CATEGORY_WEIGHTS: Record<string, number> = {\n security: 30,\n dependencies: 25,\n 'code-quality': 25,\n performance: 15,\n git: 5,\n};\n\nconst CATEGORY_COLORS: Record<string, string> = {\n security: 'bg-red-400',\n dependencies: 'bg-blue-400',\n 'code-quality': 'bg-purple-400',\n performance: 'bg-orange-400',\n git: 'bg-gray-400',\n};\n\nconst CHECK_DESCRIPTIONS: Record<string, string> = {\n knip: 'Finds unused files, exports, and dependencies that can be safely removed.',\n depcheck: 'Detects missing and unused npm packages in your dependency tree.',\n outdated: 'Checks for outdated dependencies using your package manager.',\n 'npm-audit': 'Scans for known security vulnerabilities in your dependencies.',\n madge: 'Detects circular dependencies in your module import graph.',\n 'source-map-explorer': 'Analyzes bundle composition and identifies large contributors.',\n coverage:\n 'Runs your test suite and measures code coverage across lines, functions, and branches.',\n 'license-checker': 'Scans dependency licenses and flags GPL, AGPL, or other problematic types.',\n jscpd: 'Detects copy-pasted code blocks (duplication) across your codebase.',\n git: 'Analyzes git history for staleness, commit frequency, and branch hygiene.',\n eslint: 'Runs your ESLint config and counts errors and warnings.',\n typescript: 'Runs tsc --noEmit to surface type errors without emitting output.',\n 'todo-scanner': 'Finds TODO, FIXME, and HACK comments left in source code.',\n complexity: 'Identifies oversized files by line count and flags candidates for splitting.',\n secrets: 'Detects hardcoded credentials, API keys, and tokens in source files.',\n 'heavy-deps': 'Identifies heavy or outdated dependencies that have lighter modern alternatives.',\n 'react-perf':\n 'Analyzes React components for performance anti-patterns like inline objects and index as key.',\n 'asset-size': 'Checks static asset sizes (images, fonts, SVGs) and flags oversized files.',\n 'angular-change-detection':\n 'Scans Angular components for missing OnPush change detection strategy.',\n 'angular-lazy-routes': 'Checks Angular routes for lazy loading via loadComponent().',\n 'angular-strict': 'Verifies strict TypeScript and Angular compiler settings in tsconfig.json.',\n 'angular-subscriptions': 'Detects RxJS subscriptions in components that are never unsubscribed.',\n 'angular-security': 'Detects Angular DomSanitizer bypasses and unsafe innerHTML bindings.',\n 'angular-template-performance':\n 'Flags missing trackBy in ngFor loops and function calls in templates.',\n 'angular-build-config':\n 'Checks angular.json production build settings for common misconfigurations.',\n 'next-images':\n 'Detects raw image elements that should use next/image for automatic optimization and lazy loading.',\n 'next-link':\n 'Finds raw anchor tags used for internal navigation that should use next/link for client-side routing.',\n 'next-fonts':\n 'Detects Google Fonts loaded via HTML link tags instead of next/font/google for self-hosting and performance.',\n 'next-missing-boundaries':\n 'Checks App Router route segments for missing loading.tsx and error.tsx boundary files.',\n 'next-security-headers':\n 'Verifies that next.config.js defines security response headers (CSP, X-Frame-Options, etc.).',\n 'next-client-components':\n 'Flags components with \"use client\" but no hooks or event handlers that may not need client rendering.',\n};\n\nfunction ScoreRing({ score }: { score: number }) {\n const color =\n score >= SCORE_GOOD\n ? 'text-green-400'\n : score >= SCORE_FAIR\n ? 'text-yellow-400'\n : 'text-red-400';\n return <span className={`text-xs font-mono font-bold ${color}`}>{score}</span>;\n}\n\nfunction StatusBadge({ status }: { status: string }) {\n const styles: Record<string, string> = {\n pass: 'bg-green-400/10 text-green-400',\n warning: 'bg-yellow-400/10 text-yellow-400',\n fail: 'bg-red-400/10 text-red-400',\n skipped: 'bg-gray-500/10 text-gray-500',\n };\n return (\n <span\n className={`text-xs px-1.5 py-0.5 rounded-sm font-mono ${styles[status] ?? styles.skipped}`}\n >\n {status}\n </span>\n );\n}\n\nexport function About({ report }: AboutProps) {\n const checksByCategory = report.checks.reduce<Record<string, typeof report.checks>>((acc, c) => {\n (acc[c.category] ??= []).push(c);\n return acc;\n }, {});\n\n return (\n <div className=\"space-y-10 max-w-3xl\">\n {/* Intro */}\n <section>\n <h1 className=\"text-2xl font-bold text-green-400 tracking-wider mb-2\">SICKBAY</h1>\n <p className=\"text-gray-400 leading-relaxed\">\n Sickbay is a zero-config project health dashboard. It runs a suite of checks across your\n codebase — dependencies, security, code quality, performance, and git hygiene — and\n produces a single weighted score so you can see the overall health of your project at a\n glance.\n </p>\n </section>\n\n {/* Scoring */}\n <section>\n <h2 className=\"text-sm font-semibold text-gray-400 uppercase tracking-wider mb-4\">\n How Scoring Works\n </h2>\n <p className=\"text-gray-500 text-sm mb-4\">\n Each check scores 0–100. The overall score is a weighted average grouped by category:\n </p>\n <div className=\"space-y-3\">\n {Object.entries(CATEGORY_WEIGHTS)\n .sort((a, b) => b[1] - a[1])\n .map(([cat, weight]) => (\n <div key={cat} className=\"flex items-center gap-3\">\n <div className=\"w-32 text-sm text-gray-400 capitalize\">{cat.replace('-', ' ')}</div>\n <div className=\"flex-1 bg-surface rounded-full h-3 overflow-hidden\">\n <div\n className={`h-3 rounded-full ${CATEGORY_COLORS[cat] ?? 'bg-gray-400'}`}\n style={{ width: `${weight}%` }}\n />\n </div>\n <div className=\"w-8 text-right text-sm font-mono text-gray-400\">{weight}%</div>\n </div>\n ))}\n </div>\n <div className=\"mt-4 flex gap-4 text-xs text-gray-500\">\n <span>\n <span className=\"text-green-400 font-mono font-bold\">≥80</span> — healthy\n </span>\n <span>\n <span className=\"text-yellow-400 font-mono font-bold\">60–79</span> — needs attention\n </span>\n <span>\n <span className=\"text-red-400 font-mono font-bold\">&lt;60</span> — critical\n </span>\n </div>\n </section>\n\n {/* Checks catalog */}\n <section>\n <h2 className=\"text-sm font-semibold text-gray-400 uppercase tracking-wider mb-4\">\n Checks\n </h2>\n <div className=\"space-y-6\">\n {Object.entries(CATEGORY_WEIGHTS)\n .sort((a, b) => b[1] - a[1])\n .map(([cat]) => {\n const checks = checksByCategory[cat] ?? [];\n if (checks.length === 0) return null;\n return (\n <div key={cat}>\n <div className=\"text-xs text-gray-00 uppercase tracking-wider mb-2 flex items-center gap-2\">\n <span\n className={`inline-block w-2 h-2 rounded-full ${CATEGORY_COLORS[cat] ?? 'bg-gray-400'}`}\n />\n {cat.replace('-', ' ')}\n </div>\n <div className=\"space-y-1\">\n {checks.map((check) => (\n <div\n key={check.id}\n className=\"bg-card rounded-lg px-4 py-3 flex items-start gap-4\"\n >\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-0.5\">\n <span className=\"font-mono text-sm font-semibold\">{check.name}</span>\n <span className=\"text-sm text-[cadetblue] font-mono\">\n {check.toolsUsed.join(', ')}\n </span>\n </div>\n <div className=\"text-xs text-gray-500\">\n {CHECK_DESCRIPTIONS[check.id] ?? 'No description available.'}\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <ScoreRing score={check.score} />\n <StatusBadge status={check.status} />\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n })}\n </div>\n </section>\n </div>\n );\n}\n","import React, { useState, useEffect, useCallback } from 'react';\nimport ReactMarkdown, { Components } from 'react-markdown';\n\nimport type { SickbayReport } from '@nebulord/sickbay-core';\n\ninterface AISummaryProps {\n report: SickbayReport;\n isOpen: boolean;\n onToggle: (open: boolean) => void;\n packageName?: string;\n}\n\ninterface ParsedSection {\n title: string;\n content: string;\n}\n\nfunction parseStructuredSummary(text: string): ParsedSection[] {\n const sections: ParsedSection[] = [];\n const lines = text.split('\\n').filter((line) => line.trim());\n\n let currentSection: ParsedSection | null = null;\n\n for (const line of lines) {\n // Check if line is a heading (starts with ** or is all caps)\n const headingMatch = line.match(/^\\*\\*(.+?)\\*\\*$/);\n if (headingMatch) {\n if (currentSection) sections.push(currentSection);\n currentSection = { title: headingMatch[1].trim(), content: '' };\n } else if (currentSection) {\n currentSection.content += (currentSection.content ? '\\n' : '') + line;\n }\n }\n\n if (currentSection) sections.push(currentSection);\n return sections;\n}\n\n// Custom markdown components for styling\nconst markdownComponents: Partial<Components> = {\n code: ({ children, ...props }) => (\n <code\n className=\"px-1.5 py-0.5 bg-gray-800/60 text-purple-300 rounded-sm text-xs font-mono border border-gray-700/50\"\n {...props}\n >\n {children}\n </code>\n ),\n strong: ({ children, ...props }) => (\n <strong className=\"font-medium text-gray-100\" {...props}>\n {children}\n </strong>\n ),\n em: ({ children, ...props }) => (\n <em className=\"italic\" {...props}>\n {children}\n </em>\n ),\n p: ({ children, ...props }) => (\n <p className=\"mb-1 last:mb-0\" {...props}>\n {children}\n </p>\n ),\n};\n\nfunction SectionIcon({ title }: { title: string }) {\n const icons: Record<string, string> = {\n 'Health Assessment': '●',\n 'Critical Issues': '●',\n \"What's Going Well\": '●',\n 'Next Steps': '●',\n };\n const colors: Record<string, string> = {\n 'Health Assessment': 'text-green-500',\n 'Critical Issues': 'text-red-500',\n \"What's Going Well\": 'text-green-400',\n 'Next Steps': 'text-blue-400',\n };\n return (\n <span className={`text-xs ${colors[title] || 'text-gray-400'}`}>{icons[title] || '●'}</span>\n );\n}\n\nexport function AISummary({ report, isOpen, onToggle, packageName }: AISummaryProps) {\n const [summary, setSummary] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n const [regenerating, setRegenerating] = useState(false);\n\n const summaryUrl = packageName\n ? `/ai/summary?package=${encodeURIComponent(packageName)}`\n : '/ai/summary';\n const cacheKeySuffix = packageName ? `${report.timestamp}-${packageName}` : report.timestamp;\n\n const fetchSummary = useCallback(async () => {\n const cacheKey = `sickbay-ai-summary-${cacheKeySuffix}`;\n const cached = localStorage.getItem(cacheKey);\n if (cached && !regenerating) {\n setSummary(cached);\n setLoading(false);\n return;\n }\n\n try {\n const response = await fetch(summaryUrl);\n if (response.ok) {\n const data = await response.json();\n setSummary(data.summary);\n localStorage.setItem(`sickbay-ai-summary-${cacheKeySuffix}`, data.summary);\n } else {\n setSummary(null);\n }\n } catch {\n setSummary(null);\n } finally {\n setLoading(false);\n setRegenerating(false);\n }\n }, [summaryUrl, cacheKeySuffix, regenerating]);\n\n useEffect(() => {\n fetchSummary();\n }, [fetchSummary]);\n\n const handleRegenerate = () => {\n setRegenerating(true);\n setLoading(true);\n localStorage.removeItem(`sickbay-ai-summary-${cacheKeySuffix}`);\n fetchSummary();\n };\n\n const sections = summary ? parseStructuredSummary(summary) : [];\n\n return (\n <>\n {/* Drawer */}\n {isOpen && (\n <div className=\"fixed top-6 right-6 w-104 max-h-[calc(100vh-3rem)] bg-surface border border-border rounded-lg shadow-2xl flex flex-col z-50 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 bg-linear-to-r from-purple-500/10 to-blue-500/10 border-b border-purple-500/20\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 24 24\">\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n d=\"M9.6 6.112c.322-.816 1.478-.816 1.8 0l.91 2.31a5.8 5.8 0 0 0 3.268 3.268l2.31.91c.816.322.816 1.478 0 1.8l-2.31.91a5.8 5.8 0 0 0-3.268 3.268l-.91 2.31c-.322.816-1.478.816-1.8 0l-.91-2.31a5.8 5.8 0 0 0-3.268-3.268l-2.31-.91c-.816-.322-.816-1.478 0-1.8l2.31-.91A5.8 5.8 0 0 0 8.69 8.422zm8.563-3.382a.363.363 0 0 1 .674 0l.342.866c.221.56.665 1.004 1.225 1.225l.866.342a.363.363 0 0 1 0 .674l-.866.342a2.18 2.18 0 0 0-1.225 1.225l-.342.866a.363.363 0 0 1-.674 0l-.342-.866a2.18 2.18 0 0 0-1.225-1.225l-.867-.342a.363.363 0 0 1 0-.674l.867-.342a2.18 2.18 0 0 0 1.225-1.225z\"\n />\n </svg>\n </span>\n <span className=\"font-semibold text-base text-gray-200\">AI Insights</span>\n </div>\n <div className=\"flex items-center gap-2\">\n {!loading && summary && (\n <button\n onClick={handleRegenerate}\n disabled={regenerating}\n className=\"text-xl text-gray-500 hover:text-accent transition-colors disabled:opacity-50 px-2 py-1 rounded-sm hover:bg-purple-500/10\"\n title=\"Regenerate insights\"\n >\n {regenerating ? '⠋' : '↻'}\n </button>\n )}\n <button\n onClick={() => onToggle(false)}\n className=\"text-gray-500 hover:text-white transition-colors text-xl w-6 h-6 flex items-center justify-center rounded-sm hover:bg-purple-500/10\"\n >\n ✕\n </button>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-4 space-y-3\">\n {loading ? (\n <div className=\"flex items-center gap-2 text-base text-gray-500\">\n <span className=\"animate-pulse\">⠋</span>\n <span>Generating insights...</span>\n </div>\n ) : !summary ? (\n <div className=\"space-y-2\">\n <div className=\"text-base text-gray-400\">\n AI insights are not available. This feature requires an Anthropic API key.\n </div>\n <div className=\"text-base text-gray-500 bg-card p-2.5 rounded-sm border border-border font-mono\">\n <div className=\"mb-1.5 text-gray-400\">To enable AI features:</div>\n <div>export ANTHROPIC_API_KEY=sk-ant-...</div>\n <div>sickbay --path ~/project --web</div>\n </div>\n </div>\n ) : (\n sections.map((section, i) => (\n <div key={section.title} className=\"space-y-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <SectionIcon title={section.title} />\n <h3 className=\"text-base font-semibold text-white uppercase tracking-wide\">\n {section.title}\n </h3>\n </div>\n <div className=\"text-base text-gray-300 leading-snug pl-4\">\n <ReactMarkdown components={markdownComponents}>{section.content}</ReactMarkdown>\n </div>\n {i < sections.length - 1 && <div className=\"border-t border-border/50 mt-2\" />}\n </div>\n ))\n )}\n </div>\n </div>\n )}\n </>\n );\n}\n","import type { Recommendation } from '@nebulord/sickbay-core';\n\ninterface BestPracticesDrawerProps {\n recommendations: Recommendation[];\n isOpen: boolean;\n onToggle: (open: boolean) => void;\n}\n\nconst severityBadge: Record<string, string> = {\n recommend: 'bg-amber-500/20 text-amber-300 border-amber-500/30',\n suggest: 'bg-gray-500/20 text-gray-400 border-gray-500/30',\n};\n\nfunction groupByFramework(recs: Recommendation[]): Record<string, Recommendation[]> {\n const groups: Record<string, Recommendation[]> = {};\n for (const rec of recs) {\n const key = rec.framework;\n if (!groups[key]) groups[key] = [];\n groups[key].push(rec);\n }\n return groups;\n}\n\nexport function BestPracticesDrawer({\n recommendations,\n isOpen,\n onToggle,\n}: BestPracticesDrawerProps) {\n if (!isOpen) return null;\n\n const sorted = [...recommendations].sort((a, b) => {\n const order = { recommend: 0, suggest: 1 };\n return order[a.severity] - order[b.severity];\n });\n const grouped = groupByFramework(sorted);\n\n return (\n <div className=\"fixed top-6 right-6 w-104 max-h-[calc(100vh-3rem)] bg-surface border border-border rounded-lg shadow-2xl flex flex-col z-50 overflow-hidden\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 bg-linear-to-r from-teal-500/10 to-emerald-500/10 border-b border-teal-500/20\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-lg\">💡</span>\n <span className=\"font-semibold text-base text-gray-200\">Advisor</span>\n <span className=\"text-xs text-gray-500\">\n {recommendations.length} recommendation{recommendations.length !== 1 ? 's' : ''}\n </span>\n </div>\n <button\n onClick={() => onToggle(false)}\n className=\"text-gray-500 hover:text-white transition-colors text-xl w-6 h-6 flex items-center justify-center rounded-sm hover:bg-teal-500/10\"\n >\n ✕\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-4 space-y-4\">\n {Object.entries(grouped).map(([framework, recs]) => (\n <div key={framework}>\n <div className=\"text-xs text-gray-500 uppercase tracking-wide mb-2\">{framework}</div>\n <div className=\"space-y-3\">\n {recs.map((rec) => (\n <div key={rec.id} className=\"space-y-1\">\n <div className=\"flex items-center gap-2\">\n <span\n className={`text-[10px] px-1.5 py-0.5 rounded border ${severityBadge[rec.severity]}`}\n >\n {rec.severity}\n </span>\n <span className=\"font-medium text-sm text-white\">{rec.title}</span>\n </div>\n <p className=\"text-sm text-gray-400 leading-snug pl-0.5\">{rec.message}</p>\n {rec.learnMoreUrl && (\n <a\n href={rec.learnMoreUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-xs text-teal-400 hover:text-teal-300 transition-colors pl-0.5\"\n >\n Learn more →\n </a>\n )}\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import React, { lazy, Suspense, useState } from 'react';\n\nimport type { SickbayReport } from '@nebulord/sickbay-core';\n\n// Lazy load heavy graph visualization\nconst DependencyGraph = lazy(() =>\n import('./DependencyGraph.js').then((m) => ({ default: m.DependencyGraph })),\n);\n\ninterface CodebaseStatsProps {\n report: SickbayReport;\n}\n\nfunction getMeta(report: SickbayReport, id: string): Record<string, unknown> {\n return (report.checks.find((c) => c.id === id)?.metadata ?? {}) as Record<string, unknown>;\n}\n\nfunction StatCard({ label, value, sub }: { label: string; value: string | number; sub?: string }) {\n return (\n <div className=\"bg-card rounded-lg p-4\">\n <div className=\"text-xs text-gray-500 mb-1\">{label}</div>\n <div className=\"text-2xl font-mono font-bold\">{value}</div>\n {sub && <div className=\"text-xs text-gray-500 mt-1\">{sub}</div>}\n </div>\n );\n}\n\nfunction SectionHeader({\n label,\n extra,\n collapsed,\n onToggle,\n}: {\n label: string;\n extra?: React.ReactNode;\n collapsed: boolean;\n onToggle: () => void;\n}) {\n return (\n <button onClick={onToggle} className=\"flex items-center gap-2 w-full text-left group mb-3\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={`text-gray-500 group-hover:text-gray-300 transition-transform shrink-0 ${collapsed ? '-rotate-90' : ''}`}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n <h2 className=\"text-sm font-semibold text-gray-400 uppercase tracking-wider group-hover:text-gray-200 transition-colors\">\n {label}\n </h2>\n {extra}\n </button>\n );\n}\n\nfunction CoverageBar({ label, pct }: { label: string; pct: number }) {\n const color = pct >= 80 ? 'bg-green-400' : pct >= 60 ? 'bg-yellow-400' : 'bg-red-400';\n return (\n <div>\n <div className=\"flex justify-between text-xs mb-1\">\n <span className=\"text-gray-400\">{label}</span>\n <span className=\"font-mono font-semibold\">{pct.toFixed(1)}%</span>\n </div>\n <div className=\"bg-surface rounded-full h-2\">\n <div\n className={`h-2 rounded-full transition-all ${color}`}\n style={{ width: `${Math.min(pct, 100)}%` }}\n />\n </div>\n </div>\n );\n}\n\nexport function CodebaseStats({ report }: CodebaseStatsProps) {\n const [codebaseCollapsed, setCodebaseCollapsed] = useState(false);\n const [gitCollapsed, setGitCollapsed] = useState(false);\n const [coverageCollapsed, setCoverageCollapsed] = useState(false);\n const [graphCollapsed, setGraphCollapsed] = useState(false);\n\n const complexity = getMeta(report, 'complexity');\n const git = getMeta(report, 'git');\n const coverage = getMeta(report, 'coverage');\n\n const topFiles =\n (complexity.topFiles as\n | Array<{ path: string; lines: number; fileType?: string; warn?: number; critical?: number }>\n | undefined) ?? [];\n const maxLines = topFiles[0]?.lines ?? 1;\n\n const madge = getMeta(report, 'madge');\n const depGraph = madge.graph as Record<string, string[]> | undefined;\n const hasGraph = depGraph && Object.keys(depGraph).length > 0;\n\n const hasComplexity = complexity.totalFiles != null;\n const hasGit = git.commitCount != null;\n const hasCoverage = coverage.lines != null;\n\n return (\n <div className=\"space-y-8\">\n {/* File Stats */}\n {hasComplexity && (\n <section>\n <SectionHeader\n label=\"Codebase\"\n collapsed={codebaseCollapsed}\n onToggle={() => setCodebaseCollapsed((v) => !v)}\n />\n {!codebaseCollapsed && (\n <>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-3 mb-6\">\n <StatCard label=\"total files\" value={complexity.totalFiles as number} />\n <StatCard\n label=\"total lines\"\n value={(complexity.totalLines as number).toLocaleString()}\n />\n <StatCard label=\"avg file size\" value={`${complexity.avgLines as number} loc`} />\n <StatCard\n label=\"oversized files\"\n value={complexity.oversizedCount as number}\n sub=\"over threshold\"\n />\n </div>\n\n {topFiles.length > 0 && (\n <div className=\"bg-card rounded-lg p-4\">\n <div className=\"text-xs text-gray-500 mb-3\">largest files</div>\n <div className=\"space-y-2\">\n {topFiles.slice(0, 10).map((f) => {\n const warn = f.warn ?? 400;\n const critical = f.critical ?? 600;\n const barColor =\n f.lines >= critical\n ? 'bg-red-400'\n : f.lines >= warn\n ? 'bg-yellow-400'\n : 'bg-green-400';\n return (\n <div key={f.path} className=\"flex items-center gap-3\">\n <div\n className=\"w-72 text-xs font-mono text-gray-400 truncate shrink-0\"\n title={f.path}\n >\n {f.path.split('/').slice(-2).join('/')}\n </div>\n <div className=\"flex-1 bg-surface rounded-full h-4 overflow-hidden\">\n <div\n className={`h-4 rounded-full flex items-center justify-end pr-2 text-xs font-mono text-black font-semibold ${barColor}`}\n style={{ width: `${Math.max(8, (f.lines / maxLines) * 100)}%` }}\n >\n {f.lines}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </>\n )}\n </section>\n )}\n\n {/* Git Stats */}\n {hasGit && (\n <section>\n <SectionHeader\n label=\"Git Activity\"\n collapsed={gitCollapsed}\n onToggle={() => setGitCollapsed((v) => !v)}\n />\n {!gitCollapsed && (\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-3\">\n <StatCard\n label=\"total commits\"\n value={(git.commitCount as number).toLocaleString()}\n />\n <StatCard label=\"contributors\" value={git.contributorCount as number} />\n <StatCard label=\"remote branches\" value={git.remoteBranches as number} />\n <StatCard label=\"last commit\" value={git.lastCommit as string} />\n </div>\n )}\n </section>\n )}\n\n {/* Coverage */}\n {hasCoverage && (\n <section>\n <SectionHeader\n label=\"Test Coverage\"\n collapsed={coverageCollapsed}\n onToggle={() => setCoverageCollapsed((v) => !v)}\n />\n {!coverageCollapsed && (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <div className=\"bg-card rounded-lg p-4 space-y-3\">\n <CoverageBar label=\"Lines\" pct={coverage.lines as number} />\n <CoverageBar label=\"Statements\" pct={coverage.statements as number} />\n <CoverageBar label=\"Functions\" pct={coverage.functions as number} />\n <CoverageBar label=\"Branches\" pct={coverage.branches as number} />\n </div>\n {coverage.totalTests != null && (\n <div className=\"grid grid-cols-2 gap-3\">\n <StatCard label=\"total tests\" value={coverage.totalTests as number} />\n <StatCard\n label=\"passing\"\n value={coverage.passed as number}\n sub={`${coverage.failed} failing`}\n />\n </div>\n )}\n </div>\n )}\n </section>\n )}\n\n {/* Module Dependency Graph */}\n {hasGraph && (\n <section>\n <SectionHeader\n label=\"Module Graph\"\n extra={\n <span className=\"text-xs font-normal text-gray-500\">\n {Object.keys(depGraph).length} modules\n {(madge.circularCount as number) > 0 && (\n <span className=\"text-red-400 ml-1\">\n · {madge.circularCount as number} circular\n </span>\n )}\n </span>\n }\n collapsed={graphCollapsed}\n onToggle={() => setGraphCollapsed((v) => !v)}\n />\n {!graphCollapsed && (\n <Suspense fallback={<div className=\"text-gray-500 text-sm\">Loading graph...</div>}>\n <DependencyGraph graph={depGraph} circularCount={madge.circularCount as number} />\n </Suspense>\n )}\n </section>\n )}\n\n {!hasComplexity && !hasGit && !hasCoverage && !hasGraph && (\n <div className=\"text-gray-500 text-sm\">No codebase stats available yet.</div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\n\nimport { DEFAULT_WEIGHTS } from '../lib/constants.js';\n\nimport type { SickbayReport } from '@nebulord/sickbay-core';\n\ninterface CheckConfig {\n enabled?: boolean;\n thresholds?: Record<string, unknown>;\n exclude?: string[];\n suppress?: Array<{ path?: string; match?: string; reason: string }>;\n}\n\ninterface RawConfig {\n checks?: Record<string, boolean | CheckConfig>;\n exclude?: string[];\n weights?: Record<string, number>;\n}\n\ninterface ConfigTabProps {\n report: SickbayReport;\n}\n\nfunction Badge({ label, color }: { label: string; color: string }) {\n const colorClasses: Record<string, string> = {\n red: 'bg-red-500/20 text-red-300',\n blue: 'bg-blue-500/20 text-blue-300',\n yellow: 'bg-yellow-500/20 text-yellow-300',\n purple: 'bg-purple-500/20 text-purple-300',\n };\n return (\n <span\n className={`px-1.5 py-0.5 rounded text-xs font-mono ${colorClasses[color] ?? 'bg-gray-500/20 text-gray-300'}`}\n >\n {label}\n </span>\n );\n}\n\nfunction SectionHeader({\n label,\n collapsed,\n onToggle,\n}: {\n label: string;\n collapsed: boolean;\n onToggle: () => void;\n}) {\n return (\n <button onClick={onToggle} className=\"flex items-center gap-2 w-full text-left group mb-3\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={`text-gray-500 group-hover:text-gray-300 transition-transform shrink-0 ${collapsed ? '-rotate-90' : ''}`}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n <h2 className=\"text-sm font-semibold text-gray-400 uppercase tracking-wider group-hover:text-gray-200 transition-colors\">\n {label}\n </h2>\n </button>\n );\n}\n\nfunction isCheckConfig(entry: boolean | CheckConfig): entry is CheckConfig {\n return typeof entry === 'object';\n}\n\nfunction isDisabled(entry: boolean | CheckConfig): boolean {\n if (entry === false) return true;\n if (isCheckConfig(entry) && entry.enabled === false) return true;\n return false;\n}\n\nfunction formatThresholdValue(value: unknown): string {\n if (typeof value === 'number') return String(value);\n if (Array.isArray(value)) return value.join(', ');\n if (typeof value === 'object' && value !== null) {\n return Object.entries(value)\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ');\n }\n return String(value);\n}\n\nexport function ConfigTab({ report }: ConfigTabProps) {\n const [config, setConfig] = useState<RawConfig | null>(null);\n const [loading, setLoading] = useState(true);\n const [checksCollapsed, setChecksCollapsed] = useState(false);\n const [weightsCollapsed, setWeightsCollapsed] = useState(false);\n const [excludesCollapsed, setExcludesCollapsed] = useState(false);\n\n const fetchConfig = useCallback(() => {\n fetch('/sickbay-config.json')\n .then((r) => (r.ok ? (r.json() as Promise<RawConfig>) : null))\n .then((data) => {\n if (data) setConfig(data);\n })\n .catch(() => {\n /* no config available */\n })\n .finally(() => setLoading(false));\n }, []);\n\n useEffect(() => {\n fetchConfig();\n }, [fetchConfig]);\n\n // No custom config — show empty state\n if (!report.config?.hasCustomConfig) {\n return (\n <div className=\"flex items-center justify-center h-48 text-gray-500 text-sm font-mono\">\n No custom configuration — Sickbay is running with all defaults\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-48 text-gray-500 text-sm font-mono\">\n Loading configuration...\n </div>\n );\n }\n\n const disabledCount = report.config.disabledChecks.length;\n const overriddenCount = report.config.overriddenChecks.length;\n\n return (\n <div className=\"space-y-8\">\n {/* Banner */}\n <div className=\"bg-card rounded-lg p-4 border border-border\">\n <div className=\"flex items-center gap-3\">\n <div className=\"text-green-400 text-lg\">&#9881;</div>\n <div>\n <div className=\"text-sm font-semibold\">Custom configuration active</div>\n <div className=\"text-xs text-gray-500 mt-0.5\">\n {disabledCount > 0 && <span className=\"text-red-400\">{disabledCount} disabled</span>}\n {disabledCount > 0 && overriddenCount > 0 && <span> · </span>}\n {overriddenCount > 0 && (\n <span className=\"text-blue-400\">{overriddenCount} overridden</span>\n )}\n {disabledCount === 0 && overriddenCount === 0 && (\n <span>Weight or exclude overrides active</span>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* Checks Section */}\n {config?.checks && Object.keys(config.checks).length > 0 && (\n <section>\n <SectionHeader\n label=\"Checks\"\n collapsed={checksCollapsed}\n onToggle={() => setChecksCollapsed((v) => !v)}\n />\n {!checksCollapsed && (\n <div className=\"bg-card rounded-lg divide-y divide-border\">\n {Object.entries(config.checks).map(([checkId, entry]) => {\n const disabled = isDisabled(entry);\n const cfg = isCheckConfig(entry) ? entry : null;\n const hasThresholds = cfg?.thresholds && Object.keys(cfg.thresholds).length > 0;\n const hasSuppress = cfg?.suppress && cfg.suppress.length > 0;\n const hasExclude = cfg?.exclude && cfg.exclude.length > 0;\n\n return (\n <div key={checkId} className={`px-4 py-3 ${disabled ? 'opacity-50' : ''}`}>\n <div className=\"flex items-center justify-between\">\n <span className=\"font-mono text-sm\">{checkId}</span>\n <div className=\"flex gap-1.5\">\n {disabled && <Badge label=\"disabled\" color=\"red\" />}\n {hasThresholds && <Badge label=\"thresholds\" color=\"blue\" />}\n {hasSuppress && (\n <Badge label={`${cfg!.suppress!.length} suppressed`} color=\"yellow\" />\n )}\n {hasExclude && <Badge label=\"exclude\" color=\"purple\" />}\n </div>\n </div>\n\n {/* Expandable threshold details */}\n {hasThresholds && (\n <div className=\"mt-2 pl-2 border-l-2 border-blue-500/30\">\n {Object.entries(cfg!.thresholds!).map(([key, value]) => (\n <div key={key} className=\"text-xs text-gray-400 font-mono\">\n <span className=\"text-gray-500\">{key}:</span>{' '}\n {formatThresholdValue(value)}\n </div>\n ))}\n </div>\n )}\n\n {/* Suppress details */}\n {hasSuppress && (\n <div className=\"mt-2 pl-2 border-l-2 border-yellow-500/30 space-y-1\">\n {cfg!.suppress!.map((rule, i) => (\n <div\n key={`${rule.path ?? ''}-${rule.match ?? ''}-${i}`}\n className=\"text-xs\"\n >\n <div className=\"text-gray-400 font-mono\">\n {rule.path && <span>path: {rule.path}</span>}\n {rule.path && rule.match && <span> · </span>}\n {rule.match && <span>match: {rule.match}</span>}\n </div>\n <div className=\"text-gray-500 italic\">{rule.reason}</div>\n </div>\n ))}\n </div>\n )}\n\n {/* Exclude details */}\n {hasExclude && (\n <div className=\"mt-2 pl-2 border-l-2 border-purple-500/30\">\n {cfg!.exclude!.map((pattern) => (\n <div key={pattern} className=\"text-xs text-gray-400 font-mono\">\n {pattern}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </section>\n )}\n\n {/* Weights Section */}\n {config?.weights && Object.keys(config.weights).length > 0 && (\n <section>\n <SectionHeader\n label=\"Scoring Weights\"\n collapsed={weightsCollapsed}\n onToggle={() => setWeightsCollapsed((v) => !v)}\n />\n {!weightsCollapsed && (\n <div className=\"bg-card rounded-lg p-4\">\n <div className=\"space-y-2\">\n {Object.entries(config.weights).map(([category, value]) => {\n const defaultValue = DEFAULT_WEIGHTS[category] ?? 0;\n const increased = value > defaultValue;\n const decreased = value < defaultValue;\n return (\n <div key={category} className=\"flex items-center justify-between\">\n <span className=\"font-mono text-sm text-gray-300\">{category}</span>\n <div className=\"flex items-center gap-2 text-sm font-mono\">\n <span className=\"text-gray-500\">{defaultValue}</span>\n <span className=\"text-gray-600\">&rarr;</span>\n <span\n className={\n increased\n ? 'text-green-400'\n : decreased\n ? 'text-red-400'\n : 'text-gray-300'\n }\n >\n {value}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </section>\n )}\n\n {/* Global Excludes Section */}\n {config?.exclude && config.exclude.length > 0 && (\n <section>\n <SectionHeader\n label=\"Global Excludes\"\n collapsed={excludesCollapsed}\n onToggle={() => setExcludesCollapsed((v) => !v)}\n />\n {!excludesCollapsed && (\n <div className=\"bg-card rounded-lg p-4\">\n <div className=\"space-y-1\">\n {config.exclude.map((pattern) => (\n <div key={pattern} className=\"text-sm font-mono text-gray-400\">\n {pattern}\n </div>\n ))}\n </div>\n </div>\n )}\n </section>\n )}\n </div>\n );\n}\n","import { useState, useEffect } from 'react';\n\nimport type { SickbayReport } from '@nebulord/sickbay-core';\n\ninterface CriticalIssuesProps {\n report: SickbayReport;\n onCheckClick: (checkId: string) => void;\n}\n\nexport function CriticalIssues({ report, onCheckClick }: CriticalIssuesProps) {\n // Collapse state with localStorage persistence - must be at top level\n const [isCollapsed, setIsCollapsed] = useState(() => {\n const stored = localStorage.getItem('sickbay-critical-issues-collapsed');\n return stored !== 'false';\n });\n\n useEffect(() => {\n localStorage.setItem('sickbay-critical-issues-collapsed', String(isCollapsed));\n }, [isCollapsed]);\n\n // Aggregate all critical issues by check\n const checksWithCriticals = report.checks\n .map((check) => ({\n ...check,\n criticalIssues: check.issues.filter((issue) => issue.severity === 'critical'),\n }))\n .filter((check) => check.criticalIssues.length > 0);\n\n if (checksWithCriticals.length === 0) {\n return null;\n }\n\n const totalCriticals = checksWithCriticals.reduce(\n (sum, check) => sum + check.criticalIssues.length,\n 0,\n );\n\n return (\n <div className=\"bg-red-900/10 border border-red-800/30 rounded-lg p-4 mb-6\">\n <button\n onClick={() => setIsCollapsed(!isCollapsed)}\n className=\"w-full flex items-center gap-2 hover:opacity-80 transition-opacity\"\n >\n <span className=\"text-lg\">❗</span>\n <h2 className=\"text-lg font-semibold text-red-400\">Critical Issues</h2>\n <span className=\"text-sm text-gray-400\">({totalCriticals} total)</span>\n <span\n className={`ml-auto text-gray-500 transition-transform ${isCollapsed ? '' : 'rotate-180'}`}\n >\n ▼\n </span>\n </button>\n\n {!isCollapsed && (\n <>\n <div className=\"space-y-3\">\n {checksWithCriticals.map((check) => (\n <div key={check.id} className=\"space-y-1.5\">\n <button\n onClick={() => onCheckClick(check.id)}\n className=\"text-accent hover:underline text-sm font-semibold flex items-center gap-2\"\n >\n {check.name}\n <span className=\"text-xs text-gray-500\">\n ({check.criticalIssues.length} critical)\n </span>\n </button>\n <ul className=\"space-y-1 ml-4\">\n {check.criticalIssues.slice(0, 3).map((issue) => (\n <li key={issue.message} className=\"text-sm text-gray-300\">\n <span className=\"text-red-400 mr-2\">•</span>\n {issue.message}\n </li>\n ))}\n {check.criticalIssues.length > 3 && (\n <li className=\"text-xs text-gray-500\">\n +{check.criticalIssues.length - 3} more critical issues\n </li>\n )}\n </ul>\n </div>\n ))}\n </div>\n\n <div className=\"mt-3 pt-3 border-t border-red-800/30 text-xs text-gray-500\">\n Click on a check name to view all issues in detail\n </div>\n </>\n )}\n </div>\n );\n}\n","import { useState } from 'react';\n\nimport type { SickbayReport } from '@nebulord/sickbay-core';\n\ninterface DependencyStatus {\n name: string;\n version: string;\n dev: boolean;\n unused: boolean;\n missing: boolean;\n outdatedTo?: string;\n updateType?: 'major' | 'minor' | 'patch';\n}\n\nfunction buildDependencyStatuses(report: SickbayReport): DependencyStatus[] {\n const { dependencies, devDependencies } = report.projectInfo;\n\n // Collect flags from check issues\n const unused = new Set<string>();\n const missing = new Set<string>();\n const outdated = new Map<string, { to: string; updateType: 'major' | 'minor' | 'patch' }>();\n\n for (const check of report.checks) {\n for (const issue of check.issues) {\n const msg = issue.message;\n\n // knip / depcheck: \"Unused dependency: react\"\n const unusedMatch = msg.match(/^Unused (?:dev)?dependency:\\s+(.+)/i);\n if (unusedMatch) unused.add(unusedMatch[1].trim());\n\n // depcheck: \"Missing dependency: react\"\n const missingMatch = msg.match(/^Missing dependency:\\s+(.+)/i);\n if (missingMatch) missing.add(missingMatch[1].trim());\n\n // outdated: \"react: 17.0.2 → 18.0.0 (major)\" or legacy \"react: 17.0.2 → 18.0.0\"\n const ncuMatch = msg.match(\n /^([^:]+):\\s*([^\\s]+)\\s*→\\s*([^\\s]+?)(?:\\s*\\((major|minor|patch)\\))?$/,\n );\n if (ncuMatch) {\n const [, pkgName, , to, type] = ncuMatch;\n const updateType =\n (type as 'major' | 'minor' | 'patch') ??\n (issue.severity === 'warning' ? 'major' : 'minor');\n outdated.set(pkgName.trim(), { to: to.trim(), updateType });\n }\n }\n }\n\n const statuses: DependencyStatus[] = [];\n for (const [name, version] of Object.entries(dependencies)) {\n const od = outdated.get(name);\n statuses.push({\n name,\n version,\n dev: false,\n unused: unused.has(name),\n missing: missing.has(name),\n outdatedTo: od?.to,\n updateType: od?.updateType,\n });\n }\n for (const [name, version] of Object.entries(devDependencies)) {\n const od = outdated.get(name);\n statuses.push({\n name,\n version,\n dev: true,\n unused: unused.has(name),\n missing: missing.has(name),\n outdatedTo: od?.to,\n updateType: od?.updateType,\n });\n }\n\n // Sort: issues first, then alphabetical\n return statuses.sort((a, b) => {\n const aScore = (a.missing ? 3 : 0) + (a.unused ? 2 : 0) + (a.outdatedTo ? 1 : 0);\n const bScore = (b.missing ? 3 : 0) + (b.unused ? 2 : 0) + (b.outdatedTo ? 1 : 0);\n if (bScore !== aScore) return bScore - aScore;\n return a.name.localeCompare(b.name);\n });\n}\n\nfunction UpdateTotalsBanner({ deps }: { deps: DependencyStatus[] }) {\n const counts = { major: 0, minor: 0, patch: 0 };\n for (const dep of deps) {\n if (dep.updateType) counts[dep.updateType]++;\n }\n const total = counts.major + counts.minor + counts.patch;\n\n if (total === 0) {\n return (\n <div className=\"mb-4 px-4 py-3 rounded-lg bg-green-900/20 border border-green-800/50\">\n <span className=\"text-sm text-green-400\">All dependencies up to date</span>\n </div>\n );\n }\n\n return (\n <div className=\"mb-4 flex items-center gap-3 px-4 py-3 rounded-lg bg-gray-900/50 border border-gray-800\">\n <span className=\"text-sm text-gray-400\">Updates available:</span>\n {counts.major > 0 && (\n <span className=\"text-xs px-2.5 py-1 rounded-full bg-orange-900/40 text-orange-400 border border-orange-800 font-medium\">\n {counts.major} major\n </span>\n )}\n {counts.minor > 0 && (\n <span className=\"text-xs px-2.5 py-1 rounded-full bg-blue-900/30 text-blue-400 border border-blue-800 font-medium\">\n {counts.minor} minor\n </span>\n )}\n {counts.patch > 0 && (\n <span className=\"text-xs px-2.5 py-1 rounded-full bg-gray-800 text-gray-400 border border-gray-700 font-medium\">\n {counts.patch} patch\n </span>\n )}\n </div>\n );\n}\n\nfunction OverridesSection({ overrides }: { overrides: Record<string, string> }) {\n const entries = Object.entries(overrides);\n const [expanded, setExpanded] = useState(entries.length <= 3);\n\n if (entries.length === 0) return null;\n\n const visible = expanded ? entries : entries.slice(0, 3);\n\n return (\n <div className=\"mb-4 rounded-lg border border-gray-800 bg-gray-900/30 overflow-hidden\">\n <div className=\"px-4 py-2.5 flex items-center gap-2 border-b border-gray-800/50\">\n <span className=\"text-sm font-medium text-gray-300\">Package Overrides</span>\n <span className=\"text-xs px-1.5 py-0.5 rounded-sm bg-gray-700 text-gray-400\">\n {entries.length}\n </span>\n </div>\n <div className=\"px-4 py-2\">\n {visible.map(([pkg, version]) => (\n <div key={pkg} className=\"flex items-center gap-2 py-1\">\n <span className=\"font-mono text-sm text-gray-300\">{pkg}</span>\n <span className=\"text-gray-600\">→</span>\n <span className=\"font-mono text-sm text-yellow-500\">{version}</span>\n </div>\n ))}\n {!expanded && entries.length > 3 && (\n <button\n onClick={() => setExpanded(true)}\n className=\"text-xs text-blue-400 hover:text-blue-300 mt-1 cursor-pointer\"\n >\n Show all {entries.length} overrides\n </button>\n )}\n {expanded && entries.length > 3 && (\n <button\n onClick={() => setExpanded(false)}\n className=\"text-xs text-blue-400 hover:text-blue-300 mt-1 cursor-pointer\"\n >\n Show fewer\n </button>\n )}\n </div>\n </div>\n );\n}\n\ninterface Props {\n report: SickbayReport;\n}\n\nexport function DependencyList({ report }: Props) {\n const deps = buildDependencyStatuses(report);\n const issueCount = deps.filter((d) => d.unused || d.missing || d.outdatedTo).length;\n return (\n <div>\n <UpdateTotalsBanner deps={deps} />\n\n {report.projectInfo.overrides && (\n <OverridesSection overrides={report.projectInfo.overrides} />\n )}\n\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-white\">\n Dependencies\n <span className=\"ml-2 text-sm font-normal text-gray-400\">{deps.length} total</span>\n </h2>\n {issueCount > 0 && (\n <div className=\"relative group inline-flex\">\n <span className=\"text-xs text-yellow-400 flex items-center gap-1 cursor-help\">\n {issueCount} with issues\n <span className=\"text-gray-500\">ℹ</span>\n </span>\n <div className=\"absolute bottom-full right-0 mb-2 hidden group-hover:block w-56 z-10\">\n <div className=\"bg-gray-900 text-gray-200 text-xs rounded-sm px-3 py-2 shadow-lg border border-gray-700\">\n Dependencies that are <strong className=\"text-yellow-400\">unused</strong>,{' '}\n <strong className=\"text-red-400\">missing</strong>, or{' '}\n <strong className=\"text-blue-400\">outdated</strong>\n <div className=\"absolute top-full right-4 -mt-1 w-2 h-2 bg-gray-900 border-r border-b border-gray-700 transform rotate-45\"></div>\n </div>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"rounded-lg border border-gray-800 overflow-hidden\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-gray-800 bg-gray-900/50\">\n <th className=\"text-left px-4 py-2 text-gray-400 font-medium\">Package</th>\n <th className=\"text-left px-4 py-2 text-gray-400 font-medium\">Version</th>\n <th className=\"text-left px-4 py-2 text-gray-400 font-medium\">Type</th>\n <th className=\"text-left px-4 py-2 text-gray-400 font-medium\">Status</th>\n </tr>\n </thead>\n <tbody>\n {deps.map((dep) => (\n <tr\n key={`${dep.dev ? 'dev' : 'prod'}-${dep.name}`}\n className=\"border-b border-gray-800/50 hover:bg-gray-800/30 transition-colors\"\n >\n <td className=\"px-4 py-2.5\">\n <a\n href={`https://www.npmjs.com/package/${dep.name}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"font-mono text-green-400 hover:text-green-300 hover:underline\"\n >\n {dep.name}\n </a>\n </td>\n <td className=\"px-4 py-2.5 font-mono text-gray-300\">\n {dep.version}\n {dep.outdatedTo && <span className=\"ml-2 text-gray-500\">→ {dep.outdatedTo}</span>}\n </td>\n <td className=\"px-4 py-2.5\">\n <span\n className={`text-xs px-1.5 py-0.5 rounded-sm ${dep.dev ? 'bg-gray-700 text-gray-400' : 'bg-gray-800 text-gray-500'}`}\n >\n {dep.dev ? 'dev' : 'prod'}\n </span>\n </td>\n <td className=\"px-4 py-2.5\">\n <StatusBadges dep={dep} />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n <div className=\"mt-4 px-4 py-3 rounded-lg bg-gray-900/30 border border-gray-800/50\">\n <span className=\"text-sm text-gray-400\">\n For deep dependency inspection, try{' '}\n <a\n href=\"https://github.com/antfu/node-modules-inspector\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-400 hover:text-blue-300 hover:underline\"\n >\n Node Modules Inspector\n </a>{' '}\n — run{' '}\n <code className=\"px-1.5 py-0.5 rounded bg-gray-800 text-green-400 text-xs\">\n npx node-modules-inspector\n </code>\n </span>\n </div>\n </div>\n );\n}\n\nfunction StatusBadges({ dep }: { dep: DependencyStatus }) {\n const badges = [];\n\n if (dep.missing) {\n badges.push(\n <span\n key=\"missing\"\n className=\"text-xs px-2 py-0.5 rounded-full bg-red-900/50 text-red-400 border border-red-800\"\n >\n missing\n </span>,\n );\n }\n if (dep.unused) {\n badges.push(\n <span\n key=\"unused\"\n className=\"text-xs px-2 py-0.5 rounded-full bg-yellow-900/40 text-yellow-500 border border-yellow-800\"\n >\n unused\n </span>,\n );\n }\n if (dep.updateType === 'major') {\n badges.push(\n <span\n key=\"outdated\"\n className=\"text-xs px-2 py-0.5 rounded-full bg-orange-900/40 text-orange-400 border border-orange-800\"\n >\n major update\n </span>,\n );\n } else if (dep.updateType === 'minor') {\n badges.push(\n <span\n key=\"outdated\"\n className=\"text-xs px-2 py-0.5 rounded-full bg-blue-900/30 text-blue-400 border border-blue-800\"\n >\n minor update\n </span>,\n );\n } else if (dep.updateType === 'patch') {\n badges.push(\n <span\n key=\"outdated\"\n className=\"text-xs px-2 py-0.5 rounded-full bg-gray-800 text-gray-400 border border-gray-700\"\n >\n patch update\n </span>,\n );\n }\n if (badges.length === 0) {\n badges.push(\n <span key=\"ok\" className=\"text-xs text-gray-600\">\n ✓\n </span>,\n );\n }\n\n return <div className=\"flex gap-1.5 flex-wrap\">{badges}</div>;\n}\n","import { useState } from 'react';\n\nimport { SCORE_GOOD, SCORE_FAIR } from '../lib/constants.js';\n\nexport interface TrendEntry {\n timestamp: string;\n overallScore: number;\n categoryScores: Record<string, number>;\n summary: { critical: number; warnings: number; info: number };\n checksRun: number;\n}\n\nexport interface TrendHistory {\n projectPath: string;\n projectName: string;\n entries: TrendEntry[];\n}\n\ninterface HistoryChartProps {\n history: TrendHistory;\n}\n\nconst CATEGORY_COLORS: Record<string, string> = {\n dependencies: '#60a5fa',\n security: '#f87171',\n 'code-quality': '#a78bfa',\n performance: '#fb923c',\n git: '#34d399',\n};\n\nconst PAD = { top: 20, right: 24, bottom: 44, left: 44 };\nconst VIEW_W = 800;\nconst VIEW_H = 300;\nconst CHART_W = VIEW_W - PAD.left - PAD.right;\nconst CHART_H = VIEW_H - PAD.top - PAD.bottom;\n\nfunction scoreToY(score: number): number {\n return PAD.top + (1 - score / 100) * CHART_H;\n}\n\nfunction entryToX(i: number, total: number): number {\n if (total === 1) return PAD.left + CHART_W / 2;\n return PAD.left + (i / (total - 1)) * CHART_W;\n}\n\nfunction formatDate(iso: string): string {\n const d = new Date(iso);\n return `${d.getMonth() + 1}/${d.getDate()}`;\n}\n\nfunction scoreColor(score: number): string {\n if (score >= SCORE_GOOD) return '#4ade80';\n if (score >= SCORE_FAIR) return '#facc15';\n return '#f87171';\n}\n\nexport function HistoryChart({ history }: HistoryChartProps) {\n const { entries } = history;\n\n const allCategories = Array.from(new Set(entries.flatMap((e) => Object.keys(e.categoryScores))));\n\n const [hiddenCategories, setHiddenCategories] = useState<Set<string>>(new Set());\n\n if (entries.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-48 text-gray-500 text-sm font-mono\">\n No history yet — run <code className=\"mx-1 px-1 bg-card rounded-sm\">sickbay</code> to start\n tracking\n </div>\n );\n }\n\n const toggleCategory = (cat: string) => {\n setHiddenCategories((prev) => {\n const next = new Set(prev);\n if (next.has(cat)) next.delete(cat);\n else next.add(cat);\n return next;\n });\n };\n\n const n = entries.length;\n\n // X-axis labels — show at most 8 to avoid crowding\n const labelStep = Math.max(1, Math.ceil(n / 8));\n const xLabels = entries\n .map((e, i) => ({ i, timestamp: e.timestamp, label: formatDate(e.timestamp) }))\n .filter(({ i }) => i % labelStep === 0 || i === n - 1);\n\n // Y-axis labels\n const yLabels = [0, 20, 40, 60, 80, 100];\n\n // Build polyline points for a series\n function points(values: number[]): string {\n return values.map((v, i) => `${entryToX(i, n)},${scoreToY(v)}`).join(' ');\n }\n\n const overallPoints = points(entries.map((e) => e.overallScore));\n\n return (\n <div className=\"space-y-4\">\n <div className=\"bg-surface rounded-lg border border-border p-4\">\n <svg\n viewBox={`0 0 ${VIEW_W} ${VIEW_H}`}\n className=\"w-full\"\n aria-label=\"Score history chart\"\n role=\"img\"\n >\n {/* Y-axis gridlines */}\n {yLabels.map((y) => (\n <g key={y}>\n <line\n x1={PAD.left}\n y1={scoreToY(y)}\n x2={PAD.left + CHART_W}\n y2={scoreToY(y)}\n stroke={y === 60 || y === 80 ? (y === 80 ? '#4ade8033' : '#facc1533') : '#ffffff0d'}\n strokeWidth={y === 60 || y === 80 ? 1.5 : 1}\n strokeDasharray={y === 60 || y === 80 ? '4 3' : undefined}\n />\n <text\n x={PAD.left - 8}\n y={scoreToY(y) + 4}\n textAnchor=\"end\"\n fontSize={10}\n fill=\"#6b7280\"\n >\n {y}\n </text>\n </g>\n ))}\n\n {/* X-axis labels */}\n {xLabels.map(({ i, timestamp, label }) => (\n <text\n key={timestamp}\n x={entryToX(i, n)}\n y={VIEW_H - 8}\n textAnchor=\"middle\"\n fontSize={10}\n fill=\"#6b7280\"\n >\n {label}\n </text>\n ))}\n\n {/* Category lines (behind overall) */}\n {allCategories.map((cat) => {\n if (hiddenCategories.has(cat)) return null;\n const values = entries.map((e) => e.categoryScores[cat] ?? 0);\n return (\n <polyline\n key={cat}\n points={points(values)}\n fill=\"none\"\n stroke={CATEGORY_COLORS[cat] ?? '#9ca3af'}\n strokeWidth={1.5}\n strokeOpacity={0.5}\n />\n );\n })}\n\n {/* Overall score line (prominent) */}\n <polyline points={overallPoints} fill=\"none\" stroke=\"#ffffff\" strokeWidth={2.5} />\n\n {/* Overall score dots */}\n {entries.map((e, i) => (\n <circle\n key={e.timestamp}\n cx={entryToX(i, n)}\n cy={scoreToY(e.overallScore)}\n r={3}\n fill={scoreColor(e.overallScore)}\n stroke=\"#0d1117\"\n strokeWidth={1}\n />\n ))}\n </svg>\n </div>\n\n {/* Legend */}\n <div className=\"flex flex-wrap gap-3 px-1\">\n {/* Overall */}\n <div className=\"flex items-center gap-1.5 text-xs font-mono text-white\">\n <span className=\"inline-block w-5 h-0.5 bg-white rounded-sm\" />\n overall\n </div>\n\n {allCategories.map((cat) => {\n const color = CATEGORY_COLORS[cat] ?? '#9ca3af';\n const hidden = hiddenCategories.has(cat);\n return (\n <button\n key={cat}\n onClick={() => toggleCategory(cat)}\n className={`flex items-center gap-1.5 text-xs font-mono transition-opacity ${hidden ? 'opacity-30' : 'opacity-80 hover:opacity-100'}`}\n style={{ color }}\n >\n <span\n className=\"inline-block w-5 h-0.5 rounded-sm\"\n style={{ backgroundColor: color }}\n />\n {cat}\n </button>\n );\n })}\n </div>\n\n {/* Latest scores summary */}\n {entries.length > 0 &&\n (() => {\n const latest = entries[entries.length - 1];\n const prev = entries.length > 1 ? entries[entries.length - 2] : null;\n const delta = prev ? latest.overallScore - prev.overallScore : null;\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-3\">\n <div className=\"bg-surface border border-border rounded-lg p-3\">\n <div className=\"text-xs text-gray-500 mb-1\">current overall</div>\n <div\n className=\"text-2xl font-bold font-mono\"\n style={{ color: scoreColor(latest.overallScore) }}\n >\n {latest.overallScore}\n {delta !== null && (\n <span\n className=\"text-sm ml-1.5\"\n style={{ color: delta >= 0 ? '#4ade80' : '#f87171' }}\n >\n {delta >= 0 ? `+${delta}` : delta}\n </span>\n )}\n </div>\n </div>\n\n {allCategories.map((cat) => {\n const score = latest.categoryScores[cat];\n if (score == null) return null;\n return (\n <div key={cat} className=\"bg-surface border border-border rounded-lg p-3\">\n <div className=\"text-xs text-gray-500 mb-1\">{cat}</div>\n <div\n className=\"text-2xl font-bold font-mono\"\n style={{ color: CATEGORY_COLORS[cat] ?? scoreColor(score) }}\n >\n {score}\n </div>\n </div>\n );\n })}\n </div>\n );\n })()}\n </div>\n );\n}\n","interface SuppressSnippetInput {\n checkId: string;\n suppressMatch?: string;\n message?: string;\n file?: string;\n}\n\nexport function buildSuppressSnippet({\n checkId,\n suppressMatch,\n message,\n file,\n}: SuppressSnippetInput): string {\n const match = (suppressMatch ?? message ?? '').replace(/'/g, \"\\\\'\");\n const escapedFile = file?.replace(/'/g, \"\\\\'\");\n const pathComment = escapedFile ? ` /* path: '${escapedFile}', */` : '';\n return `// sickbay.config.ts → checks.${checkId}.suppress\\n{ match: '${match}',${pathComment} reason: '' }`;\n}\n","import { useState } from 'react';\n\nimport { buildSuppressSnippet } from '../lib/suppress-snippet.js';\n\nimport type { CheckResult, Issue } from '@nebulord/sickbay-core';\n\ninterface IssuesListProps {\n checks: CheckResult[];\n}\n\nexport function IssuesList({ checks }: IssuesListProps) {\n const [filter, setFilter] = useState<'all' | 'critical' | 'warning' | 'info'>('all');\n const [showSuppressInfo, setShowSuppressInfo] = useState<boolean>(false);\n\n const allIssues = checks.flatMap((c) =>\n c.issues.map((issue) => ({ ...issue, checkName: c.name, checkId: c.id })),\n );\n\n const filtered = filter === 'all' ? allIssues : allIssues.filter((i) => i.severity === filter);\n\n const counts = {\n critical: allIssues.filter((i) => i.severity === 'critical').length,\n warning: allIssues.filter((i) => i.severity === 'warning').length,\n info: allIssues.filter((i) => i.severity === 'info').length,\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex gap-2 items-center\">\n {(['all', 'critical', 'warning', 'info'] as const).map((f) => (\n <button\n key={f}\n onClick={() => setFilter(f)}\n className={`px-3 py-1 rounded text-xs font-mono transition-colors\n ${filter === f ? 'bg-accent text-black' : 'bg-surface border border-border text-gray-400 hover:border-accent/50'}`}\n >\n {f === 'all' ? `all (${allIssues.length})` : `${f} (${counts[f]})`}\n </button>\n ))}\n <button\n onClick={() => setShowSuppressInfo(!showSuppressInfo)}\n className={`ml-auto text-xs transition-colors ${showSuppressInfo ? 'text-accent' : 'text-gray-500 hover:text-gray-300'}`}\n title=\"About suppress rules\"\n >\n ⓘ\n </button>\n </div>\n\n {showSuppressInfo && (\n <div className=\"bg-surface border border-border rounded px-4 py-3 text-sm text-gray-300 space-y-2\">\n <p>\n Click <span className=\"font-mono text-gray-400\">⊘ suppress</span> on any issue to copy a\n suppression rule to your clipboard.\n </p>\n <p>\n Paste it into the <span className=\"font-mono text-gray-400\">suppress</span> array for\n that check in your <span className=\"font-mono text-gray-400\">sickbay.config.ts</span> to\n hide accepted findings from future scans.\n </p>\n <a\n href=\"https://nebulord-dev.github.io/sickbay/guide/suppress-rules\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-block text-accent hover:underline text-xs\"\n >\n Learn more →\n </a>\n </div>\n )}\n\n <div className=\"flex flex-col gap-1\">\n {filtered.length === 0 && (\n <div className=\"text-gray-500 text-sm py-4 text-center\">No issues found ✓</div>\n )}\n {filtered.map((issue) => (\n <IssueRow\n key={`${issue.checkName}-${issue.message}`}\n issue={issue}\n checkName={issue.checkName}\n checkId={issue.checkId}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction IssueRow({\n issue,\n checkName,\n checkId,\n}: {\n issue: Issue & { checkId: string };\n checkName: string;\n checkId: string;\n}) {\n const [copied, setCopied] = useState(false);\n\n const copy = () => {\n if (issue.fix?.command) {\n navigator.clipboard.writeText(issue.fix.command);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n };\n\n const [suppressCopied, setSuppressCopied] = useState(false);\n\n const copySuppress = () => {\n const snippet = buildSuppressSnippet({\n checkId,\n suppressMatch: issue.suppressMatch,\n message: issue.message,\n file: issue.file,\n });\n navigator.clipboard.writeText(snippet).catch(() => {});\n setSuppressCopied(true);\n setTimeout(() => setSuppressCopied(false), 2000);\n };\n\n const color =\n issue.severity === 'critical'\n ? 'border-l-red-500 bg-red-500/5'\n : issue.severity === 'warning'\n ? 'border-l-yellow-500 bg-yellow-500/5'\n : 'border-l-gray-500 bg-gray-500/5';\n\n return (\n <div className={`flex flex-col gap-2 px-3 py-2 border-l-2 rounded-r ${color}`}>\n <div className=\"flex items-start gap-3\">\n <span className=\"text-xs text-gray-500 shrink-0 pt-0.5\">{checkName}</span>\n <span className=\"flex-1 text-sm\">{issue.message}</span>\n {issue.fix?.command && (\n <button\n onClick={copy}\n className=\"shrink-0 text-xs text-gray-500 hover:text-accent font-mono transition-colors\"\n >\n {copied ? '✓ copied' : issue.fix.command}\n </button>\n )}\n <button\n onClick={copySuppress}\n className=\"shrink-0 text-xs text-gray-500 hover:text-accent font-mono transition-colors\"\n >\n {suppressCopied ? '✓ copied' : '⊘ suppress'}\n </button>\n </div>\n\n {issue.file && (\n <div className=\"text-xs text-gray-500 font-mono flex items-center gap-1\">\n <span>📄</span>\n <span>{issue.file}</span>\n </div>\n )}\n\n {issue.fix?.codeChange && (\n <div className=\"bg-black/30 rounded-sm p-3 font-mono text-xs border border-red-800/30\">\n <div className=\"text-red-400 mb-2 flex items-center gap-1.5\">\n <span>⚠️</span>\n <span className=\"font-semibold\">Offensive code:</span>\n </div>\n <code className=\"text-gray-300 block whitespace-pre-wrap break-all\">\n {issue.fix.codeChange.before}\n </code>\n </div>\n )}\n </div>\n );\n}\n","import { SCORE_GOOD, SCORE_FAIR } from '../lib/constants.js';\n\nimport type { CheckResult } from '@nebulord/sickbay-core';\n\nconst CATEGORY_ICONS: Record<string, string> = {\n dependencies: '📦',\n security: '🔒',\n 'code-quality': '🔄',\n performance: '⚡',\n git: '🌿',\n};\n\ninterface ScoreCardProps {\n check: CheckResult;\n onClick?: () => void;\n active?: boolean;\n}\n\nexport function ScoreCard({ check, onClick, active }: ScoreCardProps) {\n const color =\n check.score >= SCORE_GOOD\n ? 'text-green-400'\n : check.score >= SCORE_FAIR\n ? 'text-yellow-400'\n : 'text-red-400';\n const ring =\n check.score >= SCORE_GOOD\n ? 'stroke-green-400'\n : check.score >= SCORE_FAIR\n ? 'stroke-yellow-400'\n : 'stroke-red-400';\n const circumference = 2 * Math.PI * 28;\n const offset = circumference - (check.score / 100) * circumference;\n\n const criticalIssues = check.issues.filter((issue) => issue.severity === 'critical');\n\n return (\n <button\n onClick={onClick}\n className={`flex flex-col items-center gap-2 p-4 rounded-lg border transition-all cursor-pointer text-left w-full\n ${active ? 'border-accent bg-card' : 'border-border bg-surface hover:border-accent/50'}`}\n >\n <div className=\"relative w-16 h-16\">\n <svg className=\"w-16 h-16 -rotate-90\" viewBox=\"0 0 64 64\">\n <circle cx=\"32\" cy=\"32\" r=\"28\" fill=\"none\" stroke=\"#2a2a2a\" strokeWidth=\"4\" />\n <circle\n cx=\"32\"\n cy=\"32\"\n r=\"28\"\n fill=\"none\"\n strokeWidth=\"4\"\n strokeDasharray={circumference}\n strokeDashoffset={offset}\n strokeLinecap=\"round\"\n className={`transition-all duration-700 ${ring}`}\n />\n </svg>\n <span\n className={`absolute inset-0 flex items-center justify-center text-lg font-bold ${color}`}\n >\n {check.score}\n </span>\n </div>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold\">\n {CATEGORY_ICONS[check.category]} {check.name}\n </div>\n <div className=\"text-xs text-gray-500 mt-0.5\">{check.toolsUsed.join(', ')}</div>\n </div>\n {check.issues.length > 0 && (\n <div className=\"text-xs text-gray-400\">\n {check.issues.length} issue{check.issues.length !== 1 ? 's' : ''}\n </div>\n )}\n\n {criticalIssues.length > 0 && (\n <div className=\"w-full mt-2 pt-3 border-t border-red-900/30\">\n <div className=\"text-xs text-red-400 font-semibold mb-1.5 text-center\">\n 🚨 {criticalIssues.length} Critical\n </div>\n <ul className=\"space-y-1 text-left\">\n {criticalIssues.slice(0, 2).map((issue) => (\n <li key={issue.message} className=\"text-xs text-gray-400 truncate\">\n • {issue.message}\n </li>\n ))}\n {criticalIssues.length > 2 && (\n <li className=\"text-xs text-gray-500\">+{criticalIssues.length - 2} more</li>\n )}\n </ul>\n </div>\n )}\n </button>\n );\n}\n","import { useState, lazy, Suspense, useEffect, useRef, useCallback } from 'react';\n\nimport { SCORE_GOOD, SCORE_FAIR } from '../lib/constants.js';\n\nimport type { SickbayReport, MonorepoReport, PackageReport } from '@nebulord/sickbay-core';\n\nfunction getScoreColor(score: number) {\n if (score >= SCORE_GOOD) return 'green';\n if (score >= SCORE_FAIR) return 'yellow';\n return 'red';\n}\n\nfunction getMeta(report: SickbayReport, id: string): Record<string, unknown> {\n return (report.checks.find((c) => c.id === id)?.metadata ?? {}) as Record<string, unknown>;\n}\n\nfunction fmt(n: number): string {\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(n);\n}\n\nimport { About } from './About.js';\nimport { AISummary } from './AISummary.js';\nimport { BestPracticesDrawer } from './BestPracticesDrawer.js';\nimport { CodebaseStats } from './CodebaseStats.js';\nimport { ConfigTab } from './ConfigTab.js';\nimport { CriticalIssues } from './CriticalIssues.js';\nimport { DependencyList } from './DependencyList.js';\nimport { HistoryChart } from './HistoryChart.js';\nimport { IssuesList } from './IssuesList.js';\nimport { ScoreCard } from './ScoreCard.js';\n\nimport type { TrendHistory } from './HistoryChart.js';\n\n// Lazy load heavy components\nconst ChatDrawer = lazy(() => import('./ChatDrawer.js').then((m) => ({ default: m.ChatDrawer })));\n\ninterface DashboardProps {\n report: SickbayReport | MonorepoReport;\n}\n\ntype View = 'overview' | 'issues' | 'dependencies' | 'codebase' | 'history' | 'config' | 'about';\n\nfunction isMonorepoReport(r: SickbayReport | MonorepoReport): r is MonorepoReport {\n return 'isMonorepo' in r;\n}\n\n/** Build a minimal SickbayReport from a PackageReport for use in existing Dashboard components */\nfunction packageReportToSickbayReport(\n pkg: PackageReport,\n parentReport: MonorepoReport,\n): SickbayReport {\n return {\n timestamp: parentReport.timestamp,\n projectPath: pkg.path,\n projectInfo: {\n name: pkg.name,\n version: 'unknown',\n hasTypeScript: false,\n hasESLint: false,\n hasPrettier: false,\n framework: pkg.framework,\n packageManager: parentReport.packageManager,\n totalDependencies:\n Object.keys(pkg.dependencies).length + Object.keys(pkg.devDependencies).length,\n dependencies: pkg.dependencies,\n devDependencies: pkg.devDependencies,\n },\n checks: pkg.checks,\n overallScore: pkg.score,\n summary: pkg.summary,\n };\n}\n\nexport function Dashboard({ report }: DashboardProps) {\n const monorepo = isMonorepoReport(report) ? report : null;\n // For monorepo: -1 = overview, 0..n-1 = package index\n const [selectedPackageIdx, setSelectedPackageIdx] = useState(-1);\n\n // Resolve the active single-project report: from monorepo package or direct\n const activeReport: SickbayReport | null = monorepo\n ? selectedPackageIdx >= 0\n ? packageReportToSickbayReport(monorepo.packages[selectedPackageIdx], monorepo)\n : null\n : (report as SickbayReport);\n const [view, setView] = useState<View>('overview');\n const [selectedCheck, setSelectedCheck] = useState<string | null>(null);\n const [isAIDrawerOpen, setIsAIDrawerOpen] = useState(false);\n const [isBestPracticesOpen, setIsBestPracticesOpen] = useState(false);\n const [history, setHistory] = useState<TrendHistory | null>(null);\n const historyFetched = useRef(false);\n const scoreColor = getScoreColor(activeReport?.overallScore ?? report.overallScore);\n const mainContentRef = useRef<HTMLDivElement>(null);\n\n // Reset view when switching packages\n useEffect(() => {\n setView('overview');\n setSelectedCheck(null);\n setIsAIDrawerOpen(false);\n setIsBestPracticesOpen(false);\n }, [selectedPackageIdx]);\n\n // Scroll to top when view changes\n useEffect(() => {\n mainContentRef.current?.scrollTo({ top: 0, behavior: 'smooth' });\n }, [view]);\n\n // Lazily fetch history when History tab is first activated\n const fetchHistory = useCallback(() => {\n if (historyFetched.current) return;\n historyFetched.current = true;\n fetch('/sickbay-history.json')\n .then((r) => (r.ok ? r.json() : null))\n .then((data: TrendHistory | null) => {\n if (data && Array.isArray(data.entries) && data.entries.length > 0) {\n setHistory(data);\n }\n })\n .catch(() => {\n /* no history available */\n });\n }, []);\n\n const complexityMeta = activeReport ? getMeta(activeReport, 'complexity') : {};\n const gitMeta = activeReport ? getMeta(activeReport, 'git') : {};\n const coverageMeta = activeReport ? getMeta(activeReport, 'coverage') : {};\n\n const filteredChecks = activeReport\n ? selectedCheck\n ? activeReport.checks.filter((c) => c.id === selectedCheck)\n : activeReport.checks.filter((c) => c.status !== 'skipped')\n : [];\n\n const handleCriticalCheckClick = (checkId: string) => {\n setSelectedCheck(checkId);\n setView('overview');\n };\n\n return (\n <div className=\"flex h-screen overflow-hidden\">\n {/* Sidebar */}\n <aside className=\"w-72 border-r border-border flex flex-col shrink-0 bg-surface\">\n <div className=\"p-4 border-b border-border\">\n <div className=\"text-green-400 font-bold text-xl tracking-wider\">SICKBAY</div>\n <div className=\"text-gray-400 text-xs mt-0.5\">\n {monorepo ? 'Monorepo Health Dashboard' : 'Project Health Dashboard'}\n </div>\n </div>\n\n {monorepo ? (\n /* Monorepo sidebar: package list */\n <>\n <div className=\"p-4 border-b border-border\">\n <div className=\"text-xs text-gray-500 mb-1\">monorepo</div>\n <div className=\"font-semibold text-sm\">{monorepo.monorepoType} workspaces</div>\n <div className=\"text-xs text-gray-500\">\n {monorepo.packages.length} packages · {monorepo.packageManager}\n </div>\n </div>\n <div className=\"p-4 border-b border-border\">\n <div className=\"text-xs text-gray-500 mb-2\">overall score</div>\n <div\n className={`text-4xl font-bold ${scoreColor === 'green' ? 'text-green-400' : scoreColor === 'yellow' ? 'text-yellow-400' : 'text-red-400'}`}\n >\n {monorepo.overallScore}\n </div>\n <div className=\"text-xs text-gray-500 mt-1\">\n <span className=\"text-red-400\">{monorepo.summary.critical} critical</span>\n {' · '}\n <span className=\"text-yellow-400\">{monorepo.summary.warnings} warnings</span>\n </div>\n {monorepo.quote && (\n <p className=\"text-sm italic text-gray-400 mt-2\">\n \"{monorepo.quote.text}\"{' '}\n <span className=\"not-italic\">— {monorepo.quote.source}</span>\n </p>\n )}\n </div>\n <nav className=\"p-2 flex-1 overflow-y-auto\">\n <div className=\"text-xs text-gray-500 px-2 py-1\">packages</div>\n <button\n onClick={() => setSelectedPackageIdx(-1)}\n className={`w-full flex items-center justify-between px-2 py-1.5 rounded text-sm transition-colors\n ${selectedPackageIdx === -1 ? 'bg-card text-white' : 'text-gray-400 hover:text-white hover:bg-card/50'}`}\n >\n <span className=\"font-mono\">overview</span>\n </button>\n {monorepo.packages.map((pkg, i) => {\n const color =\n pkg.score >= SCORE_GOOD\n ? 'text-green-400'\n : pkg.score >= SCORE_FAIR\n ? 'text-yellow-400'\n : 'text-red-400';\n return (\n <button\n key={pkg.path}\n onClick={() => setSelectedPackageIdx(i)}\n className={`w-full flex items-center justify-between px-2 py-1.5 rounded text-sm transition-colors\n ${selectedPackageIdx === i ? 'bg-card text-white' : 'text-gray-400 hover:text-white hover:bg-card/50'}`}\n >\n <span className=\"font-mono truncate text-left\">{pkg.name}</span>\n <span className={`text-xs font-bold ml-2 shrink-0 ${color}`}>{pkg.score}</span>\n </button>\n );\n })}\n </nav>\n <div className=\"p-3 border-t border-border text-xs text-gray-600\">\n {new Date(monorepo.timestamp).toLocaleString()}\n </div>\n </>\n ) : activeReport ? (\n /* Single-project sidebar */\n <>\n <div className=\"p-4 border-b border-border\">\n <div className=\"text-xs text-gray-500 mb-1\">project</div>\n <div className=\"font-semibold\">{activeReport.projectInfo.name}</div>\n <div className=\"text-xs text-gray-500\">v{activeReport.projectInfo.version}</div>\n <div className=\"text-xs text-gray-500 mt-1\">\n {activeReport.projectInfo.framework} · {activeReport.projectInfo.packageManager}\n </div>\n <div className=\"text-xs text-gray-500\">\n {activeReport.projectInfo.totalDependencies} deps\n </div>\n </div>\n\n {/* Stats strip */}\n <div className=\"px-4 py-3 border-b border-border grid grid-cols-2 gap-x-3 gap-y-2\">\n {complexityMeta.totalFiles != null && (\n <>\n <div>\n <div className=\"text-xs text-gray-500\">files</div>\n <div className=\"text-sm font-mono font-semibold\">\n {fmt(complexityMeta.totalFiles as number)}\n </div>\n </div>\n <div>\n <div className=\"text-xs text-gray-500\">lines</div>\n <div className=\"text-sm font-mono font-semibold\">\n {fmt(complexityMeta.totalLines as number)}\n </div>\n </div>\n </>\n )}\n {gitMeta.contributorCount != null && (\n <>\n <div>\n <div className=\"text-xs text-gray-500\">contributors</div>\n <div className=\"text-sm font-mono font-semibold\">\n {String(gitMeta.contributorCount)}\n </div>\n </div>\n <div>\n <div className=\"text-xs text-gray-500\">last commit</div>\n <div className=\"text-sm font-mono font-semibold truncate\">\n {String(gitMeta.lastCommit)}\n </div>\n </div>\n </>\n )}\n {coverageMeta.lines != null && (\n <div className=\"col-span-2\">\n <div className=\"text-xs text-gray-500\">coverage</div>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1 bg-card rounded-full h-1.5\">\n <div\n className=\"h-1.5 rounded-full bg-green-400\"\n style={{ width: `${coverageMeta.lines}%` }}\n />\n </div>\n <span className=\"text-sm font-mono font-semibold\">\n {Math.round(coverageMeta.lines as number)}%\n </span>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"p-4 border-b border-border\">\n <div className=\"text-xs text-gray-500 mb-2\">overall score</div>\n <div\n className={`text-4xl font-bold ${scoreColor === 'green' ? 'text-green-400' : scoreColor === 'yellow' ? 'text-yellow-400' : 'text-red-400'}`}\n >\n {activeReport.overallScore}\n </div>\n <div className=\"text-xs text-gray-500 mt-1\">\n <span className=\"text-red-400\">{activeReport.summary.critical} critical</span>\n {' · '}\n <span className=\"text-yellow-400\">{activeReport.summary.warnings} warnings</span>\n {' · '}\n <span className=\"text-gray-400\">{activeReport.summary.info} info</span>\n </div>\n {activeReport.quote && (\n <p className=\"text-sm italic text-gray-400 mt-2\">\n \"{activeReport.quote.text}\"{' '}\n <span className=\"not-italic\">— {activeReport.quote.source}</span>\n </p>\n )}\n </div>\n\n <nav className=\"p-2 flex-1 overflow-y-auto\">\n <div className=\"text-xs text-gray-500 px-2 py-1\">checks</div>\n {activeReport.checks\n .filter((c) => c.status !== 'skipped')\n .map((check) => {\n const color =\n check.score >= SCORE_GOOD\n ? 'text-green-400'\n : check.score >= SCORE_FAIR\n ? 'text-yellow-400'\n : 'text-red-400';\n return (\n <button\n key={check.id}\n onClick={() => {\n setSelectedCheck(selectedCheck === check.id ? null : check.id);\n setView('issues');\n }}\n className={`w-full flex items-center justify-between px-2 py-1.5 rounded text-sm transition-colors\n ${selectedCheck === check.id ? 'bg-card text-white' : 'text-gray-400 hover:text-white hover:bg-card/50'}`}\n >\n <span className=\"font-mono\">{check.name}</span>\n <span className={`text-xs font-bold ${color}`}>{check.score}</span>\n </button>\n );\n })}\n {activeReport.checks.some((c) => c.status === 'skipped') && (\n <>\n <div className=\"text-xs text-gray-500 px-2 py-1 mt-2\">skipped</div>\n {activeReport.checks\n .filter((c) => c.status === 'skipped')\n .map((check) => (\n <div\n key={check.id}\n className=\"w-full flex items-center justify-between px-2 py-1.5 rounded text-sm text-gray-600\"\n >\n <span className=\"font-mono\">{check.name}</span>\n <span className=\"text-xs bg-gray-500/10 text-gray-500 px-1.5 py-0.5 rounded-sm font-mono\">\n skipped\n </span>\n </div>\n ))}\n </>\n )}\n </nav>\n\n <div className=\"p-3 border-t border-border text-xs text-gray-600\">\n {new Date(activeReport.timestamp).toLocaleString()}\n </div>\n </>\n ) : null}\n </aside>\n\n {/* Main content */}\n <main ref={mainContentRef} className=\"flex-1 overflow-y-auto\">\n {/* Monorepo overview mode — show MonorepoOverview */}\n {monorepo && selectedPackageIdx === -1 ? (\n <MonorepoOverviewWrapper report={monorepo} onSelectPackage={setSelectedPackageIdx} />\n ) : activeReport ? (\n <>\n <div className=\"p-4 border-b border-border flex items-center\">\n <div className=\"flex gap-2 flex-1\">\n {(['overview', 'issues', 'dependencies', 'codebase'] as View[]).map((v) => (\n <button\n key={v}\n onClick={() => {\n setView(v);\n if (v === 'overview') {\n setSelectedCheck(null);\n }\n }}\n className={`px-3 py-1 rounded text-sm font-mono transition-colors\n ${view === v ? 'bg-accent text-black font-semibold' : 'text-gray-400 hover:text-white'}`}\n >\n {v}\n </button>\n ))}\n {/* History tab only for root single-project (not per-package in monorepo) */}\n {!monorepo && (\n <button\n onClick={() => {\n setView('history');\n fetchHistory();\n }}\n className={`px-3 py-1 rounded text-sm font-mono transition-colors\n ${view === 'history' ? 'bg-accent text-black font-semibold' : 'text-gray-400 hover:text-white'}`}\n >\n history\n </button>\n )}\n {activeReport?.config?.hasCustomConfig && (\n <button\n onClick={() => setView('config')}\n className={`px-3 py-1 rounded text-sm font-mono transition-colors\n ${view === 'config' ? 'bg-accent text-black font-semibold' : 'text-gray-400 hover:text-white'}`}\n >\n config\n </button>\n )}\n </div>\n <div className=\"flex gap-2\">\n {activeReport?.recommendations && activeReport.recommendations.length > 0 && (\n <button\n onClick={() => setIsBestPracticesOpen(!isBestPracticesOpen)}\n className={`px-3 py-1 rounded text-sm font-mono transition-colors flex items-center gap-1.5\n ${isBestPracticesOpen ? 'bg-teal-500/20 text-teal-300 font-semibold' : 'text-gray-400 hover:text-white'}`}\n >\n <span>💡</span>\n <span>advisor</span>\n </button>\n )}\n {(!monorepo || selectedPackageIdx >= 0) && (\n <button\n onClick={() => setIsAIDrawerOpen(!isAIDrawerOpen)}\n className={`px-3 py-1 rounded text-sm font-mono transition-colors flex items-center gap-1.5\n ${isAIDrawerOpen ? 'bg-purple-500/20 text-purple-300 font-semibold' : 'text-gray-400 hover:text-white'}`}\n >\n <span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n d=\"M9.6 6.112c.322-.816 1.478-.816 1.8 0l.91 2.31a5.8 5.8 0 0 0 3.268 3.268l2.31.91c.816.322.816 1.478 0 1.8l-2.31.91a5.8 5.8 0 0 0-3.268 3.268l-.91 2.31c-.322.816-1.478.816-1.8 0l-.91-2.31a5.8 5.8 0 0 0-3.268-3.268l-2.31-.91c-.816-.322-.816-1.478 0-1.8l2.31-.91A5.8 5.8 0 0 0 8.69 8.422zm8.563-3.382a.363.363 0 0 1 .674 0l.342.866c.221.56.665 1.004 1.225 1.225l.866.342a.363.363 0 0 1 0 .674l-.866.342a2.18 2.18 0 0 0-1.225 1.225l-.342.866a.363.363 0 0 1-.674 0l-.342-.866a2.18 2.18 0 0 0-1.225-1.225l-.867-.342a.363.363 0 0 1 0-.674l.867-.342a2.18 2.18 0 0 0 1.225-1.225z\"\n />\n </svg>\n </span>\n <span>ai insights</span>\n </button>\n )}\n <button\n onClick={() => setView('about')}\n className={`px-3 py-1 rounded text-sm font-mono transition-colors\n ${view === 'about' ? 'bg-accent text-black font-semibold' : 'text-gray-400 hover:text-white'}`}\n >\n about\n </button>\n </div>\n </div>\n\n <div className=\"p-6\">\n {view === 'overview' && (\n <>\n <CriticalIssues report={activeReport} onCheckClick={handleCriticalCheckClick} />\n <div className=\"grid grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\n {filteredChecks.map((check) => (\n <ScoreCard\n key={check.id}\n check={check}\n onClick={() => {\n setSelectedCheck(selectedCheck === check.id ? null : check.id);\n setView('overview');\n }}\n active={selectedCheck === check.id}\n />\n ))}\n </div>\n </>\n )}\n\n {view === 'issues' && <IssuesList checks={filteredChecks} />}\n\n {view === 'dependencies' && <DependencyList report={activeReport} />}\n\n {view === 'codebase' && <CodebaseStats report={activeReport} />}\n\n {view === 'history' &&\n !monorepo &&\n (history ? (\n <HistoryChart history={history} />\n ) : (\n <div className=\"flex items-center justify-center h-48 text-gray-500 text-sm font-mono\">\n No history found — run{' '}\n <code className=\"mx-1 px-1 bg-card rounded-sm\">sickbay init</code> then scan at\n least once\n </div>\n ))}\n\n {view === 'config' && activeReport && <ConfigTab report={activeReport} />}\n\n {view === 'about' && <About report={activeReport} />}\n </div>\n </>\n ) : null}\n </main>\n\n {/* AI Insights Drawer */}\n {activeReport && (!monorepo || selectedPackageIdx >= 0) && (\n <AISummary\n report={activeReport}\n isOpen={isAIDrawerOpen}\n onToggle={setIsAIDrawerOpen}\n packageName={monorepo ? monorepo.packages[selectedPackageIdx]?.name : undefined}\n />\n )}\n\n {/* Best Practices Drawer */}\n {activeReport?.recommendations && activeReport.recommendations.length > 0 && (\n <BestPracticesDrawer\n recommendations={activeReport.recommendations}\n isOpen={isBestPracticesOpen}\n onToggle={setIsBestPracticesOpen}\n />\n )}\n\n {/* AI Chat Drawer */}\n {activeReport && (!monorepo || selectedPackageIdx >= 0) && (\n <Suspense fallback={null}>\n <ChatDrawer\n report={activeReport}\n packageName={monorepo ? monorepo.packages[selectedPackageIdx]?.name : undefined}\n />\n </Suspense>\n )}\n </div>\n );\n}\n\n/** Thin wrapper that lazily loads MonorepoOverview to avoid bundling it in the main chunk */\nfunction MonorepoOverviewWrapper({\n report,\n onSelectPackage,\n}: {\n report: MonorepoReport;\n onSelectPackage: (idx: number) => void;\n}) {\n const MonorepoOverview = lazy(() =>\n import('./MonorepoOverview.js').then((m) => ({ default: m.MonorepoOverview })),\n );\n return (\n <Suspense fallback={<div className=\"p-8 text-gray-500\">Loading overview...</div>}>\n <MonorepoOverview report={report} onSelectPackage={onSelectPackage} />\n </Suspense>\n );\n}\n","import type { SickbayReport, MonorepoReport } from '@nebulord/sickbay-core';\n\n/**\n * loadReport attempts to retrieve a SickbayReport or MonorepoReport from multiple potential\n * sources in a prioritized manner:\n * 1. URL Query Parameter: It checks if there's a 'report' parameter in the URL, which can\n * contain a base64-encoded JSON string of the report.\n * 2. Server Fetch: If the query parameter is not present or invalid, it tries to fetch a\n * 'sickbay-report.json' file from the server root.\n * 3. Local Storage: As a fallback, it looks for a 'sickbay-report' entry in localStorage.\n */\n\nexport async function loadReport(): Promise<SickbayReport | MonorepoReport | null> {\n // 1. Try URL query param: ?report=<base64 or path>\n const params = new URLSearchParams(window.location.search);\n const reportParam = params.get('report');\n\n if (reportParam) {\n try {\n return JSON.parse(atob(reportParam)) as SickbayReport | MonorepoReport;\n } catch {\n // not base64, try as path\n }\n }\n\n // 2. Try fetching sickbay-report.json from the server root\n try {\n const res = await fetch('/sickbay-report.json');\n const ct = res.headers.get('content-type') ?? '';\n if (res.ok && ct.includes('json')) return res.json() as Promise<SickbayReport | MonorepoReport>;\n } catch {\n // not available\n }\n\n // 3. Try localStorage\n const stored = localStorage.getItem('sickbay-report');\n if (stored) {\n try {\n return JSON.parse(stored) as SickbayReport | MonorepoReport;\n } catch {\n // corrupted\n }\n }\n\n return null;\n}\n","import { useState, useEffect } from 'react';\n\nimport { Dashboard } from './components/Dashboard.js';\nimport { loadReport } from './lib/load-report.js';\n\nimport type { SickbayReport, MonorepoReport } from '@nebulord/sickbay-core';\n\nexport function App() {\n const [report, setReport] = useState<SickbayReport | MonorepoReport | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n loadReport()\n .then((r) => {\n setReport(r);\n setLoading(false);\n })\n .catch(() => {\n // treat load failures the same as no report found\n setLoading(false);\n });\n }, []);\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-screen text-green-400\">\n <div className=\"text-center\">\n <div className=\"text-2xl font-bold mb-2\">SICKBAY</div>\n <div className=\"text-sm text-gray-500 animate-pulse\">Loading report...</div>\n </div>\n </div>\n );\n }\n\n if (!report) {\n return (\n <div className=\"flex items-center justify-center h-screen\">\n <div className=\"text-center max-w-md\">\n <div className=\"text-green-400 text-3xl font-bold mb-4\">SICKBAY</div>\n <div className=\"text-gray-400 mb-6\">\n No report found. Run sickbay in your project first:\n </div>\n <div className=\"bg-card border border-border rounded-lg p-4 text-left\">\n <div className=\"text-green-400 font-mono text-sm\">\n $ npx sickbay --json {'>'} sickbay-report.json\n </div>\n </div>\n <div className=\"text-xs text-gray-600 mt-4\">\n Or drop a sickbay-report.json in this directory\n </div>\n </div>\n </div>\n );\n }\n\n return <Dashboard report={report} />;\n}\n","import React from 'react';\n\nimport { createRoot } from 'react-dom/client';\n\nimport { App } from './App.js';\nimport './index.css';\n\ncreateRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <App />\n </React.StrictMode>,\n);\n"],"file":"index-B_XNCPiK.js"}
@@ -9,7 +9,7 @@
9
9
  href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&display=swap"
10
10
  rel="stylesheet"
11
11
  />
12
- <script type="module" crossorigin src="/assets/index-BSAa6zMs.js"></script>
12
+ <script type="module" crossorigin src="/assets/index-B_XNCPiK.js"></script>
13
13
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-B1FJdls4.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/markdown-BkROfETq.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/react-BEi4PGB1.js">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sickbay",
3
- "version": "1.14.2",
3
+ "version": "1.14.3",
4
4
  "description": "Zero-config health check CLI for JavaScript and TypeScript projects",
5
5
  "license": "MIT",
6
6
  "repository": {