@uncaughtdev/core 0.1.1 → 0.2.0
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.
- package/README.md +44 -3
- package/dist/chunk-2YXXFGBV.js +2 -0
- package/dist/chunk-2YXXFGBV.js.map +1 -0
- package/dist/chunk-3FCDO7OR.mjs +23 -0
- package/dist/chunk-3FCDO7OR.mjs.map +1 -0
- package/dist/chunk-A6GKDPT3.mjs +2 -0
- package/dist/chunk-A6GKDPT3.mjs.map +1 -0
- package/dist/chunk-BXMN7NW4.mjs +2 -0
- package/dist/chunk-BXMN7NW4.mjs.map +1 -0
- package/dist/chunk-HANXURHX.mjs +59 -0
- package/dist/chunk-HANXURHX.mjs.map +1 -0
- package/dist/chunk-MSUAXLMV.js +2 -0
- package/dist/chunk-MSUAXLMV.js.map +1 -0
- package/dist/chunk-VQXSHR3C.js +59 -0
- package/dist/chunk-VQXSHR3C.js.map +1 -0
- package/dist/chunk-WZBG5VLB.js +23 -0
- package/dist/chunk-WZBG5VLB.js.map +1 -0
- package/dist/index.d.mts +64 -3
- package/dist/index.d.ts +64 -3
- package/dist/index.js +7 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -26
- package/dist/index.mjs.map +1 -1
- package/dist/local-api-handler-pages.js +1 -1
- package/dist/local-api-handler-pages.js.map +1 -1
- package/dist/local-api-handler-pages.mjs +1 -1
- package/dist/local-api-handler-pages.mjs.map +1 -1
- package/dist/local-api-handler.d.mts +1 -1
- package/dist/local-api-handler.d.ts +1 -1
- package/dist/local-api-handler.js +1 -1
- package/dist/local-api-handler.mjs +1 -1
- package/dist/local-viewer.js +432 -46
- package/dist/local-viewer.js.map +1 -1
- package/dist/local-viewer.mjs +432 -46
- package/dist/local-viewer.mjs.map +1 -1
- package/dist/mcp-server.d.mts +1 -0
- package/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +22 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-server.mjs +22 -0
- package/dist/mcp-server.mjs.map +1 -0
- package/dist/sqlite-store-4FTNST7O.js +2 -0
- package/dist/sqlite-store-4FTNST7O.js.map +1 -0
- package/dist/sqlite-store-TEXDAAOM.mjs +2 -0
- package/dist/sqlite-store-TEXDAAOM.mjs.map +1 -0
- package/dist/{types-CjgYXVc_.d.mts → types-D1Fw4k-D.d.mts} +12 -1
- package/dist/{types-CjgYXVc_.d.ts → types-D1Fw4k-D.d.ts} +12 -1
- package/package.json +9 -2
- package/dist/chunk-FFHQ452Q.js +0 -2
- package/dist/chunk-FFHQ452Q.js.map +0 -1
- package/dist/chunk-JALIO2BZ.mjs +0 -2
- package/dist/chunk-JALIO2BZ.mjs.map +0 -1
package/dist/local-viewer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/local-viewer.ts"],"names":["RESET","BOLD","DIM","RED","GREEN","YELLOW","CYAN","WHITE","GRAY","BG_RED","BG_GREEN","BG_YELLOW","c","color","text","getBaseDir","r","getIssuesPath","loadIssues","raw","saveIssues","issues","indexPath","tmpPath","cmdList","header","formatRow","i","issue","num","status","formatStatus","count","title","truncate","type","lastSeen","formatRelativeTime","errorCol","cmdShow","indexStr","openInEditor","idx","promptPath","content","editor","spawn","fallback","cmdClear","baseDir","entries","entry","fullPath","cmdResolve","error","iso","then","diffMs","seconds","minutes","hours","days","str","maxLen","printUsage","fileExists","p","dirExists","exec","cmd","args","resolve","child","code","detectFramework","cwd","result","pkg","allDeps","installArgs","pm","pkgs","findLastImport","last","re","m","insertImport","importLine","lastIdx","insertPos","firstNL","cmdInit","det","inst","ext","tsExt","projectKey","appDir","layoutPath","patchFileWithProvider","routeDir","routePath","patchNextConfig","pagesDir","appPath","candidates","entryPath","f","filePath","mode","rel","providerOpen","providerClose","patched","childrenMatch","cfgPath","n","webpackSnippet","pos","main","command","openFlag","err"],"mappings":"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","file":"local-viewer.js","sourcesContent":["#!/usr/bin/env node\n// ---------------------------------------------------------------------------\n// @uncaughtdev/core — local viewer CLI (`npx uncaught` / `uncaught`)\n// ---------------------------------------------------------------------------\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { spawn } from 'child_process';\nimport type { IssueEntry, IssueStatus } from './types';\n\n// ---------------------------------------------------------------------------\n// ANSI helpers\n// ---------------------------------------------------------------------------\n\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RED = '\\x1b[31m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst CYAN = '\\x1b[36m';\nconst WHITE = '\\x1b[37m';\nconst GRAY = '\\x1b[90m';\nconst BG_RED = '\\x1b[41m';\nconst BG_GREEN = '\\x1b[42m';\nconst BG_YELLOW = '\\x1b[43m';\n\nfunction c(color: string, text: string): string {\n return `${color}${text}${RESET}`;\n}\n\n// ---------------------------------------------------------------------------\n// Paths\n// ---------------------------------------------------------------------------\n\nfunction getBaseDir(): string {\n return path.resolve(process.cwd(), '.uncaught');\n}\n\nfunction getIssuesPath(): string {\n return path.join(getBaseDir(), 'issues.json');\n}\n\n// ---------------------------------------------------------------------------\n// Data access\n// ---------------------------------------------------------------------------\n\nasync function loadIssues(): Promise<IssueEntry[]> {\n try {\n const raw = await fs.readFile(getIssuesPath(), 'utf-8');\n return JSON.parse(raw) as IssueEntry[];\n } catch {\n return [];\n }\n}\n\nasync function saveIssues(issues: IssueEntry[]): Promise<void> {\n const indexPath = getIssuesPath();\n const tmpPath = indexPath + '.tmp';\n await fs.writeFile(tmpPath, JSON.stringify(issues, null, 2), 'utf-8');\n await fs.rename(tmpPath, indexPath);\n}\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\nasync function cmdList(): Promise<void> {\n const issues = await loadIssues();\n\n if (issues.length === 0) {\n console.log(c(DIM, '\\n No issues found in .uncaught/\\n'));\n console.log(c(GRAY, ' Capture errors with initUncaught() to see them here.\\n'));\n return;\n }\n\n console.log('');\n console.log(c(BOLD, ' Uncaught Issues'));\n console.log(c(DIM, ' ─'.repeat(35)));\n console.log('');\n\n // Header\n const header = formatRow('#', 'Status', 'Count', 'Error', 'Last Seen');\n console.log(c(DIM, ` ${header}`));\n console.log(c(DIM, ' ' + '─'.repeat(90)));\n\n for (let i = 0; i < issues.length; i++) {\n const issue = issues[i];\n const num = String(i + 1).padStart(3);\n const status = formatStatus(issue.status);\n const count = String(issue.count).padStart(5);\n const title = truncate(issue.title, 45);\n const type = truncate(issue.errorType, 15);\n const lastSeen = formatRelativeTime(issue.lastSeen);\n\n const errorCol = `${c(RED, type)} ${c(WHITE, title)}`;\n\n console.log(\n ` ${c(CYAN, num)} ${status} ${c(YELLOW, count)} ${errorCol} ${c(GRAY, lastSeen)}`\n );\n }\n\n console.log('');\n console.log(c(DIM, ` ${issues.length} issue(s) total`));\n console.log(\n c(GRAY, ' Run: uncaught show <n> to view fix prompt, --open to open in editor')\n );\n console.log('');\n}\n\nasync function cmdShow(indexStr: string, openInEditor: boolean): Promise<void> {\n const issues = await loadIssues();\n const idx = parseInt(indexStr, 10) - 1;\n\n if (isNaN(idx) || idx < 0 || idx >= issues.length) {\n console.error(c(RED, `\\n Invalid issue number: ${indexStr}`));\n console.error(c(GRAY, ` Valid range: 1-${issues.length}\\n`));\n process.exitCode = 1;\n return;\n }\n\n const issue = issues[idx];\n const promptPath = path.join(getBaseDir(), 'fix-prompts', issue.fixPromptFile);\n\n let content: string;\n try {\n content = await fs.readFile(promptPath, 'utf-8');\n } catch {\n console.error(c(RED, `\\n Fix prompt file not found: ${promptPath}\\n`));\n process.exitCode = 1;\n return;\n }\n\n if (openInEditor) {\n const editor = process.env.EDITOR || 'code';\n console.log(c(DIM, ` Opening ${promptPath} in ${editor}...`));\n\n try {\n const child = spawn(editor, [promptPath], {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n } catch {\n // Fallback: try to just open with `open` (macOS) or `xdg-open` (Linux)\n const fallback = process.platform === 'darwin' ? 'open' : 'xdg-open';\n try {\n const child = spawn(fallback, [promptPath], {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n } catch {\n console.error(c(RED, ` Could not open editor. File is at: ${promptPath}`));\n }\n }\n return;\n }\n\n // Print to stdout\n console.log('');\n console.log(c(BOLD, ` Fix Prompt for Issue #${idx + 1}`));\n console.log(c(DIM, ` Fingerprint: ${issue.fingerprint}`));\n console.log(c(DIM, ` Count: ${issue.count} | Users: ${issue.affectedUsers.length}`));\n console.log(c(DIM, ' ─'.repeat(35)));\n console.log('');\n console.log(content);\n console.log('');\n console.log(c(GRAY, ` File: ${promptPath}`));\n console.log(c(GRAY, ' Tip: run with --open to open in your editor'));\n console.log('');\n}\n\nasync function cmdClear(): Promise<void> {\n const baseDir = getBaseDir();\n\n try {\n await fs.access(baseDir);\n } catch {\n console.log(c(DIM, '\\n Nothing to clear — .uncaught/ does not exist.\\n'));\n return;\n }\n\n // Remove contents but keep the directory\n const entries = await fs.readdir(baseDir);\n\n for (const entry of entries) {\n const fullPath = path.join(baseDir, entry);\n await fs.rm(fullPath, { recursive: true, force: true });\n }\n\n console.log(c(GREEN, '\\n Cleared all issues in .uncaught/\\n'));\n}\n\nasync function cmdResolve(indexStr: string): Promise<void> {\n const issues = await loadIssues();\n const idx = parseInt(indexStr, 10) - 1;\n\n if (isNaN(idx) || idx < 0 || idx >= issues.length) {\n console.error(c(RED, `\\n Invalid issue number: ${indexStr}`));\n console.error(c(GRAY, ` Valid range: 1-${issues.length}\\n`));\n process.exitCode = 1;\n return;\n }\n\n const issue = issues[idx];\n\n if (issue.status === 'resolved') {\n console.log(c(YELLOW, `\\n Issue #${idx + 1} is already resolved.\\n`));\n return;\n }\n\n issue.status = 'resolved' as IssueStatus;\n await saveIssues(issues);\n\n console.log(c(GREEN, `\\n Issue #${idx + 1} marked as resolved.`));\n console.log(c(DIM, ` ${issue.errorType}: ${truncate(issue.title, 60)}\\n`));\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nfunction formatRow(\n num: string,\n status: string,\n count: string,\n error: string,\n lastSeen: string\n): string {\n return `${num.padStart(3)} ${status.padEnd(10)} ${count.padStart(5)} ${error.padEnd(60)} ${lastSeen}`;\n}\n\nfunction formatStatus(status: IssueStatus): string {\n switch (status) {\n case 'open':\n return c(`${BG_RED}${WHITE}${BOLD}`, ' OPEN ');\n case 'resolved':\n return c(`${BG_GREEN}${WHITE}${BOLD}`, ' DONE ');\n case 'ignored':\n return c(`${BG_YELLOW}${WHITE}${BOLD}`, ' SKIP ');\n default:\n return c(DIM, String(status).padEnd(6));\n }\n}\n\nfunction formatRelativeTime(iso: string): string {\n try {\n const then = new Date(iso).getTime();\n const now = Date.now();\n const diffMs = now - then;\n\n if (diffMs < 0) return 'just now';\n\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n\n return new Date(iso).toLocaleDateString();\n } catch {\n return iso;\n }\n}\n\nfunction truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 3) + '...';\n}\n\n// ---------------------------------------------------------------------------\n// Usage\n// ---------------------------------------------------------------------------\n\nfunction printUsage(): void {\n console.log(`\n${c(BOLD, ' uncaught')} — error monitoring for vibe coders\n\n${c(BOLD, ' Setup:')}\n ${c(CYAN, 'npx uncaughtdev init')} Auto-detect framework, install, and patch — one command\n\n${c(BOLD, ' Viewer:')}\n npx uncaughtdev List all captured issues\n npx uncaughtdev list List all captured issues\n npx uncaughtdev show <n> Display fix prompt for issue #n\n npx uncaughtdev show <n> --open Open fix prompt in $EDITOR\n npx uncaughtdev resolve <n> Mark issue #n as resolved\n npx uncaughtdev clear Remove all captured issues\n\n${c(BOLD, ' Examples:')}\n npx uncaughtdev init Setup Uncaught in your project\n npx uncaughtdev show 1 Print fix prompt for issue #1\n npx uncaughtdev show 3 --open Open issue #3's prompt in editor\n`);\n}\n\n// ---------------------------------------------------------------------------\n// Init command — auto-detect, install, and wire up everything\n// ---------------------------------------------------------------------------\n\ninterface FrameworkDetection {\n framework: 'nextjs-app' | 'nextjs-pages' | 'vite-react' | 'cra' | 'unknown';\n packageManager: 'pnpm' | 'yarn' | 'bun' | 'npm';\n hasSupabase: boolean;\n hasTypescript: boolean;\n rootDir: string;\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try { await fs.access(p); return true; } catch { return false; }\n}\n\nasync function dirExists(p: string): Promise<boolean> {\n try { const s = await fs.stat(p); return s.isDirectory(); } catch { return false; }\n}\n\nfunction exec(cmd: string, args: string[]): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, { stdio: 'inherit', shell: true });\n child.on('close', (code) => resolve(code === 0));\n child.on('error', () => resolve(false));\n });\n}\n\nasync function detectFramework(): Promise<FrameworkDetection> {\n const cwd = process.cwd();\n const result: FrameworkDetection = {\n framework: 'unknown',\n packageManager: 'npm',\n hasSupabase: false,\n hasTypescript: false,\n rootDir: cwd,\n };\n\n if (await fileExists(path.join(cwd, 'pnpm-lock.yaml'))) result.packageManager = 'pnpm';\n else if (await fileExists(path.join(cwd, 'yarn.lock'))) result.packageManager = 'yarn';\n else if (await fileExists(path.join(cwd, 'bun.lockb')) || await fileExists(path.join(cwd, 'bun.lock'))) result.packageManager = 'bun';\n\n let pkg: Record<string, unknown> = {};\n try {\n const raw = await fs.readFile(path.join(cwd, 'package.json'), 'utf-8');\n pkg = JSON.parse(raw);\n } catch {\n return result;\n }\n\n const allDeps = {\n ...(pkg.dependencies as Record<string, string> ?? {}),\n ...(pkg.devDependencies as Record<string, string> ?? {}),\n };\n\n result.hasTypescript = 'typescript' in allDeps || await fileExists(path.join(cwd, 'tsconfig.json'));\n result.hasSupabase = '@supabase/supabase-js' in allDeps;\n\n if ('next' in allDeps) {\n if (await dirExists(path.join(cwd, 'app')) || await dirExists(path.join(cwd, 'src', 'app'))) {\n result.framework = 'nextjs-app';\n } else if (await dirExists(path.join(cwd, 'pages')) || await dirExists(path.join(cwd, 'src', 'pages'))) {\n result.framework = 'nextjs-pages';\n } else {\n result.framework = 'nextjs-app';\n }\n } else if ('vite' in allDeps && ('react' in allDeps || 'react-dom' in allDeps)) {\n result.framework = 'vite-react';\n } else if ('react-scripts' in allDeps) {\n result.framework = 'cra';\n }\n\n return result;\n}\n\nfunction installArgs(pm: string, pkgs: string[]): { cmd: string; args: string[] } {\n switch (pm) {\n case 'pnpm': return { cmd: 'pnpm', args: ['add', ...pkgs] };\n case 'yarn': return { cmd: 'yarn', args: ['add', ...pkgs] };\n case 'bun': return { cmd: 'bun', args: ['add', ...pkgs] };\n default: return { cmd: 'npm', args: ['install', ...pkgs] };\n }\n}\n\nfunction findLastImport(content: string): number {\n let last = -1;\n const re = /^import\\s/gm;\n let m: RegExpExecArray | null;\n while ((m = re.exec(content)) !== null) last = m.index;\n return last;\n}\n\nfunction insertImport(content: string, importLine: string): string {\n const lastIdx = findLastImport(content);\n if (lastIdx >= 0) {\n const insertPos = content.indexOf('\\n', lastIdx) + 1;\n return content.slice(0, insertPos) + importLine + content.slice(insertPos);\n }\n // No imports — add after 'use client' if present, else at top\n const firstNL = content.indexOf('\\n');\n if (firstNL >= 0 && content.slice(0, firstNL).includes('use client')) {\n return content.slice(0, firstNL + 1) + '\\n' + importLine + content.slice(firstNL + 1);\n }\n return importLine + content;\n}\n\nasync function cmdInit(): Promise<void> {\n const cwd = process.cwd();\n\n console.log('');\n console.log(c(BOLD, ' 🧪 uncaught init'));\n console.log(c(DIM, ' ─'.repeat(35)));\n console.log('');\n\n // 1. Detect\n console.log(c(CYAN, ' ▸ Detecting framework...'));\n const det = await detectFramework();\n\n const names: Record<string, string> = {\n 'nextjs-app': 'Next.js (App Router)',\n 'nextjs-pages': 'Next.js (Pages Router)',\n 'vite-react': 'Vite + React',\n 'cra': 'Create React App',\n 'unknown': 'Unknown',\n };\n\n console.log(` ${c(GREEN, names[det.framework])} · ${det.packageManager} · TS=${det.hasTypescript} · Supabase=${det.hasSupabase}`);\n console.log('');\n\n if (det.framework === 'unknown') {\n console.log(c(YELLOW, ' ⚠ Could not detect framework. Supported: Next.js, Vite+React, CRA'));\n process.exitCode = 1;\n return;\n }\n\n // 2. Install\n console.log(c(CYAN, ' ▸ Installing packages...'));\n const pkgs = ['@uncaughtdev/core', '@uncaughtdev/react'];\n if (det.hasSupabase) pkgs.push('@uncaughtdev/supabase');\n const inst = installArgs(det.packageManager, pkgs);\n console.log(c(GRAY, ` ${inst.cmd} ${inst.args.join(' ')}`));\n\n const ok = await exec(inst.cmd, inst.args);\n if (!ok) {\n console.log(c(YELLOW, '\\n ⚠ Install failed — packages may not be published yet.'));\n console.log(c(GRAY, ' Continuing with file patching. Install manually if needed.'));\n console.log('');\n } else {\n console.log(c(GREEN, ' ✓ Packages installed'));\n console.log('');\n }\n\n // 3. Patch\n const ext = det.hasTypescript ? 'tsx' : 'jsx';\n const tsExt = det.hasTypescript ? 'ts' : 'js';\n const projectKey = path.basename(cwd);\n\n if (det.framework === 'nextjs-app') {\n const appDir = await dirExists(path.join(cwd, 'app')) ? path.join(cwd, 'app') : path.join(cwd, 'src', 'app');\n\n // Layout\n console.log(c(CYAN, ' ▸ Patching layout...'));\n const layoutPath = path.join(appDir, `layout.${ext}`);\n await patchFileWithProvider(layoutPath, projectKey, 'layout');\n\n // API route\n console.log(c(CYAN, ' ▸ Creating API route...'));\n const routeDir = path.join(appDir, 'api', 'uncaught', 'local');\n await fs.mkdir(routeDir, { recursive: true });\n const routePath = path.join(routeDir, `route.${tsExt}`);\n if (!await fileExists(routePath)) {\n await fs.writeFile(routePath, `export { POST } from '@uncaughtdev/core/local-api-handler';\\n`);\n console.log(c(GREEN, ` ✓ Created ${path.relative(cwd, routePath)}`));\n } else {\n console.log(c(YELLOW, ` ⊘ Already exists, skipping`));\n }\n\n // next.config\n console.log(c(CYAN, ' ▸ Patching next.config...'));\n await patchNextConfig(cwd);\n\n } else if (det.framework === 'nextjs-pages') {\n const pagesDir = await dirExists(path.join(cwd, 'pages')) ? path.join(cwd, 'pages') : path.join(cwd, 'src', 'pages');\n\n // _app\n console.log(c(CYAN, ' ▸ Patching _app...'));\n const appPath = path.join(pagesDir, `_app.${ext}`);\n await patchFileWithProvider(appPath, projectKey, 'pages-app');\n\n // API route\n console.log(c(CYAN, ' ▸ Creating API route...'));\n const routeDir = path.join(pagesDir, 'api', 'uncaught');\n await fs.mkdir(routeDir, { recursive: true });\n const routePath = path.join(routeDir, `local.${tsExt}`);\n if (!await fileExists(routePath)) {\n await fs.writeFile(routePath, `export { default } from '@uncaughtdev/core/local-api-handler/pages';\\n`);\n console.log(c(GREEN, ` ✓ Created ${path.relative(cwd, routePath)}`));\n } else {\n console.log(c(YELLOW, ` ⊘ Already exists, skipping`));\n }\n\n // next.config\n console.log(c(CYAN, ' ▸ Patching next.config...'));\n await patchNextConfig(cwd);\n\n } else if (det.framework === 'vite-react' || det.framework === 'cra') {\n const candidates = det.framework === 'vite-react'\n ? ['src/main.tsx', 'src/main.jsx', 'main.tsx', 'main.jsx']\n : ['src/index.tsx', 'src/index.jsx'];\n let entryPath: string | null = null;\n for (const f of candidates) {\n const p = path.join(cwd, f);\n if (await fileExists(p)) { entryPath = p; break; }\n }\n\n if (entryPath) {\n console.log(c(CYAN, ' ▸ Patching entry file...'));\n await patchFileWithProvider(entryPath, projectKey, 'entry');\n } else {\n console.log(c(YELLOW, ' ⚠ Could not find entry file. Wrap your root with <UncaughtProvider> manually.'));\n }\n }\n\n // Supabase hint\n if (det.hasSupabase) {\n console.log('');\n console.log(c(CYAN, ' ▸ Supabase detected! Wrap your client:'));\n console.log(c(GRAY, \" import { wrapSupabase } from '@uncaughtdev/supabase';\"));\n console.log(c(GRAY, ' const supabase = wrapSupabase(createClient(url, key));'));\n }\n\n // Done\n console.log('');\n console.log(c(GREEN, ' ✓ Done! Uncaught is now tracking errors.'));\n console.log('');\n console.log(c(WHITE, ' Start your dev server, trigger an error, then:'));\n console.log(c(CYAN, ` npx uncaughtdev`));\n console.log('');\n}\n\n// ---------------------------------------------------------------------------\n// File patching\n// ---------------------------------------------------------------------------\n\nasync function patchFileWithProvider(filePath: string, projectKey: string, mode: 'layout' | 'pages-app' | 'entry'): Promise<void> {\n const cwd = process.cwd();\n const rel = path.relative(cwd, filePath);\n\n if (!await fileExists(filePath)) {\n // Create new file from scratch\n let content = '';\n if (mode === 'layout') {\n content = `'use client';\\n\\nimport { UncaughtProvider } from '@uncaughtdev/react';\\n\\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\\n return (\\n <html lang=\"en\">\\n <body>\\n <UncaughtProvider projectKey=\"${projectKey}\" transport=\"local\">\\n {children}\\n </UncaughtProvider>\\n </body>\\n </html>\\n );\\n}\\n`;\n } else if (mode === 'pages-app') {\n content = `import { UncaughtProvider } from '@uncaughtdev/react';\\nimport type { AppProps } from 'next/app';\\n\\nexport default function App({ Component, pageProps }: AppProps) {\\n return (\\n <UncaughtProvider projectKey=\"${projectKey}\" transport=\"local\">\\n <Component {...pageProps} />\\n </UncaughtProvider>\\n );\\n}\\n`;\n }\n await fs.writeFile(filePath, content);\n console.log(c(GREEN, ` ✓ Created ${rel}`));\n return;\n }\n\n // Patch existing file\n let content = await fs.readFile(filePath, 'utf-8');\n\n if (content.includes('UncaughtProvider') || content.includes('@uncaughtdev/react')) {\n console.log(c(YELLOW, ` ⊘ ${rel} already has UncaughtProvider, skipping`));\n return;\n }\n\n // Ensure 'use client' for Next.js App Router layout\n if (mode === 'layout' && !content.includes(\"'use client'\") && !content.includes('\"use client\"')) {\n content = `'use client';\\n\\n${content}`;\n }\n\n // Add import\n content = insertImport(content, `import { UncaughtProvider } from '@uncaughtdev/react';\\n`);\n\n // Wrap children/component\n const transport = (mode === 'entry') ? 'console' : 'local';\n const providerOpen = `<UncaughtProvider projectKey=\"${projectKey}\" transport=\"${transport}\">`;\n const providerClose = `</UncaughtProvider>`;\n\n let patched = false;\n\n if (mode === 'layout' && content.includes('{children}')) {\n // Detect indentation around {children}\n const childrenMatch = content.match(/(\\n(\\s*))\\{children\\}/);\n if (childrenMatch) {\n const indent = childrenMatch[2];\n content = content.replace(`${childrenMatch[1]}{children}`, `${childrenMatch[1]}${providerOpen}${childrenMatch[1]} {children}${childrenMatch[1]}${providerClose}`);\n } else {\n content = content.replace('{children}', `\\n ${providerOpen}\\n {children}\\n ${providerClose}\\n `);\n }\n patched = true;\n } else if (mode === 'pages-app') {\n const m = content.match(/<Component\\s[^>]*\\/>/);\n if (m) {\n content = content.replace(m[0], `${providerOpen}\\n ${m[0]}\\n ${providerClose}`);\n patched = true;\n }\n } else if (mode === 'entry') {\n const m = content.match(/<App\\s*\\/>/);\n if (m) {\n content = content.replace(m[0], `${providerOpen}\\n <App />\\n ${providerClose}`);\n patched = true;\n }\n }\n\n if (patched) {\n await fs.writeFile(filePath, content);\n console.log(c(GREEN, ` ✓ Patched ${rel}`));\n } else {\n console.log(c(YELLOW, ` ⚠ Could not auto-patch ${rel}. Wrap your root component with:`));\n console.log(c(GRAY, ` <UncaughtProvider projectKey=\"${projectKey}\" transport=\"local\">{children}</UncaughtProvider>`));\n }\n}\n\nasync function patchNextConfig(cwd: string): Promise<void> {\n const candidates = ['next.config.ts', 'next.config.mjs', 'next.config.js'];\n let cfgPath: string | null = null;\n for (const n of candidates) {\n const p = path.join(cwd, n);\n if (await fileExists(p)) { cfgPath = p; break; }\n }\n\n const webpackSnippet = `\\n webpack: (config, { isServer }) => {\\n if (!isServer) {\\n config.resolve.fallback = { ...config.resolve.fallback, fs: false, path: false, child_process: false };\\n }\\n return config;\\n },`;\n\n if (!cfgPath) {\n cfgPath = path.join(cwd, 'next.config.js');\n await fs.writeFile(cfgPath, `/** @type {import('next').NextConfig} */\\nconst nextConfig = {${webpackSnippet}\\n};\\nmodule.exports = nextConfig;\\n`);\n console.log(c(GREEN, ` ✓ Created next.config.js`));\n return;\n }\n\n let content = await fs.readFile(cfgPath, 'utf-8');\n\n if (content.includes('fs: false')) {\n console.log(c(YELLOW, ` ⊘ Already has webpack fallback, skipping`));\n return;\n }\n\n if (content.includes('webpack')) {\n console.log(c(YELLOW, ` ⊘ Has custom webpack — add manually: config.resolve.fallback = { fs: false, path: false, child_process: false }`));\n return;\n }\n\n const m = content.match(/(const\\s+\\w+\\s*=\\s*\\{|module\\.exports\\s*=\\s*\\{|export\\s+default\\s*\\{)/);\n if (m && m.index !== undefined) {\n const pos = m.index + m[0].length;\n content = content.slice(0, pos) + webpackSnippet + content.slice(pos);\n await fs.writeFile(cfgPath, content);\n console.log(c(GREEN, ` ✓ Patched ${path.relative(cwd, cfgPath)}`));\n } else {\n console.log(c(YELLOW, ` ⚠ Could not auto-patch. Add webpack fallback for fs/path/child_process manually.`));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const command = args[0] ?? 'list';\n\n switch (command) {\n case 'init':\n case 'setup':\n await cmdInit();\n break;\n\n case 'list':\n case 'ls':\n await cmdList();\n break;\n\n case 'show':\n case 'view': {\n const num = args[1];\n if (!num) {\n console.error(c(RED, '\\n Missing issue number. Usage: uncaught show <n>\\n'));\n process.exitCode = 1;\n return;\n }\n const openFlag = args.includes('--open') || args.includes('-o');\n await cmdShow(num, openFlag);\n break;\n }\n\n case 'resolve': {\n const num = args[1];\n if (!num) {\n console.error(\n c(RED, '\\n Missing issue number. Usage: uncaught resolve <n>\\n')\n );\n process.exitCode = 1;\n return;\n }\n await cmdResolve(num);\n break;\n }\n\n case 'clear':\n case 'clean':\n await cmdClear();\n break;\n\n case 'help':\n case '--help':\n case '-h':\n printUsage();\n break;\n\n default:\n console.error(c(RED, `\\n Unknown command: ${command}`));\n printUsage();\n process.exitCode = 1;\n break;\n }\n}\n\nmain().catch((err) => {\n console.error(c(RED, '\\n Unexpected error:'), err);\n process.exitCode = 1;\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/local-viewer.ts"],"names":["RESET","BOLD","DIM","RED","GREEN","YELLOW","CYAN","WHITE","GRAY","BG_RED","BG_GREEN","BG_YELLOW","c","color","text","getBaseDir","i","getIssuesPath","getDbPath","getStore","store","openStore","loadIssues","issues","raw","l","saveIssues","indexPath","tmpPath","issue","cmdList","header","formatRow","num","status","formatStatus","count","title","truncate","type","lastSeen","formatRelativeTime","errorCol","cmdShow","indexStr","openInEditor","idx","promptPath","content","editor","spawn","fallback","cmdClear","baseDir","entries","entry","fullPath","cmdResolve","error","iso","then","diffMs","seconds","minutes","hours","days","str","maxLen","printUsage","fileExists","p","dirExists","exec","cmd","args","resolve","child","code","detectFramework","cwd","result","pkg","allDeps","installArgs","pm","pkgs","findLastImport","last","re","m","insertImport","importLine","lastIdx","insertPos","firstNL","cmdInit","det","inst","ext","tsExt","projectKey","appDir","layoutPath","patchLayoutWithProviders","routeDir","routePath","patchNextConfig","pagesDir","appPath","patchFileWithProvider","candidates","entryPath","f","providersPath","providersRel","layoutRel","existing","patched","providersContent","childrenMatch","filePath","mode","rel","providerOpen","providerClose","cfgPath","n","webpackSnippet","pos","DASHBOARD_HTML","cmdDashboard","port","err","server","L","req","res","url","pathname","environment","filter","stats","issueMatch","eventsMatch","fp","limit","offset","events","event","body","readBody","openCmd","reject","data","chunk","main","command","openFlag","portIdx"],"mappings":"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","file":"local-viewer.js","sourcesContent":["#!/usr/bin/env node\n// ---------------------------------------------------------------------------\n// @uncaughtdev/core — local viewer CLI (`npx uncaught` / `uncaught`)\n// ---------------------------------------------------------------------------\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as http from 'http';\nimport { spawn } from 'child_process';\nimport type { IssueEntry, IssueStatus, UncaughtEvent } from './types';\nimport { openStore, type SqliteStore } from './sqlite-store';\n\n// ---------------------------------------------------------------------------\n// ANSI helpers\n// ---------------------------------------------------------------------------\n\nconst RESET = '\\x1b[0m';\nconst BOLD = '\\x1b[1m';\nconst DIM = '\\x1b[2m';\nconst RED = '\\x1b[31m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst CYAN = '\\x1b[36m';\nconst WHITE = '\\x1b[37m';\nconst GRAY = '\\x1b[90m';\nconst BG_RED = '\\x1b[41m';\nconst BG_GREEN = '\\x1b[42m';\nconst BG_YELLOW = '\\x1b[43m';\n\nfunction c(color: string, text: string): string {\n return `${color}${text}${RESET}`;\n}\n\n// ---------------------------------------------------------------------------\n// Paths\n// ---------------------------------------------------------------------------\n\nfunction getBaseDir(): string {\n return path.resolve(process.cwd(), '.uncaught');\n}\n\nfunction getIssuesPath(): string {\n return path.join(getBaseDir(), 'issues.json');\n}\n\n// ---------------------------------------------------------------------------\n// Data access\n// ---------------------------------------------------------------------------\n\nfunction getDbPath(): string {\n return path.join(getBaseDir(), 'uncaught.db');\n}\n\nfunction getStore(): SqliteStore {\n const store = openStore(getDbPath());\n // Auto-migrate from flat files on first access\n store.importFromFiles(getBaseDir());\n return store;\n}\n\nasync function loadIssues(): Promise<IssueEntry[]> {\n try {\n const store = getStore();\n const issues = store.getIssues();\n store.close();\n return issues;\n } catch {\n // Fallback to flat file\n try {\n const raw = await fs.readFile(getIssuesPath(), 'utf-8');\n return JSON.parse(raw) as IssueEntry[];\n } catch {\n return [];\n }\n }\n}\n\nasync function saveIssues(issues: IssueEntry[]): Promise<void> {\n // Write to flat file for backward compat\n const indexPath = getIssuesPath();\n const tmpPath = indexPath + '.tmp';\n await fs.writeFile(tmpPath, JSON.stringify(issues, null, 2), 'utf-8');\n await fs.rename(tmpPath, indexPath);\n\n // Also update SQLite\n try {\n const store = getStore();\n for (const issue of issues) {\n store.upsertIssue(issue);\n }\n store.close();\n } catch {\n // Best-effort\n }\n}\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\nasync function cmdList(): Promise<void> {\n const issues = await loadIssues();\n\n if (issues.length === 0) {\n console.log(c(DIM, '\\n No issues found in .uncaught/\\n'));\n console.log(c(GRAY, ' Capture errors with initUncaught() to see them here.\\n'));\n return;\n }\n\n console.log('');\n console.log(c(BOLD, ' Uncaught Issues'));\n console.log(c(DIM, ' ─'.repeat(35)));\n console.log('');\n\n // Header\n const header = formatRow('#', 'Status', 'Count', 'Error', 'Last Seen');\n console.log(c(DIM, ` ${header}`));\n console.log(c(DIM, ' ' + '─'.repeat(90)));\n\n for (let i = 0; i < issues.length; i++) {\n const issue = issues[i];\n const num = String(i + 1).padStart(3);\n const status = formatStatus(issue.status);\n const count = String(issue.count).padStart(5);\n const title = truncate(issue.title, 45);\n const type = truncate(issue.errorType, 15);\n const lastSeen = formatRelativeTime(issue.lastSeen);\n\n const errorCol = `${c(RED, type)} ${c(WHITE, title)}`;\n\n console.log(\n ` ${c(CYAN, num)} ${status} ${c(YELLOW, count)} ${errorCol} ${c(GRAY, lastSeen)}`\n );\n }\n\n console.log('');\n console.log(c(DIM, ` ${issues.length} issue(s) total`));\n console.log(\n c(GRAY, ' Run: uncaught show <n> to view fix prompt, --open to open in editor')\n );\n console.log(\n c(CYAN, ' Run: npx @uncaughtdev/core dashboard — for a web UI')\n );\n console.log('');\n}\n\nasync function cmdShow(indexStr: string, openInEditor: boolean): Promise<void> {\n const issues = await loadIssues();\n const idx = parseInt(indexStr, 10) - 1;\n\n if (isNaN(idx) || idx < 0 || idx >= issues.length) {\n console.error(c(RED, `\\n Invalid issue number: ${indexStr}`));\n console.error(c(GRAY, ` Valid range: 1-${issues.length}\\n`));\n process.exitCode = 1;\n return;\n }\n\n const issue = issues[idx];\n const promptPath = path.join(getBaseDir(), 'fix-prompts', issue.fixPromptFile);\n\n let content: string;\n try {\n content = await fs.readFile(promptPath, 'utf-8');\n } catch {\n console.error(c(RED, `\\n Fix prompt file not found: ${promptPath}\\n`));\n process.exitCode = 1;\n return;\n }\n\n if (openInEditor) {\n const editor = process.env.EDITOR || 'code';\n console.log(c(DIM, ` Opening ${promptPath} in ${editor}...`));\n\n try {\n const child = spawn(editor, [promptPath], {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n } catch {\n // Fallback: try to just open with `open` (macOS) or `xdg-open` (Linux)\n const fallback = process.platform === 'darwin' ? 'open' : 'xdg-open';\n try {\n const child = spawn(fallback, [promptPath], {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n } catch {\n console.error(c(RED, ` Could not open editor. File is at: ${promptPath}`));\n }\n }\n return;\n }\n\n // Print to stdout\n console.log('');\n console.log(c(BOLD, ` Fix Prompt for Issue #${idx + 1}`));\n console.log(c(DIM, ` Fingerprint: ${issue.fingerprint}`));\n console.log(c(DIM, ` Count: ${issue.count} | Users: ${issue.affectedUsers.length}`));\n console.log(c(DIM, ' ─'.repeat(35)));\n console.log('');\n console.log(content);\n console.log('');\n console.log(c(GRAY, ` File: ${promptPath}`));\n console.log(c(GRAY, ' Tip: run with --open to open in your editor'));\n console.log('');\n}\n\nasync function cmdClear(): Promise<void> {\n const baseDir = getBaseDir();\n\n try {\n await fs.access(baseDir);\n } catch {\n console.log(c(DIM, '\\n Nothing to clear — .uncaught/ does not exist.\\n'));\n return;\n }\n\n // Clear SQLite\n try {\n const store = getStore();\n store.deleteAllIssues();\n store.close();\n } catch {\n // Best-effort\n }\n\n // Remove contents but keep the directory\n const entries = await fs.readdir(baseDir);\n\n for (const entry of entries) {\n const fullPath = path.join(baseDir, entry);\n await fs.rm(fullPath, { recursive: true, force: true });\n }\n\n console.log(c(GREEN, '\\n Cleared all issues in .uncaught/\\n'));\n}\n\nasync function cmdResolve(indexStr: string): Promise<void> {\n const issues = await loadIssues();\n const idx = parseInt(indexStr, 10) - 1;\n\n if (isNaN(idx) || idx < 0 || idx >= issues.length) {\n console.error(c(RED, `\\n Invalid issue number: ${indexStr}`));\n console.error(c(GRAY, ` Valid range: 1-${issues.length}\\n`));\n process.exitCode = 1;\n return;\n }\n\n const issue = issues[idx];\n\n if (issue.status === 'resolved') {\n console.log(c(YELLOW, `\\n Issue #${idx + 1} is already resolved.\\n`));\n return;\n }\n\n issue.status = 'resolved' as IssueStatus;\n await saveIssues(issues);\n\n // Also update SQLite directly\n try {\n const store = getStore();\n store.updateIssueStatus(issue.fingerprint, 'resolved');\n store.close();\n } catch {\n // Best-effort\n }\n\n console.log(c(GREEN, `\\n Issue #${idx + 1} marked as resolved.`));\n console.log(c(DIM, ` ${issue.errorType}: ${truncate(issue.title, 60)}\\n`));\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\nfunction formatRow(\n num: string,\n status: string,\n count: string,\n error: string,\n lastSeen: string\n): string {\n return `${num.padStart(3)} ${status.padEnd(10)} ${count.padStart(5)} ${error.padEnd(60)} ${lastSeen}`;\n}\n\nfunction formatStatus(status: IssueStatus): string {\n switch (status) {\n case 'open':\n return c(`${BG_RED}${WHITE}${BOLD}`, ' OPEN ');\n case 'resolved':\n return c(`${BG_GREEN}${WHITE}${BOLD}`, ' DONE ');\n case 'ignored':\n return c(`${BG_YELLOW}${WHITE}${BOLD}`, ' SKIP ');\n default:\n return c(DIM, String(status).padEnd(6));\n }\n}\n\nfunction formatRelativeTime(iso: string): string {\n try {\n const then = new Date(iso).getTime();\n const now = Date.now();\n const diffMs = now - then;\n\n if (diffMs < 0) return 'just now';\n\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n\n const days = Math.floor(hours / 24);\n if (days < 30) return `${days}d ago`;\n\n return new Date(iso).toLocaleDateString();\n } catch {\n return iso;\n }\n}\n\nfunction truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.slice(0, maxLen - 3) + '...';\n}\n\n// ---------------------------------------------------------------------------\n// Usage\n// ---------------------------------------------------------------------------\n\nfunction printUsage(): void {\n console.log(`\n${c(BOLD, ' uncaught')} — error monitoring for vibe coders\n\n${c(BOLD, ' Setup:')}\n ${c(CYAN, 'npx uncaughtdev init')} Auto-detect framework, install, and patch — one command\n\n${c(BOLD, ' Viewer:')}\n npx uncaughtdev List all captured issues\n npx uncaughtdev list List all captured issues\n npx uncaughtdev show <n> Display fix prompt for issue #n\n npx uncaughtdev show <n> --open Open fix prompt in $EDITOR\n npx uncaughtdev resolve <n> Mark issue #n as resolved\n npx uncaughtdev clear Remove all captured issues\n npx uncaughtdev dashboard Open web dashboard (--port 3300)\n\n${c(BOLD, ' Examples:')}\n npx uncaughtdev init Setup Uncaught in your project\n npx uncaughtdev show 1 Print fix prompt for issue #1\n npx uncaughtdev show 3 --open Open issue #3's prompt in editor\n`);\n}\n\n// ---------------------------------------------------------------------------\n// Init command — auto-detect, install, and wire up everything\n// ---------------------------------------------------------------------------\n\ninterface FrameworkDetection {\n framework: 'nextjs-app' | 'nextjs-pages' | 'vite-react' | 'cra' | 'unknown';\n packageManager: 'pnpm' | 'yarn' | 'bun' | 'npm';\n hasSupabase: boolean;\n hasTypescript: boolean;\n rootDir: string;\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try { await fs.access(p); return true; } catch { return false; }\n}\n\nasync function dirExists(p: string): Promise<boolean> {\n try { const s = await fs.stat(p); return s.isDirectory(); } catch { return false; }\n}\n\nfunction exec(cmd: string, args: string[]): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn(cmd, args, { stdio: 'inherit', shell: true });\n child.on('close', (code) => resolve(code === 0));\n child.on('error', () => resolve(false));\n });\n}\n\nasync function detectFramework(): Promise<FrameworkDetection> {\n const cwd = process.cwd();\n const result: FrameworkDetection = {\n framework: 'unknown',\n packageManager: 'npm',\n hasSupabase: false,\n hasTypescript: false,\n rootDir: cwd,\n };\n\n if (await fileExists(path.join(cwd, 'pnpm-lock.yaml'))) result.packageManager = 'pnpm';\n else if (await fileExists(path.join(cwd, 'yarn.lock'))) result.packageManager = 'yarn';\n else if (await fileExists(path.join(cwd, 'bun.lockb')) || await fileExists(path.join(cwd, 'bun.lock'))) result.packageManager = 'bun';\n\n let pkg: Record<string, unknown> = {};\n try {\n const raw = await fs.readFile(path.join(cwd, 'package.json'), 'utf-8');\n pkg = JSON.parse(raw);\n } catch {\n return result;\n }\n\n const allDeps = {\n ...(pkg.dependencies as Record<string, string> ?? {}),\n ...(pkg.devDependencies as Record<string, string> ?? {}),\n };\n\n result.hasTypescript = 'typescript' in allDeps || await fileExists(path.join(cwd, 'tsconfig.json'));\n result.hasSupabase = '@supabase/supabase-js' in allDeps;\n\n if ('next' in allDeps) {\n if (await dirExists(path.join(cwd, 'app')) || await dirExists(path.join(cwd, 'src', 'app'))) {\n result.framework = 'nextjs-app';\n } else if (await dirExists(path.join(cwd, 'pages')) || await dirExists(path.join(cwd, 'src', 'pages'))) {\n result.framework = 'nextjs-pages';\n } else {\n result.framework = 'nextjs-app';\n }\n } else if ('vite' in allDeps && ('react' in allDeps || 'react-dom' in allDeps)) {\n result.framework = 'vite-react';\n } else if ('react-scripts' in allDeps) {\n result.framework = 'cra';\n }\n\n return result;\n}\n\nfunction installArgs(pm: string, pkgs: string[]): { cmd: string; args: string[] } {\n switch (pm) {\n case 'pnpm': return { cmd: 'pnpm', args: ['add', ...pkgs] };\n case 'yarn': return { cmd: 'yarn', args: ['add', ...pkgs] };\n case 'bun': return { cmd: 'bun', args: ['add', ...pkgs] };\n default: return { cmd: 'npm', args: ['install', ...pkgs] };\n }\n}\n\nfunction findLastImport(content: string): number {\n let last = -1;\n const re = /^import\\s/gm;\n let m: RegExpExecArray | null;\n while ((m = re.exec(content)) !== null) last = m.index;\n return last;\n}\n\nfunction insertImport(content: string, importLine: string): string {\n const lastIdx = findLastImport(content);\n if (lastIdx >= 0) {\n const insertPos = content.indexOf('\\n', lastIdx) + 1;\n return content.slice(0, insertPos) + importLine + content.slice(insertPos);\n }\n // No imports — add after 'use client' if present, else at top\n const firstNL = content.indexOf('\\n');\n if (firstNL >= 0 && content.slice(0, firstNL).includes('use client')) {\n return content.slice(0, firstNL + 1) + '\\n' + importLine + content.slice(firstNL + 1);\n }\n return importLine + content;\n}\n\nasync function cmdInit(): Promise<void> {\n const cwd = process.cwd();\n\n console.log('');\n console.log(c(BOLD, ' 🧪 uncaught init'));\n console.log(c(DIM, ' ─'.repeat(35)));\n console.log('');\n\n // 1. Detect\n console.log(c(CYAN, ' ▸ Detecting framework...'));\n const det = await detectFramework();\n\n const names: Record<string, string> = {\n 'nextjs-app': 'Next.js (App Router)',\n 'nextjs-pages': 'Next.js (Pages Router)',\n 'vite-react': 'Vite + React',\n 'cra': 'Create React App',\n 'unknown': 'Unknown',\n };\n\n console.log(` ${c(GREEN, names[det.framework])} · ${det.packageManager} · TS=${det.hasTypescript} · Supabase=${det.hasSupabase}`);\n console.log('');\n\n if (det.framework === 'unknown') {\n console.log(c(YELLOW, ' ⚠ Could not detect framework. Supported: Next.js, Vite+React, CRA'));\n process.exitCode = 1;\n return;\n }\n\n // 2. Install\n console.log(c(CYAN, ' ▸ Installing packages...'));\n const pkgs = ['@uncaughtdev/core', '@uncaughtdev/react'];\n if (det.hasSupabase) pkgs.push('@uncaughtdev/supabase');\n const inst = installArgs(det.packageManager, pkgs);\n console.log(c(GRAY, ` ${inst.cmd} ${inst.args.join(' ')}`));\n\n const ok = await exec(inst.cmd, inst.args);\n if (!ok) {\n console.log(c(YELLOW, '\\n ⚠ Install failed — packages may not be published yet.'));\n console.log(c(GRAY, ' Continuing with file patching. Install manually if needed.'));\n console.log('');\n } else {\n console.log(c(GREEN, ' ✓ Packages installed'));\n console.log('');\n }\n\n // 3. Patch\n const ext = det.hasTypescript ? 'tsx' : 'jsx';\n const tsExt = det.hasTypescript ? 'ts' : 'js';\n const projectKey = path.basename(cwd);\n\n if (det.framework === 'nextjs-app') {\n const appDir = await dirExists(path.join(cwd, 'app')) ? path.join(cwd, 'app') : path.join(cwd, 'src', 'app');\n\n // Providers file + Layout\n console.log(c(CYAN, ' ▸ Setting up providers...'));\n const layoutPath = path.join(appDir, `layout.${ext}`);\n await patchLayoutWithProviders(appDir, layoutPath, projectKey, ext);\n\n // API route\n console.log(c(CYAN, ' ▸ Creating API route...'));\n const routeDir = path.join(appDir, 'api', 'uncaught', 'local');\n await fs.mkdir(routeDir, { recursive: true });\n const routePath = path.join(routeDir, `route.${tsExt}`);\n if (!await fileExists(routePath)) {\n await fs.writeFile(routePath, `export { POST } from '@uncaughtdev/core/local-api-handler';\\n`);\n console.log(c(GREEN, ` ✓ Created ${path.relative(cwd, routePath)}`));\n } else {\n console.log(c(YELLOW, ` ⊘ Already exists, skipping`));\n }\n\n // next.config\n console.log(c(CYAN, ' ▸ Patching next.config...'));\n await patchNextConfig(cwd);\n\n } else if (det.framework === 'nextjs-pages') {\n const pagesDir = await dirExists(path.join(cwd, 'pages')) ? path.join(cwd, 'pages') : path.join(cwd, 'src', 'pages');\n\n // _app\n console.log(c(CYAN, ' ▸ Patching _app...'));\n const appPath = path.join(pagesDir, `_app.${ext}`);\n await patchFileWithProvider(appPath, projectKey, 'pages-app');\n\n // API route\n console.log(c(CYAN, ' ▸ Creating API route...'));\n const routeDir = path.join(pagesDir, 'api', 'uncaught');\n await fs.mkdir(routeDir, { recursive: true });\n const routePath = path.join(routeDir, `local.${tsExt}`);\n if (!await fileExists(routePath)) {\n await fs.writeFile(routePath, `export { default } from '@uncaughtdev/core/local-api-handler/pages';\\n`);\n console.log(c(GREEN, ` ✓ Created ${path.relative(cwd, routePath)}`));\n } else {\n console.log(c(YELLOW, ` ⊘ Already exists, skipping`));\n }\n\n // next.config\n console.log(c(CYAN, ' ▸ Patching next.config...'));\n await patchNextConfig(cwd);\n\n } else if (det.framework === 'vite-react' || det.framework === 'cra') {\n const candidates = det.framework === 'vite-react'\n ? ['src/main.tsx', 'src/main.jsx', 'main.tsx', 'main.jsx']\n : ['src/index.tsx', 'src/index.jsx'];\n let entryPath: string | null = null;\n for (const f of candidates) {\n const p = path.join(cwd, f);\n if (await fileExists(p)) { entryPath = p; break; }\n }\n\n if (entryPath) {\n console.log(c(CYAN, ' ▸ Patching entry file...'));\n await patchFileWithProvider(entryPath, projectKey, 'entry');\n } else {\n console.log(c(YELLOW, ' ⚠ Could not find entry file. Wrap your root with <UncaughtProvider> manually.'));\n }\n }\n\n // Supabase hint\n if (det.hasSupabase) {\n console.log('');\n console.log(c(CYAN, ' ▸ Supabase detected! Wrap your client:'));\n console.log(c(GRAY, \" import { wrapSupabase } from '@uncaughtdev/supabase';\"));\n console.log(c(GRAY, ' const supabase = wrapSupabase(createClient(url, key));'));\n }\n\n // Done\n console.log('');\n console.log(c(GREEN, ' ✓ Done! Uncaught is now tracking errors.'));\n console.log('');\n console.log(c(WHITE, ' Start your dev server, trigger an error, then:'));\n console.log(c(CYAN, ` npx uncaughtdev`));\n console.log('');\n}\n\n// ---------------------------------------------------------------------------\n// File patching\n// ---------------------------------------------------------------------------\n\n// Next.js App Router: create providers.tsx + patch layout to import it\nasync function patchLayoutWithProviders(appDir: string, layoutPath: string, projectKey: string, ext: string): Promise<void> {\n const cwd = process.cwd();\n const providersPath = path.join(appDir, `providers.${ext}`);\n const providersRel = path.relative(cwd, providersPath);\n const layoutRel = path.relative(cwd, layoutPath);\n\n // 1. Create providers.tsx (client component)\n if (await fileExists(providersPath)) {\n const existing = await fs.readFile(providersPath, 'utf-8');\n if (existing.includes('UncaughtProvider') || existing.includes('@uncaughtdev/react')) {\n console.log(c(YELLOW, ` ⊘ ${providersRel} already has UncaughtProvider, skipping`));\n } else {\n // Append UncaughtProvider to existing providers file\n let patched = existing;\n if (!patched.includes(\"'use client'\") && !patched.includes('\"use client\"')) {\n patched = `'use client';\\n\\n${patched}`;\n }\n patched = insertImport(patched, `import { UncaughtProvider } from '@uncaughtdev/react';\\n`);\n await fs.writeFile(providersPath, patched);\n console.log(c(YELLOW, ` ⚠ ${providersRel} exists — added import but you may need to manually wrap with <UncaughtProvider>.`));\n }\n } else {\n const providersContent = `'use client';\\n\\nimport { UncaughtProvider } from '@uncaughtdev/react';\\n\\nexport function Providers({ children }: { children: React.ReactNode }) {\\n return (\\n <UncaughtProvider projectKey=\"${projectKey}\" transport=\"local\">\\n {children}\\n </UncaughtProvider>\\n );\\n}\\n`;\n await fs.writeFile(providersPath, providersContent);\n console.log(c(GREEN, ` ✓ Created ${providersRel}`));\n }\n\n // 2. Patch layout.tsx to import and use <Providers>\n if (!await fileExists(layoutPath)) {\n const layoutContent = `import { Providers } from './providers';\\n\\nexport default function RootLayout({ children }: { children: React.ReactNode }) {\\n return (\\n <html lang=\"en\">\\n <body>\\n <Providers>{children}</Providers>\\n </body>\\n </html>\\n );\\n}\\n`;\n await fs.writeFile(layoutPath, layoutContent);\n console.log(c(GREEN, ` ✓ Created ${layoutRel}`));\n return;\n }\n\n let content = await fs.readFile(layoutPath, 'utf-8');\n\n if (content.includes('UncaughtProvider') || content.includes('@uncaughtdev/react') || content.includes('./providers')) {\n console.log(c(YELLOW, ` ⊘ ${layoutRel} already has providers, skipping`));\n return;\n }\n\n // Add import for Providers\n content = insertImport(content, `import { Providers } from './providers';\\n`);\n\n // Wrap {children} with <Providers>\n let patched = false;\n const childrenMatch = content.match(/(\\n(\\s*))\\{children\\}/);\n if (childrenMatch) {\n content = content.replace(`${childrenMatch[1]}{children}`, `${childrenMatch[1]}<Providers>{children}</Providers>`);\n patched = true;\n }\n\n if (patched) {\n await fs.writeFile(layoutPath, content);\n console.log(c(GREEN, ` ✓ Patched ${layoutRel}`));\n } else {\n console.log(c(YELLOW, ` ⚠ Could not auto-patch ${layoutRel}. Import Providers from './providers' and wrap {children}.`));\n }\n}\n\n// Pages Router / Vite / CRA patching\nasync function patchFileWithProvider(filePath: string, projectKey: string, mode: 'pages-app' | 'entry'): Promise<void> {\n const cwd = process.cwd();\n const rel = path.relative(cwd, filePath);\n\n if (!await fileExists(filePath)) {\n let content = '';\n if (mode === 'pages-app') {\n content = `import { UncaughtProvider } from '@uncaughtdev/react';\\nimport type { AppProps } from 'next/app';\\n\\nexport default function App({ Component, pageProps }: AppProps) {\\n return (\\n <UncaughtProvider projectKey=\"${projectKey}\" transport=\"local\">\\n <Component {...pageProps} />\\n </UncaughtProvider>\\n );\\n}\\n`;\n }\n await fs.writeFile(filePath, content);\n console.log(c(GREEN, ` ✓ Created ${rel}`));\n return;\n }\n\n let content = await fs.readFile(filePath, 'utf-8');\n\n if (content.includes('UncaughtProvider') || content.includes('@uncaughtdev/react')) {\n console.log(c(YELLOW, ` ⊘ ${rel} already has UncaughtProvider, skipping`));\n return;\n }\n\n content = insertImport(content, `import { UncaughtProvider } from '@uncaughtdev/react';\\n`);\n\n const transport = (mode === 'entry') ? 'console' : 'local';\n const providerOpen = `<UncaughtProvider projectKey=\"${projectKey}\" transport=\"${transport}\">`;\n const providerClose = `</UncaughtProvider>`;\n\n let patched = false;\n\n if (mode === 'pages-app') {\n const m = content.match(/<Component\\s[^>]*\\/>/);\n if (m) {\n content = content.replace(m[0], `${providerOpen}\\n ${m[0]}\\n ${providerClose}`);\n patched = true;\n }\n } else if (mode === 'entry') {\n const m = content.match(/<App\\s*\\/>/);\n if (m) {\n content = content.replace(m[0], `${providerOpen}\\n <App />\\n ${providerClose}`);\n patched = true;\n }\n }\n\n if (patched) {\n await fs.writeFile(filePath, content);\n console.log(c(GREEN, ` ✓ Patched ${rel}`));\n } else {\n console.log(c(YELLOW, ` ⚠ Could not auto-patch ${rel}. Wrap your root component with:`));\n console.log(c(GRAY, ` <UncaughtProvider projectKey=\"${projectKey}\" transport=\"local\">{children}</UncaughtProvider>`));\n }\n}\n\nasync function patchNextConfig(cwd: string): Promise<void> {\n const candidates = ['next.config.ts', 'next.config.mjs', 'next.config.js'];\n let cfgPath: string | null = null;\n for (const n of candidates) {\n const p = path.join(cwd, n);\n if (await fileExists(p)) { cfgPath = p; break; }\n }\n\n const webpackSnippet = `\\n webpack: (config, { isServer }) => {\\n if (!isServer) {\\n config.resolve.fallback = { ...config.resolve.fallback, fs: false, path: false, child_process: false };\\n }\\n return config;\\n },`;\n\n if (!cfgPath) {\n cfgPath = path.join(cwd, 'next.config.js');\n await fs.writeFile(cfgPath, `/** @type {import('next').NextConfig} */\\nconst nextConfig = {${webpackSnippet}\\n};\\nmodule.exports = nextConfig;\\n`);\n console.log(c(GREEN, ` ✓ Created next.config.js`));\n return;\n }\n\n let content = await fs.readFile(cfgPath, 'utf-8');\n\n if (content.includes('fs: false')) {\n console.log(c(YELLOW, ` ⊘ Already has webpack fallback, skipping`));\n return;\n }\n\n if (content.includes('webpack')) {\n console.log(c(YELLOW, ` ⊘ Has custom webpack — add manually: config.resolve.fallback = { fs: false, path: false, child_process: false }`));\n return;\n }\n\n const m = content.match(/(const\\s+\\w+\\s*=\\s*\\{|module\\.exports\\s*=\\s*\\{|export\\s+default\\s*\\{)/);\n if (m && m.index !== undefined) {\n const pos = m.index + m[0].length;\n content = content.slice(0, pos) + webpackSnippet + content.slice(pos);\n await fs.writeFile(cfgPath, content);\n console.log(c(GREEN, ` ✓ Patched ${path.relative(cwd, cfgPath)}`));\n } else {\n console.log(c(YELLOW, ` ⚠ Could not auto-patch. Add webpack fallback for fs/path/child_process manually.`));\n }\n}\n\n// ---------------------------------------------------------------------------\n// Dashboard\n// ---------------------------------------------------------------------------\n\nconst DASHBOARD_HTML = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Uncaught Dashboard</title>\n<style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif; background: #0a0a0a; color: #e0e0e0; min-height: 100vh; }\n a { color: #60a5fa; text-decoration: none; }\n code { background: #1e1e2e; padding: 2px 6px; border-radius: 4px; font-size: 0.85em; }\n pre { background: #1e1e2e; padding: 16px; border-radius: 8px; overflow-x: auto; font-size: 0.85em; line-height: 1.5; }\n header { background: #111; border-bottom: 1px solid #222; padding: 16px 24px; display: flex; align-items: center; gap: 16px; }\n header h1 { font-size: 1.2rem; font-weight: 600; }\n header h1 span { color: #f87171; }\n .stats { display: flex; gap: 24px; margin-left: auto; font-size: 0.85rem; color: #888; }\n .stats .stat-val { color: #e0e0e0; font-weight: 600; }\n .filters { display: flex; gap: 8px; padding: 16px 24px; border-bottom: 1px solid #1a1a1a; }\n .filter-btn { background: #1a1a1a; border: 1px solid #333; color: #aaa; padding: 6px 16px; border-radius: 6px; cursor: pointer; font-size: 0.85rem; transition: all 0.15s; }\n .filter-btn:hover { border-color: #555; color: #e0e0e0; }\n .filter-btn.active { background: #1e3a5f; border-color: #60a5fa; color: #60a5fa; }\n .container { max-width: 1200px; margin: 0 auto; padding: 0 24px; }\n table { width: 100%; border-collapse: collapse; margin-top: 8px; }\n th { text-align: left; padding: 12px 16px; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; color: #666; border-bottom: 1px solid #222; }\n td { padding: 12px 16px; border-bottom: 1px solid #1a1a1a; font-size: 0.9rem; vertical-align: top; }\n tr { cursor: pointer; transition: background 0.1s; }\n tr:hover { background: #141414; }\n tr.selected { background: #1a1a2e; }\n .badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; }\n .badge-open { background: #3b1111; color: #f87171; }\n .badge-resolved { background: #0f2f1a; color: #4ade80; }\n .badge-ignored { background: #2d2305; color: #facc15; }\n .badge-release { background: #1e1e3e; color: #a78bfa; font-size: 0.7rem; margin-left: 6px; }\n .badge-env { background: #1a2e1a; color: #86efac; font-size: 0.7rem; margin-left: 4px; }\n .env-filter { background: #1a1a1a; border: 1px solid #333; color: #aaa; padding: 6px 12px; border-radius: 6px; font-size: 0.85rem; margin-left: 8px; }\n .feedback-box { background: #1a1a2e; border: 1px solid #2e2e5c; border-radius: 8px; padding: 12px 16px; margin-top: 8px; font-style: italic; color: #c4b5fd; }\n .count { background: #1e1e2e; padding: 2px 8px; border-radius: 10px; font-size: 0.8rem; font-weight: 600; }\n .error-type { color: #f87171; font-weight: 500; font-size: 0.8rem; }\n .error-title { color: #e0e0e0; }\n .time-ago { color: #666; font-size: 0.8rem; }\n .empty { text-align: center; padding: 80px 24px; color: #555; }\n .empty h2 { font-size: 1.2rem; margin-bottom: 8px; color: #666; }\n\n /* Detail panel */\n .detail-overlay { display: none; position: fixed; top: 0; right: 0; bottom: 0; width: 55%; background: #111; border-left: 1px solid #222; overflow-y: auto; z-index: 100; box-shadow: -4px 0 24px rgba(0,0,0,0.5); }\n .detail-overlay.open { display: block; }\n .detail-header { padding: 20px 24px; border-bottom: 1px solid #222; display: flex; align-items: center; gap: 12px; }\n .detail-header h2 { font-size: 1rem; flex: 1; }\n .close-btn { background: none; border: 1px solid #333; color: #aaa; padding: 4px 12px; border-radius: 4px; cursor: pointer; font-size: 0.85rem; }\n .close-btn:hover { border-color: #666; color: #fff; }\n .detail-body { padding: 24px; }\n .detail-section { margin-bottom: 24px; }\n .detail-section h3 { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.05em; color: #666; margin-bottom: 8px; }\n .detail-meta { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; }\n .meta-item { background: #1a1a1a; padding: 12px; border-radius: 6px; }\n .meta-label { font-size: 0.7rem; text-transform: uppercase; color: #666; margin-bottom: 4px; }\n .meta-value { font-size: 0.9rem; }\n .breadcrumbs { list-style: none; }\n .breadcrumbs li { padding: 6px 0; border-bottom: 1px solid #1a1a1a; font-size: 0.85rem; display: flex; gap: 8px; }\n .bc-time { color: #666; font-family: monospace; font-size: 0.8rem; min-width: 60px; }\n .bc-type { color: #60a5fa; font-size: 0.75rem; font-weight: 600; min-width: 70px; }\n .action-bar { display: flex; gap: 8px; padding: 16px 24px; border-top: 1px solid #222; position: sticky; bottom: 0; background: #111; }\n .action-btn { padding: 8px 16px; border-radius: 6px; border: 1px solid #333; cursor: pointer; font-size: 0.85rem; transition: all 0.15s; }\n .btn-resolve { background: #0f2f1a; color: #4ade80; border-color: #1a5c2e; }\n .btn-resolve:hover { background: #1a5c2e; }\n .btn-ignore { background: #2d2305; color: #facc15; border-color: #5c4a0a; }\n .btn-ignore:hover { background: #5c4a0a; }\n .btn-copy { background: #1a1a2e; color: #818cf8; border-color: #2e2e5c; }\n .btn-copy:hover { background: #2e2e5c; }\n .btn-open { background: #1e3a5f; color: #60a5fa; border-color: #2563eb; }\n .btn-open:hover { background: #2563eb; }\n\n /* Fix prompt box */\n .prompt-box { position: relative; background: #0d0d0d; border: 1px solid #222; border-radius: 8px; margin-bottom: 24px; }\n .prompt-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; border-bottom: 1px solid #222; }\n .prompt-header h3 { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.05em; color: #666; margin: 0; }\n .prompt-copy-btn { background: #1a1a2e; border: 1px solid #2e2e5c; color: #818cf8; padding: 4px 12px; border-radius: 4px; cursor: pointer; font-size: 0.75rem; display: flex; align-items: center; gap: 4px; transition: all 0.15s; }\n .prompt-copy-btn:hover { background: #2e2e5c; }\n .prompt-copy-btn svg { width: 14px; height: 14px; }\n .prompt-content { padding: 16px; max-height: 300px; overflow-y: auto; font-size: 0.85rem; line-height: 1.5; white-space: pre-wrap; font-family: 'SF Mono', 'Fira Code', monospace; color: #ccc; }\n\n /* Fix prompt markdown (expanded view) */\n .fix-prompt { background: #0d0d0d; border: 1px solid #222; border-radius: 8px; padding: 20px; line-height: 1.6; }\n .fix-prompt h1, .fix-prompt h2, .fix-prompt h3 { color: #e0e0e0; margin: 16px 0 8px; }\n .fix-prompt h1 { font-size: 1.2rem; }\n .fix-prompt h2 { font-size: 1rem; border-bottom: 1px solid #222; padding-bottom: 6px; }\n .fix-prompt h3 { font-size: 0.9rem; }\n .fix-prompt ul, .fix-prompt ol { padding-left: 20px; margin: 8px 0; }\n .fix-prompt li { margin: 4px 0; }\n .fix-prompt strong { color: #f0f0f0; }\n .fix-prompt p { margin: 8px 0; }\n</style>\n</head>\n<body>\n<header>\n <h1><span>uncaught</span> dashboard</h1>\n <div class=\"stats\" id=\"stats\"></div>\n</header>\n<div class=\"filters\" id=\"filters\">\n <button class=\"filter-btn active\" data-filter=\"all\">All</button>\n <button class=\"filter-btn\" data-filter=\"open\">Open</button>\n <button class=\"filter-btn\" data-filter=\"resolved\">Resolved</button>\n <button class=\"filter-btn\" data-filter=\"ignored\">Ignored</button>\n <select class=\"env-filter\" id=\"env-filter\">\n <option value=\"\">All Environments</option>\n </select>\n</div>\n<div class=\"container\">\n <table>\n <thead>\n <tr><th>#</th><th>Status</th><th>Error</th><th>Release</th><th>Count</th><th>Users</th><th>Last Seen</th></tr>\n </thead>\n <tbody id=\"issues-body\"></tbody>\n </table>\n <div class=\"empty\" id=\"empty\" style=\"display:none;\">\n <h2>No issues found</h2>\n <p>Trigger some errors in your app and they will appear here.</p>\n </div>\n</div>\n<div class=\"detail-overlay\" id=\"detail\">\n <div class=\"detail-header\">\n <h2 id=\"detail-title\"></h2>\n <button class=\"close-btn\" id=\"close-detail\">Close</button>\n </div>\n <div class=\"detail-body\" id=\"detail-body\"></div>\n <div class=\"action-bar\" id=\"action-bar\"></div>\n</div>\n<script>\nlet allIssues = [];\nlet currentFilter = 'all';\nlet currentEnv = '';\nlet selectedFp = null;\n\nasync function fetchIssues() {\n try {\n var params = [];\n if (currentFilter !== 'all') params.push('status=' + currentFilter);\n if (currentEnv) params.push('environment=' + encodeURIComponent(currentEnv));\n var url = '/api/issues' + (params.length ? '?' + params.join('&') : '');\n const res = await fetch(url);\n allIssues = await res.json();\n renderIssues();\n fetchStats();\n updateEnvFilter();\n } catch(e) { console.error('Failed to fetch issues', e); }\n}\n\nfunction updateEnvFilter() {\n var sel = document.getElementById('env-filter');\n var envs = new Set();\n allIssues.forEach(function(i) { if (i.environment) envs.add(i.environment); });\n var opts = '<option value=\"\">All Environments</option>';\n envs.forEach(function(e) { opts += '<option value=\"' + escHtml(e) + '\"' + (e === currentEnv ? ' selected' : '') + '>' + escHtml(e) + '</option>'; });\n sel.innerHTML = opts;\n}\n\nasync function fetchStats() {\n try {\n const res = await fetch('/api/stats');\n const s = await res.json();\n document.getElementById('stats').innerHTML =\n '<div><span class=\"stat-val\">' + s.total + '</span> issues</div>' +\n '<div><span class=\"stat-val\">' + s.open + '</span> open</div>' +\n '<div><span class=\"stat-val\">' + s.totalEvents + '</span> events</div>';\n } catch(e) {}\n}\n\nfunction timeAgo(iso) {\n const ms = Date.now() - new Date(iso).getTime();\n if (ms < 0) return 'just now';\n const s = Math.floor(ms/1000);\n if (s < 60) return s + 's ago';\n const m = Math.floor(s/60);\n if (m < 60) return m + 'm ago';\n const h = Math.floor(m/60);\n if (h < 24) return h + 'h ago';\n const d = Math.floor(h/24);\n if (d < 30) return d + 'd ago';\n return new Date(iso).toLocaleDateString();\n}\n\nfunction escHtml(s) { const d = document.createElement('div'); d.textContent = s; return d.innerHTML; }\n\nfunction renderIssues() {\n const body = document.getElementById('issues-body');\n const empty = document.getElementById('empty');\n if (allIssues.length === 0) { body.innerHTML = ''; empty.style.display = 'block'; return; }\n empty.style.display = 'none';\n body.innerHTML = allIssues.map(function(issue, i) {\n const cls = issue.status === 'open' ? 'badge-open' : issue.status === 'resolved' ? 'badge-resolved' : 'badge-ignored';\n var relBadge = issue.release ? '<span class=\"badge badge-release\">' + escHtml(issue.release) + '</span>' : '<span style=\"color:#555\">—</span>';\n var envBadge = issue.environment ? '<span class=\"badge badge-env\">' + escHtml(issue.environment) + '</span>' : '';\n return '<tr data-fp=\"' + issue.fingerprint + '\" class=\"' + (issue.fingerprint === selectedFp ? 'selected' : '') + '\">' +\n '<td>' + (i+1) + '</td>' +\n '<td><span class=\"badge ' + cls + '\">' + issue.status + '</span>' + envBadge + '</td>' +\n '<td><span class=\"error-type\">' + escHtml(issue.errorType) + '</span> <span class=\"error-title\">' + escHtml(issue.title.length > 60 ? issue.title.slice(0,57) + '...' : issue.title) + '</span></td>' +\n '<td>' + relBadge + '</td>' +\n '<td><span class=\"count\">' + issue.count + '</span></td>' +\n '<td>' + issue.affectedUsers.length + '</td>' +\n '<td class=\"time-ago\">' + timeAgo(issue.lastSeen) + '</td>' +\n '</tr>';\n }).join('');\n}\n\nfunction renderMd(md) {\n return md\n .replace(/^### (.+)$/gm, '<h3>$1</h3>')\n .replace(/^## (.+)$/gm, '<h2>$1</h2>')\n .replace(/^# (.+)$/gm, '<h1>$1</h1>')\n .replace(/\\\\*\\\\*(.+?)\\\\*\\\\*/g, '<strong>$1</strong>')\n .replace(/\\`\\`\\`[\\\\s\\\\S]*?\\`\\`\\`/g, function(m) {\n var code = m.replace(/\\`\\`\\`\\\\w*\\\\n?/g, '').replace(/\\`\\`\\`$/g, '');\n return '<pre><code>' + escHtml(code) + '</code></pre>';\n })\n .replace(/\\`([^\\`]+)\\`/g, '<code>$1</code>')\n .replace(/^- \\\\*\\\\*(.+?)\\\\*\\\\* ?\\u2014 ?(.+)$/gm, '<li><strong>$1</strong> \\u2014 $2</li>')\n .replace(/^- (.+)$/gm, '<li>$1</li>')\n .replace(/^(\\\\d+)\\\\. (.+)$/gm, '<li>$2</li>')\n .replace(/(<li>.*<\\\\/li>)/s, '<ul>$1</ul>')\n .replace(/\\\\n\\\\n/g, '</p><p>')\n .replace(/\\\\n/g, '<br>');\n}\n\nasync function showDetail(fp) {\n selectedFp = fp;\n renderIssues();\n try {\n const res = await fetch('/api/issues/' + fp);\n const data = await res.json();\n const issue = data.issue;\n const event = data.event;\n\n document.getElementById('detail-title').textContent = issue.errorType + ': ' + issue.title;\n\n let html = '';\n\n if (event) {\n // Fix prompt — first, compact box with copy icon\n if (event.fixPrompt) {\n html += '<div class=\"prompt-box\">';\n html += '<div class=\"prompt-header\"><h3>Fix Prompt</h3>';\n html += '<button class=\"prompt-copy-btn\" onclick=\"copyPrompt()\">';\n html += '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"/><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"/></svg>';\n html += '<span id=\"copy-label\">Copy</span></button></div>';\n html += '<div class=\"prompt-content\">' + escHtml(event.fixPrompt) + '</div>';\n html += '</div>';\n }\n }\n\n // Meta\n html += '<div class=\"detail-section\"><h3>Details</h3><div class=\"detail-meta\">';\n html += '<div class=\"meta-item\"><div class=\"meta-label\">Fingerprint</div><div class=\"meta-value\"><code>' + issue.fingerprint + '</code></div></div>';\n html += '<div class=\"meta-item\"><div class=\"meta-label\">Occurrences</div><div class=\"meta-value\">' + issue.count + '</div></div>';\n html += '<div class=\"meta-item\"><div class=\"meta-label\">Users Affected</div><div class=\"meta-value\">' + issue.affectedUsers.length + '</div></div>';\n html += '<div class=\"meta-item\"><div class=\"meta-label\">First Seen</div><div class=\"meta-value\">' + timeAgo(issue.firstSeen) + '</div></div>';\n html += '<div class=\"meta-item\"><div class=\"meta-label\">Last Seen</div><div class=\"meta-value\">' + timeAgo(issue.lastSeen) + '</div></div>';\n html += '<div class=\"meta-item\"><div class=\"meta-label\">Status</div><div class=\"meta-value\"><span class=\"badge badge-' + issue.status + '\">' + issue.status + '</span></div></div>';\n if (issue.release) html += '<div class=\"meta-item\"><div class=\"meta-label\">Release</div><div class=\"meta-value\"><span class=\"badge badge-release\">' + escHtml(issue.release) + '</span></div></div>';\n if (issue.environment) html += '<div class=\"meta-item\"><div class=\"meta-label\">Environment</div><div class=\"meta-value\"><span class=\"badge badge-env\">' + escHtml(issue.environment) + '</span></div></div>';\n html += '</div></div>';\n\n if (event) {\n // User feedback\n if (event.userFeedback) {\n html += '<div class=\"detail-section\"><h3>User Feedback</h3><div class=\"feedback-box\">\"' + escHtml(event.userFeedback) + '\"</div></div>';\n }\n\n // Stack trace (prefer resolved)\n var stackLabel = 'Stack Trace';\n var stackContent = '';\n if (event.error && event.error.resolvedStack) {\n stackLabel = 'Stack Trace (Source Mapped)';\n stackContent = event.error.resolvedStack;\n } else if (event.error && event.error.stack) {\n stackContent = event.error.stack;\n }\n if (stackContent) {\n html += '<div class=\"detail-section\"><h3>' + stackLabel + '</h3><pre><code>' + escHtml(stackContent) + '</code></pre></div>';\n }\n\n // Environment\n if (event.environment) {\n const env = event.environment;\n html += '<div class=\"detail-section\"><h3>Environment</h3><div class=\"detail-meta\">';\n if (env.deploy) html += '<div class=\"meta-item\"><div class=\"meta-label\">Deploy Env</div><div class=\"meta-value\">' + escHtml(env.deploy) + '</div></div>';\n if (env.browser) html += '<div class=\"meta-item\"><div class=\"meta-label\">Browser</div><div class=\"meta-value\">' + escHtml(env.browser + (env.browserVersion ? ' ' + env.browserVersion : '')) + '</div></div>';\n if (env.os) html += '<div class=\"meta-item\"><div class=\"meta-label\">OS</div><div class=\"meta-value\">' + escHtml(env.os) + '</div></div>';\n if (env.runtime) html += '<div class=\"meta-item\"><div class=\"meta-label\">Runtime</div><div class=\"meta-value\">' + escHtml(env.runtime) + '</div></div>';\n if (env.url) html += '<div class=\"meta-item\"><div class=\"meta-label\">URL</div><div class=\"meta-value\">' + escHtml(env.url) + '</div></div>';\n if (env.deviceType) html += '<div class=\"meta-item\"><div class=\"meta-label\">Device</div><div class=\"meta-value\">' + escHtml(env.deviceType) + '</div></div>';\n html += '</div></div>';\n }\n\n // Breadcrumbs\n if (event.breadcrumbs && event.breadcrumbs.length > 0) {\n html += '<div class=\"detail-section\"><h3>Breadcrumbs</h3><ul class=\"breadcrumbs\">';\n event.breadcrumbs.forEach(function(bc) {\n var t = bc.timestamp ? new Date(bc.timestamp).toLocaleTimeString() : '';\n html += '<li><span class=\"bc-time\">' + t + '</span><span class=\"bc-type\">[' + escHtml(bc.type) + ']</span><span>' + escHtml(bc.message) + '</span></li>';\n });\n html += '</ul></div>';\n }\n }\n\n document.getElementById('detail-body').innerHTML = html;\n\n // Action bar\n let actions = '';\n if (issue.status !== 'resolved') actions += '<button class=\"action-btn btn-resolve\" onclick=\"updateStatus(\\\\'' + fp + '\\\\', \\\\'resolved\\\\')\">Mark Resolved</button>';\n if (issue.status !== 'ignored') actions += '<button class=\"action-btn btn-ignore\" onclick=\"updateStatus(\\\\'' + fp + '\\\\', \\\\'ignored\\\\')\">Mark Ignored</button>';\n if (issue.status !== 'open') actions += '<button class=\"action-btn btn-open\" onclick=\"updateStatus(\\\\'' + fp + '\\\\', \\\\'open\\\\')\">Reopen</button>';\n document.getElementById('action-bar').innerHTML = actions;\n\n document.getElementById('detail').classList.add('open');\n window._currentFixPrompt = event ? event.fixPrompt : '';\n } catch(e) { console.error('Failed to load detail', e); }\n}\n\nasync function updateStatus(fp, status) {\n try {\n await fetch('/api/issues/' + fp, { method: 'PATCH', headers: {'Content-Type':'application/json'}, body: JSON.stringify({status:status}) });\n fetchIssues();\n showDetail(fp);\n } catch(e) { console.error('Failed to update', e); }\n}\n\nfunction copyPrompt() {\n if (window._currentFixPrompt) {\n navigator.clipboard.writeText(window._currentFixPrompt).then(function() {\n var label = document.getElementById('copy-label');\n if (label) { label.textContent = 'Copied!'; setTimeout(function(){ label.textContent = 'Copy'; }, 2000); }\n });\n }\n}\n\n// Event delegation\ndocument.getElementById('issues-body').addEventListener('click', function(e) {\n var tr = e.target.closest('tr');\n if (tr && tr.dataset.fp) showDetail(tr.dataset.fp);\n});\n\ndocument.getElementById('close-detail').addEventListener('click', function() {\n document.getElementById('detail').classList.remove('open');\n selectedFp = null;\n renderIssues();\n});\n\ndocument.getElementById('filters').addEventListener('click', function(e) {\n var btn = e.target.closest('.filter-btn');\n if (!btn) return;\n document.querySelectorAll('.filter-btn').forEach(function(b){ b.classList.remove('active'); });\n btn.classList.add('active');\n currentFilter = btn.dataset.filter;\n fetchIssues();\n});\n\ndocument.getElementById('env-filter').addEventListener('change', function(e) {\n currentEnv = e.target.value;\n fetchIssues();\n});\n\n// Close on Escape\ndocument.addEventListener('keydown', function(e) {\n if (e.key === 'Escape') {\n document.getElementById('detail').classList.remove('open');\n selectedFp = null;\n renderIssues();\n }\n});\n\n// Initial load + auto-refresh\nfetchIssues();\nsetInterval(fetchIssues, 5000);\n</script>\n</body>\n</html>`;\n\nasync function cmdDashboard(port: number): Promise<void> {\n const baseDir = getBaseDir();\n\n // Ensure base directory exists\n await fs.mkdir(baseDir, { recursive: true });\n\n let store: SqliteStore;\n try {\n store = getStore();\n } catch (err) {\n console.error(c(RED, '\\n Failed to open database:'), err);\n process.exitCode = 1;\n return;\n }\n\n const server = http.createServer(async (req, res) => {\n const url = new URL(req.url!, `http://localhost:${port}`);\n const pathname = url.pathname;\n\n // CORS headers for local dev\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, PATCH, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n // Serve dashboard\n if (pathname === '/' || pathname === '/index.html') {\n res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });\n res.end(DASHBOARD_HTML);\n return;\n }\n\n // REST API\n try {\n // GET /api/issues\n if (pathname === '/api/issues' && req.method === 'GET') {\n const status = url.searchParams.get('status') as IssueStatus | null;\n const environment = url.searchParams.get('environment') || undefined;\n const filter: { status?: IssueStatus; environment?: string } = {};\n if (status) filter.status = status;\n if (environment) filter.environment = environment;\n const issues = Object.keys(filter).length > 0 ? store.getIssues(filter) : store.getIssues();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(issues));\n return;\n }\n\n // GET /api/stats\n if (pathname === '/api/stats' && req.method === 'GET') {\n const stats = store.getStats();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(stats));\n return;\n }\n\n // Match /api/issues/:fp and /api/issues/:fp/events\n const issueMatch = pathname.match(/^\\/api\\/issues\\/([a-f0-9]+)$/);\n const eventsMatch = pathname.match(/^\\/api\\/issues\\/([a-f0-9]+)\\/events$/);\n\n // GET /api/issues/:fp/events\n if (eventsMatch && req.method === 'GET') {\n const fp = eventsMatch[1];\n const limit = parseInt(url.searchParams.get('limit') ?? '20', 10);\n const offset = parseInt(url.searchParams.get('offset') ?? '0', 10);\n const events = store.getEvents(fp, { limit, offset });\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(events));\n return;\n }\n\n // GET /api/issues/:fp\n if (issueMatch && req.method === 'GET') {\n const fp = issueMatch[1];\n const issue = store.getIssue(fp);\n if (!issue) {\n res.writeHead(404, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: 'Issue not found' }));\n return;\n }\n const event = store.getLatestEvent(fp);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ issue, event: event ?? null }));\n return;\n }\n\n // PATCH /api/issues/:fp\n if (issueMatch && req.method === 'PATCH') {\n const fp = issueMatch[1];\n const body = await readBody(req);\n const { status } = JSON.parse(body) as { status: IssueStatus };\n store.updateIssueStatus(fp, status);\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ ok: true }));\n return;\n }\n\n // DELETE /api/issues\n if (pathname === '/api/issues' && req.method === 'DELETE') {\n store.deleteAllIssues();\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ ok: true }));\n return;\n }\n } catch (err) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ error: String(err) }));\n return;\n }\n\n res.writeHead(404);\n res.end('Not found');\n });\n\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n console.error(c(RED, `\\n Port ${port} is already in use. Try: npx @uncaughtdev/core dashboard --port ${port + 1}\\n`));\n process.exitCode = 1;\n } else {\n console.error(c(RED, '\\n Server error:'), err);\n process.exitCode = 1;\n }\n });\n\n server.listen(port, () => {\n console.log('');\n console.log(c(BOLD, ' uncaught dashboard'));\n console.log(c(DIM, ' ─'.repeat(35)));\n console.log('');\n console.log(` ${c(GREEN, '●')} Running at ${c(CYAN, `http://localhost:${port}`)}`);\n console.log('');\n console.log(c(DIM, ' Press Ctrl+C to stop'));\n console.log('');\n\n // Auto-open browser\n const openCmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';\n try {\n const child = spawn(openCmd, [`http://localhost:${port}`], { detached: true, stdio: 'ignore' });\n child.unref();\n } catch {\n // Could not open browser — user can navigate manually\n }\n });\n\n // Keep process alive\n process.on('SIGINT', () => {\n console.log(c(DIM, '\\n Shutting down...'));\n store.close();\n server.close();\n process.exit(0);\n });\n}\n\nfunction readBody(req: http.IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = '';\n req.on('data', (chunk) => { data += chunk; });\n req.on('end', () => resolve(data));\n req.on('error', reject);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Main\n// ---------------------------------------------------------------------------\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const command = args[0] ?? 'list';\n\n switch (command) {\n case 'init':\n case 'setup':\n await cmdInit();\n break;\n\n case 'list':\n case 'ls':\n await cmdList();\n break;\n\n case 'show':\n case 'view': {\n const num = args[1];\n if (!num) {\n console.error(c(RED, '\\n Missing issue number. Usage: uncaught show <n>\\n'));\n process.exitCode = 1;\n return;\n }\n const openFlag = args.includes('--open') || args.includes('-o');\n await cmdShow(num, openFlag);\n break;\n }\n\n case 'resolve': {\n const num = args[1];\n if (!num) {\n console.error(\n c(RED, '\\n Missing issue number. Usage: uncaught resolve <n>\\n')\n );\n process.exitCode = 1;\n return;\n }\n await cmdResolve(num);\n break;\n }\n\n case 'clear':\n case 'clean':\n await cmdClear();\n break;\n\n case 'dashboard':\n case 'dash':\n case 'ui': {\n const portIdx = args.indexOf('--port');\n const port = portIdx >= 0 ? parseInt(args[portIdx + 1], 10) || 3300 : 3300;\n await cmdDashboard(port);\n break;\n }\n\n case 'help':\n case '--help':\n case '-h':\n printUsage();\n break;\n\n default:\n console.error(c(RED, `\\n Unknown command: ${command}`));\n printUsage();\n process.exitCode = 1;\n break;\n }\n}\n\nmain().catch((err) => {\n console.error(c(RED, '\\n Unexpected error:'), err);\n process.exitCode = 1;\n});\n"]}
|