@uncaughtdev/core 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"local-api-handler.js"}
@@ -0,0 +1,2 @@
1
+ export{a as POST,b as writeEvents}from'./chunk-JALIO2BZ.mjs';import'./chunk-P6JRN5CN.mjs';//# sourceMappingURL=local-api-handler.mjs.map
2
+ //# sourceMappingURL=local-api-handler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"local-api-handler.mjs"}
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';var c=require('fs/promises'),r=require('path'),child_process=require('child_process');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var c__namespace=/*#__PURE__*/_interopNamespace(c);var r__namespace=/*#__PURE__*/_interopNamespace(r);var N="\x1B[0m",v="\x1B[1m",h="\x1B[2m",b="\x1B[31m",x="\x1B[32m",m="\x1B[33m",f="\x1B[36m",j="\x1B[37m",w="\x1B[90m",A="\x1B[41m",M="\x1B[42m",O="\x1B[43m";function n(e,t){return `${e}${t}${N}`}function E(){return r__namespace.resolve(process.cwd(),".uncaught")}function F(){return r__namespace.join(E(),"issues.json")}async function D(){try{let e=await c__namespace.readFile(F(),"utf-8");return JSON.parse(e)}catch{return []}}async function T(e){let t=F(),o=t+".tmp";await c__namespace.writeFile(o,JSON.stringify(e,null,2),"utf-8"),await c__namespace.rename(o,t);}async function L(){let e=await D();if(e.length===0){console.log(n(h,`
3
+ No issues found in .uncaught/
4
+ `)),console.log(n(w,` Capture errors with initUncaught() to see them here.
5
+ `));return}console.log(""),console.log(n(v," Uncaught Issues")),console.log(n(h," \u2500".repeat(35))),console.log("");let t=V("#","Status","Count","Error","Last Seen");console.log(n(h,` ${t}`)),console.log(n(h," "+"\u2500".repeat(90)));for(let o=0;o<e.length;o++){let s=e[o],i=String(o+1).padStart(3),a=B(s.status),p=String(s.count).padStart(5),u=I(s.title,45),d=I(s.errorType,15),g=Y(s.lastSeen),l=`${n(b,d)} ${n(j,u)}`;console.log(` ${n(f,i)} ${a} ${n(m,p)} ${l} ${n(w,g)}`);}console.log(""),console.log(n(h,` ${e.length} issue(s) total`)),console.log(n(w," Run: uncaught show <n> to view fix prompt, --open to open in editor")),console.log("");}async function _(e,t){let o=await D(),s=parseInt(e,10)-1;if(isNaN(s)||s<0||s>=o.length){console.error(n(b,`
6
+ Invalid issue number: ${e}`)),console.error(n(w,` Valid range: 1-${o.length}
7
+ `)),process.exitCode=1;return}let i=o[s],a=r__namespace.join(E(),"fix-prompts",i.fixPromptFile),p;try{p=await c__namespace.readFile(a,"utf-8");}catch{console.error(n(b,`
8
+ Fix prompt file not found: ${a}
9
+ `)),process.exitCode=1;return}if(t){let u=process.env.EDITOR||"code";console.log(n(h,` Opening ${a} in ${u}...`));try{child_process.spawn(u,[a],{detached:!0,stdio:"ignore"}).unref();}catch{let d=process.platform==="darwin"?"open":"xdg-open";try{child_process.spawn(d,[a],{detached:!0,stdio:"ignore"}).unref();}catch{console.error(n(b,` Could not open editor. File is at: ${a}`));}}return}console.log(""),console.log(n(v,` Fix Prompt for Issue #${s+1}`)),console.log(n(h,` Fingerprint: ${i.fingerprint}`)),console.log(n(h,` Count: ${i.count} | Users: ${i.affectedUsers.length}`)),console.log(n(h," \u2500".repeat(35))),console.log(""),console.log(p),console.log(""),console.log(n(w,` File: ${a}`)),console.log(n(w," Tip: run with --open to open in your editor")),console.log("");}async function W(){let e=E();try{await c__namespace.access(e);}catch{console.log(n(h,`
10
+ Nothing to clear \u2014 .uncaught/ does not exist.
11
+ `));return}let t=await c__namespace.readdir(e);for(let o of t){let s=r__namespace.join(e,o);await c__namespace.rm(s,{recursive:true,force:true});}console.log(n(x,`
12
+ Cleared all issues in .uncaught/
13
+ `));}async function G(e){let t=await D(),o=parseInt(e,10)-1;if(isNaN(o)||o<0||o>=t.length){console.error(n(b,`
14
+ Invalid issue number: ${e}`)),console.error(n(w,` Valid range: 1-${t.length}
15
+ `)),process.exitCode=1;return}let s=t[o];if(s.status==="resolved"){console.log(n(m,`
16
+ Issue #${o+1} is already resolved.
17
+ `));return}s.status="resolved",await T(t),console.log(n(x,`
18
+ Issue #${o+1} marked as resolved.`)),console.log(n(h,` ${s.errorType}: ${I(s.title,60)}
19
+ `));}function V(e,t,o,s,i){return `${e.padStart(3)} ${t.padEnd(10)} ${o.padStart(5)} ${s.padEnd(60)} ${i}`}function B(e){switch(e){case "open":return n(`${A}${j}${v}`," OPEN ");case "resolved":return n(`${M}${j}${v}`," DONE ");case "ignored":return n(`${O}${j}${v}`," SKIP ");default:return n(h,String(e).padEnd(6))}}function Y(e){try{let t=new Date(e).getTime(),s=Date.now()-t;if(s<0)return "just now";let i=Math.floor(s/1e3);if(i<60)return `${i}s ago`;let a=Math.floor(i/60);if(a<60)return `${a}m ago`;let p=Math.floor(a/60);if(p<24)return `${p}h ago`;let u=Math.floor(p/24);return u<30?`${u}d ago`:new Date(e).toLocaleDateString()}catch{return e}}function I(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}function R(){console.log(`
20
+ ${n(v," uncaught")} \u2014 error monitoring for vibe coders
21
+
22
+ ${n(v," Setup:")}
23
+ ${n(f,"npx uncaught init")} Auto-detect framework, install, and patch \u2014 one command
24
+
25
+ ${n(v," Viewer:")}
26
+ uncaught List all captured issues
27
+ uncaught list List all captured issues
28
+ uncaught show <n> Display fix prompt for issue #n
29
+ uncaught show <n> --open Open fix prompt in $EDITOR (or VS Code)
30
+ uncaught resolve <n> Mark issue #n as resolved
31
+ uncaught clear Remove all captured issues
32
+
33
+ ${n(v," Examples:")}
34
+ uncaught init Setup Uncaught in your project
35
+ uncaught show 1 Print fix prompt for issue #1
36
+ uncaught show 3 --open Open issue #3's prompt in your editor
37
+ `);}async function $(e){try{return await c__namespace.access(e),!0}catch{return false}}async function P(e){try{return (await c__namespace.stat(e)).isDirectory()}catch{return false}}function J(e,t){return new Promise(o=>{let s=child_process.spawn(e,t,{stdio:"inherit",shell:true});s.on("close",i=>o(i===0)),s.on("error",()=>o(false));})}async function K(){let e=process.cwd(),t={framework:"unknown",packageManager:"npm",hasSupabase:false,hasTypescript:false,rootDir:e};await $(r__namespace.join(e,"pnpm-lock.yaml"))?t.packageManager="pnpm":await $(r__namespace.join(e,"yarn.lock"))?t.packageManager="yarn":(await $(r__namespace.join(e,"bun.lockb"))||await $(r__namespace.join(e,"bun.lock")))&&(t.packageManager="bun");let o={};try{let i=await c__namespace.readFile(r__namespace.join(e,"package.json"),"utf-8");o=JSON.parse(i);}catch{return t}let s={...o.dependencies??{},...o.devDependencies??{}};return t.hasTypescript="typescript"in s||await $(r__namespace.join(e,"tsconfig.json")),t.hasSupabase="@supabase/supabase-js"in s,"next"in s?await P(r__namespace.join(e,"app"))||await P(r__namespace.join(e,"src","app"))?t.framework="nextjs-app":await P(r__namespace.join(e,"pages"))||await P(r__namespace.join(e,"src","pages"))?t.framework="nextjs-pages":t.framework="nextjs-app":"vite"in s&&("react"in s||"react-dom"in s)?t.framework="vite-react":"react-scripts"in s&&(t.framework="cra"),t}function H(e,t){switch(e){case "pnpm":return {cmd:"pnpm",args:["add",...t]};case "yarn":return {cmd:"yarn",args:["add",...t]};case "bun":return {cmd:"bun",args:["add",...t]};default:return {cmd:"npm",args:["install",...t]}}}function q(e){let t=-1,o=/^import\s/gm,s;for(;(s=o.exec(e))!==null;)t=s.index;return t}function z(e,t){let o=q(e);if(o>=0){let i=e.indexOf(`
38
+ `,o)+1;return e.slice(0,i)+t+e.slice(i)}let s=e.indexOf(`
39
+ `);return s>=0&&e.slice(0,s).includes("use client")?e.slice(0,s+1)+`
40
+ `+t+e.slice(s+1):t+e}async function Q(){let e=process.cwd();console.log(""),console.log(n(v," \u{1F9EA} uncaught init")),console.log(n(h," \u2500".repeat(35))),console.log(""),console.log(n(f," \u25B8 Detecting framework..."));let t=await K();if(console.log(` ${n(x,{"nextjs-app":"Next.js (App Router)","nextjs-pages":"Next.js (Pages Router)","vite-react":"Vite + React",cra:"Create React App",unknown:"Unknown"}[t.framework])} \xB7 ${t.packageManager} \xB7 TS=${t.hasTypescript} \xB7 Supabase=${t.hasSupabase}`),console.log(""),t.framework==="unknown"){console.log(n(m," \u26A0 Could not detect framework. Supported: Next.js, Vite+React, CRA")),process.exitCode=1;return}console.log(n(f," \u25B8 Installing packages..."));let s=["@uncaughtdev/core","@uncaughtdev/react"];t.hasSupabase&&s.push("@uncaughtdev/supabase");let i=H(t.packageManager,s);console.log(n(w,` ${i.cmd} ${i.args.join(" ")}`)),await J(i.cmd,i.args)?(console.log(n(x," \u2713 Packages installed")),console.log("")):(console.log(n(m,`
41
+ \u26A0 Install failed \u2014 packages may not be published yet.`)),console.log(n(w," Continuing with file patching. Install manually if needed.")),console.log(""));let p=t.hasTypescript?"tsx":"jsx",u=t.hasTypescript?"ts":"js",d=r__namespace.basename(e);if(t.framework==="nextjs-app"){let g=await P(r__namespace.join(e,"app"))?r__namespace.join(e,"app"):r__namespace.join(e,"src","app");console.log(n(f," \u25B8 Patching layout..."));let l=r__namespace.join(g,`layout.${p}`);await S(l,d,"layout"),console.log(n(f," \u25B8 Creating API route..."));let k=r__namespace.join(g,"api","uncaught","local");await c__namespace.mkdir(k,{recursive:true});let y=r__namespace.join(k,`route.${u}`);await $(y)?console.log(n(m," \u2298 Already exists, skipping")):(await c__namespace.writeFile(y,`export { POST } from '@uncaughtdev/core/local-api-handler';
42
+ `),console.log(n(x,` \u2713 Created ${r__namespace.relative(e,y)}`))),console.log(n(f," \u25B8 Patching next.config...")),await U(e);}else if(t.framework==="nextjs-pages"){let g=await P(r__namespace.join(e,"pages"))?r__namespace.join(e,"pages"):r__namespace.join(e,"src","pages");console.log(n(f," \u25B8 Patching _app..."));let l=r__namespace.join(g,`_app.${p}`);await S(l,d,"pages-app"),console.log(n(f," \u25B8 Creating API route..."));let k=r__namespace.join(g,"api","uncaught");await c__namespace.mkdir(k,{recursive:true});let y=r__namespace.join(k,`local.${u}`);await $(y)?console.log(n(m," \u2298 Already exists, skipping")):(await c__namespace.writeFile(y,`export { default } from '@uncaughtdev/core/local-api-handler/pages';
43
+ `),console.log(n(x,` \u2713 Created ${r__namespace.relative(e,y)}`))),console.log(n(f," \u25B8 Patching next.config...")),await U(e);}else if(t.framework==="vite-react"||t.framework==="cra"){let g=t.framework==="vite-react"?["src/main.tsx","src/main.jsx","main.tsx","main.jsx"]:["src/index.tsx","src/index.jsx"],l=null;for(let k of g){let y=r__namespace.join(e,k);if(await $(y)){l=y;break}}l?(console.log(n(f," \u25B8 Patching entry file...")),await S(l,d,"entry")):console.log(n(m," \u26A0 Could not find entry file. Wrap your root with <UncaughtProvider> manually."));}t.hasSupabase&&(console.log(""),console.log(n(f," \u25B8 Supabase detected! Wrap your client:")),console.log(n(w," import { wrapSupabase } from '@uncaughtdev/supabase';")),console.log(n(w," const supabase = wrapSupabase(createClient(url, key));"))),console.log(""),console.log(n(x," \u2713 Done! Uncaught is now tracking errors.")),console.log(""),console.log(n(j," Start your dev server, trigger an error, then:")),console.log(n(f," npx uncaught")),console.log("");}async function S(e,t,o){let s=process.cwd(),i=r__namespace.relative(s,e);if(!await $(e)){let l="";o==="layout"?l=`'use client';
44
+
45
+ import { UncaughtProvider } from '@uncaughtdev/react';
46
+
47
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
48
+ return (
49
+ <html lang="en">
50
+ <body>
51
+ <UncaughtProvider projectKey="${t}" transport="local">
52
+ {children}
53
+ </UncaughtProvider>
54
+ </body>
55
+ </html>
56
+ );
57
+ }
58
+ `:o==="pages-app"&&(l=`import { UncaughtProvider } from '@uncaughtdev/react';
59
+ import type { AppProps } from 'next/app';
60
+
61
+ export default function App({ Component, pageProps }: AppProps) {
62
+ return (
63
+ <UncaughtProvider projectKey="${t}" transport="local">
64
+ <Component {...pageProps} />
65
+ </UncaughtProvider>
66
+ );
67
+ }
68
+ `),await c__namespace.writeFile(e,l),console.log(n(x,` \u2713 Created ${i}`));return}let a=await c__namespace.readFile(e,"utf-8");if(a.includes("UncaughtProvider")||a.includes("@uncaughtdev/react")){console.log(n(m,` \u2298 ${i} already has UncaughtProvider, skipping`));return}o==="layout"&&!a.includes("'use client'")&&!a.includes('"use client"')&&(a=`'use client';
69
+
70
+ ${a}`),a=z(a,`import { UncaughtProvider } from '@uncaughtdev/react';
71
+ `);let u=`<UncaughtProvider projectKey="${t}" transport="${o==="entry"?"console":"local"}">`,d="</UncaughtProvider>",g=false;if(o==="layout"&&a.includes("{children}")){let l=a.match(/(\n(\s*))\{children\}/);if(l){l[2];a=a.replace(`${l[1]}{children}`,`${l[1]}${u}${l[1]} {children}${l[1]}${d}`);}else a=a.replace("{children}",`
72
+ ${u}
73
+ {children}
74
+ ${d}
75
+ `);g=true;}else if(o==="pages-app"){let l=a.match(/<Component\s[^>]*\/>/);l&&(a=a.replace(l[0],`${u}
76
+ ${l[0]}
77
+ ${d}`),g=true);}else if(o==="entry"){let l=a.match(/<App\s*\/>/);l&&(a=a.replace(l[0],`${u}
78
+ <App />
79
+ ${d}`),g=true);}g?(await c__namespace.writeFile(e,a),console.log(n(x,` \u2713 Patched ${i}`))):(console.log(n(m,` \u26A0 Could not auto-patch ${i}. Wrap your root component with:`)),console.log(n(w,` <UncaughtProvider projectKey="${t}" transport="local">{children}</UncaughtProvider>`)));}async function U(e){let t=["next.config.ts","next.config.mjs","next.config.js"],o=null;for(let p of t){let u=r__namespace.join(e,p);if(await $(u)){o=u;break}}let s=`
80
+ webpack: (config, { isServer }) => {
81
+ if (!isServer) {
82
+ config.resolve.fallback = { ...config.resolve.fallback, fs: false, path: false, child_process: false };
83
+ }
84
+ return config;
85
+ },`;if(!o){o=r__namespace.join(e,"next.config.js"),await c__namespace.writeFile(o,`/** @type {import('next').NextConfig} */
86
+ const nextConfig = {${s}
87
+ };
88
+ module.exports = nextConfig;
89
+ `),console.log(n(x," \u2713 Created next.config.js"));return}let i=await c__namespace.readFile(o,"utf-8");if(i.includes("fs: false")){console.log(n(m," \u2298 Already has webpack fallback, skipping"));return}if(i.includes("webpack")){console.log(n(m," \u2298 Has custom webpack \u2014 add manually: config.resolve.fallback = { fs: false, path: false, child_process: false }"));return}let a=i.match(/(const\s+\w+\s*=\s*\{|module\.exports\s*=\s*\{|export\s+default\s*\{)/);if(a&&a.index!==void 0){let p=a.index+a[0].length;i=i.slice(0,p)+s+i.slice(p),await c__namespace.writeFile(o,i),console.log(n(x,` \u2713 Patched ${r__namespace.relative(e,o)}`));}else console.log(n(m," \u26A0 Could not auto-patch. Add webpack fallback for fs/path/child_process manually."));}async function X(){let e=process.argv.slice(2),t=e[0]??"list";switch(t){case "init":case "setup":await Q();break;case "list":case "ls":await L();break;case "show":case "view":{let o=e[1];if(!o){console.error(n(b,`
90
+ Missing issue number. Usage: uncaught show <n>
91
+ `)),process.exitCode=1;return}let s=e.includes("--open")||e.includes("-o");await _(o,s);break}case "resolve":{let o=e[1];if(!o){console.error(n(b,`
92
+ Missing issue number. Usage: uncaught resolve <n>
93
+ `)),process.exitCode=1;return}await G(o);break}case "clear":case "clean":await W();break;case "help":case "--help":case "-h":R();break;default:console.error(n(b,`
94
+ Unknown command: ${t}`)),R(),process.exitCode=1;break}}X().catch(e=>{console.error(n(b,`
95
+ Unexpected error:`),e),process.exitCode=1;});//# sourceMappingURL=local-viewer.js.map
96
+ //# sourceMappingURL=local-viewer.js.map
@@ -0,0 +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 uncaught init')} Auto-detect framework, install, and patch — one command\n\n${c(BOLD, ' Viewer:')}\n uncaught List all captured issues\n uncaught list List all captured issues\n uncaught show <n> Display fix prompt for issue #n\n uncaught show <n> --open Open fix prompt in $EDITOR (or VS Code)\n uncaught resolve <n> Mark issue #n as resolved\n uncaught clear Remove all captured issues\n\n${c(BOLD, ' Examples:')}\n uncaught init Setup Uncaught in your project\n uncaught show 1 Print fix prompt for issue #1\n uncaught show 3 --open Open issue #3's prompt in your 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 uncaught`));\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"]}
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env node
2
+ import*as c from'fs/promises';import*as r from'path';import {spawn}from'child_process';var N="\x1B[0m",v="\x1B[1m",h="\x1B[2m",b="\x1B[31m",x="\x1B[32m",m="\x1B[33m",f="\x1B[36m",j="\x1B[37m",w="\x1B[90m",A="\x1B[41m",M="\x1B[42m",O="\x1B[43m";function n(e,t){return `${e}${t}${N}`}function E(){return r.resolve(process.cwd(),".uncaught")}function F(){return r.join(E(),"issues.json")}async function D(){try{let e=await c.readFile(F(),"utf-8");return JSON.parse(e)}catch{return []}}async function T(e){let t=F(),o=t+".tmp";await c.writeFile(o,JSON.stringify(e,null,2),"utf-8"),await c.rename(o,t);}async function L(){let e=await D();if(e.length===0){console.log(n(h,`
3
+ No issues found in .uncaught/
4
+ `)),console.log(n(w,` Capture errors with initUncaught() to see them here.
5
+ `));return}console.log(""),console.log(n(v," Uncaught Issues")),console.log(n(h," \u2500".repeat(35))),console.log("");let t=V("#","Status","Count","Error","Last Seen");console.log(n(h,` ${t}`)),console.log(n(h," "+"\u2500".repeat(90)));for(let o=0;o<e.length;o++){let s=e[o],i=String(o+1).padStart(3),a=B(s.status),p=String(s.count).padStart(5),u=I(s.title,45),d=I(s.errorType,15),g=Y(s.lastSeen),l=`${n(b,d)} ${n(j,u)}`;console.log(` ${n(f,i)} ${a} ${n(m,p)} ${l} ${n(w,g)}`);}console.log(""),console.log(n(h,` ${e.length} issue(s) total`)),console.log(n(w," Run: uncaught show <n> to view fix prompt, --open to open in editor")),console.log("");}async function _(e,t){let o=await D(),s=parseInt(e,10)-1;if(isNaN(s)||s<0||s>=o.length){console.error(n(b,`
6
+ Invalid issue number: ${e}`)),console.error(n(w,` Valid range: 1-${o.length}
7
+ `)),process.exitCode=1;return}let i=o[s],a=r.join(E(),"fix-prompts",i.fixPromptFile),p;try{p=await c.readFile(a,"utf-8");}catch{console.error(n(b,`
8
+ Fix prompt file not found: ${a}
9
+ `)),process.exitCode=1;return}if(t){let u=process.env.EDITOR||"code";console.log(n(h,` Opening ${a} in ${u}...`));try{spawn(u,[a],{detached:!0,stdio:"ignore"}).unref();}catch{let d=process.platform==="darwin"?"open":"xdg-open";try{spawn(d,[a],{detached:!0,stdio:"ignore"}).unref();}catch{console.error(n(b,` Could not open editor. File is at: ${a}`));}}return}console.log(""),console.log(n(v,` Fix Prompt for Issue #${s+1}`)),console.log(n(h,` Fingerprint: ${i.fingerprint}`)),console.log(n(h,` Count: ${i.count} | Users: ${i.affectedUsers.length}`)),console.log(n(h," \u2500".repeat(35))),console.log(""),console.log(p),console.log(""),console.log(n(w,` File: ${a}`)),console.log(n(w," Tip: run with --open to open in your editor")),console.log("");}async function W(){let e=E();try{await c.access(e);}catch{console.log(n(h,`
10
+ Nothing to clear \u2014 .uncaught/ does not exist.
11
+ `));return}let t=await c.readdir(e);for(let o of t){let s=r.join(e,o);await c.rm(s,{recursive:true,force:true});}console.log(n(x,`
12
+ Cleared all issues in .uncaught/
13
+ `));}async function G(e){let t=await D(),o=parseInt(e,10)-1;if(isNaN(o)||o<0||o>=t.length){console.error(n(b,`
14
+ Invalid issue number: ${e}`)),console.error(n(w,` Valid range: 1-${t.length}
15
+ `)),process.exitCode=1;return}let s=t[o];if(s.status==="resolved"){console.log(n(m,`
16
+ Issue #${o+1} is already resolved.
17
+ `));return}s.status="resolved",await T(t),console.log(n(x,`
18
+ Issue #${o+1} marked as resolved.`)),console.log(n(h,` ${s.errorType}: ${I(s.title,60)}
19
+ `));}function V(e,t,o,s,i){return `${e.padStart(3)} ${t.padEnd(10)} ${o.padStart(5)} ${s.padEnd(60)} ${i}`}function B(e){switch(e){case "open":return n(`${A}${j}${v}`," OPEN ");case "resolved":return n(`${M}${j}${v}`," DONE ");case "ignored":return n(`${O}${j}${v}`," SKIP ");default:return n(h,String(e).padEnd(6))}}function Y(e){try{let t=new Date(e).getTime(),s=Date.now()-t;if(s<0)return "just now";let i=Math.floor(s/1e3);if(i<60)return `${i}s ago`;let a=Math.floor(i/60);if(a<60)return `${a}m ago`;let p=Math.floor(a/60);if(p<24)return `${p}h ago`;let u=Math.floor(p/24);return u<30?`${u}d ago`:new Date(e).toLocaleDateString()}catch{return e}}function I(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}function R(){console.log(`
20
+ ${n(v," uncaught")} \u2014 error monitoring for vibe coders
21
+
22
+ ${n(v," Setup:")}
23
+ ${n(f,"npx uncaught init")} Auto-detect framework, install, and patch \u2014 one command
24
+
25
+ ${n(v," Viewer:")}
26
+ uncaught List all captured issues
27
+ uncaught list List all captured issues
28
+ uncaught show <n> Display fix prompt for issue #n
29
+ uncaught show <n> --open Open fix prompt in $EDITOR (or VS Code)
30
+ uncaught resolve <n> Mark issue #n as resolved
31
+ uncaught clear Remove all captured issues
32
+
33
+ ${n(v," Examples:")}
34
+ uncaught init Setup Uncaught in your project
35
+ uncaught show 1 Print fix prompt for issue #1
36
+ uncaught show 3 --open Open issue #3's prompt in your editor
37
+ `);}async function $(e){try{return await c.access(e),!0}catch{return false}}async function P(e){try{return (await c.stat(e)).isDirectory()}catch{return false}}function J(e,t){return new Promise(o=>{let s=spawn(e,t,{stdio:"inherit",shell:true});s.on("close",i=>o(i===0)),s.on("error",()=>o(false));})}async function K(){let e=process.cwd(),t={framework:"unknown",packageManager:"npm",hasSupabase:false,hasTypescript:false,rootDir:e};await $(r.join(e,"pnpm-lock.yaml"))?t.packageManager="pnpm":await $(r.join(e,"yarn.lock"))?t.packageManager="yarn":(await $(r.join(e,"bun.lockb"))||await $(r.join(e,"bun.lock")))&&(t.packageManager="bun");let o={};try{let i=await c.readFile(r.join(e,"package.json"),"utf-8");o=JSON.parse(i);}catch{return t}let s={...o.dependencies??{},...o.devDependencies??{}};return t.hasTypescript="typescript"in s||await $(r.join(e,"tsconfig.json")),t.hasSupabase="@supabase/supabase-js"in s,"next"in s?await P(r.join(e,"app"))||await P(r.join(e,"src","app"))?t.framework="nextjs-app":await P(r.join(e,"pages"))||await P(r.join(e,"src","pages"))?t.framework="nextjs-pages":t.framework="nextjs-app":"vite"in s&&("react"in s||"react-dom"in s)?t.framework="vite-react":"react-scripts"in s&&(t.framework="cra"),t}function H(e,t){switch(e){case "pnpm":return {cmd:"pnpm",args:["add",...t]};case "yarn":return {cmd:"yarn",args:["add",...t]};case "bun":return {cmd:"bun",args:["add",...t]};default:return {cmd:"npm",args:["install",...t]}}}function q(e){let t=-1,o=/^import\s/gm,s;for(;(s=o.exec(e))!==null;)t=s.index;return t}function z(e,t){let o=q(e);if(o>=0){let i=e.indexOf(`
38
+ `,o)+1;return e.slice(0,i)+t+e.slice(i)}let s=e.indexOf(`
39
+ `);return s>=0&&e.slice(0,s).includes("use client")?e.slice(0,s+1)+`
40
+ `+t+e.slice(s+1):t+e}async function Q(){let e=process.cwd();console.log(""),console.log(n(v," \u{1F9EA} uncaught init")),console.log(n(h," \u2500".repeat(35))),console.log(""),console.log(n(f," \u25B8 Detecting framework..."));let t=await K();if(console.log(` ${n(x,{"nextjs-app":"Next.js (App Router)","nextjs-pages":"Next.js (Pages Router)","vite-react":"Vite + React",cra:"Create React App",unknown:"Unknown"}[t.framework])} \xB7 ${t.packageManager} \xB7 TS=${t.hasTypescript} \xB7 Supabase=${t.hasSupabase}`),console.log(""),t.framework==="unknown"){console.log(n(m," \u26A0 Could not detect framework. Supported: Next.js, Vite+React, CRA")),process.exitCode=1;return}console.log(n(f," \u25B8 Installing packages..."));let s=["@uncaughtdev/core","@uncaughtdev/react"];t.hasSupabase&&s.push("@uncaughtdev/supabase");let i=H(t.packageManager,s);console.log(n(w,` ${i.cmd} ${i.args.join(" ")}`)),await J(i.cmd,i.args)?(console.log(n(x," \u2713 Packages installed")),console.log("")):(console.log(n(m,`
41
+ \u26A0 Install failed \u2014 packages may not be published yet.`)),console.log(n(w," Continuing with file patching. Install manually if needed.")),console.log(""));let p=t.hasTypescript?"tsx":"jsx",u=t.hasTypescript?"ts":"js",d=r.basename(e);if(t.framework==="nextjs-app"){let g=await P(r.join(e,"app"))?r.join(e,"app"):r.join(e,"src","app");console.log(n(f," \u25B8 Patching layout..."));let l=r.join(g,`layout.${p}`);await S(l,d,"layout"),console.log(n(f," \u25B8 Creating API route..."));let k=r.join(g,"api","uncaught","local");await c.mkdir(k,{recursive:true});let y=r.join(k,`route.${u}`);await $(y)?console.log(n(m," \u2298 Already exists, skipping")):(await c.writeFile(y,`export { POST } from '@uncaughtdev/core/local-api-handler';
42
+ `),console.log(n(x,` \u2713 Created ${r.relative(e,y)}`))),console.log(n(f," \u25B8 Patching next.config...")),await U(e);}else if(t.framework==="nextjs-pages"){let g=await P(r.join(e,"pages"))?r.join(e,"pages"):r.join(e,"src","pages");console.log(n(f," \u25B8 Patching _app..."));let l=r.join(g,`_app.${p}`);await S(l,d,"pages-app"),console.log(n(f," \u25B8 Creating API route..."));let k=r.join(g,"api","uncaught");await c.mkdir(k,{recursive:true});let y=r.join(k,`local.${u}`);await $(y)?console.log(n(m," \u2298 Already exists, skipping")):(await c.writeFile(y,`export { default } from '@uncaughtdev/core/local-api-handler/pages';
43
+ `),console.log(n(x,` \u2713 Created ${r.relative(e,y)}`))),console.log(n(f," \u25B8 Patching next.config...")),await U(e);}else if(t.framework==="vite-react"||t.framework==="cra"){let g=t.framework==="vite-react"?["src/main.tsx","src/main.jsx","main.tsx","main.jsx"]:["src/index.tsx","src/index.jsx"],l=null;for(let k of g){let y=r.join(e,k);if(await $(y)){l=y;break}}l?(console.log(n(f," \u25B8 Patching entry file...")),await S(l,d,"entry")):console.log(n(m," \u26A0 Could not find entry file. Wrap your root with <UncaughtProvider> manually."));}t.hasSupabase&&(console.log(""),console.log(n(f," \u25B8 Supabase detected! Wrap your client:")),console.log(n(w," import { wrapSupabase } from '@uncaughtdev/supabase';")),console.log(n(w," const supabase = wrapSupabase(createClient(url, key));"))),console.log(""),console.log(n(x," \u2713 Done! Uncaught is now tracking errors.")),console.log(""),console.log(n(j," Start your dev server, trigger an error, then:")),console.log(n(f," npx uncaught")),console.log("");}async function S(e,t,o){let s=process.cwd(),i=r.relative(s,e);if(!await $(e)){let l="";o==="layout"?l=`'use client';
44
+
45
+ import { UncaughtProvider } from '@uncaughtdev/react';
46
+
47
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
48
+ return (
49
+ <html lang="en">
50
+ <body>
51
+ <UncaughtProvider projectKey="${t}" transport="local">
52
+ {children}
53
+ </UncaughtProvider>
54
+ </body>
55
+ </html>
56
+ );
57
+ }
58
+ `:o==="pages-app"&&(l=`import { UncaughtProvider } from '@uncaughtdev/react';
59
+ import type { AppProps } from 'next/app';
60
+
61
+ export default function App({ Component, pageProps }: AppProps) {
62
+ return (
63
+ <UncaughtProvider projectKey="${t}" transport="local">
64
+ <Component {...pageProps} />
65
+ </UncaughtProvider>
66
+ );
67
+ }
68
+ `),await c.writeFile(e,l),console.log(n(x,` \u2713 Created ${i}`));return}let a=await c.readFile(e,"utf-8");if(a.includes("UncaughtProvider")||a.includes("@uncaughtdev/react")){console.log(n(m,` \u2298 ${i} already has UncaughtProvider, skipping`));return}o==="layout"&&!a.includes("'use client'")&&!a.includes('"use client"')&&(a=`'use client';
69
+
70
+ ${a}`),a=z(a,`import { UncaughtProvider } from '@uncaughtdev/react';
71
+ `);let u=`<UncaughtProvider projectKey="${t}" transport="${o==="entry"?"console":"local"}">`,d="</UncaughtProvider>",g=false;if(o==="layout"&&a.includes("{children}")){let l=a.match(/(\n(\s*))\{children\}/);if(l){l[2];a=a.replace(`${l[1]}{children}`,`${l[1]}${u}${l[1]} {children}${l[1]}${d}`);}else a=a.replace("{children}",`
72
+ ${u}
73
+ {children}
74
+ ${d}
75
+ `);g=true;}else if(o==="pages-app"){let l=a.match(/<Component\s[^>]*\/>/);l&&(a=a.replace(l[0],`${u}
76
+ ${l[0]}
77
+ ${d}`),g=true);}else if(o==="entry"){let l=a.match(/<App\s*\/>/);l&&(a=a.replace(l[0],`${u}
78
+ <App />
79
+ ${d}`),g=true);}g?(await c.writeFile(e,a),console.log(n(x,` \u2713 Patched ${i}`))):(console.log(n(m,` \u26A0 Could not auto-patch ${i}. Wrap your root component with:`)),console.log(n(w,` <UncaughtProvider projectKey="${t}" transport="local">{children}</UncaughtProvider>`)));}async function U(e){let t=["next.config.ts","next.config.mjs","next.config.js"],o=null;for(let p of t){let u=r.join(e,p);if(await $(u)){o=u;break}}let s=`
80
+ webpack: (config, { isServer }) => {
81
+ if (!isServer) {
82
+ config.resolve.fallback = { ...config.resolve.fallback, fs: false, path: false, child_process: false };
83
+ }
84
+ return config;
85
+ },`;if(!o){o=r.join(e,"next.config.js"),await c.writeFile(o,`/** @type {import('next').NextConfig} */
86
+ const nextConfig = {${s}
87
+ };
88
+ module.exports = nextConfig;
89
+ `),console.log(n(x," \u2713 Created next.config.js"));return}let i=await c.readFile(o,"utf-8");if(i.includes("fs: false")){console.log(n(m," \u2298 Already has webpack fallback, skipping"));return}if(i.includes("webpack")){console.log(n(m," \u2298 Has custom webpack \u2014 add manually: config.resolve.fallback = { fs: false, path: false, child_process: false }"));return}let a=i.match(/(const\s+\w+\s*=\s*\{|module\.exports\s*=\s*\{|export\s+default\s*\{)/);if(a&&a.index!==void 0){let p=a.index+a[0].length;i=i.slice(0,p)+s+i.slice(p),await c.writeFile(o,i),console.log(n(x,` \u2713 Patched ${r.relative(e,o)}`));}else console.log(n(m," \u26A0 Could not auto-patch. Add webpack fallback for fs/path/child_process manually."));}async function X(){let e=process.argv.slice(2),t=e[0]??"list";switch(t){case "init":case "setup":await Q();break;case "list":case "ls":await L();break;case "show":case "view":{let o=e[1];if(!o){console.error(n(b,`
90
+ Missing issue number. Usage: uncaught show <n>
91
+ `)),process.exitCode=1;return}let s=e.includes("--open")||e.includes("-o");await _(o,s);break}case "resolve":{let o=e[1];if(!o){console.error(n(b,`
92
+ Missing issue number. Usage: uncaught resolve <n>
93
+ `)),process.exitCode=1;return}await G(o);break}case "clear":case "clean":await W();break;case "help":case "--help":case "-h":R();break;default:console.error(n(b,`
94
+ Unknown command: ${t}`)),R(),process.exitCode=1;break}}X().catch(e=>{console.error(n(b,`
95
+ Unexpected error:`),e),process.exitCode=1;});//# sourceMappingURL=local-viewer.mjs.map
96
+ //# sourceMappingURL=local-viewer.mjs.map
@@ -0,0 +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","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.mjs","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 uncaught init')} Auto-detect framework, install, and patch — one command\n\n${c(BOLD, ' Viewer:')}\n uncaught List all captured issues\n uncaught list List all captured issues\n uncaught show <n> Display fix prompt for issue #n\n uncaught show <n> --open Open fix prompt in $EDITOR (or VS Code)\n uncaught resolve <n> Mark issue #n as resolved\n uncaught clear Remove all captured issues\n\n${c(BOLD, ' Examples:')}\n uncaught init Setup Uncaught in your project\n uncaught show 1 Print fix prompt for issue #1\n uncaught show 3 --open Open issue #3's prompt in your 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 uncaught`));\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"]}